ZGlmZiAtLWdpdCBhL05PVElDRS50eHQgYi9OT1RJQ0UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYjM1YjUKLS0tIC9kZXYvbnVsbAorKysgYi9OT1RJQ0UudHh0CkBAIC0wLDAgKzEsMTQ2NDAgQEAKK05vdGljZXMgZm9yIGZpbGVzIGNvbnRhaW5lZCBpbiB0aGUgdG9vbHMgZGlyZWN0b3J5OgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitOb3RpY2VzIGZvciBmaWxlKHMpOgorL2Jpbi9ta3NkY2FyZAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5CisgICAgICBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgR29vZ2xlIEluYy4gYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8KK0VWRU5UIFNIQUxMIEdvb2dsZSBJbmMuIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCitTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCitQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsKK09SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKK09USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKK0FEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK05vdGljZXMgZm9yIGZpbGUocyk6CisvZnJhbWV3b3JrL2NvbnNjcnlwdC1ob3N0ZGV4LmphcgorL2ZyYW1ld29yay9jb3JlLWhvc3RkZXguamFyCisvZnJhbWV3b3JrL2NvcmUtbGliYXJ0LWhvc3RkZXguamFyCisvbGliL2xpYmphdmFjb3JlLnNvCisvbGliL2xpYmphdmFjcnlwdG8uc28KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgPT0gIE5PVElDRSBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNlY3Rpb24gNCBkIG9mICAgICAgICAgICAgICAgICAgICA9PQorICAgPT0gIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PQorICAgPT0gIGluIHRoaXMgY2FzZSBmb3IgdGhlIEFuZHJvaWQtc3BlY2lmaWMgY29kZS4gICAgICAgICAgICAgICAgICAgICAgICA9PQorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitBbmRyb2lkIENvZGUKK0NvcHlyaWdodCAyMDA1LTIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCitUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGFzIHBhcnQgb2YKK1RoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QgKGh0dHA6Ly9zb3VyY2UuYW5kcm9pZC5jb20pLgorCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICA9PSAgTk9USUNFIGZpbGUgY29ycmVzcG9uZGluZyB0byB0aGUgc2VjdGlvbiA0IGQgb2YgICAgICAgICAgICAgICAgICAgID09CisgICA9PSAgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09CisgICA9PSAgaW4gdGhpcyBjYXNlIGZvciB0aGUgQXBhY2hlIEhhcm1vbnkgZGlzdHJpYnV0aW9uLiAgICAgICAgICAgICAgICAgID09CisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0FwYWNoZSBIYXJtb255CitDb3B5cmlnaHQgMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBhdAorVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KKworUG9ydGlvbnMgb2YgSGFybW9ueSB3ZXJlIG9yaWdpbmFsbHkgZGV2ZWxvcGVkIGJ5CitJbnRlbCBDb3Jwb3JhdGlvbiBhbmQgYXJlIGxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUKK0ZvdW5kYXRpb24gdW5kZXIgdGhlICJTb2Z0d2FyZSBHcmFudCBhbmQgQ29ycG9yYXRlIENvbnRyaWJ1dGlvbgorTGljZW5zZSBBZ3JlZW1lbnQiLCBpbmZvcm1hbGx5IGtub3duIGFzIHRoZSAiSW50ZWwgSGFybW9ueSBDTEEiLgorCisKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgID09ICBOT1RJQ0UgZmlsZSBmb3IgdGhlIElDVSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0KKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQ29weXJpZ2h0IChjKSAxOTk1LTIwMDkgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzCisKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCit3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCitkaXN0cmlidXRlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMKK3RvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKK2NvcHlyaWdodCBub3RpY2UocykgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgb2YKK3RoZSBTb2Z0d2FyZSBhbmQgdGhhdCBib3RoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlKHMpIGFuZCB0aGlzCitwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKK0VYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5UCitPRiBUSElSRCBQQVJUWSBSSUdIVFMuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitIT0xERVJTIElOQ0xVREVEIElOIFRISVMgTk9USUNFIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBPUiBBTlkKK1NQRUNJQUwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSCitSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRgorQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgYSBjb3B5cmlnaHQgaG9sZGVyCitzaGFsbCBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlCitvciBvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uCitvZiB0aGUgY29weXJpZ2h0IGhvbGRlci4KKworQWxsIHRyYWRlbWFya3MgYW5kIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBtZW50aW9uZWQgaGVyZWluIGFyZSB0aGUKK3Byb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorCisKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgID09ICBOT1RJQ0UgZmlsZSBmb3IgdGhlIEpVbml0IExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0KKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQ29tbW9uIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjAKKworVEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIENPTU1PTgorUFVCTElDIExJQ0VOU0UgKCJBR1JFRU1FTlQiKS4gQU5ZIFVTRSwgUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRgorVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRSBPRiBUSElTIEFHUkVFTUVOVC4KKworMS4gREVGSU5JVElPTlMKKworIkNvbnRyaWJ1dGlvbiIgbWVhbnM6CisKKyAgICAgIGEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZAorICAgICAgICAgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kCisgICAgICBiKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6CisKKyAgICAgIGkpIGNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZAorCisgICAgICBpaSkgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOworCisgICAgICB3aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUKKyAgICAgIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEKKyAgICAgIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0bworICAgICAgdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbiBzdWNoCisgICAgICBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8KKyAgICAgIHRoZSBQcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUKKyAgICAgIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duCisgICAgICBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZQorICAgICAgUHJvZ3JhbS4KKworIkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLgorCisiTGljZW5zZWQgUGF0ZW50cyAiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3IKK3doaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24KK2Fsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4KKworIlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzCitBZ3JlZW1lbnQuCisKKyJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcworQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy4KKworMi4gR1JBTlQgT0YgUklHSFRTCisKKyAgICAgIGEpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yCisgICAgICBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UKKyAgICAgIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaAorICAgICAgZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uCisKKyAgICAgIGIpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yCisgICAgICBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlCisgICAgICBwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIKKyAgICAgIHRvIHNlbGwsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAorICAgICAgQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMKKyAgICAgIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUKKyAgICAgIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMKKyAgICAgIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uCisgICAgICBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLgorICAgICAgVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkgb3RoZXIgY29tYmluYXRpb25zCisgICAgICB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcyBsaWNlbnNlZAorICAgICAgaGVyZXVuZGVyLgorCisgICAgICBjKSBSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cworICAgICAgdGhlIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vCisgICAgICBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IgdGhhdCB0aGUgUHJvZ3JhbSBkb2VzCisgICAgICBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mCisgICAgICBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvCisgICAgICBSZWNpcGllbnQgZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24KKyAgICAgIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYQorICAgICAgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQgbGljZW5zZXMgZ3JhbnRlZAorICAgICAgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5IHRvCisgICAgICBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuCisgICAgICBGb3IgZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0bworICAgICAgYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzCisgICAgICByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZQorICAgICAgUHJvZ3JhbS4KKworICAgICAgZCkgRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMKKyAgICAgIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvCisgICAgICBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50LgorCiszLiBSRVFVSVJFTUVOVFMKKworQSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybQordW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDoKKworICAgICAgYSkgaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZAorCisgICAgICBiKSBpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6CisKKyAgICAgIGkpIGVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwKKyAgICAgIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZworICAgICAgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQKKyAgICAgIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcworICAgICAgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOworCisgICAgICBpaSkgZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsCisgICAgICBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czsKKworICAgICAgaWlpKSBzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudAorICAgICAgYXJlIG9mZmVyZWQgYnkgdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlcgorICAgICAgcGFydHk7IGFuZAorCisgICAgICBpdikgc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tCisgICAgICBzdWNoIENvbnRyaWJ1dG9yLCBhbmQgaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhCisgICAgICByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yCisgICAgICBzb2Z0d2FyZSBleGNoYW5nZS4KKworV2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtOgorCisgICAgICBhKSBpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgCisKKyAgICAgIGIpIGEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mCisgICAgICB0aGUgUHJvZ3JhbS4KKworQ29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQKK3dpdGhpbiB0aGUgUHJvZ3JhbS4KKworRWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUgb3JpZ2luYXRvciBvZiBpdHMKK0NvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzIHN1YnNlcXVlbnQKK1JlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4KKworNC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT04KKworQ29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluCityZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZCB0aGUKK2xpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQorb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYQorY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdAorY3JlYXRlIHBvdGVudGlhbCBsaWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhCitDb250cmlidXRvciBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywKK3N1Y2ggQ29udHJpYnV0b3IgKCJDb21tZXJjaWFsIENvbnRyaWJ1dG9yIikgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQKK2FuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpCithZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzIChjb2xsZWN0aXZlbHkgIkxvc3NlcyIpIGFyaXNpbmcKK2Zyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIgbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkKK2FnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzCitvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIGNvbm5lY3Rpb24gd2l0aCBpdHMKK2Rpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4gVGhlCitvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCityZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4KK0luIG9yZGVyIHRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5Citub3RpZnkgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikKK2FsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50CituZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUgaW4gYW55IHN1Y2gKK2NsYWltIGF0IGl0cyBvd24gZXhwZW5zZS4KKworRm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKK3Byb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEgQ29tbWVyY2lhbAorQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCitjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZQorY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eQorYWxvbmUuIFVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0bworZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZQorcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIKK0NvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKK211c3QgcGF5IHRob3NlIGRhbWFnZXMuCisKKzUuIE5PIFdBUlJBTlRZCisKK0VYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUworUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZCitPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5CityZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQKK2Rpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cworZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCit0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZQorbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQKK3VuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLgorCis2LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWQorCitFWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SCitBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCitJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HCitXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKK0xJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCitORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SCitESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRAorSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKworNy4gR0VORVJBTAorCitJZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IG9mCit0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlcgorYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCittaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuCisKK0lmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYSBDb250cmlidXRvciB3aXRoCityZXNwZWN0IHRvIGEgcGF0ZW50IGFwcGxpY2FibGUgdG8gc29mdHdhcmUgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yCitjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzIGdyYW50ZWQgYnkgdGhhdAorQ29udHJpYnV0b3IgdG8gc3VjaCBSZWNpcGllbnQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGFzCitvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIEluIGFkZGl0aW9uLCBpZiBSZWNpcGllbnQKK2luc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbQoraXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIgc29mdHdhcmUgb3IKK2hhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaCBSZWNpcGllbnQncworcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoCitsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCitBbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdAorZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMKK0FncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZgordGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncworcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UKK2FuZCBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLgorSG93ZXZlciwgUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcworZ3JhbnRlZCBieSBSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kCitzdXJ2aXZlLgorCitFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsCitidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzIGNvcHlyaWdodGVkIGFuZAorbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQgU3Rld2FyZAorcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgordGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQKK1N0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIElCTSBpcyB0aGUgaW5pdGlhbAorQWdyZWVtZW50IFN0ZXdhcmQuIElCTSBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUKK0FncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uIG9mCit0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlCitQcm9ncmFtIChpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvCit0aGUgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sCithZnRlciBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkKK2VsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIKK3RoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKQorYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8gdGhlIGludGVsbGVjdHVhbAorcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyIGV4cHJlc3NseSwKK2J5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90CitleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuCisKK1RoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBOZXcgWW9yayBhbmQKK3RoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhLiBObworcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzIEFncmVlbWVudAorbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCitpdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uCisKKworICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgPT0gIE5PVElDRSBmaWxlIGZvciB0aGUgS1hNTCBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PQorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitDb3B5cmlnaHQgKGMpIDIwMDIsMjAwMywgU3RlZmFuIEhhdXN0ZWluLCBPYmVyaGF1c2VuLCBSaGxkLiwgR2VybWFueQorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKK2EgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZword2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCitwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KK3RoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKK2luY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKK0VYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKK0NMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCitUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKKworICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgPT0gIE5PVElDRSBmaWxlIGZvciB0aGUgU1FMaXRlIEphdmEgV3JhcHBlciBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICA9PQorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIHNvZnR3YXJlIGlzIGNvcHlyaWdodGVkIGJ5IENocmlzdGlhbiBXZXJuZXIgPGNod0BjaC13ZXJuZXIuZGU+CithbmQgb3RoZXJzLiBUaGUgZm9sbG93aW5nIHRlcm1zIGFwcGx5IHRvIGFsbCBmaWxlcyBhc3NvY2lhdGVkIHdpdGggdGhlCitzb2Z0d2FyZSB1bmxlc3MgZXhwbGljaXRseSBkaXNjbGFpbWVkIGluIGluZGl2aWR1YWwgZmlsZXMuCisKK1RoZSBhdXRob3JzIGhlcmVieSBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLAorYW5kIGxpY2Vuc2UgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlLCBwcm92aWRlZAordGhhdCBleGlzdGluZyBjb3B5cmlnaHQgbm90aWNlcyBhcmUgcmV0YWluZWQgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCB0aGlzCitub3RpY2UgaXMgaW5jbHVkZWQgdmVyYmF0aW0gaW4gYW55IGRpc3RyaWJ1dGlvbnMuIE5vIHdyaXR0ZW4gYWdyZWVtZW50LAorbGljZW5zZSwgb3Igcm95YWx0eSBmZWUgaXMgcmVxdWlyZWQgZm9yIGFueSBvZiB0aGUgYXV0aG9yaXplZCB1c2VzLgorTW9kaWZpY2F0aW9ucyB0byB0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3B5cmlnaHRlZCBieSB0aGVpciBhdXRob3JzCithbmQgbmVlZCBub3QgZm9sbG93IHRoZSBsaWNlbnNpbmcgdGVybXMgZGVzY3JpYmVkIGhlcmUsIHByb3ZpZGVkIHRoYXQKK3RoZSBuZXcgdGVybXMgYXJlIGNsZWFybHkgaW5kaWNhdGVkIG9uIHRoZSBmaXJzdCBwYWdlIG9mIGVhY2ggZmlsZSB3aGVyZQordGhleSBhcHBseS4KKworSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgRElTVFJJQlVUT1JTIEJFIExJQUJMRSBUTyBBTlkgUEFSVFkKK0ZPUiBESVJFQ1QsIElORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKK0FSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgSVRTIERPQ1VNRU5UQVRJT04sIE9SIEFOWQorREVSSVZBVElWRVMgVEhFUkVPRiwgRVZFTiBJRiBUSEUgQVVUSE9SUyBIQVZFIEJFRU4gQURWSVNFRCBPRiBUSEUKK1BPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitUSEUgQVVUSE9SUyBBTkQgRElTVFJJQlVUT1JTIFNQRUNJRklDQUxMWSBESVNDTEFJTSBBTlkgV0FSUkFOVElFUywKK0lOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBBTkQgTk9OLUlORlJJTkdFTUVOVC4gIFRISVMgU09GVFdBUkUKK0lTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIEFORCBUSEUgQVVUSE9SUyBBTkQgRElTVFJJQlVUT1JTIEhBVkUKK05PIE9CTElHQVRJT04gVE8gUFJPVklERSBNQUlOVEVOQU5DRSwgU1VQUE9SVCwgVVBEQVRFUywgRU5IQU5DRU1FTlRTLCBPUgorTU9ESUZJQ0FUSU9OUy4KKworCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICA9PSAgTk9USUNFIGZpbGUgZm9yIHRoZSBXM0MgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09CisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0NvcHlyaWdodCAoYykgMjAwMCBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtLCAoTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUKK29mIFRlY2hub2xvZ3ksIEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgZW4KK0F1dG9tYXRpcXVlLCBLZWlvIFVuaXZlcnNpdHkpLiBBbGwgUmlnaHRzIFJlc2VydmVkLiBUaGlzIHByb2dyYW0gaXMKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBXM0MncyBTb2Z0d2FyZSBJbnRlbGxlY3R1YWwgUHJvcGVydHkgTGljZW5zZS4KK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworU2VlIFczQyBMaWNlbnNlIGh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvIGZvciBtb3JlIGRldGFpbHMuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTm90aWNlcyBmb3IgZmlsZShzKToKKy91c3IvaWN1L2ljdWR0NTFsLmRhdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitJQ1UgTGljZW5zZSAtIElDVSAxLjguMSBhbmQgbGF0ZXIKKworQ09QWVJJR0hUIEFORCBQRVJNSVNTSU9OIE5PVElDRQorCitDb3B5cmlnaHQgKGMpIDE5OTUtMjAwOCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMKKworQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZShzKSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUgYW5kIHRoYXQgYm90aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZShzKSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVCBPRiBUSElSRCBQQVJUWSBSSUdIVFMuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIEhPTERFUlMgSU5DTFVERUQgSU4gVEhJUyBOT1RJQ0UgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIE9SIEFOWSBTUEVDSUFMIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIGEgY29weXJpZ2h0IGhvbGRlciBzaGFsbCBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgdGhlIGNvcHlyaWdodCBob2xkZXIuCisKK0FsbCB0cmFkZW1hcmtzIGFuZCByZWdpc3RlcmVkIHRyYWRlbWFya3MgbWVudGlvbmVkIGhlcmVpbiBhcmUgdGhlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLiAKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1VOSUNPREUsIElOQy4gTElDRU5TRSBBR1JFRU1FTlQgLSBEQVRBIEZJTEVTIEFORCBTT0ZUV0FSRQorCisgICAgVW5pY29kZSBEYXRhIEZpbGVzIGluY2x1ZGUgYWxsIGRhdGEgZmlsZXMgdW5kZXIgdGhlIGRpcmVjdG9yaWVzCitodHRwOi8vd3d3LnVuaWNvZGUub3JnL1B1YmxpYy8sIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvcmVwb3J0cy8sIGFuZAoraHR0cDovL3d3dy51bmljb2RlLm9yZy9jbGRyL2RhdGEvIC4gVW5pY29kZSBTb2Z0d2FyZSBpbmNsdWRlcyBhbnkgc291cmNlIGNvZGUKK3B1Ymxpc2hlZCBpbiB0aGUgVW5pY29kZSBTdGFuZGFyZCBvciB1bmRlciB0aGUgZGlyZWN0b3JpZXMKK2h0dHA6Ly93d3cudW5pY29kZS5vcmcvUHVibGljLywgaHR0cDovL3d3dy51bmljb2RlLm9yZy9yZXBvcnRzLywgYW5kCitodHRwOi8vd3d3LnVuaWNvZGUub3JnL2NsZHIvZGF0YS8uCisKKyAgICBOT1RJQ0UgVE8gVVNFUjogQ2FyZWZ1bGx5IHJlYWQgdGhlIGZvbGxvd2luZyBsZWdhbCBhZ3JlZW1lbnQuIEJZCitET1dOTE9BRElORywgSU5TVEFMTElORywgQ09QWUlORyBPUiBPVEhFUldJU0UgVVNJTkcgVU5JQ09ERSBJTkMuJ1MgREFUQSBGSUxFUworKCJEQVRBIEZJTEVTIiksIEFORC9PUiBTT0ZUV0FSRSAoIlNPRlRXQVJFIiksIFlPVSBVTkVRVUlWT0NBTExZIEFDQ0VQVCwgQU5ECitBR1JFRSBUTyBCRSBCT1VORCBCWSwgQUxMIE9GIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVC4gSUYgWU9VCitETyBOT1QgQUdSRUUsIERPIE5PVCBET1dOTE9BRCwgSU5TVEFMTCwgQ09QWSwgRElTVFJJQlVURSBPUiBVU0UgVEhFIERBVEEgRklMRVMKK09SIFNPRlRXQVJFLgorCisgICAgQ09QWVJJR0hUIEFORCBQRVJNSVNTSU9OIE5PVElDRQorCisgICAgQ29weXJpZ2h0IMKswqkgMTk5MS0yMDA3IFVuaWNvZGUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gRGlzdHJpYnV0ZWQgdW5kZXIKK3RoZSBUZXJtcyBvZiBVc2UgaW4gaHR0cDovL3d3dy51bmljb2RlLm9yZy9jb3B5cmlnaHQuaHRtbC4KKworICAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKK29mIHRoZSBVbmljb2RlIGRhdGEgZmlsZXMgYW5kIGFueSBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gKHRoZSAiRGF0YSBGaWxlcyIpIG9yCitVbmljb2RlIHNvZnR3YXJlIGFuZCBhbnkgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uICh0aGUgIlNvZnR3YXJlIikgdG8gZGVhbCBpbgordGhlIERhdGEgRmlsZXMgb3IgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUKK3JpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIGFuZC9vciBzZWxsIGNvcGllcyBvZgordGhlIERhdGEgRmlsZXMgb3IgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBEYXRhIEZpbGVzIG9yCitTb2Z0d2FyZSBhcmUgZnVybmlzaGVkIHRvIGRvIHNvLCBwcm92aWRlZCB0aGF0IChhKSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZShzKQorYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIHdpdGggYWxsIGNvcGllcyBvZiB0aGUgRGF0YSBGaWxlcyBvciBTb2Z0d2FyZSwKKyhiKSBib3RoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlKHMpIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uLCBhbmQgKGMpIHRoZXJlIGlzIGNsZWFyIG5vdGljZSBpbiBlYWNoIG1vZGlmaWVkIERhdGEKK0ZpbGUgb3IgaW4gdGhlIFNvZnR3YXJlIGFzIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBEYXRhCitGaWxlKHMpIG9yIFNvZnR3YXJlIHRoYXQgdGhlIGRhdGEgb3Igc29mdHdhcmUgaGFzIGJlZW4gbW9kaWZpZWQuCisKKyAgICBUSEUgREFUQSBGSUxFUyBBTkQgU09GVFdBUkUgQVJFIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZCitLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVCBPRiBUSElSRAorUEFSVFkgUklHSFRTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBIT0xERVJTIElOQ0xVREVEIElOIFRISVMKK05PVElDRSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgT1IgQU5ZIFNQRUNJQUwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTAorREFNQUdFUywgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAorV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCitPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhFIERBVEEgRklMRVMgT1IKK1NPRlRXQVJFLgorCisgICAgRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgYSBjb3B5cmlnaHQgaG9sZGVyIHNoYWxsIG5vdAorYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCitpbiB0aGVzZSBEYXRhIEZpbGVzIG9yIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIHRoZQorY29weXJpZ2h0IGhvbGRlci4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKKy8qIFRoaXMgSUNVIGNvZGUgZGVyaXZlZCBmcm9tOiAqLworLyoKK3B1bnljb2RlLmMgMC40LjAgKDIwMDEtTm92LTE3LVNhdCkKK2h0dHA6Ly93d3cuY3MuYmVya2VsZXkuZWR1L35hbWMvaWRuLworQWRhbSBNLiBDb3N0ZWxsbworaHR0cDovL3d3dy5uaWNlbWljZS5uZXQvYW1jLworCitEaXNjbGFpbWVyIGFuZCBsaWNlbnNlCisKK1JlZ2FyZGluZyB0aGlzIGVudGlyZSBkb2N1bWVudCBvciBhbnkgcG9ydGlvbiBvZiBpdCAoaW5jbHVkaW5nCit0aGUgcHNldWRvY29kZSBhbmQgQyBjb2RlKSwgdGhlIGF1dGhvciBtYWtlcyBubyBndWFyYW50ZWVzIGFuZAoraXMgbm90IHJlc3BvbnNpYmxlIGZvciBhbnkgZGFtYWdlIHJlc3VsdGluZyBmcm9tIGl0cyB1c2UuIFRoZQorYXV0aG9yIGdyYW50cyBpcnJldm9jYWJsZSBwZXJtaXNzaW9uIHRvIGFueW9uZSB0byB1c2UsIG1vZGlmeSwKK2FuZCBkaXN0cmlidXRlIGl0IGluIGFueSB3YXkgdGhhdCBkb2VzIG5vdCBkaW1pbmlzaCB0aGUgcmlnaHRzCitvZiBhbnlvbmUgZWxzZSB0byB1c2UsIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgaXQsIHByb3ZpZGVkIHRoYXQKK3JlZGlzdHJpYnV0ZWQgZGVyaXZhdGl2ZSB3b3JrcyBkbyBub3QgY29udGFpbiBtaXNsZWFkaW5nIGF1dGhvciBvcgordmVyc2lvbiBpbmZvcm1hdGlvbi4gRGVyaXZhdGl2ZSB3b3JrcyBuZWVkIG5vdCBiZSBsaWNlbnNlZCB1bmRlcgorc2ltaWxhciB0ZXJtcy4KKyovCisKKworLyoKKyoqIFRoaXMgZmlsZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbiwgc28gY2xhcmlmaWVkIGFzIG9mCisqKiAyMDA2LTA3LTE3IGJ5IEFydGh1ciBEYXZpZCBPbHNvbi4KKyovCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTm90aWNlcyBmb3IgZmlsZShzKToKKy9mcmFtZXdvcmsvamNvbW1vbi0xLjAuMTIuamFyCisvZnJhbWV3b3JrL2pmcmVlY2hhcnQtMS4wLjktc3d0LmphcgorL2ZyYW1ld29yay9qZnJlZWNoYXJ0LTEuMC45LmphcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCSAgR05VIExFU1NFUiBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisJCSAgICAgICBWZXJzaW9uIDIuMSwgRmVicnVhcnkgMTk5OQorCisgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgICA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCisgb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCisKK1tUaGlzIGlzIHRoZSBmaXJzdCByZWxlYXNlZCB2ZXJzaW9uIG9mIHRoZSBMZXNzZXIgR1BMLiAgSXQgYWxzbyBjb3VudHMKKyBhcyB0aGUgc3VjY2Vzc29yIG9mIHRoZSBHTlUgTGlicmFyeSBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBoZW5jZQorIHRoZSB2ZXJzaW9uIG51bWJlciAyLjEuXQorCisJCQkgICAgUHJlYW1ibGUKKworICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCitmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZXMgYXJlIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZQorZnJlZSBzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLgorCisgIFRoaXMgbGljZW5zZSwgdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhcHBsaWVzIHRvIHNvbWUKK3NwZWNpYWxseSBkZXNpZ25hdGVkIHNvZnR3YXJlIHBhY2thZ2VzLS10eXBpY2FsbHkgbGlicmFyaWVzLS1vZiB0aGUKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgb3RoZXIgYXV0aG9ycyB3aG8gZGVjaWRlIHRvIHVzZSBpdC4gIFlvdQorY2FuIHVzZSBpdCB0b28sIGJ1dCB3ZSBzdWdnZXN0IHlvdSBmaXJzdCB0aGluayBjYXJlZnVsbHkgYWJvdXQgd2hldGhlcgordGhpcyBsaWNlbnNlIG9yIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIHRoZSBiZXR0ZXIKK3N0cmF0ZWd5IHRvIHVzZSBpbiBhbnkgcGFydGljdWxhciBjYXNlLCBiYXNlZCBvbiB0aGUgZXhwbGFuYXRpb25zIGJlbG93LgorCisgIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tIG9mIHVzZSwKK25vdCBwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQKK3lvdSBoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UKK2ZvciB0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpOyB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQKK2l0IGlmIHlvdSB3YW50IGl0OyB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBhbmQgdXNlIHBpZWNlcyBvZgoraXQgaW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBhcmUgaW5mb3JtZWQgdGhhdCB5b3UgY2FuIGRvCit0aGVzZSB0aGluZ3MuCisKKyAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAorZGlzdHJpYnV0b3JzIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGVzZQorcmlnaHRzLiAgVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yCit5b3UgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBsaWJyYXJ5IG9yIGlmIHlvdSBtb2RpZnkgaXQuCisKKyAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSwgd2hldGhlciBncmF0aXMKK29yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0IHdlIGdhdmUKK3lvdS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZSBzb3VyY2UKK2NvZGUuICBJZiB5b3UgbGluayBvdGhlciBjb2RlIHdpdGggdGhlIGxpYnJhcnksIHlvdSBtdXN0IHByb3ZpZGUKK2NvbXBsZXRlIG9iamVjdCBmaWxlcyB0byB0aGUgcmVjaXBpZW50cywgc28gdGhhdCB0aGV5IGNhbiByZWxpbmsgdGhlbQord2l0aCB0aGUgbGlicmFyeSBhZnRlciBtYWtpbmcgY2hhbmdlcyB0byB0aGUgbGlicmFyeSBhbmQgcmVjb21waWxpbmcKK2l0LiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIgcmlnaHRzLgorCisgIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCBhIHR3by1zdGVwIG1ldGhvZDogKDEpIHdlIGNvcHlyaWdodCB0aGUKK2xpYnJhcnksIGFuZCAoMikgd2Ugb2ZmZXIgeW91IHRoaXMgbGljZW5zZSwgd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsCitwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgbGlicmFyeS4KKworICBUbyBwcm90ZWN0IGVhY2ggZGlzdHJpYnV0b3IsIHdlIHdhbnQgdG8gbWFrZSBpdCB2ZXJ5IGNsZWFyIHRoYXQKK3RoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGUgZnJlZSBsaWJyYXJ5LiAgQWxzbywgaWYgdGhlIGxpYnJhcnkgaXMKK21vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB0aGUgcmVjaXBpZW50cyBzaG91bGQga25vdwordGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsIHZlcnNpb24sIHNvIHRoYXQgdGhlIG9yaWdpbmFsCithdXRob3IncyByZXB1dGF0aW9uIHdpbGwgbm90IGJlIGFmZmVjdGVkIGJ5IHByb2JsZW1zIHRoYXQgbWlnaHQgYmUKK2ludHJvZHVjZWQgYnkgb3RoZXJzLgorDAorICBGaW5hbGx5LCBzb2Z0d2FyZSBwYXRlbnRzIHBvc2UgYSBjb25zdGFudCB0aHJlYXQgdG8gdGhlIGV4aXN0ZW5jZSBvZgorYW55IGZyZWUgcHJvZ3JhbS4gIFdlIHdpc2ggdG8gbWFrZSBzdXJlIHRoYXQgYSBjb21wYW55IGNhbm5vdAorZWZmZWN0aXZlbHkgcmVzdHJpY3QgdGhlIHVzZXJzIG9mIGEgZnJlZSBwcm9ncmFtIGJ5IG9idGFpbmluZyBhCityZXN0cmljdGl2ZSBsaWNlbnNlIGZyb20gYSBwYXRlbnQgaG9sZGVyLiAgVGhlcmVmb3JlLCB3ZSBpbnNpc3QgdGhhdAorYW55IHBhdGVudCBsaWNlbnNlIG9idGFpbmVkIGZvciBhIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgbXVzdCBiZQorY29uc2lzdGVudCB3aXRoIHRoZSBmdWxsIGZyZWVkb20gb2YgdXNlIHNwZWNpZmllZCBpbiB0aGlzIGxpY2Vuc2UuCisKKyAgTW9zdCBHTlUgc29mdHdhcmUsIGluY2x1ZGluZyBzb21lIGxpYnJhcmllcywgaXMgY292ZXJlZCBieSB0aGUKK29yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhpcyBsaWNlbnNlLCB0aGUgR05VIExlc3NlcgorR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBjZXJ0YWluIGRlc2lnbmF0ZWQgbGlicmFyaWVzLCBhbmQKK2lzIHF1aXRlIGRpZmZlcmVudCBmcm9tIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgV2UgdXNlCit0aGlzIGxpY2Vuc2UgZm9yIGNlcnRhaW4gbGlicmFyaWVzIGluIG9yZGVyIHRvIHBlcm1pdCBsaW5raW5nIHRob3NlCitsaWJyYXJpZXMgaW50byBub24tZnJlZSBwcm9ncmFtcy4KKworICBXaGVuIGEgcHJvZ3JhbSBpcyBsaW5rZWQgd2l0aCBhIGxpYnJhcnksIHdoZXRoZXIgc3RhdGljYWxseSBvciB1c2luZworYSBzaGFyZWQgbGlicmFyeSwgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSB0d28gaXMgbGVnYWxseSBzcGVha2luZyBhCitjb21iaW5lZCB3b3JrLCBhIGRlcml2YXRpdmUgb2YgdGhlIG9yaWdpbmFsIGxpYnJhcnkuICBUaGUgb3JkaW5hcnkKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgdGhlcmVmb3JlIHBlcm1pdHMgc3VjaCBsaW5raW5nIG9ubHkgaWYgdGhlCitlbnRpcmUgY29tYmluYXRpb24gZml0cyBpdHMgY3JpdGVyaWEgb2YgZnJlZWRvbS4gIFRoZSBMZXNzZXIgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgcGVybWl0cyBtb3JlIGxheCBjcml0ZXJpYSBmb3IgbGlua2luZyBvdGhlciBjb2RlIHdpdGgKK3RoZSBsaWJyYXJ5LgorCisgIFdlIGNhbGwgdGhpcyBsaWNlbnNlIHRoZSAiTGVzc2VyIiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGJlY2F1c2UgaXQKK2RvZXMgTGVzcyB0byBwcm90ZWN0IHRoZSB1c2VyJ3MgZnJlZWRvbSB0aGFuIHRoZSBvcmRpbmFyeSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZS4gIEl0IGFsc28gcHJvdmlkZXMgb3RoZXIgZnJlZSBzb2Z0d2FyZSBkZXZlbG9wZXJzIExlc3MKK29mIGFuIGFkdmFudGFnZSBvdmVyIGNvbXBldGluZyBub24tZnJlZSBwcm9ncmFtcy4gIFRoZXNlIGRpc2FkdmFudGFnZXMKK2FyZSB0aGUgcmVhc29uIHdlIHVzZSB0aGUgb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbWFueQorbGlicmFyaWVzLiAgSG93ZXZlciwgdGhlIExlc3NlciBsaWNlbnNlIHByb3ZpZGVzIGFkdmFudGFnZXMgaW4gY2VydGFpbgorc3BlY2lhbCBjaXJjdW1zdGFuY2VzLgorCisgIEZvciBleGFtcGxlLCBvbiByYXJlIG9jY2FzaW9ucywgdGhlcmUgbWF5IGJlIGEgc3BlY2lhbCBuZWVkIHRvCitlbmNvdXJhZ2UgdGhlIHdpZGVzdCBwb3NzaWJsZSB1c2Ugb2YgYSBjZXJ0YWluIGxpYnJhcnksIHNvIHRoYXQgaXQgYmVjb21lcworYSBkZS1mYWN0byBzdGFuZGFyZC4gIFRvIGFjaGlldmUgdGhpcywgbm9uLWZyZWUgcHJvZ3JhbXMgbXVzdCBiZQorYWxsb3dlZCB0byB1c2UgdGhlIGxpYnJhcnkuICBBIG1vcmUgZnJlcXVlbnQgY2FzZSBpcyB0aGF0IGEgZnJlZQorbGlicmFyeSBkb2VzIHRoZSBzYW1lIGpvYiBhcyB3aWRlbHkgdXNlZCBub24tZnJlZSBsaWJyYXJpZXMuICBJbiB0aGlzCitjYXNlLCB0aGVyZSBpcyBsaXR0bGUgdG8gZ2FpbiBieSBsaW1pdGluZyB0aGUgZnJlZSBsaWJyYXJ5IHRvIGZyZWUKK3NvZnR3YXJlIG9ubHksIHNvIHdlIHVzZSB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisKKyAgSW4gb3RoZXIgY2FzZXMsIHBlcm1pc3Npb24gdG8gdXNlIGEgcGFydGljdWxhciBsaWJyYXJ5IGluIG5vbi1mcmVlCitwcm9ncmFtcyBlbmFibGVzIGEgZ3JlYXRlciBudW1iZXIgb2YgcGVvcGxlIHRvIHVzZSBhIGxhcmdlIGJvZHkgb2YKK2ZyZWUgc29mdHdhcmUuICBGb3IgZXhhbXBsZSwgcGVybWlzc2lvbiB0byB1c2UgdGhlIEdOVSBDIExpYnJhcnkgaW4KK25vbi1mcmVlIHByb2dyYW1zIGVuYWJsZXMgbWFueSBtb3JlIHBlb3BsZSB0byB1c2UgdGhlIHdob2xlIEdOVQorb3BlcmF0aW5nIHN5c3RlbSwgYXMgd2VsbCBhcyBpdHMgdmFyaWFudCwgdGhlIEdOVS9MaW51eCBvcGVyYXRpbmcKK3N5c3RlbS4KKworICBBbHRob3VnaCB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgTGVzcyBwcm90ZWN0aXZlIG9mIHRoZQordXNlcnMnIGZyZWVkb20sIGl0IGRvZXMgZW5zdXJlIHRoYXQgdGhlIHVzZXIgb2YgYSBwcm9ncmFtIHRoYXQgaXMKK2xpbmtlZCB3aXRoIHRoZSBMaWJyYXJ5IGhhcyB0aGUgZnJlZWRvbSBhbmQgdGhlIHdoZXJld2l0aGFsIHRvIHJ1bgordGhhdCBwcm9ncmFtIHVzaW5nIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgTGlicmFyeS4KKworICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4gIFBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhCisid29yayBiYXNlZCBvbiB0aGUgbGlicmFyeSIgYW5kIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBsaWJyYXJ5Ii4gIFRoZQorZm9ybWVyIGNvbnRhaW5zIGNvZGUgZGVyaXZlZCBmcm9tIHRoZSBsaWJyYXJ5LCB3aGVyZWFzIHRoZSBsYXR0ZXIgbXVzdAorYmUgY29tYmluZWQgd2l0aCB0aGUgbGlicmFyeSBpbiBvcmRlciB0byBydW4uCisMCisJCSAgR05VIExFU1NFUiBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KKworICAwLiBUaGlzIExpY2Vuc2UgQWdyZWVtZW50IGFwcGxpZXMgdG8gYW55IHNvZnR3YXJlIGxpYnJhcnkgb3Igb3RoZXIKK3Byb2dyYW0gd2hpY2ggY29udGFpbnMgYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIG9yCitvdGhlciBhdXRob3JpemVkIHBhcnR5IHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mCit0aGlzIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChhbHNvIGNhbGxlZCAidGhpcyBMaWNlbnNlIikuCitFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KKworICBBICJsaWJyYXJ5IiBtZWFucyBhIGNvbGxlY3Rpb24gb2Ygc29mdHdhcmUgZnVuY3Rpb25zIGFuZC9vciBkYXRhCitwcmVwYXJlZCBzbyBhcyB0byBiZSBjb252ZW5pZW50bHkgbGlua2VkIHdpdGggYXBwbGljYXRpb24gcHJvZ3JhbXMKKyh3aGljaCB1c2Ugc29tZSBvZiB0aG9zZSBmdW5jdGlvbnMgYW5kIGRhdGEpIHRvIGZvcm0gZXhlY3V0YWJsZXMuCisKKyAgVGhlICJMaWJyYXJ5IiwgYmVsb3csIHJlZmVycyB0byBhbnkgc3VjaCBzb2Z0d2FyZSBsaWJyYXJ5IG9yIHdvcmsKK3doaWNoIGhhcyBiZWVuIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZXNlIHRlcm1zLiAgQSAid29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkiIG1lYW5zIGVpdGhlciB0aGUgTGlicmFyeSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyCitjb3B5cmlnaHQgbGF3OiB0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIExpYnJhcnkgb3IgYQorcG9ydGlvbiBvZiBpdCwgZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZAorc3RyYWlnaHRmb3J3YXJkbHkgaW50byBhbm90aGVyIGxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcworaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluIHRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikKKworICAiU291cmNlIGNvZGUiIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgorbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYSBsaWJyYXJ5LCBjb21wbGV0ZSBzb3VyY2UgY29kZSBtZWFucworYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55IGFzc29jaWF0ZWQKK2ludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8gY29udHJvbCBjb21waWxhdGlvbgorYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgbGlicmFyeS4KKworICBBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAorY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgorcnVubmluZyBhIHByb2dyYW0gdXNpbmcgdGhlIExpYnJhcnkgaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCBvdXRwdXQgZnJvbQorc3VjaCBhIHByb2dyYW0gaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZAorb24gdGhlIExpYnJhcnkgKGluZGVwZW5kZW50IG9mIHRoZSB1c2Ugb2YgdGhlIExpYnJhcnkgaW4gYSB0b29sIGZvcgord3JpdGluZyBpdCkuICBXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIExpYnJhcnkgZG9lcworYW5kIHdoYXQgdGhlIHByb2dyYW0gdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IGRvZXMuCisgIAorICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBMaWJyYXJ5J3MKK2NvbXBsZXRlIHNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0Cit5b3UgY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbgorYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QKK2FsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55Cit3YXJyYW50eTsgYW5kIGRpc3RyaWJ1dGUgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZQorTGlicmFyeS4KKworICBZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LAorYW5kIHlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYQorZmVlLgorDAorICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBMaWJyYXJ5IG9yIGFueSBwb3J0aW9uCitvZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgYW5kIGNvcHkgYW5kCitkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKK2Fib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CisKKyAgICBhKSBUaGUgbW9kaWZpZWQgd29yayBtdXN0IGl0c2VsZiBiZSBhIHNvZnR3YXJlIGxpYnJhcnkuCisKKyAgICBiKSBZb3UgbXVzdCBjYXVzZSB0aGUgZmlsZXMgbW9kaWZpZWQgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgorCisgICAgYykgWW91IG11c3QgY2F1c2UgdGhlIHdob2xlIG9mIHRoZSB3b3JrIHRvIGJlIGxpY2Vuc2VkIGF0IG5vCisgICAgY2hhcmdlIHRvIGFsbCB0aGlyZCBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgICBkKSBJZiBhIGZhY2lsaXR5IGluIHRoZSBtb2RpZmllZCBMaWJyYXJ5IHJlZmVycyB0byBhIGZ1bmN0aW9uIG9yIGEKKyAgICB0YWJsZSBvZiBkYXRhIHRvIGJlIHN1cHBsaWVkIGJ5IGFuIGFwcGxpY2F0aW9uIHByb2dyYW0gdGhhdCB1c2VzCisgICAgdGhlIGZhY2lsaXR5LCBvdGhlciB0aGFuIGFzIGFuIGFyZ3VtZW50IHBhc3NlZCB3aGVuIHRoZSBmYWNpbGl0eQorICAgIGlzIGludm9rZWQsIHRoZW4geW91IG11c3QgbWFrZSBhIGdvb2QgZmFpdGggZWZmb3J0IHRvIGVuc3VyZSB0aGF0LAorICAgIGluIHRoZSBldmVudCBhbiBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgc3VjaCBmdW5jdGlvbiBvcgorICAgIHRhYmxlLCB0aGUgZmFjaWxpdHkgc3RpbGwgb3BlcmF0ZXMsIGFuZCBwZXJmb3JtcyB3aGF0ZXZlciBwYXJ0IG9mCisgICAgaXRzIHB1cnBvc2UgcmVtYWlucyBtZWFuaW5nZnVsLgorCisgICAgKEZvciBleGFtcGxlLCBhIGZ1bmN0aW9uIGluIGEgbGlicmFyeSB0byBjb21wdXRlIHNxdWFyZSByb290cyBoYXMKKyAgICBhIHB1cnBvc2UgdGhhdCBpcyBlbnRpcmVseSB3ZWxsLWRlZmluZWQgaW5kZXBlbmRlbnQgb2YgdGhlCisgICAgYXBwbGljYXRpb24uICBUaGVyZWZvcmUsIFN1YnNlY3Rpb24gMmQgcmVxdWlyZXMgdGhhdCBhbnkKKyAgICBhcHBsaWNhdGlvbi1zdXBwbGllZCBmdW5jdGlvbiBvciB0YWJsZSB1c2VkIGJ5IHRoaXMgZnVuY3Rpb24gbXVzdAorICAgIGJlIG9wdGlvbmFsOiBpZiB0aGUgYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IGl0LCB0aGUgc3F1YXJlCisgICAgcm9vdCBmdW5jdGlvbiBtdXN0IHN0aWxsIGNvbXB1dGUgc3F1YXJlIHJvb3RzLikKKworVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgoraWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgTGlicmFyeSwKK2FuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgordGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQorc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91CitkaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKK29uIHRoZSBMaWJyYXJ5LCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgordGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKK2VudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZQoraXQuCisKK1RodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoreW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCitleGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKK2NvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIExpYnJhcnkuCisKK0luIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIExpYnJhcnkKK3dpdGggdGhlIExpYnJhcnkgKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5KSBvbiBhIHZvbHVtZSBvZgorYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKK3RoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMy4gWW91IG1heSBvcHQgdG8gYXBwbHkgdGhlIHRlcm1zIG9mIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UgdG8gYSBnaXZlbiBjb3B5IG9mIHRoZSBMaWJyYXJ5LiAgVG8gZG8KK3RoaXMsIHlvdSBtdXN0IGFsdGVyIGFsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSwgc28KK3RoYXQgdGhleSByZWZlciB0byB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwKK2luc3RlYWQgb2YgdG8gdGhpcyBMaWNlbnNlLiAgKElmIGEgbmV3ZXIgdmVyc2lvbiB0aGFuIHZlcnNpb24gMiBvZiB0aGUKK29yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGhhcyBhcHBlYXJlZCwgdGhlbiB5b3UgY2FuIHNwZWNpZnkKK3RoYXQgdmVyc2lvbiBpbnN0ZWFkIGlmIHlvdSB3aXNoLikgIERvIG5vdCBtYWtlIGFueSBvdGhlciBjaGFuZ2UgaW4KK3RoZXNlIG5vdGljZXMuCisMCisgIE9uY2UgdGhpcyBjaGFuZ2UgaXMgbWFkZSBpbiBhIGdpdmVuIGNvcHksIGl0IGlzIGlycmV2ZXJzaWJsZSBmb3IKK3RoYXQgY29weSwgc28gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gYWxsCitzdWJzZXF1ZW50IGNvcGllcyBhbmQgZGVyaXZhdGl2ZSB3b3JrcyBtYWRlIGZyb20gdGhhdCBjb3B5LgorCisgIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSB3aXNoIHRvIGNvcHkgcGFydCBvZiB0aGUgY29kZSBvZgordGhlIExpYnJhcnkgaW50byBhIHByb2dyYW0gdGhhdCBpcyBub3QgYSBsaWJyYXJ5LgorCisgIDQuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYSBwb3J0aW9uIG9yCitkZXJpdmF0aXZlIG9mIGl0LCB1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybQordW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWNjb21wYW55CitpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUsIHdoaWNoCittdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEKK21lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZS4KKworICBJZiBkaXN0cmlidXRpb24gb2Ygb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQorZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUKK3NvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2Ugc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudCB0bworZGlzdHJpYnV0ZSB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAorY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KKworICA1LiBBIHByb2dyYW0gdGhhdCBjb250YWlucyBubyBkZXJpdmF0aXZlIG9mIGFueSBwb3J0aW9uIG9mIHRoZQorTGlicmFyeSwgYnV0IGlzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCB0aGUgTGlicmFyeSBieSBiZWluZyBjb21waWxlZCBvcgorbGlua2VkIHdpdGggaXQsIGlzIGNhbGxlZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIuICBTdWNoIGEKK3dvcmssIGluIGlzb2xhdGlvbiwgaXMgbm90IGEgZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5LCBhbmQKK3RoZXJlZm9yZSBmYWxscyBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgSG93ZXZlciwgbGlua2luZyBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeQorY3JlYXRlcyBhbiBleGVjdXRhYmxlIHRoYXQgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBMaWJyYXJ5IChiZWNhdXNlIGl0Citjb250YWlucyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSksIHJhdGhlciB0aGFuIGEgIndvcmsgdGhhdCB1c2VzIHRoZQorbGlicmFyeSIuICBUaGUgZXhlY3V0YWJsZSBpcyB0aGVyZWZvcmUgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UuCitTZWN0aW9uIDYgc3RhdGVzIHRlcm1zIGZvciBkaXN0cmlidXRpb24gb2Ygc3VjaCBleGVjdXRhYmxlcy4KKworICBXaGVuIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB1c2VzIG1hdGVyaWFsIGZyb20gYSBoZWFkZXIgZmlsZQordGhhdCBpcyBwYXJ0IG9mIHRoZSBMaWJyYXJ5LCB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIG1heSBiZSBhCitkZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnkgZXZlbiB0aG91Z2ggdGhlIHNvdXJjZSBjb2RlIGlzIG5vdC4KK1doZXRoZXIgdGhpcyBpcyB0cnVlIGlzIGVzcGVjaWFsbHkgc2lnbmlmaWNhbnQgaWYgdGhlIHdvcmsgY2FuIGJlCitsaW5rZWQgd2l0aG91dCB0aGUgTGlicmFyeSwgb3IgaWYgdGhlIHdvcmsgaXMgaXRzZWxmIGEgbGlicmFyeS4gIFRoZQordGhyZXNob2xkIGZvciB0aGlzIHRvIGJlIHRydWUgaXMgbm90IHByZWNpc2VseSBkZWZpbmVkIGJ5IGxhdy4KKworICBJZiBzdWNoIGFuIG9iamVjdCBmaWxlIHVzZXMgb25seSBudW1lcmljYWwgcGFyYW1ldGVycywgZGF0YQorc3RydWN0dXJlIGxheW91dHMgYW5kIGFjY2Vzc29ycywgYW5kIHNtYWxsIG1hY3JvcyBhbmQgc21hbGwgaW5saW5lCitmdW5jdGlvbnMgKHRlbiBsaW5lcyBvciBsZXNzIGluIGxlbmd0aCksIHRoZW4gdGhlIHVzZSBvZiB0aGUgb2JqZWN0CitmaWxlIGlzIHVucmVzdHJpY3RlZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGlzIGxlZ2FsbHkgYSBkZXJpdmF0aXZlCit3b3JrLiAgKEV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhpcyBvYmplY3QgY29kZSBwbHVzIHBvcnRpb25zIG9mIHRoZQorTGlicmFyeSB3aWxsIHN0aWxsIGZhbGwgdW5kZXIgU2VjdGlvbiA2LikKKworICBPdGhlcndpc2UsIGlmIHRoZSB3b3JrIGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSwgeW91IG1heQorZGlzdHJpYnV0ZSB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDYuCitBbnkgZXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGF0IHdvcmsgYWxzbyBmYWxsIHVuZGVyIFNlY3Rpb24gNiwKK3doZXRoZXIgb3Igbm90IHRoZXkgYXJlIGxpbmtlZCBkaXJlY3RseSB3aXRoIHRoZSBMaWJyYXJ5IGl0c2VsZi4KKwwKKyAgNi4gQXMgYW4gZXhjZXB0aW9uIHRvIHRoZSBTZWN0aW9ucyBhYm92ZSwgeW91IG1heSBhbHNvIGNvbWJpbmUgb3IKK2xpbmsgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkgdG8gcHJvZHVjZSBhCit3b3JrIGNvbnRhaW5pbmcgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnksIGFuZCBkaXN0cmlidXRlIHRoYXQgd29yawordW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgdGhlIHRlcm1zIHBlcm1pdAorbW9kaWZpY2F0aW9uIG9mIHRoZSB3b3JrIGZvciB0aGUgY3VzdG9tZXIncyBvd24gdXNlIGFuZCByZXZlcnNlCitlbmdpbmVlcmluZyBmb3IgZGVidWdnaW5nIHN1Y2ggbW9kaWZpY2F0aW9ucy4KKworICBZb3UgbXVzdCBnaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCBlYWNoIGNvcHkgb2YgdGhlIHdvcmsgdGhhdCB0aGUKK0xpYnJhcnkgaXMgdXNlZCBpbiBpdCBhbmQgdGhhdCB0aGUgTGlicmFyeSBhbmQgaXRzIHVzZSBhcmUgY292ZXJlZCBieQordGhpcyBMaWNlbnNlLiAgWW91IG11c3Qgc3VwcGx5IGEgY29weSBvZiB0aGlzIExpY2Vuc2UuICBJZiB0aGUgd29yaworZHVyaW5nIGV4ZWN1dGlvbiBkaXNwbGF5cyBjb3B5cmlnaHQgbm90aWNlcywgeW91IG11c3QgaW5jbHVkZSB0aGUKK2NvcHlyaWdodCBub3RpY2UgZm9yIHRoZSBMaWJyYXJ5IGFtb25nIHRoZW0sIGFzIHdlbGwgYXMgYSByZWZlcmVuY2UKK2RpcmVjdGluZyB0aGUgdXNlciB0byB0aGUgY29weSBvZiB0aGlzIExpY2Vuc2UuICBBbHNvLCB5b3UgbXVzdCBkbyBvbmUKK29mIHRoZXNlIHRoaW5nczoKKworICAgIGEpIEFjY29tcGFueSB0aGUgd29yayB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nCisgICAgbWFjaGluZS1yZWFkYWJsZSBzb3VyY2UgY29kZSBmb3IgdGhlIExpYnJhcnkgaW5jbHVkaW5nIHdoYXRldmVyCisgICAgY2hhbmdlcyB3ZXJlIHVzZWQgaW4gdGhlIHdvcmsgKHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIKKyAgICBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlKTsgYW5kLCBpZiB0aGUgd29yayBpcyBhbiBleGVjdXRhYmxlIGxpbmtlZAorICAgIHdpdGggdGhlIExpYnJhcnksIHdpdGggdGhlIGNvbXBsZXRlIG1hY2hpbmUtcmVhZGFibGUgIndvcmsgdGhhdAorICAgIHVzZXMgdGhlIExpYnJhcnkiLCBhcyBvYmplY3QgY29kZSBhbmQvb3Igc291cmNlIGNvZGUsIHNvIHRoYXQgdGhlCisgICAgdXNlciBjYW4gbW9kaWZ5IHRoZSBMaWJyYXJ5IGFuZCB0aGVuIHJlbGluayB0byBwcm9kdWNlIGEgbW9kaWZpZWQKKyAgICBleGVjdXRhYmxlIGNvbnRhaW5pbmcgdGhlIG1vZGlmaWVkIExpYnJhcnkuICAoSXQgaXMgdW5kZXJzdG9vZAorICAgIHRoYXQgdGhlIHVzZXIgd2hvIGNoYW5nZXMgdGhlIGNvbnRlbnRzIG9mIGRlZmluaXRpb25zIGZpbGVzIGluIHRoZQorICAgIExpYnJhcnkgd2lsbCBub3QgbmVjZXNzYXJpbHkgYmUgYWJsZSB0byByZWNvbXBpbGUgdGhlIGFwcGxpY2F0aW9uCisgICAgdG8gdXNlIHRoZSBtb2RpZmllZCBkZWZpbml0aW9ucy4pCisKKyAgICBiKSBVc2UgYSBzdWl0YWJsZSBzaGFyZWQgbGlicmFyeSBtZWNoYW5pc20gZm9yIGxpbmtpbmcgd2l0aCB0aGUKKyAgICBMaWJyYXJ5LiAgQSBzdWl0YWJsZSBtZWNoYW5pc20gaXMgb25lIHRoYXQgKDEpIHVzZXMgYXQgcnVuIHRpbWUgYQorICAgIGNvcHkgb2YgdGhlIGxpYnJhcnkgYWxyZWFkeSBwcmVzZW50IG9uIHRoZSB1c2VyJ3MgY29tcHV0ZXIgc3lzdGVtLAorICAgIHJhdGhlciB0aGFuIGNvcHlpbmcgbGlicmFyeSBmdW5jdGlvbnMgaW50byB0aGUgZXhlY3V0YWJsZSwgYW5kICgyKQorICAgIHdpbGwgb3BlcmF0ZSBwcm9wZXJseSB3aXRoIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgaWYKKyAgICB0aGUgdXNlciBpbnN0YWxscyBvbmUsIGFzIGxvbmcgYXMgdGhlIG1vZGlmaWVkIHZlcnNpb24gaXMKKyAgICBpbnRlcmZhY2UtY29tcGF0aWJsZSB3aXRoIHRoZSB2ZXJzaW9uIHRoYXQgdGhlIHdvcmsgd2FzIG1hZGUgd2l0aC4KKworICAgIGMpIEFjY29tcGFueSB0aGUgd29yayB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0CisgICAgbGVhc3QgdGhyZWUgeWVhcnMsIHRvIGdpdmUgdGhlIHNhbWUgdXNlciB0aGUgbWF0ZXJpYWxzCisgICAgc3BlY2lmaWVkIGluIFN1YnNlY3Rpb24gNmEsIGFib3ZlLCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZQorICAgIHRoYW4gdGhlIGNvc3Qgb2YgcGVyZm9ybWluZyB0aGlzIGRpc3RyaWJ1dGlvbi4KKworICAgIGQpIElmIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd29yayBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcyB0byBjb3B5CisgICAgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIG9mZmVyIGVxdWl2YWxlbnQgYWNjZXNzIHRvIGNvcHkgdGhlIGFib3ZlCisgICAgc3BlY2lmaWVkIG1hdGVyaWFscyBmcm9tIHRoZSBzYW1lIHBsYWNlLgorCisgICAgZSkgVmVyaWZ5IHRoYXQgdGhlIHVzZXIgaGFzIGFscmVhZHkgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZXNlCisgICAgbWF0ZXJpYWxzIG9yIHRoYXQgeW91IGhhdmUgYWxyZWFkeSBzZW50IHRoaXMgdXNlciBhIGNvcHkuCisKKyAgRm9yIGFuIGV4ZWN1dGFibGUsIHRoZSByZXF1aXJlZCBmb3JtIG9mIHRoZSAid29yayB0aGF0IHVzZXMgdGhlCitMaWJyYXJ5IiBtdXN0IGluY2x1ZGUgYW55IGRhdGEgYW5kIHV0aWxpdHkgcHJvZ3JhbXMgbmVlZGVkIGZvcgorcmVwcm9kdWNpbmcgdGhlIGV4ZWN1dGFibGUgZnJvbSBpdC4gIEhvd2V2ZXIsIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sCit0aGUgbWF0ZXJpYWxzIHRvIGJlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUgYW55dGhpbmcgdGhhdCBpcworbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5IGZvcm0pIHdpdGggdGhlIG1ham9yCitjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG9uCit3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQgaXRzZWxmIGFjY29tcGFuaWVzCit0aGUgZXhlY3V0YWJsZS4KKworICBJdCBtYXkgaGFwcGVuIHRoYXQgdGhpcyByZXF1aXJlbWVudCBjb250cmFkaWN0cyB0aGUgbGljZW5zZQorcmVzdHJpY3Rpb25zIG9mIG90aGVyIHByb3ByaWV0YXJ5IGxpYnJhcmllcyB0aGF0IGRvIG5vdCBub3JtYWxseQorYWNjb21wYW55IHRoZSBvcGVyYXRpbmcgc3lzdGVtLiAgU3VjaCBhIGNvbnRyYWRpY3Rpb24gbWVhbnMgeW91IGNhbm5vdAordXNlIGJvdGggdGhlbSBhbmQgdGhlIExpYnJhcnkgdG9nZXRoZXIgaW4gYW4gZXhlY3V0YWJsZSB0aGF0IHlvdQorZGlzdHJpYnV0ZS4KKwwKKyAgNy4gWW91IG1heSBwbGFjZSBsaWJyYXJ5IGZhY2lsaXRpZXMgdGhhdCBhcmUgYSB3b3JrIGJhc2VkIG9uIHRoZQorTGlicmFyeSBzaWRlLWJ5LXNpZGUgaW4gYSBzaW5nbGUgbGlicmFyeSB0b2dldGhlciB3aXRoIG90aGVyIGxpYnJhcnkKK2ZhY2lsaXRpZXMgbm90IGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSBzdWNoIGEgY29tYmluZWQKK2xpYnJhcnksIHByb3ZpZGVkIHRoYXQgdGhlIHNlcGFyYXRlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd29yayBiYXNlZCBvbgordGhlIExpYnJhcnkgYW5kIG9mIHRoZSBvdGhlciBsaWJyYXJ5IGZhY2lsaXRpZXMgaXMgb3RoZXJ3aXNlCitwZXJtaXR0ZWQsIGFuZCBwcm92aWRlZCB0aGF0IHlvdSBkbyB0aGVzZSB0d28gdGhpbmdzOgorCisgICAgYSkgQWNjb21wYW55IHRoZSBjb21iaW5lZCBsaWJyYXJ5IHdpdGggYSBjb3B5IG9mIHRoZSBzYW1lIHdvcmsKKyAgICBiYXNlZCBvbiB0aGUgTGlicmFyeSwgdW5jb21iaW5lZCB3aXRoIGFueSBvdGhlciBsaWJyYXJ5CisgICAgZmFjaWxpdGllcy4gIFRoaXMgbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgICAgU2VjdGlvbnMgYWJvdmUuCisKKyAgICBiKSBHaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCB0aGUgY29tYmluZWQgbGlicmFyeSBvZiB0aGUgZmFjdAorICAgIHRoYXQgcGFydCBvZiBpdCBpcyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBleHBsYWluaW5nCisgICAgd2hlcmUgdG8gZmluZCB0aGUgYWNjb21wYW55aW5nIHVuY29tYmluZWQgZm9ybSBvZiB0aGUgc2FtZSB3b3JrLgorCisgIDguIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgbGluayB3aXRoLCBvciBkaXN0cmlidXRlCit0aGUgTGlicmFyeSBleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueQorYXR0ZW1wdCBvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBsaW5rIHdpdGgsIG9yCitkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGlzIHZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIKK3JpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuICBIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywKK29yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIgdGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMKK3Rlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoIHBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KKworICA5LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKK3NpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCitkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKK3Byb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKK21vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIExpYnJhcnkgKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorTGlicmFyeSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKK2FsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKK3RoZSBMaWJyYXJ5IG9yIHdvcmtzIGJhc2VkIG9uIGl0LgorCisgIDEwLiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitMaWJyYXJ5KSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQorb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSwgbGluayB3aXRoIG9yIG1vZGlmeSB0aGUgTGlicmFyeQorc3ViamVjdCB0byB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgorcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgorWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgd2l0aAordGhpcyBMaWNlbnNlLgorDAorICAxMS4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAoraW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKK2NvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKK290aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKK2V4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90CitkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCitMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91CittYXkgbm90IGRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50CitsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5IGJ5CithbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KK3RoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KK3JlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIExpYnJhcnkuCisKK0lmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhbnkKK3BhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBhcHBseSwKK2FuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyIGNpcmN1bXN0YW5jZXMuCisKK0l0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKK3BhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55CitzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCitpbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSB3aGljaCBpcworaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCitnZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCit0aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAorc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwordG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90CitpbXBvc2UgdGhhdCBjaG9pY2UuCisKK1RoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bworYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMTIuIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgTGlicmFyeSBpcyByZXN0cmljdGVkIGluCitjZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKK29yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgTGlicmFyeSB1bmRlciB0aGlzIExpY2Vuc2UgbWF5IGFkZAorYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZyB0aG9zZSBjb3VudHJpZXMsCitzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZyBjb3VudHJpZXMgbm90IHRodXMKK2V4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzIHRoZSBsaW1pdGF0aW9uIGFzIGlmCit3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KKworICAxMy4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcKK3ZlcnNpb25zIG9mIHRoZSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4KK1N1Y2ggbmV3IHZlcnNpb25zIHdpbGwgYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwKK2J1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0byBhZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgTGlicmFyeQorc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kCisiYW55IGxhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kCitjb25kaXRpb25zIGVpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIExpYnJhcnkgZG9lcyBub3Qgc3BlY2lmeSBhCitsaWNlbnNlIHZlcnNpb24gbnVtYmVyLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKwwKKyAgMTQuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBMaWJyYXJ5IGludG8gb3RoZXIgZnJlZQorcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGluY29tcGF0aWJsZSB3aXRoIHRoZXNlLAord3JpdGUgdG8gdGhlIGF1dGhvciB0byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMKK2NvcHlyaWdodGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMgbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyCitkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzIG9mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzCitvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kIG9mIHByb21vdGluZyB0aGUgc2hhcmluZworYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KKworCQkJICAgIE5PIFdBUlJBTlRZCisKKyAgMTUuIEJFQ0FVU0UgVEhFIExJQlJBUlkgSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PCitXQVJSQU5UWSBGT1IgVEhFIExJQlJBUlksIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLgorRVhDRVBUIFdIRU4gT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IKK09USEVSIFBBUlRJRVMgUFJPVklERSBUSEUgTElCUkFSWSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZCitLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKK0lNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFCitMSUJSQVJZIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRSBMSUJSQVJZIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRQorVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLgorCisgIDE2LiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOCitXUklUSU5HIFdJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWQorQU5EL09SIFJFRElTVFJJQlVURSBUSEUgTElCUkFSWSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UKK0ZPUiBEQU1BR0VTLCBJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IKK0NPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFCitMSUJSQVJZIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HCitSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkgWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQQorRkFJTFVSRSBPRiBUSEUgTElCUkFSWSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSIFNPRlRXQVJFKSwgRVZFTiBJRgorU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorREFNQUdFUy4KKworCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworDAorICAgICAgICAgICBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgTGlicmFyaWVzCisKKyAgSWYgeW91IGRldmVsb3AgYSBuZXcgbGlicmFyeSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAorcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHdlIHJlY29tbWVuZCBtYWtpbmcgaXQgZnJlZSBzb2Z0d2FyZSB0aGF0CitldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UuICBZb3UgY2FuIGRvIHNvIGJ5IHBlcm1pdHRpbmcKK3JlZGlzdHJpYnV0aW9uIHVuZGVyIHRoZXNlIHRlcm1zIChvciwgYWx0ZXJuYXRpdmVseSwgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSkuCisKKyAgVG8gYXBwbHkgdGhlc2UgdGVybXMsIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIGxpYnJhcnkuICBJdCBpcworc2FmZXN0IHRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKK2NvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0IHRoZQorImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBsaWJyYXJ5J3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+CisgICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCitBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KKworWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKK3NjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIGxpYnJhcnksIGlmCituZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6CisKKyAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUKKyAgbGlicmFyeSBgRnJvYicgKGEgbGlicmFyeSBmb3IgdHdlYWtpbmcga25vYnMpIHdyaXR0ZW4gYnkgSmFtZXMgUmFuZG9tIEhhY2tlci4KKworICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5OTAKKyAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKKworVGhhdCdzIGFsbCB0aGVyZSBpcyB0byBpdCEKKworCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTm90aWNlcyBmb3IgZmlsZShzKToKKy9saWIvdGhpcmRfcGFydHlfaWN1X2ljdWRhdGFfaG9zdF9neXAuYQorL2xpYi90aGlyZF9wYXJ0eV9pY3VfaWN1aTE4bl9ob3N0X2d5cC5hCisvbGliL3RoaXJkX3BhcnR5X2ljdV9pY3V1Y19ob3N0X2d5cC5hCisvbGliL3RoaXJkX3BhcnR5X3Byb3RvYnVmX3Byb3RvYnVmX2Z1bGxfZG9fbm90X3VzZV9ob3N0X2d5cC5hCisvbGliL3Y4X3Rvb2xzX2d5cF92OF9iYXNlX2FybV9ob3N0X2d5cC5hCisvbGliL3Y4X3Rvb2xzX2d5cF92OF9ub3NuYXBzaG90X2FybV9ob3N0X2d5cC5hCisvb2JqL0dZUC9zaGFyZWRfaW50ZXJtZWRpYXRlcy9ta3NuYXBzaG90LmFybQorL29iai9HWVAvc2hhcmVkX2ludGVybWVkaWF0ZXMvcHJvdG9jCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvcHlyaWdodCAoYykgMjAxMyBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBUaGUgYXV0aG9yIG9mIHRoaXMgc29mdHdhcmUgaXMgRGF2aWQgTS4gR2F5LgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5MSwgMjAwMCwgMjAwMSBieSBMdWNlbnQgVGVjaG5vbG9naWVzLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIGVudGlyZSBub3RpY2UKKyAqIGlzIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb2YgYW55IHNvZnR3YXJlIHdoaWNoIGlzIG9yIGluY2x1ZGVzIGEgY29weQorICogb3IgbW9kaWZpY2F0aW9uIG9mIHRoaXMgc29mdHdhcmUgYW5kIGluIGFsbCBjb3BpZXMgb2YgdGhlIHN1cHBvcnRpbmcKKyAqIGRvY3VtZW50YXRpb24gZm9yIHN1Y2ggc29mdHdhcmUuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBCRUlORyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRZLiAgSU4gUEFSVElDVUxBUiwgTkVJVEhFUiBUSEUgQVVUSE9SIE5PUiBMVUNFTlQgTUFLRVMgQU5ZCisgKiBSRVBSRVNFTlRBVElPTiBPUiBXQVJSQU5UWSBPRiBBTlkgS0lORCBDT05DRVJOSU5HIFRIRSBNRVJDSEFOVEFCSUxJVFkKKyAqIE9GIFRISVMgU09GVFdBUkUgT1IgSVRTIEZJVE5FU1MgRk9SIEFOWSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDksIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIC0tLQorICogQXV0aG9yOiBLb3N0eWEgU2VyZWJyeWFueQorICovCisKKy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKKyAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQorICoKKyAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgorICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KKyAqCisgKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAorICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCisgKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQorICogTGljZW5zZS4KKyAqCisgKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyB0aGUgTmV0c2NhcGUgUG9ydGFibGUgUnVudGltZSAoTlNQUikuCisgKgorICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCisgKiBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KKyAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMAorICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIENvbnRyaWJ1dG9yKHMpOgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKKyAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAorICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKKyAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CisgKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCisgKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgorICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKKyAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCisgKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgorICoKKyAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCisKKy8vIENvcHlyaWdodCAoYykgMjAwNiwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgIE5vdGljZSB0aGF0IHRoZSBmb2xsb3dpbmcgQlNELXN0eWxlIGxpY2Vuc2UgYXBwbGllcyB0byB0aGUgVmFsZ3JpbmQgaGVhZGVyCisgICBmaWxlcyB1c2VkIGJ5IENocm9taXVtICh2YWxncmluZC5oIGFuZCBtZW1jaGVjay5oKS4gSG93ZXZlciwgdGhlIHJlc3Qgb2YKKyAgIFZhbGdyaW5kIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICB2ZXJzaW9uIDIsIHVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLgorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIENvcHlyaWdodCAoQykgMjAwMC0yMDA4IEp1bGlhbiBTZXdhcmQuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgYXJlIG1ldDoKKworICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgMi4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCAKKyAgICAgIG5vdCBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuICBJZiB5b3UgdXNlIHRoaXMgCisgICAgICBzb2Z0d2FyZSBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IAorICAgICAgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZSBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorCisgICAzLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0CisgICAgICBub3QgYmUgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorCisgICA0LiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgCisgICAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gCisgICAgICBwZXJtaXNzaW9uLgorCisgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUworICAgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAgIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICAgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCisgICBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCisgICBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgICBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAgIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgICBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICBDb3B5cmlnaHQgKGMpIDIwMDcgUmVkIEhhdCwgaW5jCisKKyAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMKKyAgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwKKyAgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwKKyAgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwKKyAgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6IAorCisgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAKKworICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAgU09GVFdBUkUuCisKK0NvcHlyaWdodCAyMDAzLTIwMDUgQ29saW4gUGVyY2l2YWwKK0FsbCByaWdodHMgcmVzZXJ2ZWQKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkaW5nIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIAorYXJlIG1ldDoKKzEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKK0lNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKK0FSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQorRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCitEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCitIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCitTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKK0lOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKKyAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KKworICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKKyAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKKyAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCisgICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQorICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCisgICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCisgICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKKyAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KKworICAgQ29weXJpZ2h0IDIwMDctMjAwOSBHb29nbGUgSW5jLgorICAgQ29weXJpZ2h0IDIwMDctMjAwOSBXZWJEcml2ZXIgY29tbWl0dGVycworCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKK0NvcHlyaWdodCAoQykgMjAwOSBieSBUdW5nIE1hYy4KKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKK2luIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKK3RvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKK2NvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK0FVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKK0xJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCitPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCitUSEUgU09GVFdBUkUuCisKKy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKKyAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQorICoKKyAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgorICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KKyAqCisgKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAorICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCisgKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQorICogTGljZW5zZS4KKyAqCisgKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyB0aGUgTmV0c2NhcGUgc2VjdXJpdHkgbGlicmFyaWVzLgorICoKKyAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcworICogTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCisgKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDAwCisgKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogQ29udHJpYnV0b3Iocyk6CisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgorICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCisgKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAorICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KKyAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCisgKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQorICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKKyAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCisgKgorICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KKworLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgorICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCisgKgorICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCisgKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLworICoKKyAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCisgKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKKyAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCisgKiBMaWNlbnNlLgorICoKKyAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIHRoZSBOZXRzY2FwZSBzZWN1cml0eSBsaWJyYXJpZXMuCisgKgorICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCisgKiBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KKyAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTQtMjAwMAorICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIENvbnRyaWJ1dG9yKHMpOgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKKyAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAorICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKKyAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CisgKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCisgKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgorICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKKyAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCisgKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgorICoKKyAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCisKK0NvcHlyaWdodCAyMDExLCBUaGUgQ2hyb21pdW0gQXV0aG9ycworQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCittZXQ6CisKKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Citub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCitjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCitpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCitkaXN0cmlidXRpb24uCisgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCitjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQordGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKK0xJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKK09XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCitEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKK1RIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKwkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCisKKyBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICAgIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKKyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworCQkJICAgIFByZWFtYmxlCisKKyAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgorZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUKK3NvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuICBUaGlzCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gbW9zdCBvZiB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZSBhdXRob3JzIGNvbW1pdCB0bwordXNpbmcgaXQuICAoU29tZSBvdGhlciBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUgaXMgY292ZXJlZCBieQordGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZC4pICBZb3UgY2FuIGFwcGx5IGl0IHRvCit5b3VyIHByb2dyYW1zLCB0b28uCisKKyAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAorcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQoraGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgordGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0CitpZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAoraW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgorCisgIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKK2FueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KK1RoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91CitkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuCisKKyAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlcgorZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0Cit5b3UgaGF2ZS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZQorc291cmNlIGNvZGUuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpcgorcmlnaHRzLgorCisgIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQgdGhlIHNvZnR3YXJlLCBhbmQKKygyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksCitkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIHNvZnR3YXJlLgorCisgIEFsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCit0aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZQorc29mdHdhcmUuICBJZiB0aGUgc29mdHdhcmUgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCit3YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsLCBzbwordGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbiB0aGUgb3JpZ2luYWwKK2F1dGhvcnMnIHJlcHV0YXRpb25zLgorCisgIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCitwYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgcmVkaXN0cmlidXRvcnMgb2YgYSBmcmVlCitwcm9ncmFtIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlCitwcm9ncmFtIHByb3ByaWV0YXJ5LiAgVG8gcHJldmVudCB0aGlzLCB3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkKK3BhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzIGZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCisKKyAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKK21vZGlmaWNhdGlvbiBmb2xsb3cuCisMCisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCisKKyAgMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucworYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKK3VuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUgIlByb2dyYW0iLCBiZWxvdywKK3JlZmVycyB0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIgorbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoKK3RoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsCitlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlcgorbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbgordGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCisKK0FjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Citjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCitydW5uaW5nIHRoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtCitpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4KK1doZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgorCisgIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncworc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91Citjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlCitjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlCitub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7CithbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlCithbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgorCitZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKK3lvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCisKKyAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbgorb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZAorZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCithYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgorCisgICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KKworICAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbgorICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQorICAgIHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkCisgICAgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgorCisgICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseQorICAgIHdoZW4gcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2gKKyAgICBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCisgICAgYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhCisgICAgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlCisgICAgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlcgorICAgIHRoZXNlIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzCisgICAgTGljZW5zZS4gIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQKKyAgICBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uCisgICAgdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCisMCitUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCitpZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLAorYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCit0aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCitzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKK2Rpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAorb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCit0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQorZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgorCitUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKK3lvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bworZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCitjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgorCitJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtCit3aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YKK2Egc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCit0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCisgIDMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LAordW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mCitTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKKyAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlCisgICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zCisgICAgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQorICAgIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyCisgICAgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgc291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZQorICAgIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUKKyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bQorICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyCisgICAgdG8gZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMKKyAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQorICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2gKKyAgICBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKKworVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgorbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UKK2NvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55Cithc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8KK2NvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIEhvd2V2ZXIsIGFzIGEKK3NwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZQorYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkKK2Zvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlCitvcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAoraXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLgorCitJZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nCithY2Nlc3MgdG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50CithY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMKK2Rpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAorY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KKwwKKyAgNC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCitleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueSBhdHRlbXB0CitvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMKK3ZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4KK0hvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLCBvciByaWdodHMsIGZyb20geW91IHVuZGVyCit0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaAorcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgorCisgIDUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAorc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKK2Rpc3RyaWJ1dGUgdGhlIFByb2dyYW0gb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQorcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQorbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAorYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwordGhlIFByb2dyYW0gb3Igd29ya3MgYmFzZWQgb24gaXQuCisKKyAgNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKK29yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUgb3IgbW9kaWZ5IHRoZSBQcm9ncmFtIHN1YmplY3QgdG8KK3RoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCityZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCitZb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0bwordGhpcyBMaWNlbnNlLgorCisgIDcuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKK2luZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCitjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCitvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CitleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAorZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcworTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQorbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAorbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieQorYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCit0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCityZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtLgorCitJZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKK2FueSBwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8KK2FwcGx5IGFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyCitjaXJjdW1zdGFuY2VzLgorCitJdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55CitwYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQorc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQoraW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0sIHdoaWNoIGlzCitpbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKK2dlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKK3Rocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0CitzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCit0byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKK2ltcG9zZSB0aGF0IGNob2ljZS4KKworVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCitiZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KKwwKKyAgOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4KK2NlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQorb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZQorbWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nCit0aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCitjb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKK3RoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgorCisgIDkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zCitvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKK2JlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bworYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCisKK0VhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0KK3NwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55CitsYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCitlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZgordGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbi4KKworICAxMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlCitwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yCit0byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcworbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMKK29mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQKK29mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgorCisJCQkgICAgTk8gV0FSUkFOVFkKKworICAxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKK0ZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTgorT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUworUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQKK09SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTCitUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFCitQUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywKK1JFUEFJUiBPUiBDT1JSRUNUSU9OLgorCisgIDEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKK1dJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IKK1JFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsCitJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcKK09VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQKK1RPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWQorWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIKK1BST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRQorUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorCisJCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisMCisJICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcworCisgIElmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKK3Bvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKK2ZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLgorCisgIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0Cit0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Citjb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdAordGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCisKKyAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgorICAgIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKworQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCisKK0lmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKK3doZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6CisKKyAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIHllYXIgIG5hbWUgb2YgYXV0aG9yCisgICAgR25vbW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgorICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKKyAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCisKK1RoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQorcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heQorYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleSBjb3VsZCBldmVuIGJlCittb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgorCitZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgorc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYKK25lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKKworICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZSBwcm9ncmFtCisgIGBHbm9tb3Zpc2lvbicgKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gYnkgSmFtZXMgSGFja2VyLgorCisgIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk4OQorICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQorCitUaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KK3Byb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5Citjb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKK2xpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuCisKKy8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworCisvKgorKiogQ29weXJpZ2h0IChjKSAyMDA3LTIwMTAgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorKioKKyoqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisqKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kL29yIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisqKiAiTWF0ZXJpYWxzIiksIHRvIGRlYWwgaW4gdGhlIE1hdGVyaWFscyB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyoqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyoqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgTWF0ZXJpYWxzLCBhbmQgdG8KKyoqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIE1hdGVyaWFscyBhcmUgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisqKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisqKgorKiogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyoqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIE1hdGVyaWFscy4KKyoqCisqKiBUSEUgTUFURVJJQUxTIEFSRSBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorKiogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisqKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisqKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorKiogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyoqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisqKiBNQVRFUklBTFMgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgTUFURVJJQUxTLgorKi8KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKworICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgorCisgICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZworICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgorICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKKyAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCisgICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKKyAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKKyAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgorICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgorCisgICBDb3B5cmlnaHQgKGMpIDIwMDgsIEdvb2dsZSBJbmMuCisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyhXZWJLaXQgZG9lc24ndCBkaXN0cmlidXRlIGFuIGV4cGxpY2l0IGxpY2Vuc2UuICBUaGlzIExJQ0VOU0UgaXMgZGVyaXZlZCBmcm9tCitsaWNlbnNlIHRleHQgaW4gdGhlIHNvdXJjZS4pCisKK0NvcHlyaWdodCAoYykgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwKKzIwMDYsIDIwMDcgQWxleGFuZGVyIEtlbGxldHQsIEFsZXhleSBQcm9za3VyeWFrb3YsIEFsZXggTWF0aGV3cywgQWxsYW4KK1NhbmRmZWxkIEplbnNlbiwgQWxwIFRva2VyLCBBbmRlcnMgQ2FybHNzb24sIEFuZHJldyBXZWxsaW5ndG9uLCBBbnR0aQorS29pdmlzdG8sIEFwcGxlIEluYy4sIEFydGh1ciBMYW5nZXJlaXMsIEJhcm9uIFNjaHdhcnR6LCBCam9lcm4gR3JhZiwKK0JyZW50IEZ1bGdoYW0sIENhbWVyb24gWndhcmljaCwgQ2hhcmxlcyBTYW11ZWxzLCBDaHJpc3RpYW4gRHl3YW4sCitDb2xsYWJvcmEgTHRkLiwgQ3lydXMgUGF0ZWwsIERhbmllbCBNb2xrZW50aW4sIERhdmUgTWFjbGFjaGxhbiwgRGF2aWQKK1NtaXRoLCBEYXdpdCBBbGVtYXllaHUsIERpcmsgTXVlbGxlciwgRGlyayBTY2h1bHplLCBEb24gR2lic29uLCBFbnJpY28KK1JvcywgRXJpYyBTZWlkZWwsIEZyZWRlcmlrIEhvbGxqZW4sIEZyZXJpY2ggUmFhYmUsIEZyaWVkbWFubiBLbGVpbnQsCitHZW9yZ2UgU3RhaWtvcywgR29vZ2xlIEluYy4sIEdyYWhhbSBEZW5uaXMsIEhhcnJpIFBvcnRlbiwgSGVucnkgTWFzb24sCitIaXJveXVraSBJa2V6b2UsIEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyLCBJQk0sIEphbWVzIEcuIFNwZXRoLCBKYW4KK0Fsb256bywgSmVhbi1Mb3VwIEdhaWxseSwgSm9obiBSZWlzLCBKb25hcyBXaXR0LCBKb24gU2hpZXIsIEpvbmFzCitXaXR0LCBKdWxpZW4gQ2hhZmZyYWl4LCBKdXN0aW4gSGF5Z29vZCwgS2V2aW4gT2xsaXZpZXIsIEtldmluIFdhdHRlcnMsCitLaW1tbyBLaW5udW5lbiwgS291aGVpIFN1dG91LCBLcnp5c3p0b2YgS293YWxjenlrLCBMYXJzIEtub2xsLCBMdWNhCitCcnVubywgTWFrcyBPcmxvdmljaCwgTWFsdGUgU3Rhcm9zdGlrLCBNYXJrIEFkbGVyLCBNYXJ0aW4gSm9uZXMsCitNYXJ2aW4gRGVja2VyLCBNYXR0IExpbGVrLCBNaWNoYWVsIEVtbWVsLCBNaXR6IFBldHRlbCwgbW96aWxsYS5vcmcsCitOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbiwgTmljaG9sYXMgU2hhbmtzLCBOaWtvbGFzCitaaW1tZXJtYW5uLCBOb2tpYSwgT2xpdmVyIEh1bnQsIE9wZW5lZCBIYW5kLCBQYXVsIEpvaG5zdG9uLCBQZXRlcgorS2VsbHksIFBpb25lZXIgUmVzZWFyY2ggQ2VudGVyIFVTQSwgUmljaCBNb29yZSwgUm9iIEJ1aXMsIFJvYmluIER1bm4sCitSb25hbGQgVHNjaGFsw6RyLCBTYW11ZWwgV2VpbmlnLCBTaW1vbiBIYXVzbWFubiwgU3RhaWtvcyBDb21wdXRpbmcKK1NlcnZpY2VzIEluYy4sIFN0ZWZhbiBTY2hpbWFuc2tpLCBTeW1hbnRlYyBDb3Jwb3JhdGlvbiwgVGhlIERvam8KK0ZvdW5kYXRpb24sIFRoZSBLYXJib24gRGV2ZWxvcGVycywgVGhvbWFzIEJveWVyLCBUaW0gQ29wcGVyZmllbGQsCitUb2JpYXMgQW50b24sIFRvcmJlbiBXZWlzLCBUcm9sbHRlY2gsIFVuaXZlcnNpdHkgb2YgQ2FtYnJpZGdlLCBWYWNsYXYKK1NsYXZpaywgV2FsZG8gQmFzdGlhbiwgWGFuIExvcGV6LCBaYWNrIFJ1c2luCisKK1RoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB2YXJ5IGZyb20gZmlsZSB0byBmaWxlLCBidXQgYXJlIG9uZSBvZjoKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCittZXQ6CisKKzEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKzIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAgIGRpc3RyaWJ1dGlvbi4KKworKk9SKgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKK21ldDoKKworMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKzIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAgIGRpc3RyaWJ1dGlvbi4KKzMuIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKK0lNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCitQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisKK09GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCitPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisKKyAgICAgICAgICAgICAgICAgIEdOVSBMSUJSQVJZIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKyAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKKworIENvcHlyaWdodCAoQykgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKKyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworW1RoaXMgaXMgdGhlIGZpcnN0IHJlbGVhc2VkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgR1BMLiAgSXQgaXMKKyBudW1iZXJlZCAyIGJlY2F1c2UgaXQgZ29lcyB3aXRoIHZlcnNpb24gMiBvZiB0aGUgb3JkaW5hcnkgR1BMLl0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWFtYmxlCisKKyAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgorZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2VzIGFyZSBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UKK2ZyZWUgc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4KKworICBUaGlzIGxpY2Vuc2UsIHRoZSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFwcGxpZXMgdG8gc29tZQorc3BlY2lhbGx5IGRlc2lnbmF0ZWQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlLCBhbmQgdG8gYW55CitvdGhlciBsaWJyYXJpZXMgd2hvc2UgYXV0aG9ycyBkZWNpZGUgdG8gdXNlIGl0LiAgWW91IGNhbiB1c2UgaXQgZm9yCit5b3VyIGxpYnJhcmllcywgdG9vLgorCisgIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKK3ByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKK2hhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKK3RoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAoraWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQKK2luIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KKworICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCithbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuCitUaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmCit5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIGxpYnJhcnksIG9yIGlmIHlvdSBtb2RpZnkgaXQuCisKKyAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSwgd2hldGhlciBncmF0aXMKK29yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0IHdlIGdhdmUKK3lvdS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZSBzb3VyY2UKK2NvZGUuICBJZiB5b3UgbGluayBhIHByb2dyYW0gd2l0aCB0aGUgbGlicmFyeSwgeW91IG11c3QgcHJvdmlkZQorY29tcGxldGUgb2JqZWN0IGZpbGVzIHRvIHRoZSByZWNpcGllbnRzIHNvIHRoYXQgdGhleSBjYW4gcmVsaW5rIHRoZW0KK3dpdGggdGhlIGxpYnJhcnksIGFmdGVyIG1ha2luZyBjaGFuZ2VzIHRvIHRoZSBsaWJyYXJ5IGFuZCByZWNvbXBpbGluZworaXQuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpciByaWdodHMuCisKKyAgT3VyIG1ldGhvZCBvZiBwcm90ZWN0aW5nIHlvdXIgcmlnaHRzIGhhcyB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQKK3RoZSBsaWJyYXJ5LCBhbmQgKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsCitwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgbGlicmFyeS4KKworICBBbHNvLCBmb3IgZWFjaCBkaXN0cmlidXRvcidzIHByb3RlY3Rpb24sIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCit0aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZQorbGlicmFyeS4gIElmIHRoZSBsaWJyYXJ5IGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQord2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbAordmVyc2lvbiwgc28gdGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbgordGhlIG9yaWdpbmFsIGF1dGhvcnMnIHJlcHV0YXRpb25zLgorDAorICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZQorcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IGNvbXBhbmllcyBkaXN0cmlidXRpbmcgZnJlZQorc29mdHdhcmUgd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgdGh1cyBpbiBlZmZlY3QKK3RyYW5zZm9ybWluZyB0aGUgcHJvZ3JhbSBpbnRvIHByb3ByaWV0YXJ5IHNvZnR3YXJlLiAgVG8gcHJldmVudCB0aGlzLAord2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55IHBhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzCitmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgorCisgIE1vc3QgR05VIHNvZnR3YXJlLCBpbmNsdWRpbmcgc29tZSBsaWJyYXJpZXMsIGlzIGNvdmVyZWQgYnkgdGhlIG9yZGluYXJ5CitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgd2hpY2ggd2FzIGRlc2lnbmVkIGZvciB1dGlsaXR5IHByb2dyYW1zLiAgVGhpcworbGljZW5zZSwgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFwcGxpZXMgdG8gY2VydGFpbgorZGVzaWduYXRlZCBsaWJyYXJpZXMuICBUaGlzIGxpY2Vuc2UgaXMgcXVpdGUgZGlmZmVyZW50IGZyb20gdGhlIG9yZGluYXJ5CitvbmU7IGJlIHN1cmUgdG8gcmVhZCBpdCBpbiBmdWxsLCBhbmQgZG9uJ3QgYXNzdW1lIHRoYXQgYW55dGhpbmcgaW4gaXQgaXMKK3RoZSBzYW1lIGFzIGluIHRoZSBvcmRpbmFyeSBsaWNlbnNlLgorCisgIFRoZSByZWFzb24gd2UgaGF2ZSBhIHNlcGFyYXRlIHB1YmxpYyBsaWNlbnNlIGZvciBzb21lIGxpYnJhcmllcyBpcyB0aGF0Cit0aGV5IGJsdXIgdGhlIGRpc3RpbmN0aW9uIHdlIHVzdWFsbHkgbWFrZSBiZXR3ZWVuIG1vZGlmeWluZyBvciBhZGRpbmcgdG8gYQorcHJvZ3JhbSBhbmQgc2ltcGx5IHVzaW5nIGl0LiAgTGlua2luZyBhIHByb2dyYW0gd2l0aCBhIGxpYnJhcnksIHdpdGhvdXQKK2NoYW5naW5nIHRoZSBsaWJyYXJ5LCBpcyBpbiBzb21lIHNlbnNlIHNpbXBseSB1c2luZyB0aGUgbGlicmFyeSwgYW5kIGlzCithbmFsb2dvdXMgdG8gcnVubmluZyBhIHV0aWxpdHkgcHJvZ3JhbSBvciBhcHBsaWNhdGlvbiBwcm9ncmFtLiAgSG93ZXZlciwgaW4KK2EgdGV4dHVhbCBhbmQgbGVnYWwgc2Vuc2UsIHRoZSBsaW5rZWQgZXhlY3V0YWJsZSBpcyBhIGNvbWJpbmVkIHdvcmssIGEKK2Rlcml2YXRpdmUgb2YgdGhlIG9yaWdpbmFsIGxpYnJhcnksIGFuZCB0aGUgb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQordHJlYXRzIGl0IGFzIHN1Y2guCisKKyAgQmVjYXVzZSBvZiB0aGlzIGJsdXJyZWQgZGlzdGluY3Rpb24sIHVzaW5nIHRoZSBvcmRpbmFyeSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbGlicmFyaWVzIGRpZCBub3QgZWZmZWN0aXZlbHkgcHJvbW90ZSBzb2Z0d2FyZQorc2hhcmluZywgYmVjYXVzZSBtb3N0IGRldmVsb3BlcnMgZGlkIG5vdCB1c2UgdGhlIGxpYnJhcmllcy4gIFdlCitjb25jbHVkZWQgdGhhdCB3ZWFrZXIgY29uZGl0aW9ucyBtaWdodCBwcm9tb3RlIHNoYXJpbmcgYmV0dGVyLgorCisgIEhvd2V2ZXIsIHVucmVzdHJpY3RlZCBsaW5raW5nIG9mIG5vbi1mcmVlIHByb2dyYW1zIHdvdWxkIGRlcHJpdmUgdGhlCit1c2VycyBvZiB0aG9zZSBwcm9ncmFtcyBvZiBhbGwgYmVuZWZpdCBmcm9tIHRoZSBmcmVlIHN0YXR1cyBvZiB0aGUKK2xpYnJhcmllcyB0aGVtc2VsdmVzLiAgVGhpcyBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW50ZW5kZWQgdG8KK3Blcm1pdCBkZXZlbG9wZXJzIG9mIG5vbi1mcmVlIHByb2dyYW1zIHRvIHVzZSBmcmVlIGxpYnJhcmllcywgd2hpbGUKK3ByZXNlcnZpbmcgeW91ciBmcmVlZG9tIGFzIGEgdXNlciBvZiBzdWNoIHByb2dyYW1zIHRvIGNoYW5nZSB0aGUgZnJlZQorbGlicmFyaWVzIHRoYXQgYXJlIGluY29ycG9yYXRlZCBpbiB0aGVtLiAgKFdlIGhhdmUgbm90IHNlZW4gaG93IHRvIGFjaGlldmUKK3RoaXMgYXMgcmVnYXJkcyBjaGFuZ2VzIGluIGhlYWRlciBmaWxlcywgYnV0IHdlIGhhdmUgYWNoaWV2ZWQgaXQgYXMgcmVnYXJkcworY2hhbmdlcyBpbiB0aGUgYWN0dWFsIGZ1bmN0aW9ucyBvZiB0aGUgTGlicmFyeS4pICBUaGUgaG9wZSBpcyB0aGF0IHRoaXMKK3dpbGwgbGVhZCB0byBmYXN0ZXIgZGV2ZWxvcG1lbnQgb2YgZnJlZSBsaWJyYXJpZXMuCisKKyAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKK21vZGlmaWNhdGlvbiBmb2xsb3cuICBQYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYQorIndvcmsgYmFzZWQgb24gdGhlIGxpYnJhcnkiIGFuZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgbGlicmFyeSIuICBUaGUKK2Zvcm1lciBjb250YWlucyBjb2RlIGRlcml2ZWQgZnJvbSB0aGUgbGlicmFyeSwgd2hpbGUgdGhlIGxhdHRlciBvbmx5Cit3b3JrcyB0b2dldGhlciB3aXRoIHRoZSBsaWJyYXJ5LgorCisgIE5vdGUgdGhhdCBpdCBpcyBwb3NzaWJsZSBmb3IgYSBsaWJyYXJ5IHRvIGJlIGNvdmVyZWQgYnkgdGhlIG9yZGluYXJ5CitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHJhdGhlciB0aGFuIGJ5IHRoaXMgc3BlY2lhbCBvbmUuCisMCisgICAgICAgICAgICAgICAgICBHTlUgTElCUkFSWSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KKworICAwLiBUaGlzIExpY2Vuc2UgQWdyZWVtZW50IGFwcGxpZXMgdG8gYW55IHNvZnR3YXJlIGxpYnJhcnkgd2hpY2gKK2NvbnRhaW5zIGEgbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBvciBvdGhlciBhdXRob3JpemVkCitwYXJ0eSBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpYnJhcnkKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgKGFsc28gY2FsbGVkICJ0aGlzIExpY2Vuc2UiKS4gIEVhY2ggbGljZW5zZWUgaXMKK2FkZHJlc3NlZCBhcyAieW91Ii4KKworICBBICJsaWJyYXJ5IiBtZWFucyBhIGNvbGxlY3Rpb24gb2Ygc29mdHdhcmUgZnVuY3Rpb25zIGFuZC9vciBkYXRhCitwcmVwYXJlZCBzbyBhcyB0byBiZSBjb252ZW5pZW50bHkgbGlua2VkIHdpdGggYXBwbGljYXRpb24gcHJvZ3JhbXMKKyh3aGljaCB1c2Ugc29tZSBvZiB0aG9zZSBmdW5jdGlvbnMgYW5kIGRhdGEpIHRvIGZvcm0gZXhlY3V0YWJsZXMuCisKKyAgVGhlICJMaWJyYXJ5IiwgYmVsb3csIHJlZmVycyB0byBhbnkgc3VjaCBzb2Z0d2FyZSBsaWJyYXJ5IG9yIHdvcmsKK3doaWNoIGhhcyBiZWVuIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZXNlIHRlcm1zLiAgQSAid29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkiIG1lYW5zIGVpdGhlciB0aGUgTGlicmFyeSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyCitjb3B5cmlnaHQgbGF3OiB0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIExpYnJhcnkgb3IgYQorcG9ydGlvbiBvZiBpdCwgZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZAorc3RyYWlnaHRmb3J3YXJkbHkgaW50byBhbm90aGVyIGxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcworaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluIHRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikKKworICAiU291cmNlIGNvZGUiIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgorbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYSBsaWJyYXJ5LCBjb21wbGV0ZSBzb3VyY2UgY29kZSBtZWFucworYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55IGFzc29jaWF0ZWQKK2ludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8gY29udHJvbCBjb21waWxhdGlvbgorYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgbGlicmFyeS4KKworICBBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAorY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgorcnVubmluZyBhIHByb2dyYW0gdXNpbmcgdGhlIExpYnJhcnkgaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCBvdXRwdXQgZnJvbQorc3VjaCBhIHByb2dyYW0gaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZAorb24gdGhlIExpYnJhcnkgKGluZGVwZW5kZW50IG9mIHRoZSB1c2Ugb2YgdGhlIExpYnJhcnkgaW4gYSB0b29sIGZvcgord3JpdGluZyBpdCkuICBXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIExpYnJhcnkgZG9lcworYW5kIHdoYXQgdGhlIHByb2dyYW0gdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IGRvZXMuCisgIAorICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBMaWJyYXJ5J3MKK2NvbXBsZXRlIHNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0Cit5b3UgY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbgorYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QKK2FsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55Cit3YXJyYW50eTsgYW5kIGRpc3RyaWJ1dGUgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZQorTGlicmFyeS4KKworICBZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LAorYW5kIHlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYQorZmVlLgorDAorICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBMaWJyYXJ5IG9yIGFueSBwb3J0aW9uCitvZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgYW5kIGNvcHkgYW5kCitkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKK2Fib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CisKKyAgICBhKSBUaGUgbW9kaWZpZWQgd29yayBtdXN0IGl0c2VsZiBiZSBhIHNvZnR3YXJlIGxpYnJhcnkuCisKKyAgICBiKSBZb3UgbXVzdCBjYXVzZSB0aGUgZmlsZXMgbW9kaWZpZWQgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgorCisgICAgYykgWW91IG11c3QgY2F1c2UgdGhlIHdob2xlIG9mIHRoZSB3b3JrIHRvIGJlIGxpY2Vuc2VkIGF0IG5vCisgICAgY2hhcmdlIHRvIGFsbCB0aGlyZCBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgICBkKSBJZiBhIGZhY2lsaXR5IGluIHRoZSBtb2RpZmllZCBMaWJyYXJ5IHJlZmVycyB0byBhIGZ1bmN0aW9uIG9yIGEKKyAgICB0YWJsZSBvZiBkYXRhIHRvIGJlIHN1cHBsaWVkIGJ5IGFuIGFwcGxpY2F0aW9uIHByb2dyYW0gdGhhdCB1c2VzCisgICAgdGhlIGZhY2lsaXR5LCBvdGhlciB0aGFuIGFzIGFuIGFyZ3VtZW50IHBhc3NlZCB3aGVuIHRoZSBmYWNpbGl0eQorICAgIGlzIGludm9rZWQsIHRoZW4geW91IG11c3QgbWFrZSBhIGdvb2QgZmFpdGggZWZmb3J0IHRvIGVuc3VyZSB0aGF0LAorICAgIGluIHRoZSBldmVudCBhbiBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgc3VjaCBmdW5jdGlvbiBvcgorICAgIHRhYmxlLCB0aGUgZmFjaWxpdHkgc3RpbGwgb3BlcmF0ZXMsIGFuZCBwZXJmb3JtcyB3aGF0ZXZlciBwYXJ0IG9mCisgICAgaXRzIHB1cnBvc2UgcmVtYWlucyBtZWFuaW5nZnVsLgorCisgICAgKEZvciBleGFtcGxlLCBhIGZ1bmN0aW9uIGluIGEgbGlicmFyeSB0byBjb21wdXRlIHNxdWFyZSByb290cyBoYXMKKyAgICBhIHB1cnBvc2UgdGhhdCBpcyBlbnRpcmVseSB3ZWxsLWRlZmluZWQgaW5kZXBlbmRlbnQgb2YgdGhlCisgICAgYXBwbGljYXRpb24uICBUaGVyZWZvcmUsIFN1YnNlY3Rpb24gMmQgcmVxdWlyZXMgdGhhdCBhbnkKKyAgICBhcHBsaWNhdGlvbi1zdXBwbGllZCBmdW5jdGlvbiBvciB0YWJsZSB1c2VkIGJ5IHRoaXMgZnVuY3Rpb24gbXVzdAorICAgIGJlIG9wdGlvbmFsOiBpZiB0aGUgYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IGl0LCB0aGUgc3F1YXJlCisgICAgcm9vdCBmdW5jdGlvbiBtdXN0IHN0aWxsIGNvbXB1dGUgc3F1YXJlIHJvb3RzLikKKworVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgoraWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgTGlicmFyeSwKK2FuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgordGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQorc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91CitkaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKK29uIHRoZSBMaWJyYXJ5LCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgordGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKK2VudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZQoraXQuCisKK1RodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoreW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCitleGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKK2NvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIExpYnJhcnkuCisKK0luIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIExpYnJhcnkKK3dpdGggdGhlIExpYnJhcnkgKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5KSBvbiBhIHZvbHVtZSBvZgorYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKK3RoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMy4gWW91IG1heSBvcHQgdG8gYXBwbHkgdGhlIHRlcm1zIG9mIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UgdG8gYSBnaXZlbiBjb3B5IG9mIHRoZSBMaWJyYXJ5LiAgVG8gZG8KK3RoaXMsIHlvdSBtdXN0IGFsdGVyIGFsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSwgc28KK3RoYXQgdGhleSByZWZlciB0byB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwKK2luc3RlYWQgb2YgdG8gdGhpcyBMaWNlbnNlLiAgKElmIGEgbmV3ZXIgdmVyc2lvbiB0aGFuIHZlcnNpb24gMiBvZiB0aGUKK29yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGhhcyBhcHBlYXJlZCwgdGhlbiB5b3UgY2FuIHNwZWNpZnkKK3RoYXQgdmVyc2lvbiBpbnN0ZWFkIGlmIHlvdSB3aXNoLikgIERvIG5vdCBtYWtlIGFueSBvdGhlciBjaGFuZ2UgaW4KK3RoZXNlIG5vdGljZXMuCisMCisgIE9uY2UgdGhpcyBjaGFuZ2UgaXMgbWFkZSBpbiBhIGdpdmVuIGNvcHksIGl0IGlzIGlycmV2ZXJzaWJsZSBmb3IKK3RoYXQgY29weSwgc28gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gYWxsCitzdWJzZXF1ZW50IGNvcGllcyBhbmQgZGVyaXZhdGl2ZSB3b3JrcyBtYWRlIGZyb20gdGhhdCBjb3B5LgorCisgIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSB3aXNoIHRvIGNvcHkgcGFydCBvZiB0aGUgY29kZSBvZgordGhlIExpYnJhcnkgaW50byBhIHByb2dyYW0gdGhhdCBpcyBub3QgYSBsaWJyYXJ5LgorCisgIDQuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYSBwb3J0aW9uIG9yCitkZXJpdmF0aXZlIG9mIGl0LCB1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybQordW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWNjb21wYW55CitpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUsIHdoaWNoCittdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEKK21lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZS4KKworICBJZiBkaXN0cmlidXRpb24gb2Ygb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQorZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUKK3NvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2Ugc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudCB0bworZGlzdHJpYnV0ZSB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAorY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KKworICA1LiBBIHByb2dyYW0gdGhhdCBjb250YWlucyBubyBkZXJpdmF0aXZlIG9mIGFueSBwb3J0aW9uIG9mIHRoZQorTGlicmFyeSwgYnV0IGlzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCB0aGUgTGlicmFyeSBieSBiZWluZyBjb21waWxlZCBvcgorbGlua2VkIHdpdGggaXQsIGlzIGNhbGxlZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIuICBTdWNoIGEKK3dvcmssIGluIGlzb2xhdGlvbiwgaXMgbm90IGEgZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5LCBhbmQKK3RoZXJlZm9yZSBmYWxscyBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgSG93ZXZlciwgbGlua2luZyBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeQorY3JlYXRlcyBhbiBleGVjdXRhYmxlIHRoYXQgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBMaWJyYXJ5IChiZWNhdXNlIGl0Citjb250YWlucyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSksIHJhdGhlciB0aGFuIGEgIndvcmsgdGhhdCB1c2VzIHRoZQorbGlicmFyeSIuICBUaGUgZXhlY3V0YWJsZSBpcyB0aGVyZWZvcmUgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UuCitTZWN0aW9uIDYgc3RhdGVzIHRlcm1zIGZvciBkaXN0cmlidXRpb24gb2Ygc3VjaCBleGVjdXRhYmxlcy4KKworICBXaGVuIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB1c2VzIG1hdGVyaWFsIGZyb20gYSBoZWFkZXIgZmlsZQordGhhdCBpcyBwYXJ0IG9mIHRoZSBMaWJyYXJ5LCB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIG1heSBiZSBhCitkZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnkgZXZlbiB0aG91Z2ggdGhlIHNvdXJjZSBjb2RlIGlzIG5vdC4KK1doZXRoZXIgdGhpcyBpcyB0cnVlIGlzIGVzcGVjaWFsbHkgc2lnbmlmaWNhbnQgaWYgdGhlIHdvcmsgY2FuIGJlCitsaW5rZWQgd2l0aG91dCB0aGUgTGlicmFyeSwgb3IgaWYgdGhlIHdvcmsgaXMgaXRzZWxmIGEgbGlicmFyeS4gIFRoZQordGhyZXNob2xkIGZvciB0aGlzIHRvIGJlIHRydWUgaXMgbm90IHByZWNpc2VseSBkZWZpbmVkIGJ5IGxhdy4KKworICBJZiBzdWNoIGFuIG9iamVjdCBmaWxlIHVzZXMgb25seSBudW1lcmljYWwgcGFyYW1ldGVycywgZGF0YQorc3RydWN0dXJlIGxheW91dHMgYW5kIGFjY2Vzc29ycywgYW5kIHNtYWxsIG1hY3JvcyBhbmQgc21hbGwgaW5saW5lCitmdW5jdGlvbnMgKHRlbiBsaW5lcyBvciBsZXNzIGluIGxlbmd0aCksIHRoZW4gdGhlIHVzZSBvZiB0aGUgb2JqZWN0CitmaWxlIGlzIHVucmVzdHJpY3RlZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGlzIGxlZ2FsbHkgYSBkZXJpdmF0aXZlCit3b3JrLiAgKEV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhpcyBvYmplY3QgY29kZSBwbHVzIHBvcnRpb25zIG9mIHRoZQorTGlicmFyeSB3aWxsIHN0aWxsIGZhbGwgdW5kZXIgU2VjdGlvbiA2LikKKworICBPdGhlcndpc2UsIGlmIHRoZSB3b3JrIGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSwgeW91IG1heQorZGlzdHJpYnV0ZSB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDYuCitBbnkgZXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGF0IHdvcmsgYWxzbyBmYWxsIHVuZGVyIFNlY3Rpb24gNiwKK3doZXRoZXIgb3Igbm90IHRoZXkgYXJlIGxpbmtlZCBkaXJlY3RseSB3aXRoIHRoZSBMaWJyYXJ5IGl0c2VsZi4KKwwKKyAgNi4gQXMgYW4gZXhjZXB0aW9uIHRvIHRoZSBTZWN0aW9ucyBhYm92ZSwgeW91IG1heSBhbHNvIGNvbXBpbGUgb3IKK2xpbmsgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkgdG8gcHJvZHVjZSBhCit3b3JrIGNvbnRhaW5pbmcgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnksIGFuZCBkaXN0cmlidXRlIHRoYXQgd29yawordW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgdGhlIHRlcm1zIHBlcm1pdAorbW9kaWZpY2F0aW9uIG9mIHRoZSB3b3JrIGZvciB0aGUgY3VzdG9tZXIncyBvd24gdXNlIGFuZCByZXZlcnNlCitlbmdpbmVlcmluZyBmb3IgZGVidWdnaW5nIHN1Y2ggbW9kaWZpY2F0aW9ucy4KKworICBZb3UgbXVzdCBnaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCBlYWNoIGNvcHkgb2YgdGhlIHdvcmsgdGhhdCB0aGUKK0xpYnJhcnkgaXMgdXNlZCBpbiBpdCBhbmQgdGhhdCB0aGUgTGlicmFyeSBhbmQgaXRzIHVzZSBhcmUgY292ZXJlZCBieQordGhpcyBMaWNlbnNlLiAgWW91IG11c3Qgc3VwcGx5IGEgY29weSBvZiB0aGlzIExpY2Vuc2UuICBJZiB0aGUgd29yaworZHVyaW5nIGV4ZWN1dGlvbiBkaXNwbGF5cyBjb3B5cmlnaHQgbm90aWNlcywgeW91IG11c3QgaW5jbHVkZSB0aGUKK2NvcHlyaWdodCBub3RpY2UgZm9yIHRoZSBMaWJyYXJ5IGFtb25nIHRoZW0sIGFzIHdlbGwgYXMgYSByZWZlcmVuY2UKK2RpcmVjdGluZyB0aGUgdXNlciB0byB0aGUgY29weSBvZiB0aGlzIExpY2Vuc2UuICBBbHNvLCB5b3UgbXVzdCBkbyBvbmUKK29mIHRoZXNlIHRoaW5nczoKKworICAgIGEpIEFjY29tcGFueSB0aGUgd29yayB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nCisgICAgbWFjaGluZS1yZWFkYWJsZSBzb3VyY2UgY29kZSBmb3IgdGhlIExpYnJhcnkgaW5jbHVkaW5nIHdoYXRldmVyCisgICAgY2hhbmdlcyB3ZXJlIHVzZWQgaW4gdGhlIHdvcmsgKHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIKKyAgICBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlKTsgYW5kLCBpZiB0aGUgd29yayBpcyBhbiBleGVjdXRhYmxlIGxpbmtlZAorICAgIHdpdGggdGhlIExpYnJhcnksIHdpdGggdGhlIGNvbXBsZXRlIG1hY2hpbmUtcmVhZGFibGUgIndvcmsgdGhhdAorICAgIHVzZXMgdGhlIExpYnJhcnkiLCBhcyBvYmplY3QgY29kZSBhbmQvb3Igc291cmNlIGNvZGUsIHNvIHRoYXQgdGhlCisgICAgdXNlciBjYW4gbW9kaWZ5IHRoZSBMaWJyYXJ5IGFuZCB0aGVuIHJlbGluayB0byBwcm9kdWNlIGEgbW9kaWZpZWQKKyAgICBleGVjdXRhYmxlIGNvbnRhaW5pbmcgdGhlIG1vZGlmaWVkIExpYnJhcnkuICAoSXQgaXMgdW5kZXJzdG9vZAorICAgIHRoYXQgdGhlIHVzZXIgd2hvIGNoYW5nZXMgdGhlIGNvbnRlbnRzIG9mIGRlZmluaXRpb25zIGZpbGVzIGluIHRoZQorICAgIExpYnJhcnkgd2lsbCBub3QgbmVjZXNzYXJpbHkgYmUgYWJsZSB0byByZWNvbXBpbGUgdGhlIGFwcGxpY2F0aW9uCisgICAgdG8gdXNlIHRoZSBtb2RpZmllZCBkZWZpbml0aW9ucy4pCisKKyAgICBiKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdAorICAgIGxlYXN0IHRocmVlIHllYXJzLCB0byBnaXZlIHRoZSBzYW1lIHVzZXIgdGhlIG1hdGVyaWFscworICAgIHNwZWNpZmllZCBpbiBTdWJzZWN0aW9uIDZhLCBhYm92ZSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUKKyAgICB0aGFuIHRoZSBjb3N0IG9mIHBlcmZvcm1pbmcgdGhpcyBkaXN0cmlidXRpb24uCisKKyAgICBjKSBJZiBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQorICAgIGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCBvZmZlciBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZSBhYm92ZQorICAgIHNwZWNpZmllZCBtYXRlcmlhbHMgZnJvbSB0aGUgc2FtZSBwbGFjZS4KKworICAgIGQpIFZlcmlmeSB0aGF0IHRoZSB1c2VyIGhhcyBhbHJlYWR5IHJlY2VpdmVkIGEgY29weSBvZiB0aGVzZQorICAgIG1hdGVyaWFscyBvciB0aGF0IHlvdSBoYXZlIGFscmVhZHkgc2VudCB0aGlzIHVzZXIgYSBjb3B5LgorCisgIEZvciBhbiBleGVjdXRhYmxlLCB0aGUgcmVxdWlyZWQgZm9ybSBvZiB0aGUgIndvcmsgdGhhdCB1c2VzIHRoZQorTGlicmFyeSIgbXVzdCBpbmNsdWRlIGFueSBkYXRhIGFuZCB1dGlsaXR5IHByb2dyYW1zIG5lZWRlZCBmb3IKK3JlcHJvZHVjaW5nIHRoZSBleGVjdXRhYmxlIGZyb20gaXQuICBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLAordGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUgYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseQorZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5IGZvcm0pIHdpdGggdGhlIG1ham9yCitjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG9uCit3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQgaXRzZWxmIGFjY29tcGFuaWVzCit0aGUgZXhlY3V0YWJsZS4KKworICBJdCBtYXkgaGFwcGVuIHRoYXQgdGhpcyByZXF1aXJlbWVudCBjb250cmFkaWN0cyB0aGUgbGljZW5zZQorcmVzdHJpY3Rpb25zIG9mIG90aGVyIHByb3ByaWV0YXJ5IGxpYnJhcmllcyB0aGF0IGRvIG5vdCBub3JtYWxseQorYWNjb21wYW55IHRoZSBvcGVyYXRpbmcgc3lzdGVtLiAgU3VjaCBhIGNvbnRyYWRpY3Rpb24gbWVhbnMgeW91IGNhbm5vdAordXNlIGJvdGggdGhlbSBhbmQgdGhlIExpYnJhcnkgdG9nZXRoZXIgaW4gYW4gZXhlY3V0YWJsZSB0aGF0IHlvdQorZGlzdHJpYnV0ZS4KKwwKKyAgNy4gWW91IG1heSBwbGFjZSBsaWJyYXJ5IGZhY2lsaXRpZXMgdGhhdCBhcmUgYSB3b3JrIGJhc2VkIG9uIHRoZQorTGlicmFyeSBzaWRlLWJ5LXNpZGUgaW4gYSBzaW5nbGUgbGlicmFyeSB0b2dldGhlciB3aXRoIG90aGVyIGxpYnJhcnkKK2ZhY2lsaXRpZXMgbm90IGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSBzdWNoIGEgY29tYmluZWQKK2xpYnJhcnksIHByb3ZpZGVkIHRoYXQgdGhlIHNlcGFyYXRlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd29yayBiYXNlZCBvbgordGhlIExpYnJhcnkgYW5kIG9mIHRoZSBvdGhlciBsaWJyYXJ5IGZhY2lsaXRpZXMgaXMgb3RoZXJ3aXNlCitwZXJtaXR0ZWQsIGFuZCBwcm92aWRlZCB0aGF0IHlvdSBkbyB0aGVzZSB0d28gdGhpbmdzOgorCisgICAgYSkgQWNjb21wYW55IHRoZSBjb21iaW5lZCBsaWJyYXJ5IHdpdGggYSBjb3B5IG9mIHRoZSBzYW1lIHdvcmsKKyAgICBiYXNlZCBvbiB0aGUgTGlicmFyeSwgdW5jb21iaW5lZCB3aXRoIGFueSBvdGhlciBsaWJyYXJ5CisgICAgZmFjaWxpdGllcy4gIFRoaXMgbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgICAgU2VjdGlvbnMgYWJvdmUuCisKKyAgICBiKSBHaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCB0aGUgY29tYmluZWQgbGlicmFyeSBvZiB0aGUgZmFjdAorICAgIHRoYXQgcGFydCBvZiBpdCBpcyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBleHBsYWluaW5nCisgICAgd2hlcmUgdG8gZmluZCB0aGUgYWNjb21wYW55aW5nIHVuY29tYmluZWQgZm9ybSBvZiB0aGUgc2FtZSB3b3JrLgorCisgIDguIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgbGluayB3aXRoLCBvciBkaXN0cmlidXRlCit0aGUgTGlicmFyeSBleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueQorYXR0ZW1wdCBvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBsaW5rIHdpdGgsIG9yCitkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGlzIHZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIKK3JpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuICBIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywKK29yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIgdGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMKK3Rlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoIHBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KKworICA5LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKK3NpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCitkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKK3Byb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKK21vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIExpYnJhcnkgKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorTGlicmFyeSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKK2FsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKK3RoZSBMaWJyYXJ5IG9yIHdvcmtzIGJhc2VkIG9uIGl0LgorCisgIDEwLiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitMaWJyYXJ5KSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQorb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSwgbGluayB3aXRoIG9yIG1vZGlmeSB0aGUgTGlicmFyeQorc3ViamVjdCB0byB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgorcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgorWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KK3RoaXMgTGljZW5zZS4KKwwKKyAgMTEuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKK2luZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCitjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCitvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CitleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAorZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcworTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQorbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAorbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeSBieQorYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCit0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCityZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5LgorCitJZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYW55CitwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gYXBwbHksCithbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlciBjaXJjdW1zdGFuY2VzLgorCitJdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55CitwYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQorc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQoraW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0gd2hpY2ggaXMKK2ltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQorZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAordGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKK3N5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKK3RvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAoraW1wb3NlIHRoYXQgY2hvaWNlLgorCitUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KK2JlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgorCisgIDEyLiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIExpYnJhcnkgaXMgcmVzdHJpY3RlZCBpbgorY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCitvcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIExpYnJhcnkgdW5kZXIgdGhpcyBMaWNlbnNlIG1heSBhZGQKK2FuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcgdGhvc2UgY291bnRyaWVzLAorc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcgY291bnRyaWVzIG5vdCB0aHVzCitleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcyB0aGUgbGltaXRhdGlvbiBhcyBpZgord3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMTMuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3Cit2ZXJzaW9ucyBvZiB0aGUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLgorU3VjaCBuZXcgdmVyc2lvbnMgd2lsbCBiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLAorYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvIGFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgorCitFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBMaWJyYXJ5CitzcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQKKyJhbnkgbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQKK2NvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgTGlicmFyeSBkb2VzIG5vdCBzcGVjaWZ5IGEKK2xpY2Vuc2UgdmVyc2lvbiBudW1iZXIsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorDAorICAxNC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIExpYnJhcnkgaW50byBvdGhlciBmcmVlCitwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgaW5jb21wYXRpYmxlIHdpdGggdGhlc2UsCit3cml0ZSB0byB0aGUgYXV0aG9yIHRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcworY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcyBtYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIKK2RlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMgb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMKK29mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQgb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nCithbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk8gV0FSUkFOVFkKKworICAxNS4gQkVDQVVTRSBUSEUgTElCUkFSWSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8KK1dBUlJBTlRZIEZPUiBUSEUgTElCUkFSWSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuCitFWENFUFQgV0hFTiBPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUgorT1RIRVIgUEFSVElFUyBQUk9WSURFIFRIRSBMSUJSQVJZICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkKK0tJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCitQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUKK0xJQlJBUlkgSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFIExJQlJBUlkgUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FCitUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgMTYuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4KK1dSSVRJTkcgV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZCitBTkQvT1IgUkVESVNUUklCVVRFIFRIRSBMSUJSQVJZIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVQorRk9SIERBTUFHRVMsIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUgorQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUKK0xJQlJBUlkgKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcKK1JFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBCitGQUlMVVJFIE9GIFRIRSBMSUJSQVJZIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIgU09GVFdBUkUpLCBFVkVOIElGCitTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICitEQU1BR0VTLgorCisgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKworICAgICAgICAgICAgICAgICAgR05VIExFU1NFUiBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4xLCBGZWJydWFyeSAxOTk5CisKKyBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCisgb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCisKK1tUaGlzIGlzIHRoZSBmaXJzdCByZWxlYXNlZCB2ZXJzaW9uIG9mIHRoZSBMZXNzZXIgR1BMLiAgSXQgYWxzbyBjb3VudHMKKyBhcyB0aGUgc3VjY2Vzc29yIG9mIHRoZSBHTlUgTGlicmFyeSBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBoZW5jZQorIHRoZSB2ZXJzaW9uIG51bWJlciAyLjEuXQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlYW1ibGUKKworICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCitmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZXMgYXJlIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZQorZnJlZSBzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLgorCisgIFRoaXMgbGljZW5zZSwgdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhcHBsaWVzIHRvIHNvbWUKK3NwZWNpYWxseSBkZXNpZ25hdGVkIHNvZnR3YXJlIHBhY2thZ2VzLS10eXBpY2FsbHkgbGlicmFyaWVzLS1vZiB0aGUKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgb3RoZXIgYXV0aG9ycyB3aG8gZGVjaWRlIHRvIHVzZSBpdC4gIFlvdQorY2FuIHVzZSBpdCB0b28sIGJ1dCB3ZSBzdWdnZXN0IHlvdSBmaXJzdCB0aGluayBjYXJlZnVsbHkgYWJvdXQgd2hldGhlcgordGhpcyBsaWNlbnNlIG9yIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIHRoZSBiZXR0ZXIKK3N0cmF0ZWd5IHRvIHVzZSBpbiBhbnkgcGFydGljdWxhciBjYXNlLCBiYXNlZCBvbiB0aGUgZXhwbGFuYXRpb25zIGJlbG93LgorCisgIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tIG9mIHVzZSwKK25vdCBwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQKK3lvdSBoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UKK2ZvciB0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpOyB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQKK2l0IGlmIHlvdSB3YW50IGl0OyB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBhbmQgdXNlIHBpZWNlcyBvZgoraXQgaW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBhcmUgaW5mb3JtZWQgdGhhdCB5b3UgY2FuIGRvCit0aGVzZSB0aGluZ3MuCisKKyAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAorZGlzdHJpYnV0b3JzIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGVzZQorcmlnaHRzLiAgVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yCit5b3UgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBsaWJyYXJ5IG9yIGlmIHlvdSBtb2RpZnkgaXQuCisKKyAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSwgd2hldGhlciBncmF0aXMKK29yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0IHdlIGdhdmUKK3lvdS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZSBzb3VyY2UKK2NvZGUuICBJZiB5b3UgbGluayBvdGhlciBjb2RlIHdpdGggdGhlIGxpYnJhcnksIHlvdSBtdXN0IHByb3ZpZGUKK2NvbXBsZXRlIG9iamVjdCBmaWxlcyB0byB0aGUgcmVjaXBpZW50cywgc28gdGhhdCB0aGV5IGNhbiByZWxpbmsgdGhlbQord2l0aCB0aGUgbGlicmFyeSBhZnRlciBtYWtpbmcgY2hhbmdlcyB0byB0aGUgbGlicmFyeSBhbmQgcmVjb21waWxpbmcKK2l0LiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIgcmlnaHRzLgorCisgIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCBhIHR3by1zdGVwIG1ldGhvZDogKDEpIHdlIGNvcHlyaWdodCB0aGUKK2xpYnJhcnksIGFuZCAoMikgd2Ugb2ZmZXIgeW91IHRoaXMgbGljZW5zZSwgd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsCitwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgbGlicmFyeS4KKworICBUbyBwcm90ZWN0IGVhY2ggZGlzdHJpYnV0b3IsIHdlIHdhbnQgdG8gbWFrZSBpdCB2ZXJ5IGNsZWFyIHRoYXQKK3RoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGUgZnJlZSBsaWJyYXJ5LiAgQWxzbywgaWYgdGhlIGxpYnJhcnkgaXMKK21vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB0aGUgcmVjaXBpZW50cyBzaG91bGQga25vdwordGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsIHZlcnNpb24sIHNvIHRoYXQgdGhlIG9yaWdpbmFsCithdXRob3IncyByZXB1dGF0aW9uIHdpbGwgbm90IGJlIGFmZmVjdGVkIGJ5IHByb2JsZW1zIHRoYXQgbWlnaHQgYmUKK2ludHJvZHVjZWQgYnkgb3RoZXJzLgorDAorICBGaW5hbGx5LCBzb2Z0d2FyZSBwYXRlbnRzIHBvc2UgYSBjb25zdGFudCB0aHJlYXQgdG8gdGhlIGV4aXN0ZW5jZSBvZgorYW55IGZyZWUgcHJvZ3JhbS4gIFdlIHdpc2ggdG8gbWFrZSBzdXJlIHRoYXQgYSBjb21wYW55IGNhbm5vdAorZWZmZWN0aXZlbHkgcmVzdHJpY3QgdGhlIHVzZXJzIG9mIGEgZnJlZSBwcm9ncmFtIGJ5IG9idGFpbmluZyBhCityZXN0cmljdGl2ZSBsaWNlbnNlIGZyb20gYSBwYXRlbnQgaG9sZGVyLiAgVGhlcmVmb3JlLCB3ZSBpbnNpc3QgdGhhdAorYW55IHBhdGVudCBsaWNlbnNlIG9idGFpbmVkIGZvciBhIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgbXVzdCBiZQorY29uc2lzdGVudCB3aXRoIHRoZSBmdWxsIGZyZWVkb20gb2YgdXNlIHNwZWNpZmllZCBpbiB0aGlzIGxpY2Vuc2UuCisKKyAgTW9zdCBHTlUgc29mdHdhcmUsIGluY2x1ZGluZyBzb21lIGxpYnJhcmllcywgaXMgY292ZXJlZCBieSB0aGUKK29yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhpcyBsaWNlbnNlLCB0aGUgR05VIExlc3NlcgorR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBjZXJ0YWluIGRlc2lnbmF0ZWQgbGlicmFyaWVzLCBhbmQKK2lzIHF1aXRlIGRpZmZlcmVudCBmcm9tIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgV2UgdXNlCit0aGlzIGxpY2Vuc2UgZm9yIGNlcnRhaW4gbGlicmFyaWVzIGluIG9yZGVyIHRvIHBlcm1pdCBsaW5raW5nIHRob3NlCitsaWJyYXJpZXMgaW50byBub24tZnJlZSBwcm9ncmFtcy4KKworICBXaGVuIGEgcHJvZ3JhbSBpcyBsaW5rZWQgd2l0aCBhIGxpYnJhcnksIHdoZXRoZXIgc3RhdGljYWxseSBvciB1c2luZworYSBzaGFyZWQgbGlicmFyeSwgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSB0d28gaXMgbGVnYWxseSBzcGVha2luZyBhCitjb21iaW5lZCB3b3JrLCBhIGRlcml2YXRpdmUgb2YgdGhlIG9yaWdpbmFsIGxpYnJhcnkuICBUaGUgb3JkaW5hcnkKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgdGhlcmVmb3JlIHBlcm1pdHMgc3VjaCBsaW5raW5nIG9ubHkgaWYgdGhlCitlbnRpcmUgY29tYmluYXRpb24gZml0cyBpdHMgY3JpdGVyaWEgb2YgZnJlZWRvbS4gIFRoZSBMZXNzZXIgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgcGVybWl0cyBtb3JlIGxheCBjcml0ZXJpYSBmb3IgbGlua2luZyBvdGhlciBjb2RlIHdpdGgKK3RoZSBsaWJyYXJ5LgorCisgIFdlIGNhbGwgdGhpcyBsaWNlbnNlIHRoZSAiTGVzc2VyIiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGJlY2F1c2UgaXQKK2RvZXMgTGVzcyB0byBwcm90ZWN0IHRoZSB1c2VyJ3MgZnJlZWRvbSB0aGFuIHRoZSBvcmRpbmFyeSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZS4gIEl0IGFsc28gcHJvdmlkZXMgb3RoZXIgZnJlZSBzb2Z0d2FyZSBkZXZlbG9wZXJzIExlc3MKK29mIGFuIGFkdmFudGFnZSBvdmVyIGNvbXBldGluZyBub24tZnJlZSBwcm9ncmFtcy4gIFRoZXNlIGRpc2FkdmFudGFnZXMKK2FyZSB0aGUgcmVhc29uIHdlIHVzZSB0aGUgb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbWFueQorbGlicmFyaWVzLiAgSG93ZXZlciwgdGhlIExlc3NlciBsaWNlbnNlIHByb3ZpZGVzIGFkdmFudGFnZXMgaW4gY2VydGFpbgorc3BlY2lhbCBjaXJjdW1zdGFuY2VzLgorCisgIEZvciBleGFtcGxlLCBvbiByYXJlIG9jY2FzaW9ucywgdGhlcmUgbWF5IGJlIGEgc3BlY2lhbCBuZWVkIHRvCitlbmNvdXJhZ2UgdGhlIHdpZGVzdCBwb3NzaWJsZSB1c2Ugb2YgYSBjZXJ0YWluIGxpYnJhcnksIHNvIHRoYXQgaXQgYmVjb21lcworYSBkZS1mYWN0byBzdGFuZGFyZC4gIFRvIGFjaGlldmUgdGhpcywgbm9uLWZyZWUgcHJvZ3JhbXMgbXVzdCBiZQorYWxsb3dlZCB0byB1c2UgdGhlIGxpYnJhcnkuICBBIG1vcmUgZnJlcXVlbnQgY2FzZSBpcyB0aGF0IGEgZnJlZQorbGlicmFyeSBkb2VzIHRoZSBzYW1lIGpvYiBhcyB3aWRlbHkgdXNlZCBub24tZnJlZSBsaWJyYXJpZXMuICBJbiB0aGlzCitjYXNlLCB0aGVyZSBpcyBsaXR0bGUgdG8gZ2FpbiBieSBsaW1pdGluZyB0aGUgZnJlZSBsaWJyYXJ5IHRvIGZyZWUKK3NvZnR3YXJlIG9ubHksIHNvIHdlIHVzZSB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisKKyAgSW4gb3RoZXIgY2FzZXMsIHBlcm1pc3Npb24gdG8gdXNlIGEgcGFydGljdWxhciBsaWJyYXJ5IGluIG5vbi1mcmVlCitwcm9ncmFtcyBlbmFibGVzIGEgZ3JlYXRlciBudW1iZXIgb2YgcGVvcGxlIHRvIHVzZSBhIGxhcmdlIGJvZHkgb2YKK2ZyZWUgc29mdHdhcmUuICBGb3IgZXhhbXBsZSwgcGVybWlzc2lvbiB0byB1c2UgdGhlIEdOVSBDIExpYnJhcnkgaW4KK25vbi1mcmVlIHByb2dyYW1zIGVuYWJsZXMgbWFueSBtb3JlIHBlb3BsZSB0byB1c2UgdGhlIHdob2xlIEdOVQorb3BlcmF0aW5nIHN5c3RlbSwgYXMgd2VsbCBhcyBpdHMgdmFyaWFudCwgdGhlIEdOVS9MaW51eCBvcGVyYXRpbmcKK3N5c3RlbS4KKworICBBbHRob3VnaCB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgTGVzcyBwcm90ZWN0aXZlIG9mIHRoZQordXNlcnMnIGZyZWVkb20sIGl0IGRvZXMgZW5zdXJlIHRoYXQgdGhlIHVzZXIgb2YgYSBwcm9ncmFtIHRoYXQgaXMKK2xpbmtlZCB3aXRoIHRoZSBMaWJyYXJ5IGhhcyB0aGUgZnJlZWRvbSBhbmQgdGhlIHdoZXJld2l0aGFsIHRvIHJ1bgordGhhdCBwcm9ncmFtIHVzaW5nIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgTGlicmFyeS4KKworICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4gIFBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhCisid29yayBiYXNlZCBvbiB0aGUgbGlicmFyeSIgYW5kIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBsaWJyYXJ5Ii4gIFRoZQorZm9ybWVyIGNvbnRhaW5zIGNvZGUgZGVyaXZlZCBmcm9tIHRoZSBsaWJyYXJ5LCB3aGVyZWFzIHRoZSBsYXR0ZXIgbXVzdAorYmUgY29tYmluZWQgd2l0aCB0aGUgbGlicmFyeSBpbiBvcmRlciB0byBydW4uCisMCisgICAgICAgICAgICAgICAgICBHTlUgTEVTU0VSIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgorCisgIDAuIFRoaXMgTGljZW5zZSBBZ3JlZW1lbnQgYXBwbGllcyB0byBhbnkgc29mdHdhcmUgbGlicmFyeSBvciBvdGhlcgorcHJvZ3JhbSB3aGljaCBjb250YWlucyBhIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgb3IKK290aGVyIGF1dGhvcml6ZWQgcGFydHkgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YKK3RoaXMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKGFsc28gY2FsbGVkICJ0aGlzIExpY2Vuc2UiKS4KK0VhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgorCisgIEEgImxpYnJhcnkiIG1lYW5zIGEgY29sbGVjdGlvbiBvZiBzb2Z0d2FyZSBmdW5jdGlvbnMgYW5kL29yIGRhdGEKK3ByZXBhcmVkIHNvIGFzIHRvIGJlIGNvbnZlbmllbnRseSBsaW5rZWQgd2l0aCBhcHBsaWNhdGlvbiBwcm9ncmFtcworKHdoaWNoIHVzZSBzb21lIG9mIHRob3NlIGZ1bmN0aW9ucyBhbmQgZGF0YSkgdG8gZm9ybSBleGVjdXRhYmxlcy4KKworICBUaGUgIkxpYnJhcnkiLCBiZWxvdywgcmVmZXJzIHRvIGFueSBzdWNoIHNvZnR3YXJlIGxpYnJhcnkgb3Igd29yaword2hpY2ggaGFzIGJlZW4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlc2UgdGVybXMuICBBICJ3b3JrIGJhc2VkIG9uIHRoZQorTGlicmFyeSIgbWVhbnMgZWl0aGVyIHRoZSBMaWJyYXJ5IG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIKK2NvcHlyaWdodCBsYXc6IHRoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgTGlicmFyeSBvciBhCitwb3J0aW9uIG9mIGl0LCBlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkCitzdHJhaWdodGZvcndhcmRseSBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzCitpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4gdGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKQorCisgICJTb3VyY2UgY29kZSIgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCittYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhIGxpYnJhcnksIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG1lYW5zCithbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkgYXNzb2NpYXRlZAoraW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0byBjb250cm9sIGNvbXBpbGF0aW9uCithbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBsaWJyYXJ5LgorCisgIEFjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Citjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCitydW5uaW5nIGEgcHJvZ3JhbSB1c2luZyB0aGUgTGlicmFyeSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIG91dHB1dCBmcm9tCitzdWNoIGEgcHJvZ3JhbSBpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkCitvbiB0aGUgTGlicmFyeSAoaW5kZXBlbmRlbnQgb2YgdGhlIHVzZSBvZiB0aGUgTGlicmFyeSBpbiBhIHRvb2wgZm9yCit3cml0aW5nIGl0KS4gIFdoZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgTGlicmFyeSBkb2VzCithbmQgd2hhdCB0aGUgcHJvZ3JhbSB0aGF0IHVzZXMgdGhlIExpYnJhcnkgZG9lcy4KKworICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBMaWJyYXJ5J3MKK2NvbXBsZXRlIHNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0Cit5b3UgY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbgorYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QKK2FsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55Cit3YXJyYW50eTsgYW5kIGRpc3RyaWJ1dGUgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZQorTGlicmFyeS4KKworICBZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LAorYW5kIHlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYQorZmVlLgorDAorICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBMaWJyYXJ5IG9yIGFueSBwb3J0aW9uCitvZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgYW5kIGNvcHkgYW5kCitkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKK2Fib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CisKKyAgICBhKSBUaGUgbW9kaWZpZWQgd29yayBtdXN0IGl0c2VsZiBiZSBhIHNvZnR3YXJlIGxpYnJhcnkuCisKKyAgICBiKSBZb3UgbXVzdCBjYXVzZSB0aGUgZmlsZXMgbW9kaWZpZWQgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgorCisgICAgYykgWW91IG11c3QgY2F1c2UgdGhlIHdob2xlIG9mIHRoZSB3b3JrIHRvIGJlIGxpY2Vuc2VkIGF0IG5vCisgICAgY2hhcmdlIHRvIGFsbCB0aGlyZCBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgICBkKSBJZiBhIGZhY2lsaXR5IGluIHRoZSBtb2RpZmllZCBMaWJyYXJ5IHJlZmVycyB0byBhIGZ1bmN0aW9uIG9yIGEKKyAgICB0YWJsZSBvZiBkYXRhIHRvIGJlIHN1cHBsaWVkIGJ5IGFuIGFwcGxpY2F0aW9uIHByb2dyYW0gdGhhdCB1c2VzCisgICAgdGhlIGZhY2lsaXR5LCBvdGhlciB0aGFuIGFzIGFuIGFyZ3VtZW50IHBhc3NlZCB3aGVuIHRoZSBmYWNpbGl0eQorICAgIGlzIGludm9rZWQsIHRoZW4geW91IG11c3QgbWFrZSBhIGdvb2QgZmFpdGggZWZmb3J0IHRvIGVuc3VyZSB0aGF0LAorICAgIGluIHRoZSBldmVudCBhbiBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgc3VjaCBmdW5jdGlvbiBvcgorICAgIHRhYmxlLCB0aGUgZmFjaWxpdHkgc3RpbGwgb3BlcmF0ZXMsIGFuZCBwZXJmb3JtcyB3aGF0ZXZlciBwYXJ0IG9mCisgICAgaXRzIHB1cnBvc2UgcmVtYWlucyBtZWFuaW5nZnVsLgorCisgICAgKEZvciBleGFtcGxlLCBhIGZ1bmN0aW9uIGluIGEgbGlicmFyeSB0byBjb21wdXRlIHNxdWFyZSByb290cyBoYXMKKyAgICBhIHB1cnBvc2UgdGhhdCBpcyBlbnRpcmVseSB3ZWxsLWRlZmluZWQgaW5kZXBlbmRlbnQgb2YgdGhlCisgICAgYXBwbGljYXRpb24uICBUaGVyZWZvcmUsIFN1YnNlY3Rpb24gMmQgcmVxdWlyZXMgdGhhdCBhbnkKKyAgICBhcHBsaWNhdGlvbi1zdXBwbGllZCBmdW5jdGlvbiBvciB0YWJsZSB1c2VkIGJ5IHRoaXMgZnVuY3Rpb24gbXVzdAorICAgIGJlIG9wdGlvbmFsOiBpZiB0aGUgYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IGl0LCB0aGUgc3F1YXJlCisgICAgcm9vdCBmdW5jdGlvbiBtdXN0IHN0aWxsIGNvbXB1dGUgc3F1YXJlIHJvb3RzLikKKworVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgoraWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgTGlicmFyeSwKK2FuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgordGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQorc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91CitkaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKK29uIHRoZSBMaWJyYXJ5LCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgordGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKK2VudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZQoraXQuCisKK1RodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoreW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCitleGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKK2NvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIExpYnJhcnkuCisKK0luIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIExpYnJhcnkKK3dpdGggdGhlIExpYnJhcnkgKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5KSBvbiBhIHZvbHVtZSBvZgorYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKK3RoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMy4gWW91IG1heSBvcHQgdG8gYXBwbHkgdGhlIHRlcm1zIG9mIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UgdG8gYSBnaXZlbiBjb3B5IG9mIHRoZSBMaWJyYXJ5LiAgVG8gZG8KK3RoaXMsIHlvdSBtdXN0IGFsdGVyIGFsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSwgc28KK3RoYXQgdGhleSByZWZlciB0byB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwKK2luc3RlYWQgb2YgdG8gdGhpcyBMaWNlbnNlLiAgKElmIGEgbmV3ZXIgdmVyc2lvbiB0aGFuIHZlcnNpb24gMiBvZiB0aGUKK29yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGhhcyBhcHBlYXJlZCwgdGhlbiB5b3UgY2FuIHNwZWNpZnkKK3RoYXQgdmVyc2lvbiBpbnN0ZWFkIGlmIHlvdSB3aXNoLikgIERvIG5vdCBtYWtlIGFueSBvdGhlciBjaGFuZ2UgaW4KK3RoZXNlIG5vdGljZXMuCisMCisgIE9uY2UgdGhpcyBjaGFuZ2UgaXMgbWFkZSBpbiBhIGdpdmVuIGNvcHksIGl0IGlzIGlycmV2ZXJzaWJsZSBmb3IKK3RoYXQgY29weSwgc28gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gYWxsCitzdWJzZXF1ZW50IGNvcGllcyBhbmQgZGVyaXZhdGl2ZSB3b3JrcyBtYWRlIGZyb20gdGhhdCBjb3B5LgorCisgIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSB3aXNoIHRvIGNvcHkgcGFydCBvZiB0aGUgY29kZSBvZgordGhlIExpYnJhcnkgaW50byBhIHByb2dyYW0gdGhhdCBpcyBub3QgYSBsaWJyYXJ5LgorCisgIDQuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYSBwb3J0aW9uIG9yCitkZXJpdmF0aXZlIG9mIGl0LCB1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybQordW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWNjb21wYW55CitpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUsIHdoaWNoCittdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEKK21lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZS4KKworICBJZiBkaXN0cmlidXRpb24gb2Ygb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQorZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUKK3NvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2Ugc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudCB0bworZGlzdHJpYnV0ZSB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAorY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KKworICA1LiBBIHByb2dyYW0gdGhhdCBjb250YWlucyBubyBkZXJpdmF0aXZlIG9mIGFueSBwb3J0aW9uIG9mIHRoZQorTGlicmFyeSwgYnV0IGlzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCB0aGUgTGlicmFyeSBieSBiZWluZyBjb21waWxlZCBvcgorbGlua2VkIHdpdGggaXQsIGlzIGNhbGxlZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIuICBTdWNoIGEKK3dvcmssIGluIGlzb2xhdGlvbiwgaXMgbm90IGEgZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5LCBhbmQKK3RoZXJlZm9yZSBmYWxscyBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgSG93ZXZlciwgbGlua2luZyBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeQorY3JlYXRlcyBhbiBleGVjdXRhYmxlIHRoYXQgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBMaWJyYXJ5IChiZWNhdXNlIGl0Citjb250YWlucyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSksIHJhdGhlciB0aGFuIGEgIndvcmsgdGhhdCB1c2VzIHRoZQorbGlicmFyeSIuICBUaGUgZXhlY3V0YWJsZSBpcyB0aGVyZWZvcmUgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UuCitTZWN0aW9uIDYgc3RhdGVzIHRlcm1zIGZvciBkaXN0cmlidXRpb24gb2Ygc3VjaCBleGVjdXRhYmxlcy4KKworICBXaGVuIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB1c2VzIG1hdGVyaWFsIGZyb20gYSBoZWFkZXIgZmlsZQordGhhdCBpcyBwYXJ0IG9mIHRoZSBMaWJyYXJ5LCB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIG1heSBiZSBhCitkZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnkgZXZlbiB0aG91Z2ggdGhlIHNvdXJjZSBjb2RlIGlzIG5vdC4KK1doZXRoZXIgdGhpcyBpcyB0cnVlIGlzIGVzcGVjaWFsbHkgc2lnbmlmaWNhbnQgaWYgdGhlIHdvcmsgY2FuIGJlCitsaW5rZWQgd2l0aG91dCB0aGUgTGlicmFyeSwgb3IgaWYgdGhlIHdvcmsgaXMgaXRzZWxmIGEgbGlicmFyeS4gIFRoZQordGhyZXNob2xkIGZvciB0aGlzIHRvIGJlIHRydWUgaXMgbm90IHByZWNpc2VseSBkZWZpbmVkIGJ5IGxhdy4KKworICBJZiBzdWNoIGFuIG9iamVjdCBmaWxlIHVzZXMgb25seSBudW1lcmljYWwgcGFyYW1ldGVycywgZGF0YQorc3RydWN0dXJlIGxheW91dHMgYW5kIGFjY2Vzc29ycywgYW5kIHNtYWxsIG1hY3JvcyBhbmQgc21hbGwgaW5saW5lCitmdW5jdGlvbnMgKHRlbiBsaW5lcyBvciBsZXNzIGluIGxlbmd0aCksIHRoZW4gdGhlIHVzZSBvZiB0aGUgb2JqZWN0CitmaWxlIGlzIHVucmVzdHJpY3RlZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGlzIGxlZ2FsbHkgYSBkZXJpdmF0aXZlCit3b3JrLiAgKEV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhpcyBvYmplY3QgY29kZSBwbHVzIHBvcnRpb25zIG9mIHRoZQorTGlicmFyeSB3aWxsIHN0aWxsIGZhbGwgdW5kZXIgU2VjdGlvbiA2LikKKworICBPdGhlcndpc2UsIGlmIHRoZSB3b3JrIGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSwgeW91IG1heQorZGlzdHJpYnV0ZSB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDYuCitBbnkgZXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGF0IHdvcmsgYWxzbyBmYWxsIHVuZGVyIFNlY3Rpb24gNiwKK3doZXRoZXIgb3Igbm90IHRoZXkgYXJlIGxpbmtlZCBkaXJlY3RseSB3aXRoIHRoZSBMaWJyYXJ5IGl0c2VsZi4KKwwKKyAgNi4gQXMgYW4gZXhjZXB0aW9uIHRvIHRoZSBTZWN0aW9ucyBhYm92ZSwgeW91IG1heSBhbHNvIGNvbWJpbmUgb3IKK2xpbmsgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkgdG8gcHJvZHVjZSBhCit3b3JrIGNvbnRhaW5pbmcgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnksIGFuZCBkaXN0cmlidXRlIHRoYXQgd29yawordW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgdGhlIHRlcm1zIHBlcm1pdAorbW9kaWZpY2F0aW9uIG9mIHRoZSB3b3JrIGZvciB0aGUgY3VzdG9tZXIncyBvd24gdXNlIGFuZCByZXZlcnNlCitlbmdpbmVlcmluZyBmb3IgZGVidWdnaW5nIHN1Y2ggbW9kaWZpY2F0aW9ucy4KKworICBZb3UgbXVzdCBnaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCBlYWNoIGNvcHkgb2YgdGhlIHdvcmsgdGhhdCB0aGUKK0xpYnJhcnkgaXMgdXNlZCBpbiBpdCBhbmQgdGhhdCB0aGUgTGlicmFyeSBhbmQgaXRzIHVzZSBhcmUgY292ZXJlZCBieQordGhpcyBMaWNlbnNlLiAgWW91IG11c3Qgc3VwcGx5IGEgY29weSBvZiB0aGlzIExpY2Vuc2UuICBJZiB0aGUgd29yaworZHVyaW5nIGV4ZWN1dGlvbiBkaXNwbGF5cyBjb3B5cmlnaHQgbm90aWNlcywgeW91IG11c3QgaW5jbHVkZSB0aGUKK2NvcHlyaWdodCBub3RpY2UgZm9yIHRoZSBMaWJyYXJ5IGFtb25nIHRoZW0sIGFzIHdlbGwgYXMgYSByZWZlcmVuY2UKK2RpcmVjdGluZyB0aGUgdXNlciB0byB0aGUgY29weSBvZiB0aGlzIExpY2Vuc2UuICBBbHNvLCB5b3UgbXVzdCBkbyBvbmUKK29mIHRoZXNlIHRoaW5nczoKKworICAgIGEpIEFjY29tcGFueSB0aGUgd29yayB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nCisgICAgbWFjaGluZS1yZWFkYWJsZSBzb3VyY2UgY29kZSBmb3IgdGhlIExpYnJhcnkgaW5jbHVkaW5nIHdoYXRldmVyCisgICAgY2hhbmdlcyB3ZXJlIHVzZWQgaW4gdGhlIHdvcmsgKHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIKKyAgICBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlKTsgYW5kLCBpZiB0aGUgd29yayBpcyBhbiBleGVjdXRhYmxlIGxpbmtlZAorICAgIHdpdGggdGhlIExpYnJhcnksIHdpdGggdGhlIGNvbXBsZXRlIG1hY2hpbmUtcmVhZGFibGUgIndvcmsgdGhhdAorICAgIHVzZXMgdGhlIExpYnJhcnkiLCBhcyBvYmplY3QgY29kZSBhbmQvb3Igc291cmNlIGNvZGUsIHNvIHRoYXQgdGhlCisgICAgdXNlciBjYW4gbW9kaWZ5IHRoZSBMaWJyYXJ5IGFuZCB0aGVuIHJlbGluayB0byBwcm9kdWNlIGEgbW9kaWZpZWQKKyAgICBleGVjdXRhYmxlIGNvbnRhaW5pbmcgdGhlIG1vZGlmaWVkIExpYnJhcnkuICAoSXQgaXMgdW5kZXJzdG9vZAorICAgIHRoYXQgdGhlIHVzZXIgd2hvIGNoYW5nZXMgdGhlIGNvbnRlbnRzIG9mIGRlZmluaXRpb25zIGZpbGVzIGluIHRoZQorICAgIExpYnJhcnkgd2lsbCBub3QgbmVjZXNzYXJpbHkgYmUgYWJsZSB0byByZWNvbXBpbGUgdGhlIGFwcGxpY2F0aW9uCisgICAgdG8gdXNlIHRoZSBtb2RpZmllZCBkZWZpbml0aW9ucy4pCisKKyAgICBiKSBVc2UgYSBzdWl0YWJsZSBzaGFyZWQgbGlicmFyeSBtZWNoYW5pc20gZm9yIGxpbmtpbmcgd2l0aCB0aGUKKyAgICBMaWJyYXJ5LiAgQSBzdWl0YWJsZSBtZWNoYW5pc20gaXMgb25lIHRoYXQgKDEpIHVzZXMgYXQgcnVuIHRpbWUgYQorICAgIGNvcHkgb2YgdGhlIGxpYnJhcnkgYWxyZWFkeSBwcmVzZW50IG9uIHRoZSB1c2VyJ3MgY29tcHV0ZXIgc3lzdGVtLAorICAgIHJhdGhlciB0aGFuIGNvcHlpbmcgbGlicmFyeSBmdW5jdGlvbnMgaW50byB0aGUgZXhlY3V0YWJsZSwgYW5kICgyKQorICAgIHdpbGwgb3BlcmF0ZSBwcm9wZXJseSB3aXRoIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgaWYKKyAgICB0aGUgdXNlciBpbnN0YWxscyBvbmUsIGFzIGxvbmcgYXMgdGhlIG1vZGlmaWVkIHZlcnNpb24gaXMKKyAgICBpbnRlcmZhY2UtY29tcGF0aWJsZSB3aXRoIHRoZSB2ZXJzaW9uIHRoYXQgdGhlIHdvcmsgd2FzIG1hZGUgd2l0aC4KKworICAgIGMpIEFjY29tcGFueSB0aGUgd29yayB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0CisgICAgbGVhc3QgdGhyZWUgeWVhcnMsIHRvIGdpdmUgdGhlIHNhbWUgdXNlciB0aGUgbWF0ZXJpYWxzCisgICAgc3BlY2lmaWVkIGluIFN1YnNlY3Rpb24gNmEsIGFib3ZlLCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZQorICAgIHRoYW4gdGhlIGNvc3Qgb2YgcGVyZm9ybWluZyB0aGlzIGRpc3RyaWJ1dGlvbi4KKworICAgIGQpIElmIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd29yayBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcyB0byBjb3B5CisgICAgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIG9mZmVyIGVxdWl2YWxlbnQgYWNjZXNzIHRvIGNvcHkgdGhlIGFib3ZlCisgICAgc3BlY2lmaWVkIG1hdGVyaWFscyBmcm9tIHRoZSBzYW1lIHBsYWNlLgorCisgICAgZSkgVmVyaWZ5IHRoYXQgdGhlIHVzZXIgaGFzIGFscmVhZHkgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZXNlCisgICAgbWF0ZXJpYWxzIG9yIHRoYXQgeW91IGhhdmUgYWxyZWFkeSBzZW50IHRoaXMgdXNlciBhIGNvcHkuCisKKyAgRm9yIGFuIGV4ZWN1dGFibGUsIHRoZSByZXF1aXJlZCBmb3JtIG9mIHRoZSAid29yayB0aGF0IHVzZXMgdGhlCitMaWJyYXJ5IiBtdXN0IGluY2x1ZGUgYW55IGRhdGEgYW5kIHV0aWxpdHkgcHJvZ3JhbXMgbmVlZGVkIGZvcgorcmVwcm9kdWNpbmcgdGhlIGV4ZWN1dGFibGUgZnJvbSBpdC4gIEhvd2V2ZXIsIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sCit0aGUgbWF0ZXJpYWxzIHRvIGJlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUgYW55dGhpbmcgdGhhdCBpcworbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5IGZvcm0pIHdpdGggdGhlIG1ham9yCitjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG9uCit3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQgaXRzZWxmIGFjY29tcGFuaWVzCit0aGUgZXhlY3V0YWJsZS4KKworICBJdCBtYXkgaGFwcGVuIHRoYXQgdGhpcyByZXF1aXJlbWVudCBjb250cmFkaWN0cyB0aGUgbGljZW5zZQorcmVzdHJpY3Rpb25zIG9mIG90aGVyIHByb3ByaWV0YXJ5IGxpYnJhcmllcyB0aGF0IGRvIG5vdCBub3JtYWxseQorYWNjb21wYW55IHRoZSBvcGVyYXRpbmcgc3lzdGVtLiAgU3VjaCBhIGNvbnRyYWRpY3Rpb24gbWVhbnMgeW91IGNhbm5vdAordXNlIGJvdGggdGhlbSBhbmQgdGhlIExpYnJhcnkgdG9nZXRoZXIgaW4gYW4gZXhlY3V0YWJsZSB0aGF0IHlvdQorZGlzdHJpYnV0ZS4KKwwKKyAgNy4gWW91IG1heSBwbGFjZSBsaWJyYXJ5IGZhY2lsaXRpZXMgdGhhdCBhcmUgYSB3b3JrIGJhc2VkIG9uIHRoZQorTGlicmFyeSBzaWRlLWJ5LXNpZGUgaW4gYSBzaW5nbGUgbGlicmFyeSB0b2dldGhlciB3aXRoIG90aGVyIGxpYnJhcnkKK2ZhY2lsaXRpZXMgbm90IGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSBzdWNoIGEgY29tYmluZWQKK2xpYnJhcnksIHByb3ZpZGVkIHRoYXQgdGhlIHNlcGFyYXRlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd29yayBiYXNlZCBvbgordGhlIExpYnJhcnkgYW5kIG9mIHRoZSBvdGhlciBsaWJyYXJ5IGZhY2lsaXRpZXMgaXMgb3RoZXJ3aXNlCitwZXJtaXR0ZWQsIGFuZCBwcm92aWRlZCB0aGF0IHlvdSBkbyB0aGVzZSB0d28gdGhpbmdzOgorCisgICAgYSkgQWNjb21wYW55IHRoZSBjb21iaW5lZCBsaWJyYXJ5IHdpdGggYSBjb3B5IG9mIHRoZSBzYW1lIHdvcmsKKyAgICBiYXNlZCBvbiB0aGUgTGlicmFyeSwgdW5jb21iaW5lZCB3aXRoIGFueSBvdGhlciBsaWJyYXJ5CisgICAgZmFjaWxpdGllcy4gIFRoaXMgbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgICAgU2VjdGlvbnMgYWJvdmUuCisKKyAgICBiKSBHaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCB0aGUgY29tYmluZWQgbGlicmFyeSBvZiB0aGUgZmFjdAorICAgIHRoYXQgcGFydCBvZiBpdCBpcyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBleHBsYWluaW5nCisgICAgd2hlcmUgdG8gZmluZCB0aGUgYWNjb21wYW55aW5nIHVuY29tYmluZWQgZm9ybSBvZiB0aGUgc2FtZSB3b3JrLgorCisgIDguIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgbGluayB3aXRoLCBvciBkaXN0cmlidXRlCit0aGUgTGlicmFyeSBleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueQorYXR0ZW1wdCBvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBsaW5rIHdpdGgsIG9yCitkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGlzIHZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIKK3JpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuICBIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywKK29yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIgdGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMKK3Rlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoIHBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KKworICA5LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKK3NpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCitkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKK3Byb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKK21vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIExpYnJhcnkgKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorTGlicmFyeSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKK2FsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKK3RoZSBMaWJyYXJ5IG9yIHdvcmtzIGJhc2VkIG9uIGl0LgorCisgIDEwLiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitMaWJyYXJ5KSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQorb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSwgbGluayB3aXRoIG9yIG1vZGlmeSB0aGUgTGlicmFyeQorc3ViamVjdCB0byB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgorcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgorWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgd2l0aAordGhpcyBMaWNlbnNlLgorDAorICAxMS4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAoraW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKK2NvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKK290aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKK2V4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90CitkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCitMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91CittYXkgbm90IGRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50CitsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5IGJ5CithbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KK3RoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KK3JlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIExpYnJhcnkuCisKK0lmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhbnkKK3BhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBhcHBseSwKK2FuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyIGNpcmN1bXN0YW5jZXMuCisKK0l0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKK3BhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55CitzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCitpbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSB3aGljaCBpcworaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCitnZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCit0aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAorc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwordG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90CitpbXBvc2UgdGhhdCBjaG9pY2UuCisKK1RoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bworYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMTIuIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgTGlicmFyeSBpcyByZXN0cmljdGVkIGluCitjZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKK29yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgTGlicmFyeSB1bmRlciB0aGlzIExpY2Vuc2UgbWF5IGFkZAorYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZyB0aG9zZSBjb3VudHJpZXMsCitzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZyBjb3VudHJpZXMgbm90IHRodXMKK2V4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzIHRoZSBsaW1pdGF0aW9uIGFzIGlmCit3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KKworICAxMy4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcKK3ZlcnNpb25zIG9mIHRoZSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4KK1N1Y2ggbmV3IHZlcnNpb25zIHdpbGwgYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwKK2J1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0byBhZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgTGlicmFyeQorc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kCisiYW55IGxhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kCitjb25kaXRpb25zIGVpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIExpYnJhcnkgZG9lcyBub3Qgc3BlY2lmeSBhCitsaWNlbnNlIHZlcnNpb24gbnVtYmVyLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKwwKKyAgMTQuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBMaWJyYXJ5IGludG8gb3RoZXIgZnJlZQorcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGluY29tcGF0aWJsZSB3aXRoIHRoZXNlLAord3JpdGUgdG8gdGhlIGF1dGhvciB0byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMKK2NvcHlyaWdodGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMgbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyCitkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzIG9mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzCitvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kIG9mIHByb21vdGluZyB0aGUgc2hhcmluZworYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PIFdBUlJBTlRZCisKKyAgMTUuIEJFQ0FVU0UgVEhFIExJQlJBUlkgSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PCitXQVJSQU5UWSBGT1IgVEhFIExJQlJBUlksIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLgorRVhDRVBUIFdIRU4gT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IKK09USEVSIFBBUlRJRVMgUFJPVklERSBUSEUgTElCUkFSWSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZCitLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKK0lNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFCitMSUJSQVJZIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRSBMSUJSQVJZIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRQorVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLgorCisgIDE2LiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOCitXUklUSU5HIFdJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWQorQU5EL09SIFJFRElTVFJJQlVURSBUSEUgTElCUkFSWSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UKK0ZPUiBEQU1BR0VTLCBJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IKK0NPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFCitMSUJSQVJZIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HCitSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkgWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQQorRkFJTFVSRSBPRiBUSEUgTElCUkFSWSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSIFNPRlRXQVJFKSwgRVZFTiBJRgorU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorREFNQUdFUy4KKworICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKKy8vIENvcHlyaWdodCAoQykgMjAwMi0yMDEzIFRoZSBBTkdMRSBQcm9qZWN0IEF1dGhvcnMuIAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vCisvLyAgICAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCisvLyAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKy8vICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKy8vICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAgIE5laXRoZXIgdGhlIG5hbWUgb2YgVHJhbnNHYW1pbmcgSW5jLiwgR29vZ2xlIEluYy4sIDNETGFicyBJbmMuCisvLyAgICAgTHRkLiwgbm9yIHRoZSBuYW1lcyBvZiB0aGVpciBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorLy8gICAgIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYworLy8gICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCAKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisvLyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorLy8gQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKy8vIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKy8vIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKy8vIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorLy8gTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKy8vIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorLy8gUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKKyAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KKworICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKKyAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKKyAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCisgICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQorICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCisgICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCisgICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKKyAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KKworICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0NvcHlyaWdodCAoYykgMjAxMiwgTWFuZnJlZCBNb2l0emkKKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgCitjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIAorIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyAKK3dpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgCitkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gCitwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gCit0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6IAorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCAKK2luIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAKKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgCitPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIAorTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAKK0lOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIAorQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgCitUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSAKK1NPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAKKworRGV1dHNjaGUgw5xiZXJzZXR6dW5nOgorCitDb3B5cmlnaHQgKGMpIDIwMTIsIE1hbmZyZWQgTW9pdHppCisKK0hpZXJtaXQgd2lyZCB1bmVudGdlbHRsaWNoLCBqZWRlciBQZXJzb24sIGRpZSBlaW5lIEtvcGllIGRlciBTb2Z0d2FyZSAKK3VuZCBkZXIgenVnZWjDtnJpZ2VuIERva3VtZW50YXRpb25lbiAoZGllICJTb2Z0d2FyZSIpIGVyaMOkbHQsIGRpZSAKK0VybGF1Ym5pcyBlcnRlaWx0LCB1bmVpbmdlc2NocsOkbmt0IHp1IGJlbnV0emVuLCBpbmtsdXNpdmUgdW5kIG9obmUgCitBdXNuYWhtZSwgZGVtIFJlY2h0LCBzaWUgenUgdmVyd2VuZGVuLCBrb3BpZXJlbiwgw6RuZGVybiwgZnVzaW9uaWVyZW4sIAordmVybGVnZW4sIHZlcmJyZWl0ZW4sIHVudGVybGl6ZW56aWVyZW4gdW5kL29kZXIgenUgdmVya2F1ZmVuLCB1bmQgCitQZXJzb25lbiwgZGllIGRpZXNlIFNvZnR3YXJlIGVyaGFsdGVuLCBkaWVzZSBSZWNodGUgenUgZ2ViZW4sIHVudGVyIGRlbiAKK2ZvbGdlbmRlbiBCZWRpbmd1bmdlbjogCisKK0RlciBvYmlnZSBVcmhlYmVycmVjaHRzdmVybWVyayB1bmQgZGllc2VyIEVybGF1Ym5pc3Zlcm1lcmsgc2luZCBpbiBhbGxlbiAKK0tvcGllbiBvZGVyIFRlaWxrb3BpZW4gZGVyIFNvZnR3YXJlIGJlaXp1bGVnZW4uIAorCitESUUgU09GVFdBUkUgV0lSRCBPSE5FIEpFREUgQVVTRFLDnENLTElDSEUgT0RFUiBJTVBMSVpJRVJURSBHQVJBTlRJRSAKK0JFUkVJVEdFU1RFTExULCBFSU5TQ0hMSUVTU0xJQ0ggREVSIEdBUkFOVElFIFpVUiBCRU5VVFpVTkcgRsOcUiBERU4gCitWT1JHRVNFSEVORU4gT0RFUiBFSU5FTSBCRVNUSU1NVEVOIFpXRUNLIFNPV0lFIEpFR0xJQ0hFUiAKK1JFQ0hUU1ZFUkxFVFpVTkcsIEpFRE9DSCBOSUNIVCBEQVJBVUYgQkVTQ0hSw4ROS1QuIElOIEtFSU5FTSBGQUxMIFNJTkQgCitESUUgQVVUT1JFTiBPREVSIENPUFlSSUdIVElOSEFCRVIgRsOcUiBKRUdMSUNIRU4gU0NIQURFTiBPREVSIFNPTlNUSUdFIAorQU5TUFLDnENIRSBIQUZUQkFSIFpVIE1BQ0hFTiwgT0IgSU5GT0xHRSBERVIgRVJGw5xMTFVORyBFSU5FUyBWRVJUUkFHRVMsIAorRUlORVMgREVMSUtURVMgT0RFUiBBTkRFUlMgSU0gWlVTQU1NRU5IQU5HIE1JVCBERVIgU09GVFdBUkUgT0RFUiAKK1NPTlNUSUdFUiBWRVJXRU5EVU5HIERFUiBTT0ZUV0FSRSBFTlRTVEFOREVOLiAKKworCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTU9aSUxMQSBQVUJMSUMgTElDRU5TRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDEuMQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0KKworMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgMS4wLjEuICJDb21tZXJjaWFsIFVzZSIgbWVhbnMgZGlzdHJpYnV0aW9uIG9yIG90aGVyd2lzZSBtYWtpbmcgdGhlCisgICAgIENvdmVyZWQgQ29kZSBhdmFpbGFibGUgdG8gYSB0aGlyZCBwYXJ0eS4KKworICAgICAxLjEuICJDb250cmlidXRvciIgbWVhbnMgZWFjaCBlbnRpdHkgdGhhdCBjcmVhdGVzIG9yIGNvbnRyaWJ1dGVzIHRvCisgICAgIHRoZSBjcmVhdGlvbiBvZiBNb2RpZmljYXRpb25zLgorCisgICAgIDEuMi4gIkNvbnRyaWJ1dG9yIFZlcnNpb24iIG1lYW5zIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgT3JpZ2luYWwKKyAgICAgQ29kZSwgcHJpb3IgTW9kaWZpY2F0aW9ucyB1c2VkIGJ5IGEgQ29udHJpYnV0b3IsIGFuZCB0aGUgTW9kaWZpY2F0aW9ucworICAgICBtYWRlIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4KKworICAgICAxLjMuICJDb3ZlcmVkIENvZGUiIG1lYW5zIHRoZSBPcmlnaW5hbCBDb2RlIG9yIE1vZGlmaWNhdGlvbnMgb3IgdGhlCisgICAgIGNvbWJpbmF0aW9uIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGFuZCBNb2RpZmljYXRpb25zLCBpbiBlYWNoIGNhc2UKKyAgICAgaW5jbHVkaW5nIHBvcnRpb25zIHRoZXJlb2YuCisKKyAgICAgMS40LiAiRWxlY3Ryb25pYyBEaXN0cmlidXRpb24gTWVjaGFuaXNtIiBtZWFucyBhIG1lY2hhbmlzbSBnZW5lcmFsbHkKKyAgICAgYWNjZXB0ZWQgaW4gdGhlIHNvZnR3YXJlIGRldmVsb3BtZW50IGNvbW11bml0eSBmb3IgdGhlIGVsZWN0cm9uaWMKKyAgICAgdHJhbnNmZXIgb2YgZGF0YS4KKworICAgICAxLjUuICJFeGVjdXRhYmxlIiBtZWFucyBDb3ZlcmVkIENvZGUgaW4gYW55IGZvcm0gb3RoZXIgdGhhbiBTb3VyY2UKKyAgICAgQ29kZS4KKworICAgICAxLjYuICJJbml0aWFsIERldmVsb3BlciIgbWVhbnMgdGhlIGluZGl2aWR1YWwgb3IgZW50aXR5IGlkZW50aWZpZWQKKyAgICAgYXMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGluIHRoZSBTb3VyY2UgQ29kZSBub3RpY2UgcmVxdWlyZWQgYnkgRXhoaWJpdAorICAgICBBLgorCisgICAgIDEuNy4gIkxhcmdlciBXb3JrIiBtZWFucyBhIHdvcmsgd2hpY2ggY29tYmluZXMgQ292ZXJlZCBDb2RlIG9yCisgICAgIHBvcnRpb25zIHRoZXJlb2Ygd2l0aCBjb2RlIG5vdCBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgorCisgICAgIDEuOC4gIkxpY2Vuc2UiIG1lYW5zIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgMS44LjEuICJMaWNlbnNhYmxlIiBtZWFucyBoYXZpbmcgdGhlIHJpZ2h0IHRvIGdyYW50LCB0byB0aGUgbWF4aW11bQorICAgICBleHRlbnQgcG9zc2libGUsIHdoZXRoZXIgYXQgdGhlIHRpbWUgb2YgdGhlIGluaXRpYWwgZ3JhbnQgb3IKKyAgICAgc3Vic2VxdWVudGx5IGFjcXVpcmVkLCBhbnkgYW5kIGFsbCBvZiB0aGUgcmlnaHRzIGNvbnZleWVkIGhlcmVpbi4KKworICAgICAxLjkuICJNb2RpZmljYXRpb25zIiBtZWFucyBhbnkgYWRkaXRpb24gdG8gb3IgZGVsZXRpb24gZnJvbSB0aGUKKyAgICAgc3Vic3RhbmNlIG9yIHN0cnVjdHVyZSBvZiBlaXRoZXIgdGhlIE9yaWdpbmFsIENvZGUgb3IgYW55IHByZXZpb3VzCisgICAgIE1vZGlmaWNhdGlvbnMuIFdoZW4gQ292ZXJlZCBDb2RlIGlzIHJlbGVhc2VkIGFzIGEgc2VyaWVzIG9mIGZpbGVzLCBhCisgICAgIE1vZGlmaWNhdGlvbiBpczoKKyAgICAgICAgICBBLiBBbnkgYWRkaXRpb24gdG8gb3IgZGVsZXRpb24gZnJvbSB0aGUgY29udGVudHMgb2YgYSBmaWxlCisgICAgICAgICAgY29udGFpbmluZyBPcmlnaW5hbCBDb2RlIG9yIHByZXZpb3VzIE1vZGlmaWNhdGlvbnMuCisKKyAgICAgICAgICBCLiBBbnkgbmV3IGZpbGUgdGhhdCBjb250YWlucyBhbnkgcGFydCBvZiB0aGUgT3JpZ2luYWwgQ29kZSBvcgorICAgICAgICAgIHByZXZpb3VzIE1vZGlmaWNhdGlvbnMuCisKKyAgICAgMS4xMC4gIk9yaWdpbmFsIENvZGUiIG1lYW5zIFNvdXJjZSBDb2RlIG9mIGNvbXB1dGVyIHNvZnR3YXJlIGNvZGUKKyAgICAgd2hpY2ggaXMgZGVzY3JpYmVkIGluIHRoZSBTb3VyY2UgQ29kZSBub3RpY2UgcmVxdWlyZWQgYnkgRXhoaWJpdCBBIGFzCisgICAgIE9yaWdpbmFsIENvZGUsIGFuZCB3aGljaCwgYXQgdGhlIHRpbWUgb2YgaXRzIHJlbGVhc2UgdW5kZXIgdGhpcworICAgICBMaWNlbnNlIGlzIG5vdCBhbHJlYWR5IENvdmVyZWQgQ29kZSBnb3Zlcm5lZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgMS4xMC4xLiAiUGF0ZW50IENsYWltcyIgbWVhbnMgYW55IHBhdGVudCBjbGFpbShzKSwgbm93IG93bmVkIG9yCisgICAgIGhlcmVhZnRlciBhY3F1aXJlZCwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiwgbWV0aG9kLCBwcm9jZXNzLAorICAgICBhbmQgYXBwYXJhdHVzIGNsYWltcywgaW4gYW55IHBhdGVudCBMaWNlbnNhYmxlIGJ5IGdyYW50b3IuCisKKyAgICAgMS4xMS4gIlNvdXJjZSBDb2RlIiBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIENvdmVyZWQgQ29kZSBmb3IKKyAgICAgbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQsIGluY2x1ZGluZyBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cworICAgICBhbnkgYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgc2NyaXB0cyB1c2VkIHRvIGNvbnRyb2wKKyAgICAgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiBhbiBFeGVjdXRhYmxlLCBvciBzb3VyY2UgY29kZQorICAgICBkaWZmZXJlbnRpYWwgY29tcGFyaXNvbnMgYWdhaW5zdCBlaXRoZXIgdGhlIE9yaWdpbmFsIENvZGUgb3IgYW5vdGhlcgorICAgICB3ZWxsIGtub3duLCBhdmFpbGFibGUgQ292ZXJlZCBDb2RlIG9mIHRoZSBDb250cmlidXRvcidzIGNob2ljZS4gVGhlCisgICAgIFNvdXJjZSBDb2RlIGNhbiBiZSBpbiBhIGNvbXByZXNzZWQgb3IgYXJjaGl2YWwgZm9ybSwgcHJvdmlkZWQgdGhlCisgICAgIGFwcHJvcHJpYXRlIGRlY29tcHJlc3Npb24gb3IgZGUtYXJjaGl2aW5nIHNvZnR3YXJlIGlzIHdpZGVseSBhdmFpbGFibGUKKyAgICAgZm9yIG5vIGNoYXJnZS4KKworICAgICAxLjEyLiAiWW91IiAob3IgIllvdXIiKSBtZWFucyBhbiBpbmRpdmlkdWFsIG9yIGEgbGVnYWwgZW50aXR5CisgICAgIGV4ZXJjaXNpbmcgcmlnaHRzIHVuZGVyLCBhbmQgY29tcGx5aW5nIHdpdGggYWxsIG9mIHRoZSB0ZXJtcyBvZiwgdGhpcworICAgICBMaWNlbnNlIG9yIGEgZnV0dXJlIHZlcnNpb24gb2YgdGhpcyBMaWNlbnNlIGlzc3VlZCB1bmRlciBTZWN0aW9uIDYuMS4KKyAgICAgRm9yIGxlZ2FsIGVudGl0aWVzLCAiWW91IiBpbmNsdWRlcyBhbnkgZW50aXR5IHdoaWNoIGNvbnRyb2xzLCBpcworICAgICBjb250cm9sbGVkIGJ5LCBvciBpcyB1bmRlciBjb21tb24gY29udHJvbCB3aXRoIFlvdS4gRm9yIHB1cnBvc2VzIG9mCisgICAgIHRoaXMgZGVmaW5pdGlvbiwgImNvbnRyb2wiIG1lYW5zIChhKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwKKyAgICAgdG8gY2F1c2UgdGhlIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5CisgICAgIGNvbnRyYWN0IG9yIG90aGVyd2lzZSwgb3IgKGIpIG93bmVyc2hpcCBvZiBtb3JlIHRoYW4gZmlmdHkgcGVyY2VudAorICAgICAoNTAlKSBvZiB0aGUgb3V0c3RhbmRpbmcgc2hhcmVzIG9yIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2gKKyAgICAgZW50aXR5LgorCisyLiBTb3VyY2UgQ29kZSBMaWNlbnNlLgorCisgICAgIDIuMS4gVGhlIEluaXRpYWwgRGV2ZWxvcGVyIEdyYW50LgorICAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgaGVyZWJ5IGdyYW50cyBZb3UgYSB3b3JsZC13aWRlLCByb3lhbHR5LWZyZWUsCisgICAgIG5vbi1leGNsdXNpdmUgbGljZW5zZSwgc3ViamVjdCB0byB0aGlyZCBwYXJ0eSBpbnRlbGxlY3R1YWwgcHJvcGVydHkKKyAgICAgY2xhaW1zOgorICAgICAgICAgIChhKSB1bmRlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIChvdGhlciB0aGFuIHBhdGVudCBvcgorICAgICAgICAgIHRyYWRlbWFyaykgTGljZW5zYWJsZSBieSBJbml0aWFsIERldmVsb3BlciB0byB1c2UsIHJlcHJvZHVjZSwKKyAgICAgICAgICBtb2RpZnksIGRpc3BsYXksIHBlcmZvcm0sIHN1YmxpY2Vuc2UgYW5kIGRpc3RyaWJ1dGUgdGhlIE9yaWdpbmFsCisgICAgICAgICAgQ29kZSAob3IgcG9ydGlvbnMgdGhlcmVvZikgd2l0aCBvciB3aXRob3V0IE1vZGlmaWNhdGlvbnMsIGFuZC9vcgorICAgICAgICAgIGFzIHBhcnQgb2YgYSBMYXJnZXIgV29yazsgYW5kCisKKyAgICAgICAgICAoYikgdW5kZXIgUGF0ZW50cyBDbGFpbXMgaW5mcmluZ2VkIGJ5IHRoZSBtYWtpbmcsIHVzaW5nIG9yCisgICAgICAgICAgc2VsbGluZyBvZiBPcmlnaW5hbCBDb2RlLCB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgcHJhY3RpY2UsCisgICAgICAgICAgc2VsbCwgYW5kIG9mZmVyIGZvciBzYWxlLCBhbmQvb3Igb3RoZXJ3aXNlIGRpc3Bvc2Ugb2YgdGhlCisgICAgICAgICAgT3JpZ2luYWwgQ29kZSAob3IgcG9ydGlvbnMgdGhlcmVvZikuCisKKyAgICAgICAgICAoYykgdGhlIGxpY2Vuc2VzIGdyYW50ZWQgaW4gdGhpcyBTZWN0aW9uIDIuMShhKSBhbmQgKGIpIGFyZQorICAgICAgICAgIGVmZmVjdGl2ZSBvbiB0aGUgZGF0ZSBJbml0aWFsIERldmVsb3BlciBmaXJzdCBkaXN0cmlidXRlcworICAgICAgICAgIE9yaWdpbmFsIENvZGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKworICAgICAgICAgIChkKSBOb3R3aXRoc3RhbmRpbmcgU2VjdGlvbiAyLjEoYikgYWJvdmUsIG5vIHBhdGVudCBsaWNlbnNlIGlzCisgICAgICAgICAgZ3JhbnRlZDogMSkgZm9yIGNvZGUgdGhhdCBZb3UgZGVsZXRlIGZyb20gdGhlIE9yaWdpbmFsIENvZGU7IDIpCisgICAgICAgICAgc2VwYXJhdGUgZnJvbSB0aGUgT3JpZ2luYWwgQ29kZTsgb3IgMykgZm9yIGluZnJpbmdlbWVudHMgY2F1c2VkCisgICAgICAgICAgYnk6IGkpIHRoZSBtb2RpZmljYXRpb24gb2YgdGhlIE9yaWdpbmFsIENvZGUgb3IgaWkpIHRoZQorICAgICAgICAgIGNvbWJpbmF0aW9uIG9mIHRoZSBPcmlnaW5hbCBDb2RlIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgZGV2aWNlcy4KKworICAgICAyLjIuIENvbnRyaWJ1dG9yIEdyYW50LgorICAgICBTdWJqZWN0IHRvIHRoaXJkIHBhcnR5IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBjbGFpbXMsIGVhY2ggQ29udHJpYnV0b3IKKyAgICAgaGVyZWJ5IGdyYW50cyBZb3UgYSB3b3JsZC13aWRlLCByb3lhbHR5LWZyZWUsIG5vbi1leGNsdXNpdmUgbGljZW5zZQorCisgICAgICAgICAgKGEpIHVuZGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgKG90aGVyIHRoYW4gcGF0ZW50IG9yCisgICAgICAgICAgdHJhZGVtYXJrKSBMaWNlbnNhYmxlIGJ5IENvbnRyaWJ1dG9yLCB0byB1c2UsIHJlcHJvZHVjZSwgbW9kaWZ5LAorICAgICAgICAgIGRpc3BsYXksIHBlcmZvcm0sIHN1YmxpY2Vuc2UgYW5kIGRpc3RyaWJ1dGUgdGhlIE1vZGlmaWNhdGlvbnMKKyAgICAgICAgICBjcmVhdGVkIGJ5IHN1Y2ggQ29udHJpYnV0b3IgKG9yIHBvcnRpb25zIHRoZXJlb2YpIGVpdGhlciBvbiBhbgorICAgICAgICAgIHVubW9kaWZpZWQgYmFzaXMsIHdpdGggb3RoZXIgTW9kaWZpY2F0aW9ucywgYXMgQ292ZXJlZCBDb2RlCisgICAgICAgICAgYW5kL29yIGFzIHBhcnQgb2YgYSBMYXJnZXIgV29yazsgYW5kCisKKyAgICAgICAgICAoYikgdW5kZXIgUGF0ZW50IENsYWltcyBpbmZyaW5nZWQgYnkgdGhlIG1ha2luZywgdXNpbmcsIG9yCisgICAgICAgICAgc2VsbGluZyBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciBlaXRoZXIgYWxvbmUKKyAgICAgICAgICBhbmQvb3IgaW4gY29tYmluYXRpb24gd2l0aCBpdHMgQ29udHJpYnV0b3IgVmVyc2lvbiAob3IgcG9ydGlvbnMKKyAgICAgICAgICBvZiBzdWNoIGNvbWJpbmF0aW9uKSwgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciBmb3Igc2FsZSwgaGF2ZQorICAgICAgICAgIG1hZGUsIGFuZC9vciBvdGhlcndpc2UgZGlzcG9zZSBvZjogMSkgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQKKyAgICAgICAgICBDb250cmlidXRvciAob3IgcG9ydGlvbnMgdGhlcmVvZik7IGFuZCAyKSB0aGUgY29tYmluYXRpb24gb2YKKyAgICAgICAgICBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciB3aXRoIGl0cyBDb250cmlidXRvcgorICAgICAgICAgIFZlcnNpb24gKG9yIHBvcnRpb25zIG9mIHN1Y2ggY29tYmluYXRpb24pLgorCisgICAgICAgICAgKGMpIHRoZSBsaWNlbnNlcyBncmFudGVkIGluIFNlY3Rpb25zIDIuMihhKSBhbmQgMi4yKGIpIGFyZQorICAgICAgICAgIGVmZmVjdGl2ZSBvbiB0aGUgZGF0ZSBDb250cmlidXRvciBmaXJzdCBtYWtlcyBDb21tZXJjaWFsIFVzZSBvZgorICAgICAgICAgIHRoZSBDb3ZlcmVkIENvZGUuCisKKyAgICAgICAgICAoZCkgTm90d2l0aHN0YW5kaW5nIFNlY3Rpb24gMi4yKGIpIGFib3ZlLCBubyBwYXRlbnQgbGljZW5zZSBpcworICAgICAgICAgIGdyYW50ZWQ6IDEpIGZvciBhbnkgY29kZSB0aGF0IENvbnRyaWJ1dG9yIGhhcyBkZWxldGVkIGZyb20gdGhlCisgICAgICAgICAgQ29udHJpYnV0b3IgVmVyc2lvbjsgMikgc2VwYXJhdGUgZnJvbSB0aGUgQ29udHJpYnV0b3IgVmVyc2lvbjsKKyAgICAgICAgICAzKSBmb3IgaW5mcmluZ2VtZW50cyBjYXVzZWQgYnk6IGkpIHRoaXJkIHBhcnR5IG1vZGlmaWNhdGlvbnMgb2YKKyAgICAgICAgICBDb250cmlidXRvciBWZXJzaW9uIG9yIGlpKSB0aGUgY29tYmluYXRpb24gb2YgTW9kaWZpY2F0aW9ucyBtYWRlCisgICAgICAgICAgYnkgdGhhdCBDb250cmlidXRvciB3aXRoIG90aGVyIHNvZnR3YXJlIChleGNlcHQgYXMgcGFydCBvZiB0aGUKKyAgICAgICAgICBDb250cmlidXRvciBWZXJzaW9uKSBvciBvdGhlciBkZXZpY2VzOyBvciA0KSB1bmRlciBQYXRlbnQgQ2xhaW1zCisgICAgICAgICAgaW5mcmluZ2VkIGJ5IENvdmVyZWQgQ29kZSBpbiB0aGUgYWJzZW5jZSBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkKKyAgICAgICAgICB0aGF0IENvbnRyaWJ1dG9yLgorCiszLiBEaXN0cmlidXRpb24gT2JsaWdhdGlvbnMuCisKKyAgICAgMy4xLiBBcHBsaWNhdGlvbiBvZiBMaWNlbnNlLgorICAgICBUaGUgTW9kaWZpY2F0aW9ucyB3aGljaCBZb3UgY3JlYXRlIG9yIHRvIHdoaWNoIFlvdSBjb250cmlidXRlIGFyZQorICAgICBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgICAgIFNlY3Rpb24gMi4yLiBUaGUgU291cmNlIENvZGUgdmVyc2lvbiBvZiBDb3ZlcmVkIENvZGUgbWF5IGJlCisgICAgIGRpc3RyaWJ1dGVkIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBvciBhIGZ1dHVyZSB2ZXJzaW9uCisgICAgIG9mIHRoaXMgTGljZW5zZSByZWxlYXNlZCB1bmRlciBTZWN0aW9uIDYuMSwgYW5kIFlvdSBtdXN0IGluY2x1ZGUgYQorICAgICBjb3B5IG9mIHRoaXMgTGljZW5zZSB3aXRoIGV2ZXJ5IGNvcHkgb2YgdGhlIFNvdXJjZSBDb2RlIFlvdQorICAgICBkaXN0cmlidXRlLiBZb3UgbWF5IG5vdCBvZmZlciBvciBpbXBvc2UgYW55IHRlcm1zIG9uIGFueSBTb3VyY2UgQ29kZQorICAgICB2ZXJzaW9uIHRoYXQgYWx0ZXJzIG9yIHJlc3RyaWN0cyB0aGUgYXBwbGljYWJsZSB2ZXJzaW9uIG9mIHRoaXMKKyAgICAgTGljZW5zZSBvciB0aGUgcmVjaXBpZW50cycgcmlnaHRzIGhlcmV1bmRlci4gSG93ZXZlciwgWW91IG1heSBpbmNsdWRlCisgICAgIGFuIGFkZGl0aW9uYWwgZG9jdW1lbnQgb2ZmZXJpbmcgdGhlIGFkZGl0aW9uYWwgcmlnaHRzIGRlc2NyaWJlZCBpbgorICAgICBTZWN0aW9uIDMuNS4KKworICAgICAzLjIuIEF2YWlsYWJpbGl0eSBvZiBTb3VyY2UgQ29kZS4KKyAgICAgQW55IE1vZGlmaWNhdGlvbiB3aGljaCBZb3UgY3JlYXRlIG9yIHRvIHdoaWNoIFlvdSBjb250cmlidXRlIG11c3QgYmUKKyAgICAgbWFkZSBhdmFpbGFibGUgaW4gU291cmNlIENvZGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlCisgICAgIGVpdGhlciBvbiB0aGUgc2FtZSBtZWRpYSBhcyBhbiBFeGVjdXRhYmxlIHZlcnNpb24gb3IgdmlhIGFuIGFjY2VwdGVkCisgICAgIEVsZWN0cm9uaWMgRGlzdHJpYnV0aW9uIE1lY2hhbmlzbSB0byBhbnlvbmUgdG8gd2hvbSB5b3UgbWFkZSBhbgorICAgICBFeGVjdXRhYmxlIHZlcnNpb24gYXZhaWxhYmxlOyBhbmQgaWYgbWFkZSBhdmFpbGFibGUgdmlhIEVsZWN0cm9uaWMKKyAgICAgRGlzdHJpYnV0aW9uIE1lY2hhbmlzbSwgbXVzdCByZW1haW4gYXZhaWxhYmxlIGZvciBhdCBsZWFzdCB0d2VsdmUgKDEyKQorICAgICBtb250aHMgYWZ0ZXIgdGhlIGRhdGUgaXQgaW5pdGlhbGx5IGJlY2FtZSBhdmFpbGFibGUsIG9yIGF0IGxlYXN0IHNpeAorICAgICAoNikgbW9udGhzIGFmdGVyIGEgc3Vic2VxdWVudCB2ZXJzaW9uIG9mIHRoYXQgcGFydGljdWxhciBNb2RpZmljYXRpb24KKyAgICAgaGFzIGJlZW4gbWFkZSBhdmFpbGFibGUgdG8gc3VjaCByZWNpcGllbnRzLiBZb3UgYXJlIHJlc3BvbnNpYmxlIGZvcgorICAgICBlbnN1cmluZyB0aGF0IHRoZSBTb3VyY2UgQ29kZSB2ZXJzaW9uIHJlbWFpbnMgYXZhaWxhYmxlIGV2ZW4gaWYgdGhlCisgICAgIEVsZWN0cm9uaWMgRGlzdHJpYnV0aW9uIE1lY2hhbmlzbSBpcyBtYWludGFpbmVkIGJ5IGEgdGhpcmQgcGFydHkuCisKKyAgICAgMy4zLiBEZXNjcmlwdGlvbiBvZiBNb2RpZmljYXRpb25zLgorICAgICBZb3UgbXVzdCBjYXVzZSBhbGwgQ292ZXJlZCBDb2RlIHRvIHdoaWNoIFlvdSBjb250cmlidXRlIHRvIGNvbnRhaW4gYQorICAgICBmaWxlIGRvY3VtZW50aW5nIHRoZSBjaGFuZ2VzIFlvdSBtYWRlIHRvIGNyZWF0ZSB0aGF0IENvdmVyZWQgQ29kZSBhbmQKKyAgICAgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gWW91IG11c3QgaW5jbHVkZSBhIHByb21pbmVudCBzdGF0ZW1lbnQgdGhhdAorICAgICB0aGUgTW9kaWZpY2F0aW9uIGlzIGRlcml2ZWQsIGRpcmVjdGx5IG9yIGluZGlyZWN0bHksIGZyb20gT3JpZ2luYWwKKyAgICAgQ29kZSBwcm92aWRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYW5kIGluY2x1ZGluZyB0aGUgbmFtZSBvZiB0aGUKKyAgICAgSW5pdGlhbCBEZXZlbG9wZXIgaW4gKGEpIHRoZSBTb3VyY2UgQ29kZSwgYW5kIChiKSBpbiBhbnkgbm90aWNlIGluIGFuCisgICAgIEV4ZWN1dGFibGUgdmVyc2lvbiBvciByZWxhdGVkIGRvY3VtZW50YXRpb24gaW4gd2hpY2ggWW91IGRlc2NyaWJlIHRoZQorICAgICBvcmlnaW4gb3Igb3duZXJzaGlwIG9mIHRoZSBDb3ZlcmVkIENvZGUuCisKKyAgICAgMy40LiBJbnRlbGxlY3R1YWwgUHJvcGVydHkgTWF0dGVycworICAgICAgICAgIChhKSBUaGlyZCBQYXJ0eSBDbGFpbXMuCisgICAgICAgICAgSWYgQ29udHJpYnV0b3IgaGFzIGtub3dsZWRnZSB0aGF0IGEgbGljZW5zZSB1bmRlciBhIHRoaXJkIHBhcnR5J3MKKyAgICAgICAgICBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGlzIHJlcXVpcmVkIHRvIGV4ZXJjaXNlIHRoZSByaWdodHMKKyAgICAgICAgICBncmFudGVkIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdW5kZXIgU2VjdGlvbnMgMi4xIG9yIDIuMiwKKyAgICAgICAgICBDb250cmlidXRvciBtdXN0IGluY2x1ZGUgYSB0ZXh0IGZpbGUgd2l0aCB0aGUgU291cmNlIENvZGUKKyAgICAgICAgICBkaXN0cmlidXRpb24gdGl0bGVkICJMRUdBTCIgd2hpY2ggZGVzY3JpYmVzIHRoZSBjbGFpbSBhbmQgdGhlCisgICAgICAgICAgcGFydHkgbWFraW5nIHRoZSBjbGFpbSBpbiBzdWZmaWNpZW50IGRldGFpbCB0aGF0IGEgcmVjaXBpZW50IHdpbGwKKyAgICAgICAgICBrbm93IHdob20gdG8gY29udGFjdC4gSWYgQ29udHJpYnV0b3Igb2J0YWlucyBzdWNoIGtub3dsZWRnZSBhZnRlcgorICAgICAgICAgIHRoZSBNb2RpZmljYXRpb24gaXMgbWFkZSBhdmFpbGFibGUgYXMgZGVzY3JpYmVkIGluIFNlY3Rpb24gMy4yLAorICAgICAgICAgIENvbnRyaWJ1dG9yIHNoYWxsIHByb21wdGx5IG1vZGlmeSB0aGUgTEVHQUwgZmlsZSBpbiBhbGwgY29waWVzCisgICAgICAgICAgQ29udHJpYnV0b3IgbWFrZXMgYXZhaWxhYmxlIHRoZXJlYWZ0ZXIgYW5kIHNoYWxsIHRha2Ugb3RoZXIgc3RlcHMKKyAgICAgICAgICAoc3VjaCBhcyBub3RpZnlpbmcgYXBwcm9wcmlhdGUgbWFpbGluZyBsaXN0cyBvciBuZXdzZ3JvdXBzKQorICAgICAgICAgIHJlYXNvbmFibHkgY2FsY3VsYXRlZCB0byBpbmZvcm0gdGhvc2Ugd2hvIHJlY2VpdmVkIHRoZSBDb3ZlcmVkCisgICAgICAgICAgQ29kZSB0aGF0IG5ldyBrbm93bGVkZ2UgaGFzIGJlZW4gb2J0YWluZWQuCisKKyAgICAgICAgICAoYikgQ29udHJpYnV0b3IgQVBJcy4KKyAgICAgICAgICBJZiBDb250cmlidXRvcidzIE1vZGlmaWNhdGlvbnMgaW5jbHVkZSBhbiBhcHBsaWNhdGlvbiBwcm9ncmFtbWluZworICAgICAgICAgIGludGVyZmFjZSBhbmQgQ29udHJpYnV0b3IgaGFzIGtub3dsZWRnZSBvZiBwYXRlbnQgbGljZW5zZXMgd2hpY2gKKyAgICAgICAgICBhcmUgcmVhc29uYWJseSBuZWNlc3NhcnkgdG8gaW1wbGVtZW50IHRoYXQgQVBJLCBDb250cmlidXRvciBtdXN0CisgICAgICAgICAgYWxzbyBpbmNsdWRlIHRoaXMgaW5mb3JtYXRpb24gaW4gdGhlIExFR0FMIGZpbGUuCisKKyAgICAgICAgICAoYykgUmVwcmVzZW50YXRpb25zLgorICAgICAgICAgIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCwgZXhjZXB0IGFzIGRpc2Nsb3NlZCBwdXJzdWFudCB0bworICAgICAgICAgIFNlY3Rpb24gMy40KGEpIGFib3ZlLCBDb250cmlidXRvciBiZWxpZXZlcyB0aGF0IENvbnRyaWJ1dG9yJ3MKKyAgICAgICAgICBNb2RpZmljYXRpb25zIGFyZSBDb250cmlidXRvcidzIG9yaWdpbmFsIGNyZWF0aW9uKHMpIGFuZC9vcgorICAgICAgICAgIENvbnRyaWJ1dG9yIGhhcyBzdWZmaWNpZW50IHJpZ2h0cyB0byBncmFudCB0aGUgcmlnaHRzIGNvbnZleWVkIGJ5CisgICAgICAgICAgdGhpcyBMaWNlbnNlLgorCisgICAgIDMuNS4gUmVxdWlyZWQgTm90aWNlcy4KKyAgICAgWW91IG11c3QgZHVwbGljYXRlIHRoZSBub3RpY2UgaW4gRXhoaWJpdCBBIGluIGVhY2ggZmlsZSBvZiB0aGUgU291cmNlCisgICAgIENvZGUuIElmIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBwdXQgc3VjaCBub3RpY2UgaW4gYSBwYXJ0aWN1bGFyIFNvdXJjZQorICAgICBDb2RlIGZpbGUgZHVlIHRvIGl0cyBzdHJ1Y3R1cmUsIHRoZW4gWW91IG11c3QgaW5jbHVkZSBzdWNoIG5vdGljZSBpbiBhCisgICAgIGxvY2F0aW9uIChzdWNoIGFzIGEgcmVsZXZhbnQgZGlyZWN0b3J5KSB3aGVyZSBhIHVzZXIgd291bGQgYmUgbGlrZWx5CisgICAgIHRvIGxvb2sgZm9yIHN1Y2ggYSBub3RpY2UuIElmIFlvdSBjcmVhdGVkIG9uZSBvciBtb3JlIE1vZGlmaWNhdGlvbihzKQorICAgICBZb3UgbWF5IGFkZCB5b3VyIG5hbWUgYXMgYSBDb250cmlidXRvciB0byB0aGUgbm90aWNlIGRlc2NyaWJlZCBpbgorICAgICBFeGhpYml0IEEuIFlvdSBtdXN0IGFsc28gZHVwbGljYXRlIHRoaXMgTGljZW5zZSBpbiBhbnkgZG9jdW1lbnRhdGlvbgorICAgICBmb3IgdGhlIFNvdXJjZSBDb2RlIHdoZXJlIFlvdSBkZXNjcmliZSByZWNpcGllbnRzJyByaWdodHMgb3Igb3duZXJzaGlwCisgICAgIHJpZ2h0cyByZWxhdGluZyB0byBDb3ZlcmVkIENvZGUuIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLCBhbmQgdG8KKyAgICAgY2hhcmdlIGEgZmVlIGZvciwgd2FycmFudHksIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkKKyAgICAgb2JsaWdhdGlvbnMgdG8gb25lIG9yIG1vcmUgcmVjaXBpZW50cyBvZiBDb3ZlcmVkIENvZGUuIEhvd2V2ZXIsIFlvdQorICAgICBtYXkgZG8gc28gb25seSBvbiBZb3VyIG93biBiZWhhbGYsIGFuZCBub3Qgb24gYmVoYWxmIG9mIHRoZSBJbml0aWFsCisgICAgIERldmVsb3BlciBvciBhbnkgQ29udHJpYnV0b3IuIFlvdSBtdXN0IG1ha2UgaXQgYWJzb2x1dGVseSBjbGVhciB0aGFuCisgICAgIGFueSBzdWNoIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IG9ibGlnYXRpb24gaXMKKyAgICAgb2ZmZXJlZCBieSBZb3UgYWxvbmUsIGFuZCBZb3UgaGVyZWJ5IGFncmVlIHRvIGluZGVtbmlmeSB0aGUgSW5pdGlhbAorICAgICBEZXZlbG9wZXIgYW5kIGV2ZXJ5IENvbnRyaWJ1dG9yIGZvciBhbnkgbGlhYmlsaXR5IGluY3VycmVkIGJ5IHRoZQorICAgICBJbml0aWFsIERldmVsb3BlciBvciBzdWNoIENvbnRyaWJ1dG9yIGFzIGEgcmVzdWx0IG9mIHdhcnJhbnR5LAorICAgICBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IHRlcm1zIFlvdSBvZmZlci4KKworICAgICAzLjYuIERpc3RyaWJ1dGlvbiBvZiBFeGVjdXRhYmxlIFZlcnNpb25zLgorICAgICBZb3UgbWF5IGRpc3RyaWJ1dGUgQ292ZXJlZCBDb2RlIGluIEV4ZWN1dGFibGUgZm9ybSBvbmx5IGlmIHRoZQorICAgICByZXF1aXJlbWVudHMgb2YgU2VjdGlvbiAzLjEtMy41IGhhdmUgYmVlbiBtZXQgZm9yIHRoYXQgQ292ZXJlZCBDb2RlLAorICAgICBhbmQgaWYgWW91IGluY2x1ZGUgYSBub3RpY2Ugc3RhdGluZyB0aGF0IHRoZSBTb3VyY2UgQ29kZSB2ZXJzaW9uIG9mCisgICAgIHRoZSBDb3ZlcmVkIENvZGUgaXMgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UsCisgICAgIGluY2x1ZGluZyBhIGRlc2NyaXB0aW9uIG9mIGhvdyBhbmQgd2hlcmUgWW91IGhhdmUgZnVsZmlsbGVkIHRoZQorICAgICBvYmxpZ2F0aW9ucyBvZiBTZWN0aW9uIDMuMi4gVGhlIG5vdGljZSBtdXN0IGJlIGNvbnNwaWN1b3VzbHkgaW5jbHVkZWQKKyAgICAgaW4gYW55IG5vdGljZSBpbiBhbiBFeGVjdXRhYmxlIHZlcnNpb24sIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbiBvcgorICAgICBjb2xsYXRlcmFsIGluIHdoaWNoIFlvdSBkZXNjcmliZSByZWNpcGllbnRzJyByaWdodHMgcmVsYXRpbmcgdG8gdGhlCisgICAgIENvdmVyZWQgQ29kZS4gWW91IG1heSBkaXN0cmlidXRlIHRoZSBFeGVjdXRhYmxlIHZlcnNpb24gb2YgQ292ZXJlZAorICAgICBDb2RlIG9yIG93bmVyc2hpcCByaWdodHMgdW5kZXIgYSBsaWNlbnNlIG9mIFlvdXIgY2hvaWNlLCB3aGljaCBtYXkKKyAgICAgY29udGFpbiB0ZXJtcyBkaWZmZXJlbnQgZnJvbSB0aGlzIExpY2Vuc2UsIHByb3ZpZGVkIHRoYXQgWW91IGFyZSBpbgorICAgICBjb21wbGlhbmNlIHdpdGggdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBhbmQgdGhhdCB0aGUgbGljZW5zZSBmb3IgdGhlCisgICAgIEV4ZWN1dGFibGUgdmVyc2lvbiBkb2VzIG5vdCBhdHRlbXB0IHRvIGxpbWl0IG9yIGFsdGVyIHRoZSByZWNpcGllbnQncworICAgICByaWdodHMgaW4gdGhlIFNvdXJjZSBDb2RlIHZlcnNpb24gZnJvbSB0aGUgcmlnaHRzIHNldCBmb3J0aCBpbiB0aGlzCisgICAgIExpY2Vuc2UuIElmIFlvdSBkaXN0cmlidXRlIHRoZSBFeGVjdXRhYmxlIHZlcnNpb24gdW5kZXIgYSBkaWZmZXJlbnQKKyAgICAgbGljZW5zZSBZb3UgbXVzdCBtYWtlIGl0IGFic29sdXRlbHkgY2xlYXIgdGhhdCBhbnkgdGVybXMgd2hpY2ggZGlmZmVyCisgICAgIGZyb20gdGhpcyBMaWNlbnNlIGFyZSBvZmZlcmVkIGJ5IFlvdSBhbG9uZSwgbm90IGJ5IHRoZSBJbml0aWFsCisgICAgIERldmVsb3BlciBvciBhbnkgQ29udHJpYnV0b3IuIFlvdSBoZXJlYnkgYWdyZWUgdG8gaW5kZW1uaWZ5IHRoZQorICAgICBJbml0aWFsIERldmVsb3BlciBhbmQgZXZlcnkgQ29udHJpYnV0b3IgZm9yIGFueSBsaWFiaWxpdHkgaW5jdXJyZWQgYnkKKyAgICAgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIHN1Y2ggQ29udHJpYnV0b3IgYXMgYSByZXN1bHQgb2YgYW55IHN1Y2gKKyAgICAgdGVybXMgWW91IG9mZmVyLgorCisgICAgIDMuNy4gTGFyZ2VyIFdvcmtzLgorICAgICBZb3UgbWF5IGNyZWF0ZSBhIExhcmdlciBXb3JrIGJ5IGNvbWJpbmluZyBDb3ZlcmVkIENvZGUgd2l0aCBvdGhlciBjb2RlCisgICAgIG5vdCBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIGFuZCBkaXN0cmlidXRlIHRoZSBMYXJnZXIKKyAgICAgV29yayBhcyBhIHNpbmdsZSBwcm9kdWN0LiBJbiBzdWNoIGEgY2FzZSwgWW91IG11c3QgbWFrZSBzdXJlIHRoZQorICAgICByZXF1aXJlbWVudHMgb2YgdGhpcyBMaWNlbnNlIGFyZSBmdWxmaWxsZWQgZm9yIHRoZSBDb3ZlcmVkIENvZGUuCisKKzQuIEluYWJpbGl0eSB0byBDb21wbHkgRHVlIHRvIFN0YXR1dGUgb3IgUmVndWxhdGlvbi4KKworICAgICBJZiBpdCBpcyBpbXBvc3NpYmxlIGZvciBZb3UgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSB0ZXJtcyBvZiB0aGlzCisgICAgIExpY2Vuc2Ugd2l0aCByZXNwZWN0IHRvIHNvbWUgb3IgYWxsIG9mIHRoZSBDb3ZlcmVkIENvZGUgZHVlIHRvCisgICAgIHN0YXR1dGUsIGp1ZGljaWFsIG9yZGVyLCBvciByZWd1bGF0aW9uIHRoZW4gWW91IG11c3Q6IChhKSBjb21wbHkgd2l0aAorICAgICB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIHRvIHRoZSBtYXhpbXVtIGV4dGVudCBwb3NzaWJsZTsgYW5kIChiKQorICAgICBkZXNjcmliZSB0aGUgbGltaXRhdGlvbnMgYW5kIHRoZSBjb2RlIHRoZXkgYWZmZWN0LiBTdWNoIGRlc2NyaXB0aW9uCisgICAgIG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIExFR0FMIGZpbGUgZGVzY3JpYmVkIGluIFNlY3Rpb24gMy40IGFuZCBtdXN0CisgICAgIGJlIGluY2x1ZGVkIHdpdGggYWxsIGRpc3RyaWJ1dGlvbnMgb2YgdGhlIFNvdXJjZSBDb2RlLiBFeGNlcHQgdG8gdGhlCisgICAgIGV4dGVudCBwcm9oaWJpdGVkIGJ5IHN0YXR1dGUgb3IgcmVndWxhdGlvbiwgc3VjaCBkZXNjcmlwdGlvbiBtdXN0IGJlCisgICAgIHN1ZmZpY2llbnRseSBkZXRhaWxlZCBmb3IgYSByZWNpcGllbnQgb2Ygb3JkaW5hcnkgc2tpbGwgdG8gYmUgYWJsZSB0bworICAgICB1bmRlcnN0YW5kIGl0LgorCis1LiBBcHBsaWNhdGlvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgICAgVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gY29kZSB0byB3aGljaCB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgaGFzCisgICAgIGF0dGFjaGVkIHRoZSBub3RpY2UgaW4gRXhoaWJpdCBBIGFuZCB0byByZWxhdGVkIENvdmVyZWQgQ29kZS4KKworNi4gVmVyc2lvbnMgb2YgdGhlIExpY2Vuc2UuCisKKyAgICAgNi4xLiBOZXcgVmVyc2lvbnMuCisgICAgIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uICgiTmV0c2NhcGUiKSBtYXkgcHVibGlzaCByZXZpc2VkCisgICAgIGFuZC9vciBuZXcgdmVyc2lvbnMgb2YgdGhlIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuIEVhY2ggdmVyc2lvbgorICAgICB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuCisKKyAgICAgNi4yLiBFZmZlY3Qgb2YgTmV3IFZlcnNpb25zLgorICAgICBPbmNlIENvdmVyZWQgQ29kZSBoYXMgYmVlbiBwdWJsaXNoZWQgdW5kZXIgYSBwYXJ0aWN1bGFyIHZlcnNpb24gb2YgdGhlCisgICAgIExpY2Vuc2UsIFlvdSBtYXkgYWx3YXlzIGNvbnRpbnVlIHRvIHVzZSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhhdAorICAgICB2ZXJzaW9uLiBZb3UgbWF5IGFsc28gY2hvb3NlIHRvIHVzZSBzdWNoIENvdmVyZWQgQ29kZSB1bmRlciB0aGUgdGVybXMKKyAgICAgb2YgYW55IHN1YnNlcXVlbnQgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSBwdWJsaXNoZWQgYnkgTmV0c2NhcGUuIE5vIG9uZQorICAgICBvdGhlciB0aGFuIE5ldHNjYXBlIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoZSB0ZXJtcyBhcHBsaWNhYmxlIHRvCisgICAgIENvdmVyZWQgQ29kZSBjcmVhdGVkIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgICA2LjMuIERlcml2YXRpdmUgV29ya3MuCisgICAgIElmIFlvdSBjcmVhdGUgb3IgdXNlIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGlzIExpY2Vuc2UgKHdoaWNoIHlvdSBtYXkKKyAgICAgb25seSBkbyBpbiBvcmRlciB0byBhcHBseSBpdCB0byBjb2RlIHdoaWNoIGlzIG5vdCBhbHJlYWR5IENvdmVyZWQgQ29kZQorICAgICBnb3Zlcm5lZCBieSB0aGlzIExpY2Vuc2UpLCBZb3UgbXVzdCAoYSkgcmVuYW1lIFlvdXIgbGljZW5zZSBzbyB0aGF0CisgICAgIHRoZSBwaHJhc2VzICJNb3ppbGxhIiwgIk1PWklMTEFQTCIsICJNT1pQTCIsICJOZXRzY2FwZSIsCisgICAgICJNUEwiLCAiTlBMIiBvciBhbnkgY29uZnVzaW5nbHkgc2ltaWxhciBwaHJhc2UgZG8gbm90IGFwcGVhciBpbiB5b3VyCisgICAgIGxpY2Vuc2UgKGV4Y2VwdCB0byBub3RlIHRoYXQgeW91ciBsaWNlbnNlIGRpZmZlcnMgZnJvbSB0aGlzIExpY2Vuc2UpCisgICAgIGFuZCAoYikgb3RoZXJ3aXNlIG1ha2UgaXQgY2xlYXIgdGhhdCBZb3VyIHZlcnNpb24gb2YgdGhlIGxpY2Vuc2UKKyAgICAgY29udGFpbnMgdGVybXMgd2hpY2ggZGlmZmVyIGZyb20gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgYW5kCisgICAgIE5ldHNjYXBlIFB1YmxpYyBMaWNlbnNlLiAoRmlsbGluZyBpbiB0aGUgbmFtZSBvZiB0aGUgSW5pdGlhbAorICAgICBEZXZlbG9wZXIsIE9yaWdpbmFsIENvZGUgb3IgQ29udHJpYnV0b3IgaW4gdGhlIG5vdGljZSBkZXNjcmliZWQgaW4KKyAgICAgRXhoaWJpdCBBIHNoYWxsIG5vdCBvZiB0aGVtc2VsdmVzIGJlIGRlZW1lZCB0byBiZSBtb2RpZmljYXRpb25zIG9mCisgICAgIHRoaXMgTGljZW5zZS4pCisKKzcuIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkuCisKKyAgICAgQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywKKyAgICAgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GCisgICAgIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBPUiBOT04tSU5GUklOR0lORy4KKyAgICAgVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRCBDT0RFCisgICAgIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsCisgICAgIFlPVSAoTk9UIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUKKyAgICAgQ09TVCBPRiBBTlkgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUgorICAgICBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwgUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRgorICAgICBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUiBUSElTIERJU0NMQUlNRVIuCisKKzguIFRFUk1JTkFUSU9OLgorCisgICAgIDguMS4gVGhpcyBMaWNlbnNlIGFuZCB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZXVuZGVyIHdpbGwgdGVybWluYXRlCisgICAgIGF1dG9tYXRpY2FsbHkgaWYgWW91IGZhaWwgdG8gY29tcGx5IHdpdGggdGVybXMgaGVyZWluIGFuZCBmYWlsIHRvIGN1cmUKKyAgICAgc3VjaCBicmVhY2ggd2l0aGluIDMwIGRheXMgb2YgYmVjb21pbmcgYXdhcmUgb2YgdGhlIGJyZWFjaC4gQWxsCisgICAgIHN1YmxpY2Vuc2VzIHRvIHRoZSBDb3ZlcmVkIENvZGUgd2hpY2ggYXJlIHByb3Blcmx5IGdyYW50ZWQgc2hhbGwKKyAgICAgc3Vydml2ZSBhbnkgdGVybWluYXRpb24gb2YgdGhpcyBMaWNlbnNlLiBQcm92aXNpb25zIHdoaWNoLCBieSB0aGVpcgorICAgICBuYXR1cmUsIG11c3QgcmVtYWluIGluIGVmZmVjdCBiZXlvbmQgdGhlIHRlcm1pbmF0aW9uIG9mIHRoaXMgTGljZW5zZQorICAgICBzaGFsbCBzdXJ2aXZlLgorCisgICAgIDguMi4gSWYgWW91IGluaXRpYXRlIGxpdGlnYXRpb24gYnkgYXNzZXJ0aW5nIGEgcGF0ZW50IGluZnJpbmdlbWVudAorICAgICBjbGFpbSAoZXhjbHVkaW5nIGRlY2xhdG9yeSBqdWRnbWVudCBhY3Rpb25zKSBhZ2FpbnN0IEluaXRpYWwgRGV2ZWxvcGVyCisgICAgIG9yIGEgQ29udHJpYnV0b3IgKHRoZSBJbml0aWFsIERldmVsb3BlciBvciBDb250cmlidXRvciBhZ2FpbnN0IHdob20KKyAgICAgWW91IGZpbGUgc3VjaCBhY3Rpb24gaXMgcmVmZXJyZWQgdG8gYXMgIlBhcnRpY2lwYW50IikgYWxsZWdpbmcgdGhhdDoKKworICAgICAoYSkgc3VjaCBQYXJ0aWNpcGFudCdzIENvbnRyaWJ1dG9yIFZlcnNpb24gZGlyZWN0bHkgb3IgaW5kaXJlY3RseQorICAgICBpbmZyaW5nZXMgYW55IHBhdGVudCwgdGhlbiBhbnkgYW5kIGFsbCByaWdodHMgZ3JhbnRlZCBieSBzdWNoCisgICAgIFBhcnRpY2lwYW50IHRvIFlvdSB1bmRlciBTZWN0aW9ucyAyLjEgYW5kL29yIDIuMiBvZiB0aGlzIExpY2Vuc2UKKyAgICAgc2hhbGwsIHVwb24gNjAgZGF5cyBub3RpY2UgZnJvbSBQYXJ0aWNpcGFudCB0ZXJtaW5hdGUgcHJvc3BlY3RpdmVseSwKKyAgICAgdW5sZXNzIGlmIHdpdGhpbiA2MCBkYXlzIGFmdGVyIHJlY2VpcHQgb2Ygbm90aWNlIFlvdSBlaXRoZXI6IChpKQorICAgICBhZ3JlZSBpbiB3cml0aW5nIHRvIHBheSBQYXJ0aWNpcGFudCBhIG11dHVhbGx5IGFncmVlYWJsZSByZWFzb25hYmxlCisgICAgIHJveWFsdHkgZm9yIFlvdXIgcGFzdCBhbmQgZnV0dXJlIHVzZSBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkgc3VjaAorICAgICBQYXJ0aWNpcGFudCwgb3IgKGlpKSB3aXRoZHJhdyBZb3VyIGxpdGlnYXRpb24gY2xhaW0gd2l0aCByZXNwZWN0IHRvCisgICAgIHRoZSBDb250cmlidXRvciBWZXJzaW9uIGFnYWluc3Qgc3VjaCBQYXJ0aWNpcGFudC4gSWYgd2l0aGluIDYwIGRheXMKKyAgICAgb2Ygbm90aWNlLCBhIHJlYXNvbmFibGUgcm95YWx0eSBhbmQgcGF5bWVudCBhcnJhbmdlbWVudCBhcmUgbm90CisgICAgIG11dHVhbGx5IGFncmVlZCB1cG9uIGluIHdyaXRpbmcgYnkgdGhlIHBhcnRpZXMgb3IgdGhlIGxpdGlnYXRpb24gY2xhaW0KKyAgICAgaXMgbm90IHdpdGhkcmF3biwgdGhlIHJpZ2h0cyBncmFudGVkIGJ5IFBhcnRpY2lwYW50IHRvIFlvdSB1bmRlcgorICAgICBTZWN0aW9ucyAyLjEgYW5kL29yIDIuMiBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSBhdCB0aGUgZXhwaXJhdGlvbiBvZgorICAgICB0aGUgNjAgZGF5IG5vdGljZSBwZXJpb2Qgc3BlY2lmaWVkIGFib3ZlLgorCisgICAgIChiKSBhbnkgc29mdHdhcmUsIGhhcmR3YXJlLCBvciBkZXZpY2UsIG90aGVyIHRoYW4gc3VjaCBQYXJ0aWNpcGFudCdzCisgICAgIENvbnRyaWJ1dG9yIFZlcnNpb24sIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW5mcmluZ2VzIGFueSBwYXRlbnQsIHRoZW4KKyAgICAgYW55IHJpZ2h0cyBncmFudGVkIHRvIFlvdSBieSBzdWNoIFBhcnRpY2lwYW50IHVuZGVyIFNlY3Rpb25zIDIuMShiKQorICAgICBhbmQgMi4yKGIpIGFyZSByZXZva2VkIGVmZmVjdGl2ZSBhcyBvZiB0aGUgZGF0ZSBZb3UgZmlyc3QgbWFkZSwgdXNlZCwKKyAgICAgc29sZCwgZGlzdHJpYnV0ZWQsIG9yIGhhZCBtYWRlLCBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdAorICAgICBQYXJ0aWNpcGFudC4KKworICAgICA4LjMuIElmIFlvdSBhc3NlcnQgYSBwYXRlbnQgaW5mcmluZ2VtZW50IGNsYWltIGFnYWluc3QgUGFydGljaXBhbnQKKyAgICAgYWxsZWdpbmcgdGhhdCBzdWNoIFBhcnRpY2lwYW50J3MgQ29udHJpYnV0b3IgVmVyc2lvbiBkaXJlY3RseSBvcgorICAgICBpbmRpcmVjdGx5IGluZnJpbmdlcyBhbnkgcGF0ZW50IHdoZXJlIHN1Y2ggY2xhaW0gaXMgcmVzb2x2ZWQgKHN1Y2ggYXMKKyAgICAgYnkgbGljZW5zZSBvciBzZXR0bGVtZW50KSBwcmlvciB0byB0aGUgaW5pdGlhdGlvbiBvZiBwYXRlbnQKKyAgICAgaW5mcmluZ2VtZW50IGxpdGlnYXRpb24sIHRoZW4gdGhlIHJlYXNvbmFibGUgdmFsdWUgb2YgdGhlIGxpY2Vuc2VzCisgICAgIGdyYW50ZWQgYnkgc3VjaCBQYXJ0aWNpcGFudCB1bmRlciBTZWN0aW9ucyAyLjEgb3IgMi4yIHNoYWxsIGJlIHRha2VuCisgICAgIGludG8gYWNjb3VudCBpbiBkZXRlcm1pbmluZyB0aGUgYW1vdW50IG9yIHZhbHVlIG9mIGFueSBwYXltZW50IG9yCisgICAgIGxpY2Vuc2UuCisKKyAgICAgOC40LiBJbiB0aGUgZXZlbnQgb2YgdGVybWluYXRpb24gdW5kZXIgU2VjdGlvbnMgOC4xIG9yIDguMiBhYm92ZSwKKyAgICAgYWxsIGVuZCB1c2VyIGxpY2Vuc2UgYWdyZWVtZW50cyAoZXhjbHVkaW5nIGRpc3RyaWJ1dG9ycyBhbmQgcmVzZWxsZXJzKQorICAgICB3aGljaCBoYXZlIGJlZW4gdmFsaWRseSBncmFudGVkIGJ5IFlvdSBvciBhbnkgZGlzdHJpYnV0b3IgaGVyZXVuZGVyCisgICAgIHByaW9yIHRvIHRlcm1pbmF0aW9uIHNoYWxsIHN1cnZpdmUgdGVybWluYXRpb24uCisKKzkuIExJTUlUQVRJT04gT0YgTElBQklMSVRZLgorCisgICAgIFVOREVSIE5PIENJUkNVTVNUQU5DRVMgQU5EIFVOREVSIE5PIExFR0FMIFRIRU9SWSwgV0hFVEhFUiBUT1JUCisgICAgIChJTkNMVURJTkcgTkVHTElHRU5DRSksIENPTlRSQUNULCBPUiBPVEhFUldJU0UsIFNIQUxMIFlPVSwgVEhFIElOSVRJQUwKKyAgICAgREVWRUxPUEVSLCBBTlkgT1RIRVIgQ09OVFJJQlVUT1IsIE9SIEFOWSBESVNUUklCVVRPUiBPRiBDT1ZFUkVEIENPREUsCisgICAgIE9SIEFOWSBTVVBQTElFUiBPRiBBTlkgT0YgU1VDSCBQQVJUSUVTLCBCRSBMSUFCTEUgVE8gQU5ZIFBFUlNPTiBGT1IKKyAgICAgQU5ZIElORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZCisgICAgIENIQVJBQ1RFUiBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgREFNQUdFUyBGT1IgTE9TUyBPRiBHT09EV0lMTCwKKyAgICAgV09SSyBTVE9QUEFHRSwgQ09NUFVURVIgRkFJTFVSRSBPUiBNQUxGVU5DVElPTiwgT1IgQU5ZIEFORCBBTEwgT1RIRVIKKyAgICAgQ09NTUVSQ0lBTCBEQU1BR0VTIE9SIExPU1NFUywgRVZFTiBJRiBTVUNIIFBBUlRZIFNIQUxMIEhBVkUgQkVFTgorICAgICBJTkZPUk1FRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLiBUSElTIExJTUlUQVRJT04gT0YKKyAgICAgTElBQklMSVRZIFNIQUxMIE5PVCBBUFBMWSBUTyBMSUFCSUxJVFkgRk9SIERFQVRIIE9SIFBFUlNPTkFMIElOSlVSWQorICAgICBSRVNVTFRJTkcgRlJPTSBTVUNIIFBBUlRZJ1MgTkVHTElHRU5DRSBUTyBUSEUgRVhURU5UIEFQUExJQ0FCTEUgTEFXCisgICAgIFBST0hJQklUUyBTVUNIIExJTUlUQVRJT04uIFNPTUUgSlVSSVNESUNUSU9OUyBETyBOT1QgQUxMT1cgVEhFCisgICAgIEVYQ0xVU0lPTiBPUiBMSU1JVEFUSU9OIE9GIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBTTworICAgICBUSElTIEVYQ0xVU0lPTiBBTkQgTElNSVRBVElPTiBNQVkgTk9UIEFQUExZIFRPIFlPVS4KKworMTAuIFUuUy4gR09WRVJOTUVOVCBFTkQgVVNFUlMuCisKKyAgICAgVGhlIENvdmVyZWQgQ29kZSBpcyBhICJjb21tZXJjaWFsIGl0ZW0sIiBhcyB0aGF0IHRlcm0gaXMgZGVmaW5lZCBpbgorICAgICA0OCBDLkYuUi4gMi4xMDEgKE9jdC4gMTk5NSksIGNvbnNpc3Rpbmcgb2YgImNvbW1lcmNpYWwgY29tcHV0ZXIKKyAgICAgc29mdHdhcmUiIGFuZCAiY29tbWVyY2lhbCBjb21wdXRlciBzb2Z0d2FyZSBkb2N1bWVudGF0aW9uLCIgYXMgc3VjaAorICAgICB0ZXJtcyBhcmUgdXNlZCBpbiA0OCBDLkYuUi4gMTIuMjEyIChTZXB0LiAxOTk1KS4gQ29uc2lzdGVudCB3aXRoIDQ4CisgICAgIEMuRi5SLiAxMi4yMTIgYW5kIDQ4IEMuRi5SLiAyMjcuNzIwMi0xIHRocm91Z2ggMjI3LjcyMDItNCAoSnVuZSAxOTk1KSwKKyAgICAgYWxsIFUuUy4gR292ZXJubWVudCBFbmQgVXNlcnMgYWNxdWlyZSBDb3ZlcmVkIENvZGUgd2l0aCBvbmx5IHRob3NlCisgICAgIHJpZ2h0cyBzZXQgZm9ydGggaGVyZWluLgorCisxMS4gTUlTQ0VMTEFORU9VUy4KKworICAgICBUaGlzIExpY2Vuc2UgcmVwcmVzZW50cyB0aGUgY29tcGxldGUgYWdyZWVtZW50IGNvbmNlcm5pbmcgc3ViamVjdAorICAgICBtYXR0ZXIgaGVyZW9mLiBJZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBoZWxkIHRvIGJlCisgICAgIHVuZW5mb3JjZWFibGUsIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIG9ubHkgdG8gdGhlIGV4dGVudAorICAgICBuZWNlc3NhcnkgdG8gbWFrZSBpdCBlbmZvcmNlYWJsZS4gVGhpcyBMaWNlbnNlIHNoYWxsIGJlIGdvdmVybmVkIGJ5CisgICAgIENhbGlmb3JuaWEgbGF3IHByb3Zpc2lvbnMgKGV4Y2VwdCB0byB0aGUgZXh0ZW50IGFwcGxpY2FibGUgbGF3LCBpZgorICAgICBhbnksIHByb3ZpZGVzIG90aGVyd2lzZSksIGV4Y2x1ZGluZyBpdHMgY29uZmxpY3Qtb2YtbGF3IHByb3Zpc2lvbnMuCisgICAgIFdpdGggcmVzcGVjdCB0byBkaXNwdXRlcyBpbiB3aGljaCBhdCBsZWFzdCBvbmUgcGFydHkgaXMgYSBjaXRpemVuIG9mLAorICAgICBvciBhbiBlbnRpdHkgY2hhcnRlcmVkIG9yIHJlZ2lzdGVyZWQgdG8gZG8gYnVzaW5lc3MgaW4gdGhlIFVuaXRlZAorICAgICBTdGF0ZXMgb2YgQW1lcmljYSwgYW55IGxpdGlnYXRpb24gcmVsYXRpbmcgdG8gdGhpcyBMaWNlbnNlIHNoYWxsIGJlCisgICAgIHN1YmplY3QgdG8gdGhlIGp1cmlzZGljdGlvbiBvZiB0aGUgRmVkZXJhbCBDb3VydHMgb2YgdGhlIE5vcnRoZXJuCisgICAgIERpc3RyaWN0IG9mIENhbGlmb3JuaWEsIHdpdGggdmVudWUgbHlpbmcgaW4gU2FudGEgQ2xhcmEgQ291bnR5LAorICAgICBDYWxpZm9ybmlhLCB3aXRoIHRoZSBsb3NpbmcgcGFydHkgcmVzcG9uc2libGUgZm9yIGNvc3RzLCBpbmNsdWRpbmcKKyAgICAgd2l0aG91dCBsaW1pdGF0aW9uLCBjb3VydCBjb3N0cyBhbmQgcmVhc29uYWJsZSBhdHRvcm5leXMnIGZlZXMgYW5kCisgICAgIGV4cGVuc2VzLiBUaGUgYXBwbGljYXRpb24gb2YgdGhlIFVuaXRlZCBOYXRpb25zIENvbnZlbnRpb24gb24KKyAgICAgQ29udHJhY3RzIGZvciB0aGUgSW50ZXJuYXRpb25hbCBTYWxlIG9mIEdvb2RzIGlzIGV4cHJlc3NseSBleGNsdWRlZC4KKyAgICAgQW55IGxhdyBvciByZWd1bGF0aW9uIHdoaWNoIHByb3ZpZGVzIHRoYXQgdGhlIGxhbmd1YWdlIG9mIGEgY29udHJhY3QKKyAgICAgc2hhbGwgYmUgY29uc3RydWVkIGFnYWluc3QgdGhlIGRyYWZ0ZXIgc2hhbGwgbm90IGFwcGx5IHRvIHRoaXMKKyAgICAgTGljZW5zZS4KKworMTIuIFJFU1BPTlNJQklMSVRZIEZPUiBDTEFJTVMuCisKKyAgICAgQXMgYmV0d2VlbiBJbml0aWFsIERldmVsb3BlciBhbmQgdGhlIENvbnRyaWJ1dG9ycywgZWFjaCBwYXJ0eSBpcworICAgICByZXNwb25zaWJsZSBmb3IgY2xhaW1zIGFuZCBkYW1hZ2VzIGFyaXNpbmcsIGRpcmVjdGx5IG9yIGluZGlyZWN0bHksCisgICAgIG91dCBvZiBpdHMgdXRpbGl6YXRpb24gb2YgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZSBhbmQgWW91IGFncmVlIHRvCisgICAgIHdvcmsgd2l0aCBJbml0aWFsIERldmVsb3BlciBhbmQgQ29udHJpYnV0b3JzIHRvIGRpc3RyaWJ1dGUgc3VjaAorICAgICByZXNwb25zaWJpbGl0eSBvbiBhbiBlcXVpdGFibGUgYmFzaXMuIE5vdGhpbmcgaGVyZWluIGlzIGludGVuZGVkIG9yCisgICAgIHNoYWxsIGJlIGRlZW1lZCB0byBjb25zdGl0dXRlIGFueSBhZG1pc3Npb24gb2YgbGlhYmlsaXR5LgorCisxMy4gTVVMVElQTEUtTElDRU5TRUQgQ09ERS4KKworICAgICBJbml0aWFsIERldmVsb3BlciBtYXkgZGVzaWduYXRlIHBvcnRpb25zIG9mIHRoZSBDb3ZlcmVkIENvZGUgYXMKKyAgICAgIk11bHRpcGxlLUxpY2Vuc2VkIi4gIk11bHRpcGxlLUxpY2Vuc2VkIiBtZWFucyB0aGF0IHRoZSBJbml0aWFsCisgICAgIERldmVsb3BlciBwZXJtaXRzIHlvdSB0byB1dGlsaXplIHBvcnRpb25zIG9mIHRoZSBDb3ZlcmVkIENvZGUgdW5kZXIKKyAgICAgWW91ciBjaG9pY2Ugb2YgdGhlIE5QTCBvciB0aGUgYWx0ZXJuYXRpdmUgbGljZW5zZXMsIGlmIGFueSwgc3BlY2lmaWVkCisgICAgIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBpbiB0aGUgZmlsZSBkZXNjcmliZWQgaW4gRXhoaWJpdCBBLgorCitFWEhJQklUIEEgLU1vemlsbGEgUHVibGljIExpY2Vuc2UuCisKKyAgICAgYGBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlCisgICAgIFZlcnNpb24gMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4KKyAgICAgY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgICAgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCisKKyAgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIgorICAgICBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICAgICBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMKKyAgICAgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyAgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18uCisKKyAgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIF9fX19fX19fX19fX19fX19fX19fX19fXy4KKyAgICAgUG9ydGlvbnMgY3JlYXRlZCBieSBfX19fX19fX19fX19fX19fX19fX19fIGFyZSBDb3B5cmlnaHQgKEMpIF9fX19fXworICAgICBfX19fX19fX19fX19fX19fX19fX19fXy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICAgICBDb250cmlidXRvcihzKTogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18uCisKKyAgICAgQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMKKyAgICAgb2YgdGhlIF9fX19fIGxpY2Vuc2UgKHRoZSAiW19fX10gTGljZW5zZSIpLCBpbiB3aGljaCBjYXNlIHRoZQorICAgICBwcm92aXNpb25zIG9mIFtfX19fX19dIExpY2Vuc2UgYXJlIGFwcGxpY2FibGUgaW5zdGVhZCBvZiB0aG9zZQorICAgICBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQorICAgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIFtfX19fXSBMaWNlbnNlIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVzZQorICAgICB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSBNUEwsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkKKyAgICAgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UgYW5kCisgICAgIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIFtfX19dIExpY2Vuc2UuIElmIHlvdSBkbyBub3QgZGVsZXRlCisgICAgIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUKKyAgICAgdW5kZXIgZWl0aGVyIHRoZSBNUEwgb3IgdGhlIFtfX19dIExpY2Vuc2UuIgorCisgICAgIFtOT1RFOiBUaGUgdGV4dCBvZiB0aGlzIEV4aGliaXQgQSBtYXkgZGlmZmVyIHNsaWdodGx5IGZyb20gdGhlIHRleHQgb2YKKyAgICAgdGhlIG5vdGljZXMgaW4gdGhlIFNvdXJjZSBDb2RlIGZpbGVzIG9mIHRoZSBPcmlnaW5hbCBDb2RlLiBZb3Ugc2hvdWxkCisgICAgIHVzZSB0aGUgdGV4dCBvZiB0aGlzIEV4aGliaXQgQSByYXRoZXIgdGhhbiB0aGUgdGV4dCBmb3VuZCBpbiB0aGUKKyAgICAgT3JpZ2luYWwgQ29kZSBTb3VyY2UgQ29kZSBmb3IgWW91ciBNb2RpZmljYXRpb25zLl0KKworICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgQU1FTkRNRU5UUworCisgICAgIFRoZSBOZXRzY2FwZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoIk5QTCIpIGNvbnNpc3RzIG9mIHRoZQorICAgICBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIHdpdGggdGhlIGZvbGxvd2luZyBBbWVuZG1lbnRzLAorICAgICBpbmNsdWRpbmcgRXhoaWJpdCBBLU5ldHNjYXBlIFB1YmxpYyBMaWNlbnNlLiBGaWxlcyBpZGVudGlmaWVkIHdpdGgKKyAgICAgIkV4aGliaXQgQS1OZXRzY2FwZSBQdWJsaWMgTGljZW5zZSIgYXJlIGdvdmVybmVkIGJ5IHRoZSBOZXRzY2FwZQorICAgICBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMS4KKworICAgICBBZGRpdGlvbmFsIFRlcm1zIGFwcGxpY2FibGUgdG8gdGhlIE5ldHNjYXBlIFB1YmxpYyBMaWNlbnNlLgorICAgICAgICAgIEkuIEVmZmVjdC4KKyAgICAgICAgICBUaGVzZSBhZGRpdGlvbmFsIHRlcm1zIGRlc2NyaWJlZCBpbiB0aGlzIE5ldHNjYXBlIFB1YmxpYworICAgICAgICAgIExpY2Vuc2UgLS0gQW1lbmRtZW50cyBzaGFsbCBhcHBseSB0byB0aGUgTW96aWxsYSBDb21tdW5pY2F0b3IKKyAgICAgICAgICBjbGllbnQgY29kZSBhbmQgdG8gYWxsIENvdmVyZWQgQ29kZSB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgICAgICAgICBJSS4gIk5ldHNjYXBlJ3MgQnJhbmRlZCBDb2RlIiBtZWFucyBDb3ZlcmVkIENvZGUgdGhhdCBOZXRzY2FwZQorICAgICAgICAgIGRpc3RyaWJ1dGVzIGFuZC9vciBwZXJtaXRzIG90aGVycyB0byBkaXN0cmlidXRlIHVuZGVyIG9uZSBvciBtb3JlCisgICAgICAgICAgdHJhZGVtYXJrKHMpIHdoaWNoIGFyZSBjb250cm9sbGVkIGJ5IE5ldHNjYXBlIGJ1dCB3aGljaCBhcmUgbm90CisgICAgICAgICAgbGljZW5zZWQgZm9yIHVzZSB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgICAgICAgICBJSUkuIE5ldHNjYXBlIGFuZCBsb2dvLgorICAgICAgICAgIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBhbnkgcmlnaHRzIHRvIHVzZSB0aGUgdHJhZGVtYXJrcworICAgICAgICAgICJOZXRzY2FwZSIsIHRoZSAiTmV0c2NhcGUgTiBhbmQgaG9yaXpvbiIgbG9nbyBvciB0aGUgIk5ldHNjYXBlCisgICAgICAgICAgbGlnaHRob3VzZSIgbG9nbywgIk5ldGNlbnRlciIsICJHZWNrbyIsICJKYXZhIiBvciAiSmF2YVNjcmlwdCIsCisgICAgICAgICAgIlNtYXJ0IEJyb3dzaW5nIiBldmVuIGlmIHN1Y2ggbWFya3MgYXJlIGluY2x1ZGVkIGluIHRoZSBPcmlnaW5hbAorICAgICAgICAgIENvZGUgb3IgTW9kaWZpY2F0aW9ucy4KKworICAgICAgICAgIElWLiBJbmFiaWxpdHkgdG8gQ29tcGx5IER1ZSB0byBDb250cmFjdHVhbCBPYmxpZ2F0aW9uLgorICAgICAgICAgIFByaW9yIHRvIGxpY2Vuc2luZyB0aGUgT3JpZ2luYWwgQ29kZSB1bmRlciB0aGlzIExpY2Vuc2UsIE5ldHNjYXBlCisgICAgICAgICAgaGFzIGxpY2Vuc2VkIHRoaXJkIHBhcnR5IGNvZGUgZm9yIHVzZSBpbiBOZXRzY2FwZSdzIEJyYW5kZWQgQ29kZS4KKyAgICAgICAgICBUbyB0aGUgZXh0ZW50IHRoYXQgTmV0c2NhcGUgaXMgbGltaXRlZCBjb250cmFjdHVhbGx5IGZyb20gbWFraW5nCisgICAgICAgICAgc3VjaCB0aGlyZCBwYXJ0eSBjb2RlIGF2YWlsYWJsZSB1bmRlciB0aGlzIExpY2Vuc2UsIE5ldHNjYXBlIG1heQorICAgICAgICAgIGNob29zZSB0byByZWludGVncmF0ZSBzdWNoIGNvZGUgaW50byBDb3ZlcmVkIENvZGUgd2l0aG91dCBiZWluZworICAgICAgICAgIHJlcXVpcmVkIHRvIGRpc3RyaWJ1dGUgc3VjaCBjb2RlIGluIFNvdXJjZSBDb2RlIGZvcm0sIGV2ZW4gaWYKKyAgICAgICAgICBzdWNoIGNvZGUgd291bGQgb3RoZXJ3aXNlIGJlIGNvbnNpZGVyZWQgIk1vZGlmaWNhdGlvbnMiIHVuZGVyCisgICAgICAgICAgdGhpcyBMaWNlbnNlLgorCisgICAgICAgICAgVi4gVXNlIG9mIE1vZGlmaWNhdGlvbnMgYW5kIENvdmVyZWQgQ29kZSBieSBJbml0aWFsIERldmVsb3Blci4KKyAgICAgICAgICAgICAgIFYuMS4gSW4gR2VuZXJhbC4KKyAgICAgICAgICAgICAgIFRoZSBvYmxpZ2F0aW9ucyBvZiBTZWN0aW9uIDMgYXBwbHkgdG8gTmV0c2NhcGUsIGV4Y2VwdCB0bworICAgICAgICAgICAgICAgdGhlIGV4dGVudCBzcGVjaWZpZWQgaW4gdGhpcyBBbWVuZG1lbnQsIFNlY3Rpb24gVi4yIGFuZCBWLjMuCisKKyAgICAgICAgICAgICAgIFYuMi4gT3RoZXIgUHJvZHVjdHMuCisgICAgICAgICAgICAgICBOZXRzY2FwZSBtYXkgaW5jbHVkZSBDb3ZlcmVkIENvZGUgaW4gcHJvZHVjdHMgb3RoZXIgdGhhbiB0aGUKKyAgICAgICAgICAgICAgIE5ldHNjYXBlJ3MgQnJhbmRlZCBDb2RlIHdoaWNoIGFyZSByZWxlYXNlZCBieSBOZXRzY2FwZQorICAgICAgICAgICAgICAgZHVyaW5nIHRoZSB0d28gKDIpIHllYXJzIGZvbGxvd2luZyB0aGUgcmVsZWFzZSBkYXRlIG9mIHRoZQorICAgICAgICAgICAgICAgT3JpZ2luYWwgQ29kZSwgd2l0aG91dCBzdWNoIGFkZGl0aW9uYWwgcHJvZHVjdHMgYmVjb21pbmcKKyAgICAgICAgICAgICAgIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSwgYW5kIG1heSBsaWNlbnNlIHN1Y2gKKyAgICAgICAgICAgICAgIGFkZGl0aW9uYWwgcHJvZHVjdHMgb24gZGlmZmVyZW50IHRlcm1zIGZyb20gdGhvc2UgY29udGFpbmVkCisgICAgICAgICAgICAgICBpbiB0aGlzIExpY2Vuc2UuCisKKyAgICAgICAgICAgICAgIFYuMy4gQWx0ZXJuYXRpdmUgTGljZW5zaW5nLgorICAgICAgICAgICAgICAgTmV0c2NhcGUgbWF5IGxpY2Vuc2UgdGhlIFNvdXJjZSBDb2RlIG9mIE5ldHNjYXBlJ3MgQnJhbmRlZAorICAgICAgICAgICAgICAgQ29kZSwgaW5jbHVkaW5nIE1vZGlmaWNhdGlvbnMgaW5jb3Jwb3JhdGVkIHRoZXJlaW4sIHdpdGhvdXQKKyAgICAgICAgICAgICAgIHN1Y2ggTmV0c2NhcGUgQnJhbmRlZCBDb2RlIGJlY29taW5nIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mCisgICAgICAgICAgICAgICB0aGlzIExpY2Vuc2UsIGFuZCBtYXkgbGljZW5zZSBzdWNoIE5ldHNjYXBlIEJyYW5kZWQgQ29kZSBvbgorICAgICAgICAgICAgICAgZGlmZmVyZW50IHRlcm1zIGZyb20gdGhvc2UgY29udGFpbmVkIGluIHRoaXMgTGljZW5zZS4KKworICAgICAgICAgIFZJLiBMaXRpZ2F0aW9uLgorICAgICAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgbGltaXRhdGlvbnMgb2YgU2VjdGlvbiAxMSBhYm92ZSwgdGhlCisgICAgICAgICAgcHJvdmlzaW9ucyByZWdhcmRpbmcgbGl0aWdhdGlvbiBpbiBTZWN0aW9uIDExKGEpLCAoYikgYW5kIChjKSBvZgorICAgICAgICAgIHRoZSBMaWNlbnNlIHNoYWxsIGFwcGx5IHRvIGFsbCBkaXNwdXRlcyByZWxhdGluZyB0byB0aGlzIExpY2Vuc2UuCisKKyAgICAgRVhISUJJVCBBLU5ldHNjYXBlIFB1YmxpYyBMaWNlbnNlLgorCisgICAgICAgICAgIlRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE5ldHNjYXBlIFB1YmxpYworICAgICAgICAgIExpY2Vuc2UgVmVyc2lvbiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisgICAgICAgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgICAgICAgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9OUEwvCisKKyAgICAgICAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMKKyAgICAgICAgICBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICAgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisgICAgICAgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworICAgICAgICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIE1vemlsbGEgQ29tbXVuaWNhdG9yIGNsaWVudCBjb2RlLCByZWxlYXNlZAorICAgICAgICAgIE1hcmNoIDMxLCAxOTk4LgorCisgICAgICAgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIE5ldHNjYXBlCisgICAgICAgICAgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uIFBvcnRpb25zIGNyZWF0ZWQgYnkgTmV0c2NhcGUgYXJlCisgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTk4LTE5OTkgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uIEFsbAorICAgICAgICAgIFJpZ2h0cyBSZXNlcnZlZC4KKworICAgICAgICAgIENvbnRyaWJ1dG9yKHMpOiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXy4KKworICAgICAgICAgIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlCisgICAgICAgICAgdGVybXMgb2YgdGhlIF9fX19fIGxpY2Vuc2UgKHRoZSAiW19fX10gTGljZW5zZSIpLCBpbiB3aGljaCBjYXNlCisgICAgICAgICAgdGhlIHByb3Zpc2lvbnMgb2YgW19fX19fX10gTGljZW5zZSBhcmUgYXBwbGljYWJsZSAgaW5zdGVhZCBvZgorICAgICAgICAgIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMKKyAgICAgICAgICBmaWxlIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBbX19fX10gTGljZW5zZSBhbmQgbm90IHRvIGFsbG93CisgICAgICAgICAgb3RoZXJzIHRvIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSBOUEwsIGluZGljYXRlCisgICAgICAgICAgeW91ciBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSAgdGhlbQorICAgICAgICAgIHdpdGggdGhlIG5vdGljZSBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgW19fX10KKyAgICAgICAgICBMaWNlbnNlLiBJZiB5b3UgZG8gbm90IGRlbGV0ZSB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQKKyAgICAgICAgICBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgZWl0aGVyIHRoZSBOUEwgb3IgdGhlCisgICAgICAgICAgW19fX10gTGljZW5zZS4iCisKKwkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisJCSAgICAgICBWZXJzaW9uIDIsIEp1bmUgMTk5MQorCisgQ29weXJpZ2h0IChDKSAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgICAgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKKyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworCQkJICAgIFByZWFtYmxlCisKKyAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgorZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUKK3NvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuICBUaGlzCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gbW9zdCBvZiB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZSBhdXRob3JzIGNvbW1pdCB0bwordXNpbmcgaXQuICAoU29tZSBvdGhlciBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUgaXMgY292ZXJlZCBieQordGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZC4pICBZb3UgY2FuIGFwcGx5IGl0IHRvCit5b3VyIHByb2dyYW1zLCB0b28uCisKKyAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAorcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQoraGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgordGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0CitpZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAoraW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgorCisgIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKK2FueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KK1RoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91CitkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuCisKKyAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlcgorZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0Cit5b3UgaGF2ZS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZQorc291cmNlIGNvZGUuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpcgorcmlnaHRzLgorCisgIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQgdGhlIHNvZnR3YXJlLCBhbmQKKygyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksCitkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIHNvZnR3YXJlLgorCisgIEFsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCit0aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZQorc29mdHdhcmUuICBJZiB0aGUgc29mdHdhcmUgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCit3YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsLCBzbwordGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbiB0aGUgb3JpZ2luYWwKK2F1dGhvcnMnIHJlcHV0YXRpb25zLgorCisgIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCitwYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgcmVkaXN0cmlidXRvcnMgb2YgYSBmcmVlCitwcm9ncmFtIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlCitwcm9ncmFtIHByb3ByaWV0YXJ5LiAgVG8gcHJldmVudCB0aGlzLCB3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkKK3BhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzIGZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCisKKyAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKK21vZGlmaWNhdGlvbiBmb2xsb3cuCisMCisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCisKKyAgMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucworYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKK3VuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUgIlByb2dyYW0iLCBiZWxvdywKK3JlZmVycyB0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIgorbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoKK3RoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsCitlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlcgorbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbgordGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCisKK0FjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Citjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCitydW5uaW5nIHRoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtCitpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4KK1doZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgorCisgIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncworc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91Citjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlCitjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlCitub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7CithbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlCithbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgorCitZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKK3lvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCisKKyAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbgorb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZAorZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCithYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgorCisgICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KKworICAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbgorICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQorICAgIHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkCisgICAgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgorCisgICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseQorICAgIHdoZW4gcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2gKKyAgICBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCisgICAgYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhCisgICAgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlCisgICAgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlcgorICAgIHRoZXNlIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzCisgICAgTGljZW5zZS4gIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQKKyAgICBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uCisgICAgdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCisMCitUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCitpZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLAorYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCit0aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCitzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKK2Rpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAorb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCit0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQorZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgorCitUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKK3lvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bworZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCitjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgorCitJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtCit3aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YKK2Egc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCit0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCisgIDMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LAordW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mCitTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKKyAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlCisgICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zCisgICAgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQorICAgIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyCisgICAgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgc291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZQorICAgIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUKKyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bQorICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyCisgICAgdG8gZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMKKyAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQorICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2gKKyAgICBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKKworVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgorbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UKK2NvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55Cithc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8KK2NvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIEhvd2V2ZXIsIGFzIGEKK3NwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZQorYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkKK2Zvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlCitvcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAoraXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLgorCitJZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nCithY2Nlc3MgdG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50CithY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMKK2Rpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAorY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KKwwKKyAgNC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCitleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueSBhdHRlbXB0CitvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMKK3ZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4KK0hvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLCBvciByaWdodHMsIGZyb20geW91IHVuZGVyCit0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaAorcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgorCisgIDUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAorc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKK2Rpc3RyaWJ1dGUgdGhlIFByb2dyYW0gb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQorcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQorbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAorYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwordGhlIFByb2dyYW0gb3Igd29ya3MgYmFzZWQgb24gaXQuCisKKyAgNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKK29yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUgb3IgbW9kaWZ5IHRoZSBQcm9ncmFtIHN1YmplY3QgdG8KK3RoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCityZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCitZb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0bwordGhpcyBMaWNlbnNlLgorCisgIDcuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKK2luZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCitjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCitvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CitleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAorZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcworTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQorbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAorbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieQorYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCit0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCityZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtLgorCitJZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKK2FueSBwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8KK2FwcGx5IGFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyCitjaXJjdW1zdGFuY2VzLgorCitJdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55CitwYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQorc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQoraW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0sIHdoaWNoIGlzCitpbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKK2dlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKK3Rocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0CitzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCit0byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKK2ltcG9zZSB0aGF0IGNob2ljZS4KKworVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCitiZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KKwwKKyAgOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4KK2NlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQorb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZQorbWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nCit0aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCitjb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKK3RoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgorCisgIDkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zCitvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKK2JlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bworYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCisKK0VhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0KK3NwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55CitsYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCitlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZgordGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbi4KKworICAxMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlCitwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yCit0byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcworbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMKK29mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQKK29mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgorCisJCQkgICAgTk8gV0FSUkFOVFkKKworICAxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKK0ZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTgorT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUworUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQKK09SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTCitUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFCitQUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywKK1JFUEFJUiBPUiBDT1JSRUNUSU9OLgorCisgIDEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKK1dJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IKK1JFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsCitJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcKK09VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQKK1RPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWQorWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIKK1BST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRQorUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorCisJCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisMCisJICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcworCisgIElmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKK3Bvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKK2ZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLgorCisgIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0Cit0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Citjb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdAordGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCisKKyAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgorICAgIENvcHlyaWdodCAoQykgMTl5eSAgPG5hbWUgb2YgYXV0aG9yPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQorCisKK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgorCitJZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzCit3aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgorCisgICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSAxOXl5IG5hbWUgb2YgYXV0aG9yCisgICAgR25vbW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgorICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKKyAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCisKK1RoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQorcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heQorYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleSBjb3VsZCBldmVuIGJlCittb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgorCitZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgorc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYKK25lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKKworICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZSBwcm9ncmFtCisgIGBHbm9tb3Zpc2lvbicgKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gYnkgSmFtZXMgSGFja2VyLgorCisgIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk4OQorICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQorCitUaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KK3Byb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5Citjb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKK2xpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuCisKK0NvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAwMCBUaGFpIE9wZW4gU291cmNlIFNvZnR3YXJlIENlbnRlciBMdGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgQ2xhcmsgQ29vcGVyCitDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgRXhwYXQgbWFpbnRhaW5lcnMuCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCit3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCitkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KK3Blcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwordGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAoraW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCitJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKK1RPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCitTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKworICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgorCisgICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZworICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgorICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKKyAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCisgICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKKyAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKKyAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgorICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgorCisgICBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKK0NvcHlyaWdodCAoYykgMjAwNy0yMDA5IElPTEEgYW5kIE9sZSBMYXVyc2VuCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCitvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCitjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCitTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKK2luY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKK0VYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKK05PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCitIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKK1dIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitUaGlzIHNvZnR3YXJlIGlzIGJhc2VkIGluIHBhcnQgb24gdGhlIHdvcmsgb2YgdGhlIEZyZWVUeXBlIFRlYW0uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICAgICBUaGUgRnJlZVR5cGUgUHJvamVjdCBMSUNFTlNFCisgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDYtSmFuLTI3CisKKyAgICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IDE5OTYtMjAwMiwgMjAwNiBieQorICAgICAgICAgIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZworCisKKworSW50cm9kdWN0aW9uCis9PT09PT09PT09PT0KKworICBUaGUgRnJlZVR5cGUgIFByb2plY3QgaXMgZGlzdHJpYnV0ZWQgaW4gIHNldmVyYWwgYXJjaGl2ZSBwYWNrYWdlczsKKyAgc29tZSBvZiB0aGVtIG1heSBjb250YWluLCBpbiBhZGRpdGlvbiB0byB0aGUgRnJlZVR5cGUgZm9udCBlbmdpbmUsCisgIHZhcmlvdXMgdG9vbHMgYW5kICBjb250cmlidXRpb25zIHdoaWNoIHJlbHkgb24sIG9yICByZWxhdGUgdG8sIHRoZQorICBGcmVlVHlwZSBQcm9qZWN0LgorCisgIFRoaXMgIGxpY2Vuc2UgYXBwbGllcyAgdG8gYWxsICBmaWxlcyBmb3VuZCAgaW4gc3VjaCAgcGFja2FnZXMsIGFuZAorICB3aGljaCBkbyBub3QgIGZhbGwgdW5kZXIgdGhlaXIgb3duIGV4cGxpY2l0ICBsaWNlbnNlLiAgVGhlIGxpY2Vuc2UKKyAgYWZmZWN0cyAgdGh1cyAgdGhlICBGcmVlVHlwZSAgIGZvbnQgIGVuZ2luZSwgIHRoZSAgdGVzdCAgcHJvZ3JhbXMsCisgIGRvY3VtZW50YXRpb24gYW5kIG1ha2VmaWxlcywgYXQgdGhlIHZlcnkgbGVhc3QuCisKKyAgVGhpcyAgbGljZW5zZSAgIHdhcyAgaW5zcGlyZWQgIGJ5ICB0aGUgIEJTRCwgICBBcnRpc3RpYywgIGFuZCAgSUpHCisgIChJbmRlcGVuZGVudCBKUEVHICBHcm91cCkgbGljZW5zZXMsIHdoaWNoICBhbGwgZW5jb3VyYWdlIGluY2x1c2lvbgorICBhbmQgIHVzZSBvZiAgZnJlZSAgc29mdHdhcmUgaW4gIGNvbW1lcmNpYWwgIGFuZCBmcmVld2FyZSAgcHJvZHVjdHMKKyAgYWxpa2UuICBBcyBhIGNvbnNlcXVlbmNlLCBpdHMgbWFpbiBwb2ludHMgYXJlIHRoYXQ6CisKKyAgICBvIFdlIGRvbid0IHByb21pc2UgdGhhdCB0aGlzIHNvZnR3YXJlIHdvcmtzLiBIb3dldmVyLCB3ZSB3aWxsIGJlCisgICAgICBpbnRlcmVzdGVkIGluIGFueSBraW5kIG9mIGJ1ZyByZXBvcnRzLiAoYGFzIGlzJyBkaXN0cmlidXRpb24pCisKKyAgICBvIFlvdSBjYW4gIHVzZSB0aGlzIHNvZnR3YXJlIGZvciB3aGF0ZXZlciB5b3UgIHdhbnQsIGluIHBhcnRzIG9yCisgICAgICBmdWxsIGZvcm0sIHdpdGhvdXQgaGF2aW5nIHRvIHBheSB1cy4gKGByb3lhbHR5LWZyZWUnIHVzYWdlKQorCisgICAgbyBZb3UgbWF5IG5vdCBwcmV0ZW5kIHRoYXQgIHlvdSB3cm90ZSB0aGlzIHNvZnR3YXJlLiAgSWYgeW91IHVzZQorICAgICAgaXQsIG9yICBvbmx5IHBhcnRzIG9mIGl0LCAgaW4gYSBwcm9ncmFtLCAgeW91IG11c3QgYWNrbm93bGVkZ2UKKyAgICAgIHNvbWV3aGVyZSAgaW4gIHlvdXIgIGRvY3VtZW50YXRpb24gIHRoYXQgIHlvdSAgaGF2ZSAgdXNlZCAgdGhlCisgICAgICBGcmVlVHlwZSBjb2RlLiAoYGNyZWRpdHMnKQorCisgIFdlICBzcGVjaWZpY2FsbHkgIHBlcm1pdCAgYW5kICBlbmNvdXJhZ2UgIHRoZSAgaW5jbHVzaW9uICBvZiAgdGhpcworICBzb2Z0d2FyZSwgd2l0aCAgb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCAgaW4gY29tbWVyY2lhbCBwcm9kdWN0cy4KKyAgV2UgIGRpc2NsYWltICBhbGwgd2FycmFudGllcyAgY292ZXJpbmcgIFRoZSAgRnJlZVR5cGUgUHJvamVjdCAgYW5kCisgIGFzc3VtZSBubyBsaWFiaWxpdHkgcmVsYXRlZCB0byBUaGUgRnJlZVR5cGUgUHJvamVjdC4KKworCisgIEZpbmFsbHksICBtYW55ICBwZW9wbGUgIGFza2VkICB1cyAgZm9yICBhICBwcmVmZXJyZWQgIGZvcm0gIGZvciAgYQorICBjcmVkaXQvZGlzY2xhaW1lciB0byB1c2UgaW4gY29tcGxpYW5jZSB3aXRoIHRoaXMgbGljZW5zZS4gIFdlIHRodXMKKyAgZW5jb3VyYWdlIHlvdSB0byB1c2UgdGhlIGZvbGxvd2luZyB0ZXh0OgorCisgICAiIiIgIAorICAgIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgYXJlIGNvcHlyaWdodCCpIDx5ZWFyPiBUaGUgRnJlZVR5cGUKKyAgICBQcm9qZWN0ICh3d3cuZnJlZXR5cGUub3JnKS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgICAiIiIKKworICBQbGVhc2UgcmVwbGFjZSA8eWVhcj4gd2l0aCB0aGUgdmFsdWUgZnJvbSB0aGUgRnJlZVR5cGUgdmVyc2lvbiB5b3UKKyAgYWN0dWFsbHkgdXNlLgorCisKK0xlZ2FsIFRlcm1zCis9PT09PT09PT09PQorCiswLiBEZWZpbml0aW9ucworLS0tLS0tLS0tLS0tLS0KKworICBUaHJvdWdob3V0IHRoaXMgbGljZW5zZSwgIHRoZSB0ZXJtcyBgcGFja2FnZScsIGBGcmVlVHlwZSBQcm9qZWN0JywKKyAgYW5kICBgRnJlZVR5cGUgIGFyY2hpdmUnIHJlZmVyICB0byAgdGhlICBzZXQgIG9mIGZpbGVzICBvcmlnaW5hbGx5CisgIGRpc3RyaWJ1dGVkICBieSB0aGUgIGF1dGhvcnMgIChEYXZpZCBUdXJuZXIsICBSb2JlcnQgV2lsaGVsbSwgIGFuZAorICBXZXJuZXIgTGVtYmVyZykgYXMgdGhlIGBGcmVlVHlwZSBQcm9qZWN0JywgYmUgdGhleSBuYW1lZCBhcyBhbHBoYSwKKyAgYmV0YSBvciBmaW5hbCByZWxlYXNlLgorCisgIGBZb3UnIHJlZmVycyB0byAgdGhlIGxpY2Vuc2VlLCBvciBwZXJzb24gdXNpbmcgIHRoZSBwcm9qZWN0LCB3aGVyZQorICBgdXNpbmcnIGlzIGEgZ2VuZXJpYyB0ZXJtIGluY2x1ZGluZyBjb21waWxpbmcgdGhlIHByb2plY3QncyBzb3VyY2UKKyAgY29kZSBhcyAgd2VsbCBhcyBsaW5raW5nIGl0ICB0byBmb3JtIGEgIGBwcm9ncmFtJyBvciBgZXhlY3V0YWJsZScuCisgIFRoaXMgIHByb2dyYW0gaXMgIHJlZmVycmVkIHRvICBhcyAgYGEgcHJvZ3JhbSAgdXNpbmcgdGhlICBGcmVlVHlwZQorICBlbmdpbmUnLgorCisgIFRoaXMgIGxpY2Vuc2UgYXBwbGllcyAgdG8gYWxsICBmaWxlcyBkaXN0cmlidXRlZCAgaW4gIHRoZSBvcmlnaW5hbAorICBGcmVlVHlwZSAgUHJvamVjdCwgICBpbmNsdWRpbmcgIGFsbCAgc291cmNlICAgY29kZSwgIGJpbmFyaWVzICBhbmQKKyAgZG9jdW1lbnRhdGlvbiwgIHVubGVzcyAgb3RoZXJ3aXNlICBzdGF0ZWQgICBpbiAgdGhlICBmaWxlICBpbiAgaXRzCisgIG9yaWdpbmFsLCB1bm1vZGlmaWVkIGZvcm0gYXMgIGRpc3RyaWJ1dGVkIGluIHRoZSBvcmlnaW5hbCBhcmNoaXZlLgorICBJZiB5b3UgYXJlICB1bnN1cmUgd2hldGhlciBvciBub3QgYSBwYXJ0aWN1bGFyICBmaWxlIGlzIGNvdmVyZWQgYnkKKyAgdGhpcyBsaWNlbnNlLCB5b3UgbXVzdCBjb250YWN0IHVzIHRvIHZlcmlmeSB0aGlzLgorCisgIFRoZSBGcmVlVHlwZSAgUHJvamVjdCBpcyBjb3B5cmlnaHQgKEMpIDE5OTYtMjAwMCAgYnkgRGF2aWQgVHVybmVyLAorICBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgQWxsIHJpZ2h0cyByZXNlcnZlZCBleGNlcHQgYXMKKyAgc3BlY2lmaWVkIGJlbG93LgorCisxLiBObyBXYXJyYW50eQorLS0tLS0tLS0tLS0tLS0KKworICBUSEUgRlJFRVRZUEUgUFJPSkVDVCAgSVMgUFJPVklERUQgYEFTIElTJyBXSVRIT1VUICBXQVJSQU5UWSBPRiBBTlkKKyAgS0lORCwgRUlUSEVSICBFWFBSRVNTIE9SIElNUExJRUQsICBJTkNMVURJTkcsIEJVVCBOT1QgIExJTUlURUQgVE8sCisgIFdBUlJBTlRJRVMgIE9GICBNRVJDSEFOVEFCSUxJVFkgICBBTkQgIEZJVE5FU1MgIEZPUiAgQSAgUEFSVElDVUxBUgorICBQVVJQT1NFLiAgSU4gTk8gRVZFTlQgV0lMTCBBTlkgT0YgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAgQkUgTElBQkxFICBGT1IgQU5ZIERBTUFHRVMgQ0FVU0VEICBCWSBUSEUgVVNFIE9SICBUSEUgSU5BQklMSVRZIFRPCisgIFVTRSwgT0YgVEhFIEZSRUVUWVBFIFBST0pFQ1QuCisKKzIuIFJlZGlzdHJpYnV0aW9uCistLS0tLS0tLS0tLS0tLS0tLQorCisgIFRoaXMgIGxpY2Vuc2UgIGdyYW50cyAgYSAgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUsICBwZXJwZXR1YWwgIGFuZAorICBpcnJldm9jYWJsZSByaWdodCAgYW5kIGxpY2Vuc2UgdG8gdXNlLCAgZXhlY3V0ZSwgcGVyZm9ybSwgY29tcGlsZSwKKyAgZGlzcGxheSwgIGNvcHksICAgY3JlYXRlICBkZXJpdmF0aXZlICB3b3JrcyAgIG9mLCAgZGlzdHJpYnV0ZSAgYW5kCisgIHN1YmxpY2Vuc2UgdGhlICBGcmVlVHlwZSBQcm9qZWN0IChpbiAgYm90aCBzb3VyY2UgYW5kICBvYmplY3QgY29kZQorICBmb3JtcykgIGFuZCAgZGVyaXZhdGl2ZSB3b3JrcyAgdGhlcmVvZiAgZm9yICBhbnkgIHB1cnBvc2U7IGFuZCAgdG8KKyAgYXV0aG9yaXplIG90aGVycyAgdG8gZXhlcmNpc2UgIHNvbWUgb3IgYWxsICBvZiB0aGUgIHJpZ2h0cyBncmFudGVkCisgIGhlcmVpbiwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICBvIFJlZGlzdHJpYnV0aW9uIG9mICBzb3VyY2UgY29kZSAgbXVzdCByZXRhaW4gdGhpcyAgbGljZW5zZSBmaWxlCisgICAgICAoYEZUTC5UWFQnKSB1bmFsdGVyZWQ7IGFueSAgYWRkaXRpb25zLCBkZWxldGlvbnMgb3IgY2hhbmdlcyB0bworICAgICAgdGhlIG9yaWdpbmFsICBmaWxlcyBtdXN0IGJlIGNsZWFybHkgIGluZGljYXRlZCBpbiBhY2NvbXBhbnlpbmcKKyAgICAgIGRvY3VtZW50YXRpb24uICAgVGhlICBjb3B5cmlnaHQgICBub3RpY2VzICBvZiAgdGhlICB1bmFsdGVyZWQsCisgICAgICBvcmlnaW5hbCAgZmlsZXMgbXVzdCAgYmUgIHByZXNlcnZlZCBpbiAgYWxsICBjb3BpZXMgb2YgIHNvdXJjZQorICAgICAgZmlsZXMuCisKKyAgICBvIFJlZGlzdHJpYnV0aW9uIGluIGJpbmFyeSBmb3JtIG11c3QgcHJvdmlkZSBhICBkaXNjbGFpbWVyICB0aGF0CisgICAgICBzdGF0ZXMgIHRoYXQgIHRoZSBzb2Z0d2FyZSBpcyBiYXNlZCBpbiBwYXJ0IG9mIHRoZSB3b3JrIG9mIHRoZQorICAgICAgRnJlZVR5cGUgVGVhbSwgIGluICB0aGUgIGRpc3RyaWJ1dGlvbiAgZG9jdW1lbnRhdGlvbi4gIFdlIGFsc28KKyAgICAgIGVuY291cmFnZSB5b3UgdG8gcHV0IGFuIFVSTCB0byB0aGUgRnJlZVR5cGUgd2ViIHBhZ2UgIGluICB5b3VyCisgICAgICBkb2N1bWVudGF0aW9uLCB0aG91Z2ggdGhpcyBpc24ndCBtYW5kYXRvcnkuCisKKyAgVGhlc2UgY29uZGl0aW9ucyAgYXBwbHkgdG8gYW55ICBzb2Z0d2FyZSBkZXJpdmVkIGZyb20gb3IgIGJhc2VkIG9uCisgIHRoZSBGcmVlVHlwZSBQcm9qZWN0LCAgbm90IGp1c3QgdGhlIHVubW9kaWZpZWQgZmlsZXMuICAgSWYgeW91IHVzZQorICBvdXIgd29yaywgeW91ICBtdXN0IGFja25vd2xlZGdlIHVzLiAgSG93ZXZlciwgbm8gIGZlZSBuZWVkIGJlIHBhaWQKKyAgdG8gdXMuCisKKzMuIEFkdmVydGlzaW5nCistLS0tLS0tLS0tLS0tLQorCisgIE5laXRoZXIgdGhlICBGcmVlVHlwZSBhdXRob3JzIGFuZCAgY29udHJpYnV0b3JzIG5vciB5b3UgIHNoYWxsIHVzZQorICB0aGUgbmFtZSBvZiB0aGUgIG90aGVyIGZvciBjb21tZXJjaWFsLCBhZHZlcnRpc2luZywgb3IgcHJvbW90aW9uYWwKKyAgcHVycG9zZXMgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyAgV2Ugc3VnZ2VzdCwgIGJ1dCBkbyBub3QgcmVxdWlyZSwgdGhhdCAgeW91IHVzZSBvbmUgb3IgIG1vcmUgb2YgdGhlCisgIGZvbGxvd2luZyBwaHJhc2VzIHRvIHJlZmVyICB0byB0aGlzIHNvZnR3YXJlIGluIHlvdXIgZG9jdW1lbnRhdGlvbgorICBvciBhZHZlcnRpc2luZyAgbWF0ZXJpYWxzOiBgRnJlZVR5cGUgUHJvamVjdCcsICBgRnJlZVR5cGUgRW5naW5lJywKKyAgYEZyZWVUeXBlIGxpYnJhcnknLCBvciBgRnJlZVR5cGUgRGlzdHJpYnV0aW9uJy4KKworICBBcyAgeW91IGhhdmUgIG5vdCBzaWduZWQgIHRoaXMgbGljZW5zZSwgIHlvdSBhcmUgIG5vdCAgcmVxdWlyZWQgdG8KKyAgYWNjZXB0ICBpdC4gICBIb3dldmVyLCAgYXMgIHRoZSBGcmVlVHlwZSAgUHJvamVjdCAgaXMgIGNvcHlyaWdodGVkCisgIG1hdGVyaWFsLCBvbmx5ICB0aGlzIGxpY2Vuc2UsIG9yICBhbm90aGVyIG9uZSBjb250cmFjdGVkICB3aXRoIHRoZQorICBhdXRob3JzLCBncmFudHMgeW91ICB0aGUgcmlnaHQgdG8gdXNlLCBkaXN0cmlidXRlLCAgYW5kIG1vZGlmeSBpdC4KKyAgVGhlcmVmb3JlLCAgYnkgIHVzaW5nLCAgZGlzdHJpYnV0aW5nLCAgb3IgbW9kaWZ5aW5nICB0aGUgIEZyZWVUeXBlCisgIFByb2plY3QsIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgYWxsIHRoZSB0ZXJtcworICBvZiB0aGlzIGxpY2Vuc2UuCisKKzQuIENvbnRhY3RzCistLS0tLS0tLS0tLQorCisgIFRoZXJlIGFyZSB0d28gbWFpbGluZyBsaXN0cyByZWxhdGVkIHRvIEZyZWVUeXBlOgorCisgICAgbyBmcmVldHlwZUBub25nbnUub3JnCisKKyAgICAgIERpc2N1c3NlcyBnZW5lcmFsIHVzZSBhbmQgYXBwbGljYXRpb25zIG9mIEZyZWVUeXBlLCBhcyB3ZWxsIGFzCisgICAgICBmdXR1cmUgYW5kICB3YW50ZWQgYWRkaXRpb25zIHRvIHRoZSAgbGlicmFyeSBhbmQgZGlzdHJpYnV0aW9uLgorICAgICAgSWYgIHlvdSBhcmUgbG9va2luZyAgZm9yIHN1cHBvcnQsICBzdGFydCBpbiAgdGhpcyBsaXN0ICBpZiB5b3UKKyAgICAgIGhhdmVuJ3QgZm91bmQgYW55dGhpbmcgdG8gaGVscCB5b3UgaW4gdGhlIGRvY3VtZW50YXRpb24uCisKKyAgICBvIGZyZWV0eXBlLWRldmVsQG5vbmdudS5vcmcKKworICAgICAgRGlzY3Vzc2VzIGJ1Z3MsICBhcyB3ZWxsICBhcyBlbmdpbmUgaW50ZXJuYWxzLCAgZGVzaWduIGlzc3VlcywKKyAgICAgIHNwZWNpZmljIGxpY2Vuc2VzLCBwb3J0aW5nLCBldGMuCisKKyAgT3VyIGhvbWUgcGFnZSBjYW4gYmUgZm91bmQgYXQKKworICAgIGh0dHA6Ly93d3cuZnJlZXR5cGUub3JnCisKKworLS0tIGVuZCBvZiBGVEwuVFhUIC0tLQorCisvLyBDb3B5cmlnaHQgKGMpIDIwMTMgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKwkJCUNPUFlSSUdIVFMKKworQ29tcGlsYXRpb24gY29weXJpZ2h0IGlzIGhlbGQgYnkgdGhlIEdQU0QgcHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKK0dQU0QgcHJvamVjdCBjb3B5cmlnaHRzIGFyZSBhc3NpZ25lZCB0byB0aGUgcHJvamVjdCBsZWFkLCBjdXJyZW50bHkKK0VyaWMgUy4gUmF5bW9uZC4gT3RoZXIgcG9ydGlvbnMgb2YgdGhlIEdQU0QgY29kZSBhcmUgQ29weXJpZ2h0IChjKQorMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiBieSBSZW1jbyBUcmVmZmtvcm4sIGFuZCBvdGhlcnMKK0NvcHlyaWdodCAoYykgMjAwNSBieSBFcmljIFMuIFJheW1vbmQuICBGb3Igb3RoZXIgY29weXJpZ2h0cywgc2VlCitpbmRpdmlkdWFsIGZpbGVzLgorCisJCQlCU0QgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworYXJlIG1ldDo8UD4KKworUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKK25vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci48UD4KKworUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKK25vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKK2RvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uPFA+CisKK05laXRoZXIgbmFtZSBvZiB0aGUgR1BTRCBwcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCit3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCitBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKK0VYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKK1BST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKK05FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKwkJICBHTlUgTElCUkFSWSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisJCSAgICAgICBWZXJzaW9uIDIsIEp1bmUgMTk5MQorCisgQ29weXJpZ2h0IChDKSAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgIAkJICAgIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKKyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworW1RoaXMgaXMgdGhlIGZpcnN0IHJlbGVhc2VkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgR1BMLiAgSXQgaXMKKyBudW1iZXJlZCAyIGJlY2F1c2UgaXQgZ29lcyB3aXRoIHZlcnNpb24gMiBvZiB0aGUgb3JkaW5hcnkgR1BMLl0KKworCQkJICAgIFByZWFtYmxlCisKKyAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgorZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2VzIGFyZSBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UKK2ZyZWUgc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4KKworICBUaGlzIGxpY2Vuc2UsIHRoZSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFwcGxpZXMgdG8gc29tZQorc3BlY2lhbGx5IGRlc2lnbmF0ZWQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlLCBhbmQgdG8gYW55CitvdGhlciBsaWJyYXJpZXMgd2hvc2UgYXV0aG9ycyBkZWNpZGUgdG8gdXNlIGl0LiAgWW91IGNhbiB1c2UgaXQgZm9yCit5b3VyIGxpYnJhcmllcywgdG9vLgorCisgIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKK3ByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKK2hhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKK3RoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAoraWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQKK2luIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KKworICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCithbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuCitUaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmCit5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIGxpYnJhcnksIG9yIGlmIHlvdSBtb2RpZnkgaXQuCisKKyAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSwgd2hldGhlciBncmF0aXMKK29yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0IHdlIGdhdmUKK3lvdS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZSBzb3VyY2UKK2NvZGUuICBJZiB5b3UgbGluayBhIHByb2dyYW0gd2l0aCB0aGUgbGlicmFyeSwgeW91IG11c3QgcHJvdmlkZQorY29tcGxldGUgb2JqZWN0IGZpbGVzIHRvIHRoZSByZWNpcGllbnRzIHNvIHRoYXQgdGhleSBjYW4gcmVsaW5rIHRoZW0KK3dpdGggdGhlIGxpYnJhcnksIGFmdGVyIG1ha2luZyBjaGFuZ2VzIHRvIHRoZSBsaWJyYXJ5IGFuZCByZWNvbXBpbGluZworaXQuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpciByaWdodHMuCisKKyAgT3VyIG1ldGhvZCBvZiBwcm90ZWN0aW5nIHlvdXIgcmlnaHRzIGhhcyB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQKK3RoZSBsaWJyYXJ5LCBhbmQgKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsCitwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgbGlicmFyeS4KKworICBBbHNvLCBmb3IgZWFjaCBkaXN0cmlidXRvcidzIHByb3RlY3Rpb24sIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCit0aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZQorbGlicmFyeS4gIElmIHRoZSBsaWJyYXJ5IGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQord2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbAordmVyc2lvbiwgc28gdGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbgordGhlIG9yaWdpbmFsIGF1dGhvcnMnIHJlcHV0YXRpb25zLgorDAorICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZQorcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IGNvbXBhbmllcyBkaXN0cmlidXRpbmcgZnJlZQorc29mdHdhcmUgd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgdGh1cyBpbiBlZmZlY3QKK3RyYW5zZm9ybWluZyB0aGUgcHJvZ3JhbSBpbnRvIHByb3ByaWV0YXJ5IHNvZnR3YXJlLiAgVG8gcHJldmVudCB0aGlzLAord2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55IHBhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzCitmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgorCisgIE1vc3QgR05VIHNvZnR3YXJlLCBpbmNsdWRpbmcgc29tZSBsaWJyYXJpZXMsIGlzIGNvdmVyZWQgYnkgdGhlIG9yZGluYXJ5CitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgd2hpY2ggd2FzIGRlc2lnbmVkIGZvciB1dGlsaXR5IHByb2dyYW1zLiAgVGhpcworbGljZW5zZSwgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFwcGxpZXMgdG8gY2VydGFpbgorZGVzaWduYXRlZCBsaWJyYXJpZXMuICBUaGlzIGxpY2Vuc2UgaXMgcXVpdGUgZGlmZmVyZW50IGZyb20gdGhlIG9yZGluYXJ5CitvbmU7IGJlIHN1cmUgdG8gcmVhZCBpdCBpbiBmdWxsLCBhbmQgZG9uJ3QgYXNzdW1lIHRoYXQgYW55dGhpbmcgaW4gaXQgaXMKK3RoZSBzYW1lIGFzIGluIHRoZSBvcmRpbmFyeSBsaWNlbnNlLgorCisgIFRoZSByZWFzb24gd2UgaGF2ZSBhIHNlcGFyYXRlIHB1YmxpYyBsaWNlbnNlIGZvciBzb21lIGxpYnJhcmllcyBpcyB0aGF0Cit0aGV5IGJsdXIgdGhlIGRpc3RpbmN0aW9uIHdlIHVzdWFsbHkgbWFrZSBiZXR3ZWVuIG1vZGlmeWluZyBvciBhZGRpbmcgdG8gYQorcHJvZ3JhbSBhbmQgc2ltcGx5IHVzaW5nIGl0LiAgTGlua2luZyBhIHByb2dyYW0gd2l0aCBhIGxpYnJhcnksIHdpdGhvdXQKK2NoYW5naW5nIHRoZSBsaWJyYXJ5LCBpcyBpbiBzb21lIHNlbnNlIHNpbXBseSB1c2luZyB0aGUgbGlicmFyeSwgYW5kIGlzCithbmFsb2dvdXMgdG8gcnVubmluZyBhIHV0aWxpdHkgcHJvZ3JhbSBvciBhcHBsaWNhdGlvbiBwcm9ncmFtLiAgSG93ZXZlciwgaW4KK2EgdGV4dHVhbCBhbmQgbGVnYWwgc2Vuc2UsIHRoZSBsaW5rZWQgZXhlY3V0YWJsZSBpcyBhIGNvbWJpbmVkIHdvcmssIGEKK2Rlcml2YXRpdmUgb2YgdGhlIG9yaWdpbmFsIGxpYnJhcnksIGFuZCB0aGUgb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQordHJlYXRzIGl0IGFzIHN1Y2guCisKKyAgQmVjYXVzZSBvZiB0aGlzIGJsdXJyZWQgZGlzdGluY3Rpb24sIHVzaW5nIHRoZSBvcmRpbmFyeSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbGlicmFyaWVzIGRpZCBub3QgZWZmZWN0aXZlbHkgcHJvbW90ZSBzb2Z0d2FyZQorc2hhcmluZywgYmVjYXVzZSBtb3N0IGRldmVsb3BlcnMgZGlkIG5vdCB1c2UgdGhlIGxpYnJhcmllcy4gIFdlCitjb25jbHVkZWQgdGhhdCB3ZWFrZXIgY29uZGl0aW9ucyBtaWdodCBwcm9tb3RlIHNoYXJpbmcgYmV0dGVyLgorCisgIEhvd2V2ZXIsIHVucmVzdHJpY3RlZCBsaW5raW5nIG9mIG5vbi1mcmVlIHByb2dyYW1zIHdvdWxkIGRlcHJpdmUgdGhlCit1c2VycyBvZiB0aG9zZSBwcm9ncmFtcyBvZiBhbGwgYmVuZWZpdCBmcm9tIHRoZSBmcmVlIHN0YXR1cyBvZiB0aGUKK2xpYnJhcmllcyB0aGVtc2VsdmVzLiAgVGhpcyBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW50ZW5kZWQgdG8KK3Blcm1pdCBkZXZlbG9wZXJzIG9mIG5vbi1mcmVlIHByb2dyYW1zIHRvIHVzZSBmcmVlIGxpYnJhcmllcywgd2hpbGUKK3ByZXNlcnZpbmcgeW91ciBmcmVlZG9tIGFzIGEgdXNlciBvZiBzdWNoIHByb2dyYW1zIHRvIGNoYW5nZSB0aGUgZnJlZQorbGlicmFyaWVzIHRoYXQgYXJlIGluY29ycG9yYXRlZCBpbiB0aGVtLiAgKFdlIGhhdmUgbm90IHNlZW4gaG93IHRvIGFjaGlldmUKK3RoaXMgYXMgcmVnYXJkcyBjaGFuZ2VzIGluIGhlYWRlciBmaWxlcywgYnV0IHdlIGhhdmUgYWNoaWV2ZWQgaXQgYXMgcmVnYXJkcworY2hhbmdlcyBpbiB0aGUgYWN0dWFsIGZ1bmN0aW9ucyBvZiB0aGUgTGlicmFyeS4pICBUaGUgaG9wZSBpcyB0aGF0IHRoaXMKK3dpbGwgbGVhZCB0byBmYXN0ZXIgZGV2ZWxvcG1lbnQgb2YgZnJlZSBsaWJyYXJpZXMuCisKKyAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKK21vZGlmaWNhdGlvbiBmb2xsb3cuICBQYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYQorIndvcmsgYmFzZWQgb24gdGhlIGxpYnJhcnkiIGFuZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgbGlicmFyeSIuICBUaGUKK2Zvcm1lciBjb250YWlucyBjb2RlIGRlcml2ZWQgZnJvbSB0aGUgbGlicmFyeSwgd2hpbGUgdGhlIGxhdHRlciBvbmx5Cit3b3JrcyB0b2dldGhlciB3aXRoIHRoZSBsaWJyYXJ5LgorCisgIE5vdGUgdGhhdCBpdCBpcyBwb3NzaWJsZSBmb3IgYSBsaWJyYXJ5IHRvIGJlIGNvdmVyZWQgYnkgdGhlIG9yZGluYXJ5CitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHJhdGhlciB0aGFuIGJ5IHRoaXMgc3BlY2lhbCBvbmUuCisMCisJCSAgR05VIExJQlJBUlkgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCisKKyAgMC4gVGhpcyBMaWNlbnNlIEFncmVlbWVudCBhcHBsaWVzIHRvIGFueSBzb2Z0d2FyZSBsaWJyYXJ5IHdoaWNoCitjb250YWlucyBhIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgb3Igb3RoZXIgYXV0aG9yaXplZAorcGFydHkgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWJyYXJ5CitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChhbHNvIGNhbGxlZCAidGhpcyBMaWNlbnNlIikuICBFYWNoIGxpY2Vuc2VlIGlzCithZGRyZXNzZWQgYXMgInlvdSIuCisKKyAgQSAibGlicmFyeSIgbWVhbnMgYSBjb2xsZWN0aW9uIG9mIHNvZnR3YXJlIGZ1bmN0aW9ucyBhbmQvb3IgZGF0YQorcHJlcGFyZWQgc28gYXMgdG8gYmUgY29udmVuaWVudGx5IGxpbmtlZCB3aXRoIGFwcGxpY2F0aW9uIHByb2dyYW1zCisod2hpY2ggdXNlIHNvbWUgb2YgdGhvc2UgZnVuY3Rpb25zIGFuZCBkYXRhKSB0byBmb3JtIGV4ZWN1dGFibGVzLgorCisgIFRoZSAiTGlicmFyeSIsIGJlbG93LCByZWZlcnMgdG8gYW55IHN1Y2ggc29mdHdhcmUgbGlicmFyeSBvciB3b3JrCit3aGljaCBoYXMgYmVlbiBkaXN0cmlidXRlZCB1bmRlciB0aGVzZSB0ZXJtcy4gIEEgIndvcmsgYmFzZWQgb24gdGhlCitMaWJyYXJ5IiBtZWFucyBlaXRoZXIgdGhlIExpYnJhcnkgb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlcgorY29weXJpZ2h0IGxhdzogdGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBMaWJyYXJ5IG9yIGEKK3BvcnRpb24gb2YgaXQsIGVpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQKK3N0cmFpZ2h0Zm9yd2FyZGx5IGludG8gYW5vdGhlciBsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMKK2luY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbiB0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pCisKKyAgIlNvdXJjZSBjb2RlIiBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKK21ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGEgbGlicmFyeSwgY29tcGxldGUgc291cmNlIGNvZGUgbWVhbnMKK2FsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueSBhc3NvY2lhdGVkCitpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvIGNvbnRyb2wgY29tcGlsYXRpb24KK2FuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGxpYnJhcnkuCisKKyAgQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKK2NvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKK3J1bm5pbmcgYSBwcm9ncmFtIHVzaW5nIHRoZSBMaWJyYXJ5IGlzIG5vdCByZXN0cmljdGVkLCBhbmQgb3V0cHV0IGZyb20KK3N1Y2ggYSBwcm9ncmFtIGlzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQKK29uIHRoZSBMaWJyYXJ5IChpbmRlcGVuZGVudCBvZiB0aGUgdXNlIG9mIHRoZSBMaWJyYXJ5IGluIGEgdG9vbCBmb3IKK3dyaXRpbmcgaXQpLiAgV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBMaWJyYXJ5IGRvZXMKK2FuZCB3aGF0IHRoZSBwcm9ncmFtIHRoYXQgdXNlcyB0aGUgTGlicmFyeSBkb2VzLgorICAKKyAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgTGlicmFyeSdzCitjb21wbGV0ZSBzb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdAoreW91IGNvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4KK2FwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0CithbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueQord2FycmFudHk7IGFuZCBkaXN0cmlidXRlIGEgY29weSBvZiB0aGlzIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUKK0xpYnJhcnkuCisKKyAgWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwKK2FuZCB5b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEKK2ZlZS4KKwwKKyAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgTGlicmFyeSBvciBhbnkgcG9ydGlvbgorb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBjb3B5IGFuZAorZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCithYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgorCisgICAgYSkgVGhlIG1vZGlmaWVkIHdvcmsgbXVzdCBpdHNlbGYgYmUgYSBzb2Z0d2FyZSBsaWJyYXJ5LgorCisgICAgYikgWW91IG11c3QgY2F1c2UgdGhlIGZpbGVzIG1vZGlmaWVkIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KKworICAgIGMpIFlvdSBtdXN0IGNhdXNlIHRoZSB3aG9sZSBvZiB0aGUgd29yayB0byBiZSBsaWNlbnNlZCBhdCBubworICAgIGNoYXJnZSB0byBhbGwgdGhpcmQgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgorCisgICAgZCkgSWYgYSBmYWNpbGl0eSBpbiB0aGUgbW9kaWZpZWQgTGlicmFyeSByZWZlcnMgdG8gYSBmdW5jdGlvbiBvciBhCisgICAgdGFibGUgb2YgZGF0YSB0byBiZSBzdXBwbGllZCBieSBhbiBhcHBsaWNhdGlvbiBwcm9ncmFtIHRoYXQgdXNlcworICAgIHRoZSBmYWNpbGl0eSwgb3RoZXIgdGhhbiBhcyBhbiBhcmd1bWVudCBwYXNzZWQgd2hlbiB0aGUgZmFjaWxpdHkKKyAgICBpcyBpbnZva2VkLCB0aGVuIHlvdSBtdXN0IG1ha2UgYSBnb29kIGZhaXRoIGVmZm9ydCB0byBlbnN1cmUgdGhhdCwKKyAgICBpbiB0aGUgZXZlbnQgYW4gYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IHN1Y2ggZnVuY3Rpb24gb3IKKyAgICB0YWJsZSwgdGhlIGZhY2lsaXR5IHN0aWxsIG9wZXJhdGVzLCBhbmQgcGVyZm9ybXMgd2hhdGV2ZXIgcGFydCBvZgorICAgIGl0cyBwdXJwb3NlIHJlbWFpbnMgbWVhbmluZ2Z1bC4KKworICAgIChGb3IgZXhhbXBsZSwgYSBmdW5jdGlvbiBpbiBhIGxpYnJhcnkgdG8gY29tcHV0ZSBzcXVhcmUgcm9vdHMgaGFzCisgICAgYSBwdXJwb3NlIHRoYXQgaXMgZW50aXJlbHkgd2VsbC1kZWZpbmVkIGluZGVwZW5kZW50IG9mIHRoZQorICAgIGFwcGxpY2F0aW9uLiAgVGhlcmVmb3JlLCBTdWJzZWN0aW9uIDJkIHJlcXVpcmVzIHRoYXQgYW55CisgICAgYXBwbGljYXRpb24tc3VwcGxpZWQgZnVuY3Rpb24gb3IgdGFibGUgdXNlZCBieSB0aGlzIGZ1bmN0aW9uIG11c3QKKyAgICBiZSBvcHRpb25hbDogaWYgdGhlIGFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBseSBpdCwgdGhlIHNxdWFyZQorICAgIHJvb3QgZnVuY3Rpb24gbXVzdCBzdGlsbCBjb21wdXRlIHNxdWFyZSByb290cy4pCisKK1RoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKK2lkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIExpYnJhcnksCithbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KK3RoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKK3NlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQorZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCitvbiB0aGUgTGlicmFyeSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKK3RoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCitlbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUKK2l0LgorCitUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKK3lvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bworZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCitjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LgorCitJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBMaWJyYXJ5Cit3aXRoIHRoZSBMaWJyYXJ5IChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSkgb24gYSB2b2x1bWUgb2YKK2Egc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCit0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCisgIDMuIFlvdSBtYXkgb3B0IHRvIGFwcGx5IHRoZSB0ZXJtcyBvZiB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlIHRvIGEgZ2l2ZW4gY29weSBvZiB0aGUgTGlicmFyeS4gIFRvIGRvCit0aGlzLCB5b3UgbXVzdCBhbHRlciBhbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UsIHNvCit0aGF0IHRoZXkgcmVmZXIgdG8gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsCitpbnN0ZWFkIG9mIHRvIHRoaXMgTGljZW5zZS4gIChJZiBhIG5ld2VyIHZlcnNpb24gdGhhbiB2ZXJzaW9uIDIgb2YgdGhlCitvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBoYXMgYXBwZWFyZWQsIHRoZW4geW91IGNhbiBzcGVjaWZ5Cit0aGF0IHZlcnNpb24gaW5zdGVhZCBpZiB5b3Ugd2lzaC4pICBEbyBub3QgbWFrZSBhbnkgb3RoZXIgY2hhbmdlIGluCit0aGVzZSBub3RpY2VzLgorDAorICBPbmNlIHRoaXMgY2hhbmdlIGlzIG1hZGUgaW4gYSBnaXZlbiBjb3B5LCBpdCBpcyBpcnJldmVyc2libGUgZm9yCit0aGF0IGNvcHksIHNvIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIGFsbAorc3Vic2VxdWVudCBjb3BpZXMgYW5kIGRlcml2YXRpdmUgd29ya3MgbWFkZSBmcm9tIHRoYXQgY29weS4KKworICBUaGlzIG9wdGlvbiBpcyB1c2VmdWwgd2hlbiB5b3Ugd2lzaCB0byBjb3B5IHBhcnQgb2YgdGhlIGNvZGUgb2YKK3RoZSBMaWJyYXJ5IGludG8gYSBwcm9ncmFtIHRoYXQgaXMgbm90IGEgbGlicmFyeS4KKworICA0LiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgKG9yIGEgcG9ydGlvbiBvcgorZGVyaXZhdGl2ZSBvZiBpdCwgdW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0KK3VuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFjY29tcGFueQoraXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZSBjb2RlLCB3aGljaAorbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhCittZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2UuCisKKyAgSWYgZGlzdHJpYnV0aW9uIG9mIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIHRvIGNvcHkKK2Zyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQgYWNjZXNzIHRvIGNvcHkgdGhlCitzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIHNhdGlzZmllcyB0aGUgcmVxdWlyZW1lbnQgdG8KK2Rpc3RyaWJ1dGUgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKK2NvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCisKKyAgNS4gQSBwcm9ncmFtIHRoYXQgY29udGFpbnMgbm8gZGVyaXZhdGl2ZSBvZiBhbnkgcG9ydGlvbiBvZiB0aGUKK0xpYnJhcnksIGJ1dCBpcyBkZXNpZ25lZCB0byB3b3JrIHdpdGggdGhlIExpYnJhcnkgYnkgYmVpbmcgY29tcGlsZWQgb3IKK2xpbmtlZCB3aXRoIGl0LCBpcyBjYWxsZWQgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiLiAgU3VjaCBhCit3b3JrLCBpbiBpc29sYXRpb24sIGlzIG5vdCBhIGRlcml2YXRpdmUgd29yayBvZiB0aGUgTGlicmFyeSwgYW5kCit0aGVyZWZvcmUgZmFsbHMgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCisgIEhvd2V2ZXIsIGxpbmtpbmcgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkKK2NyZWF0ZXMgYW4gZXhlY3V0YWJsZSB0aGF0IGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSAoYmVjYXVzZSBpdAorY29udGFpbnMgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnkpLCByYXRoZXIgdGhhbiBhICJ3b3JrIHRoYXQgdXNlcyB0aGUKK2xpYnJhcnkiLiAgVGhlIGV4ZWN1dGFibGUgaXMgdGhlcmVmb3JlIGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLgorU2VjdGlvbiA2IHN0YXRlcyB0ZXJtcyBmb3IgZGlzdHJpYnV0aW9uIG9mIHN1Y2ggZXhlY3V0YWJsZXMuCisKKyAgV2hlbiBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgdXNlcyBtYXRlcmlhbCBmcm9tIGEgaGVhZGVyIGZpbGUKK3RoYXQgaXMgcGFydCBvZiB0aGUgTGlicmFyeSwgdGhlIG9iamVjdCBjb2RlIGZvciB0aGUgd29yayBtYXkgYmUgYQorZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5IGV2ZW4gdGhvdWdoIHRoZSBzb3VyY2UgY29kZSBpcyBub3QuCitXaGV0aGVyIHRoaXMgaXMgdHJ1ZSBpcyBlc3BlY2lhbGx5IHNpZ25pZmljYW50IGlmIHRoZSB3b3JrIGNhbiBiZQorbGlua2VkIHdpdGhvdXQgdGhlIExpYnJhcnksIG9yIGlmIHRoZSB3b3JrIGlzIGl0c2VsZiBhIGxpYnJhcnkuICBUaGUKK3RocmVzaG9sZCBmb3IgdGhpcyB0byBiZSB0cnVlIGlzIG5vdCBwcmVjaXNlbHkgZGVmaW5lZCBieSBsYXcuCisKKyAgSWYgc3VjaCBhbiBvYmplY3QgZmlsZSB1c2VzIG9ubHkgbnVtZXJpY2FsIHBhcmFtZXRlcnMsIGRhdGEKK3N0cnVjdHVyZSBsYXlvdXRzIGFuZCBhY2Nlc3NvcnMsIGFuZCBzbWFsbCBtYWNyb3MgYW5kIHNtYWxsIGlubGluZQorZnVuY3Rpb25zICh0ZW4gbGluZXMgb3IgbGVzcyBpbiBsZW5ndGgpLCB0aGVuIHRoZSB1c2Ugb2YgdGhlIG9iamVjdAorZmlsZSBpcyB1bnJlc3RyaWN0ZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBpcyBsZWdhbGx5IGEgZGVyaXZhdGl2ZQord29yay4gIChFeGVjdXRhYmxlcyBjb250YWluaW5nIHRoaXMgb2JqZWN0IGNvZGUgcGx1cyBwb3J0aW9ucyBvZiB0aGUKK0xpYnJhcnkgd2lsbCBzdGlsbCBmYWxsIHVuZGVyIFNlY3Rpb24gNi4pCisKKyAgT3RoZXJ3aXNlLCBpZiB0aGUgd29yayBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIExpYnJhcnksIHlvdSBtYXkKK2Rpc3RyaWJ1dGUgdGhlIG9iamVjdCBjb2RlIGZvciB0aGUgd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiA2LgorQW55IGV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhhdCB3b3JrIGFsc28gZmFsbCB1bmRlciBTZWN0aW9uIDYsCit3aGV0aGVyIG9yIG5vdCB0aGV5IGFyZSBsaW5rZWQgZGlyZWN0bHkgd2l0aCB0aGUgTGlicmFyeSBpdHNlbGYuCisMCisgIDYuIEFzIGFuIGV4Y2VwdGlvbiB0byB0aGUgU2VjdGlvbnMgYWJvdmUsIHlvdSBtYXkgYWxzbyBjb21waWxlIG9yCitsaW5rIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB3aXRoIHRoZSBMaWJyYXJ5IHRvIHByb2R1Y2UgYQord29yayBjb250YWluaW5nIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5LCBhbmQgZGlzdHJpYnV0ZSB0aGF0IHdvcmsKK3VuZGVyIHRlcm1zIG9mIHlvdXIgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHRoZSB0ZXJtcyBwZXJtaXQKK21vZGlmaWNhdGlvbiBvZiB0aGUgd29yayBmb3IgdGhlIGN1c3RvbWVyJ3Mgb3duIHVzZSBhbmQgcmV2ZXJzZQorZW5naW5lZXJpbmcgZm9yIGRlYnVnZ2luZyBzdWNoIG1vZGlmaWNhdGlvbnMuCisKKyAgWW91IG11c3QgZ2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggZWFjaCBjb3B5IG9mIHRoZSB3b3JrIHRoYXQgdGhlCitMaWJyYXJ5IGlzIHVzZWQgaW4gaXQgYW5kIHRoYXQgdGhlIExpYnJhcnkgYW5kIGl0cyB1c2UgYXJlIGNvdmVyZWQgYnkKK3RoaXMgTGljZW5zZS4gIFlvdSBtdXN0IHN1cHBseSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAgSWYgdGhlIHdvcmsKK2R1cmluZyBleGVjdXRpb24gZGlzcGxheXMgY29weXJpZ2h0IG5vdGljZXMsIHlvdSBtdXN0IGluY2x1ZGUgdGhlCitjb3B5cmlnaHQgbm90aWNlIGZvciB0aGUgTGlicmFyeSBhbW9uZyB0aGVtLCBhcyB3ZWxsIGFzIGEgcmVmZXJlbmNlCitkaXJlY3RpbmcgdGhlIHVzZXIgdG8gdGhlIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAgQWxzbywgeW91IG11c3QgZG8gb25lCitvZiB0aGVzZSB0aGluZ3M6CisKKyAgICBhKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZworICAgIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUgZm9yIHRoZSBMaWJyYXJ5IGluY2x1ZGluZyB3aGF0ZXZlcgorICAgIGNoYW5nZXMgd2VyZSB1c2VkIGluIHRoZSB3b3JrICh3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyCisgICAgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSk7IGFuZCwgaWYgdGhlIHdvcmsgaXMgYW4gZXhlY3V0YWJsZSBsaW5rZWQKKyAgICB3aXRoIHRoZSBMaWJyYXJ5LCB3aXRoIHRoZSBjb21wbGV0ZSBtYWNoaW5lLXJlYWRhYmxlICJ3b3JrIHRoYXQKKyAgICB1c2VzIHRoZSBMaWJyYXJ5IiwgYXMgb2JqZWN0IGNvZGUgYW5kL29yIHNvdXJjZSBjb2RlLCBzbyB0aGF0IHRoZQorICAgIHVzZXIgY2FuIG1vZGlmeSB0aGUgTGlicmFyeSBhbmQgdGhlbiByZWxpbmsgdG8gcHJvZHVjZSBhIG1vZGlmaWVkCisgICAgZXhlY3V0YWJsZSBjb250YWluaW5nIHRoZSBtb2RpZmllZCBMaWJyYXJ5LiAgKEl0IGlzIHVuZGVyc3Rvb2QKKyAgICB0aGF0IHRoZSB1c2VyIHdobyBjaGFuZ2VzIHRoZSBjb250ZW50cyBvZiBkZWZpbml0aW9ucyBmaWxlcyBpbiB0aGUKKyAgICBMaWJyYXJ5IHdpbGwgbm90IG5lY2Vzc2FyaWx5IGJlIGFibGUgdG8gcmVjb21waWxlIHRoZSBhcHBsaWNhdGlvbgorICAgIHRvIHVzZSB0aGUgbW9kaWZpZWQgZGVmaW5pdGlvbnMuKQorCisgICAgYikgQWNjb21wYW55IHRoZSB3b3JrIHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQKKyAgICBsZWFzdCB0aHJlZSB5ZWFycywgdG8gZ2l2ZSB0aGUgc2FtZSB1c2VyIHRoZSBtYXRlcmlhbHMKKyAgICBzcGVjaWZpZWQgaW4gU3Vic2VjdGlvbiA2YSwgYWJvdmUsIGZvciBhIGNoYXJnZSBubyBtb3JlCisgICAgdGhhbiB0aGUgY29zdCBvZiBwZXJmb3JtaW5nIHRoaXMgZGlzdHJpYnV0aW9uLgorCisgICAgYykgSWYgZGlzdHJpYnV0aW9uIG9mIHRoZSB3b3JrIGlzIG1hZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIHRvIGNvcHkKKyAgICBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgb2ZmZXIgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUgYWJvdmUKKyAgICBzcGVjaWZpZWQgbWF0ZXJpYWxzIGZyb20gdGhlIHNhbWUgcGxhY2UuCisKKyAgICBkKSBWZXJpZnkgdGhhdCB0aGUgdXNlciBoYXMgYWxyZWFkeSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlc2UKKyAgICBtYXRlcmlhbHMgb3IgdGhhdCB5b3UgaGF2ZSBhbHJlYWR5IHNlbnQgdGhpcyB1c2VyIGEgY29weS4KKworICBGb3IgYW4gZXhlY3V0YWJsZSwgdGhlIHJlcXVpcmVkIGZvcm0gb2YgdGhlICJ3b3JrIHRoYXQgdXNlcyB0aGUKK0xpYnJhcnkiIG11c3QgaW5jbHVkZSBhbnkgZGF0YSBhbmQgdXRpbGl0eSBwcm9ncmFtcyBuZWVkZWQgZm9yCityZXByb2R1Y2luZyB0aGUgZXhlY3V0YWJsZSBmcm9tIGl0LiAgSG93ZXZlciwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwKK3RoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlIGFueXRoaW5nIHRoYXQgaXMgbm9ybWFsbHkKK2Rpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeSBmb3JtKSB3aXRoIHRoZSBtYWpvcgorY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBvbgord2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50IGl0c2VsZiBhY2NvbXBhbmllcwordGhlIGV4ZWN1dGFibGUuCisKKyAgSXQgbWF5IGhhcHBlbiB0aGF0IHRoaXMgcmVxdWlyZW1lbnQgY29udHJhZGljdHMgdGhlIGxpY2Vuc2UKK3Jlc3RyaWN0aW9ucyBvZiBvdGhlciBwcm9wcmlldGFyeSBsaWJyYXJpZXMgdGhhdCBkbyBub3Qgbm9ybWFsbHkKK2FjY29tcGFueSB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gIFN1Y2ggYSBjb250cmFkaWN0aW9uIG1lYW5zIHlvdSBjYW5ub3QKK3VzZSBib3RoIHRoZW0gYW5kIHRoZSBMaWJyYXJ5IHRvZ2V0aGVyIGluIGFuIGV4ZWN1dGFibGUgdGhhdCB5b3UKK2Rpc3RyaWJ1dGUuCisMCisgIDcuIFlvdSBtYXkgcGxhY2UgbGlicmFyeSBmYWNpbGl0aWVzIHRoYXQgYXJlIGEgd29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkgc2lkZS1ieS1zaWRlIGluIGEgc2luZ2xlIGxpYnJhcnkgdG9nZXRoZXIgd2l0aCBvdGhlciBsaWJyYXJ5CitmYWNpbGl0aWVzIG5vdCBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgc3VjaCBhIGNvbWJpbmVkCitsaWJyYXJ5LCBwcm92aWRlZCB0aGF0IHRoZSBzZXBhcmF0ZSBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgYmFzZWQgb24KK3RoZSBMaWJyYXJ5IGFuZCBvZiB0aGUgb3RoZXIgbGlicmFyeSBmYWNpbGl0aWVzIGlzIG90aGVyd2lzZQorcGVybWl0dGVkLCBhbmQgcHJvdmlkZWQgdGhhdCB5b3UgZG8gdGhlc2UgdHdvIHRoaW5nczoKKworICAgIGEpIEFjY29tcGFueSB0aGUgY29tYmluZWQgbGlicmFyeSB3aXRoIGEgY29weSBvZiB0aGUgc2FtZSB3b3JrCisgICAgYmFzZWQgb24gdGhlIExpYnJhcnksIHVuY29tYmluZWQgd2l0aCBhbnkgb3RoZXIgbGlicmFyeQorICAgIGZhY2lsaXRpZXMuICBUaGlzIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICAgIFNlY3Rpb25zIGFib3ZlLgorCisgICAgYikgR2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggdGhlIGNvbWJpbmVkIGxpYnJhcnkgb2YgdGhlIGZhY3QKKyAgICB0aGF0IHBhcnQgb2YgaXQgaXMgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCBhbmQgZXhwbGFpbmluZworICAgIHdoZXJlIHRvIGZpbmQgdGhlIGFjY29tcGFueWluZyB1bmNvbWJpbmVkIGZvcm0gb2YgdGhlIHNhbWUgd29yay4KKworICA4LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIGxpbmsgd2l0aCwgb3IgZGlzdHJpYnV0ZQordGhlIExpYnJhcnkgZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkKK2F0dGVtcHQgb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgbGluayB3aXRoLCBvcgorZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBpcyB2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyCityaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLiAgSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsCitvciByaWdodHMsIGZyb20geW91IHVuZGVyIHRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzCit0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaCBwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCisKKyAgOS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90CitzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgorZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCitwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Cittb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBMaWJyYXJ5IChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkpLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCithbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCit0aGUgTGlicmFyeSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KKworICAxMC4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorTGlicmFyeSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKK29yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUsIGxpbmsgd2l0aCBvciBtb2RpZnkgdGhlIExpYnJhcnkKK3N1YmplY3QgdG8gdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKK3Jlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KK1lvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCit0aGlzIExpY2Vuc2UuCisMCisgIDExLiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50CitpbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAorY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgorb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAorZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKK2Rpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKK0xpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKK21heSBub3QgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKK2xpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIExpYnJhcnkgYnkKK2FsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgordGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bworcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeS4KKworSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFueQorcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvIGFwcGx5LAorYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIgY2lyY3Vtc3RhbmNlcy4KKworSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQorcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKK3N1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKK2ludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtIHdoaWNoIGlzCitpbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKK2dlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKK3Rocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0CitzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCit0byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKK2ltcG9zZSB0aGF0IGNob2ljZS4KKworVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCitiZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KKworICAxMi4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBMaWJyYXJ5IGlzIHJlc3RyaWN0ZWQgaW4KK2NlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQorb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBMaWJyYXJ5IHVuZGVyIHRoaXMgTGljZW5zZSBtYXkgYWRkCithbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nIHRob3NlIGNvdW50cmllcywKK3NvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nIGNvdW50cmllcyBub3QgdGh1cworZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMgdGhlIGxpbWl0YXRpb24gYXMgaWYKK3dyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgorCisgIDEzLiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldwordmVyc2lvbnMgb2YgdGhlIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4KK1N1Y2ggbmV3IHZlcnNpb25zIHdpbGwgYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwKK2J1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0byBhZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgTGlicmFyeQorc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kCisiYW55IGxhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kCitjb25kaXRpb25zIGVpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIExpYnJhcnkgZG9lcyBub3Qgc3BlY2lmeSBhCitsaWNlbnNlIHZlcnNpb24gbnVtYmVyLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKwwKKyAgMTQuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBMaWJyYXJ5IGludG8gb3RoZXIgZnJlZQorcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGluY29tcGF0aWJsZSB3aXRoIHRoZXNlLAord3JpdGUgdG8gdGhlIGF1dGhvciB0byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMKK2NvcHlyaWdodGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMgbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyCitkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzIG9mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzCitvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kIG9mIHByb21vdGluZyB0aGUgc2hhcmluZworYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KKworCQkJICAgIE5PIFdBUlJBTlRZCisKKyAgMTUuIEJFQ0FVU0UgVEhFIExJQlJBUlkgSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PCitXQVJSQU5UWSBGT1IgVEhFIExJQlJBUlksIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLgorRVhDRVBUIFdIRU4gT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IKK09USEVSIFBBUlRJRVMgUFJPVklERSBUSEUgTElCUkFSWSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZCitLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKK0lNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFCitMSUJSQVJZIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRSBMSUJSQVJZIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRQorVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLgorCisgIDE2LiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOCitXUklUSU5HIFdJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWQorQU5EL09SIFJFRElTVFJJQlVURSBUSEUgTElCUkFSWSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UKK0ZPUiBEQU1BR0VTLCBJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IKK0NPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFCitMSUJSQVJZIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HCitSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkgWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQQorRkFJTFVSRSBPRiBUSEUgTElCUkFSWSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSIFNPRlRXQVJFKSwgRVZFTiBJRgorU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorREFNQUdFUy4KKworCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworDAorICAgICAgICAgICBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgTGlicmFyaWVzCisKKyAgSWYgeW91IGRldmVsb3AgYSBuZXcgbGlicmFyeSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAorcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHdlIHJlY29tbWVuZCBtYWtpbmcgaXQgZnJlZSBzb2Z0d2FyZSB0aGF0CitldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UuICBZb3UgY2FuIGRvIHNvIGJ5IHBlcm1pdHRpbmcKK3JlZGlzdHJpYnV0aW9uIHVuZGVyIHRoZXNlIHRlcm1zIChvciwgYWx0ZXJuYXRpdmVseSwgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSkuCisKKyAgVG8gYXBwbHkgdGhlc2UgdGVybXMsIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIGxpYnJhcnkuICBJdCBpcworc2FmZXN0IHRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKK2NvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0IHRoZQorImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBsaWJyYXJ5J3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+CisgICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgCisgICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIAorICAgIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQS4KKworQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCisKK1lvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCitzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBsaWJyYXJ5LCBpZgorbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgorCisgIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlCisgIGxpYnJhcnkgYEZyb2InIChhIGxpYnJhcnkgZm9yIHR3ZWFraW5nIGtub2JzKSB3cml0dGVuIGJ5IEphbWVzIFJhbmRvbSBIYWNrZXIuCisKKyAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTkwCisgIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCisKK1RoYXQncyBhbGwgdGhlcmUgaXMgdG8gaXQhCisKK0hhcmZCdXp6IGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBzby1jYWxsZWQgIk9sZCBNSVQiIGxpY2Vuc2UuICBEZXRhaWxzIGZvbGxvdy4KK0ZvciBwYXJ0cyBvZiBIYXJmQnV6eiB0aGF0IGFyZSBsaWNlbnNlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZXMgc2VlIGluZGl2aWR1YWwKK2ZpbGVzIG5hbWVzIENPUFlJTkcgaW4gc3ViZGlyZWN0b3JpZXMgd2hlcmUgYXBwbGljYWJsZS4KKworQ29weXJpZ2h0IMKpIDIwMTAsMjAxMSwyMDEyICBHb29nbGUsIEluYy4KK0NvcHlyaWdodCDCqSAyMDEyICBNb3ppbGxhIEZvdW5kYXRpb24KK0NvcHlyaWdodCDCqSAyMDExICBDb2RldGhpbmsgTGltaXRlZAorQ29weXJpZ2h0IMKpIDIwMDgsMjAxMCAgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpCitDb3B5cmlnaHQgwqkgMjAwOSAgS2VpdGggU3RyaWJsZXkKK0NvcHlyaWdodCDCqSAyMDA5ICBNYXJ0aW4gSG9za2VuIGFuZCBTSUwgSW50ZXJuYXRpb25hbAorQ29weXJpZ2h0IMKpIDIwMDcgIENocmlzIFdpbHNvbgorQ29weXJpZ2h0IMKpIDIwMDYgIEJlaGRhZCBFc2ZhaGJvZAorQ29weXJpZ2h0IMKpIDIwMDUgIERhdmlkIFR1cm5lcgorQ29weXJpZ2h0IMKpIDIwMDQsMjAwNywyMDA4LDIwMDksMjAxMCAgUmVkIEhhdCwgSW5jLgorQ29weXJpZ2h0IMKpIDE5OTgtMjAwNCAgRGF2aWQgVHVybmVyIGFuZCBXZXJuZXIgTGVtYmVyZworCitGb3IgZnVsbCBjb3B5cmlnaHQgbm90aWNlcyBjb25zdWx0IHRoZSBpbmRpdmlkdWFsIGZpbGVzIGluIHRoZSBwYWNrYWdlLgorCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIHdpdGhvdXQgd3JpdHRlbiBhZ3JlZW1lbnQgYW5kIHdpdGhvdXQKK2xpY2Vuc2Ugb3Igcm95YWx0eSBmZWVzLCB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworc29mdHdhcmUgYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSwgcHJvdmlkZWQgdGhhdCB0aGUKK2Fib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoZSBmb2xsb3dpbmcgdHdvIHBhcmFncmFwaHMgYXBwZWFyIGluCithbGwgY29waWVzIG9mIHRoaXMgc29mdHdhcmUuCisKK0lOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIEJFIExJQUJMRSBUTyBBTlkgUEFSVFkgRk9SCitESVJFQ1QsIElORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKK0FSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSBBTkQgSVRTIERPQ1VNRU5UQVRJT04sIEVWRU4KK0lGIFRIRSBDT1BZUklHSFQgSE9MREVSIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKK0RBTUFHRS4KKworVEhFIENPUFlSSUdIVCBIT0xERVIgU1BFQ0lGSUNBTExZIERJU0NMQUlNUyBBTlkgV0FSUkFOVElFUywgSU5DTFVESU5HLAorQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIFNPRlRXQVJFIFBST1ZJREVEIEhFUkVVTkRFUiBJUworT04gQU4gIkFTIElTIiBCQVNJUywgQU5EIFRIRSBDT1BZUklHSFQgSE9MREVSIEhBUyBOTyBPQkxJR0FUSU9OIFRPCitQUk9WSURFIE1BSU5URU5BTkNFLCBTVVBQT1JULCBVUERBVEVTLCBFTkhBTkNFTUVOVFMsIE9SIE1PRElGSUNBVElPTlMuCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIElBY2Nlc3NpYmxlMiBJREwgU3BlY2lmaWNhdGlvbiAKKyAqIAorICogIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBMaW51eCBGb3VuZGF0aW9uIAorICogIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gCisgKiAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gCisgKiAgIAorICogICAKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgCisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIAorICogIGFyZSBtZXQ6IAorICogICAKKyAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgCisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKiAgIAorICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAorICogICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIAorICogICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICoKKyAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cyAKKyAqICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyAKKyAqICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIAorICogICAgICBwZXJtaXNzaW9uLiAKKyAqICAgCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIAorICogIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIAorICogIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIAorICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIAorICogIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIAorICogIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCAKKyAqICBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgCisgKiAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IAorICogIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIAorICogIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAKKyAqICBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgCisgKiAgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgCisgKiAgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKiAgIAorICogIFRoaXMgQlNEIExpY2Vuc2UgY29uZm9ybXMgdG8gdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgIlNpbXBsaWZpZWQgCisgKiAgQlNEIExpY2Vuc2UiIGFzIHB1Ymxpc2hlZCBhdDogCisgKiAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5waHAgCisgKiAgIAorICogIElBY2Nlc3NpYmxlMiBpcyBhIHRyYWRlbWFyayBvZiB0aGUgTGludXggRm91bmRhdGlvbi4gVGhlIElBY2Nlc3NpYmxlMiAKKyAqICBtYXJrIG1heSBiZSB1c2VkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgTGludXggRm91bmRhdGlvbiBUcmFkZW1hcmsgCisgKiAgUG9saWN5IHRvIGluZGljYXRlIGNvbXBsaWFuY2Ugd2l0aCB0aGUgSUFjY2Vzc2libGUyIHNwZWNpZmljYXRpb24uIAorICogCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAKKworTElDRU5TRSBleHRyYWN0ZWQgZnJvbSBJSkcncyBqcGVnIGRpc3RyaWJ1dGlvbjoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0luIHBsYWluIEVuZ2xpc2g6CisKKzEuIFdlIGRvbid0IHByb21pc2UgdGhhdCB0aGlzIHNvZnR3YXJlIHdvcmtzLiAgKEJ1dCBpZiB5b3UgZmluZCBhbnkgYnVncywKKyAgIHBsZWFzZSBsZXQgdXMga25vdyEpCisyLiBZb3UgY2FuIHVzZSB0aGlzIHNvZnR3YXJlIGZvciB3aGF0ZXZlciB5b3Ugd2FudC4gIFlvdSBkb24ndCBoYXZlIHRvIHBheSB1cy4KKzMuIFlvdSBtYXkgbm90IHByZXRlbmQgdGhhdCB5b3Ugd3JvdGUgdGhpcyBzb2Z0d2FyZS4gIElmIHlvdSB1c2UgaXQgaW4gYQorICAgcHJvZ3JhbSwgeW91IG11c3QgYWNrbm93bGVkZ2Ugc29tZXdoZXJlIGluIHlvdXIgZG9jdW1lbnRhdGlvbiB0aGF0CisgICB5b3UndmUgdXNlZCB0aGUgSUpHIGNvZGUuCisKK0luIGxlZ2FsZXNlOgorCitUaGUgYXV0aG9ycyBtYWtlIE5PIFdBUlJBTlRZIG9yIHJlcHJlc2VudGF0aW9uLCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLAord2l0aCByZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUsIGl0cyBxdWFsaXR5LCBhY2N1cmFjeSwgbWVyY2hhbnRhYmlsaXR5LCBvcgorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJBUyBJUyIsIGFuZCB5b3UsCitpdHMgdXNlciwgYXNzdW1lIHRoZSBlbnRpcmUgcmlzayBhcyB0byBpdHMgcXVhbGl0eSBhbmQgYWNjdXJhY3kuCisKK1RoaXMgc29mdHdhcmUgaXMgY29weXJpZ2h0IChDKSAxOTkxLTE5OTgsIFRob21hcyBHLiBMYW5lLgorQWxsIFJpZ2h0cyBSZXNlcnZlZCBleGNlcHQgYXMgc3BlY2lmaWVkIGJlbG93LgorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCitzb2Z0d2FyZSAob3IgcG9ydGlvbnMgdGhlcmVvZikgZm9yIGFueSBwdXJwb3NlLCB3aXRob3V0IGZlZSwgc3ViamVjdCB0byB0aGVzZQorY29uZGl0aW9uczoKKygxKSBJZiBhbnkgcGFydCBvZiB0aGUgc291cmNlIGNvZGUgZm9yIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQsIHRoZW4gdGhpcworUkVBRE1FIGZpbGUgbXVzdCBiZSBpbmNsdWRlZCwgd2l0aCB0aGlzIGNvcHlyaWdodCBhbmQgbm8td2FycmFudHkgbm90aWNlCit1bmFsdGVyZWQ7IGFuZCBhbnkgYWRkaXRpb25zLCBkZWxldGlvbnMsIG9yIGNoYW5nZXMgdG8gdGhlIG9yaWdpbmFsIGZpbGVzCittdXN0IGJlIGNsZWFybHkgaW5kaWNhdGVkIGluIGFjY29tcGFueWluZyBkb2N1bWVudGF0aW9uLgorKDIpIElmIG9ubHkgZXhlY3V0YWJsZSBjb2RlIGlzIGRpc3RyaWJ1dGVkLCB0aGVuIHRoZSBhY2NvbXBhbnlpbmcKK2RvY3VtZW50YXRpb24gbXVzdCBzdGF0ZSB0aGF0ICJ0aGlzIHNvZnR3YXJlIGlzIGJhc2VkIGluIHBhcnQgb24gdGhlIHdvcmsgb2YKK3RoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwIi4KKygzKSBQZXJtaXNzaW9uIGZvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBncmFudGVkIG9ubHkgaWYgdGhlIHVzZXIgYWNjZXB0cworZnVsbCByZXNwb25zaWJpbGl0eSBmb3IgYW55IHVuZGVzaXJhYmxlIGNvbnNlcXVlbmNlczsgdGhlIGF1dGhvcnMgYWNjZXB0CitOTyBMSUFCSUxJVFkgZm9yIGRhbWFnZXMgb2YgYW55IGtpbmQuCisKK1RoZXNlIGNvbmRpdGlvbnMgYXBwbHkgdG8gYW55IHNvZnR3YXJlIGRlcml2ZWQgZnJvbSBvciBiYXNlZCBvbiB0aGUgSUpHIGNvZGUsCitub3QganVzdCB0byB0aGUgdW5tb2RpZmllZCBsaWJyYXJ5LiAgSWYgeW91IHVzZSBvdXIgd29yaywgeW91IG91Z2h0IHRvCithY2tub3dsZWRnZSB1cy4KKworUGVybWlzc2lvbiBpcyBOT1QgZ3JhbnRlZCBmb3IgdGhlIHVzZSBvZiBhbnkgSUpHIGF1dGhvcidzIG5hbWUgb3IgY29tcGFueSBuYW1lCitpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcmVsYXRpbmcgdG8gdGhpcyBzb2Z0d2FyZSBvciBwcm9kdWN0cyBkZXJpdmVkIGZyb20KK2l0LiAgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgcmVmZXJyZWQgdG8gb25seSBhcyAidGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncworc29mdHdhcmUiLgorCitXZSBzcGVjaWZpY2FsbHkgcGVybWl0IGFuZCBlbmNvdXJhZ2UgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFzIHRoZSBiYXNpcyBvZgorY29tbWVyY2lhbCBwcm9kdWN0cywgcHJvdmlkZWQgdGhhdCBhbGwgd2FycmFudHkgb3IgbGlhYmlsaXR5IGNsYWltcyBhcmUKK2Fzc3VtZWQgYnkgdGhlIHByb2R1Y3QgdmVuZG9yLgorCisKK0lDVSBMaWNlbnNlIC0gSUNVIDEuOC4xIGFuZCBsYXRlcgorCitDT1BZUklHSFQgQU5EIFBFUk1JU1NJT04gTk9USUNFCisKK0NvcHlyaWdodCAoYykgMTk5NS0yMDEwIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kIG90aGVycworCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CitvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKK3RvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KK3RoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBhbmQvb3Igc2VsbAorY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zCit0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCitjb3B5cmlnaHQgbm90aWNlKHMpIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzCitvZiB0aGUgU29mdHdhcmUgYW5kIHRoYXQgYm90aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZShzKSBhbmQgdGhpcworcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCwgCitJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQgT0YgVEhJUkQgUEFSVFkgUklHSFRTLiBJTiBOTyBFVkVOVCBTSEFMTAorVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgSE9MREVSUyBJTkNMVURFRCBJTiBUSElTIE5PVElDRSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKK09SIEFOWSBTUEVDSUFMIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUgorUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCitORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIGEgY29weXJpZ2h0IGhvbGRlciBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncyBpbgordGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlci4KKworQWxsIHRyYWRlbWFya3MgYW5kIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBtZW50aW9uZWQgaGVyZWluIGFyZSB0aGUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisKKy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKKyAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQorICoKKyAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgorICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KKyAqCisgKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAorICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCisgKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQorICogTGljZW5zZS4KKyAqCisgKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBtb3ppbGxhLm9yZyBjb2RlLgorICoKKyAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcworICogTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCisgKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDAyCisgKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogQ29udHJpYnV0b3Iocyk6CisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgorICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCisgKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAorICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KKyAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCisgKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQorICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKKyAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCisgKgorICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KKworVGhlIGZvbGxvd2luZyBpcyB0aGUgbGljZW5zZSBmb3IgdGhlIGplbWFsbG9jIHNvdXJjZSBjb2RlLCBhcyBwcm92aWRlZAoraW4gdGhlIGluaXRpYWwgc2VjdGlvbiBvZiB0aGUgc291cmNlIGZpbGVzLgorCitDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCBKYXNvbiBFdmFucyA8amFzb25lQEZyZWVCU0Qub3JnPi4KK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCithcmUgbWV0OgorMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgIG5vdGljZShzKSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBhcworICAgdGhlIGZpcnN0IGxpbmVzIG9mIHRoaXMgZmlsZSB1bm1vZGlmaWVkIG90aGVyIHRoYW4gdGhlIHBvc3NpYmxlCisgICBhZGRpdGlvbiBvZiBvbmUgb3IgbW9yZSBjb3B5cmlnaHQgbm90aWNlcy4KKzIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICBub3RpY2UocyksIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAgIGRpc3RyaWJ1dGlvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBgYEFTIElTJycgQU5EIEFOWQorRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKK0lNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIEJFCitMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCitDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCitCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKK1dIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCitPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLAorRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworCitUaGUgSnNvbkNwcCBsaWJyYXJ5J3Mgc291cmNlIGNvZGUsIGluY2x1ZGluZyBhY2NvbXBhbnlpbmcgZG9jdW1lbnRhdGlvbiwgCit0ZXN0cyBhbmQgZGVtb25zdHJhdGlvbiBhcHBsaWNhdGlvbnMsIGFyZSBsaWNlbnNlZCB1bmRlciB0aGUgZm9sbG93aW5nCitjb25kaXRpb25zLi4uCisKK1RoZSBhdXRob3IgKEJhcHRpc3RlIExlcGlsbGV1cikgZXhwbGljaXRseSBkaXNjbGFpbXMgY29weXJpZ2h0IGluIGFsbCAKK2p1cmlzZGljdGlvbnMgd2hpY2ggcmVjb2duaXplIHN1Y2ggYSBkaXNjbGFpbWVyLiBJbiBzdWNoIGp1cmlzZGljdGlvbnMsIAordGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCBpbnRvIHRoZSBQdWJsaWMgRG9tYWluLgorCitJbiBqdXJpc2RpY3Rpb25zIHdoaWNoIGRvIG5vdCByZWNvZ25pemUgUHVibGljIERvbWFpbiBwcm9wZXJ0eSAoZS5nLiBHZXJtYW55IGFzIG9mCisyMDEwKSwgdGhpcyBzb2Z0d2FyZSBpcyBDb3B5cmlnaHQgKGMpIDIwMDctMjAxMCBieSBCYXB0aXN0ZSBMZXBpbGxldXIsIGFuZCBpcworcmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNSVQgTGljZW5zZSAoc2VlIGJlbG93KS4KKworSW4ganVyaXNkaWN0aW9ucyB3aGljaCByZWNvZ25pemUgUHVibGljIERvbWFpbiBwcm9wZXJ0eSwgdGhlIHVzZXIgb2YgdGhpcyAKK3NvZnR3YXJlIG1heSBjaG9vc2UgdG8gYWNjZXB0IGl0IGVpdGhlciBhcyAxKSBQdWJsaWMgRG9tYWluLCAyKSB1bmRlciB0aGUgCitjb25kaXRpb25zIG9mIHRoZSBNSVQgTGljZW5zZSAoc2VlIGJlbG93KSwgb3IgMykgdW5kZXIgdGhlIHRlcm1zIG9mIGR1YWwgCitQdWJsaWMgRG9tYWluL01JVCBMaWNlbnNlIGNvbmRpdGlvbnMgZGVzY3JpYmVkIGhlcmUsIGFzIHRoZXkgY2hvb3NlLgorCitUaGUgTUlUIExpY2Vuc2UgaXMgYWJvdXQgYXMgY2xvc2UgdG8gUHVibGljIERvbWFpbiBhcyBhIGxpY2Vuc2UgY2FuIGdldCwgYW5kIGlzCitkZXNjcmliZWQgaW4gY2xlYXIsIGNvbmNpc2UgdGVybXMgYXQ6CisKKyAgIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTUlUX0xpY2Vuc2UKKyAgIAorVGhlIGZ1bGwgdGV4dCBvZiB0aGUgTUlUIExpY2Vuc2UgZm9sbG93czoKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitDb3B5cmlnaHQgKGMpIDIwMDctMjAxMCBCYXB0aXN0ZSBMZXBpbGxldXIKKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KK29idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCitmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CityZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwKK21vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKK2Z1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCitpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCitFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECitOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCitCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KK0FDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCitTT0ZUV0FSRS4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKEVORCBMSUNFTlNFIFRFWFQpCisKK1RoZSBNSVQgbGljZW5zZSBpcyBjb21wYXRpYmxlIHdpdGggYm90aCB0aGUgR1BMIGFuZCBjb21tZXJjaWFsCitzb2Z0d2FyZSwgYWZmb3JkaW5nIG9uZSBhbGwgb2YgdGhlIHJpZ2h0cyBvZiBQdWJsaWMgRG9tYWluIHdpdGggdGhlCittaW5vciBudWlzYW5jZSBvZiBiZWluZyByZXF1aXJlZCB0byBrZWVwIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlCithbmQgbGljZW5zZSB0ZXh0IGluIHRoZSBzb3VyY2UgY29kZS4gTm90ZSBhbHNvIHRoYXQgYnkgYWNjZXB0aW5nIHRoZQorUHVibGljIERvbWFpbiAibGljZW5zZSIgeW91IGNhbiByZS1saWNlbnNlIHlvdXIgY29weSB1c2luZyB3aGF0ZXZlcgorbGljZW5zZSB5b3UgbGlrZS4KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKworICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgorCisgICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZworICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgorICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKKyAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCisgICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKKyAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKKyAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgorICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgorCisgICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KKworICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworQ29weXJpZ2h0IChjKSAyMDA3LTIwMTAgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZC9vciBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorIk1hdGVyaWFscyIpLCB0byBkZWFsIGluIHRoZSBNYXRlcmlhbHMgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCit3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCitkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIE1hdGVyaWFscywgYW5kIHRvCitwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBNYXRlcmlhbHMgYXJlIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwordGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAoraW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgTWF0ZXJpYWxzLgorCitUSEUgTUFURVJJQUxTIEFSRSBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCitJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKK1RPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCitNQVRFUklBTFMgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgTUFURVJJQUxTLgorCisKK1NHSSBGUkVFIFNPRlRXQVJFIExJQ0VOU0UgQiAoVmVyc2lvbiAyLjAsIFNlcHQuIDE4LCAyMDA4KQorCitDb3B5cmlnaHQgKEMpIDE5OTIgU2lsaWNvbiBHcmFwaGljcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCit0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgordGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bwordXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKK29mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbworc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBpbmNsdWRpbmcgdGhlIGRhdGVzIG9mIGZpcnN0IHB1YmxpY2F0aW9uIGFuZCBlaXRoZXIKK3RoaXMgcGVybWlzc2lvbiBub3RpY2Ugb3IgYSByZWZlcmVuY2UgdG8gaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0ZyZWVCLworc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuIAorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBTSUxJQ09OCitHUkFQSElDUywgSU5DLiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KK1dJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuIHNoYWxsCitub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyCitkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gU2lsaWNvbgorR3JhcGhpY3MsIEluYy4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCittZXQ6CisKKyAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCitBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCitEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKK1RIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworTGljZW5zZSBjb3BpZWQgZnJvbSBiaW4vbGNvdjoKKworIworIyAgIENvcHlyaWdodCAoYykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyAgQ29ycC4sIDIwMDIsMjAwNworIworIyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisjICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgCisjCisjICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorCisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKKworIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcworIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgorCisJCQkgICAgUHJlYW1ibGUKKworICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCitmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQorc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCit1c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Cit0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSAgWW91IGNhbiBhcHBseSBpdCB0bworeW91ciBwcm9ncmFtcywgdG9vLgorCisgIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKK3ByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKK2hhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKK3RoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAoraWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQKK2luIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KKworICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCithbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuCitUaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmIHlvdQorZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0LgorCisgIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIKK2dyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdAoreW91IGhhdmUuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUKK3NvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIKK3JpZ2h0cy4KKworICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kCisoMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LAorZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4KKworICBBbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFuZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbgordGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKK3NvZnR3YXJlLiAgSWYgdGhlIHNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQord2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28KK3RoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsCithdXRob3JzJyByZXB1dGF0aW9ucy4KKworICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZQorcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZQorcHJvZ3JhbSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCBpbiBlZmZlY3QgbWFraW5nIHRoZQorcHJvZ3JhbSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55CitwYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgorCisgIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCittb2RpZmljYXRpb24gZm9sbG93LgorCisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCisKKyAgMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucworYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKK3VuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUgIlByb2dyYW0iLCBiZWxvdywKK3JlZmVycyB0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIgorbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoKK3RoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsCitlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlcgorbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbgordGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCisKK0FjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Citjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCitydW5uaW5nIHRoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtCitpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4KK1doZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgorCisgIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncworc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91Citjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlCitjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlCitub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7CithbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlCithbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgorCitZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKK3lvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCisKKyAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbgorb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZAorZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCithYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgorCisgICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KKworICAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbgorICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQorICAgIHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkCisgICAgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgorCisgICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseQorICAgIHdoZW4gcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2gKKyAgICBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCisgICAgYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhCisgICAgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlCisgICAgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlcgorICAgIHRoZXNlIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzCisgICAgTGljZW5zZS4gIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQKKyAgICBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uCisgICAgdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCisKK1RoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKK2lkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCithbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KK3RoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKK3NlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQorZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCitvbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKK3RoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCitlbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCisKK1RodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoreW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCitleGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKK2NvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCisKK0luIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KK3dpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgorYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKK3RoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCit1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKK1NlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKKyAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKKyAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCisgICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKKyAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCisgICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQorICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCisgICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKKyAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcworICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91CisgICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAorICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQorCitUaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCittYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQorY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKK2Fzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bworY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQorc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCithbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQorZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKK29wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50CitpdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCisKK0lmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKK2FjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKK2FjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcworZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Citjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgorCisgIDQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQorZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdAorb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGlzCit2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuCitIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlcgordGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2gKK3BhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KKworICA1LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKK3NpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCitkaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKK3Byb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKK21vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKK2FsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKK3RoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgorCisgIDYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCitvcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvCit0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgorcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgorWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KK3RoaXMgTGljZW5zZS4KKworICA3LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50CitpbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAorY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgorb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAorZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKK2Rpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKK0xpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKK21heSBub3QgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKK2xpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkKK2FsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgordGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bworcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbS4KKworSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCithbnkgcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvCithcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgorY2lyY3Vtc3RhbmNlcy4KKworSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQorcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKK3N1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKK2ludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcworaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCitnZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCit0aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAorc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwordG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90CitpbXBvc2UgdGhhdCBjaG9pY2UuCisKK1RoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bworYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCisKKyAgOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4KK2NlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQorb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZQorbWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nCit0aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCitjb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKK3RoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgorCisgIDkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zCitvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKK2JlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bworYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCisKK0VhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0KK3NwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55CitsYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCitlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZgordGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbi4KKworICAxMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlCitwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yCit0byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcworbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMKK29mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQKK29mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgorCisJCQkgICAgTk8gV0FSUkFOVFkKKworICAxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKK0ZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTgorT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUworUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQKK09SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTCitUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFCitQUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywKK1JFUEFJUiBPUiBDT1JSRUNUSU9OLgorCisgIDEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKK1dJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IKK1JFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsCitJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcKK09VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQKK1RPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWQorWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIKK1BST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRQorUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorCisJCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKKwkgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCisKKyAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAorcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAorZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCisKKyAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKK3RvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKK2NvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Cit0aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+CisgICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgorCitJZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzCit3aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgorCisgICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSB5ZWFyIG5hbWUgb2YgYXV0aG9yCisgICAgR25vbW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgorICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKKyAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCisKK1RoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQorcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heQorYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleSBjb3VsZCBldmVuIGJlCittb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgorCitZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgorc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYKK25lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKKworICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZSBwcm9ncmFtCisgIGBHbm9tb3Zpc2lvbicgKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gYnkgSmFtZXMgSGFja2VyLgorCisgIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk4OQorICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQorCitUaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KK3Byb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5Citjb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKK2xpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExlc3NlciBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KKworQ29weXJpZ2h0IChjKSAyMDExIFRoZSBMZXZlbERCIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorbWV0OgorCisgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Citub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKK2NvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKK2luIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKK2Rpc3RyaWJ1dGlvbi4KKyAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KK3RoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCitMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKK0EgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCitPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKK1NQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKK0xJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCitUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKK09GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggTlZJRElBLCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworQ29weXJpZ2h0IDIwMDAtMjAwNyBOaWVscyBQcm92b3MgPHByb3Zvc0BjaXRpLnVtaWNoLmVkdT4KK0NvcHlyaWdodCAyMDA3LTIwMDkgTmllbHMgUHJvdm9zIGFuZCBOaWNrIE1hdGhld3NvbgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworYXJlIG1ldDoKKzEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKzMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCitJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCitPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCitOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCitEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKK1RIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworQ29weXJpZ2h0IChjKSAyMDEzLCBHb29nbGUgSW5jLgorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAgICogVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCitBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCitJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCitMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCitDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCitHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKK0hPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKK1NUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkKK1dBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCitTVUNIIERBTUFHRS4KKyhDb3BpZWQgZnJvbSB0aGUgUkVBRE1FLikKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGF1dGhvcnMgbWFrZSBOTyBXQVJSQU5UWSBvciByZXByZXNlbnRhdGlvbiwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZCwKK3dpdGggcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLCBpdHMgcXVhbGl0eSwgYWNjdXJhY3ksIG1lcmNoYW50YWJpbGl0eSwgb3IKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiQVMgSVMiLCBhbmQgeW91LAoraXRzIHVzZXIsIGFzc3VtZSB0aGUgZW50aXJlIHJpc2sgYXMgdG8gaXRzIHF1YWxpdHkgYW5kIGFjY3VyYWN5LgorCitUaGlzIHNvZnR3YXJlIGlzIGNvcHlyaWdodCAoQykgMTk5MS0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KK0FsbCBSaWdodHMgUmVzZXJ2ZWQgZXhjZXB0IGFzIHNwZWNpZmllZCBiZWxvdy4KKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworc29mdHdhcmUgKG9yIHBvcnRpb25zIHRoZXJlb2YpIGZvciBhbnkgcHVycG9zZSwgd2l0aG91dCBmZWUsIHN1YmplY3QgdG8gdGhlc2UKK2NvbmRpdGlvbnM6CisoMSkgSWYgYW55IHBhcnQgb2YgdGhlIHNvdXJjZSBjb2RlIGZvciB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkLCB0aGVuIHRoaXMKK1JFQURNRSBmaWxlIG11c3QgYmUgaW5jbHVkZWQsIHdpdGggdGhpcyBjb3B5cmlnaHQgYW5kIG5vLXdhcnJhbnR5IG5vdGljZQordW5hbHRlcmVkOyBhbmQgYW55IGFkZGl0aW9ucywgZGVsZXRpb25zLCBvciBjaGFuZ2VzIHRvIHRoZSBvcmlnaW5hbCBmaWxlcworbXVzdCBiZSBjbGVhcmx5IGluZGljYXRlZCBpbiBhY2NvbXBhbnlpbmcgZG9jdW1lbnRhdGlvbi4KKygyKSBJZiBvbmx5IGV4ZWN1dGFibGUgY29kZSBpcyBkaXN0cmlidXRlZCwgdGhlbiB0aGUgYWNjb21wYW55aW5nCitkb2N1bWVudGF0aW9uIG11c3Qgc3RhdGUgdGhhdCAidGhpcyBzb2Z0d2FyZSBpcyBiYXNlZCBpbiBwYXJ0IG9uIHRoZSB3b3JrIG9mCit0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCIuCisoMykgUGVybWlzc2lvbiBmb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ3JhbnRlZCBvbmx5IGlmIHRoZSB1c2VyIGFjY2VwdHMKK2Z1bGwgcmVzcG9uc2liaWxpdHkgZm9yIGFueSB1bmRlc2lyYWJsZSBjb25zZXF1ZW5jZXM7IHRoZSBhdXRob3JzIGFjY2VwdAorTk8gTElBQklMSVRZIGZvciBkYW1hZ2VzIG9mIGFueSBraW5kLgorCitUaGVzZSBjb25kaXRpb25zIGFwcGx5IHRvIGFueSBzb2Z0d2FyZSBkZXJpdmVkIGZyb20gb3IgYmFzZWQgb24gdGhlIElKRyBjb2RlLAorbm90IGp1c3QgdG8gdGhlIHVubW9kaWZpZWQgbGlicmFyeS4gIElmIHlvdSB1c2Ugb3VyIHdvcmssIHlvdSBvdWdodCB0bworYWNrbm93bGVkZ2UgdXMuCisKK1Blcm1pc3Npb24gaXMgTk9UIGdyYW50ZWQgZm9yIHRoZSB1c2Ugb2YgYW55IElKRyBhdXRob3IncyBuYW1lIG9yIGNvbXBhbnkgbmFtZQoraW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHJlbGF0aW5nIHRvIHRoaXMgc29mdHdhcmUgb3IgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCitpdC4gIFRoaXMgc29mdHdhcmUgbWF5IGJlIHJlZmVycmVkIHRvIG9ubHkgYXMgInRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3MKK3NvZnR3YXJlIi4KKworV2Ugc3BlY2lmaWNhbGx5IHBlcm1pdCBhbmQgZW5jb3VyYWdlIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhcyB0aGUgYmFzaXMgb2YKK2NvbW1lcmNpYWwgcHJvZHVjdHMsIHByb3ZpZGVkIHRoYXQgYWxsIHdhcnJhbnR5IG9yIGxpYWJpbGl0eSBjbGFpbXMgYXJlCithc3N1bWVkIGJ5IHRoZSBwcm9kdWN0IHZlbmRvci4KKworCithbnNpMmtuci5jIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGJ5IHBlcm1pc3Npb24gb2YgTC4gUGV0ZXIgRGV1dHNjaCwKK3NvbGUgcHJvcHJpZXRvciBvZiBpdHMgY29weXJpZ2h0IGhvbGRlciwgQWxhZGRpbiBFbnRlcnByaXNlcyBvZiBNZW5sbyBQYXJrLCBDQS4KK2Fuc2kya25yLmMgaXMgTk9UIGNvdmVyZWQgYnkgdGhlIGFib3ZlIGNvcHlyaWdodCBhbmQgY29uZGl0aW9ucywgYnV0IGluc3RlYWQKK2J5IHRoZSB1c3VhbCBkaXN0cmlidXRpb24gdGVybXMgb2YgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgcHJpbmNpcGFsbHksCit0aGF0IHlvdSBtdXN0IGluY2x1ZGUgc291cmNlIGNvZGUgaWYgeW91IHJlZGlzdHJpYnV0ZSBpdC4gIChTZWUgdGhlIGZpbGUKK2Fuc2kya25yLmMgZm9yIGZ1bGwgZGV0YWlscy4pICBIb3dldmVyLCBzaW5jZSBhbnNpMmtuci5jIGlzIG5vdCBuZWVkZWQgYXMgcGFydAorb2YgYW55IHByb2dyYW0gZ2VuZXJhdGVkIGZyb20gdGhlIElKRyBjb2RlLCB0aGlzIGRvZXMgbm90IGxpbWl0IHlvdSBtb3JlIHRoYW4KK3RoZSBmb3JlZ29pbmcgcGFyYWdyYXBocyBkby4KKworVGhlIFVuaXggY29uZmlndXJhdGlvbiBzY3JpcHQgImNvbmZpZ3VyZSIgd2FzIHByb2R1Y2VkIHdpdGggR05VIEF1dG9jb25mLgorSXQgaXMgY29weXJpZ2h0IGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gYnV0IGlzIGZyZWVseSBkaXN0cmlidXRhYmxlLgorVGhlIHNhbWUgaG9sZHMgZm9yIGl0cyBzdXBwb3J0aW5nIHNjcmlwdHMgKGNvbmZpZy5ndWVzcywgY29uZmlnLnN1YiwKK2x0Y29uZmlnLCBsdG1haW4uc2gpLiAgQW5vdGhlciBzdXBwb3J0IHNjcmlwdCwgaW5zdGFsbC1zaCwgaXMgY29weXJpZ2h0CitieSBNLkkuVC4gYnV0IGlzIGFsc28gZnJlZWx5IGRpc3RyaWJ1dGFibGUuCisKK0l0IGFwcGVhcnMgdGhhdCB0aGUgYXJpdGhtZXRpYyBjb2Rpbmcgb3B0aW9uIG9mIHRoZSBKUEVHIHNwZWMgaXMgY292ZXJlZCBieQorcGF0ZW50cyBvd25lZCBieSBJQk0sIEFUJlQsIGFuZCBNaXRzdWJpc2hpLiAgSGVuY2UgYXJpdGhtZXRpYyBjb2RpbmcgY2Fubm90CitsZWdhbGx5IGJlIHVzZWQgd2l0aG91dCBvYnRhaW5pbmcgb25lIG9yIG1vcmUgbGljZW5zZXMuICBGb3IgdGhpcyByZWFzb24sCitzdXBwb3J0IGZvciBhcml0aG1ldGljIGNvZGluZyBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIGZyZWUgSlBFRyBzb2Z0d2FyZS4KKyhTaW5jZSBhcml0aG1ldGljIGNvZGluZyBwcm92aWRlcyBvbmx5IGEgbWFyZ2luYWwgZ2FpbiBvdmVyIHRoZSB1bnBhdGVudGVkCitIdWZmbWFuIG1vZGUsIGl0IGlzIHVubGlrZWx5IHRoYXQgdmVyeSBtYW55IGltcGxlbWVudGF0aW9ucyB3aWxsIHN1cHBvcnQgaXQuKQorU28gZmFyIGFzIHdlIGFyZSBhd2FyZSwgdGhlcmUgYXJlIG5vIHBhdGVudCByZXN0cmljdGlvbnMgb24gdGhlIHJlbWFpbmluZworY29kZS4KKworVGhlIElKRyBkaXN0cmlidXRpb24gZm9ybWVybHkgaW5jbHVkZWQgY29kZSB0byByZWFkIGFuZCB3cml0ZSBHSUYgZmlsZXMuCitUbyBhdm9pZCBlbnRhbmdsZW1lbnQgd2l0aCB0aGUgVW5pc3lzIExaVyBwYXRlbnQsIEdJRiByZWFkaW5nIHN1cHBvcnQgaGFzCitiZWVuIHJlbW92ZWQgYWx0b2dldGhlciwgYW5kIHRoZSBHSUYgd3JpdGVyIGhhcyBiZWVuIHNpbXBsaWZpZWQgdG8gcHJvZHVjZQorInVuY29tcHJlc3NlZCBHSUZzIi4gIFRoaXMgdGVjaG5pcXVlIGRvZXMgbm90IHVzZSB0aGUgTFpXIGFsZ29yaXRobTsgdGhlCityZXN1bHRpbmcgR0lGIGZpbGVzIGFyZSBsYXJnZXIgdGhhbiB1c3VhbCwgYnV0IGFyZSByZWFkYWJsZSBieSBhbGwgc3RhbmRhcmQKK0dJRiBkZWNvZGVycy4KKworV2UgYXJlIHJlcXVpcmVkIHRvIHN0YXRlIHRoYXQKKyAgICAiVGhlIEdyYXBoaWNzIEludGVyY2hhbmdlIEZvcm1hdChjKSBpcyB0aGUgQ29weXJpZ2h0IHByb3BlcnR5IG9mCisgICAgQ29tcHVTZXJ2ZSBJbmNvcnBvcmF0ZWQuICBHSUYoc20pIGlzIGEgU2VydmljZSBNYXJrIHByb3BlcnR5IG9mCisgICAgQ29tcHVTZXJ2ZSBJbmNvcnBvcmF0ZWQuIgorCitDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4KKworTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cit5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKK1RoaXMgY29weSBvZiB0aGUgbGlicG5nIG5vdGljZXMgaXMgcHJvdmlkZWQgZm9yIHlvdXIgY29udmVuaWVuY2UuICBJbiBjYXNlIG9mCithbnkgZGlzY3JlcGFuY3kgYmV0d2VlbiB0aGlzIGNvcHkgYW5kIHRoZSBub3RpY2VzIGluIHRoZSBmaWxlIHBuZy5oIHRoYXQgaXMKK2luY2x1ZGVkIGluIHRoZSBsaWJwbmcgZGlzdHJpYnV0aW9uLCB0aGUgbGF0dGVyIHNoYWxsIHByZXZhaWwuCisKK0NPUFlSSUdIVCBOT1RJQ0UsIERJU0NMQUlNRVIsIGFuZCBMSUNFTlNFOgorCitJZiB5b3UgbW9kaWZ5IGxpYnBuZyB5b3UgbWF5IGluc2VydCBhZGRpdGlvbmFsIG5vdGljZXMgaW1tZWRpYXRlbHkgZm9sbG93aW5nCit0aGlzIHNlbnRlbmNlLgorCitUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgorCitsaWJwbmcgdmVyc2lvbnMgMS4yLjYsIEF1Z3VzdCAxNSwgMjAwNCwgdGhyb3VnaCAxLjIuNDUsIEp1bHkgNywgMjAxMSwgYXJlCitDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYtMjAwOSBHbGVubiBSYW5kZXJzLVBlaHJzb24sIGFuZCBhcmUKK2Rpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgc2FtZSBkaXNjbGFpbWVyIGFuZCBsaWNlbnNlIGFzIGxpYnBuZy0xLjIuNQord2l0aCB0aGUgZm9sbG93aW5nIGluZGl2aWR1YWwgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgQ29udHJpYnV0aW5nIEF1dGhvcnMKKworICAgQ29zbWluIFRydXRhCisKK2xpYnBuZyB2ZXJzaW9ucyAxLjAuNywgSnVseSAxLCAyMDAwLCB0aHJvdWdoIDEuMi41IC0gT2N0b2JlciAzLCAyMDAyLCBhcmUKK0NvcHlyaWdodCAoYykgMjAwMC0yMDAyIEdsZW5uIFJhbmRlcnMtUGVocnNvbiwgYW5kIGFyZQorZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzYW1lIGRpc2NsYWltZXIgYW5kIGxpY2Vuc2UgYXMgbGlicG5nLTEuMC42Cit3aXRoIHRoZSBmb2xsb3dpbmcgaW5kaXZpZHVhbHMgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgQ29udHJpYnV0aW5nIEF1dGhvcnMKKworICAgU2ltb24tUGllcnJlIENhZGlldXgKKyAgIEVyaWMgUy4gUmF5bW9uZAorICAgR2lsbGVzIFZvbGxhbnQKKworYW5kIHdpdGggdGhlIGZvbGxvd2luZyBhZGRpdGlvbnMgdG8gdGhlIGRpc2NsYWltZXI6CisKKyAgIFRoZXJlIGlzIG5vIHdhcnJhbnR5IGFnYWluc3QgaW50ZXJmZXJlbmNlIHdpdGggeW91ciBlbmpveW1lbnQgb2YgdGhlCisgICBsaWJyYXJ5IG9yIGFnYWluc3QgaW5mcmluZ2VtZW50LiAgVGhlcmUgaXMgbm8gd2FycmFudHkgdGhhdCBvdXIKKyAgIGVmZm9ydHMgb3IgdGhlIGxpYnJhcnkgd2lsbCBmdWxmaWxsIGFueSBvZiB5b3VyIHBhcnRpY3VsYXIgcHVycG9zZXMKKyAgIG9yIG5lZWRzLiAgVGhpcyBsaWJyYXJ5IGlzIHByb3ZpZGVkIHdpdGggYWxsIGZhdWx0cywgYW5kIHRoZSBlbnRpcmUKKyAgIHJpc2sgb2Ygc2F0aXNmYWN0b3J5IHF1YWxpdHksIHBlcmZvcm1hbmNlLCBhY2N1cmFjeSwgYW5kIGVmZm9ydCBpcyB3aXRoCisgICB0aGUgdXNlci4KKworbGlicG5nIHZlcnNpb25zIDAuOTcsIEphbnVhcnkgMTk5OCwgdGhyb3VnaCAxLjAuNiwgTWFyY2ggMjAsIDIwMDAsIGFyZQorQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5IEdsZW5uIFJhbmRlcnMtUGVocnNvbiwgYW5kIGFyZQorZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzYW1lIGRpc2NsYWltZXIgYW5kIGxpY2Vuc2UgYXMgbGlicG5nLTAuOTYsCit3aXRoIHRoZSBmb2xsb3dpbmcgaW5kaXZpZHVhbHMgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgQ29udHJpYnV0aW5nIEF1dGhvcnM6CisKKyAgIFRvbSBMYW5lCisgICBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyAgIFdpbGxlbSB2YW4gU2NoYWlrCisKK2xpYnBuZyB2ZXJzaW9ucyAwLjg5LCBKdW5lIDE5OTYsIHRocm91Z2ggMC45NiwgTWF5IDE5OTcsIGFyZQorQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyCitEaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHNhbWUgZGlzY2xhaW1lciBhbmQgbGljZW5zZSBhcyBsaWJwbmctMC44OCwKK3dpdGggdGhlIGZvbGxvd2luZyBpbmRpdmlkdWFscyBhZGRlZCB0byB0aGUgbGlzdCBvZiBDb250cmlidXRpbmcgQXV0aG9yczoKKworICAgSm9obiBCb3dsZXIKKyAgIEtldmluIEJyYWNleQorICAgU2FtIEJ1c2hlbGwKKyAgIE1hZ251cyBIb2xtZ3JlbgorICAgR3JlZyBSb2Vsb2ZzCisgICBUb20gVGFubmVyCisKK2xpYnBuZyB2ZXJzaW9ucyAwLjUsIE1heSAxOTk1LCB0aHJvdWdoIDAuODgsIEphbnVhcnkgMTk5NiwgYXJlCitDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuCisKK0ZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UsICJDb250cmlidXRpbmcgQXV0aG9ycyIKK2lzIGRlZmluZWQgYXMgdGhlIGZvbGxvd2luZyBzZXQgb2YgaW5kaXZpZHVhbHM6CisKKyAgIEFuZHJlYXMgRGlsZ2VyCisgICBEYXZlIE1hcnRpbmRhbGUKKyAgIEd1eSBFcmljIFNjaGFsbmF0CisgICBQYXVsIFNjaG1pZHQKKyAgIFRpbSBXZWduZXIKKworVGhlIFBORyBSZWZlcmVuY2UgTGlicmFyeSBpcyBzdXBwbGllZCAiQVMgSVMiLiAgVGhlIENvbnRyaWJ1dGluZyBBdXRob3JzCithbmQgR3JvdXAgNDIsIEluYy4gZGlzY2xhaW0gYWxsIHdhcnJhbnRpZXMsIGV4cHJlc3NlZCBvciBpbXBsaWVkLAoraW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZSB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgb2YKK2ZpdG5lc3MgZm9yIGFueSBwdXJwb3NlLiAgVGhlIENvbnRyaWJ1dGluZyBBdXRob3JzIGFuZCBHcm91cCA0MiwgSW5jLgorYXNzdW1lIG5vIGxpYWJpbGl0eSBmb3IgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCB3aGljaCBtYXkgcmVzdWx0IGZyb20gdGhlIHVzZSBvZiB0aGUgUE5HCitSZWZlcmVuY2UgTGlicmFyeSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworc291cmNlIGNvZGUsIG9yIHBvcnRpb25zIGhlcmVvZiwgZm9yIGFueSBwdXJwb3NlLCB3aXRob3V0IGZlZSwgc3ViamVjdAordG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisKKzEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb3VyY2UgY29kZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZC4KKworMi4gQWx0ZXJlZCB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2ggYW5kIG11c3Qgbm90CisgICBiZSBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc291cmNlLgorCiszLiBUaGlzIENvcHlyaWdodCBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkKKyAgIHNvdXJjZSBvciBhbHRlcmVkIHNvdXJjZSBkaXN0cmlidXRpb24uCisKK1RoZSBDb250cmlidXRpbmcgQXV0aG9ycyBhbmQgR3JvdXAgNDIsIEluYy4gc3BlY2lmaWNhbGx5IHBlcm1pdCwgd2l0aG91dAorZmVlLCBhbmQgZW5jb3VyYWdlIHRoZSB1c2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBhcyBhIGNvbXBvbmVudCB0bworc3VwcG9ydGluZyB0aGUgUE5HIGZpbGUgZm9ybWF0IGluIGNvbW1lcmNpYWwgcHJvZHVjdHMuICBJZiB5b3UgdXNlIHRoaXMKK3NvdXJjZSBjb2RlIGluIGEgcHJvZHVjdCwgYWNrbm93bGVkZ21lbnQgaXMgbm90IHJlcXVpcmVkIGJ1dCB3b3VsZCBiZQorYXBwcmVjaWF0ZWQuCisKKworQSAicG5nX2dldF9jb3B5cmlnaHQiIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSwgZm9yIGNvbnZlbmllbnQgdXNlIGluICJhYm91dCIKK2JveGVzIGFuZCB0aGUgbGlrZToKKworICAgcHJpbnRmKCIlcyIscG5nX2dldF9jb3B5cmlnaHQoTlVMTCkpOworCitBbHNvLCB0aGUgUE5HIGxvZ28gKGluIFBORyBmb3JtYXQsIG9mIGNvdXJzZSkgaXMgc3VwcGxpZWQgaW4gdGhlCitmaWxlcyAicG5nYmFyLnBuZyIgYW5kICJwbmdiYXIuanBnICg4OHgzMSkgYW5kICJwbmdub3cucG5nIiAoOTh4MzEpLgorCitMaWJwbmcgaXMgT1NJIENlcnRpZmllZCBPcGVuIFNvdXJjZSBTb2Z0d2FyZS4gIE9TSSBDZXJ0aWZpZWQgT3BlbiBTb3VyY2UgaXMgYQorY2VydGlmaWNhdGlvbiBtYXJrIG9mIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCitHbGVubiBSYW5kZXJzLVBlaHJzb24KK2dsZW5ucnAgYXQgdXNlcnMuc291cmNlZm9yZ2UubmV0CitKdWx5IDcsIDIwMTEKKworCQkgIEdOVSBMRVNTRVIgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorCQkgICAgICAgVmVyc2lvbiAyLjEsIEZlYnJ1YXJ5IDE5OTkKKworIENvcHlyaWdodCAoQykgMTk5MSwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKKyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworW1RoaXMgaXMgdGhlIGZpcnN0IHJlbGVhc2VkIHZlcnNpb24gb2YgdGhlIExlc3NlciBHUEwuICBJdCBhbHNvIGNvdW50cworIGFzIHRoZSBzdWNjZXNzb3Igb2YgdGhlIEdOVSBMaWJyYXJ5IFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIGhlbmNlCisgdGhlIHZlcnNpb24gbnVtYmVyIDIuMS5dCisKKwkJCSAgICBQcmVhbWJsZQorCisgIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKK2ZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlcyBhcmUgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlCitmcmVlIHNvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuCisKKyAgVGhpcyBsaWNlbnNlLCB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFwcGxpZXMgdG8gc29tZQorc3BlY2lhbGx5IGRlc2lnbmF0ZWQgc29mdHdhcmUgcGFja2FnZXMtLXR5cGljYWxseSBsaWJyYXJpZXMtLW9mIHRoZQorRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCBvdGhlciBhdXRob3JzIHdobyBkZWNpZGUgdG8gdXNlIGl0LiAgWW91CitjYW4gdXNlIGl0IHRvbywgYnV0IHdlIHN1Z2dlc3QgeW91IGZpcnN0IHRoaW5rIGNhcmVmdWxseSBhYm91dCB3aGV0aGVyCit0aGlzIGxpY2Vuc2Ugb3IgdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgdGhlIGJldHRlcgorc3RyYXRlZ3kgdG8gdXNlIGluIGFueSBwYXJ0aWN1bGFyIGNhc2UsIGJhc2VkIG9uIHRoZSBleHBsYW5hdGlvbnMgYmVsb3cuCisKKyAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20gb2YgdXNlLAorbm90IHByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdAoreW91IGhhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZQorZm9yIHRoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCk7IHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldAoraXQgaWYgeW91IHdhbnQgaXQ7IHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIGFuZCB1c2UgcGllY2VzIG9mCitpdCBpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGFyZSBpbmZvcm1lZCB0aGF0IHlvdSBjYW4gZG8KK3RoZXNlIHRoaW5ncy4KKworICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCitkaXN0cmlidXRvcnMgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZXNlCityaWdodHMuICBUaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IKK3lvdSBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIGxpYnJhcnkgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBsaWJyYXJ5LCB3aGV0aGVyIGdyYXRpcworb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQgd2UgZ2F2ZQoreW91LiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlIHNvdXJjZQorY29kZS4gIElmIHlvdSBsaW5rIG90aGVyIGNvZGUgd2l0aCB0aGUgbGlicmFyeSwgeW91IG11c3QgcHJvdmlkZQorY29tcGxldGUgb2JqZWN0IGZpbGVzIHRvIHRoZSByZWNpcGllbnRzLCBzbyB0aGF0IHRoZXkgY2FuIHJlbGluayB0aGVtCit3aXRoIHRoZSBsaWJyYXJ5IGFmdGVyIG1ha2luZyBjaGFuZ2VzIHRvIHRoZSBsaWJyYXJ5IGFuZCByZWNvbXBpbGluZworaXQuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpciByaWdodHMuCisKKyAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIGEgdHdvLXN0ZXAgbWV0aG9kOiAoMSkgd2UgY29weXJpZ2h0IHRoZQorbGlicmFyeSwgYW5kICgyKSB3ZSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlLCB3aGljaCBnaXZlcyB5b3UgbGVnYWwKK3Blcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBsaWJyYXJ5LgorCisgIFRvIHByb3RlY3QgZWFjaCBkaXN0cmlidXRvciwgd2Ugd2FudCB0byBtYWtlIGl0IHZlcnkgY2xlYXIgdGhhdAordGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoZSBmcmVlIGxpYnJhcnkuICBBbHNvLCBpZiB0aGUgbGlicmFyeSBpcworbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHRoZSByZWNpcGllbnRzIHNob3VsZCBrbm93Cit0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwgdmVyc2lvbiwgc28gdGhhdCB0aGUgb3JpZ2luYWwKK2F1dGhvcidzIHJlcHV0YXRpb24gd2lsbCBub3QgYmUgYWZmZWN0ZWQgYnkgcHJvYmxlbXMgdGhhdCBtaWdodCBiZQoraW50cm9kdWNlZCBieSBvdGhlcnMuCisMCisgIEZpbmFsbHksIHNvZnR3YXJlIHBhdGVudHMgcG9zZSBhIGNvbnN0YW50IHRocmVhdCB0byB0aGUgZXhpc3RlbmNlIG9mCithbnkgZnJlZSBwcm9ncmFtLiAgV2Ugd2lzaCB0byBtYWtlIHN1cmUgdGhhdCBhIGNvbXBhbnkgY2Fubm90CitlZmZlY3RpdmVseSByZXN0cmljdCB0aGUgdXNlcnMgb2YgYSBmcmVlIHByb2dyYW0gYnkgb2J0YWluaW5nIGEKK3Jlc3RyaWN0aXZlIGxpY2Vuc2UgZnJvbSBhIHBhdGVudCBob2xkZXIuICBUaGVyZWZvcmUsIHdlIGluc2lzdCB0aGF0CithbnkgcGF0ZW50IGxpY2Vuc2Ugb2J0YWluZWQgZm9yIGEgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBtdXN0IGJlCitjb25zaXN0ZW50IHdpdGggdGhlIGZ1bGwgZnJlZWRvbSBvZiB1c2Ugc3BlY2lmaWVkIGluIHRoaXMgbGljZW5zZS4KKworICBNb3N0IEdOVSBzb2Z0d2FyZSwgaW5jbHVkaW5nIHNvbWUgbGlicmFyaWVzLCBpcyBjb3ZlcmVkIGJ5IHRoZQorb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGlzIGxpY2Vuc2UsIHRoZSBHTlUgTGVzc2VyCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhcHBsaWVzIHRvIGNlcnRhaW4gZGVzaWduYXRlZCBsaWJyYXJpZXMsIGFuZAoraXMgcXVpdGUgZGlmZmVyZW50IGZyb20gdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBXZSB1c2UKK3RoaXMgbGljZW5zZSBmb3IgY2VydGFpbiBsaWJyYXJpZXMgaW4gb3JkZXIgdG8gcGVybWl0IGxpbmtpbmcgdGhvc2UKK2xpYnJhcmllcyBpbnRvIG5vbi1mcmVlIHByb2dyYW1zLgorCisgIFdoZW4gYSBwcm9ncmFtIGlzIGxpbmtlZCB3aXRoIGEgbGlicmFyeSwgd2hldGhlciBzdGF0aWNhbGx5IG9yIHVzaW5nCithIHNoYXJlZCBsaWJyYXJ5LCB0aGUgY29tYmluYXRpb24gb2YgdGhlIHR3byBpcyBsZWdhbGx5IHNwZWFraW5nIGEKK2NvbWJpbmVkIHdvcmssIGEgZGVyaXZhdGl2ZSBvZiB0aGUgb3JpZ2luYWwgbGlicmFyeS4gIFRoZSBvcmRpbmFyeQorR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB0aGVyZWZvcmUgcGVybWl0cyBzdWNoIGxpbmtpbmcgb25seSBpZiB0aGUKK2VudGlyZSBjb21iaW5hdGlvbiBmaXRzIGl0cyBjcml0ZXJpYSBvZiBmcmVlZG9tLiAgVGhlIExlc3NlciBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBwZXJtaXRzIG1vcmUgbGF4IGNyaXRlcmlhIGZvciBsaW5raW5nIG90aGVyIGNvZGUgd2l0aAordGhlIGxpYnJhcnkuCisKKyAgV2UgY2FsbCB0aGlzIGxpY2Vuc2UgdGhlICJMZXNzZXIiIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYmVjYXVzZSBpdAorZG9lcyBMZXNzIHRvIHByb3RlY3QgdGhlIHVzZXIncyBmcmVlZG9tIHRoYW4gdGhlIG9yZGluYXJ5IEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlLiAgSXQgYWxzbyBwcm92aWRlcyBvdGhlciBmcmVlIHNvZnR3YXJlIGRldmVsb3BlcnMgTGVzcworb2YgYW4gYWR2YW50YWdlIG92ZXIgY29tcGV0aW5nIG5vbi1mcmVlIHByb2dyYW1zLiAgVGhlc2UgZGlzYWR2YW50YWdlcworYXJlIHRoZSByZWFzb24gd2UgdXNlIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtYW55CitsaWJyYXJpZXMuICBIb3dldmVyLCB0aGUgTGVzc2VyIGxpY2Vuc2UgcHJvdmlkZXMgYWR2YW50YWdlcyBpbiBjZXJ0YWluCitzcGVjaWFsIGNpcmN1bXN0YW5jZXMuCisKKyAgRm9yIGV4YW1wbGUsIG9uIHJhcmUgb2NjYXNpb25zLCB0aGVyZSBtYXkgYmUgYSBzcGVjaWFsIG5lZWQgdG8KK2VuY291cmFnZSB0aGUgd2lkZXN0IHBvc3NpYmxlIHVzZSBvZiBhIGNlcnRhaW4gbGlicmFyeSwgc28gdGhhdCBpdCBiZWNvbWVzCithIGRlLWZhY3RvIHN0YW5kYXJkLiAgVG8gYWNoaWV2ZSB0aGlzLCBub24tZnJlZSBwcm9ncmFtcyBtdXN0IGJlCithbGxvd2VkIHRvIHVzZSB0aGUgbGlicmFyeS4gIEEgbW9yZSBmcmVxdWVudCBjYXNlIGlzIHRoYXQgYSBmcmVlCitsaWJyYXJ5IGRvZXMgdGhlIHNhbWUgam9iIGFzIHdpZGVseSB1c2VkIG5vbi1mcmVlIGxpYnJhcmllcy4gIEluIHRoaXMKK2Nhc2UsIHRoZXJlIGlzIGxpdHRsZSB0byBnYWluIGJ5IGxpbWl0aW5nIHRoZSBmcmVlIGxpYnJhcnkgdG8gZnJlZQorc29mdHdhcmUgb25seSwgc28gd2UgdXNlIHRoZSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKworICBJbiBvdGhlciBjYXNlcywgcGVybWlzc2lvbiB0byB1c2UgYSBwYXJ0aWN1bGFyIGxpYnJhcnkgaW4gbm9uLWZyZWUKK3Byb2dyYW1zIGVuYWJsZXMgYSBncmVhdGVyIG51bWJlciBvZiBwZW9wbGUgdG8gdXNlIGEgbGFyZ2UgYm9keSBvZgorZnJlZSBzb2Z0d2FyZS4gIEZvciBleGFtcGxlLCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgR05VIEMgTGlicmFyeSBpbgorbm9uLWZyZWUgcHJvZ3JhbXMgZW5hYmxlcyBtYW55IG1vcmUgcGVvcGxlIHRvIHVzZSB0aGUgd2hvbGUgR05VCitvcGVyYXRpbmcgc3lzdGVtLCBhcyB3ZWxsIGFzIGl0cyB2YXJpYW50LCB0aGUgR05VL0xpbnV4IG9wZXJhdGluZworc3lzdGVtLgorCisgIEFsdGhvdWdoIHRoZSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBMZXNzIHByb3RlY3RpdmUgb2YgdGhlCit1c2VycycgZnJlZWRvbSwgaXQgZG9lcyBlbnN1cmUgdGhhdCB0aGUgdXNlciBvZiBhIHByb2dyYW0gdGhhdCBpcworbGlua2VkIHdpdGggdGhlIExpYnJhcnkgaGFzIHRoZSBmcmVlZG9tIGFuZCB0aGUgd2hlcmV3aXRoYWwgdG8gcnVuCit0aGF0IHByb2dyYW0gdXNpbmcgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBMaWJyYXJ5LgorCisgIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCittb2RpZmljYXRpb24gZm9sbG93LiAgUGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEKKyJ3b3JrIGJhc2VkIG9uIHRoZSBsaWJyYXJ5IiBhbmQgYSAid29yayB0aGF0IHVzZXMgdGhlIGxpYnJhcnkiLiAgVGhlCitmb3JtZXIgY29udGFpbnMgY29kZSBkZXJpdmVkIGZyb20gdGhlIGxpYnJhcnksIHdoZXJlYXMgdGhlIGxhdHRlciBtdXN0CitiZSBjb21iaW5lZCB3aXRoIHRoZSBsaWJyYXJ5IGluIG9yZGVyIHRvIHJ1bi4KKwwKKwkJICBHTlUgTEVTU0VSIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgorCisgIDAuIFRoaXMgTGljZW5zZSBBZ3JlZW1lbnQgYXBwbGllcyB0byBhbnkgc29mdHdhcmUgbGlicmFyeSBvciBvdGhlcgorcHJvZ3JhbSB3aGljaCBjb250YWlucyBhIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgb3IKK290aGVyIGF1dGhvcml6ZWQgcGFydHkgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YKK3RoaXMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKGFsc28gY2FsbGVkICJ0aGlzIExpY2Vuc2UiKS4KK0VhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgorCisgIEEgImxpYnJhcnkiIG1lYW5zIGEgY29sbGVjdGlvbiBvZiBzb2Z0d2FyZSBmdW5jdGlvbnMgYW5kL29yIGRhdGEKK3ByZXBhcmVkIHNvIGFzIHRvIGJlIGNvbnZlbmllbnRseSBsaW5rZWQgd2l0aCBhcHBsaWNhdGlvbiBwcm9ncmFtcworKHdoaWNoIHVzZSBzb21lIG9mIHRob3NlIGZ1bmN0aW9ucyBhbmQgZGF0YSkgdG8gZm9ybSBleGVjdXRhYmxlcy4KKworICBUaGUgIkxpYnJhcnkiLCBiZWxvdywgcmVmZXJzIHRvIGFueSBzdWNoIHNvZnR3YXJlIGxpYnJhcnkgb3Igd29yaword2hpY2ggaGFzIGJlZW4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlc2UgdGVybXMuICBBICJ3b3JrIGJhc2VkIG9uIHRoZQorTGlicmFyeSIgbWVhbnMgZWl0aGVyIHRoZSBMaWJyYXJ5IG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIKK2NvcHlyaWdodCBsYXc6IHRoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgTGlicmFyeSBvciBhCitwb3J0aW9uIG9mIGl0LCBlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkCitzdHJhaWdodGZvcndhcmRseSBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzCitpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4gdGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKQorCisgICJTb3VyY2UgY29kZSIgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCittYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhIGxpYnJhcnksIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG1lYW5zCithbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkgYXNzb2NpYXRlZAoraW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0byBjb250cm9sIGNvbXBpbGF0aW9uCithbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBsaWJyYXJ5LgorCisgIEFjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Citjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCitydW5uaW5nIGEgcHJvZ3JhbSB1c2luZyB0aGUgTGlicmFyeSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIG91dHB1dCBmcm9tCitzdWNoIGEgcHJvZ3JhbSBpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkCitvbiB0aGUgTGlicmFyeSAoaW5kZXBlbmRlbnQgb2YgdGhlIHVzZSBvZiB0aGUgTGlicmFyeSBpbiBhIHRvb2wgZm9yCit3cml0aW5nIGl0KS4gIFdoZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgTGlicmFyeSBkb2VzCithbmQgd2hhdCB0aGUgcHJvZ3JhbSB0aGF0IHVzZXMgdGhlIExpYnJhcnkgZG9lcy4KKyAgCisgIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIExpYnJhcnkncworY29tcGxldGUgc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQKK3lvdSBjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuCithcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdAorYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkKK3dhcnJhbnR5OyBhbmQgZGlzdHJpYnV0ZSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIGFsb25nIHdpdGggdGhlCitMaWJyYXJ5LgorCisgIFlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksCithbmQgeW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhCitmZWUuCisMCisgIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIExpYnJhcnkgb3IgYW55IHBvcnRpb24KK29mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCBhbmQgY29weSBhbmQKK2Rpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQorYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKKworICAgIGEpIFRoZSBtb2RpZmllZCB3b3JrIG11c3QgaXRzZWxmIGJlIGEgc29mdHdhcmUgbGlicmFyeS4KKworICAgIGIpIFlvdSBtdXN0IGNhdXNlIHRoZSBmaWxlcyBtb2RpZmllZCB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCisKKyAgICBjKSBZb3UgbXVzdCBjYXVzZSB0aGUgd2hvbGUgb2YgdGhlIHdvcmsgdG8gYmUgbGljZW5zZWQgYXQgbm8KKyAgICBjaGFyZ2UgdG8gYWxsIHRoaXJkIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKworICAgIGQpIElmIGEgZmFjaWxpdHkgaW4gdGhlIG1vZGlmaWVkIExpYnJhcnkgcmVmZXJzIHRvIGEgZnVuY3Rpb24gb3IgYQorICAgIHRhYmxlIG9mIGRhdGEgdG8gYmUgc3VwcGxpZWQgYnkgYW4gYXBwbGljYXRpb24gcHJvZ3JhbSB0aGF0IHVzZXMKKyAgICB0aGUgZmFjaWxpdHksIG90aGVyIHRoYW4gYXMgYW4gYXJndW1lbnQgcGFzc2VkIHdoZW4gdGhlIGZhY2lsaXR5CisgICAgaXMgaW52b2tlZCwgdGhlbiB5b3UgbXVzdCBtYWtlIGEgZ29vZCBmYWl0aCBlZmZvcnQgdG8gZW5zdXJlIHRoYXQsCisgICAgaW4gdGhlIGV2ZW50IGFuIGFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBseSBzdWNoIGZ1bmN0aW9uIG9yCisgICAgdGFibGUsIHRoZSBmYWNpbGl0eSBzdGlsbCBvcGVyYXRlcywgYW5kIHBlcmZvcm1zIHdoYXRldmVyIHBhcnQgb2YKKyAgICBpdHMgcHVycG9zZSByZW1haW5zIG1lYW5pbmdmdWwuCisKKyAgICAoRm9yIGV4YW1wbGUsIGEgZnVuY3Rpb24gaW4gYSBsaWJyYXJ5IHRvIGNvbXB1dGUgc3F1YXJlIHJvb3RzIGhhcworICAgIGEgcHVycG9zZSB0aGF0IGlzIGVudGlyZWx5IHdlbGwtZGVmaW5lZCBpbmRlcGVuZGVudCBvZiB0aGUKKyAgICBhcHBsaWNhdGlvbi4gIFRoZXJlZm9yZSwgU3Vic2VjdGlvbiAyZCByZXF1aXJlcyB0aGF0IGFueQorICAgIGFwcGxpY2F0aW9uLXN1cHBsaWVkIGZ1bmN0aW9uIG9yIHRhYmxlIHVzZWQgYnkgdGhpcyBmdW5jdGlvbiBtdXN0CisgICAgYmUgb3B0aW9uYWw6IGlmIHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgaXQsIHRoZSBzcXVhcmUKKyAgICByb290IGZ1bmN0aW9uIG11c3Qgc3RpbGwgY29tcHV0ZSBzcXVhcmUgcm9vdHMuKQorCitUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCitpZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBMaWJyYXJ5LAorYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCit0aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCitzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKK2Rpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAorb24gdGhlIExpYnJhcnksIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCit0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQorZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlCitpdC4KKworVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Cit5b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KK2V4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgorY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgTGlicmFyeS4KKworSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgTGlicmFyeQord2l0aCB0aGUgTGlicmFyeSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnkpIG9uIGEgdm9sdW1lIG9mCithIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgordGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KKworICAzLiBZb3UgbWF5IG9wdCB0byBhcHBseSB0aGUgdGVybXMgb2YgdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZSB0byBhIGdpdmVuIGNvcHkgb2YgdGhlIExpYnJhcnkuICBUbyBkbwordGhpcywgeW91IG11c3QgYWx0ZXIgYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlLCBzbwordGhhdCB0aGV5IHJlZmVyIHRvIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLAoraW5zdGVhZCBvZiB0byB0aGlzIExpY2Vuc2UuICAoSWYgYSBuZXdlciB2ZXJzaW9uIHRoYW4gdmVyc2lvbiAyIG9mIHRoZQorb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaGFzIGFwcGVhcmVkLCB0aGVuIHlvdSBjYW4gc3BlY2lmeQordGhhdCB2ZXJzaW9uIGluc3RlYWQgaWYgeW91IHdpc2guKSAgRG8gbm90IG1ha2UgYW55IG90aGVyIGNoYW5nZSBpbgordGhlc2Ugbm90aWNlcy4KKwwKKyAgT25jZSB0aGlzIGNoYW5nZSBpcyBtYWRlIGluIGEgZ2l2ZW4gY29weSwgaXQgaXMgaXJyZXZlcnNpYmxlIGZvcgordGhhdCBjb3B5LCBzbyB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBhbGwKK3N1YnNlcXVlbnQgY29waWVzIGFuZCBkZXJpdmF0aXZlIHdvcmtzIG1hZGUgZnJvbSB0aGF0IGNvcHkuCisKKyAgVGhpcyBvcHRpb24gaXMgdXNlZnVsIHdoZW4geW91IHdpc2ggdG8gY29weSBwYXJ0IG9mIHRoZSBjb2RlIG9mCit0aGUgTGlicmFyeSBpbnRvIGEgcHJvZ3JhbSB0aGF0IGlzIG5vdCBhIGxpYnJhcnkuCisKKyAgNC4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IChvciBhIHBvcnRpb24gb3IKK2Rlcml2YXRpdmUgb2YgaXQsIHVuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtCit1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhY2NvbXBhbnkKK2l0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZSBzb3VyY2UgY29kZSwgd2hpY2gKK211c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYQorbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlLgorCisgIElmIGRpc3RyaWJ1dGlvbiBvZiBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcyB0byBjb3B5Citmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZQorc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBzYXRpc2ZpZXMgdGhlIHJlcXVpcmVtZW50IHRvCitkaXN0cmlidXRlIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Citjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgorCisgIDUuIEEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIG5vIGRlcml2YXRpdmUgb2YgYW55IHBvcnRpb24gb2YgdGhlCitMaWJyYXJ5LCBidXQgaXMgZGVzaWduZWQgdG8gd29yayB3aXRoIHRoZSBMaWJyYXJ5IGJ5IGJlaW5nIGNvbXBpbGVkIG9yCitsaW5rZWQgd2l0aCBpdCwgaXMgY2FsbGVkIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5Ii4gIFN1Y2ggYQord29yaywgaW4gaXNvbGF0aW9uLCBpcyBub3QgYSBkZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnksIGFuZAordGhlcmVmb3JlIGZhbGxzIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KKworICBIb3dldmVyLCBsaW5raW5nIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB3aXRoIHRoZSBMaWJyYXJ5CitjcmVhdGVzIGFuIGV4ZWN1dGFibGUgdGhhdCBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIExpYnJhcnkgKGJlY2F1c2UgaXQKK2NvbnRhaW5zIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5KSwgcmF0aGVyIHRoYW4gYSAid29yayB0aGF0IHVzZXMgdGhlCitsaWJyYXJ5Ii4gIFRoZSBleGVjdXRhYmxlIGlzIHRoZXJlZm9yZSBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZS4KK1NlY3Rpb24gNiBzdGF0ZXMgdGVybXMgZm9yIGRpc3RyaWJ1dGlvbiBvZiBzdWNoIGV4ZWN1dGFibGVzLgorCisgIFdoZW4gYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHVzZXMgbWF0ZXJpYWwgZnJvbSBhIGhlYWRlciBmaWxlCit0aGF0IGlzIHBhcnQgb2YgdGhlIExpYnJhcnksIHRoZSBvYmplY3QgY29kZSBmb3IgdGhlIHdvcmsgbWF5IGJlIGEKK2Rlcml2YXRpdmUgd29yayBvZiB0aGUgTGlicmFyeSBldmVuIHRob3VnaCB0aGUgc291cmNlIGNvZGUgaXMgbm90LgorV2hldGhlciB0aGlzIGlzIHRydWUgaXMgZXNwZWNpYWxseSBzaWduaWZpY2FudCBpZiB0aGUgd29yayBjYW4gYmUKK2xpbmtlZCB3aXRob3V0IHRoZSBMaWJyYXJ5LCBvciBpZiB0aGUgd29yayBpcyBpdHNlbGYgYSBsaWJyYXJ5LiAgVGhlCit0aHJlc2hvbGQgZm9yIHRoaXMgdG8gYmUgdHJ1ZSBpcyBub3QgcHJlY2lzZWx5IGRlZmluZWQgYnkgbGF3LgorCisgIElmIHN1Y2ggYW4gb2JqZWN0IGZpbGUgdXNlcyBvbmx5IG51bWVyaWNhbCBwYXJhbWV0ZXJzLCBkYXRhCitzdHJ1Y3R1cmUgbGF5b3V0cyBhbmQgYWNjZXNzb3JzLCBhbmQgc21hbGwgbWFjcm9zIGFuZCBzbWFsbCBpbmxpbmUKK2Z1bmN0aW9ucyAodGVuIGxpbmVzIG9yIGxlc3MgaW4gbGVuZ3RoKSwgdGhlbiB0aGUgdXNlIG9mIHRoZSBvYmplY3QKK2ZpbGUgaXMgdW5yZXN0cmljdGVkLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMgbGVnYWxseSBhIGRlcml2YXRpdmUKK3dvcmsuICAoRXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGlzIG9iamVjdCBjb2RlIHBsdXMgcG9ydGlvbnMgb2YgdGhlCitMaWJyYXJ5IHdpbGwgc3RpbGwgZmFsbCB1bmRlciBTZWN0aW9uIDYuKQorCisgIE90aGVyd2lzZSwgaWYgdGhlIHdvcmsgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBMaWJyYXJ5LCB5b3UgbWF5CitkaXN0cmlidXRlIHRoZSBvYmplY3QgY29kZSBmb3IgdGhlIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gNi4KK0FueSBleGVjdXRhYmxlcyBjb250YWluaW5nIHRoYXQgd29yayBhbHNvIGZhbGwgdW5kZXIgU2VjdGlvbiA2LAord2hldGhlciBvciBub3QgdGhleSBhcmUgbGlua2VkIGRpcmVjdGx5IHdpdGggdGhlIExpYnJhcnkgaXRzZWxmLgorDAorICA2LiBBcyBhbiBleGNlcHRpb24gdG8gdGhlIFNlY3Rpb25zIGFib3ZlLCB5b3UgbWF5IGFsc28gY29tYmluZSBvcgorbGluayBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeSB0byBwcm9kdWNlIGEKK3dvcmsgY29udGFpbmluZyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSwgYW5kIGRpc3RyaWJ1dGUgdGhhdCB3b3JrCit1bmRlciB0ZXJtcyBvZiB5b3VyIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB0aGUgdGVybXMgcGVybWl0Cittb2RpZmljYXRpb24gb2YgdGhlIHdvcmsgZm9yIHRoZSBjdXN0b21lcidzIG93biB1c2UgYW5kIHJldmVyc2UKK2VuZ2luZWVyaW5nIGZvciBkZWJ1Z2dpbmcgc3VjaCBtb2RpZmljYXRpb25zLgorCisgIFlvdSBtdXN0IGdpdmUgcHJvbWluZW50IG5vdGljZSB3aXRoIGVhY2ggY29weSBvZiB0aGUgd29yayB0aGF0IHRoZQorTGlicmFyeSBpcyB1c2VkIGluIGl0IGFuZCB0aGF0IHRoZSBMaWJyYXJ5IGFuZCBpdHMgdXNlIGFyZSBjb3ZlcmVkIGJ5Cit0aGlzIExpY2Vuc2UuICBZb3UgbXVzdCBzdXBwbHkgYSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gIElmIHRoZSB3b3JrCitkdXJpbmcgZXhlY3V0aW9uIGRpc3BsYXlzIGNvcHlyaWdodCBub3RpY2VzLCB5b3UgbXVzdCBpbmNsdWRlIHRoZQorY29weXJpZ2h0IG5vdGljZSBmb3IgdGhlIExpYnJhcnkgYW1vbmcgdGhlbSwgYXMgd2VsbCBhcyBhIHJlZmVyZW5jZQorZGlyZWN0aW5nIHRoZSB1c2VyIHRvIHRoZSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gIEFsc28sIHlvdSBtdXN0IGRvIG9uZQorb2YgdGhlc2UgdGhpbmdzOgorCisgICAgYSkgQWNjb21wYW55IHRoZSB3b3JrIHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcKKyAgICBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZSBjb2RlIGZvciB0aGUgTGlicmFyeSBpbmNsdWRpbmcgd2hhdGV2ZXIKKyAgICBjaGFuZ2VzIHdlcmUgdXNlZCBpbiB0aGUgd29yayAod2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlcgorICAgIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUpOyBhbmQsIGlmIHRoZSB3b3JrIGlzIGFuIGV4ZWN1dGFibGUgbGlua2VkCisgICAgd2l0aCB0aGUgTGlicmFyeSwgd2l0aCB0aGUgY29tcGxldGUgbWFjaGluZS1yZWFkYWJsZSAid29yayB0aGF0CisgICAgdXNlcyB0aGUgTGlicmFyeSIsIGFzIG9iamVjdCBjb2RlIGFuZC9vciBzb3VyY2UgY29kZSwgc28gdGhhdCB0aGUKKyAgICB1c2VyIGNhbiBtb2RpZnkgdGhlIExpYnJhcnkgYW5kIHRoZW4gcmVsaW5rIHRvIHByb2R1Y2UgYSBtb2RpZmllZAorICAgIGV4ZWN1dGFibGUgY29udGFpbmluZyB0aGUgbW9kaWZpZWQgTGlicmFyeS4gIChJdCBpcyB1bmRlcnN0b29kCisgICAgdGhhdCB0aGUgdXNlciB3aG8gY2hhbmdlcyB0aGUgY29udGVudHMgb2YgZGVmaW5pdGlvbnMgZmlsZXMgaW4gdGhlCisgICAgTGlicmFyeSB3aWxsIG5vdCBuZWNlc3NhcmlseSBiZSBhYmxlIHRvIHJlY29tcGlsZSB0aGUgYXBwbGljYXRpb24KKyAgICB0byB1c2UgdGhlIG1vZGlmaWVkIGRlZmluaXRpb25zLikKKworICAgIGIpIFVzZSBhIHN1aXRhYmxlIHNoYXJlZCBsaWJyYXJ5IG1lY2hhbmlzbSBmb3IgbGlua2luZyB3aXRoIHRoZQorICAgIExpYnJhcnkuICBBIHN1aXRhYmxlIG1lY2hhbmlzbSBpcyBvbmUgdGhhdCAoMSkgdXNlcyBhdCBydW4gdGltZSBhCisgICAgY29weSBvZiB0aGUgbGlicmFyeSBhbHJlYWR5IHByZXNlbnQgb24gdGhlIHVzZXIncyBjb21wdXRlciBzeXN0ZW0sCisgICAgcmF0aGVyIHRoYW4gY29weWluZyBsaWJyYXJ5IGZ1bmN0aW9ucyBpbnRvIHRoZSBleGVjdXRhYmxlLCBhbmQgKDIpCisgICAgd2lsbCBvcGVyYXRlIHByb3Blcmx5IHdpdGggYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCBpZgorICAgIHRoZSB1c2VyIGluc3RhbGxzIG9uZSwgYXMgbG9uZyBhcyB0aGUgbW9kaWZpZWQgdmVyc2lvbiBpcworICAgIGludGVyZmFjZS1jb21wYXRpYmxlIHdpdGggdGhlIHZlcnNpb24gdGhhdCB0aGUgd29yayB3YXMgbWFkZSB3aXRoLgorCisgICAgYykgQWNjb21wYW55IHRoZSB3b3JrIHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQKKyAgICBsZWFzdCB0aHJlZSB5ZWFycywgdG8gZ2l2ZSB0aGUgc2FtZSB1c2VyIHRoZSBtYXRlcmlhbHMKKyAgICBzcGVjaWZpZWQgaW4gU3Vic2VjdGlvbiA2YSwgYWJvdmUsIGZvciBhIGNoYXJnZSBubyBtb3JlCisgICAgdGhhbiB0aGUgY29zdCBvZiBwZXJmb3JtaW5nIHRoaXMgZGlzdHJpYnV0aW9uLgorCisgICAgZCkgSWYgZGlzdHJpYnV0aW9uIG9mIHRoZSB3b3JrIGlzIG1hZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIHRvIGNvcHkKKyAgICBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgb2ZmZXIgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUgYWJvdmUKKyAgICBzcGVjaWZpZWQgbWF0ZXJpYWxzIGZyb20gdGhlIHNhbWUgcGxhY2UuCisKKyAgICBlKSBWZXJpZnkgdGhhdCB0aGUgdXNlciBoYXMgYWxyZWFkeSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlc2UKKyAgICBtYXRlcmlhbHMgb3IgdGhhdCB5b3UgaGF2ZSBhbHJlYWR5IHNlbnQgdGhpcyB1c2VyIGEgY29weS4KKworICBGb3IgYW4gZXhlY3V0YWJsZSwgdGhlIHJlcXVpcmVkIGZvcm0gb2YgdGhlICJ3b3JrIHRoYXQgdXNlcyB0aGUKK0xpYnJhcnkiIG11c3QgaW5jbHVkZSBhbnkgZGF0YSBhbmQgdXRpbGl0eSBwcm9ncmFtcyBuZWVkZWQgZm9yCityZXByb2R1Y2luZyB0aGUgZXhlY3V0YWJsZSBmcm9tIGl0LiAgSG93ZXZlciwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwKK3RoZSBtYXRlcmlhbHMgdG8gYmUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZSBhbnl0aGluZyB0aGF0IGlzCitub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkgZm9ybSkgd2l0aCB0aGUgbWFqb3IKK2NvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0gb24KK3doaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudCBpdHNlbGYgYWNjb21wYW5pZXMKK3RoZSBleGVjdXRhYmxlLgorCisgIEl0IG1heSBoYXBwZW4gdGhhdCB0aGlzIHJlcXVpcmVtZW50IGNvbnRyYWRpY3RzIHRoZSBsaWNlbnNlCityZXN0cmljdGlvbnMgb2Ygb3RoZXIgcHJvcHJpZXRhcnkgbGlicmFyaWVzIHRoYXQgZG8gbm90IG5vcm1hbGx5CithY2NvbXBhbnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0uICBTdWNoIGEgY29udHJhZGljdGlvbiBtZWFucyB5b3UgY2Fubm90Cit1c2UgYm90aCB0aGVtIGFuZCB0aGUgTGlicmFyeSB0b2dldGhlciBpbiBhbiBleGVjdXRhYmxlIHRoYXQgeW91CitkaXN0cmlidXRlLgorDAorICA3LiBZb3UgbWF5IHBsYWNlIGxpYnJhcnkgZmFjaWxpdGllcyB0aGF0IGFyZSBhIHdvcmsgYmFzZWQgb24gdGhlCitMaWJyYXJ5IHNpZGUtYnktc2lkZSBpbiBhIHNpbmdsZSBsaWJyYXJ5IHRvZ2V0aGVyIHdpdGggb3RoZXIgbGlicmFyeQorZmFjaWxpdGllcyBub3QgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHN1Y2ggYSBjb21iaW5lZAorbGlicmFyeSwgcHJvdmlkZWQgdGhhdCB0aGUgc2VwYXJhdGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3b3JrIGJhc2VkIG9uCit0aGUgTGlicmFyeSBhbmQgb2YgdGhlIG90aGVyIGxpYnJhcnkgZmFjaWxpdGllcyBpcyBvdGhlcndpc2UKK3Blcm1pdHRlZCwgYW5kIHByb3ZpZGVkIHRoYXQgeW91IGRvIHRoZXNlIHR3byB0aGluZ3M6CisKKyAgICBhKSBBY2NvbXBhbnkgdGhlIGNvbWJpbmVkIGxpYnJhcnkgd2l0aCBhIGNvcHkgb2YgdGhlIHNhbWUgd29yaworICAgIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCB1bmNvbWJpbmVkIHdpdGggYW55IG90aGVyIGxpYnJhcnkKKyAgICBmYWNpbGl0aWVzLiAgVGhpcyBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAgICBTZWN0aW9ucyBhYm92ZS4KKworICAgIGIpIEdpdmUgcHJvbWluZW50IG5vdGljZSB3aXRoIHRoZSBjb21iaW5lZCBsaWJyYXJ5IG9mIHRoZSBmYWN0CisgICAgdGhhdCBwYXJ0IG9mIGl0IGlzIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgYW5kIGV4cGxhaW5pbmcKKyAgICB3aGVyZSB0byBmaW5kIHRoZSBhY2NvbXBhbnlpbmcgdW5jb21iaW5lZCBmb3JtIG9mIHRoZSBzYW1lIHdvcmsuCisKKyAgOC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBsaW5rIHdpdGgsIG9yIGRpc3RyaWJ1dGUKK3RoZSBMaWJyYXJ5IGV4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55CithdHRlbXB0IG90aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIGxpbmsgd2l0aCwgb3IKK2Rpc3RyaWJ1dGUgdGhlIExpYnJhcnkgaXMgdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91cgorcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4gIEhvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLAorb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlciB0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcwordGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2ggcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgorCisgIDkuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAorc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKK2Rpc3RyaWJ1dGUgdGhlIExpYnJhcnkgb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQorcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQorbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgTGlicmFyeSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitMaWJyYXJ5KSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAorYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwordGhlIExpYnJhcnkgb3Igd29ya3MgYmFzZWQgb24gaXQuCisKKyAgMTAuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkpLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCitvcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlLCBsaW5rIHdpdGggb3IgbW9kaWZ5IHRoZSBMaWJyYXJ5CitzdWJqZWN0IHRvIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCityZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCitZb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB3aXRoCit0aGlzIExpY2Vuc2UuCisMCisgIDExLiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50CitpbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAorY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgorb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAorZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKK2Rpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKK0xpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKK21heSBub3QgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKK2xpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIExpYnJhcnkgYnkKK2FsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgordGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bworcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeS4KKworSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFueQorcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvIGFwcGx5LAorYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIgY2lyY3Vtc3RhbmNlcy4KKworSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQorcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKK3N1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKK2ludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtIHdoaWNoIGlzCitpbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKK2dlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKK3Rocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0CitzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCit0byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKK2ltcG9zZSB0aGF0IGNob2ljZS4KKworVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCitiZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KKworICAxMi4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBMaWJyYXJ5IGlzIHJlc3RyaWN0ZWQgaW4KK2NlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQorb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBMaWJyYXJ5IHVuZGVyIHRoaXMgTGljZW5zZSBtYXkgYWRkCithbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nIHRob3NlIGNvdW50cmllcywKK3NvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nIGNvdW50cmllcyBub3QgdGh1cworZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMgdGhlIGxpbWl0YXRpb24gYXMgaWYKK3dyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgorCisgIDEzLiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldwordmVyc2lvbnMgb2YgdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLgorU3VjaCBuZXcgdmVyc2lvbnMgd2lsbCBiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLAorYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvIGFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgorCitFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBMaWJyYXJ5CitzcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQKKyJhbnkgbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQKK2NvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgTGlicmFyeSBkb2VzIG5vdCBzcGVjaWZ5IGEKK2xpY2Vuc2UgdmVyc2lvbiBudW1iZXIsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorDAorICAxNC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIExpYnJhcnkgaW50byBvdGhlciBmcmVlCitwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgaW5jb21wYXRpYmxlIHdpdGggdGhlc2UsCit3cml0ZSB0byB0aGUgYXV0aG9yIHRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcworY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcyBtYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIKK2RlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMgb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMKK29mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQgb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nCithbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgorCisJCQkgICAgTk8gV0FSUkFOVFkKKworICAxNS4gQkVDQVVTRSBUSEUgTElCUkFSWSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8KK1dBUlJBTlRZIEZPUiBUSEUgTElCUkFSWSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuCitFWENFUFQgV0hFTiBPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUgorT1RIRVIgUEFSVElFUyBQUk9WSURFIFRIRSBMSUJSQVJZICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkKK0tJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCitQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUKK0xJQlJBUlkgSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFIExJQlJBUlkgUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FCitUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgMTYuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4KK1dSSVRJTkcgV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZCitBTkQvT1IgUkVESVNUUklCVVRFIFRIRSBMSUJSQVJZIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVQorRk9SIERBTUFHRVMsIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUgorQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUKK0xJQlJBUlkgKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcKK1JFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBCitGQUlMVVJFIE9GIFRIRSBMSUJSQVJZIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIgU09GVFdBUkUpLCBFVkVOIElGCitTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICitEQU1BR0VTLgorCisJCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisMCisgICAgICAgICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBMaWJyYXJpZXMKKworICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBsaWJyYXJ5LCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Citwb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgd2UgcmVjb21tZW5kIG1ha2luZyBpdCBmcmVlIHNvZnR3YXJlIHRoYXQKK2V2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZS4gIFlvdSBjYW4gZG8gc28gYnkgcGVybWl0dGluZworcmVkaXN0cmlidXRpb24gdW5kZXIgdGhlc2UgdGVybXMgKG9yLCBhbHRlcm5hdGl2ZWx5LCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCitvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlKS4KKworICBUbyBhcHBseSB0aGVzZSB0ZXJtcywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgbGlicmFyeS4gIEl0IGlzCitzYWZlc3QgdG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQorY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QgdGhlCisiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgorCisgICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIGxpYnJhcnkncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KKyAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCisKK1lvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCitzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBsaWJyYXJ5LCBpZgorbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgorCisgIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlCisgIGxpYnJhcnkgYEZyb2InIChhIGxpYnJhcnkgZm9yIHR3ZWFraW5nIGtub2JzKSB3cml0dGVuIGJ5IEphbWVzIFJhbmRvbSBIYWNrZXIuCisKKyAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTkwCisgIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCisKK1RoYXQncyBhbGwgdGhlcmUgaXMgdG8gaXQhCisKKworCisgICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAgICBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgICAgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICAgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAgICBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgICAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgICAgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAgICBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICAgIG9mIHRoZSBTb2Z0d2FyZS4KKworICAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgICAgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCisgICAgSU4gTk8gRVZFTlQgU0hBTEwgUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUgorICAgIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorICAgIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgICAgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0NvcHlyaWdodCAoYykgMjAxMCwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCittZXQ6CisKKyAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICAgIGRpc3RyaWJ1dGlvbi4KKworICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkKKyAgICBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCitBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCitEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKK1RIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworQWRkaXRpb25hbCBJUCBSaWdodHMgR3JhbnQgKFBhdGVudHMpCisKKyJUaGlzIGltcGxlbWVudGF0aW9uIiBtZWFucyB0aGUgY29weXJpZ2h0YWJsZSB3b3JrcyBkaXN0cmlidXRlZCBieQorR29vZ2xlIGFzIHBhcnQgb2YgdGhlIFdlYk0gUHJvamVjdC4KKworR29vZ2xlIGhlcmVieSBncmFudHMgdG8geW91IGEgcGVycGV0dWFsLCB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsCituby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKQorcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwKK3RyYW5zZmVyLCBhbmQgb3RoZXJ3aXNlIHJ1biwgbW9kaWZ5IGFuZCBwcm9wYWdhdGUgdGhlIGNvbnRlbnRzIG9mIHRoaXMKK2ltcGxlbWVudGF0aW9uIG9mIFZQOCwgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQKK2NsYWltcywgYm90aCBjdXJyZW50bHkgb3duZWQgYnkgR29vZ2xlIGFuZCBhY3F1aXJlZCBpbiB0aGUgZnV0dXJlLAorbGljZW5zYWJsZSBieSBHb29nbGUgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoaXMKK2ltcGxlbWVudGF0aW9uIG9mIFZQOC4gVGhpcyBncmFudCBkb2VzIG5vdCBpbmNsdWRlIGNsYWltcyB0aGF0IHdvdWxkIGJlCitpbmZyaW5nZWQgb25seSBhcyBhIGNvbnNlcXVlbmNlIG9mIGZ1cnRoZXIgbW9kaWZpY2F0aW9uIG9mIHRoaXMKK2ltcGxlbWVudGF0aW9uLiBJZiB5b3Ugb3IgeW91ciBhZ2VudCBvciBleGNsdXNpdmUgbGljZW5zZWUgaW5zdGl0dXRlIG9yCitvcmRlciBvciBhZ3JlZSB0byB0aGUgaW5zdGl0dXRpb24gb2YgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkKK2VudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcKK3RoYXQgdGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBWUDggb3IgYW55IGNvZGUgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGlzCitpbXBsZW1lbnRhdGlvbiBvZiBWUDggY29uc3RpdHV0ZXMgZGlyZWN0IG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQKK2luZnJpbmdlbWVudCwgb3IgaW5kdWNlbWVudCBvZiBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQKK3JpZ2h0cyBncmFudGVkIHRvIHlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoaXMgaW1wbGVtZW50YXRpb24gb2YgVlA4CitzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCitFeGNlcHQgd2hlcmUgb3RoZXJ3aXNlIG5vdGVkIGluIHRoZSBzb3VyY2UgY29kZSAoZS5nLiB0aGUgZmlsZXMgaGFzaC5jLAorbGlzdC5jIGFuZCB0aGUgdHJpbyBmaWxlcywgd2hpY2ggYXJlIGNvdmVyZWQgYnkgYSBzaW1pbGFyIGxpY2VuY2UgYnV0Cit3aXRoIGRpZmZlcmVudCBDb3B5cmlnaHQgbm90aWNlcykgYWxsIHRoZSBmaWxlcyBhcmU6CisKKyBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMyBEYW5pZWwgVmVpbGxhcmQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CitvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAoraW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwordG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1ci0KK25pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVQtCitORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitEQU5JRUwgVkVJTExBUkQgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCitJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT04tCitORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBEYW5pZWwgVmVpbGxhcmQgc2hhbGwgbm90CitiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbC0KK2luZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIGhpbS4KKworCitMaWNlbmNlIGZvciBsaWJ4c2x0IGV4Y2VwdCBsaWJleHNsdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIERhbmllbCBWZWlsbGFyZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKK29mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCitpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCit0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCitjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVyLQorbmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVC0KK05FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK0RBTklFTCBWRUlMTEFSRCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKK0lOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTi0KK05FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIERhbmllbCBWZWlsbGFyZCBzaGFsbCBub3QKK2JlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsLQoraW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gaGltLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0xpY2VuY2UgZm9yIGxpYmV4c2x0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIgVGhvbWFzIEJyb3llciwgQ2hhcmxpZSBCb3plbWFuIGFuZCBEYW5pZWwgVmVpbGxhcmQuCisgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKK2luIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKK3RvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKK2NvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXItCituaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklULQorTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKK0lOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTi0KK05FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIHNoYWxsIG5vdAorYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWwtCitpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBoaW0uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0xaTUEgU0RLIGlzIHBsYWNlZCBpbiB0aGUgcHVibGljIGRvbWFpbi4KKworQ29weXJpZ2h0IChjKSAyMDAzLTIwMDkgSm9uYXRoYW4gJ1dvbGYnIFJlbnR6c2NoOiA8aHR0cDovL3JlbnR6c2NoLmNvbT4KK1NvbWUgcmlnaHRzIHJlc2VydmVkOiA8aHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocD4KKworVGhlIGRlZmF1bHQgTWVzYSBsaWNlbnNlIGlzIGFzIGZvbGxvd3M6CisKK0NvcHlyaWdodCAoQykgMTk5OS0yMDA3ICBCcmlhbiBQYXVsICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKK2NvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCit0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCit0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKK2FuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKK2luIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKK0JSSUFOIFBBVUwgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworCisKK1NvbWUgcGFydHMgb2YgTWVzYSBhcmUgY29weXJpZ2h0ZWQgdW5kZXIgdGhlIEdOVSBMR1BMLiAgU2VlIHRoZQorTWVzYS9kb2NzL0NPUFlSSUdIVCBmaWxlIGZvciBkZXRhaWxzLgorCitUaGUgZm9sbG93aW5nIGlzIHRoZSBzdGFuZGFyZCBHTlUgY29weXJpZ2h0IGZpbGUuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworCQkgIEdOVSBMSUJSQVJZIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKwkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCisKKyBDb3B5cmlnaHQgKEMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICAgICAgICAgICAgICAgICAgIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBCisgRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCisgb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCisKK1tUaGlzIGlzIHRoZSBmaXJzdCByZWxlYXNlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IEdQTC4gIEl0IGlzCisgbnVtYmVyZWQgMiBiZWNhdXNlIGl0IGdvZXMgd2l0aCB2ZXJzaW9uIDIgb2YgdGhlIG9yZGluYXJ5IEdQTC5dCisKKwkJCSAgICBQcmVhbWJsZQorCisgIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKK2ZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlcyBhcmUgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlCitmcmVlIHNvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuCisKKyAgVGhpcyBsaWNlbnNlLCB0aGUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhcHBsaWVzIHRvIHNvbWUKK3NwZWNpYWxseSBkZXNpZ25hdGVkIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSwgYW5kIHRvIGFueQorb3RoZXIgbGlicmFyaWVzIHdob3NlIGF1dGhvcnMgZGVjaWRlIHRvIHVzZSBpdC4gIFlvdSBjYW4gdXNlIGl0IGZvcgoreW91ciBsaWJyYXJpZXMsIHRvby4KKworICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90CitwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91CitoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCit0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKK2lmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0CitpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCisKKyAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAorYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgorVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZgoreW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBsaWJyYXJ5LCBvciBpZiB5b3UgbW9kaWZ5IGl0LgorCisgIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIGxpYnJhcnksIHdoZXRoZXIgZ3JhdGlzCitvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdCB3ZSBnYXZlCit5b3UuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUgc291cmNlCitjb2RlLiAgSWYgeW91IGxpbmsgYSBwcm9ncmFtIHdpdGggdGhlIGxpYnJhcnksIHlvdSBtdXN0IHByb3ZpZGUKK2NvbXBsZXRlIG9iamVjdCBmaWxlcyB0byB0aGUgcmVjaXBpZW50cyBzbyB0aGF0IHRoZXkgY2FuIHJlbGluayB0aGVtCit3aXRoIHRoZSBsaWJyYXJ5LCBhZnRlciBtYWtpbmcgY2hhbmdlcyB0byB0aGUgbGlicmFyeSBhbmQgcmVjb21waWxpbmcKK2l0LiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIgcmlnaHRzLgorCisgIE91ciBtZXRob2Qgb2YgcHJvdGVjdGluZyB5b3VyIHJpZ2h0cyBoYXMgdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0Cit0aGUgbGlicmFyeSwgYW5kICgyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbAorcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIGxpYnJhcnkuCisKKyAgQWxzbywgZm9yIGVhY2ggZGlzdHJpYnV0b3IncyBwcm90ZWN0aW9uLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbgordGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKK2xpYnJhcnkuICBJZiB0aGUgbGlicmFyeSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKK3dhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwKK3ZlcnNpb24sIHNvIHRoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24KK3RoZSBvcmlnaW5hbCBhdXRob3JzJyByZXB1dGF0aW9ucy4KKwwKKyAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKK3BhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCBjb21wYW5pZXMgZGlzdHJpYnV0aW5nIGZyZWUKK3NvZnR3YXJlIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIHRodXMgaW4gZWZmZWN0Cit0cmFuc2Zvcm1pbmcgdGhlIHByb2dyYW0gaW50byBwcm9wcmlldGFyeSBzb2Z0d2FyZS4gIFRvIHByZXZlbnQgdGhpcywKK3dlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueSBwYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncworZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KKworICBNb3N0IEdOVSBzb2Z0d2FyZSwgaW5jbHVkaW5nIHNvbWUgbGlicmFyaWVzLCBpcyBjb3ZlcmVkIGJ5IHRoZSBvcmRpbmFyeQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHdoaWNoIHdhcyBkZXNpZ25lZCBmb3IgdXRpbGl0eSBwcm9ncmFtcy4gIFRoaXMKK2xpY2Vuc2UsIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhcHBsaWVzIHRvIGNlcnRhaW4KK2Rlc2lnbmF0ZWQgbGlicmFyaWVzLiAgVGhpcyBsaWNlbnNlIGlzIHF1aXRlIGRpZmZlcmVudCBmcm9tIHRoZSBvcmRpbmFyeQorb25lOyBiZSBzdXJlIHRvIHJlYWQgaXQgaW4gZnVsbCwgYW5kIGRvbid0IGFzc3VtZSB0aGF0IGFueXRoaW5nIGluIGl0IGlzCit0aGUgc2FtZSBhcyBpbiB0aGUgb3JkaW5hcnkgbGljZW5zZS4KKworICBUaGUgcmVhc29uIHdlIGhhdmUgYSBzZXBhcmF0ZSBwdWJsaWMgbGljZW5zZSBmb3Igc29tZSBsaWJyYXJpZXMgaXMgdGhhdAordGhleSBibHVyIHRoZSBkaXN0aW5jdGlvbiB3ZSB1c3VhbGx5IG1ha2UgYmV0d2VlbiBtb2RpZnlpbmcgb3IgYWRkaW5nIHRvIGEKK3Byb2dyYW0gYW5kIHNpbXBseSB1c2luZyBpdC4gIExpbmtpbmcgYSBwcm9ncmFtIHdpdGggYSBsaWJyYXJ5LCB3aXRob3V0CitjaGFuZ2luZyB0aGUgbGlicmFyeSwgaXMgaW4gc29tZSBzZW5zZSBzaW1wbHkgdXNpbmcgdGhlIGxpYnJhcnksIGFuZCBpcworYW5hbG9nb3VzIHRvIHJ1bm5pbmcgYSB1dGlsaXR5IHByb2dyYW0gb3IgYXBwbGljYXRpb24gcHJvZ3JhbS4gIEhvd2V2ZXIsIGluCithIHRleHR1YWwgYW5kIGxlZ2FsIHNlbnNlLCB0aGUgbGlua2VkIGV4ZWN1dGFibGUgaXMgYSBjb21iaW5lZCB3b3JrLCBhCitkZXJpdmF0aXZlIG9mIHRoZSBvcmlnaW5hbCBsaWJyYXJ5LCBhbmQgdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK3RyZWF0cyBpdCBhcyBzdWNoLgorCisgIEJlY2F1c2Ugb2YgdGhpcyBibHVycmVkIGRpc3RpbmN0aW9uLCB1c2luZyB0aGUgb3JkaW5hcnkgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIGxpYnJhcmllcyBkaWQgbm90IGVmZmVjdGl2ZWx5IHByb21vdGUgc29mdHdhcmUKK3NoYXJpbmcsIGJlY2F1c2UgbW9zdCBkZXZlbG9wZXJzIGRpZCBub3QgdXNlIHRoZSBsaWJyYXJpZXMuICBXZQorY29uY2x1ZGVkIHRoYXQgd2Vha2VyIGNvbmRpdGlvbnMgbWlnaHQgcHJvbW90ZSBzaGFyaW5nIGJldHRlci4KKworICBIb3dldmVyLCB1bnJlc3RyaWN0ZWQgbGlua2luZyBvZiBub24tZnJlZSBwcm9ncmFtcyB3b3VsZCBkZXByaXZlIHRoZQordXNlcnMgb2YgdGhvc2UgcHJvZ3JhbXMgb2YgYWxsIGJlbmVmaXQgZnJvbSB0aGUgZnJlZSBzdGF0dXMgb2YgdGhlCitsaWJyYXJpZXMgdGhlbXNlbHZlcy4gIFRoaXMgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGludGVuZGVkIHRvCitwZXJtaXQgZGV2ZWxvcGVycyBvZiBub24tZnJlZSBwcm9ncmFtcyB0byB1c2UgZnJlZSBsaWJyYXJpZXMsIHdoaWxlCitwcmVzZXJ2aW5nIHlvdXIgZnJlZWRvbSBhcyBhIHVzZXIgb2Ygc3VjaCBwcm9ncmFtcyB0byBjaGFuZ2UgdGhlIGZyZWUKK2xpYnJhcmllcyB0aGF0IGFyZSBpbmNvcnBvcmF0ZWQgaW4gdGhlbS4gIChXZSBoYXZlIG5vdCBzZWVuIGhvdyB0byBhY2hpZXZlCit0aGlzIGFzIHJlZ2FyZHMgY2hhbmdlcyBpbiBoZWFkZXIgZmlsZXMsIGJ1dCB3ZSBoYXZlIGFjaGlldmVkIGl0IGFzIHJlZ2FyZHMKK2NoYW5nZXMgaW4gdGhlIGFjdHVhbCBmdW5jdGlvbnMgb2YgdGhlIExpYnJhcnkuKSAgVGhlIGhvcGUgaXMgdGhhdCB0aGlzCit3aWxsIGxlYWQgdG8gZmFzdGVyIGRldmVsb3BtZW50IG9mIGZyZWUgbGlicmFyaWVzLgorCisgIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCittb2RpZmljYXRpb24gZm9sbG93LiAgUGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEKKyJ3b3JrIGJhc2VkIG9uIHRoZSBsaWJyYXJ5IiBhbmQgYSAid29yayB0aGF0IHVzZXMgdGhlIGxpYnJhcnkiLiAgVGhlCitmb3JtZXIgY29udGFpbnMgY29kZSBkZXJpdmVkIGZyb20gdGhlIGxpYnJhcnksIHdoaWxlIHRoZSBsYXR0ZXIgb25seQord29ya3MgdG9nZXRoZXIgd2l0aCB0aGUgbGlicmFyeS4KKworICBOb3RlIHRoYXQgaXQgaXMgcG9zc2libGUgZm9yIGEgbGlicmFyeSB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBvcmRpbmFyeQorR2VuZXJhbCBQdWJsaWMgTGljZW5zZSByYXRoZXIgdGhhbiBieSB0aGlzIHNwZWNpYWwgb25lLgorDAorCQkgIEdOVSBMSUJSQVJZIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgorCisgIDAuIFRoaXMgTGljZW5zZSBBZ3JlZW1lbnQgYXBwbGllcyB0byBhbnkgc29mdHdhcmUgbGlicmFyeSB3aGljaAorY29udGFpbnMgYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIG9yIG90aGVyIGF1dGhvcml6ZWQKK3BhcnR5IHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGlicmFyeQorR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoYWxzbyBjYWxsZWQgInRoaXMgTGljZW5zZSIpLiAgRWFjaCBsaWNlbnNlZSBpcworYWRkcmVzc2VkIGFzICJ5b3UiLgorCisgIEEgImxpYnJhcnkiIG1lYW5zIGEgY29sbGVjdGlvbiBvZiBzb2Z0d2FyZSBmdW5jdGlvbnMgYW5kL29yIGRhdGEKK3ByZXBhcmVkIHNvIGFzIHRvIGJlIGNvbnZlbmllbnRseSBsaW5rZWQgd2l0aCBhcHBsaWNhdGlvbiBwcm9ncmFtcworKHdoaWNoIHVzZSBzb21lIG9mIHRob3NlIGZ1bmN0aW9ucyBhbmQgZGF0YSkgdG8gZm9ybSBleGVjdXRhYmxlcy4KKworICBUaGUgIkxpYnJhcnkiLCBiZWxvdywgcmVmZXJzIHRvIGFueSBzdWNoIHNvZnR3YXJlIGxpYnJhcnkgb3Igd29yaword2hpY2ggaGFzIGJlZW4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlc2UgdGVybXMuICBBICJ3b3JrIGJhc2VkIG9uIHRoZQorTGlicmFyeSIgbWVhbnMgZWl0aGVyIHRoZSBMaWJyYXJ5IG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIKK2NvcHlyaWdodCBsYXc6IHRoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgTGlicmFyeSBvciBhCitwb3J0aW9uIG9mIGl0LCBlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkCitzdHJhaWdodGZvcndhcmRseSBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzCitpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4gdGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKQorCisgICJTb3VyY2UgY29kZSIgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCittYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhIGxpYnJhcnksIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG1lYW5zCithbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkgYXNzb2NpYXRlZAoraW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0byBjb250cm9sIGNvbXBpbGF0aW9uCithbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBsaWJyYXJ5LgorCisgIEFjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Citjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCitydW5uaW5nIGEgcHJvZ3JhbSB1c2luZyB0aGUgTGlicmFyeSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIG91dHB1dCBmcm9tCitzdWNoIGEgcHJvZ3JhbSBpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkCitvbiB0aGUgTGlicmFyeSAoaW5kZXBlbmRlbnQgb2YgdGhlIHVzZSBvZiB0aGUgTGlicmFyeSBpbiBhIHRvb2wgZm9yCit3cml0aW5nIGl0KS4gIFdoZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgTGlicmFyeSBkb2VzCithbmQgd2hhdCB0aGUgcHJvZ3JhbSB0aGF0IHVzZXMgdGhlIExpYnJhcnkgZG9lcy4KKyAgCisgIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIExpYnJhcnkncworY29tcGxldGUgc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQKK3lvdSBjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuCithcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdAorYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkKK3dhcnJhbnR5OyBhbmQgZGlzdHJpYnV0ZSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIGFsb25nIHdpdGggdGhlCitMaWJyYXJ5LgorCisgIFlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksCithbmQgeW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhCitmZWUuCisMCisgIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIExpYnJhcnkgb3IgYW55IHBvcnRpb24KK29mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCBhbmQgY29weSBhbmQKK2Rpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQorYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKKworICAgIGEpIFRoZSBtb2RpZmllZCB3b3JrIG11c3QgaXRzZWxmIGJlIGEgc29mdHdhcmUgbGlicmFyeS4KKworICAgIGIpIFlvdSBtdXN0IGNhdXNlIHRoZSBmaWxlcyBtb2RpZmllZCB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCisKKyAgICBjKSBZb3UgbXVzdCBjYXVzZSB0aGUgd2hvbGUgb2YgdGhlIHdvcmsgdG8gYmUgbGljZW5zZWQgYXQgbm8KKyAgICBjaGFyZ2UgdG8gYWxsIHRoaXJkIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKworICAgIGQpIElmIGEgZmFjaWxpdHkgaW4gdGhlIG1vZGlmaWVkIExpYnJhcnkgcmVmZXJzIHRvIGEgZnVuY3Rpb24gb3IgYQorICAgIHRhYmxlIG9mIGRhdGEgdG8gYmUgc3VwcGxpZWQgYnkgYW4gYXBwbGljYXRpb24gcHJvZ3JhbSB0aGF0IHVzZXMKKyAgICB0aGUgZmFjaWxpdHksIG90aGVyIHRoYW4gYXMgYW4gYXJndW1lbnQgcGFzc2VkIHdoZW4gdGhlIGZhY2lsaXR5CisgICAgaXMgaW52b2tlZCwgdGhlbiB5b3UgbXVzdCBtYWtlIGEgZ29vZCBmYWl0aCBlZmZvcnQgdG8gZW5zdXJlIHRoYXQsCisgICAgaW4gdGhlIGV2ZW50IGFuIGFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBseSBzdWNoIGZ1bmN0aW9uIG9yCisgICAgdGFibGUsIHRoZSBmYWNpbGl0eSBzdGlsbCBvcGVyYXRlcywgYW5kIHBlcmZvcm1zIHdoYXRldmVyIHBhcnQgb2YKKyAgICBpdHMgcHVycG9zZSByZW1haW5zIG1lYW5pbmdmdWwuCisKKyAgICAoRm9yIGV4YW1wbGUsIGEgZnVuY3Rpb24gaW4gYSBsaWJyYXJ5IHRvIGNvbXB1dGUgc3F1YXJlIHJvb3RzIGhhcworICAgIGEgcHVycG9zZSB0aGF0IGlzIGVudGlyZWx5IHdlbGwtZGVmaW5lZCBpbmRlcGVuZGVudCBvZiB0aGUKKyAgICBhcHBsaWNhdGlvbi4gIFRoZXJlZm9yZSwgU3Vic2VjdGlvbiAyZCByZXF1aXJlcyB0aGF0IGFueQorICAgIGFwcGxpY2F0aW9uLXN1cHBsaWVkIGZ1bmN0aW9uIG9yIHRhYmxlIHVzZWQgYnkgdGhpcyBmdW5jdGlvbiBtdXN0CisgICAgYmUgb3B0aW9uYWw6IGlmIHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgaXQsIHRoZSBzcXVhcmUKKyAgICByb290IGZ1bmN0aW9uIG11c3Qgc3RpbGwgY29tcHV0ZSBzcXVhcmUgcm9vdHMuKQorCitUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCitpZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBMaWJyYXJ5LAorYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCit0aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCitzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKK2Rpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAorb24gdGhlIExpYnJhcnksIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCit0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQorZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlCitpdC4KKworVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Cit5b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KK2V4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgorY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgTGlicmFyeS4KKworSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgTGlicmFyeQord2l0aCB0aGUgTGlicmFyeSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnkpIG9uIGEgdm9sdW1lIG9mCithIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgordGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KKworICAzLiBZb3UgbWF5IG9wdCB0byBhcHBseSB0aGUgdGVybXMgb2YgdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZSB0byBhIGdpdmVuIGNvcHkgb2YgdGhlIExpYnJhcnkuICBUbyBkbwordGhpcywgeW91IG11c3QgYWx0ZXIgYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlLCBzbwordGhhdCB0aGV5IHJlZmVyIHRvIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLAoraW5zdGVhZCBvZiB0byB0aGlzIExpY2Vuc2UuICAoSWYgYSBuZXdlciB2ZXJzaW9uIHRoYW4gdmVyc2lvbiAyIG9mIHRoZQorb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaGFzIGFwcGVhcmVkLCB0aGVuIHlvdSBjYW4gc3BlY2lmeQordGhhdCB2ZXJzaW9uIGluc3RlYWQgaWYgeW91IHdpc2guKSAgRG8gbm90IG1ha2UgYW55IG90aGVyIGNoYW5nZSBpbgordGhlc2Ugbm90aWNlcy4KKwwKKyAgT25jZSB0aGlzIGNoYW5nZSBpcyBtYWRlIGluIGEgZ2l2ZW4gY29weSwgaXQgaXMgaXJyZXZlcnNpYmxlIGZvcgordGhhdCBjb3B5LCBzbyB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBhbGwKK3N1YnNlcXVlbnQgY29waWVzIGFuZCBkZXJpdmF0aXZlIHdvcmtzIG1hZGUgZnJvbSB0aGF0IGNvcHkuCisKKyAgVGhpcyBvcHRpb24gaXMgdXNlZnVsIHdoZW4geW91IHdpc2ggdG8gY29weSBwYXJ0IG9mIHRoZSBjb2RlIG9mCit0aGUgTGlicmFyeSBpbnRvIGEgcHJvZ3JhbSB0aGF0IGlzIG5vdCBhIGxpYnJhcnkuCisKKyAgNC4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IChvciBhIHBvcnRpb24gb3IKK2Rlcml2YXRpdmUgb2YgaXQsIHVuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtCit1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhY2NvbXBhbnkKK2l0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZSBzb3VyY2UgY29kZSwgd2hpY2gKK211c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYQorbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlLgorCisgIElmIGRpc3RyaWJ1dGlvbiBvZiBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcyB0byBjb3B5Citmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZQorc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBzYXRpc2ZpZXMgdGhlIHJlcXVpcmVtZW50IHRvCitkaXN0cmlidXRlIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Citjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgorCisgIDUuIEEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIG5vIGRlcml2YXRpdmUgb2YgYW55IHBvcnRpb24gb2YgdGhlCitMaWJyYXJ5LCBidXQgaXMgZGVzaWduZWQgdG8gd29yayB3aXRoIHRoZSBMaWJyYXJ5IGJ5IGJlaW5nIGNvbXBpbGVkIG9yCitsaW5rZWQgd2l0aCBpdCwgaXMgY2FsbGVkIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5Ii4gIFN1Y2ggYQord29yaywgaW4gaXNvbGF0aW9uLCBpcyBub3QgYSBkZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnksIGFuZAordGhlcmVmb3JlIGZhbGxzIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KKworICBIb3dldmVyLCBsaW5raW5nIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB3aXRoIHRoZSBMaWJyYXJ5CitjcmVhdGVzIGFuIGV4ZWN1dGFibGUgdGhhdCBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIExpYnJhcnkgKGJlY2F1c2UgaXQKK2NvbnRhaW5zIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5KSwgcmF0aGVyIHRoYW4gYSAid29yayB0aGF0IHVzZXMgdGhlCitsaWJyYXJ5Ii4gIFRoZSBleGVjdXRhYmxlIGlzIHRoZXJlZm9yZSBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZS4KK1NlY3Rpb24gNiBzdGF0ZXMgdGVybXMgZm9yIGRpc3RyaWJ1dGlvbiBvZiBzdWNoIGV4ZWN1dGFibGVzLgorCisgIFdoZW4gYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHVzZXMgbWF0ZXJpYWwgZnJvbSBhIGhlYWRlciBmaWxlCit0aGF0IGlzIHBhcnQgb2YgdGhlIExpYnJhcnksIHRoZSBvYmplY3QgY29kZSBmb3IgdGhlIHdvcmsgbWF5IGJlIGEKK2Rlcml2YXRpdmUgd29yayBvZiB0aGUgTGlicmFyeSBldmVuIHRob3VnaCB0aGUgc291cmNlIGNvZGUgaXMgbm90LgorV2hldGhlciB0aGlzIGlzIHRydWUgaXMgZXNwZWNpYWxseSBzaWduaWZpY2FudCBpZiB0aGUgd29yayBjYW4gYmUKK2xpbmtlZCB3aXRob3V0IHRoZSBMaWJyYXJ5LCBvciBpZiB0aGUgd29yayBpcyBpdHNlbGYgYSBsaWJyYXJ5LiAgVGhlCit0aHJlc2hvbGQgZm9yIHRoaXMgdG8gYmUgdHJ1ZSBpcyBub3QgcHJlY2lzZWx5IGRlZmluZWQgYnkgbGF3LgorCisgIElmIHN1Y2ggYW4gb2JqZWN0IGZpbGUgdXNlcyBvbmx5IG51bWVyaWNhbCBwYXJhbWV0ZXJzLCBkYXRhCitzdHJ1Y3R1cmUgbGF5b3V0cyBhbmQgYWNjZXNzb3JzLCBhbmQgc21hbGwgbWFjcm9zIGFuZCBzbWFsbCBpbmxpbmUKK2Z1bmN0aW9ucyAodGVuIGxpbmVzIG9yIGxlc3MgaW4gbGVuZ3RoKSwgdGhlbiB0aGUgdXNlIG9mIHRoZSBvYmplY3QKK2ZpbGUgaXMgdW5yZXN0cmljdGVkLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMgbGVnYWxseSBhIGRlcml2YXRpdmUKK3dvcmsuICAoRXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGlzIG9iamVjdCBjb2RlIHBsdXMgcG9ydGlvbnMgb2YgdGhlCitMaWJyYXJ5IHdpbGwgc3RpbGwgZmFsbCB1bmRlciBTZWN0aW9uIDYuKQorCisgIE90aGVyd2lzZSwgaWYgdGhlIHdvcmsgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBMaWJyYXJ5LCB5b3UgbWF5CitkaXN0cmlidXRlIHRoZSBvYmplY3QgY29kZSBmb3IgdGhlIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gNi4KK0FueSBleGVjdXRhYmxlcyBjb250YWluaW5nIHRoYXQgd29yayBhbHNvIGZhbGwgdW5kZXIgU2VjdGlvbiA2LAord2hldGhlciBvciBub3QgdGhleSBhcmUgbGlua2VkIGRpcmVjdGx5IHdpdGggdGhlIExpYnJhcnkgaXRzZWxmLgorDAorICA2LiBBcyBhbiBleGNlcHRpb24gdG8gdGhlIFNlY3Rpb25zIGFib3ZlLCB5b3UgbWF5IGFsc28gY29tcGlsZSBvcgorbGluayBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeSB0byBwcm9kdWNlIGEKK3dvcmsgY29udGFpbmluZyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSwgYW5kIGRpc3RyaWJ1dGUgdGhhdCB3b3JrCit1bmRlciB0ZXJtcyBvZiB5b3VyIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB0aGUgdGVybXMgcGVybWl0Cittb2RpZmljYXRpb24gb2YgdGhlIHdvcmsgZm9yIHRoZSBjdXN0b21lcidzIG93biB1c2UgYW5kIHJldmVyc2UKK2VuZ2luZWVyaW5nIGZvciBkZWJ1Z2dpbmcgc3VjaCBtb2RpZmljYXRpb25zLgorCisgIFlvdSBtdXN0IGdpdmUgcHJvbWluZW50IG5vdGljZSB3aXRoIGVhY2ggY29weSBvZiB0aGUgd29yayB0aGF0IHRoZQorTGlicmFyeSBpcyB1c2VkIGluIGl0IGFuZCB0aGF0IHRoZSBMaWJyYXJ5IGFuZCBpdHMgdXNlIGFyZSBjb3ZlcmVkIGJ5Cit0aGlzIExpY2Vuc2UuICBZb3UgbXVzdCBzdXBwbHkgYSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gIElmIHRoZSB3b3JrCitkdXJpbmcgZXhlY3V0aW9uIGRpc3BsYXlzIGNvcHlyaWdodCBub3RpY2VzLCB5b3UgbXVzdCBpbmNsdWRlIHRoZQorY29weXJpZ2h0IG5vdGljZSBmb3IgdGhlIExpYnJhcnkgYW1vbmcgdGhlbSwgYXMgd2VsbCBhcyBhIHJlZmVyZW5jZQorZGlyZWN0aW5nIHRoZSB1c2VyIHRvIHRoZSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gIEFsc28sIHlvdSBtdXN0IGRvIG9uZQorb2YgdGhlc2UgdGhpbmdzOgorCisgICAgYSkgQWNjb21wYW55IHRoZSB3b3JrIHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcKKyAgICBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZSBjb2RlIGZvciB0aGUgTGlicmFyeSBpbmNsdWRpbmcgd2hhdGV2ZXIKKyAgICBjaGFuZ2VzIHdlcmUgdXNlZCBpbiB0aGUgd29yayAod2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlcgorICAgIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUpOyBhbmQsIGlmIHRoZSB3b3JrIGlzIGFuIGV4ZWN1dGFibGUgbGlua2VkCisgICAgd2l0aCB0aGUgTGlicmFyeSwgd2l0aCB0aGUgY29tcGxldGUgbWFjaGluZS1yZWFkYWJsZSAid29yayB0aGF0CisgICAgdXNlcyB0aGUgTGlicmFyeSIsIGFzIG9iamVjdCBjb2RlIGFuZC9vciBzb3VyY2UgY29kZSwgc28gdGhhdCB0aGUKKyAgICB1c2VyIGNhbiBtb2RpZnkgdGhlIExpYnJhcnkgYW5kIHRoZW4gcmVsaW5rIHRvIHByb2R1Y2UgYSBtb2RpZmllZAorICAgIGV4ZWN1dGFibGUgY29udGFpbmluZyB0aGUgbW9kaWZpZWQgTGlicmFyeS4gIChJdCBpcyB1bmRlcnN0b29kCisgICAgdGhhdCB0aGUgdXNlciB3aG8gY2hhbmdlcyB0aGUgY29udGVudHMgb2YgZGVmaW5pdGlvbnMgZmlsZXMgaW4gdGhlCisgICAgTGlicmFyeSB3aWxsIG5vdCBuZWNlc3NhcmlseSBiZSBhYmxlIHRvIHJlY29tcGlsZSB0aGUgYXBwbGljYXRpb24KKyAgICB0byB1c2UgdGhlIG1vZGlmaWVkIGRlZmluaXRpb25zLikKKworICAgIGIpIEFjY29tcGFueSB0aGUgd29yayB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0CisgICAgbGVhc3QgdGhyZWUgeWVhcnMsIHRvIGdpdmUgdGhlIHNhbWUgdXNlciB0aGUgbWF0ZXJpYWxzCisgICAgc3BlY2lmaWVkIGluIFN1YnNlY3Rpb24gNmEsIGFib3ZlLCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZQorICAgIHRoYW4gdGhlIGNvc3Qgb2YgcGVyZm9ybWluZyB0aGlzIGRpc3RyaWJ1dGlvbi4KKworICAgIGMpIElmIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd29yayBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcyB0byBjb3B5CisgICAgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIG9mZmVyIGVxdWl2YWxlbnQgYWNjZXNzIHRvIGNvcHkgdGhlIGFib3ZlCisgICAgc3BlY2lmaWVkIG1hdGVyaWFscyBmcm9tIHRoZSBzYW1lIHBsYWNlLgorCisgICAgZCkgVmVyaWZ5IHRoYXQgdGhlIHVzZXIgaGFzIGFscmVhZHkgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZXNlCisgICAgbWF0ZXJpYWxzIG9yIHRoYXQgeW91IGhhdmUgYWxyZWFkeSBzZW50IHRoaXMgdXNlciBhIGNvcHkuCisKKyAgRm9yIGFuIGV4ZWN1dGFibGUsIHRoZSByZXF1aXJlZCBmb3JtIG9mIHRoZSAid29yayB0aGF0IHVzZXMgdGhlCitMaWJyYXJ5IiBtdXN0IGluY2x1ZGUgYW55IGRhdGEgYW5kIHV0aWxpdHkgcHJvZ3JhbXMgbmVlZGVkIGZvcgorcmVwcm9kdWNpbmcgdGhlIGV4ZWN1dGFibGUgZnJvbSBpdC4gIEhvd2V2ZXIsIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sCit0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZSBhbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5CitkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkgZm9ybSkgd2l0aCB0aGUgbWFqb3IKK2NvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0gb24KK3doaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudCBpdHNlbGYgYWNjb21wYW5pZXMKK3RoZSBleGVjdXRhYmxlLgorCisgIEl0IG1heSBoYXBwZW4gdGhhdCB0aGlzIHJlcXVpcmVtZW50IGNvbnRyYWRpY3RzIHRoZSBsaWNlbnNlCityZXN0cmljdGlvbnMgb2Ygb3RoZXIgcHJvcHJpZXRhcnkgbGlicmFyaWVzIHRoYXQgZG8gbm90IG5vcm1hbGx5CithY2NvbXBhbnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0uICBTdWNoIGEgY29udHJhZGljdGlvbiBtZWFucyB5b3UgY2Fubm90Cit1c2UgYm90aCB0aGVtIGFuZCB0aGUgTGlicmFyeSB0b2dldGhlciBpbiBhbiBleGVjdXRhYmxlIHRoYXQgeW91CitkaXN0cmlidXRlLgorDAorICA3LiBZb3UgbWF5IHBsYWNlIGxpYnJhcnkgZmFjaWxpdGllcyB0aGF0IGFyZSBhIHdvcmsgYmFzZWQgb24gdGhlCitMaWJyYXJ5IHNpZGUtYnktc2lkZSBpbiBhIHNpbmdsZSBsaWJyYXJ5IHRvZ2V0aGVyIHdpdGggb3RoZXIgbGlicmFyeQorZmFjaWxpdGllcyBub3QgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHN1Y2ggYSBjb21iaW5lZAorbGlicmFyeSwgcHJvdmlkZWQgdGhhdCB0aGUgc2VwYXJhdGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3b3JrIGJhc2VkIG9uCit0aGUgTGlicmFyeSBhbmQgb2YgdGhlIG90aGVyIGxpYnJhcnkgZmFjaWxpdGllcyBpcyBvdGhlcndpc2UKK3Blcm1pdHRlZCwgYW5kIHByb3ZpZGVkIHRoYXQgeW91IGRvIHRoZXNlIHR3byB0aGluZ3M6CisKKyAgICBhKSBBY2NvbXBhbnkgdGhlIGNvbWJpbmVkIGxpYnJhcnkgd2l0aCBhIGNvcHkgb2YgdGhlIHNhbWUgd29yaworICAgIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCB1bmNvbWJpbmVkIHdpdGggYW55IG90aGVyIGxpYnJhcnkKKyAgICBmYWNpbGl0aWVzLiAgVGhpcyBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAgICBTZWN0aW9ucyBhYm92ZS4KKworICAgIGIpIEdpdmUgcHJvbWluZW50IG5vdGljZSB3aXRoIHRoZSBjb21iaW5lZCBsaWJyYXJ5IG9mIHRoZSBmYWN0CisgICAgdGhhdCBwYXJ0IG9mIGl0IGlzIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgYW5kIGV4cGxhaW5pbmcKKyAgICB3aGVyZSB0byBmaW5kIHRoZSBhY2NvbXBhbnlpbmcgdW5jb21iaW5lZCBmb3JtIG9mIHRoZSBzYW1lIHdvcmsuCisKKyAgOC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBsaW5rIHdpdGgsIG9yIGRpc3RyaWJ1dGUKK3RoZSBMaWJyYXJ5IGV4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55CithdHRlbXB0IG90aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIGxpbmsgd2l0aCwgb3IKK2Rpc3RyaWJ1dGUgdGhlIExpYnJhcnkgaXMgdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91cgorcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4gIEhvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLAorb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlciB0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcwordGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2ggcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgorCisgIDkuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAorc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKK2Rpc3RyaWJ1dGUgdGhlIExpYnJhcnkgb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQorcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQorbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgTGlicmFyeSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitMaWJyYXJ5KSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAorYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwordGhlIExpYnJhcnkgb3Igd29ya3MgYmFzZWQgb24gaXQuCisKKyAgMTAuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkpLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCitvcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlLCBsaW5rIHdpdGggb3IgbW9kaWZ5IHRoZSBMaWJyYXJ5CitzdWJqZWN0IHRvIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCityZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCitZb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0bwordGhpcyBMaWNlbnNlLgorDAorICAxMS4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAoraW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKK2NvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKK290aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKK2V4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90CitkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCitMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91CittYXkgbm90IGRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50CitsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5IGJ5CithbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KK3RoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KK3JlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIExpYnJhcnkuCisKK0lmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhbnkKK3BhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBhcHBseSwKK2FuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyIGNpcmN1bXN0YW5jZXMuCisKK0l0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKK3BhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55CitzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCitpbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSB3aGljaCBpcworaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCitnZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCit0aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAorc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwordG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90CitpbXBvc2UgdGhhdCBjaG9pY2UuCisKK1RoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bworYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMTIuIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgTGlicmFyeSBpcyByZXN0cmljdGVkIGluCitjZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKK29yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgTGlicmFyeSB1bmRlciB0aGlzIExpY2Vuc2UgbWF5IGFkZAorYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZyB0aG9zZSBjb3VudHJpZXMsCitzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZyBjb3VudHJpZXMgbm90IHRodXMKK2V4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzIHRoZSBsaW1pdGF0aW9uIGFzIGlmCit3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KKworICAxMy4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcKK3ZlcnNpb25zIG9mIHRoZSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuCitTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsIGJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sCitidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8gYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCisKK0VhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIExpYnJhcnkKK3NwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZAorImFueSBsYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZAorY29uZGl0aW9ucyBlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBMaWJyYXJ5IGRvZXMgbm90IHNwZWNpZnkgYQorbGljZW5zZSB2ZXJzaW9uIG51bWJlciwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisMCisgIDE0LiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgTGlicmFyeSBpbnRvIG90aGVyIGZyZWUKK3Byb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBpbmNvbXBhdGlibGUgd2l0aCB0aGVzZSwKK3dyaXRlIHRvIHRoZSBhdXRob3IgdG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzCitjb3B5cmlnaHRlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzIG1ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91cgorZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2FscyBvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cworb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZCBvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcKK2FuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCisKKwkJCSAgICBOTyBXQVJSQU5UWQorCisgIDE1LiBCRUNBVVNFIFRIRSBMSUJSQVJZIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTworV0FSUkFOVFkgRk9SIFRIRSBMSUJSQVJZLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4KK0VYQ0VQVCBXSEVOIE9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SCitPVEhFUiBQQVJUSUVTIFBST1ZJREUgVEhFIExJQlJBUlkgIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWQorS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCitJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKK1BVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRQorTElCUkFSWSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUgTElCUkFSWSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUKK1RIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4KKworICAxNi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTgorV1JJVElORyBXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkKK0FORC9PUiBSRURJU1RSSUJVVEUgVEhFIExJQlJBUlkgQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VCitGT1IgREFNQUdFUywgSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SCitDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRQorTElCUkFSWSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORworUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZIFlPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEKK0ZBSUxVUkUgT0YgVEhFIExJQlJBUlkgVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUiBTT0ZUV0FSRSksIEVWRU4gSUYKK1NVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKK0RBTUFHRVMuCisKKwkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwwKKyAgICAgQXBwZW5kaXg6IEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBMaWJyYXJpZXMKKworICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBsaWJyYXJ5LCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Citwb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgd2UgcmVjb21tZW5kIG1ha2luZyBpdCBmcmVlIHNvZnR3YXJlIHRoYXQKK2V2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZS4gIFlvdSBjYW4gZG8gc28gYnkgcGVybWl0dGluZworcmVkaXN0cmlidXRpb24gdW5kZXIgdGhlc2UgdGVybXMgKG9yLCBhbHRlcm5hdGl2ZWx5LCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCitvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlKS4KKworICBUbyBhcHBseSB0aGVzZSB0ZXJtcywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgbGlicmFyeS4gIEl0IGlzCitzYWZlc3QgdG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQorY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QgdGhlCisiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgorCisgICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIGxpYnJhcnkncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KKyAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgorCitZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgorc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgbGlicmFyeSwgaWYKK25lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKKworICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZQorICBsaWJyYXJ5IGBGcm9iJyAoYSBsaWJyYXJ5IGZvciB0d2Vha2luZyBrbm9icykgd3JpdHRlbiBieSBKYW1lcyBSYW5kb20gSGFja2VyLgorCisgIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk5MAorICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQorCitUaGF0J3MgYWxsIHRoZXJlIGlzIHRvIGl0IQorCisKKyAqIE1PRFBfQjY0IC0gSGlnaCBwZXJmb3JtYW5jZSBiYXNlNjQgZW5jb2Rlci9kZWNvZGVyCisgKiBWZXJzaW9uIDEuMyAtLSAxNy1NYXItMjAwNgorICogaHR0cDovL21vZHAuY29tL3JlbGVhc2UvYmFzZTY0CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2ICBOaWNrIEdhbGJyZWF0aCAtLSBuaWNrZyBbYXRdIG1vZHAgW2RvdF0gY29tCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqICAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqICAgTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgbW9kcC5jb20gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitDb3B5cmlnaHQgMjAwOCBNb2xva29DYWNhbworQWxsIHJpZ2h0cyByZXNlcnZlZAorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRpbmcgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgCithcmUgbWV0OgorMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKzIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCitESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKK0RBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCitPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKK0hPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKK1NUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCitQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworQ29weXJpZ2h0IChjKSAyMDA0LTIwMDkgU2VyZ2V5IEx5dWJrYQorUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAyMDA5IEdpbGJlcnQgV2VsbGlzY2gKKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKK2luIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKK3RvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKK2NvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK0FVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKK0xJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCitPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCitUSEUgU09GVFdBUkUuCisKKworQ29weXJpZ2h0IDIwMTAtMjAxMSwgR29vZ2xlIEluYy4KK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorbWV0OgorCisqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Citub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKK2NvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKK2luIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKK2Rpc3RyaWJ1dGlvbi4KKyogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KK3RoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCitMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKK0EgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCitPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKK1NQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKK0xJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCitUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKK09GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKworLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgorICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCisgKgorICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCisgKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLworICoKKyAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCisgKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKKyAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCisgKiBMaWNlbnNlLgorICoKKyAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIG1vemlsbGEub3JnIGNvZGUuCisgKgorICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCisgKiBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KKyAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMDIKKyAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBDb250cmlidXRvcihzKToKKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCisgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKKyAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCisgKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQorICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bworICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKKyAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCisgKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQorICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgorICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KKyAqCisgKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLworCisgICBBIEMtcHJvZ3JhbSBmb3IgTVQxOTkzNywgd2l0aCBpbml0aWFsaXphdGlvbiBpbXByb3ZlZCAyMDAyLzEvMjYuCisgICBDb2RlZCBieSBUYWt1amkgTmlzaGltdXJhIGFuZCBNYWtvdG8gTWF0c3Vtb3RvLgorCisgICBCZWZvcmUgdXNpbmcsIGluaXRpYWxpemUgdGhlIHN0YXRlIGJ5IHVzaW5nIGluaXRfZ2VucmFuZChzZWVkKSAgCisgICBvciBpbml0X2J5X2FycmF5KGluaXRfa2V5LCBrZXlfbGVuZ3RoKS4KKworICAgQ29weXJpZ2h0IChDKSAxOTk3IC0gMjAwMiwgTWFrb3RvIE1hdHN1bW90byBhbmQgVGFrdWppIE5pc2hpbXVyYSwKKyAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgIGFyZSBtZXQ6CisKKyAgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgICAzLiBUaGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIAorICAgICAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gCisgICAgICAgIHBlcm1pc3Npb24uCisKKyAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAgIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgorICAgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgICBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgICBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAgIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAgIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAgIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOSBUaGUgQ2hyb21pdW0gT1MgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCisKK1RoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgorMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCit0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KKworU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKK1dJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQorZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKK0xpY2Vuc2UuCisKK1RoZSBPcmlnaW5hbCBDb2RlIGlzIG1vemlsbGEub3JnIGNvZGUuCisKK1RoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcworTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCitQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4Cit0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKK0NvbnRyaWJ1dG9yKHMpOgorCitBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgorZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCit0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKK2luIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCitvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQordW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwordXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKK2RlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCithbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQordGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgordGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KKworICAKKyAgQ29weXJpZ2h0IChjKSAyMDA0LTIwMTIgYnkgTXVsbGUgS3liZXJuZXRpay4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5IGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cyBkb2N1bWVudGF0aW9uCisgIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IGJvdGggdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbgorICBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBkZXJpdmF0aXZlIHdvcmtzIG9yIG1vZGlmaWVkIHZlcnNpb25zLAorICBhbmQgYW55IHBvcnRpb25zIHRoZXJlb2YsIGFuZCB0aGF0IGJvdGggbm90aWNlcyBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLAorICBhbmQgdGhhdCBjcmVkaXQgaXMgZ2l2ZW4gdG8gTXVsbGUgS3liZXJuZXRpayBpbiBhbGwgZG9jdW1lbnRzIGFuZCBwdWJsaWNpdHkKKyAgcGVydGFpbmluZyB0byBkaXJlY3Qgb3IgaW5kaXJlY3QgdXNlIG9mIHRoaXMgY29kZSBvciBpdHMgZGVyaXZhdGl2ZXMuCisKKyAgVEhJUyBJUyBFWFBFUklNRU5UQUwgU09GVFdBUkUgQU5EIElUIElTIEtOT1dOIFRPIEhBVkUgQlVHUywgU09NRSBPRiBXSElDSCBNQVkgSEFWRQorICBTRVJJT1VTIENPTlNFUVVFTkNFUy4gVEhFIENPUFlSSUdIVCBIT0xERVIgQUxMT1dTIEZSRUUgVVNFIE9GIFRISVMgU09GVFdBUkUgSU4gSVRTCisgICJBUyBJUyIgQ09ORElUSU9OLiBUSEUgQ09QWVJJR0hUIEhPTERFUiBESVNDTEFJTVMgQU5ZIExJQUJJTElUWSBPRiBBTlkgS0lORCBGT1IgQU5ZCisgIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRElSRUNUTFkgT1IgSU5ESVJFQ1RMWSBGUk9NIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRQorICBPUiBPRiBBTlkgREVSSVZBVElWRSBXT1JLLgorCisgIExJQ0VOU0UgSVNTVUVTCisgID09PT09PT09PT09PT09CisKKyAgVGhlIE9wZW5TU0wgdG9vbGtpdCBzdGF5cyB1bmRlciBhIGR1YWwgbGljZW5zZSwgaS5lLiBib3RoIHRoZSBjb25kaXRpb25zIG9mCisgIHRoZSBPcGVuU1NMIExpY2Vuc2UgYW5kIHRoZSBvcmlnaW5hbCBTU0xlYXkgbGljZW5zZSBhcHBseSB0byB0aGUgdG9vbGtpdC4KKyAgU2VlIGJlbG93IGZvciB0aGUgYWN0dWFsIGxpY2Vuc2UgdGV4dHMuIEFjdHVhbGx5IGJvdGggbGljZW5zZXMgYXJlIEJTRC1zdHlsZQorICBPcGVuIFNvdXJjZSBsaWNlbnNlcy4gSW4gY2FzZSBvZiBhbnkgbGljZW5zZSBpc3N1ZXMgcmVsYXRlZCB0byBPcGVuU1NMCisgIHBsZWFzZSBjb250YWN0IG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKworICBPcGVuU1NMIExpY2Vuc2UKKyAgLS0tLS0tLS0tLS0tLS0tCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxMSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisgT3JpZ2luYWwgU1NMZWF5IExpY2Vuc2UKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKworQ29weXJpZ2h0IDIwMDEtMjAxMSBYaXBoLk9yZywgU2t5cGUgTGltaXRlZCwgT2N0YXNpYywKKyAgICAgICAgICAgICAgICAgICAgSmVhbi1NYXJjIFZhbGluLCBUaW1vdGh5IEIuIFRlcnJpYmVycnksCisgICAgICAgICAgICAgICAgICAgIENTSVJPLCBHcmVnb3J5IE1heHdlbGwsIE1hcmsgQm9yZ2VyZGluZywKKyAgICAgICAgICAgICAgICAgICAgRXJpayBkZSBDYXN0cm8gTG9wbworCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworYXJlIG1ldDoKKworLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCistIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Citub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCitkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCistIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZXJuZXQgU29jaWV0eSwgSUVURiBvciBJRVRGIFRydXN0LCBub3IgdGhlIAorbmFtZXMgb2Ygc3BlY2lmaWMgY29udHJpYnV0b3JzLCBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKK3Byb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbgorcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCitBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUgorT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCitFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCitQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKK1BST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKK0xJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCitORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKK1NPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitPcHVzIGlzIHN1YmplY3QgdG8gdGhlIHJveWFsdHktZnJlZSBwYXRlbnQgbGljZW5zZXMgd2hpY2ggYXJlCitzcGVjaWZpZWQgYXQ6CisKK1hpcGguT3JnIEZvdW5kYXRpb246CitodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2lwci8xNTI0LworCitNaWNyb3NvZnQgQ29ycG9yYXRpb246CitodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2lwci8xOTE0LworCitCcm9hZGNvbSBDb3Jwb3JhdGlvbjoKK2h0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvaXByLzE1MjYvCisKKy8vIENvcHlyaWdodCAoYykgMjAwOSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworUExZIChQeXRob24gTGV4LVlhY2MpICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMy40CisKK0NvcHlyaWdodCAoQykgMjAwMS0yMDExLAorRGF2aWQgTS4gQmVhemxleSAoRGFiZWF6IExMQykKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorbWV0OgorCisqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gIAorKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIAorICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAgCisqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIERhdmlkIEJlYXpsZXkgb3IgRGFiZWF6IExMQyBtYXkgYmUgdXNlZCB0bworICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCitBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCitTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCitMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKK0RBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCitPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBQb2x5bWVyIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK0NvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCittZXQ6CisKKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Citub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCitjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCitpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCitkaXN0cmlidXRpb24uCisgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCitjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQordGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKK0xJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKK09XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCitEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKK1RIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworQ29kZSBnZW5lcmF0ZWQgYnkgdGhlIFByb3RvY29sIEJ1ZmZlciBjb21waWxlciBpcyBvd25lZCBieSB0aGUgb3duZXIKK29mIHRoZSBpbnB1dCBmaWxlIHVzZWQgd2hlbiBnZW5lcmF0aW5nIGl0LiAgVGhpcyBjb2RlIGlzIG5vdAorc3RhbmRhbG9uZSBhbmQgcmVxdWlyZXMgYSBzdXBwb3J0IGxpYnJhcnkgdG8gYmUgbGlua2VkIHdpdGggaXQuICBUaGlzCitzdXBwb3J0IGxpYnJhcnkgaXMgaXRzZWxmIGNvdmVyZWQgYnkgdGhlIGFib3ZlIGxpY2Vuc2UuCisKK0NvcHlyaWdodCAoYykgMjAwMy0yMDEyLCBNaWNoYWVsIEZvb3JkCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKK21ldDoKKworICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCitBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCitTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCitMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKK0RBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCitPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitxY21zCitDb3B5cmlnaHQgKEMpIDIwMDkgTW96aWxsYSBDb3Jwb3JhdGlvbgorQ29weXJpZ2h0IChDKSAxOTk4LTIwMDcgTWFydGkgTWFyaWEKKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIAorYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCAKK3RvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gCit0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgCithbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgCitpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiAKK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgCitFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gCitUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCAKK05PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgCitMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIAorT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIAorV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKKy8vIENvcHlyaWdodCAoYykgMjAwOSBUaGUgUkUyIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKKyAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KKworICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKKyAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKKyAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCisgICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQorICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCisgICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCisgICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKKyAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KKworICAgQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCitDb3B5cmlnaHQgKGMpIDIwMDYgQm9iIElwcG9saXRvCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKK3RoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCit0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCit1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvCitzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKK1NPRlRXQVJFLgorCisvLyBDb3B5cmlnaHQgKGMpIDIwMTEgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworQWxsIE11cm11ckhhc2ggc291cmNlIGZpbGVzIGFyZSBwbGFjZWQgaW4gdGhlIHB1YmxpYyBkb21haW4uCisKK1RoZSBsaWNlbnNlIGJlbG93IGFwcGxpZXMgdG8gYWxsIG90aGVyIGNvZGUgaW4gU01IYXNoZXI6CisKK0NvcHlyaWdodCAoYykgMjAxMSBHb29nbGUsIEluYy4KKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKK2luIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKK3RvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKK2NvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK0FVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKK0xJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCitPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCitUSEUgU09GVFdBUkUuCisKK1RoZSBhdXRob3IgZGlzY2xhaW1zIGNvcHlyaWdodCB0byB0aGlzIHNvdXJjZSBjb2RlLiAgSW4gcGxhY2Ugb2YKK2EgbGVnYWwgbm90aWNlLCBoZXJlIGlzIGEgYmxlc3Npbmc6CisKKyAgIE1heSB5b3UgZG8gZ29vZCBhbmQgbm90IGV2aWwuCisgICBNYXkgeW91IGZpbmQgZm9yZ2l2ZW5lc3MgZm9yIHlvdXJzZWxmIGFuZCBmb3JnaXZlIG90aGVycy4KKyAgIE1heSB5b3Ugc2hhcmUgZnJlZWx5LCBuZXZlciB0YWtpbmcgbW9yZSB0aGFuIHlvdSBnaXZlLgorCitTV0lHIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBmb2xsb3dpbmcgdGVybXM6CisKK0kuICAKKworQ29weXJpZ2h0IChjKSAxOTk1LTE5OTgKK1RoZSBVbml2ZXJzaXR5IG9mIFV0YWggYW5kIHRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKK0FsbCBSaWdodHMgUmVzZXJ2ZWQKKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgd2l0aG91dCB3cml0dGVuIGFncmVlbWVudCBhbmQgd2l0aG91dAorbGljZW5zZSBvciByb3lhbHR5IGZlZXMsIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCitzb2Z0d2FyZSBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlLCBwcm92aWRlZCB0aGF0IAorKDEpIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGUgZm9sbG93aW5nIHR3byBwYXJhZ3JhcGhzCithcHBlYXIgaW4gYWxsIGNvcGllcyBvZiB0aGUgc291cmNlIGNvZGUgYW5kICgyKSByZWRpc3RyaWJ1dGlvbnMKK2luY2x1ZGluZyBiaW5hcmllcyByZXByb2R1Y2VzIHRoZXNlIG5vdGljZXMgaW4gdGhlIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uICAgU3Vic3RhbnRpYWwgbW9kaWZpY2F0aW9ucyB0byB0aGlzIHNvZnR3YXJlIG1heSBiZQorY29weXJpZ2h0ZWQgYnkgdGhlaXIgYXV0aG9ycyBhbmQgbmVlZCBub3QgZm9sbG93IHRoZSBsaWNlbnNpbmcgdGVybXMKK2Rlc2NyaWJlZCBoZXJlLCBwcm92aWRlZCB0aGF0IHRoZSBuZXcgdGVybXMgYXJlIGNsZWFybHkgaW5kaWNhdGVkIGluCithbGwgZmlsZXMgd2hlcmUgdGhleSBhcHBseS4KKworSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiwgVEhFIFVOSVZFUlNJVFkgT0YgQ0FMSUZPUk5JQSwgVEhFIAorVU5JVkVSU0lUWSBPRiBVVEFIIE9SIERJU1RSSUJVVE9SUyBPRiBUSElTIFNPRlRXQVJFIEJFIExJQUJMRSBUTyBBTlkKK1BBUlRZIEZPUiBESVJFQ1QsIElORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMLCBPUiBDT05TRVFVRU5USUFMCitEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSBBTkQgSVRTIERPQ1VNRU5UQVRJT04sCitFVkVOIElGIFRIRSBBVVRIT1JTIE9SIEFOWSBPRiBUSEUgQUJPVkUgUEFSVElFUyBIQVZFIEJFRU4gQURWSVNFRCBPRgorVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitUSEUgQVVUSE9SLCBUSEUgVU5JVkVSU0lUWSBPRiBDQUxJRk9STklBLCBBTkQgVEhFIFVOSVZFUlNJVFkgT0YgVVRBSAorU1BFQ0lGSUNBTExZIERJU0NMQUlNIEFOWSBXQVJSQU5USUVTLElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCAKK1RIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKK1BVUlBPU0UuIFRIRSBTT0ZUV0FSRSBQUk9WSURFRCBIRVJFVU5ERVIgSVMgT04gQU4gIkFTIElTIiBCQVNJUywgQU5EIAorVEhFIEFVVEhPUlMgQU5EIERJU1RSSUJVVE9SUyBIQVZFIE5PIE9CTElHQVRJT04gVE8gUFJPVklERSBNQUlOVEVOQU5DRSwKK1NVUFBPUlQsIFVQREFURVMsIEVOSEFOQ0VNRU5UUywgT1IgTU9ESUZJQ0FUSU9OUy4KKworCitJSS4gCisKK1RoaXMgc29mdHdhcmUgaW5jbHVkZXMgY29udHJpYnV0aW9ucyB0aGF0IGFyZSBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNQorVW5pdmVyc2l0eSBvZiBDaGljYWdvLgorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCittZXQ6CisKK1JlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKK3RoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuICBSZWRpc3RyaWJ1dGlvbnMKK2luIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YKK2NvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3IKK290aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uICBOZWl0aGVyIHRoZSBuYW1lIG9mCit0aGUgVW5pdmVyc2l0eSBvZiBDaGljYWdvIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUKK3VzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKK3NwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgVU5JVkVSU0lUWSBPRiBDSElDQUdPIEFORCBDT05UUklCVVRPUlMKKyJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCitMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgVU5JVkVSU0lUWSBPRgorQ0hJQ0FHTyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKK1NQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRAorVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKK05FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKworSUlJLiAgCisKK1RoaXMgc29mdHdhcmUgaW5jbHVkZXMgY29udHJpYnV0aW9ucyB0aGF0IGFyZSBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNgorQXJpem9uYSBCb2FyZCBvZiBSZWdlbnRzIChVbml2ZXJzaXR5IG9mIEFyaXpvbmEpLgorQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCB3aXRob3V0IHdyaXR0ZW4gYWdyZWVtZW50IGFuZCB3aXRob3V0CitsaWNlbnNlIG9yIHJveWFsdHkgZmVlcywgdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKK3NvZnR3YXJlIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UsIHByb3ZpZGVkIHRoYXQgCisoMSkgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoZSBmb2xsb3dpbmcgdHdvIHBhcmFncmFwaHMKK2FwcGVhciBpbiBhbGwgY29waWVzIG9mIHRoZSBzb3VyY2UgY29kZSBhbmQgKDIpIHJlZGlzdHJpYnV0aW9ucworaW5jbHVkaW5nIGJpbmFyaWVzIHJlcHJvZHVjZXMgdGhlc2Ugbm90aWNlcyBpbiB0aGUgc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4gICBTdWJzdGFudGlhbCBtb2RpZmljYXRpb25zIHRvIHRoaXMgc29mdHdhcmUgbWF5IGJlCitjb3B5cmlnaHRlZCBieSB0aGVpciBhdXRob3JzIGFuZCBuZWVkIG5vdCBmb2xsb3cgdGhlIGxpY2Vuc2luZyB0ZXJtcworZGVzY3JpYmVkIGhlcmUsIHByb3ZpZGVkIHRoYXQgdGhlIG5ldyB0ZXJtcyBhcmUgY2xlYXJseSBpbmRpY2F0ZWQgaW4KK2FsbCBmaWxlcyB3aGVyZSB0aGV5IGFwcGx5LgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBVTklWRVJTSVRZIE9GIEFSSVpPTkEgQU5EIENPTlRSSUJVVE9SUworIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKK0xJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBVTklWRVJTSVRZIE9GCitBUklaT05BIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVECitUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCitQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCitTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworCisvLyBDb3B5cmlnaHQgKGMpIDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitBbGwgY29kZSBoZXJlIGlzIHB1YmxpYyBkb21haW4uCisKK0NvcHlyaWdodCAoYykgMjAxMiwgTGludXggVVNCIFByb2plY3QKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworbyBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKK28gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCitvIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpbnV4IFVTQiBQcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzCisgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyhDb3BpZWQgZnJvbSB0aGUgQ09QWVJJR0hUIGZpbGUgb2YKK2h0dHBzOi8vY29kZS5nb29nbGUuY29tL3Avc2N0cC1yZWZpbXBsL3NvdXJjZS9icm93c2UvdHJ1bmsvQ09QWVJJR0hUKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQ29weXJpZ2h0IChjKSAyMDAxLCAyMDAyIENpc2NvIFN5c3RlbXMsIEluYy4KK0NvcHlyaWdodCAoYykgMjAwMi0xMiBSYW5kYWxsIFIuIFN0ZXdhcnQKK0NvcHlyaWdodCAoYykgMjAwMi0xMiBNaWNoYWVsIFR1ZXhlbgorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKK2FyZSBtZXQ6CisKKzEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCitJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKK0ZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCitEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCitIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorU1VDSCBEQU1BR0UuCisKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyogeDg2aW5jLmFzbQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMSB4MjY0IHByb2plY3QKKzsqCis7KiBBdXRob3JzOiBMb3JlbiBNZXJyaXR0IDxsb3Jlbm1AdS53YXNoaW5ndG9uLmVkdT4KKzsqICAgICAgICAgIEFudG9uIE1pdHJvZmFub3YgPEJ1Z01hc3RlckBuYXJvZC5ydT4KKzsqICAgICAgICAgIEphc29uIEdhcnJldHQtR2xhc2VyIDxkYXJrc2hpa2FyaUBnbWFpbC5jb20+Cis7KgorOyogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Cis7KiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCis7KiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorOyoKKzsqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworOyogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorOyogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKzsqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKzsqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorOyogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKzsqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworOyBUaGlzIGlzIGEgaGVhZGVyIGZpbGUgZm9yIHRoZSB4MjY0QVNNIGFzc2VtYmx5IGxhbmd1YWdlLCB3aGljaCB1c2VzCis7IE5BU00vWUFTTSBzeW50YXggY29tYmluZWQgd2l0aCBhIGxhcmdlIG51bWJlciBvZiBtYWNyb3MgdG8gcHJvdmlkZSBlYXN5Cis7IGFic3RyYWN0aW9uIGJldHdlZW4gZGlmZmVyZW50IGNhbGxpbmcgY29udmVudGlvbnMgKHg4Nl8zMiwgd2luNjQsIGxpbnV4NjQpLgorOyBJdCBhbHNvIGhhcyB2YXJpb3VzIG90aGVyIHVzZWZ1bCBmZWF0dXJlcyB0byBzaW1wbGlmeSB3cml0aW5nIHRoZSBraW5kIG9mCis7IERTUCBmdW5jdGlvbnMgdGhhdCBhcmUgbW9zdCBvZnRlbiB1c2VkIGluIHgyNjQuCisKKzsgVW5saWtlIHRoZSByZXN0IG9mIHgyNjQsIHRoaXMgZmlsZSBpcyBhdmFpbGFibGUgdW5kZXIgYW4gSVNDIGxpY2Vuc2UsIGFzIGl0Cis7IGhhcyBzaWduaWZpY2FudCB1c2VmdWxuZXNzIG91dHNpZGUgb2YgeDI2NCBhbmQgd2Ugd2FudCBpdCB0byBiZSBhdmFpbGFibGUKKzsgdG8gdGhlIGxhcmdlc3QgYXVkaWVuY2UgcG9zc2libGUuICBPZiBjb3Vyc2UsIGlmIHlvdSBtb2RpZnkgaXQgZm9yIHlvdXIgb3duCis7IHB1cnBvc2VzIHRvIGFkZCBhIG5ldyBmZWF0dXJlLCB3ZSBzdHJvbmdseSBlbmNvdXJhZ2UgY29udHJpYnV0aW5nIGEgcGF0Y2gKKzsgYXMgdGhpcyBmZWF0dXJlIG1pZ2h0IGJlIHVzZWZ1bCBmb3Igb3RoZXJzIGFzIHdlbGwuICBTZW5kIHBhdGNoZXMgb3IgaWRlYXMKKzsgdG8geDI2NC1kZXZlbEB2aWRlb2xhbi5vcmcgLgorCitZYXNtIGlzIENvcHlyaWdodCAoYykgMjAwMS0yMDEwIFBldGVyIEpvaG5zb24gYW5kIG90aGVyIFlhc20gZGV2ZWxvcGVycy4KKworWWFzbSBkZXZlbG9wZXJzIGFuZC9vciBjb250cmlidXRvcnMgaW5jbHVkZToKKyAgUGV0ZXIgSm9obnNvbgorICBNaWNoYWVsIFVybWFuCisgIEJyaWFuIEdsYWRtYW4gKFZpc3VhbCBTdHVkaW8gYnVpbGQgZmlsZXMsIG90aGVyIGZpeGVzKQorICBTdGFuaXNsYXYgS2FyY2hlYm55IChvcHRpb25zIHBhcnNlcikKKyAgTWF0aGlldSBNb25uaWVyIChTU0U0IGluc3RydWN0aW9uIHBhdGNoZXMsIE5BU00gcHJlcHJvY2Vzc29yIGFkZGl0aW9ucykKKyAgQW5vbnltb3VzICJOQVNNNjQiIGRldmVsb3BlciAoTkFTTSBwcmVwcm9jZXNzb3IgZml4ZXMpCisgIFN0ZXBoZW4gUG9sa293c2tpICh4ODYgaW5zdHJ1Y3Rpb24gcGF0Y2hlcykKKyAgSGVucnlrIFJpY2h0ZXIgKE1hY2gtTyBvYmplY3QgZm9ybWF0KQorICBCZW4gU2tlZ2dzIChwYXRjaGVzLCBidWcgcmVwb3J0cykKKyAgQWxleGVpIFN2aXRraW5lIChHQVMgcHJlcHJvY2Vzc29yKQorICBTYW11ZWwgVGhpYmF1bHQgKFRBU00gcGFyc2VyIGFuZCBmcm9udGVuZCkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1lhc20gbGljZW5zaW5nIG92ZXJ2aWV3IGFuZCBzdW1tYXJ5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOb3RlOiBUaGlzIGRvY3VtZW50IGRvZXMgbm90IHByb3ZpZGUgbGVnYWwgYWR2aWNlIG5vciBpcyBpdCB0aGUgYWN0dWFsCitsaWNlbnNlIG9mIGFueSBwYXJ0IG9mIFlhc20uICBTZWUgdGhlIGluZGl2aWR1YWwgbGljZW5zZXMgZm9yIGNvbXBsZXRlCitkZXRhaWxzLiAgQ29uc3VsdCBhIGxhd3llciBmb3IgbGVnYWwgYWR2aWNlLgorCitUaGUgcHJpbWFyeSBsaWNlbnNlIG9mIFlhc20gaXMgdGhlIDItY2xhdXNlIEJTRCBsaWNlbnNlLiAgUGxlYXNlIHVzZSB0aGlzCitsaWNlbnNlIGlmIHlvdSBwbGFuIG9uIHN1Ym1pdHRpbmcgY29kZSB0byB0aGUgcHJvamVjdC4KKworWWFzbSBoYXMgYWJzb2x1dGVseSBubyB3YXJyYW50eTsgbm90IGV2ZW4gZm9yIG1lcmNoYW50aWJpbGl0eSBvciBmaXRuZXNzCitmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuCisKKy0tLS0tLS0KK0xpYnlhc20KKy0tLS0tLS0KK0xpYnlhc20gaXMgMi1jbGF1c2Ugb3IgMy1jbGF1c2UgQlNEIGxpY2Vuc2VkLCB3aXRoIHRoZSBleGNlcHRpb24gb2YKK2JpdHZlY3QsIHdoaWNoIGlzIHRyaXBsZS1saWNlbnNlZCB1bmRlciB0aGUgQXJ0aXN0aWMgbGljZW5zZSwgR1BMLCBhbmQKK0xHUEwuICBMaWJ5YXNtIGlzIHRodXMgR1BMIGFuZCBMR1BMIGNvbXBhdGlibGUuICBJbiBhZGRpdGlvbiwgdGhpcyBhbHNvCittZWFucyB0aGF0IGxpYnlhc20gaXMgZnJlZSBmb3IgYmluYXJ5LW9ubHkgZGlzdHJpYnV0aW9uIGFzIGxvbmcgYXMgdGhlCit0ZXJtcyBvZiB0aGUgMy1jbGF1c2UgQlNEIGxpY2Vuc2UgYW5kIEFydGlzdGljIGxpY2Vuc2UgKGFzIGl0IGFwcGxpZXMgdG8KK2JpdHZlY3QpIGFyZSBmdWxmaWxsZWQuCisKKy0tLS0tLS0KK01vZHVsZXMKKy0tLS0tLS0KK1RoZSBtb2R1bGVzIGFyZSAyLWNsYXVzZSBvciAzLWNsYXVzZSBCU0QgbGljZW5zZWQuCisKKy0tLS0tLS0tLQorRnJvbnRlbmRzCistLS0tLS0tLS0KK1RoZSBmcm9udGVuZHMgYXJlIDItY2xhdXNlIEJTRCBsaWNlbnNlZC4KKworLS0tLS0tLS0tLS0tLQorTGljZW5zZSBUZXh0cworLS0tLS0tLS0tLS0tLQorVGhlIGZ1bGwgdGV4dCBvZiBhbGwgbGljZW5zZXMgYXJlIHByb3ZpZGVkIGluIHNlcGFyYXRlIGZpbGVzIGluIHRoZSBzb3VyY2UKK2Rpc3RyaWJ1dGlvbi4gIEVhY2ggc291cmNlIGZpbGUgbWF5IGluY2x1ZGUgdGhlIGVudGlyZSBsaWNlbnNlIChpbiB0aGUgY2FzZQorb2YgdGhlIEJTRCBhbmQgQXJ0aXN0aWMgbGljZW5zZXMpLCBvciBtYXkgcmVmZXJlbmNlIHRoZSBHUEwgb3IgTEdQTCBsaWNlbnNlCitmaWxlLgorCitCU0QudHh0IC0gMi1jbGF1c2UgYW5kIDMtY2xhdXNlIEJTRCBsaWNlbnNlcworQXJ0aXN0aWMudHh0IC0gQXJ0aXN0aWMgbGljZW5zZQorR05VX0dQTC0yLjAgLSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorR05VX0xHUEwtMi4wIC0gR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorCisvKiB6bGliLmggLS0gaW50ZXJmYWNlIG9mIHRoZSAnemxpYicgZ2VuZXJhbCBwdXJwb3NlIGNvbXByZXNzaW9uIGxpYnJhcnkKKyAgdmVyc2lvbiAxLjIuNCwgTWFyY2ggMTR0aCwgMjAxMAorCisgIENvcHlyaWdodCAoQykgMTk5NS0yMDEwIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXIKKworICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisKKyAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorCisgIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisgICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisgICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisKKyAgSmVhbi1sb3VwIEdhaWxseQorICBNYXJrIEFkbGVyCisKKyovCisKK0NvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCittZXQ6CisKKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Citub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCitjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCitpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCitkaXN0cmlidXRpb24uCisgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCitjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQordGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKK0xJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKK09XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCitEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKK1RIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgZmlsZSB1cmxfcGFyc2UuY2MgaXMgYmFzZWQgb24gbnNVUkxQYXJzZXJzLmNjIGZyb20gTW96aWxsYS4gVGhpcyBmaWxlIGlzCitsaWNlbnNlZCBzZXBhcmF0ZWx5IGFzIGZvbGxvd3M6CisKK1RoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgorMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCit0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KKworU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKK1dJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQorZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKK0xpY2Vuc2UuCisKK1RoZSBPcmlnaW5hbCBDb2RlIGlzIG1vemlsbGEub3JnIGNvZGUuCisKK1RoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcworTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCitQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4Cit0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKK0NvbnRyaWJ1dG9yKHMpOgorICBEYXJpbiBGaXNoZXIgKG9yaWdpbmFsIGF1dGhvcikKKworQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKK2VpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgordGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCitpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAorb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKK3VuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KK3VzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCitkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQorYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKK3RoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKK3RoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCisKK0NvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCittZXQ6CisKKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Citub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCitjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCitpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCitkaXN0cmlidXRpb24uCisgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCitjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQordGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKK0xJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKK09XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCitEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKK1RIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgZmlsZSB1cmxfcGFyc2UuY2MgaXMgYmFzZWQgb24gbnNVUkxQYXJzZXJzLmNjIGZyb20gTW96aWxsYS4gVGhpcyBmaWxlIGlzCitsaWNlbnNlZCBzZXBhcmF0ZWx5IGFzIGZvbGxvd3M6CisKK1RoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgorMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCit0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KKworU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKK1dJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQorZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKK0xpY2Vuc2UuCisKK1RoZSBPcmlnaW5hbCBDb2RlIGlzIG1vemlsbGEub3JnIGNvZGUuCisKK1RoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcworTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCitQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4Cit0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKK0NvbnRyaWJ1dG9yKHMpOgorICBEYXJpbiBGaXNoZXIgKG9yaWdpbmFsIGF1dGhvcikKKworQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKK2VpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgordGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCitpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAorb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKK3VuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KK3VzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCitkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQorYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKK3RoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKK3RoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCisKK1RoaXMgbGljZW5zZSBhcHBsaWVzIHRvIGFsbCBwYXJ0cyBvZiBWOCB0aGF0IGFyZSBub3QgZXh0ZXJuYWxseQorbWFpbnRhaW5lZCBsaWJyYXJpZXMuICBUaGUgZXh0ZXJuYWxseSBtYWludGFpbmVkIGxpYnJhcmllcyB1c2VkIGJ5IFY4CithcmU6CisKKyAgLSBQQ1JFIHRlc3Qgc3VpdGUsIGxvY2F0ZWQgaW4KKyAgICB0ZXN0L21qc3VuaXQvdGhpcmRfcGFydHkvcmVnZXhwLXBjcmUuanMuICBUaGlzIGlzIGJhc2VkIG9uIHRoZQorICAgIHRlc3Qgc3VpdGUgZnJvbSBQQ1JFLTcuMywgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIFVuaXZlcnNpdHkKKyAgICBvZiBDYW1icmlkZ2UgYW5kIEdvb2dsZSwgSW5jLiAgVGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UKKyAgICBhcmUgZW1iZWRkZWQgaW4gcmVnZXhwLXBjcmUuanMuCisKKyAgLSBMYXlvdXQgdGVzdHMsIGxvY2F0ZWQgaW4gdGVzdC9tanN1bml0L3RoaXJkX3BhcnR5LiAgVGhlc2UgYXJlCisgICAgYmFzZWQgb24gbGF5b3V0IHRlc3RzIGZyb20gd2Via2l0Lm9yZyB3aGljaCBhcmUgY29weXJpZ2h0ZWQgYnkKKyAgICBBcHBsZSBDb21wdXRlciwgSW5jLiBhbmQgcmVsZWFzZWQgdW5kZXIgYSAzLWNsYXVzZSBCU0QgbGljZW5zZS4KKworICAtIFN0cm9uZ3RhbGsgYXNzZW1ibGVyLCB0aGUgYmFzaXMgb2YgdGhlIGZpbGVzIGFzc2VtYmxlci1hcm0taW5sLmgsCisgICAgYXNzZW1ibGVyLWFybS5jYywgYXNzZW1ibGVyLWFybS5oLCBhc3NlbWJsZXItaWEzMi1pbmwuaCwKKyAgICBhc3NlbWJsZXItaWEzMi5jYywgYXNzZW1ibGVyLWlhMzIuaCwgYXNzZW1ibGVyLXg2NC1pbmwuaCwKKyAgICBhc3NlbWJsZXIteDY0LmNjLCBhc3NlbWJsZXIteDY0LmgsIGFzc2VtYmxlci1taXBzLWlubC5oLAorICAgIGFzc2VtYmxlci1taXBzLmNjLCBhc3NlbWJsZXItbWlwcy5oLCBhc3NlbWJsZXIuY2MgYW5kIGFzc2VtYmxlci5oLgorICAgIFRoaXMgY29kZSBpcyBjb3B5cmlnaHRlZCBieSBTdW4gTWljcm9zeXN0ZW1zIEluYy4gYW5kIHJlbGVhc2VkCisgICAgdW5kZXIgYSAzLWNsYXVzZSBCU0QgbGljZW5zZS4KKworICAtIFZhbGdyaW5kIGNsaWVudCBBUEkgaGVhZGVyLCBsb2NhdGVkIGF0IHRoaXJkX3BhcnR5L3ZhbGdyaW5kL3ZhbGdyaW5kLmgKKyAgICBUaGlzIGlzIHJlbGVhc2UgdW5kZXIgdGhlIEJTRCBsaWNlbnNlLgorCitUaGVzZSBsaWJyYXJpZXMgaGF2ZSB0aGVpciBvd24gbGljZW5zZXM7IHdlIHJlY29tbWVuZCB5b3UgcmVhZCB0aGVtLAorYXMgdGhlaXIgdGVybXMgbWF5IGRpZmZlciBmcm9tIHRoZSB0ZXJtcyBiZWxvdy4KKworQ29weXJpZ2h0IDIwMDYtMjAxMiwgdGhlIFY4IHByb2plY3QgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorbWV0OgorCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCitMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKK0EgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCitPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKK1NQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKK0xJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCitUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKK09GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTm90aWNlcyBmb3IgZmlsZShzKToKKy9iaW4vbWFrZV9leHQ0ZnMKKy9iaW4vbWt1c2VyaW1nLnNoCisvbGliL2xpYmV4dDRfdXRpbHNfaG9zdC5hCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgQ29weXJpZ2h0IChjKSAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK05vdGljZXMgZm9yIGZpbGUocyk6CisvbGliL2xpYnNxbGl0ZV9qbmkuc28KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhpcyBzb2Z0d2FyZSBpcyBjb3B5cmlnaHRlZCBieSBDaHJpc3RpYW4gV2VybmVyIDxjaHdAY2gtd2VybmVyLmRlPgorYW5kIG90aGVycy4gVGhlIGZvbGxvd2luZyB0ZXJtcyBhcHBseSB0byBhbGwgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZQorc29mdHdhcmUgdW5sZXNzIGV4cGxpY2l0bHkgZGlzY2xhaW1lZCBpbiBpbmRpdmlkdWFsIGZpbGVzLgorCitUaGUgYXV0aG9ycyBoZXJlYnkgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwKK2FuZCBsaWNlbnNlIHRoaXMgc29mdHdhcmUgYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSwgcHJvdmlkZWQKK3RoYXQgZXhpc3RpbmcgY29weXJpZ2h0IG5vdGljZXMgYXJlIHJldGFpbmVkIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgdGhpcworbm90aWNlIGlzIGluY2x1ZGVkIHZlcmJhdGltIGluIGFueSBkaXN0cmlidXRpb25zLiBObyB3cml0dGVuIGFncmVlbWVudCwKK2xpY2Vuc2UsIG9yIHJveWFsdHkgZmVlIGlzIHJlcXVpcmVkIGZvciBhbnkgb2YgdGhlIGF1dGhvcml6ZWQgdXNlcy4KK01vZGlmaWNhdGlvbnMgdG8gdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29weXJpZ2h0ZWQgYnkgdGhlaXIgYXV0aG9ycworYW5kIG5lZWQgbm90IGZvbGxvdyB0aGUgbGljZW5zaW5nIHRlcm1zIGRlc2NyaWJlZCBoZXJlLCBwcm92aWRlZCB0aGF0Cit0aGUgbmV3IHRlcm1zIGFyZSBjbGVhcmx5IGluZGljYXRlZCBvbiB0aGUgZmlyc3QgcGFnZSBvZiBlYWNoIGZpbGUgd2hlcmUKK3RoZXkgYXBwbHkuCisKK0lOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIERJU1RSSUJVVE9SUyBCRSBMSUFCTEUgVE8gQU5ZIFBBUlRZCitGT1IgRElSRUNULCBJTkRJUkVDVCwgU1BFQ0lBTCwgSU5DSURFTlRBTCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCitBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIElUUyBET0NVTUVOVEFUSU9OLCBPUiBBTlkKK0RFUklWQVRJVkVTIFRIRVJFT0YsIEVWRU4gSUYgVEhFIEFVVEhPUlMgSEFWRSBCRUVOIEFEVklTRUQgT0YgVEhFCitQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworVEhFIEFVVEhPUlMgQU5EIERJU1RSSUJVVE9SUyBTUEVDSUZJQ0FMTFkgRElTQ0xBSU0gQU5ZIFdBUlJBTlRJRVMsCitJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgQU5EIE5PTi1JTkZSSU5HRU1FTlQuICBUSElTIFNPRlRXQVJFCitJUyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBBTkQgVEhFIEFVVEhPUlMgQU5EIERJU1RSSUJVVE9SUyBIQVZFCitOTyBPQkxJR0FUSU9OIFRPIFBST1ZJREUgTUFJTlRFTkFOQ0UsIFNVUFBPUlQsIFVQREFURVMsIEVOSEFOQ0VNRU5UUywgT1IKK01PRElGSUNBVElPTlMuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTm90aWNlcyBmb3IgZmlsZShzKToKKy9saWIvbGliZ2NjZGVtYW5nbGUuc28KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKwkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCisKKyBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcworIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgorCisJCQkgICAgUHJlYW1ibGUKKworICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCitmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQorc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCit1c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Cit0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KK3lvdXIgcHJvZ3JhbXMsIHRvby4KKworICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90CitwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91CitoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCit0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKK2lmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0CitpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCisKKyAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAorYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgorVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKK2Rpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCitncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKK3lvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCitzb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCityaWdodHMuCisKKyAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAorKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKK2Rpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCisKKyAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KK3RoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCitzb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKK3dhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCit0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAorYXV0aG9ycycgcmVwdXRhdGlvbnMuCisKKyAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKK3BhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKK3Byb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKK3Byb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQorcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KKworICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4KKwwKKwkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KKworICAwLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zCithIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZAordW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LAorcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iCittZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OgordGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKK2VpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyCitsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluCit0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KKworQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKK2NvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKK3J1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0KK2lzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgorV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCisKKyAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzCitzb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UKK2NvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUKK2NvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKK25vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsKK2FuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhlIFByb2dyYW0uCisKK1lvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZAoreW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KKworICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uCitvZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCitkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKK2Fib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CisKKyAgICBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgorCisgICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluCisgICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55CisgICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKKyAgICBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5CisgICAgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaAorICAgIGludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4KKyAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEKKyAgICBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUKKyAgICBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyCisgICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKKyAgICBMaWNlbnNlLiAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dAorICAgIGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24KKyAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKKwwKK1RoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKK2lkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCithbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KK3RoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKK3NlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQorZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCitvbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKK3RoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCitlbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCisKK1RodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoreW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCitleGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKK2NvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCisKK0luIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KK3dpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgorYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKK3RoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCit1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKK1NlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKKyAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKKyAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCisgICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKKyAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCisgICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQorICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCisgICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKKyAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcworICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91CisgICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAorICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQorCitUaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCittYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQorY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKK2Fzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bworY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQorc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCithbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQorZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKK29wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50CitpdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCisKK0lmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKK2FjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKK2FjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcworZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Citjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgorDAorICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KK2V4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKK290aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwordm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgorSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKK3RoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCitwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCisKKyAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90CitzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgorZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCitwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Cittb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCithbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCit0aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KKworICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQorb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwordGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKK3Jlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KK1lvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCit0aGlzIExpY2Vuc2UuCisKKyAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAoraW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKK2NvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKK290aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKK2V4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90CitkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCitMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91CittYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50CitsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5CithbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KK3RoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KK3JlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCisKK0lmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bworYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKK2NpcmN1bXN0YW5jZXMuCisKK0l0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKK3BhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55CitzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCitpbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKK2ltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQorZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAordGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKK3N5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKK3RvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAoraW1wb3NlIHRoYXQgY2hvaWNlLgorCitUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KK2JlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgorDAorICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgorY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCitvcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCittYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcKK3Rob3NlIGNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKK2NvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwordGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKK29mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAorYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCithZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQorc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKK2xhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKK2VpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCit0aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLgorCisgIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUKK3Byb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IKK3RvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzCittYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fscworb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZAorb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCisKKwkJCSAgICBOTyBXQVJSQU5UWQorCisgIDExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQorRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCitPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCitQUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRAorT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMKK1RPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUKK1BST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLAorUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORworV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgorUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKK0lOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORworT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRAorVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZCitZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgorUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCitQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisKKwkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwwKKwkgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCisKKyAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAorcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAorZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCisKKyAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKK3RvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKK2NvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Cit0aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+CisgICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisKK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgorCitJZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzCit3aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgorCisgICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSB5ZWFyICBuYW1lIG9mIGF1dGhvcgorICAgIEdub21vdmlzaW9uIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZSBgc2hvdyB3Jy4KKyAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0CisgICAgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxzLgorCitUaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUKK3BhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgT2YgY291cnNlLCB0aGUgY29tbWFuZHMgeW91IHVzZSBtYXkKK2JlIGNhbGxlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBgc2hvdyB3JyBhbmQgYHNob3cgYyc7IHRoZXkgY291bGQgZXZlbiBiZQorbW91c2UtY2xpY2tzIG9yIG1lbnUgaXRlbXMtLXdoYXRldmVyIHN1aXRzIHlvdXIgcHJvZ3JhbS4KKworWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKK3NjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmCituZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6CisKKyAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUgcHJvZ3JhbQorICBgR25vbW92aXNpb24nICh3aGljaCBtYWtlcyBwYXNzZXMgYXQgY29tcGlsZXJzKSB3cml0dGVuIGJ5IEphbWVzIEhhY2tlci4KKworICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5ODkKKyAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKKworVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGRvZXMgbm90IHBlcm1pdCBpbmNvcnBvcmF0aW5nIHlvdXIgcHJvZ3JhbSBpbnRvCitwcm9wcmlldGFyeSBwcm9ncmFtcy4gIElmIHlvdXIgcHJvZ3JhbSBpcyBhIHN1YnJvdXRpbmUgbGlicmFyeSwgeW91IG1heQorY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zIHdpdGggdGhlCitsaWJyYXJ5LiAgSWYgdGhpcyBpcyB3aGF0IHlvdSB3YW50IHRvIGRvLCB1c2UgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK05vdGljZXMgZm9yIGZpbGUocyk6CisvYmluL2FhcHQKKy9iaW4vYWlkbAorL2Jpbi9kZXhkdW1wCisvYmluL2R4CisvYmluL2phc21pbgorL2Jpbi9zcGxpdC1zZWxlY3QKKy9mcmFtZXdvcmsvYW5kcm9pZC1tb2NrLWdlbmVyYXRvcmxpYi5qYXIKKy9mcmFtZXdvcmsvamFzbWluLmphcgorL2xpYi9saWI2NGN1dGlscy5hCisvbGliL2xpYjY0bG9nLmEKKy9saWIvbGliNjR1dGlscy5hCisvbGliL2xpYmFuZHJvaWRmdy5hCisvbGliL2xpYmN1dGlscy5hCisvbGliL2xpYmxvZy5hCisvbGliL2xpYmxvZy5zbworL2xpYi9saWJuYXRpdmVoZWxwZXIuc28KKy9saWIvbGlic3FsaXRlM19hbmRyb2lkLmEKKy9saWIvbGlidXRpbHMuYQorL2xpYi9saWJ6aXBmaWxlLmEKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitOb3RpY2VzIGZvciBmaWxlKHMpOgorL2ZyYW1ld29yay9vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzXzMuNi4wLkkyMDEwMDUxMi0xNTAwLmphcgorL2ZyYW1ld29yay9vcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zXzMuNC4yMDAudjIwMTAwNTA1LmphcgorL2ZyYW1ld29yay9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWVfMy42LjAudjIwMTAwNTA1LmphcgorL2ZyYW1ld29yay9vcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbl8zLjYuMC52MjAxMDA1MDMuamFyCisvZnJhbWV3b3JrL29yZy5lY2xpcHNlLmpmYWNlXzMuNi4yLk0yMDExMDIxMC0xMjAwLmphcgorL2ZyYW1ld29yay9vcmcuZWNsaXBzZS5vc2dpXzMuNi4yLlIzNnhfdjIwMTEwMjEwLmphcgorL2ZyYW1ld29yay9vcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvcl8zLjYuMS5yMzYxX3YyMDEwMDcxNC0wODAwLmphcgorL2ZyYW1ld29yay9vcmcuZWNsaXBzZS51aS53b3JrYmVuY2hfMy42LjIuTTIwMTEwMjEwLTEyMDAuamFyCisvZnJhbWV3b3JrL29zZ2kuamFyCisvZnJhbWV3b3JrL3Byb3BlcnR5c2hlZXQuamFyCisvZnJhbWV3b3JrL3N3dC5qYXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wCisKK1RIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFCitQVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GCitUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMgQUdSRUVNRU5ULgorCisqMS4gREVGSU5JVElPTlMqCisKKyJDb250cmlidXRpb24iIG1lYW5zOgorCithKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQKK2RvY3VtZW50YXRpb24gZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZAorCitiKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6CisKK2kpIGNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZAorCitpaSkgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOworCit3aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQKK2FyZSBkaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uCisnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoCitDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbiBzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLgorQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gd2hpY2g6IChpKSBhcmUKK3NlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgUHJvZ3JhbQordW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUgd29ya3Mgb2YKK3RoZSBQcm9ncmFtLgorCisiQ29udHJpYnV0b3IiIG1lYW5zIGFueSBwZXJzb24gb3IgZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uCisKKyJMaWNlbnNlZCBQYXRlbnRzIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoCithcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2Ugb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lCitvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uCisKKyJQcm9ncmFtIiBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcworQWdyZWVtZW50LgorCisiUmVjaXBpZW50IiBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LAoraW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuCisKKyoyLiBHUkFOVCBPRiBSSUdIVFMqCisKK2EpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieQorZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodAorbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkgZGlzcGxheSwKK3B1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCitDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQKK29iamVjdCBjb2RlIGZvcm0uCisKK2IpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieQorZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIHBhdGVudCBsaWNlbnNlCit1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0IGFuZAorb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbgorc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlCitjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlCitDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZQorQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uIHRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkCitQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvIGFueSBvdGhlciBjb21iaW5hdGlvbnMKK3doaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzIGxpY2Vuc2VkIGhlcmV1bmRlci4KKworYykgUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlCitsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZQorcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlCitwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoCitDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcyBicm91Z2h0IGJ5Cithbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCitvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQgbGljZW5zZXMKK2dyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5IHRvCitzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvcgorZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQKK3RvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUKK3RoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLgorCitkKSBFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50Citjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodAorbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuCisKKyozLiBSRVFVSVJFTUVOVFMqCisKK0EgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0KK3VuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6CisKK2EpIGl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQKKworYikgaXRzIGxpY2Vuc2UgYWdyZWVtZW50OgorCitpKSBlZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMKK2FuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zCitvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mCittZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOworCitpaSkgZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IKK2RhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZAorY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czsKKworaWlpKSBzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUKK29mZmVyZWQgYnkgdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kCisKK2l2KSBzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaAorQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZQorbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuCisKK1doZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybToKKworYSkgaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kCisKK2IpIGEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLgorCitDb250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZAord2l0aGluIHRoZSBQcm9ncmFtLgorCitFYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cworQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3Mgc3Vic2VxdWVudAorUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLgorCisqNC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT04qCisKK0NvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzCit3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMKK2xpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YgdGhlIFByb2dyYW0sIHRoZQorQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nCitzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbCBsaWFiaWxpdHkgZm9yCitvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbgorYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCJDb21tZXJjaWFsCitDb250cmlidXRvciIpIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKK0NvbnRyaWJ1dG9yICgiSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IiKSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCitjb3N0cyAoY29sbGVjdGl2ZWx5ICJMb3NzZXMiKSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKK2xlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkCitDb250cmlidXRvciB0byB0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaAorQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUKK1Byb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzCitzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcyByZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yCithbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyIHRvIHF1YWxpZnksIGFuCitJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsCitDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKK2luLCB0aGUgZGVmZW5zZSBhbmQgYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZAorQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlIGluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS4KKworRm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKK3Byb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEgQ29tbWVyY2lhbAorQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCitjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZQorY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eQorYWxvbmUuIFVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0bworZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZQorcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIKK0NvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKK211c3QgcGF5IHRob3NlIGRhbWFnZXMuCisKKyo1LiBOTyBXQVJSQU5UWSoKKworRVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVECitPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwKK0VJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTCitPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IKK0EgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkgcmVzcG9uc2libGUgZm9yCitkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0KK2FuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCitBZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbQorZXJyb3JzLCBjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLAorcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuCisKKyo2LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWSoKKworRVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUgorQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORworV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUgorRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQKK0hFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisKKyo3LiBHRU5FUkFMKgorCitJZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IG9mCit0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlciBhY3Rpb24KK2J5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0KK2V4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuCisKK0lmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nCithIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0KK2l0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yCitoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2ggUmVjaXBpZW50J3MKK3JpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaAorbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworQWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMKK3RvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudAorYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZSBhZnRlcgorYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyCit0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZCBkaXN0cmlidXRpb24KK29mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwgUmVjaXBpZW50J3MKK29ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieSBSZWNpcGllbnQKK3JlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLgorCitFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsCitidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzIGNvcHlyaWdodGVkIGFuZCBtYXkKK29ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQgU3Rld2FyZCByZXNlcnZlcwordGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZiB0aGlzCitBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKK3RoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlCitpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlCityZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZQorZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nCit2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0gKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlCitkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzCityZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCBpcworcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAoaW5jbHVkaW5nCitpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbgorU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcwordG8gdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsCit3aGV0aGVyIGV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbgordGhlIFByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC4KKworVGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUKK2ludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EuIE5vIHBhcnR5IHRvCit0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUgdGhhbgorb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzIHJpZ2h0cwordG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi4KKworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK05vdGljZXMgZm9yIGZpbGUocyk6CisvZnJhbWV3b3JrL2JvdW5jeWNhc3RsZS1ob3N0LmphcgorL2ZyYW1ld29yay9ib3VuY3ljYXN0bGUtaG9zdGRleC5qYXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQ29weXJpZ2h0IChjKSAyMDAwLTIwMTMgVGhlIExlZ2lvbiBPZiBUaGUgQm91bmN5IENhc3RsZSAoaHR0cDovL3d3dy5ib3VuY3ljYXN0bGUub3JnKQorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kCithc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwKK2luY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCithbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKK3BvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QKK0xJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTgorTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCitTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitOb3RpY2VzIGZvciBmaWxlKHMpOgorL2ZyYW1ld29yay9jb21tb25zLWNvbXByZXNzLTEuMC5qYXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQXBhY2hlIENvbW1vbnMgQ29tcHJlc3MKK0NvcHlyaWdodCAyMDAyLTIwMDkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKK1RoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkKK1RoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCisKK09yaWdpbmFsIEJaaXAyIGNsYXNzZXMgY29udHJpYnV0ZWQgYnkgS2Vpcm9uIExpZGRsZQorPGtlaXJvbkBhZnRleHN3LmNvbT4sIEFmdGV4IFNvZnR3YXJlIHRvIHRoZSBBcGFjaGUgQW50IHByb2plY3QKKworT3JpZ2luYWwgVGFyIGNsYXNzZXMgZnJvbSBjb250cmlidXRvcnMgb2YgdGhlIEFwYWNoZSBBbnQgcHJvamVjdAorCitPcmlnaW5hbCBaaXAgY2xhc3NlcyBmcm9tIGNvbnRyaWJ1dG9ycyBvZiB0aGUgQXBhY2hlIEFudCBwcm9qZWN0CisKK09yaWdpbmFsIENQSU8gY2xhc3NlcyBjb250cmlidXRlZCBieSBNYXJrdXMgS3VzcyBhbmQgdGhlIGpSUE0gcHJvamVjdAorKGpycG0uc291cmNlZm9yZ2UubmV0KQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK05vdGljZXMgZm9yIGZpbGUocyk6CisvbGliL2xpYmJjYy5zbworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis9PT09PT09PT09PT09PT09PT09PT09PT09PQorTk9USUNFIGZpbGUgZm9yIGxpYmJjYy5naXQKKz09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyogTk9USUNFIGZvciBsaWIvRXhlY3V0aW9uRW5naW5lLywgbGliL1NjcmlwdENSVC8sIGluY2x1ZGUgYW5kIGhlbHBlci8uCisKKyAgIENvcHlyaWdodCAoYykgMjAwNS0yMDExLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKworCisKKyogTk9USUNFIGZvciBydW50aW1lLyBhbmQgbGliL0NvZGVHZW4vLgorICBOb3RlOiBUaGUgTk9USUNFIGlzIHRoZSBzYW1lIGZvciBhbm90aGVyIGdpdCBwcm9qZWN0LCBleHRlcm5hbC9sbHZtLmdpdC4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitMTFZNIFJlbGVhc2UgTGljZW5zZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitVbml2ZXJzaXR5IG9mIElsbGlub2lzL05DU0EKK09wZW4gU291cmNlIExpY2Vuc2UKKworQ29weXJpZ2h0IChjKSAyMDAzLTIwMTEgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBhdCBVcmJhbmEtQ2hhbXBhaWduLgorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworRGV2ZWxvcGVkIGJ5OgorCisgICAgTExWTSBUZWFtCisKKyAgICBVbml2ZXJzaXR5IG9mIElsbGlub2lzIGF0IFVyYmFuYS1DaGFtcGFpZ24KKworICAgIGh0dHA6Ly9sbHZtLm9yZworCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCit0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCB3aXRoCit0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCit1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvCitzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXJzLgorCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVycyBpbiB0aGUKKyAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAqIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBMTFZNIFRlYW0sIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgYXQKKyAgICAgIFVyYmFuYS1DaGFtcGFpZ24sIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0bworICAgICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMKKyAgICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCitGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorQ09OVFJJQlVUT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBXSVRIIFRIRQorU09GVFdBUkUuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQ29weXJpZ2h0cyBhbmQgTGljZW5zZXMgZm9yIFRoaXJkIFBhcnR5IFNvZnR3YXJlIERpc3RyaWJ1dGVkIHdpdGggTExWTToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorVGhlIExMVk0gc29mdHdhcmUgY29udGFpbnMgY29kZSB3cml0dGVuIGJ5IHRoaXJkIHBhcnRpZXMuICBTdWNoIHNvZnR3YXJlIHdpbGwKK2hhdmUgaXRzIG93biBpbmRpdmlkdWFsIExJQ0VOU0UuVFhUIGZpbGUgaW4gdGhlIGRpcmVjdG9yeSBpbiB3aGljaCBpdCBhcHBlYXJzLgorVGhpcyBmaWxlIHdpbGwgZGVzY3JpYmUgdGhlIGNvcHlyaWdodHMsIGxpY2Vuc2UsIGFuZCByZXN0cmljdGlvbnMgd2hpY2ggYXBwbHkKK3RvIHRoYXQgY29kZS4KKworVGhlIGRpc2NsYWltZXIgb2Ygd2FycmFudHkgaW4gdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgTGljZW5zZQorYXBwbGllcyB0byBhbGwgY29kZSBpbiB0aGUgTExWTSBEaXN0cmlidXRpb24sIGFuZCBub3RoaW5nIGluIGFueSBvZiB0aGUKK290aGVyIGxpY2Vuc2VzIGdpdmVzIHBlcm1pc3Npb24gdG8gdXNlIHRoZSBuYW1lcyBvZiB0aGUgTExWTSBUZWFtIG9yIHRoZQorVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKK1NvZnR3YXJlLgorCitUaGUgZm9sbG93aW5nIHBpZWNlcyBvZiBzb2Z0d2FyZSBoYXZlIGFkZGl0aW9uYWwgb3IgYWx0ZXJuYXRlIGNvcHlyaWdodHMsCitsaWNlbnNlcywgYW5kL29yIHJlc3RyaWN0aW9uczoKKworUHJvZ3JhbSAgICAgICAgICAgICBEaXJlY3RvcnkKKy0tLS0tLS0gICAgICAgICAgICAgLS0tLS0tLS0tCitBdXRvY29uZiAgICAgICAgICAgIGxsdm0vYXV0b2NvbmYKKyAgICAgICAgICAgICAgICAgICAgbGx2bS9wcm9qZWN0cy9Nb2R1bGVNYWtlci9hdXRvY29uZgorICAgICAgICAgICAgICAgICAgICBsbHZtL3Byb2plY3RzL3NhbXBsZS9hdXRvY29uZgorQ2VsbFNQVSBiYWNrZW5kICAgICBsbHZtL2xpYi9UYXJnZXQvQ2VsbFNQVS9SRUFETUUudHh0CitHb29nbGUgVGVzdCAgICAgICAgIGxsdm0vdXRpbHMvdW5pdHRlc3QvZ29vZ2xldGVzdAorT3BlbkJTRCByZWdleCAgICAgICBsbHZtL2xpYi9TdXBwb3J0L3tyZWcqLCBDT1BZUklHSFQucmVnZXh9CisKKworCisqIE5PVElDRSBmb3IgdGVzdHMvZGlzYXNzZW0uY3BwIGFuZCB0ZXN0cy9kaXNhc3NlbS5oLgorCisvKiAgICAgICROZXRCU0Q6IGRpc2Fzc2VtLmMsdiAxLjE0IDIwMDMvMDMvMjcgMTY6NTg6MzYgbXljcm9mdCBFeHAgJCAgICAqLworCisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5NiBNYXJrIEJyaW5pY29tYmUuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYgQnJpbmkuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IEJyaW5pLgorICogNC4gVGhlIG5hbWUgb2YgdGhlIGNvbXBhbnkgbm9yIHRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljCisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBCUklOSSBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgQlJJTkkgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyAqIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBSaXNjQlNEIGtlcm5lbCBwcm9qZWN0CisgKgorICogZGJfZGlzYXNtLmMKKyAqCisgKiBLZXJuZWwgZGlzYXNzZW1ibGVyCisgKgorICogQ3JlYXRlZCAgICAgIDogMTAvMDIvOTYKKyAqCisgKiBTdHJ1Y3R1cmVkIGFmdGVyIHRoZSBzcGFyYy9zcGFyYy9kYl9kaXNhc20uYyBieSBEYXZpZCBTLiBNaWxsZXIgJgorICogUGF1bCBLcmFuZW5idXJnCisgKgorICogVGhpcyBjb2RlIGlzIG5vdCBjb21wbGV0ZS4gTm90IGFsbCBpbnN0cnVjdGlvbnMgYXJlIGRpc2Fzc2VtYmxlZC4KKyAqLworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK05vdGljZXMgZm9yIGZpbGUocyk6CisvbGliL2xpYmZkbGlibS5hCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0NvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKK0RldmVsb3BlZCBhdCBTdW5Tb2Z0LCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCitzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQoraXMgcHJlc2VydmVkLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK05vdGljZXMgZm9yIGZpbGUocyk6CisvYmluL2VtdWxhdG9yLWFybQorL2Jpbi9lbXVsYXRvci1taXBzCisvYmluL2VtdWxhdG9yLXg4NgorL2Jpbi9lbXVsYXRvcgorL2Jpbi9lbXVsYXRvcjY0LWFybQorL2Jpbi9lbXVsYXRvcjY0LW1pcHMKKy9iaW4vZW11bGF0b3I2NC14ODYKKy9saWIvZW11bGF0b3ItY29tbW9uLmEKKy9saWIvZW11bGF0b3ItbGliZWxmZi5hCisvbGliL2VtdWxhdG9yLWxpYmpwZWcuYQorL2xpYi9lbXVsYXRvci1saWJxZW11LmEKKy9saWIvZW11bGF0b3ItbGlidWkuYQorL2xpYi9lbXVsYXRvci10YXJnZXQtYXJtLmEKKy9saWIvZW11bGF0b3ItdGFyZ2V0LWkzODYuYQorL2xpYi9lbXVsYXRvci10YXJnZXQtbWlwcy5hCisvbGliL2VtdWxhdG9yNjQtY29tbW9uLmEKKy9saWIvZW11bGF0b3I2NC1saWJlbGZmLmEKKy9saWIvZW11bGF0b3I2NC1saWJqcGVnLmEKKy9saWIvZW11bGF0b3I2NC1saWJxZW11LmEKKy9saWIvZW11bGF0b3I2NC1saWJ1aS5hCisvbGliL2VtdWxhdG9yNjQtdGFyZ2V0LWFybS5hCisvbGliL2VtdWxhdG9yNjQtdGFyZ2V0LWkzODYuYQorL2xpYi9lbXVsYXRvcjY0LXRhcmdldC1taXBzLmEKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKwkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCisKKyBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICAgICAgICAgICAgICAgICAgICAgICAgIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBCisgRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCisgb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCisKKwkJCSAgICBQcmVhbWJsZQorCisgIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKK2ZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGlzIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVlCitzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLiAgVGhpcworR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIG1vc3Qgb2YgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24ncyBzb2Z0d2FyZSBhbmQgdG8gYW55IG90aGVyIHByb2dyYW0gd2hvc2UgYXV0aG9ycyBjb21taXQgdG8KK3VzaW5nIGl0LiAgKFNvbWUgb3RoZXIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlIGlzIGNvdmVyZWQgYnkKK3RoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSAgWW91IGNhbiBhcHBseSBpdCB0bworeW91ciBwcm9ncmFtcywgdG9vLgorCisgIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKK3ByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKK2hhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKK3RoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAoraWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQKK2luIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KKworICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCithbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuCitUaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmIHlvdQorZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0LgorCisgIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIKK2dyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdAoreW91IGhhdmUuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUKK3NvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIKK3JpZ2h0cy4KKworICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kCisoMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LAorZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4KKworICBBbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFuZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbgordGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKK3NvZnR3YXJlLiAgSWYgdGhlIHNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQord2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28KK3RoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsCithdXRob3JzJyByZXB1dGF0aW9ucy4KKworICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZQorcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZQorcHJvZ3JhbSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCBpbiBlZmZlY3QgbWFraW5nIHRoZQorcHJvZ3JhbSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55CitwYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgorCisgIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCittb2RpZmljYXRpb24gZm9sbG93LgorDAorCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgorCisgIDAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMKK2Egbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkCit1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhlICJQcm9ncmFtIiwgYmVsb3csCityZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSIKK21lYW5zIGVpdGhlciB0aGUgUHJvZ3JhbSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6Cit0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LAorZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIKK2xhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4KK3RoZSB0ZXJtICJtb2RpZmljYXRpb24iLikgIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgorCitBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAorY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgorcnVubmluZyB0aGUgUHJvZ3JhbSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbQoraXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0gKGluZGVwZW5kZW50IG9mIGhhdmluZyBiZWVuIG1hZGUgYnkgcnVubmluZyB0aGUgUHJvZ3JhbSkuCitXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4KKworICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3MKK3NvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdQorY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZQorY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZQorbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OworYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KKworWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kCit5b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgorCisgIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24KK29mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQKK2Rpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQorYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKKworICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCisKKyAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4KKyAgICB3aG9sZSBvciBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnkKKyAgICBwYXJ0IHRoZXJlb2YsIHRvIGJlIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZAorICAgIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKworICAgIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkKKyAgICB3aGVuIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoCisgICAgaW50ZXJhY3RpdmUgdXNlIGluIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbgorICAgIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYQorICAgIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZQorICAgIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heSByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXIKKyAgICB0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcworICAgIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0CisgICAgZG9lcyBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yayBiYXNlZCBvbgorICAgIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQorDAorVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgoraWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSwKK2FuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgordGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQorc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91CitkaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKK29uIHRoZSBQcm9ncmFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgordGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKK2VudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZSBpdC4KKworVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Cit5b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KK2V4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgorY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgUHJvZ3JhbS4KKworSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbQord2l0aCB0aGUgUHJvZ3JhbSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pIG9uIGEgdm9sdW1lIG9mCithIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgordGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KKworICAzLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGEgd29yayBiYXNlZCBvbiBpdCwKK3VuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZgorU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCisgICAgYSkgQWNjb21wYW55IGl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZQorICAgIHNvdXJjZSBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucworICAgIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYikgQWNjb21wYW55IGl0IHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUKKyAgICB5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHksIGZvciBhIGNoYXJnZSBubyBtb3JlIHRoYW4geW91cgorICAgIGNvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHNvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGUKKyAgICBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUsIHRvIGJlCisgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0KKyAgICBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBjKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHRoZSBvZmZlcgorICAgIHRvIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gIChUaGlzIGFsdGVybmF0aXZlIGlzCisgICAgYWxsb3dlZCBvbmx5IGZvciBub25jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbiBhbmQgb25seSBpZiB5b3UKKyAgICByZWNlaXZlZCB0aGUgcHJvZ3JhbSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gd2l0aCBzdWNoCisgICAgYW4gb2ZmZXIsIGluIGFjY29yZCB3aXRoIFN1YnNlY3Rpb24gYiBhYm92ZS4pCisKK1RoZSBzb3VyY2UgY29kZSBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKK21ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlCitjb2RlIG1lYW5zIGFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueQorYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvCitjb250cm9sIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBIb3dldmVyLCBhcyBhCitzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUKK2FueXRoaW5nIHRoYXQgaXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5Citmb3JtKSB3aXRoIHRoZSBtYWpvciBjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZQorb3BlcmF0aW5nIHN5c3RlbSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQKK2l0c2VsZiBhY2NvbXBhbmllcyB0aGUgZXhlY3V0YWJsZS4KKworSWYgZGlzdHJpYnV0aW9uIG9mIGV4ZWN1dGFibGUgb3Igb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZworYWNjZXNzIHRvIGNvcHkgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudAorYWNjZXNzIHRvIGNvcHkgdGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzCitkaXN0cmlidXRpb24gb2YgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKK2NvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCisMCisgIDQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQorZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdAorb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGlzCit2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuCitIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlcgordGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2gKK3BhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KKworICA1LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKK3NpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCitkaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKK3Byb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKK21vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKK2FsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKK3RoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgorCisgIDYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCitvcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvCit0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgorcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgorWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KK3RoaXMgTGljZW5zZS4KKworICA3LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50CitpbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAorY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgorb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAorZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKK2Rpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKK0xpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKK21heSBub3QgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKK2xpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkKK2FsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgordGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bworcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbS4KKworSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCithbnkgcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvCithcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgorY2lyY3Vtc3RhbmNlcy4KKworSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQorcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKK3N1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKK2ludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcworaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCitnZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCit0aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAorc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwordG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90CitpbXBvc2UgdGhhdCBjaG9pY2UuCisKK1RoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bworYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCisMCisgIDguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluCitjZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKK29yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UKK21heSBhZGQgYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZwordGhvc2UgY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZworY291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzCit0aGUgbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KKworICA5LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucworb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCitiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8KK2FkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgorCitFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBQcm9ncmFtCitzcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueQorbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YKK3RoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24uCisKKyAgMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZQorcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvcgordG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMKK21ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91ciBkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzCitvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kCitvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KKworCQkJICAgIE5PIFdBUlJBTlRZCisKKyAgMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZCitGT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4KK09USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMKK1BST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VECitPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUworVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRQorUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsCitSRVBBSVIgT1IgQ09SUkVDVElPTi4KKworICAxMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCitXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SCitSRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLAorSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HCitPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVECitUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkKK1lPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSCitQUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUKK1BPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKworCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworDAorCSAgICBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKKworICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Citwb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0CitmcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4KKworICBUbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gIEl0IGlzIHNhZmVzdAordG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQorY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QKK3RoZSAiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgorCisgICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KKyAgICBDb3B5cmlnaHQgKEMpIDE5eXkgIDxuYW1lIG9mIGF1dGhvcj4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCitBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KKworSWYgdGhlIHByb2dyYW0gaXMgaW50ZXJhY3RpdmUsIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQgbm90aWNlIGxpa2UgdGhpcword2hlbiBpdCBzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZToKKworICAgIEdub21vdmlzaW9uIHZlcnNpb24gNjksIENvcHlyaWdodCAoQykgMTl5eSBuYW1lIG9mIGF1dGhvcgorICAgIEdub21vdmlzaW9uIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZSBgc2hvdyB3Jy4KKyAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0CisgICAgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxzLgorCitUaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUKK3BhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgT2YgY291cnNlLCB0aGUgY29tbWFuZHMgeW91IHVzZSBtYXkKK2JlIGNhbGxlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBgc2hvdyB3JyBhbmQgYHNob3cgYyc7IHRoZXkgY291bGQgZXZlbiBiZQorbW91c2UtY2xpY2tzIG9yIG1lbnUgaXRlbXMtLXdoYXRldmVyIHN1aXRzIHlvdXIgcHJvZ3JhbS4KKworWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKK3NjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmCituZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6CisKKyAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUgcHJvZ3JhbQorICBgR25vbW92aXNpb24nICh3aGljaCBtYWtlcyBwYXNzZXMgYXQgY29tcGlsZXJzKSB3cml0dGVuIGJ5IEphbWVzIEhhY2tlci4KKworICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5ODkKKyAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKKworVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGRvZXMgbm90IHBlcm1pdCBpbmNvcnBvcmF0aW5nIHlvdXIgcHJvZ3JhbSBpbnRvCitwcm9wcmlldGFyeSBwcm9ncmFtcy4gIElmIHlvdXIgcHJvZ3JhbSBpcyBhIHN1YnJvdXRpbmUgbGlicmFyeSwgeW91IG1heQorY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zIHdpdGggdGhlCitsaWJyYXJ5LiAgSWYgdGhpcyBpcyB3aGF0IHlvdSB3YW50IHRvIGRvLCB1c2UgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK05vdGljZXMgZm9yIGZpbGUocyk6CisvZnJhbWV3b3JrL2dyb292eS1hbGwtMS43LjAuamFyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisgICAxLiBEZWZpbml0aW9ucy4KKworICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKyAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCisgICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCisgICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCisKKyAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCisgICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCisgICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQorICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKKyAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQorICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQorICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCisgICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCisKKyAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK05vdGljZXMgZm9yIGZpbGUocyk6CisvbGliL2xpYmNvcmtzY3Jldy5zbworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIENvcHlyaWdodCAoYykgMjAxMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitOb3RpY2VzIGZvciBmaWxlKHMpOgorL2ZyYW1ld29yay9saWJsemYuamFyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0NvcHlyaWdodCAoYykgMjAwMC0yMDA5IE1hcmMgQWxleGFuZGVyIExlaG1hbm4gPHNjaG1vcnBAc2NobW9ycC5kZT4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhLQordGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSLQorQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PCitFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRS0KK0NJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKK1BST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOworT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCitXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEgtCitFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKK09GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworQWx0ZXJuYXRpdmVseSwgdGhlIGZvbGxvd2luZyBmaWxlcyBjYXJyeSBhbiBhZGRpdGlvbmFsIG5vdGljZSB0aGF0CitleHBsaWNpdGx5IGFsbG93cyByZWxpY2Vuc2luZyB1bmRlciB0aGUgR1BMdjI6IGx6Zi5jIGx6Zi5oIGx6ZlAuaCBsemZfYy5jCitsemZfZC5jCisKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitOb3RpY2VzIGZvciBmaWxlKHMpOgorL2xpYi9saWJMTFZNLnNvCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTExWTSBSZWxlYXNlIExpY2Vuc2UKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorVW5pdmVyc2l0eSBvZiBJbGxpbm9pcy9OQ1NBCitPcGVuIFNvdXJjZSBMaWNlbnNlCisKK0NvcHlyaWdodCAoYykgMjAwMy0yMDExIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgYXQgVXJiYW5hLUNoYW1wYWlnbi4KK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK0RldmVsb3BlZCBieToKKworICAgIExMVk0gVGVhbQorCisgICAgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBhdCBVcmJhbmEtQ2hhbXBhaWduCisKKyAgICBodHRwOi8vbGx2bS5vcmcKKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgordGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgd2l0aAordGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bwordXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKK29mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbworc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVycy4KKworICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcnMgaW4gdGhlCisgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgKiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgTExWTSBUZWFtLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzIGF0CisgICAgICBVcmJhbmEtQ2hhbXBhaWduLCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8KKyAgICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljCisgICAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK0NPTlRSSUJVVE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKK09VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgV0lUSCBUSEUKK1NPRlRXQVJFLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0NvcHlyaWdodHMgYW5kIExpY2Vuc2VzIGZvciBUaGlyZCBQYXJ0eSBTb2Z0d2FyZSBEaXN0cmlidXRlZCB3aXRoIExMVk06Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1RoZSBMTFZNIHNvZnR3YXJlIGNvbnRhaW5zIGNvZGUgd3JpdHRlbiBieSB0aGlyZCBwYXJ0aWVzLiAgU3VjaCBzb2Z0d2FyZSB3aWxsCitoYXZlIGl0cyBvd24gaW5kaXZpZHVhbCBMSUNFTlNFLlRYVCBmaWxlIGluIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggaXQgYXBwZWFycy4KK1RoaXMgZmlsZSB3aWxsIGRlc2NyaWJlIHRoZSBjb3B5cmlnaHRzLCBsaWNlbnNlLCBhbmQgcmVzdHJpY3Rpb25zIHdoaWNoIGFwcGx5Cit0byB0aGF0IGNvZGUuCisKK1RoZSBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5IGluIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlIExpY2Vuc2UKK2FwcGxpZXMgdG8gYWxsIGNvZGUgaW4gdGhlIExMVk0gRGlzdHJpYnV0aW9uLCBhbmQgbm90aGluZyBpbiBhbnkgb2YgdGhlCitvdGhlciBsaWNlbnNlcyBnaXZlcyBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgbmFtZXMgb2YgdGhlIExMVk0gVGVhbSBvciB0aGUKK1VuaXZlcnNpdHkgb2YgSWxsaW5vaXMgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCitTb2Z0d2FyZS4KKworVGhlIGZvbGxvd2luZyBwaWVjZXMgb2Ygc29mdHdhcmUgaGF2ZSBhZGRpdGlvbmFsIG9yIGFsdGVybmF0ZSBjb3B5cmlnaHRzLAorbGljZW5zZXMsIGFuZC9vciByZXN0cmljdGlvbnM6CisKK1Byb2dyYW0gICAgICAgICAgICAgRGlyZWN0b3J5CistLS0tLS0tICAgICAgICAgICAgIC0tLS0tLS0tLQorQXV0b2NvbmYgICAgICAgICAgICBsbHZtL2F1dG9jb25mCisgICAgICAgICAgICAgICAgICAgIGxsdm0vcHJvamVjdHMvTW9kdWxlTWFrZXIvYXV0b2NvbmYKKyAgICAgICAgICAgICAgICAgICAgbGx2bS9wcm9qZWN0cy9zYW1wbGUvYXV0b2NvbmYKK0NlbGxTUFUgYmFja2VuZCAgICAgbGx2bS9saWIvVGFyZ2V0L0NlbGxTUFUvUkVBRE1FLnR4dAorR29vZ2xlIFRlc3QgICAgICAgICBsbHZtL3V0aWxzL3VuaXR0ZXN0L2dvb2dsZXRlc3QKK09wZW5CU0QgcmVnZXggICAgICAgbGx2bS9saWIvU3VwcG9ydC97cmVnKiwgQ09QWVJJR0hULnJlZ2V4fQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis9PSBMSUNFTlNFLlRYVCBmb3IgLi9hdXRvY29uZi9MSUNFTlNFLlRYVAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0F1dG9jb25mIEZpbGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FsbCBhdXRvY29uZiBmaWxlcyBhcmUgbGljZW5zZWQgdW5kZXIgdGhlIExMVk0gbGljZW5zZSB3aXRoIHRoZSBmb2xsb3dpbmcKK2FkZGl0aW9uczoKKworbGx2bS9hdXRvY29uZi9pbnN0YWxsLXNoOgorCVRoaXMgc2NyaXB0IGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBMTFZNIGxpY2Vuc2UsIHdpdGggdGhlIGZvbGxvd2luZworCWFkZGl0aW9uYWwgY29weXJpZ2h0cyBhbmQgcmVzdHJpY3Rpb25zOgorCisJQ29weXJpZ2h0IDE5OTEgYnkgdGhlIE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kKKworCVBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworCWRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CisJdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0CisJY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyAKKwlkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBNLkkuVC4gbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IKKwlwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsCisJd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgTS5JLlQuIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUKKwlzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIKKwl3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKworUGxlYXNlIHNlZSB0aGUgc291cmNlIGZpbGVzIGZvciBhZGRpdGlvbmFsIGNvcHlyaWdodHMuCisKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorPT0gTElDRU5TRS5UWFQgZm9yIC4vcHJvamVjdHMvc2FtcGxlL2F1dG9jb25mL0xJQ0VOU0UuVFhUCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQXV0b2NvbmYgRmlsZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQWxsIGF1dG9jb25mIGZpbGVzIGFyZSBsaWNlbnNlZCB1bmRlciB0aGUgTExWTSBsaWNlbnNlIHdpdGggdGhlIGZvbGxvd2luZworYWRkaXRpb25zOgorCitsbHZtL2F1dG9jb25mL2luc3RhbGwtc2g6CisJVGhpcyBzY3JpcHQgaXMgbGljZW5zZWQgdW5kZXIgdGhlIExMVk0gbGljZW5zZSwgd2l0aCB0aGUgZm9sbG93aW5nCisJYWRkaXRpb25hbCBjb3B5cmlnaHRzIGFuZCByZXN0cmljdGlvbnM6CisKKwlDb3B5cmlnaHQgMTk5MSBieSB0aGUgTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neQorCisJUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisJZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKKwl0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKKwljb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIAorCWRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIE0uSS5ULiBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvcgorCXB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywKKwl3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBNLkkuVC4gbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZQorCXN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIgorCXdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorCitQbGVhc2Ugc2VlIHRoZSBzb3VyY2UgZmlsZXMgZm9yIGFkZGl0aW9uYWwgY29weXJpZ2h0cy4KKworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis9PSBMSUNFTlNFLlRYVCBmb3IgLi91dGlscy91bml0dGVzdC9nb29nbGV0ZXN0L0xJQ0VOU0UuVFhUCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0NvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCittZXQ6CisKKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Citub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCitjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCitpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCitkaXN0cmlidXRpb24uCisgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCitjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQordGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKK0xJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKK09XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCitEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKK1RIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorPT0gTElDRU5TRS5UWFQgZm9yIC4vaW5jbHVkZS9sbHZtL1N1cHBvcnQvTElDRU5TRS5UWFQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworTExWTSBTeXN0ZW0gSW50ZXJmYWNlIExpYnJhcnkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoZSBMTFZNIFN5c3RlbSBJbnRlcmZhY2UgTGlicmFyeSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgSWxsaW5vaXMgT3BlbiBTb3VyY2UKK0xpY2Vuc2UgYW5kIGhhcyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgY29weXJpZ2h0OgorCitDb3B5cmlnaHQgKEMpIDIwMDQgZVh0ZW5zaWJsZSBTeXN0ZW1zLCBJbmMuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTm90aWNlcyBmb3IgZmlsZShzKToKKy9mcmFtZXdvcmsvZG9jbGF2YS5qYXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIAorIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLgorIAorIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAKKyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitqUXVlcnkgMS4yLjYgLSBOZXcgV2F2ZSBKYXZhc2NyaXB0CisKK0NvcHlyaWdodCAoYykgMjAwOCBKb2huIFJlc2lnIChqcXVlcnkuY29tKQorRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIChNSVQtTElDRU5TRS50eHQpCithbmQgR1BMIChHUEwtTElDRU5TRS50eHQpIGxpY2Vuc2VzLgorCitDb3B5cmlnaHQgKGMpIDIwMDkgSm9obiBSZXNpZywgaHR0cDovL2pxdWVyeS5jb20vCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCit3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCitkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KK3Blcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwordGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQoraW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQorTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCitXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK05vdGljZXMgZm9yIGZpbGUocyk6CisvYmluL3NxbGl0ZTMKKy9saWIvbGlic3FsaXRlLnNvCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzIwMDEgU2VwdGVtYmVyIDE1CisKK1RoZSBhdXRob3IgZGlzY2xhaW1zIGNvcHlyaWdodCB0byB0aGlzIHNvdXJjZSBjb2RlLiAgSW4gcGxhY2Ugb2YKK2EgbGVnYWwgbm90aWNlLCBoZXJlIGlzIGEgYmxlc3Npbmc6CisKKyAgIE1heSB5b3UgZG8gZ29vZCBhbmQgbm90IGV2aWwuCisgICBNYXkgeW91IGZpbmQgZm9yZ2l2ZW5lc3MgZm9yIHlvdXJzZWxmIGFuZCBmb3JnaXZlIG90aGVycy4KKyAgIE1heSB5b3Ugc2hhcmUgZnJlZWx5LCBuZXZlciB0YWtpbmcgbW9yZSB0aGFuIHlvdSBnaXZlLgorCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTm90aWNlcyBmb3IgZmlsZShzKToKKy9saWIvbGliY3J5cHRvLWhvc3Quc28KKy9saWIvbGliY3J5cHRvX3N0YXRpYy5hCisvbGliL2xpYnNzbC1ob3N0LnNvCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBMSUNFTlNFIElTU1VFUworICA9PT09PT09PT09PT09PQorCisgIFRoZSBPcGVuU1NMIHRvb2xraXQgc3RheXMgdW5kZXIgYSBkdWFsIGxpY2Vuc2UsIGkuZS4gYm90aCB0aGUgY29uZGl0aW9ucyBvZgorICB0aGUgT3BlblNTTCBMaWNlbnNlIGFuZCB0aGUgb3JpZ2luYWwgU1NMZWF5IGxpY2Vuc2UgYXBwbHkgdG8gdGhlIHRvb2xraXQuCisgIFNlZSBiZWxvdyBmb3IgdGhlIGFjdHVhbCBsaWNlbnNlIHRleHRzLiBBY3R1YWxseSBib3RoIGxpY2Vuc2VzIGFyZSBCU0Qtc3R5bGUKKyAgT3BlbiBTb3VyY2UgbGljZW5zZXMuIEluIGNhc2Ugb2YgYW55IGxpY2Vuc2UgaXNzdWVzIHJlbGF0ZWQgdG8gT3BlblNTTAorICBwbGVhc2UgY29udGFjdCBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisKKyAgT3BlblNTTCBMaWNlbnNlCisgIC0tLS0tLS0tLS0tLS0tLQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMTEgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworIE9yaWdpbmFsIFNTTGVheSBMaWNlbnNlCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTm90aWNlcyBmb3IgZmlsZShzKToKKy9saWIvbGliZXhwYXQtaG9zdC5zbworL2xpYi9saWJleHBhdC5hCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0NvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAwMCBUaGFpIE9wZW4gU291cmNlIFNvZnR3YXJlIENlbnRlciBMdGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgQ2xhcmsgQ29vcGVyCitDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgRXhwYXQgbWFpbnRhaW5lcnMuCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCit3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCitkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KK3Blcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwordGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAoraW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCitJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKK1RPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCitTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitOb3RpY2VzIGZvciBmaWxlKHMpOgorL2xpYi9saWJMTFZNQW5hbHlzaXMuYQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0xMVk0gUmVsZWFzZSBMaWNlbnNlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1VuaXZlcnNpdHkgb2YgSWxsaW5vaXMvTkNTQQorT3BlbiBTb3VyY2UgTGljZW5zZQorCitDb3B5cmlnaHQgKGMpIDIwMDMtMjAxMSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIGF0IFVyYmFuYS1DaGFtcGFpZ24uCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitEZXZlbG9wZWQgYnk6CisKKyAgICBMTFZNIFRlYW0KKworICAgIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgYXQgVXJiYW5hLUNoYW1wYWlnbgorCisgICAgaHR0cDovL2xsdm0ub3JnCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKK3RoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIHdpdGgKK3RoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KK3VzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCitvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KK3NvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcnMuCisKKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXJzIGluIHRoZQorICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgICogTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIExMVk0gVGVhbSwgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBhdAorICAgICAgVXJiYW5hLUNoYW1wYWlnbiwgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvCisgICAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYworICAgICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKK0ZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitDT05UUklCVVRPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKK0xJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCitPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIFdJVEggVEhFCitTT0ZUV0FSRS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitDb3B5cmlnaHRzIGFuZCBMaWNlbnNlcyBmb3IgVGhpcmQgUGFydHkgU29mdHdhcmUgRGlzdHJpYnV0ZWQgd2l0aCBMTFZNOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitUaGUgTExWTSBzb2Z0d2FyZSBjb250YWlucyBjb2RlIHdyaXR0ZW4gYnkgdGhpcmQgcGFydGllcy4gIFN1Y2ggc29mdHdhcmUgd2lsbAoraGF2ZSBpdHMgb3duIGluZGl2aWR1YWwgTElDRU5TRS5UWFQgZmlsZSBpbiB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIGl0IGFwcGVhcnMuCitUaGlzIGZpbGUgd2lsbCBkZXNjcmliZSB0aGUgY29weXJpZ2h0cywgbGljZW5zZSwgYW5kIHJlc3RyaWN0aW9ucyB3aGljaCBhcHBseQordG8gdGhhdCBjb2RlLgorCitUaGUgZGlzY2xhaW1lciBvZiB3YXJyYW50eSBpbiB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSBMaWNlbnNlCithcHBsaWVzIHRvIGFsbCBjb2RlIGluIHRoZSBMTFZNIERpc3RyaWJ1dGlvbiwgYW5kIG5vdGhpbmcgaW4gYW55IG9mIHRoZQorb3RoZXIgbGljZW5zZXMgZ2l2ZXMgcGVybWlzc2lvbiB0byB1c2UgdGhlIG5hbWVzIG9mIHRoZSBMTFZNIFRlYW0gb3IgdGhlCitVbml2ZXJzaXR5IG9mIElsbGlub2lzIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcworU29mdHdhcmUuCisKK1RoZSBmb2xsb3dpbmcgcGllY2VzIG9mIHNvZnR3YXJlIGhhdmUgYWRkaXRpb25hbCBvciBhbHRlcm5hdGUgY29weXJpZ2h0cywKK2xpY2Vuc2VzLCBhbmQvb3IgcmVzdHJpY3Rpb25zOgorCitQcm9ncmFtICAgICAgICAgICAgIERpcmVjdG9yeQorLS0tLS0tLSAgICAgICAgICAgICAtLS0tLS0tLS0KK0F1dG9jb25mICAgICAgICAgICAgbGx2bS9hdXRvY29uZgorICAgICAgICAgICAgICAgICAgICBsbHZtL3Byb2plY3RzL01vZHVsZU1ha2VyL2F1dG9jb25mCisgICAgICAgICAgICAgICAgICAgIGxsdm0vcHJvamVjdHMvc2FtcGxlL2F1dG9jb25mCitDZWxsU1BVIGJhY2tlbmQgICAgIGxsdm0vbGliL1RhcmdldC9DZWxsU1BVL1JFQURNRS50eHQKK0dvb2dsZSBUZXN0ICAgICAgICAgbGx2bS91dGlscy91bml0dGVzdC9nb29nbGV0ZXN0CitPcGVuQlNEIHJlZ2V4ICAgICAgIGxsdm0vbGliL1N1cHBvcnQve3JlZyosIENPUFlSSUdIVC5yZWdleH0KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitOb3RpY2VzIGZvciBmaWxlKHMpOgorL2ZyYW1ld29yay9lbW1hbGliLmphcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitDb21tb24gUHVibGljIExpY2Vuc2UgLSB2IDEuMAorCitUSEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgQ09NTU9OIFBVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuIEFOWSBVU0UsIFJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MKK0FDQ0VQVEFOQ0UgT0YgVEhJUyBBR1JFRU1FTlQuCisKKzEuIERFRklOSVRJT05TCisKKyJDb250cmlidXRpb24iIG1lYW5zOgorCisgICAgICBhKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kCisgICAgICBiKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6CisKKyAgICAgIGkpIGNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZAorCisgICAgICBpaSkgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOworCisgICAgICB3aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMKK2FkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcworb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgUHJvZ3JhbS4KKworIkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLgorCisiTGljZW5zZWQgUGF0ZW50cyAiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uCisKKyJQcm9ncmFtIiBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuCisKKyJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLgorCisyLiBHUkFOVCBPRiBSSUdIVFMKKworICAgICAgYSkgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZQord29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLgorCisgICAgICBiKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIHBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwKK3VzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0IGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZQorY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZAorYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8gYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcyBsaWNlbnNlZCBoZXJldW5kZXIuCisKKyAgICAgIGMpIFJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IgdGhhdCB0aGUKK1Byb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIKK2VudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQgbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUKK3Jlc3BvbnNpYmlsaXR5IHRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsIGlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUgdGhlCitQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLgorCisgICAgICBkKSBFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodCByaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluIHRoaXMKK0FncmVlbWVudC4KKworMy4gUkVRVUlSRU1FTlRTCisKK0EgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDoKKworICAgICAgYSkgaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZAorCisgICAgICBiKSBpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6CisKKyAgICAgIGkpIGVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwKK2FuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOworCisgICAgICBpaSkgZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0Citwcm9maXRzOworCisgICAgICBpaWkpIHN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZAorCisgICAgICBpdikgc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bQorY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuCisKK1doZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybToKKworICAgICAgYSkgaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kCisKKyAgICAgIGIpIGEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLgorCitDb250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uCisKK0VhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzIHN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUKK0NvbnRyaWJ1dGlvbi4KKworNC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT04KKworQ29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUKK2NvbW1lcmNpYWwgdXNlIG9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsIGxpYWJpbGl0eSBmb3Igb3RoZXIKK0NvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgiQ29tbWVyY2lhbCBDb250cmlidXRvciIpIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkKK2V2ZXJ5IG90aGVyIENvbnRyaWJ1dG9yICgiSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IiKSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzIChjb2xsZWN0aXZlbHkgIkxvc3NlcyIpIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYQordGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhCitjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzIHJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlciB0bworcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUKK3dpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuCisKK0ZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEgQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCit0aGVuIG1ha2VzIHBlcmZvcm1hbmNlIGNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKK3NlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlcgorQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLgorCis1LiBOTyBXQVJSQU5UWQorCitFWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAorV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseSByZXNwb25zaWJsZSBmb3IKK2RldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KK3RoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLgorCis2LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWQorCitFWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCitORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICitEQU1BR0VTLgorCis3LiBHRU5FUkFMCisKK0lmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzCitBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS4KKworSWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhIENvbnRyaWJ1dG9yIHdpdGggcmVzcGVjdCB0byBhIHBhdGVudCBhcHBsaWNhYmxlIHRvIHNvZnR3YXJlIChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSwgdGhlbiBhbnkKK3BhdGVudCBsaWNlbnNlcyBncmFudGVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgdG8gc3VjaCBSZWNpcGllbnQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gSW4gYWRkaXRpb24sIGlmIFJlY2lwaWVudCBpbnN0aXR1dGVzCitwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIKK3NvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaCBSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworQWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhCityZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlCitQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwgUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5IFJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQKK3N1cnZpdmUuCisKK0V2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcyBjb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZworbWFubmVyLiBUaGUgQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUKK3JpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gSUJNIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiBJQk0gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldwordmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0gKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB1bmRlcgord2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldwordmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0byB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwKK3doZXRoZXIgZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuCisKK1RoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbAorYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcyBpdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTm90aWNlcyBmb3IgZmlsZShzKToKKy9saWIvbGlic2VsaW51eC5hCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoaXMgbGlicmFyeSAobGlic2VsaW51eCkgaXMgcHVibGljIGRvbWFpbiBzb2Z0d2FyZSwgaS5lLiBub3QgY29weXJpZ2h0ZWQuCisKK1dhcnJhbnR5IEV4Y2x1c2lvbgorLS0tLS0tLS0tLS0tLS0tLS0tCitZb3UgYWdyZWUgdGhhdCB0aGlzIHNvZnR3YXJlIGlzIGEKK25vbi1jb21tZXJjaWFsbHkgZGV2ZWxvcGVkIHByb2dyYW0gdGhhdCBtYXkgY29udGFpbiAiYnVncyIgKGFzIHRoYXQKK3Rlcm0gaXMgdXNlZCBpbiB0aGUgaW5kdXN0cnkpIGFuZCB0aGF0IGl0IG1heSBub3QgZnVuY3Rpb24gYXMgaW50ZW5kZWQuCitUaGUgc29mdHdhcmUgaXMgbGljZW5zZWQgImFzIGlzIi4gTlNBIG1ha2VzIG5vLCBhbmQgaGVyZWJ5IGV4cHJlc3NseQorZGlzY2xhaW1zIGFsbCwgd2FycmFudGllcywgZXhwcmVzcywgaW1wbGllZCwgc3RhdHV0b3J5LCBvciBvdGhlcndpc2UKK3dpdGggcmVzcGVjdCB0byB0aGUgc29mdHdhcmUsIGluY2x1ZGluZyBub25pbmZyaW5nZW1lbnQgYW5kIHRoZSBpbXBsaWVkCit3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuCisKK0xpbWl0YXRpb24gb2YgTGlhYmlsaXR5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorSW4gbm8gZXZlbnQgd2lsbCBOU0EgYmUgbGlhYmxlIGZvciBhbnkgZGFtYWdlcywgaW5jbHVkaW5nIGxvc3Mgb2YgZGF0YSwKK2xvc3QgcHJvZml0cywgY29zdCBvZiBjb3Zlciwgb3Igb3RoZXIgc3BlY2lhbCwgaW5jaWRlbnRhbCwKK2NvbnNlcXVlbnRpYWwsIGRpcmVjdCBvciBpbmRpcmVjdCBkYW1hZ2VzIGFyaXNpbmcgZnJvbSB0aGUgc29mdHdhcmUgb3IKK3RoZSB1c2UgdGhlcmVvZiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LiBUaGlzCitsaW1pdGF0aW9uIHdpbGwgYXBwbHkgZXZlbiBpZiBOU0EgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkKK29mIHN1Y2ggZGFtYWdlLiBZb3UgYWNrbm93bGVkZ2UgdGhhdCB0aGlzIGlzIGEgcmVhc29uYWJsZSBhbGxvY2F0aW9uIG9mCityaXNrLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK05vdGljZXMgZm9yIGZpbGUocyk6CisvZnJhbWV3b3JrL29yZy1uZXRiZWFucy1hcGktdmlzdWFsLmphcgorL2ZyYW1ld29yay9vcmctb3BlbmlkZS11dGlsLmphcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBKdW5lIDE5OTEgCisKK0NvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCitvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworUHJlYW1ibGUKKworVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkKK3lvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiBCeSBjb250cmFzdCwgdGhlIEdOVQorR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tCit0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUgc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUKK2lzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuIFRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24ncyBzb2Z0d2FyZQorYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvIHVzaW5nIGl0LgorKFNvbWUgb3RoZXIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlIGlzIGNvdmVyZWQgYnkKK3RoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSBZb3UgY2FuCithcHBseSBpdCB0byB5b3VyIHByb2dyYW1zLCB0b28uIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZQorc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90IHByaWNlLiBPdXIKK0dlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKK2hhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kCitjaGFyZ2UgZm9yIHRoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUKK3NvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQgaWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbgorY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0IGluIG5ldyBmcmVlCitwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuIFRvCitwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQKK2ZvcmJpZCBhbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8KK3N1cnJlbmRlciB0aGUgcmlnaHRzLiBUaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvCitjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YKK3RoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwKK3doZXRoZXIgZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cworYWxsIHRoZSByaWdodHMgdGhhdCB5b3UgaGF2ZS4gWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwKK3RvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZSBzb3VyY2UgY29kZS4gQW5kIHlvdSBtdXN0IHNob3cKK3RoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyIHJpZ2h0cy4KKworV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUKK3NvZnR3YXJlLCBhbmQgKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91CitsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUKK3NvZnR3YXJlLgorCitBbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFuZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UKK2NlcnRhaW4gdGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5Citmb3IgdGhpcyBmcmVlIHNvZnR3YXJlLiBJZiB0aGUgc29mdHdhcmUgaXMgbW9kaWZpZWQgYnkKK3NvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZSB3YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cKK3RoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28gdGhhdCBhbnkKK3Byb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlCitvcmlnaW5hbCBhdXRob3JzJyByZXB1dGF0aW9ucy4KKworRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkKK3NvZnR3YXJlIHBhdGVudHMuIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0CityZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUgcHJvZ3JhbSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4KK3BhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUgcHJvZ3JhbSBwcm9wcmlldGFyeS4KK1RvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55IHBhdGVudCBtdXN0CitiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgorCitUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uCithbmQgbW9kaWZpY2F0aW9uIGZvbGxvdy4KKworVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQKK01PRElGSUNBVElPTgorCiswLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoCitjb250YWlucyBhIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0CittYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UuIFRoZSAiUHJvZ3JhbSIsIGJlbG93LCByZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvcgord29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iIG1lYW5zIGVpdGhlciB0aGUKK1Byb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OiB0aGF0IGlzCit0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKK2VpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50bworYW5vdGhlciBsYW5ndWFnZS4gKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZAord2l0aG91dCBsaW1pdGF0aW9uIGluIHRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikgRWFjaAorbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgorCitBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24KK2FyZSBub3QgY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLgorVGhlIGFjdCBvZiBydW5uaW5nIHRoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlCitvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbSBpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzCitjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YKK2hhdmluZyBiZWVuIG1hZGUgYnkgcnVubmluZyB0aGUgUHJvZ3JhbSkuIFdoZXRoZXIgdGhhdCBpcwordHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4KKworMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUKK1Byb2dyYW0ncyBzb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwKK3Byb3ZpZGVkIHRoYXQgeW91IGNvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbgorZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2YKK3dhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzCitMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7IGFuZCBnaXZlIGFueQorb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIGFsb25nCit3aXRoIHRoZSBQcm9ncmFtLgorCitZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYQorY29weSwgYW5kIHlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbgoraW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgorCisyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueQorcG9ydGlvbiBvZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kCitjb3B5IGFuZCBkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZQordGVybXMgb2YgU2VjdGlvbiAxIGFib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mCit0aGVzZSBjb25kaXRpb25zOgorCithKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50Citub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mCithbnkgY2hhbmdlLgorCitiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsCit0aGF0IGluIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZQorUHJvZ3JhbSBvciBhbnkgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vCitjaGFyZ2UgdG8gYWxsIHRoaXJkIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKworYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMKK2ludGVyYWN0aXZlbHkgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQKK3J1bm5pbmcgZm9yIHN1Y2ggaW50ZXJhY3RpdmUgdXNlIGluIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwKK3RvIHByaW50IG9yIGRpc3BsYXkgYW4gYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZQorY29weXJpZ2h0IG5vdGljZSBhbmQgYSBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IKK2Vsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heQorcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyIHRoZXNlIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nCit0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAoRXhjZXB0aW9uOiBpZgordGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dCBkb2VzIG5vdCBub3JtYWxseQorcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbQoraXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCisKK1RoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiBJZgoraWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUKK1Byb2dyYW0sIGFuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZAorc2VwYXJhdGUgd29ya3MgaW4gdGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMKK3Rlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2Ugc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZQordGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gQnV0IHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlIHNhbWUKK3NlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcworb2YgdGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzCitleHRlbmQgdG8gdGhlIGVudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydAorcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCisKK1RodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMKK29yIGNvbnRlc3QgeW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsKK3JhdGhlciwgdGhlIGludGVudCBpcyB0byBleGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUKK2Rpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yIGNvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlCitQcm9ncmFtLiBJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90CitiYXNlZCBvbiB0aGUgUHJvZ3JhbSB3aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZAorb24gdGhlIFByb2dyYW0pIG9uIGEgdm9sdW1lIG9mIGEgc3RvcmFnZSBvciBkaXN0cmlidXRpb24KK21lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlciB0aGUgc2NvcGUgb2YgdGhpcworTGljZW5zZS4KKworMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQKK29uIGl0LCB1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybQordW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UKK2Fsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKK2EpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nCittYWNoaW5lLXJlYWRhYmxlIHNvdXJjZSBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkCit1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bQorY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCitiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdAordGhyZWUgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZQordGhhbiB5b3VyIGNvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHNvdXJjZSBkaXN0cmlidXRpb24sCithIGNvbXBsZXRlIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UKK2NvZGUsIHRvIGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyCithYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsKK29yLAorCitjKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHRoZQorb2ZmZXIgdG8gZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAoVGhpcworYWx0ZXJuYXRpdmUgaXMgYWxsb3dlZCBvbmx5IGZvciBub25jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbgorYW5kIG9ubHkgaWYgeW91IHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yCitleGVjdXRhYmxlIGZvcm0gd2l0aCBzdWNoIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aAorU3Vic2VjdGlvbiBiIGFib3ZlLikKKworVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZQord29yayBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuIEZvciBhbiBleGVjdXRhYmxlIHdvcmssCitjb21wbGV0ZSBzb3VyY2UgY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwKK21vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55IGFzc29jaWF0ZWQgaW50ZXJmYWNlCitkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8gY29udHJvbAorY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gSG93ZXZlciwgYXMKK2Egc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdAoraW5jbHVkZSBhbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIKK3NvdXJjZSBvciBiaW5hcnkgZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsCitrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlCitleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudCBpdHNlbGYgYWNjb21wYW5pZXMKK3RoZSBleGVjdXRhYmxlLiBJZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZQoraXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwKK3RoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbQordGhlIHNhbWUgcGxhY2UgY291bnRzIGFzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsCitldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QgY29tcGVsbGVkIHRvIGNvcHkgdGhlCitzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCisKKzQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUKK1Byb2dyYW0gZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuIEFueQorYXR0ZW1wdCBvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUKK3RoZSBQcm9ncmFtIGlzIHZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIKK3JpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuIEhvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUKK3JlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlciB0aGlzIExpY2Vuc2Ugd2lsbAorbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2ggcGFydGllcworcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KKworNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91CitoYXZlIG5vdCBzaWduZWQgaXQuIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91CitwZXJtaXNzaW9uIHRvIG1vZGlmeSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cworZGVyaXZhdGl2ZSB3b3Jrcy4gVGhlc2UgYWN0aW9ucyBhcmUgcHJvaGliaXRlZCBieSBsYXcgaWYgeW91CitkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gVGhlcmVmb3JlLCBieSBtb2RpZnlpbmcgb3IKK2Rpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pLAoreW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAorYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yCittb2RpZnlpbmcgdGhlIFByb2dyYW0gb3Igd29ya3MgYmFzZWQgb24gaXQuCisKKzYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZAorb24gdGhlIFByb2dyYW0pLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYQorbGljZW5zZSBmcm9tIHRoZSBvcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yCittb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0byB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4KK1lvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlciByZXN0cmljdGlvbnMgb24gdGhlCityZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLiBZb3UgYXJlCitub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KK3RoaXMgTGljZW5zZS4KKworNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mCitwYXRlbnQgaW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0bworcGF0ZW50IGlzc3VlcyksIGNvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5Citjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yIG90aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZQorY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90IGV4Y3VzZSB5b3UgZnJvbSB0aGUKK2NvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiBJZiB5b3UgY2Fubm90IGRpc3RyaWJ1dGUgc28gYXMKK3RvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCitMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEKK2NvbnNlcXVlbmNlIHlvdSBtYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiBGb3IKK2V4YW1wbGUsIGlmIGEgcGF0ZW50IGxpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUKK3JlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5IGFsbCB0aG9zZSB3aG8gcmVjZWl2ZQorY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4gdGhlIG9ubHkgd2F5Cit5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KK3JlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCisKK0lmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IKK3VuZW5mb3JjZWFibGUgdW5kZXIgYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZQorb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEKK3dob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyIGNpcmN1bXN0YW5jZXMuIEl0IGlzIG5vdAordGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55CitwYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0Cit2YWxpZGl0eSBvZiBhbnkgc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUKK3B1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUgaW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlCitkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcyBpbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZQorcHJhY3RpY2VzLiBNYW55IHBlb3BsZSBoYXZlIG1hZGUgZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0bwordGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgdGhyb3VnaCB0aGF0IHN5c3RlbQoraW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0IHN5c3RlbTsgaXQgaXMKK3VwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nIHRvCitkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZQorY2Fubm90IGltcG9zZSB0aGF0IGNob2ljZS4KKworVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzCitiZWxpZXZlZCB0byBiZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KKworOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzCityZXN0cmljdGVkIGluIGNlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5Citjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUgb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8KK3BsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UgbWF5IGFkZCBhbiBleHBsaWNpdAorZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZyB0aG9zZQorY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvcgorYW1vbmcgY291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiBJbiBzdWNoIGNhc2UsIHRoaXMKK0xpY2Vuc2UgaW5jb3Jwb3JhdGVzIHRoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlCitib2R5IG9mIHRoaXMgTGljZW5zZS4KKworOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vcgorbmV3IHZlcnNpb25zIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0bwordGltZS4gU3VjaCBuZXcgdmVyc2lvbnMgd2lsbCBiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUKK3ByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvIGFkZHJlc3MgbmV3Citwcm9ibGVtcyBvciBjb25jZXJucy4KKworRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIElmCit0aGUgUHJvZ3JhbSBzcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2gKK2FwcGxpZXMgdG8gaXQgYW5kICJhbnkgbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24KK29mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgdmVyc2lvbgorb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLiBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIKK29mIHRoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQKK2J5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKzEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvCitvdGhlciBmcmVlIHByb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZQorZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yIHRvIGFzayBmb3IgcGVybWlzc2lvbi4gRm9yCitzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2UKK3NvbWV0aW1lcyBtYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuIE91ciBkZWNpc2lvbiB3aWxsIGJlCitndWlkZWQgYnkgdGhlIHR3byBnb2FscyBvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwKK2Rlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZCBvZiBwcm9tb3RpbmcgdGhlCitzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCisKK05PIFdBUlJBTlRZCisKKzExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUworTk8gV0FSUkFOVFkgRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWQorQVBQTElDQUJMRSBMQVcuIEVYQ0VQVCBXSEVOIE9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUKK0NPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTIFBST1ZJREUgVEhFIFBST0dSQU0KKyJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUgorSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCitQVVJQT1NFLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFCitPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gU0hPVUxEIFRIRSBQUk9HUkFNIFBST1ZFCitERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsCitSRVBBSVIgT1IgQ09SUkVDVElPTi4KKworMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQKK1RPIElOIFdSSVRJTkcgV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZCitXSE8gTUFZIE1PRElGWSBBTkQvT1IgUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRAorQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsIElOQ0xVRElORyBBTlkgR0VORVJBTCwKK1NQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GCitUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UCitMSU1JVEVEIFRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IKK0xPU1NFUyBTVVNUQUlORUQgQlkgWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRQorUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSIFBST0dSQU1TKSwgRVZFTiBJRiBTVUNICitIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKK1NVQ0ggREFNQUdFUy4KKworRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKK0hvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcworCitJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlCitncmVhdGVzdCBwb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUKK3RoaXMgaXMgdG8gbWFrZSBpdCBmcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbgorcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCisKK1RvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiBJdCBpcworc2FmZXN0IHRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvCittb3N0IGVmZmVjdGl2ZWx5IGNvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaAorZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdCB0aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyCit0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCisKK09uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdAoraXQgZG9lcy4KKworQ29weXJpZ2h0IChDKSA8eWVhcj4gPG5hbWUgb2YgYXV0aG9yPgorVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKK3ZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0Cit3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlCitpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCittb3JlIGRldGFpbHMuIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVQorR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LAord3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCitQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZAorcGFwZXIgbWFpbC4gSWYgdGhlIHByb2dyYW0gaXMgaW50ZXJhY3RpdmUsIG1ha2UgaXQgb3V0cHV0IGEKK3Nob3J0IG5vdGljZSBsaWtlIHRoaXMgd2hlbiBpdCBzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUKK21vZGU6CisKK0dub21vdmlzaW9uIHZlcnNpb24gNjksIENvcHlyaWdodCAoQykgeWVhciBuYW1lIG9mIGF1dGhvcgorR25vbW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscwordHlwZSBgc2hvdyB3Jy4gVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvCityZWRpc3RyaWJ1dGUgaXQgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIGZvcgorZGV0YWlscy4gVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycKK3Nob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZSBwYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UuIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5IGJlIGNhbGxlZAorc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4KK2JlIG1vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCisKK1lvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYQorcHJvZ3JhbW1lcikgb3IgeW91ciBzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQKK2Rpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYgbmVjZXNzYXJ5LiBIZXJlIGlzIGEgc2FtcGxlOworYWx0ZXIgdGhlIG5hbWVzOgorCitZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluCit0aGUgcHJvZ3JhbSBgR25vbW92aXNpb24nICh3aGljaCBtYWtlcyBwYXNzZXMgYXQgY29tcGlsZXJzKQord3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCisKK3NpZ25hdHVyZSBvZiBUeSBDb29uLCAxIEFwcmlsIDE5ODkKK1R5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCitUaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcKK3lvdXIgcHJvZ3JhbSBpbnRvIHByb3ByaWV0YXJ5IHByb2dyYW1zLiBJZiB5b3VyIHByb2dyYW0gaXMgYQorc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5IGNvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvCitwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUgbGlicmFyeS4gSWYKK3RoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KKworIkNMQVNTUEFUSCIgRVhDRVBUSU9OIFRPIFRIRSBHUEwgVkVSU0lPTiAyCisKK0NlcnRhaW4gc291cmNlIGZpbGVzIGRpc3RyaWJ1dGVkIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gCithcmUgc3ViamVjdCB0byAgdGhlIGZvbGxvd2luZyBjbGFyaWZpY2F0aW9uIGFuZCBzcGVjaWFsCitleGNlcHRpb24gdG8gdGhlIEdQTCBWZXJzaW9uIDIsIGJ1dCBvbmx5IHdoZXJlIFN1biBoYXMKK2V4cHJlc3NseSBpbmNsdWRlZCBpbiB0aGUgcGFydGljdWxhciBzb3VyY2UgZmlsZSdzIGhlYWRlcgordGhlIHdvcmRzICAiU3VuIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdAordG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZCBieSBTdW4gaW4gdGhlCitMaWNlbnNlIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuIiAKKworICAgTGlua2luZyB0aGlzIGxpYnJhcnkgc3RhdGljYWxseSBvciBkeW5hbWljYWxseSB3aXRoIG90aGVyCittb2R1bGVzIGlzIG1ha2luZyBhIGNvbWJpbmVkIHdvcmsgYmFzZWQgb24gdGhpcyBsaWJyYXJ5LiAKK1RodXMsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIFZlcnNpb24gMiBjb3ZlciB0aGUgd2hvbGUgY29tYmluYXRpb24uIAorCisgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzCitsaWJyYXJ5IGdpdmUgeW91ICBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBsaWJyYXJ5IHdpdGgKK2luZGVwZW5kZW50IG1vZHVsZXMgdG8gcHJvZHVjZSBhbiAgZXhlY3V0YWJsZSwgcmVnYXJkbGVzcyBvZgordGhlIGxpY2Vuc2UgdGVybXMgb2YgdGhlc2UgaW5kZXBlbmRlbnQgbW9kdWxlcywgIGFuZCB0byBjb3B5CithbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91ciAKK2Nob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQKK2luZGVwZW5kZW50IG1vZHVsZSwgIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZQorb2YgdGhhdCBtb2R1bGUuICBBbiBpbmRlcGVuZGVudCAgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzCitub3QgZGVyaXZlZCBmcm9tIG9yIGJhc2VkIG9uIHRoaXMgbGlicmFyeS4gIElmICB5b3UgbW9kaWZ5Cit0aGlzIGxpYnJhcnksIHlvdSBtYXkgZXh0ZW5kIHRoaXMgZXhjZXB0aW9uIHRvIHlvdXIgdmVyc2lvbgorb2YgIHRoZSBsaWJyYXJ5LCBidXQgeW91IGFyZSBub3Qgb2JsaWdhdGVkIHRvIGRvIHNvLiAgSWYgeW91CitkbyBub3Qgd2lzaCB0byBkbyBzbywgZGVsZXRlIHRoaXMgZXhjZXB0aW9uIHN0YXRlbWVudCBmcm9tCit5b3VyIHZlcnNpb24uCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK05vdGljZXMgZm9yIGZpbGUocyk6CisvYmluL2FkYgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIENvcHlyaWdodCAoYykgMjAwNi0yMDA5LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgICBDb3B5cmlnaHQgMjAwNiwgQnJpYW4gU3dldGxhbmQgPHN3ZXRsYW5kQGZyb3R6Lm5ldD4KKworICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisgICAxLiBEZWZpbml0aW9ucy4KKworICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKyAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCisgICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTm90aWNlcyBmb3IgZmlsZShzKToKKy9mcmFtZXdvcmsvYXBhY2hlLXhtbC1ob3N0ZGV4LmphcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICA9PSAgTk9USUNFIGZpbGUgY29ycmVzcG9uZGluZyB0byBzZWN0aW9uIDQoZCkgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCAgID09CisgICA9PSAgVmVyc2lvbiAyLjAsIGluIHRoaXMgY2FzZSBmb3IgdGhlIEFwYWNoZSBYYWxhbiBKYXZhIGRpc3RyaWJ1dGlvbi4gID09CisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgIEFwYWNoZSBYYWxhbiAoWGFsYW4gWFNMVCBwcm9jZXNzb3IpCisgICBDb3B5cmlnaHQgMTk5OS0yMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICBBcGFjaGUgWGFsYW4gKFhhbGFuIHNlcmlhbGl6ZXIpCisgICBDb3B5cmlnaHQgMTk5OS0yMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGF0CisgICBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgorCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBQb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIHdhcyBvcmlnaW5hbGx5IGJhc2VkIG9uIHRoZSBmb2xsb3dpbmc6CisgICAgIC0gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LTIwMDIsIExvdHVzIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwKKyAgICAgICBodHRwOi8vd3d3LmxvdHVzLmNvbS4KKyAgICAgLSBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiwgU3VuIE1pY3Jvc3lzdGVtcy4sCisgICAgICAgaHR0cDovL3d3dy5zdW4uY29tLgorICAgICAtIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMywgSUJNIENvcnBvcmF0aW9uLiwgCisgICAgICAgaHR0cDovL3d3dy5pYm0uY29tLgorICAgICAgIAorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgVGhlIGJpbmFyeSBkaXN0cmlidXRpb24gcGFja2FnZSAoaWUuIGphcnMsIHNhbXBsZXMgYW5kIGRvY3VtZW50YXRpb24pIG9mCisgICB0aGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBmb2xsb3dpbmc6CisgICAgICAgCisgICAgIC0gVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIAorICAgICAgICAgLSBYZXJjZXMgSmF2YSAtIHNlZSBMSUNFTlNFLnR4dCAKKyAgICAgICAgIC0gSkFYUCAxLjMgQVBJcyAtIHNlZSBMSUNFTlNFLnR4dAorICAgICAgICAgLSBCeXRlY29kZSBFbmdpbmVlcmluZyBMaWJyYXJ5IC0gc2VlIExJQ0VOU0UudHh0CisgICAgICAgICAtIFJlZ3VsYXIgRXhwcmVzc2lvbiAtIHNlZSBMSUNFTlNFLnR4dAorICAgICAgIAorICAgICAtIFNjb3R0IEh1ZHNvbiwgRnJhbmsgRmxhbm5lcnksIEMuIFNjb3R0IEFuYW5pYW4gCisgICAgICAgICAtIENVUCBQYXJzZXIgR2VuZXJhdG9yIHJ1bnRpbWUgKGphdmFjdXBccnVudGltZSkgLSBzZWUgTElDRU5TRS50eHQgCisgCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAorICAgVGhlIHNvdXJjZSBkaXN0cmlidXRpb24gcGFja2FnZSAoaWUuIGFsbCBzb3VyY2UgYW5kIHRvb2xzIHJlcXVpcmVkIHRvIGJ1aWxkCisgICBYYWxhbiBKYXZhKSBvZiB0aGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBmb2xsb3dpbmc6CisgICAgICAgCisgICAgIC0gVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgICAgICAgICAtIFhlcmNlcyBKYXZhIC0gc2VlIExJQ0VOU0UudHh0IAorICAgICAgICAgLSBKQVhQIDEuMyBBUElzIC0gc2VlIExJQ0VOU0UudHh0CisgICAgICAgICAtIEJ5dGVjb2RlIEVuZ2luZWVyaW5nIExpYnJhcnkgLSBzZWUgTElDRU5TRS50eHQKKyAgICAgICAgIC0gUmVndWxhciBFeHByZXNzaW9uIC0gc2VlIExJQ0VOU0UudHh0CisgICAgICAgICAtIEFudCAtIHNlZSBMSUNFTlNFLnR4dAorICAgICAgICAgLSBTdHlsZWJvb2sgZG9jIHRvb2wgLSBzZWUgTElDRU5TRS50eHQgICAgCisgICAgICAgCisgICAgIC0gRWxsaW90IEpvZWwgQmVyayBhbmQgQy4gU2NvdHQgQW5hbmlhbiAKKyAgICAgICAgIC0gTGV4aWNhbCBBbmFseXplciBHZW5lcmF0b3IgKEpMZXgpIC0gc2VlIExJQ0VOU0UudHh0CisKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gICAgICAgCisgICBBcGFjaGUgWGVyY2VzIEphdmEKKyAgIENvcHlyaWdodCAxOTk5LTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYXQKKyAgIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCisKKyAgIFBvcnRpb25zIG9mIEFwYWNoZSBYZXJjZXMgSmF2YSBpbiB4ZXJjZXNJbXBsLmphciBhbmQgeG1sLWFwaXMuamFyCisgICB3ZXJlIG9yaWdpbmFsbHkgYmFzZWQgb24gdGhlIGZvbGxvd2luZzoKKyAgICAgLSBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIElCTSBDb3Jwb3JhdGlvbi4sIGh0dHA6Ly93d3cuaWJtLmNvbS4KKyAgICAgLSBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIFN1biBNaWNyb3N5c3RlbXMuLCBodHRwOi8vd3d3LnN1bi5jb20uCisgICAgIC0gdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBQYXVsIEVuZyBvbiBiZWhhbGYgb2YgdGhlIAorICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHRoYXQgd2VyZSBvcmlnaW5hbGx5IGRldmVsb3BlZCBhdCBpQ2xpY2ssIEluYy4sCisgICAgICAgc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LiAgICAKKworICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgIAorICAgQXBhY2hlIHhtbC1jb21tb25zIHhtbC1hcGlzIChyZWRpc3RyaWJ1dGlvbiBvZiB4bWwtYXBpcy5qYXIpCisKKyAgIEFwYWNoZSBYTUwgQ29tbW9ucworICAgQ29weXJpZ2h0IDIwMDEtMjAwMywyMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBhdAorICAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KKworICAgUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSB3ZXJlIG9yaWdpbmFsbHkgYmFzZWQgb24gdGhlIGZvbGxvd2luZzoKKyAgICAgLSBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIElCTSBDb3Jwb3JhdGlvbi4sIGh0dHA6Ly93d3cuaWJtLmNvbS4KKyAgICAgLSBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIFN1biBNaWNyb3N5c3RlbXMuLCBodHRwOi8vd3d3LnN1bi5jb20uCisgICAgIC0gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwIFdvcmxkIFdpZGUgV2ViIENvbnNvcnRpdW0sIGh0dHA6Ly93d3cudzMub3JnCisKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitOb3RpY2VzIGZvciBmaWxlKHMpOgorL2Jpbi9sbHZtLXJzLWNjCisvYmluL3JzLXNwZWMtZ2VuCisvbGliL2xpYnNsYW5nLmEKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorPT09PT09PT09PT09PT09PT09PT09PT09PQorTk9USUNFIGZpbGUgZm9yIHNsYW5nLmdpdAorPT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKKworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitOT1RJQ0UgZmlsZSBmb3IgZXh0ZXJuYWwvY2xhbmcgKGNsYW5nLmdpdCkuCitOb3RlOiBsaWJjbGFuZyouYSBhcmUgc3RhdGljYWxseSBsaW5rZWQuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTExWTSBSZWxlYXNlIExpY2Vuc2UKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorVW5pdmVyc2l0eSBvZiBJbGxpbm9pcy9OQ1NBCitPcGVuIFNvdXJjZSBMaWNlbnNlCisKK0NvcHlyaWdodCAoYykgMjAwNy0yMDExIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgYXQgVXJiYW5hLUNoYW1wYWlnbi4KK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK0RldmVsb3BlZCBieToKKworICAgIExMVk0gVGVhbQorCisgICAgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBhdCBVcmJhbmEtQ2hhbXBhaWduCisKKyAgICBodHRwOi8vbGx2bS5vcmcKKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgordGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgd2l0aAordGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bwordXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKK29mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbworc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVycy4KKworICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcnMgaW4gdGhlCisgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgKiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgTExWTSBUZWFtLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzIGF0CisgICAgICBVcmJhbmEtQ2hhbXBhaWduLCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8KKyAgICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljCisgICAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK0NPTlRSSUJVVE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKK09VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgV0lUSCBUSEUKK1NPRlRXQVJFLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1RoZSBMTFZNIHNvZnR3YXJlIGNvbnRhaW5zIGNvZGUgd3JpdHRlbiBieSB0aGlyZCBwYXJ0aWVzLiAgU3VjaCBzb2Z0d2FyZSB3aWxsCitoYXZlIGl0cyBvd24gaW5kaXZpZHVhbCBMSUNFTlNFLlRYVCBmaWxlIGluIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggaXQgYXBwZWFycy4KK1RoaXMgZmlsZSB3aWxsIGRlc2NyaWJlIHRoZSBjb3B5cmlnaHRzLCBsaWNlbnNlLCBhbmQgcmVzdHJpY3Rpb25zIHdoaWNoIGFwcGx5Cit0byB0aGF0IGNvZGUuCisKK1RoZSBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5IGluIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlIExpY2Vuc2UKK2FwcGxpZXMgdG8gYWxsIGNvZGUgaW4gdGhlIExMVk0gRGlzdHJpYnV0aW9uLCBhbmQgbm90aGluZyBpbiBhbnkgb2YgdGhlCitvdGhlciBsaWNlbnNlcyBnaXZlcyBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgbmFtZXMgb2YgdGhlIExMVk0gVGVhbSBvciB0aGUKK1VuaXZlcnNpdHkgb2YgSWxsaW5vaXMgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCitTb2Z0d2FyZS4KKworVGhlIGZvbGxvd2luZyBwaWVjZXMgb2Ygc29mdHdhcmUgaGF2ZSBhZGRpdGlvbmFsIG9yIGFsdGVybmF0ZSBjb3B5cmlnaHRzLAorbGljZW5zZXMsIGFuZC9vciByZXN0cmljdGlvbnM6CisKK1Byb2dyYW0gICAgICAgICAgICAgRGlyZWN0b3J5CistLS0tLS0tICAgICAgICAgICAgIC0tLS0tLS0tLQorPG5vbmUgeWV0PgorCisKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK05PVElDRSBmaWxlIGZvciBleHRlcm5hbC9sbHZtIChsbHZtLmdpdCkuCitOb3RlOiBsaWJMTFZNKi5hIGFyZSBzdGF0aWNhbGx5IGxpbmtlZC4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTExWTSBSZWxlYXNlIExpY2Vuc2UKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorVW5pdmVyc2l0eSBvZiBJbGxpbm9pcy9OQ1NBCitPcGVuIFNvdXJjZSBMaWNlbnNlCisKK0NvcHlyaWdodCAoYykgMjAwMy0yMDExIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgYXQgVXJiYW5hLUNoYW1wYWlnbi4KK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK0RldmVsb3BlZCBieToKKworICAgIExMVk0gVGVhbQorCisgICAgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBhdCBVcmJhbmEtQ2hhbXBhaWduCisKKyAgICBodHRwOi8vbGx2bS5vcmcKKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgordGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgd2l0aAordGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bwordXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKK29mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbworc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVycy4KKworICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcnMgaW4gdGhlCisgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgKiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgTExWTSBUZWFtLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzIGF0CisgICAgICBVcmJhbmEtQ2hhbXBhaWduLCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8KKyAgICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljCisgICAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK0NPTlRSSUJVVE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKK09VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgV0lUSCBUSEUKK1NPRlRXQVJFLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0NvcHlyaWdodHMgYW5kIExpY2Vuc2VzIGZvciBUaGlyZCBQYXJ0eSBTb2Z0d2FyZSBEaXN0cmlidXRlZCB3aXRoIExMVk06Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1RoZSBMTFZNIHNvZnR3YXJlIGNvbnRhaW5zIGNvZGUgd3JpdHRlbiBieSB0aGlyZCBwYXJ0aWVzLiAgU3VjaCBzb2Z0d2FyZSB3aWxsCitoYXZlIGl0cyBvd24gaW5kaXZpZHVhbCBMSUNFTlNFLlRYVCBmaWxlIGluIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggaXQgYXBwZWFycy4KK1RoaXMgZmlsZSB3aWxsIGRlc2NyaWJlIHRoZSBjb3B5cmlnaHRzLCBsaWNlbnNlLCBhbmQgcmVzdHJpY3Rpb25zIHdoaWNoIGFwcGx5Cit0byB0aGF0IGNvZGUuCisKK1RoZSBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5IGluIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlIExpY2Vuc2UKK2FwcGxpZXMgdG8gYWxsIGNvZGUgaW4gdGhlIExMVk0gRGlzdHJpYnV0aW9uLCBhbmQgbm90aGluZyBpbiBhbnkgb2YgdGhlCitvdGhlciBsaWNlbnNlcyBnaXZlcyBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgbmFtZXMgb2YgdGhlIExMVk0gVGVhbSBvciB0aGUKK1VuaXZlcnNpdHkgb2YgSWxsaW5vaXMgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCitTb2Z0d2FyZS4KKworVGhlIGZvbGxvd2luZyBwaWVjZXMgb2Ygc29mdHdhcmUgaGF2ZSBhZGRpdGlvbmFsIG9yIGFsdGVybmF0ZSBjb3B5cmlnaHRzLAorbGljZW5zZXMsIGFuZC9vciByZXN0cmljdGlvbnM6CisKK1Byb2dyYW0gICAgICAgICAgICAgRGlyZWN0b3J5CistLS0tLS0tICAgICAgICAgICAgIC0tLS0tLS0tLQorQXV0b2NvbmYgICAgICAgICAgICBsbHZtL2F1dG9jb25mCisgICAgICAgICAgICAgICAgICAgIGxsdm0vcHJvamVjdHMvTW9kdWxlTWFrZXIvYXV0b2NvbmYKKyAgICAgICAgICAgICAgICAgICAgbGx2bS9wcm9qZWN0cy9zYW1wbGUvYXV0b2NvbmYKK0NlbGxTUFUgYmFja2VuZCAgICAgbGx2bS9saWIvVGFyZ2V0L0NlbGxTUFUvUkVBRE1FLnR4dAorR29vZ2xlIFRlc3QgICAgICAgICBsbHZtL3V0aWxzL3VuaXR0ZXN0L2dvb2dsZXRlc3QKK09wZW5CU0QgcmVnZXggICAgICAgbGx2bS9saWIvU3VwcG9ydC97cmVnKiwgQ09QWVJJR0hULnJlZ2V4fQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK05vdGljZXMgZm9yIGZpbGUocyk6CisvYmluL21pbmlnemlwCisvbGliL2xpYnVuei5hCisvbGliL2xpYnotaG9zdC5zbworL2xpYi9saWJ6LmEKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlcgorCisgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKworICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisKKyAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyAgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisgIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKworICBKZWFuLWxvdXAgR2FpbGx5ICAgICAgICBNYXJrIEFkbGVyCisgIGpsb3VwQGd6aXAub3JnICAgICAgICAgIG1hZGxlckBhbHVtbmkuY2FsdGVjaC5lZHUKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitOb3RpY2VzIGZvciBmaWxlKHMpOgorL2Jpbi9ta3NuYXBzaG90LmFybQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitDb3B5cmlnaHQgKGMpIDE5OTQtMjAwNiBTdW4gTWljcm9zeXN0ZW1zIEluYy4KK0FsbCBSaWdodHMgUmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorbWV0OgorCistIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKK3RoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKy0gUmVkaXN0cmlidXRpb24gaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworLSBOZWl0aGVyIHRoZSBuYW1lIG9mIFN1biBNaWNyb3N5c3RlbXMgb3IgdGhlIG5hbWVzIG9mIGNvbnRyaWJ1dG9ycyBtYXkKK2JlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKK3NwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMKK0lTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKK1RIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKK1BVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCitQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCitTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworVGhlIG9yaWdpbmFsIHNvdXJjZSBjb2RlIGNvdmVyZWQgYnkgdGhlIGFib3ZlIGxpY2Vuc2UgYWJvdmUgaGFzIGJlZW4KK21vZGlmaWVkIHNpZ25pZmljYW50bHkgYnkgR29vZ2xlIEluYy4KK0NvcHlyaWdodCAyMDA2LTIwMDggdGhlIFY4IHByb2plY3QgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitOb3RpY2VzIGZvciBmaWxlKHMpOgorL2xpYi9saWJwbmcuYQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgY29weSBvZiB0aGUgbGlicG5nIG5vdGljZXMgaXMgcHJvdmlkZWQgZm9yIHlvdXIgY29udmVuaWVuY2UuICBJbiBjYXNlIG9mCithbnkgZGlzY3JlcGFuY3kgYmV0d2VlbiB0aGlzIGNvcHkgYW5kIHRoZSBub3RpY2VzIGluIHRoZSBmaWxlIHBuZy5oIHRoYXQgaXMKK2luY2x1ZGVkIGluIHRoZSBsaWJwbmcgZGlzdHJpYnV0aW9uLCB0aGUgbGF0dGVyIHNoYWxsIHByZXZhaWwuCisKK0NPUFlSSUdIVCBOT1RJQ0UsIERJU0NMQUlNRVIsIGFuZCBMSUNFTlNFOgorCitJZiB5b3UgbW9kaWZ5IGxpYnBuZyB5b3UgbWF5IGluc2VydCBhZGRpdGlvbmFsIG5vdGljZXMgaW1tZWRpYXRlbHkgZm9sbG93aW5nCit0aGlzIHNlbnRlbmNlLgorCitUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgorCitsaWJwbmcgdmVyc2lvbnMgMS4yLjYsIEF1Z3VzdCAxNSwgMjAwNCwgdGhyb3VnaCAxLjIuNDYsIEp1bHkgOSwgMjAxMSwgYXJlCitDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYtMjAwOSBHbGVubiBSYW5kZXJzLVBlaHJzb24sIGFuZCBhcmUKK2Rpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgc2FtZSBkaXNjbGFpbWVyIGFuZCBsaWNlbnNlIGFzIGxpYnBuZy0xLjIuNQord2l0aCB0aGUgZm9sbG93aW5nIGluZGl2aWR1YWwgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgQ29udHJpYnV0aW5nIEF1dGhvcnMKKworICAgQ29zbWluIFRydXRhCisKK2xpYnBuZyB2ZXJzaW9ucyAxLjAuNywgSnVseSAxLCAyMDAwLCB0aHJvdWdoIDEuMi41IC0gT2N0b2JlciAzLCAyMDAyLCBhcmUKK0NvcHlyaWdodCAoYykgMjAwMC0yMDAyIEdsZW5uIFJhbmRlcnMtUGVocnNvbiwgYW5kIGFyZQorZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzYW1lIGRpc2NsYWltZXIgYW5kIGxpY2Vuc2UgYXMgbGlicG5nLTEuMC42Cit3aXRoIHRoZSBmb2xsb3dpbmcgaW5kaXZpZHVhbHMgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgQ29udHJpYnV0aW5nIEF1dGhvcnMKKworICAgU2ltb24tUGllcnJlIENhZGlldXgKKyAgIEVyaWMgUy4gUmF5bW9uZAorICAgR2lsbGVzIFZvbGxhbnQKKworYW5kIHdpdGggdGhlIGZvbGxvd2luZyBhZGRpdGlvbnMgdG8gdGhlIGRpc2NsYWltZXI6CisKKyAgIFRoZXJlIGlzIG5vIHdhcnJhbnR5IGFnYWluc3QgaW50ZXJmZXJlbmNlIHdpdGggeW91ciBlbmpveW1lbnQgb2YgdGhlCisgICBsaWJyYXJ5IG9yIGFnYWluc3QgaW5mcmluZ2VtZW50LiAgVGhlcmUgaXMgbm8gd2FycmFudHkgdGhhdCBvdXIKKyAgIGVmZm9ydHMgb3IgdGhlIGxpYnJhcnkgd2lsbCBmdWxmaWxsIGFueSBvZiB5b3VyIHBhcnRpY3VsYXIgcHVycG9zZXMKKyAgIG9yIG5lZWRzLiAgVGhpcyBsaWJyYXJ5IGlzIHByb3ZpZGVkIHdpdGggYWxsIGZhdWx0cywgYW5kIHRoZSBlbnRpcmUKKyAgIHJpc2sgb2Ygc2F0aXNmYWN0b3J5IHF1YWxpdHksIHBlcmZvcm1hbmNlLCBhY2N1cmFjeSwgYW5kIGVmZm9ydCBpcyB3aXRoCisgICB0aGUgdXNlci4KKworbGlicG5nIHZlcnNpb25zIDAuOTcsIEphbnVhcnkgMTk5OCwgdGhyb3VnaCAxLjAuNiwgTWFyY2ggMjAsIDIwMDAsIGFyZQorQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5IEdsZW5uIFJhbmRlcnMtUGVocnNvbiwgYW5kIGFyZQorZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzYW1lIGRpc2NsYWltZXIgYW5kIGxpY2Vuc2UgYXMgbGlicG5nLTAuOTYsCit3aXRoIHRoZSBmb2xsb3dpbmcgaW5kaXZpZHVhbHMgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgQ29udHJpYnV0aW5nIEF1dGhvcnM6CisKKyAgIFRvbSBMYW5lCisgICBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyAgIFdpbGxlbSB2YW4gU2NoYWlrCisKK2xpYnBuZyB2ZXJzaW9ucyAwLjg5LCBKdW5lIDE5OTYsIHRocm91Z2ggMC45NiwgTWF5IDE5OTcsIGFyZQorQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyCitEaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHNhbWUgZGlzY2xhaW1lciBhbmQgbGljZW5zZSBhcyBsaWJwbmctMC44OCwKK3dpdGggdGhlIGZvbGxvd2luZyBpbmRpdmlkdWFscyBhZGRlZCB0byB0aGUgbGlzdCBvZiBDb250cmlidXRpbmcgQXV0aG9yczoKKworICAgSm9obiBCb3dsZXIKKyAgIEtldmluIEJyYWNleQorICAgU2FtIEJ1c2hlbGwKKyAgIE1hZ251cyBIb2xtZ3JlbgorICAgR3JlZyBSb2Vsb2ZzCisgICBUb20gVGFubmVyCisKK2xpYnBuZyB2ZXJzaW9ucyAwLjUsIE1heSAxOTk1LCB0aHJvdWdoIDAuODgsIEphbnVhcnkgMTk5NiwgYXJlCitDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuCisKK0ZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UsICJDb250cmlidXRpbmcgQXV0aG9ycyIKK2lzIGRlZmluZWQgYXMgdGhlIGZvbGxvd2luZyBzZXQgb2YgaW5kaXZpZHVhbHM6CisKKyAgIEFuZHJlYXMgRGlsZ2VyCisgICBEYXZlIE1hcnRpbmRhbGUKKyAgIEd1eSBFcmljIFNjaGFsbmF0CisgICBQYXVsIFNjaG1pZHQKKyAgIFRpbSBXZWduZXIKKworVGhlIFBORyBSZWZlcmVuY2UgTGlicmFyeSBpcyBzdXBwbGllZCAiQVMgSVMiLiAgVGhlIENvbnRyaWJ1dGluZyBBdXRob3JzCithbmQgR3JvdXAgNDIsIEluYy4gZGlzY2xhaW0gYWxsIHdhcnJhbnRpZXMsIGV4cHJlc3NlZCBvciBpbXBsaWVkLAoraW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZSB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgb2YKK2ZpdG5lc3MgZm9yIGFueSBwdXJwb3NlLiAgVGhlIENvbnRyaWJ1dGluZyBBdXRob3JzIGFuZCBHcm91cCA0MiwgSW5jLgorYXNzdW1lIG5vIGxpYWJpbGl0eSBmb3IgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCB3aGljaCBtYXkgcmVzdWx0IGZyb20gdGhlIHVzZSBvZiB0aGUgUE5HCitSZWZlcmVuY2UgTGlicmFyeSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworc291cmNlIGNvZGUsIG9yIHBvcnRpb25zIGhlcmVvZiwgZm9yIGFueSBwdXJwb3NlLCB3aXRob3V0IGZlZSwgc3ViamVjdAordG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisKKzEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb3VyY2UgY29kZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZC4KKworMi4gQWx0ZXJlZCB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2ggYW5kIG11c3Qgbm90CisgICBiZSBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc291cmNlLgorCiszLiBUaGlzIENvcHlyaWdodCBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkKKyAgIHNvdXJjZSBvciBhbHRlcmVkIHNvdXJjZSBkaXN0cmlidXRpb24uCisKK1RoZSBDb250cmlidXRpbmcgQXV0aG9ycyBhbmQgR3JvdXAgNDIsIEluYy4gc3BlY2lmaWNhbGx5IHBlcm1pdCwgd2l0aG91dAorZmVlLCBhbmQgZW5jb3VyYWdlIHRoZSB1c2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBhcyBhIGNvbXBvbmVudCB0bworc3VwcG9ydGluZyB0aGUgUE5HIGZpbGUgZm9ybWF0IGluIGNvbW1lcmNpYWwgcHJvZHVjdHMuICBJZiB5b3UgdXNlIHRoaXMKK3NvdXJjZSBjb2RlIGluIGEgcHJvZHVjdCwgYWNrbm93bGVkZ21lbnQgaXMgbm90IHJlcXVpcmVkIGJ1dCB3b3VsZCBiZQorYXBwcmVjaWF0ZWQuCisKKworQSAicG5nX2dldF9jb3B5cmlnaHQiIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSwgZm9yIGNvbnZlbmllbnQgdXNlIGluICJhYm91dCIKK2JveGVzIGFuZCB0aGUgbGlrZToKKworICAgcHJpbnRmKCIlcyIscG5nX2dldF9jb3B5cmlnaHQoTlVMTCkpOworCitBbHNvLCB0aGUgUE5HIGxvZ28gKGluIFBORyBmb3JtYXQsIG9mIGNvdXJzZSkgaXMgc3VwcGxpZWQgaW4gdGhlCitmaWxlcyAicG5nYmFyLnBuZyIgYW5kICJwbmdiYXIuanBnICg4OHgzMSkgYW5kICJwbmdub3cucG5nIiAoOTh4MzEpLgorCitMaWJwbmcgaXMgT1NJIENlcnRpZmllZCBPcGVuIFNvdXJjZSBTb2Z0d2FyZS4gIE9TSSBDZXJ0aWZpZWQgT3BlbiBTb3VyY2UgaXMgYQorY2VydGlmaWNhdGlvbiBtYXJrIG9mIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCitHbGVubiBSYW5kZXJzLVBlaHJzb24KK2dsZW5ucnAgYXQgdXNlcnMuc291cmNlZm9yZ2UubmV0CitKdWx5IDksIDIwMTEKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitOb3RpY2VzIGZvciBmaWxlKHMpOgorL2ZyYW1ld29yay9hbnRsci1ydW50aW1lLmphcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitbVGhlICJCU0QgbGljZW5zZSJdCitDb3B5cmlnaHQgKGMpIDIwMSBUZXJlbmNlIFBhcnIKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCithcmUgbWV0OgorCisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKK0lNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKK09GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCitJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCitJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKK05PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKK0RBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCitUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK05vdGljZXMgZm9yIGZpbGUocyk6CisvZnJhbWV3b3JrL2p1bml0LmphcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitDb21tb24gUHVibGljIExpY2Vuc2UgLSB2IDEuMAorCisKK1RIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBDT01NT04gUFVCTElDIExJQ0VOU0UgKCJBR1JFRU1FTlQiKS4gQU5ZIFVTRSwgUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMgQUdSRUVNRU5ULgorCisKKzEuIERFRklOSVRJT05TCisKKyJDb250cmlidXRpb24iIG1lYW5zOgorCithKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kCitiKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6CitpKQkgY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kCitpaSkJIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTsKK3doZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uIHN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgUHJvZ3JhbS4KKworIkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLgorCisKKyJMaWNlbnNlZCBQYXRlbnRzICIgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2Ugb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4KKworCisiUHJvZ3JhbSIgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50LgorCisKKyJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLgorCisKKzIuIEdSQU5UIE9GIFJJR0hUUworCithKQlTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4KK2IpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzIGxpY2Vuc2VkIGhlcmV1bmRlci4KK2MpCVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IgdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kIGxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5IHRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsIGlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uCitkKQlFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodCByaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50LgorMy4gUkVRVUlSRU1FTlRTCisKK0EgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDoKKworYSkJaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZAorYikJaXRzIGxpY2Vuc2UgYWdyZWVtZW50OgoraSkJZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsKK2lpKSBlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czsKK2lpaSkJc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kCitpdikJc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS4KK1doZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybToKKworYSkJaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kCitiKQlhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4KKworQ29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLgorCisKK0VhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzIHN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLgorCisKKzQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OCisKK0NvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsIGxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCJDb21tZXJjaWFsIENvbnRyaWJ1dG9yIikgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cyAoY29sbGVjdGl2ZWx5ICJMb3NzZXMiKSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIgbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMgcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyIHRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuCisKKworRm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZSBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzIHNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuCisKKworNS4gTk8gV0FSUkFOVFkKKworRVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4KKworCis2LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWQorCitFWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorCisKKzcuIEdFTkVSQUwKKworSWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuCisKKworSWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhIENvbnRyaWJ1dG9yIHdpdGggcmVzcGVjdCB0byBhIHBhdGVudCBhcHBsaWNhYmxlIHRvIHNvZnR3YXJlIChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzIGdyYW50ZWQgYnkgdGhhdCBDb250cmlidXRvciB0byBzdWNoIFJlY2lwaWVudCB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiBJbiBhZGRpdGlvbiwgaWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaCBSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworCitBbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwgUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5IFJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4KKworCitFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMgY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBJQk0gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuIElCTSBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyIGV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLgorCisKK1RoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcyBBZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzIGl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTm90aWNlcyBmb3IgZmlsZShzKToKKy9mcmFtZXdvcmsvYW50LWdsb2IuamFyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworICoKKyAqICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisgKgorICogICAxLiBEZWZpbml0aW9ucy4KKyAqCisgKiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgKiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorICoKKyAqICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAqICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorICoKKyAqICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgKiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgKiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAqICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKyAqCisgKiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAqICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKyAqCisgKiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgKiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisgKgorICogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgKiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAqICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorICoKKyAqICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAqICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAqICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKyAqCisgKiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAqICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgKiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgKiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgKiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisgKgorICogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgKiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgKiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAqICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAqICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAqICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisgKgorICogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAqICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisgKgorICogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAqICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAqICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgKiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisgKgorICogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAqICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAqICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgKiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgKiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgKiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAqICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAqICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAqICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgKiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisgKgorICogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAqICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAqICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKyAqCisgKiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAqICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorICoKKyAqICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgKiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgKiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorICoKKyAqICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgKiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgKiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAqICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgKiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgKiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgKiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAqICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAqICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgKiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgKiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAqICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKyAqCisgKiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAqICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgKiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorICoKKyAqICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAqICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAqICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgKiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAqICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAqICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorICoKKyAqICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgKiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKyAqCisgKiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgKiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAqICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAqICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAqICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgKiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKyAqCisgKiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAqICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAqICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAqICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAqICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgKiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgKiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAqICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorICoKKyAqICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgKiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgKiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorICoKKyAqICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisgKgorICogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCisgKgorICogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZworICogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCisgKiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCisgKiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCisgKiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQorICogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCisgKiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgorICogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCisgKgorICogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitXM0OuIFNPRlRXQVJFIE5PVElDRSBBTkQgTElDRU5TRQoraHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC8yMDAyL2NvcHlyaWdodC1zb2Z0d2FyZS0yMDAyMTIzMQorCitUaGlzIHdvcmsgKGFuZCBpbmNsdWRlZCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiBzdWNoIGFzIFJFQURNRXMsIG9yIG90aGVyCityZWxhdGVkIGl0ZW1zKSBpcyBiZWluZyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgdW5kZXIgdGhlIGZvbGxvd2luZworbGljZW5zZS4gQnkgb2J0YWluaW5nLCB1c2luZyBhbmQvb3IgY29weWluZyB0aGlzIHdvcmssIHlvdSAodGhlIGxpY2Vuc2VlKSBhZ3JlZQordGhhdCB5b3UgaGF2ZSByZWFkLCB1bmRlcnN0b29kLCBhbmQgd2lsbCBjb21wbHkgd2l0aCB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZAorY29uZGl0aW9ucy4KKworUGVybWlzc2lvbiB0byBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cyBkb2N1bWVudGF0aW9uLAord2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBvciByb3lhbHR5IGlzCitoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB5b3UgaW5jbHVkZSB0aGUgZm9sbG93aW5nIG9uIEFMTCBjb3BpZXMgb2YgdGhlCitzb2Z0d2FyZSBhbmQgZG9jdW1lbnRhdGlvbiBvciBwb3J0aW9ucyB0aGVyZW9mLCBpbmNsdWRpbmcgbW9kaWZpY2F0aW9uczoKKworICAxLiBUaGUgZnVsbCB0ZXh0IG9mIHRoaXMgTk9USUNFIGluIGEgbG9jYXRpb24gdmlld2FibGUgdG8gdXNlcnMgb2YgdGhlCisgICAgIHJlZGlzdHJpYnV0ZWQgb3IgZGVyaXZhdGl2ZSB3b3JrLiAKKyAgMi4gQW55IHByZS1leGlzdGluZyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgZGlzY2xhaW1lcnMsIG5vdGljZXMsIG9yIHRlcm1zCisgICAgIGFuZCBjb25kaXRpb25zLiBJZiBub25lIGV4aXN0LCB0aGUgVzNDIFNvZnR3YXJlIFNob3J0IE5vdGljZSBzaG91bGQgYmUKKyAgICAgaW5jbHVkZWQgKGh5cGVydGV4dCBpcyBwcmVmZXJyZWQsIHRleHQgaXMgcGVybWl0dGVkKSB3aXRoaW4gdGhlIGJvZHkKKyAgICAgb2YgYW55IHJlZGlzdHJpYnV0ZWQgb3IgZGVyaXZhdGl2ZSBjb2RlLgorICAzLiBOb3RpY2Ugb2YgYW55IGNoYW5nZXMgb3IgbW9kaWZpY2F0aW9ucyB0byB0aGUgZmlsZXMsIGluY2x1ZGluZyB0aGUgZGF0ZQorICAgICBjaGFuZ2VzIHdlcmUgbWFkZS4gKFdlIHJlY29tbWVuZCB5b3UgcHJvdmlkZSBVUklzIHRvIHRoZSBsb2NhdGlvbiBmcm9tCisgICAgIHdoaWNoIHRoZSBjb2RlIGlzIGRlcml2ZWQuKQorICAgICAKK1RISVMgU09GVFdBUkUgQU5EIERPQ1VNRU5UQVRJT04gSVMgUFJPVklERUQgIkFTIElTLCIgQU5EIENPUFlSSUdIVCBIT0xERVJTIE1BS0UKK05PIFJFUFJFU0VOVEFUSU9OUyBPUiBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQKK1RPLCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBTlkgUEFSVElDVUxBUiBQVVJQT1NFIE9SIFRIQVQKK1RIRSBVU0UgT0YgVEhFIFNPRlRXQVJFIE9SIERPQ1VNRU5UQVRJT04gV0lMTCBOT1QgSU5GUklOR0UgQU5ZIFRISVJEIFBBUlRZCitQQVRFTlRTLCBDT1BZUklHSFRTLCBUUkFERU1BUktTIE9SIE9USEVSIFJJR0hUUy4KKworQ09QWVJJR0hUIEhPTERFUlMgV0lMTCBOT1QgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgU1BFQ0lBTCBPUgorQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIEFOWSBVU0UgT0YgVEhFIFNPRlRXQVJFIE9SIERPQ1VNRU5UQVRJT04uCisKK1RoZSBuYW1lIGFuZCB0cmFkZW1hcmtzIG9mIGNvcHlyaWdodCBob2xkZXJzIG1heSBOT1QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvcgorcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KK1RpdGxlIHRvIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGFuZCBhbnkgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIHdpbGwgYXQKK2FsbCB0aW1lcyByZW1haW4gd2l0aCBjb3B5cmlnaHQgaG9sZGVycy4KKworX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKK1RoaXMgZm9ybXVsYXRpb24gb2YgVzNDJ3Mgbm90aWNlIGFuZCBsaWNlbnNlIGJlY2FtZSBhY3RpdmUgb24gRGVjZW1iZXIgMzEgMjAwMi4KK1RoaXMgdmVyc2lvbiByZW1vdmVzIHRoZSBjb3B5cmlnaHQgb3duZXJzaGlwIG5vdGljZSBzdWNoIHRoYXQgdGhpcyBsaWNlbnNlIGNhbgorYmUgdXNlZCB3aXRoIG1hdGVyaWFscyBvdGhlciB0aGFuIHRob3NlIG93bmVkIGJ5IHRoZSBXM0MsIHJlZmxlY3RzIHRoYXQgRVJDSU0KK2lzIG5vdyBhIGhvc3Qgb2YgdGhlIFczQywgaW5jbHVkZXMgcmVmZXJlbmNlcyB0byB0aGlzIHNwZWNpZmljIGRhdGVkIHZlcnNpb24gb2YKK3RoZSBsaWNlbnNlLCBhbmQgcmVtb3ZlcyB0aGUgYW1iaWd1b3VzIGdyYW50IG9mICJ1c2UiLiBPdGhlcndpc2UsIHRoaXMgdmVyc2lvbgoraXMgdGhlIHNhbWUgYXMgdGhlIHByZXZpb3VzIHZlcnNpb24gYW5kIGlzIHdyaXR0ZW4gc28gYXMgdG8gcHJlc2VydmUgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24ncyBhc3Nlc3NtZW50IG9mIEdQTCBjb21wYXRpYmlsaXR5IGFuZCBPU0kncyBjZXJ0aWZpY2F0aW9uCit1bmRlciB0aGUgT3BlbiBTb3VyY2UgRGVmaW5pdGlvbi4gUGxlYXNlIHNlZSBvdXIgQ29weXJpZ2h0IEZBUSBmb3IgY29tbW9uCitxdWVzdGlvbnMgYWJvdXQgdXNpbmcgbWF0ZXJpYWxzIGZyb20gb3VyIHNpdGUsIGluY2x1ZGluZyBzcGVjaWZpYyB0ZXJtcyBhbmQKK2NvbmRpdGlvbnMgZm9yIHBhY2thZ2VzIGxpa2UgbGlid3d3LCBBbWF5YSwgYW5kIEppZ3Nhdy4gT3RoZXIgcXVlc3Rpb25zIGFib3V0Cit0aGlzIG5vdGljZSBjYW4gYmUgZGlyZWN0ZWQgdG8gc2l0ZS1wb2xpY3lAdzMub3JnLgorIAorSm9zZXBoIFJlYWdsZSA8c2l0ZS1wb2xpY3lAdzMub3JnPiAKKworVGhpcyBsaWNlbnNlIGNhbWUgZnJvbTogaHR0cDovL3d3dy5tZWdnaW5zb24uY29tL1NBWC9jb3B5aW5nLmh0bWwKKyAgSG93ZXZlciBwbGVhc2Ugbm90ZSBmdXR1cmUgdmVyc2lvbnMgb2YgU0FYIG1heSBiZSBjb3ZlcmVkIAorICB1bmRlciBodHRwOi8vc2F4cHJvamVjdC5vcmcvP3NlbGVjdGVkPXBkCisKK1NBWDIgaXMgRnJlZSEKKworSSBoZXJlYnkgYWJhbmRvbiBhbnkgcHJvcGVydHkgcmlnaHRzIHRvIFNBWCAyLjAgKHRoZSBTaW1wbGUgQVBJIGZvcgorWE1MKSwgYW5kIHJlbGVhc2UgYWxsIG9mIHRoZSBTQVggMi4wIHNvdXJjZSBjb2RlLCBjb21waWxlZCBjb2RlLCBhbmQKK2RvY3VtZW50YXRpb24gY29udGFpbmVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGludG8gdGhlIFB1YmxpYyBEb21haW4uCitTQVggY29tZXMgd2l0aCBOTyBXQVJSQU5UWSBvciBndWFyYW50ZWUgb2YgZml0bmVzcyBmb3IgYW55CitwdXJwb3NlLgorCitEYXZpZCBNZWdnaW5zb24sIGRhdmlkQG1lZ2dpbnNvbi5jb20KKzIwMDAtMDUtMDUKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitOb3RpY2VzIGZvciBmaWxlKHMpOgorL2xpYi9saWJjbGFuZy5zbworL2xpYi9saWJjbGFuZ0FuYWx5c2lzLmEKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitMTFZNIFJlbGVhc2UgTGljZW5zZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitVbml2ZXJzaXR5IG9mIElsbGlub2lzL05DU0EKK09wZW4gU291cmNlIExpY2Vuc2UKKworQ29weXJpZ2h0IChjKSAyMDA3LTIwMTEgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBhdCBVcmJhbmEtQ2hhbXBhaWduLgorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworRGV2ZWxvcGVkIGJ5OgorCisgICAgTExWTSBUZWFtCisKKyAgICBVbml2ZXJzaXR5IG9mIElsbGlub2lzIGF0IFVyYmFuYS1DaGFtcGFpZ24KKworICAgIGh0dHA6Ly9sbHZtLm9yZworCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCit0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCB3aXRoCit0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCit1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvCitzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXJzLgorCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVycyBpbiB0aGUKKyAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAqIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBMTFZNIFRlYW0sIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgYXQKKyAgICAgIFVyYmFuYS1DaGFtcGFpZ24sIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0bworICAgICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMKKyAgICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCitGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorQ09OVFJJQlVUT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBXSVRIIFRIRQorU09GVFdBUkUuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorVGhlIExMVk0gc29mdHdhcmUgY29udGFpbnMgY29kZSB3cml0dGVuIGJ5IHRoaXJkIHBhcnRpZXMuICBTdWNoIHNvZnR3YXJlIHdpbGwKK2hhdmUgaXRzIG93biBpbmRpdmlkdWFsIExJQ0VOU0UuVFhUIGZpbGUgaW4gdGhlIGRpcmVjdG9yeSBpbiB3aGljaCBpdCBhcHBlYXJzLgorVGhpcyBmaWxlIHdpbGwgZGVzY3JpYmUgdGhlIGNvcHlyaWdodHMsIGxpY2Vuc2UsIGFuZCByZXN0cmljdGlvbnMgd2hpY2ggYXBwbHkKK3RvIHRoYXQgY29kZS4KKworVGhlIGRpc2NsYWltZXIgb2Ygd2FycmFudHkgaW4gdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgTGljZW5zZQorYXBwbGllcyB0byBhbGwgY29kZSBpbiB0aGUgTExWTSBEaXN0cmlidXRpb24sIGFuZCBub3RoaW5nIGluIGFueSBvZiB0aGUKK290aGVyIGxpY2Vuc2VzIGdpdmVzIHBlcm1pc3Npb24gdG8gdXNlIHRoZSBuYW1lcyBvZiB0aGUgTExWTSBUZWFtIG9yIHRoZQorVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKK1NvZnR3YXJlLgorCitUaGUgZm9sbG93aW5nIHBpZWNlcyBvZiBzb2Z0d2FyZSBoYXZlIGFkZGl0aW9uYWwgb3IgYWx0ZXJuYXRlIGNvcHlyaWdodHMsCitsaWNlbnNlcywgYW5kL29yIHJlc3RyaWN0aW9uczoKKworUHJvZ3JhbSAgICAgICAgICAgICBEaXJlY3RvcnkKKy0tLS0tLS0gICAgICAgICAgICAgLS0tLS0tLS0tCis8bm9uZSB5ZXQ+CisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTm90aWNlcyBmb3IgZmlsZShzKToKKy9mcmFtZXdvcmsvZ3VhdmFsaWIuamFyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKKyAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KKworICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKKyAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKKyAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCisgICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQorICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCisgICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCisgICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKKyAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KKworICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTm90aWNlcyBmb3IgZmlsZShzKToKKy9jb3JlLWxhbWJkYS1zdHVicy5qYXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpCisKK1ZlcnNpb24gMiwgSnVuZSAxOTkxCisKK0NvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKzU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0V2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGlzIGxpY2Vuc2UKK2RvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCisKK1ByZWFtYmxlCisKK1RoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIgZnJlZWRvbSB0byBzaGFyZQorYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW50ZW5kZWQgdG8KK2d1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVlIHNvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlCitzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLiAgVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8KK21vc3Qgb2YgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZQorYXV0aG9ycyBjb21taXQgdG8gdXNpbmcgaXQuICAoU29tZSBvdGhlciBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUgaXMKK2NvdmVyZWQgYnkgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZC4pIFlvdSBjYW4gYXBwbHkgaXQgdG8KK3lvdXIgcHJvZ3JhbXMsIHRvby4KKworV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdCBwcmljZS4gIE91cgorR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIHRoZSBmcmVlZG9tIHRvCitkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvciB0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLAordGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0IGlmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlCit0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdCBpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91CitjYW4gZG8gdGhlc2UgdGhpbmdzLgorCitUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkIGFueW9uZSB0byBkZW55Cit5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuICBUaGVzZSByZXN0cmljdGlvbnMKK3RyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCitzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlciBncmF0aXMgb3IgZm9yCithIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0IHlvdSBoYXZlLiAgWW91IG11c3QKK21ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZSBzb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdAorc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpciByaWdodHMuCisKK1dlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQgdGhlIHNvZnR3YXJlLCBhbmQgKDIpCitvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUKK2FuZC9vciBtb2RpZnkgdGhlIHNvZnR3YXJlLgorCitBbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFuZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbiB0aGF0CitldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUgc29mdHdhcmUuICBJZiB0aGUKK3NvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZSB3YW50IGl0cyByZWNpcGllbnRzIHRvCitrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28gdGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZAorYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsIGF1dGhvcnMnIHJlcHV0YXRpb25zLgorCitGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZSBwYXRlbnRzLiAgV2UKK3dpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZSBwcm9ncmFtIHdpbGwKK2luZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCBpbiBlZmZlY3QgbWFraW5nIHRoZSBwcm9ncmFtIHByb3ByaWV0YXJ5LgorVG8gcHJldmVudCB0aGlzLCB3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkgcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yCitldmVyeW9uZSdzIGZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCisKK1RoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbgorZm9sbG93LgorCitURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KKworMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucyBhIG5vdGljZQorcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mCit0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUgIlByb2dyYW0iLCBiZWxvdywgcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0KK29yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIiBtZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55CitkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzogdGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZQorUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsIGVpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yCit0cmFuc2xhdGVkIGludG8gYW5vdGhlciBsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQKK3dpdGhvdXQgbGltaXRhdGlvbiBpbiB0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzCisieW91Ii4KKworQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QgY292ZXJlZCBieQordGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YgcnVubmluZyB0aGUgUHJvZ3JhbSBpcworbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0gaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cworY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0gKGluZGVwZW5kZW50IG9mIGhhdmluZyBiZWVuIG1hZGUgYnkKK3J1bm5pbmcgdGhlIFByb2dyYW0pLiAgV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCisKKzEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncyBzb3VyY2UgY29kZSBhcworeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91IGNvbnNwaWN1b3VzbHkgYW5kCithcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kCitkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UKK2FuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7IGFuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZQorUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIFByb2dyYW0uCisKK1lvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZCB5b3UgbWF5CithdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KKworMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbiBvZiBpdCwgdGh1cworZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZCBkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucworb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxIGFib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mCit0aGVzZSBjb25kaXRpb25zOgorCisgICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKKyAgICB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KKworICAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbiB3aG9sZSBvcgorICAgIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueSBwYXJ0IHRoZXJlb2YsIHRvIGJlCisgICAgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mCisgICAgdGhpcyBMaWNlbnNlLgorCisgICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseSB3aGVuIHJ1biwKKyAgICB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2ggaW50ZXJhY3RpdmUgdXNlIGluIHRoZQorICAgIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4KKyAgICBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvcgorICAgIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heSByZWRpc3RyaWJ1dGUKKyAgICB0aGUgcHJvZ3JhbSB1bmRlciB0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkKKyAgICBvZiB0aGlzIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0IGRvZXMKKyAgICBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSBpcworICAgIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQorCitUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmIGlkZW50aWZpYWJsZQorc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLCBhbmQgY2FuIGJlIHJlYXNvbmFibHkKK2NvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluIHRoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQKK2l0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlIHNlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZQord29ya3MuICBCdXQgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYQord29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMKK29mIHRoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlIGVudGlyZQord2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCisKK1RodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdCB5b3VyCityaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvIGV4ZXJjaXNlIHRoZQorcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IgY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbgordGhlIFByb2dyYW0uCisKK0luIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0gd2l0aCB0aGUKK1Byb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZiBhIHN0b3JhZ2Ugb3IKK2Rpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIgdGhlIHNjb3BlIG9mIHRoaXMKK0xpY2Vuc2UuCisKKzMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LCB1bmRlcgorU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kCisyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKKyAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZQorICAgIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUKKyAgICBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZSB5ZWFycywgdG8KKyAgICBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyIGNvc3Qgb2YgcGh5c2ljYWxseQorICAgIHBlcmZvcm1pbmcgc291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZSBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlCisgICAgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEKKyAgICBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBjKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHRoZSBvZmZlciB0bworICAgIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gIChUaGlzIGFsdGVybmF0aXZlIGlzIGFsbG93ZWQgb25seQorICAgIGZvciBub25jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbiBhbmQgb25seSBpZiB5b3UgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4KKyAgICBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gd2l0aCBzdWNoIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aAorICAgIFN1YnNlY3Rpb24gYiBhYm92ZS4pCisKK1RoZSBzb3VyY2UgY29kZSBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IgbWFraW5nCittb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlIGNvZGUgbWVhbnMgYWxsCit0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueSBhc3NvY2lhdGVkIGludGVyZmFjZQorZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvIGNvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbgorb2YgdGhlIGV4ZWN1dGFibGUuICBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUKK2Rpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUgYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyCitzb3VyY2Ugb3IgYmluYXJ5IGZvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikKK29mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAoraXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLgorCitJZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcyB0byBjb3B5Citmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UKK2NvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMgZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2gKK3RoaXJkIHBhcnRpZXMgYXJlIG5vdCBjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgorCis0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gZXhjZXB0IGFzCitleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQgb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwKK3N1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcyB2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZQoreW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLiAgSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yCityaWdodHMsIGZyb20geW91IHVuZGVyIHRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28KK2xvbmcgYXMgc3VjaCBwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCisKKzUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdCBzaWduZWQgaXQuCitIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCitvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlIHByb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QKK2FjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5IG1vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yCithbnkgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvCitkbyBzbywgYW5kIGFsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKK3RoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgorCis2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pLAordGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZSBvcmlnaW5hbCBsaWNlbnNvciB0bworY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0byB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4KK1lvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlciByZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZQorcmlnaHRzIGdyYW50ZWQgaGVyZWluLiAgWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5Cit0aGlyZCBwYXJ0aWVzIHRvIHRoaXMgTGljZW5zZS4KKworNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAoraW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwgY29uZGl0aW9ucworYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3Igb3RoZXJ3aXNlKSB0aGF0Citjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QgZXhjdXNlIHlvdSBmcm9tIHRoZQorY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90IGRpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeQorc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIExpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQKK29ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91IG1heSBub3QgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBhdCBhbGwuCitGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQgbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbgorb2YgdGhlIFByb2dyYW0gYnkgYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2gKK3lvdSwgdGhlbiB0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCityZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtLgorCitJZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYW55CitwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gYXBwbHkgYW5kCit0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyIGNpcmN1bXN0YW5jZXMuCisKK0l0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkgcGF0ZW50cyBvcgorb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55IHN1Y2ggY2xhaW1zOyB0aGlzCitzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlIGludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZQorZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMgaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueQorcGVvcGxlIGhhdmUgbWFkZSBnZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlCitkaXN0cmlidXRlZCB0aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAorc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZyB0bworZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90IGltcG9zZSB0aGF0CitjaG9pY2UuCisKK1RoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0byBiZSBhCitjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCisKKzguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluIGNlcnRhaW4KK2NvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUgb3JpZ2luYWwKK2NvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UgbWF5IGFkZCBhbiBleHBsaWNpdAorZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZyB0aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQKK2Rpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZyBjb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbgorc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzIHRoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkKK29mIHRoaXMgTGljZW5zZS4KKworOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMgb2YgdGhlCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbCBiZSBzaW1pbGFyIGluCitzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvIGFkZHJlc3MgbmV3IHByb2JsZW1zCitvciBjb25jZXJucy4KKworRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQorc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkgbGF0ZXIKK3ZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZWl0aGVyIG9mCit0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCitJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlLCB5b3UgbWF5CitjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZSBwcm9ncmFtcword2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvciB0byBhc2sgZm9yCitwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCit3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMgbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLgorT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMgb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YKK2FsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQgb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZgorc29mdHdhcmUgZ2VuZXJhbGx5LgorCitOTyBXQVJSQU5UWQorCisxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkgRk9SCitUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTiBPVEhFUldJU0UKK1NUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUyBQUk9WSURFIFRIRQorUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwKK0lOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORAorUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFIFBST0dSQU0gUFJPVkUgREVGRUNUSVZFLAorWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKzEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcgV0lMTAorQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IgUkVESVNUUklCVVRFIFRIRQorUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsIElOQ0xVRElORyBBTlkKK0dFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT1IKK0lOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEKK0JFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBCitGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIgUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSCitPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisKK0VORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCitIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKKworSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdCBwb3NzaWJsZQordXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdCBmcmVlIHNvZnR3YXJlCit3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCisKK1RvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0IHRvIGF0dGFjaAordGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5IGNvbnZleSB0aGUgZXhjbHVzaW9uCitvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdCB0aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYQorcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCisKKyAgICBPbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4KKworICAgIENvcHlyaWdodCAoQykgPHllYXI+IDxuYW1lIG9mIGF1dGhvcj4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAgICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgICAgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICAgIFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgorCitJZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzIHdoZW4gaXQKK3N0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgorCisgICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSB5ZWFyIG5hbWUgb2YgYXV0aG9yIEdub21vdmlzaW9uIGNvbWVzCisgICAgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlICdzaG93IHcnLiAgVGhpcyBpcyBmcmVlCisgICAgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0IHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsKKyAgICB0eXBlICdzaG93IGMnIGZvciBkZXRhaWxzLgorCitUaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzICdzaG93IHcnIGFuZCAnc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUKK3BhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgT2YgY291cnNlLCB0aGUgY29tbWFuZHMgeW91IHVzZSBtYXkgYmUKK2NhbGxlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiAnc2hvdyB3JyBhbmQgJ3Nob3cgYyc7IHRoZXkgY291bGQgZXZlbiBiZQorbW91c2UtY2xpY2tzIG9yIG1lbnUgaXRlbXMtLXdoYXRldmVyIHN1aXRzIHlvdXIgcHJvZ3JhbS4KKworWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIgc2Nob29sLAoraWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmIG5lY2Vzc2FyeS4gIEhlcmUKK2lzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6CisKKyAgICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZSBwcm9ncmFtCisgICAgJ0dub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCisKKyAgICBzaWduYXR1cmUgb2YgVHkgQ29vbiwgMSBBcHJpbCAxOTg5CisKKyAgICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQorCitUaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KK3Byb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5Citjb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKK2xpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuCisKKworIkNMQVNTUEFUSCIgRVhDRVBUSU9OIFRPIFRIRSBHUEwKKworQ2VydGFpbiBzb3VyY2UgZmlsZXMgZGlzdHJpYnV0ZWQgYnkgT3JhY2xlIEFtZXJpY2EgYW5kL29yIGl0cyBhZmZpbGlhdGVzIGFyZQorc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNsYXJpZmljYXRpb24gYW5kIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwsIGJ1dAorb25seSB3aGVyZSBPcmFjbGUgaGFzIGV4cHJlc3NseSBpbmNsdWRlZCBpbiB0aGUgcGFydGljdWxhciBzb3VyY2UgZmlsZSdzIGhlYWRlcgordGhlIHdvcmRzICJPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgorZXhjZXB0aW9uIGFzIHByb3ZpZGVkIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLiIKKworICAgIExpbmtpbmcgdGhpcyBsaWJyYXJ5IHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHkgd2l0aCBvdGhlciBtb2R1bGVzIGlzIG1ha2luZworICAgIGEgY29tYmluZWQgd29yayBiYXNlZCBvbiB0aGlzIGxpYnJhcnkuICBUaHVzLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY292ZXIgdGhlIHdob2xlIGNvbWJpbmF0aW9uLgorCisgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgbGlicmFyeSBnaXZlIHlvdQorICAgIHBlcm1pc3Npb24gdG8gbGluayB0aGlzIGxpYnJhcnkgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzIHRvIHByb2R1Y2UgYW4KKyAgICBleGVjdXRhYmxlLCByZWdhcmRsZXNzIG9mIHRoZSBsaWNlbnNlIHRlcm1zIG9mIHRoZXNlIGluZGVwZW5kZW50IG1vZHVsZXMsCisgICAgYW5kIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50IG1vZHVsZSwKKyAgICB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuICBBbiBpbmRlcGVuZGVudAorICAgIG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIG9yIGJhc2VkIG9uIHRoaXMgbGlicmFyeS4gIElmCisgICAgeW91IG1vZGlmeSB0aGlzIGxpYnJhcnksIHlvdSBtYXkgZXh0ZW5kIHRoaXMgZXhjZXB0aW9uIHRvIHlvdXIgdmVyc2lvbiBvZgorICAgIHRoZSBsaWJyYXJ5LCBidXQgeW91IGFyZSBub3Qgb2JsaWdhdGVkIHRvIGRvIHNvLiAgSWYgeW91IGRvIG5vdCB3aXNoIHRvIGRvCisgICAgc28sIGRlbGV0ZSB0aGlzIGV4Y2VwdGlvbiBzdGF0ZW1lbnQgZnJvbSB5b3VyIHZlcnNpb24uCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTm90aWNlcyBmb3IgZmlsZShzKToKKy9saWIvZDguamFyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoaXMgZmlsZSBsaXN0cyBhbGwgbGljZW5zZXMgZm9yIGNvZGUgZGlzdHJpYnV0ZWQuCitBbGwgbm9uLWxpYnJhcnkgY29kZSBoYXMgdGhlIGZvbGxvd2luZyAzLUNsYXVzZSBCU0QgbGljZW5zZS4KKworCitDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBSOCBwcm9qZWN0IGF1dGhvcnMuCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKK0FORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKK0lNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKK0RBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCitTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKK09SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCitPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitTdW1tYXJ5IG9mIGRpc3RyaWJ1dGVkIGxpYnJhcmllczoKKworLSBhcnRpZmFjdDogY29tLmdvb2dsZS5ndWF2YTpndWF2YTorCisgIG5hbWU6IEd1YXZhIEdvb2dsZSBDb3JlIExpYnJhcmllcyBmb3IgSmF2YQorICBjb3B5cmlnaHRIb2xkZXI6IFRoZSBHdWF2YSBBdXRob3JzCisgIGxpY2Vuc2U6IFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgbGljZW5zZVVybDogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dAorLSBhcnRpZmFjdDogY29tLmdvb2dsZS5jb2RlLmdzb246Z3NvbjorCisgIG5hbWU6IEdzb24KKyAgbGljZW5zZTogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICBsaWNlbnNlVXJsOiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0CisgIHVybDogaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9nc29uCistIGFydGlmYWN0OiBpdC51bmltaS5kc2k6ZmFzdHV0aWw6KworICBuYW1lOiBmYXN0dXRpbAorICBsaWNlbnNlOiBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgbGljZW5zZVVybDogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLmh0bWwKKyAgdXJsOiBodHRwOi8vZmFzdXRpbC5kaS51bmltaS5pdC8KKy0gYXJ0aWZhY3Q6IG5ldC5zZi5qb3B0LXNpbXBsZTpqb3B0LXNpbXBsZTorCisgIG5hbWU6IEpPcHQgU2ltcGxlCisgIGxpY2Vuc2U6IFRoZSBNSVQgTGljZW5zZQorICBsaWNlbnNlVXJsOiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocAorICB1cmw6IGh0dHA6Ly9waG9sc2VyLmdpdGh1Yi5jb20vam9wdC1zaW1wbGUKKy0gYXJ0aWZhY3Q6IG9yZy5vdzIuYXNtOmFzbS1jb21tb25zOisKKyAgbmFtZTogQVNNIENvbW1vbnMKKyAgY29weXJpZ2h0SG9sZGVyOiBJTlJJQSwgRnJhbmNlIFRlbGVjb20KKyAgbGljZW5zZTogQVNNIGxpY2Vuc2UKKyAgbGljZW5zZVVybDogaHR0cDovL2FzbS5vdzIub3JnL2xpY2Vuc2UuaHRtbAorICB1cmw6IGh0dHA6Ly9hc20ub3cyLm9yZy9pbmRleC5odG1sCistIGFydGlmYWN0OiBvcmcub3cyLmFzbTphc20tdHJlZTorCisgIG5hbWU6IEFTTSBUcmVlCisgIGNvcHlyaWdodEhvbGRlcjogSU5SSUEsIEZyYW5jZSBUZWxlY29tCisgIGxpY2Vuc2U6IEFTTSBsaWNlbnNlCisgIGxpY2Vuc2VVcmw6IGh0dHA6Ly9hc20ub3cyLm9yZy9saWNlbnNlLmh0bWwKKyAgdXJsOiBodHRwOi8vYXNtLm93Mi5vcmcvaW5kZXguaHRtbAorLSBhcnRpZmFjdDogb3JnLm93Mi5hc206YXNtLXV0aWw6KworICBuYW1lOiBBU00gVXRpbAorICBjb3B5cmlnaHRIb2xkZXI6IElOUklBLCBGcmFuY2UgVGVsZWNvbQorICBsaWNlbnNlOiBBU00gbGljZW5zZQorICBsaWNlbnNlVXJsOiBodHRwOi8vYXNtLm93Mi5vcmcvbGljZW5zZS5odG1sCisgIHVybDogaHR0cDovL2FzbS5vdzIub3JnL2luZGV4Lmh0bWwKKy0gYXJ0aWZhY3Q6IG9yZy5vdzIuYXNtOmFzbS1hbmFseXNpczorCisgIG5hbWU6IEFTTSBVdGlsCisgIGNvcHlyaWdodEhvbGRlcjogSU5SSUEsIEZyYW5jZSBUZWxlY29tCisgIGxpY2Vuc2U6IEFTTSBsaWNlbnNlCisgIGxpY2Vuc2VVcmw6IGh0dHA6Ly9hc20ub3cyLm9yZy9saWNlbnNlLmh0bWwKKyAgdXJsOiBodHRwOi8vYXNtLm93Mi5vcmcvaW5kZXguaHRtbAorLSBhcnRpZmFjdDogb3JnLm93Mi5hc206YXNtOisKKyAgbmFtZTogQVNNIENvcmUKKyAgY29weXJpZ2h0SG9sZGVyOiBJTlJJQSwgRnJhbmNlIFRlbGVjb20KKyAgbGljZW5zZTogQVNNIGxpY2Vuc2UKKyAgbGljZW5zZVVybDogaHR0cDovL2FzbS5vdzIub3JnL2xpY2Vuc2UuaHRtbAorICB1cmw6IGh0dHA6Ly9hc20ub3cyLm9yZy9pbmRleC5odG1sCistIGFydGlmYWN0OiBvcmcuamV0YnJhaW5zLmtvdGxpbjprb3RsaW4tc3RkbGliOisKKyAgbmFtZTogb3JnLmpldGJyYWlucy5rb3RsaW46a290bGluLXN0ZGxpYgorICBjb3B5cmlnaHRIb2xkZXI6IEpldEJyYWlucyBzLnIuby4KKyAgbGljZW5zZTogVGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICBsaWNlbnNlVXJsOiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0CisgIHVybDogaHR0cHM6Ly9rb3RsaW5sYW5nLm9yZy8KKy0gYXJ0aWZhY3Q6IG9yZy5qZXRicmFpbnMua290bGluOmtvdGxpbi1zdGRsaWItY29tbW9uOisKKyAgbmFtZTogb3JnLmpldGJyYWlucy5rb3RsaW46a290bGluLXN0ZGxpYgorICBjb3B5cmlnaHRIb2xkZXI6IEpldEJyYWlucyBzLnIuby4KKyAgbGljZW5zZTogVGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICBsaWNlbnNlVXJsOiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0CisgIHVybDogaHR0cHM6Ly9rb3RsaW5sYW5nLm9yZy8KKy0gYXJ0aWZhY3Q6IG9yZy5qZXRicmFpbnMua290bGlueDprb3RsaW54LW1ldGFkYXRhLWp2bTorCisgIG5hbWU6IG9yZy5qZXRicmFpbnMua290bGlueDprb3RsaW54LW1ldGFkYXRhLWp2bQorICBjb3B5cmlnaHRIb2xkZXI6IEpldEJyYWlucyBzLnIuby4KKyAgbGljZW5zZTogVGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICBsaWNlbnNlVXJsOiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0CisgIHVybDogaHR0cHM6Ly9rb3RsaW5sYW5nLm9yZy8KKy0gYXJ0aWZhY3Q6IG9yZy5qZXRicmFpbnM6YW5ub3RhdGlvbnM6KworICBuYW1lOiBJbnRlbGxpSiBJREVBIEFubm90YXRpb25zCisgIGNvcHlyaWdodEhvbGRlcjogSmV0QnJhaW5zIHMuci5vLgorICBsaWNlbnNlOiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgIGxpY2Vuc2VVcmw6IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQKKyAgdXJsOiBodHRwOi8vd3d3LmpldGJyYWlucy5vcmcKKworCitMaWNlbnNlcyBkZXRhaWxzOgorCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKKyAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KKworICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKKyAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKKyAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCisgICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQorICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCisgICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCisgICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKKyAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KKworICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworQ29weXJpZ2h0IChjKSAyMDAwLTIwMTEgSU5SSUEsIEZyYW5jZSBUZWxlY29tCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworYXJlIG1ldDoKKworMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKzMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCitBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCitJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCitMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCitDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCitJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKK0FSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKK1RIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworQXBhY2hlIENvbW1vbnMgQ29tcHJlc3MKK0NvcHlyaWdodCAyMDAyLTIwMTYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKK1RoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYXQKK1RoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCisKK1RoZSBmaWxlcyBpbiB0aGUgcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29tcHJlc3MuYXJjaGl2ZXJzLnNldmVuegord2VyZSBkZXJpdmVkIGZyb20gdGhlIExaTUEgU0RLLCB2ZXJzaW9uIDkuMjAgKEMvIGFuZCBDUFAvN3ppcC8pLAord2hpY2ggaGFzIGJlZW4gcGxhY2VkIGluIHRoZSBwdWJsaWMgZG9tYWluOgorCisiTFpNQSBTREsgaXMgcGxhY2VkIGluIHRoZSBwdWJsaWMgZG9tYWluLiIgKGh0dHA6Ly93d3cuNy16aXAub3JnL3Nkay5odG1sKQorCisKKyBUaGUgTUlUIExpY2Vuc2UKKworIENvcHlyaWdodCAoYykgMjAwNC0yMDE2IFBhdWwgUi4gSG9sc2VyLCBKci4KKworIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQorIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KZGlmZiAtLWdpdCBhL2FhcHQgYi9hYXB0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ3Y2QzNjEKLS0tIC9kZXYvbnVsbAorKysgYi9hYXB0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FhcHQyIGIvYWFwdDIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGFiZTY0MgotLS0gL2Rldi9udWxsCisrKyBiL2FhcHQyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FhcmNoNjQtbGludXgtYW5kcm9pZC1sZCBiL2FhcmNoNjQtbGludXgtYW5kcm9pZC1sZApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mYWExMWY5Ci0tLSAvZGV2L251bGwKKysrIGIvYWFyY2g2NC1saW51eC1hbmRyb2lkLWxkCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FpZGwgYi9haWRsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUxNTZiZDkKLS0tIC9kZXYvbnVsbAorKysgYi9haWRsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Fwa3NpZ25lciBiL2Fwa3NpZ25lcgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMWE3NTI5Ci0tLSAvZGV2L251bGwKKysrIGIvYXBrc2lnbmVyCkBAIC0wLDAgKzEsODkgQEAKKyMhL2Jpbi9iYXNoCisjCisjIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgU2V0IHVwIHByb2cgdG8gYmUgdGhlIHBhdGggb2YgdGhpcyBzY3JpcHQsIGluY2x1ZGluZyBmb2xsb3dpbmcgc3ltbGlua3MsCisjIGFuZCBzZXQgdXAgcHJvZ2RpciB0byBiZSB0aGUgZnVsbHktcXVhbGlmaWVkIHBhdGhuYW1lIG9mIGl0cyBkaXJlY3RvcnkuCitwcm9nPSIkMCIKK3doaWxlIFsgLWggIiR7cHJvZ30iIF07IGRvCisgICAgbmV3UHJvZz1gL2Jpbi9scyAtbGQgIiR7cHJvZ30iYAorICAgIG5ld1Byb2c9YGV4cHIgIiR7bmV3UHJvZ30iIDogIi4qIC0+IFwoLipcKSQiYAorICAgIGlmIGV4cHIgIngke25ld1Byb2d9IiA6ICd4LycgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICBwcm9nPSIke25ld1Byb2d9IgorICAgIGVsc2UKKyAgICAgICAgcHJvZ2Rpcj1gZGlybmFtZSAiJHtwcm9nfSJgCisgICAgICAgIHByb2c9IiR7cHJvZ2Rpcn0vJHtuZXdQcm9nfSIKKyAgICBmaQorZG9uZQorb2xkd2Q9YHB3ZGAKK3Byb2dkaXI9YGRpcm5hbWUgIiR7cHJvZ30iYAorY2QgIiR7cHJvZ2Rpcn0iCitwcm9nZGlyPWBwd2RgCitwcm9nPSIke3Byb2dkaXJ9Ii9gYmFzZW5hbWUgIiR7cHJvZ30iYAorY2QgIiR7b2xkd2R9IgorCitqYXJmaWxlPWFwa3NpZ25lci5qYXIKK2xpYmRpcj0iJHByb2dkaXIiCisKK2lmIFsgISAtciAiJGxpYmRpci8kamFyZmlsZSIgXTsgdGhlbgorICAgICMgc2V0IGFwa3NpZ25lci5qYXIgbG9jYXRpb24gZm9yIHRoZSBTREsgY2FzZQorICAgIGxpYmRpcj0iJGxpYmRpci9saWIiCitmaQorCisKK2lmIFsgISAtciAiJGxpYmRpci8kamFyZmlsZSIgXTsgdGhlbgorICAgICMgc2V0IGFwa3NpZ25lci5qYXIgbG9jYXRpb24gZm9yIHRoZSBBbmRyb2lkIHRyZWUgY2FzZQorICAgIGxpYmRpcj1gZGlybmFtZSAiJHByb2dkaXIiYC9mcmFtZXdvcmsKK2ZpCisKK2lmIFsgISAtciAiJGxpYmRpci8kamFyZmlsZSIgXTsgdGhlbgorICAgIGVjaG8gYGJhc2VuYW1lICIkcHJvZyJgIjogY2FuJ3QgZmluZCAkamFyZmlsZSIKKyAgICBleGl0IDEKK2ZpCisKKyMgQnkgZGVmYXVsdCwgZ2l2ZSBhcGtzaWduZXIgYSBtYXggaGVhcCBzaXplIG9mIDEgZ2lnLiBUaGlzIGNhbiBiZSBvdmVycmlkZGVuCisjIGJ5IHVzaW5nIGEgIi1KIiBvcHRpb24gKHNlZSBiZWxvdykuCitkZWZhdWx0TXg9Ii1YbXgxMDI0TSIKKworIyBUaGUgZm9sbG93aW5nIHdpbGwgZXh0cmFjdCBhbnkgaW5pdGlhbCBwYXJhbWV0ZXJzIG9mIHRoZSBmb3JtCisjICItSjxzdHVmZj4iIGZyb20gdGhlIGNvbW1hbmQgbGluZSBhbmQgcGFzcyB0aGVtIHRvIHRoZSBKYXZhCisjIGludm9jYXRpb24gKGluc3RlYWQgb2YgdG8gYXBrc2lnbmVyKS4gVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSBmb3IgeW91IHRvIGFkZAorIyBhIGNvbW1hbmQtbGluZSBwYXJhbWV0ZXIgc3VjaCBhcyAiLUpYbXgyNTZNIiBpbiB5b3VyIHNjcmlwdHMsIGZvcgorIyBleGFtcGxlLiAiamF2YSIgKHdpdGggbm8gYXJncykgYW5kICJqYXZhIC1YIiBnaXZlIGEgc3VtbWFyeSBvZgorIyBhdmFpbGFibGUgb3B0aW9ucy4KKworamF2YU9wdHM9IiIKKword2hpbGUgZXhwciAieCQxIiA6ICd4LUonID4vZGV2L251bGw7IGRvCisgICAgb3B0PWBleHByICJ4JDEiIDogJ3gtSlwoLipcKSdgCisgICAgamF2YU9wdHM9IiR7amF2YU9wdHN9IC0ke29wdH0iCisgICAgaWYgZXhwciAieCR7b3B0fSIgOiAieFhteFswLTldIiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgIGRlZmF1bHRNeD0ibm8iCisgICAgZmkKKyAgICBzaGlmdAorZG9uZQorCitpZiBbICIke2RlZmF1bHRNeH0iICE9ICJubyIgXTsgdGhlbgorICAgIGphdmFPcHRzPSIke2phdmFPcHRzfSAke2RlZmF1bHRNeH0iCitmaQorCitpZiBbICIkT1NUWVBFIiA9ICJjeWd3aW4iIF07IHRoZW4KKyAgICAjIEZvciBDeWd3aW4sIGNvbnZlcnQgdGhlIGphcmZpbGUgcGF0aCBpbnRvIG5hdGl2ZSBXaW5kb3dzIHN0eWxlLgorICAgIGphcnBhdGg9YGN5Z3BhdGggLXcgIiRsaWJkaXIvJGphcmZpbGUiYAorZWxzZQorICAgIGphcnBhdGg9IiRsaWJkaXIvJGphcmZpbGUiCitmaQorCitleGVjIGphdmEgJGphdmFPcHRzIC1qYXIgIiRqYXJwYXRoIiAiJEAiCmRpZmYgLS1naXQgYS9hcm0tbGludXgtYW5kcm9pZGVhYmktbGQgYi9hcm0tbGludXgtYW5kcm9pZGVhYmktbGQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjBhMWQ4MQotLS0gL2Rldi9udWxsCisrKyBiL2FybS1saW51eC1hbmRyb2lkZWFiaS1sZApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iY2NfY29tcGF0IGIvYmNjX2NvbXBhdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xZDQ1MTFlCi0tLSAvZGV2L251bGwKKysrIGIvYmNjX2NvbXBhdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlLWxhbWJkYS1zdHVicy5qYXIgYi9jb3JlLWxhbWJkYS1zdHVicy5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMzMjlkMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtbGFtYmRhLXN0dWJzLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kOCBiL2Q4Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU4ZmJhYzUKLS0tIC9kZXYvbnVsbAorKysgYi9kOApAQCAtMCwwICsxLDg5IEBACisjIS9iaW4vYmFzaAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIFNldCB1cCBwcm9nIHRvIGJlIHRoZSBwYXRoIG9mIHRoaXMgc2NyaXB0LCBpbmNsdWRpbmcgZm9sbG93aW5nIHN5bWxpbmtzLAorIyBhbmQgc2V0IHVwIHByb2dkaXIgdG8gYmUgdGhlIGZ1bGx5LXF1YWxpZmllZCBwYXRobmFtZSBvZiBpdHMgZGlyZWN0b3J5LgorcHJvZz0iJDAiCit3aGlsZSBbIC1oICIke3Byb2d9IiBdOyBkbworICAgIG5ld1Byb2c9YC9iaW4vbHMgLWxkICIke3Byb2d9ImAKKyAgICBuZXdQcm9nPWBleHByICIke25ld1Byb2d9IiA6ICIuKiAtPiBcKC4qXCkkImAKKyAgICBpZiBleHByICJ4JHtuZXdQcm9nfSIgOiAneC8nID4vZGV2L251bGw7IHRoZW4KKyAgICAgICAgcHJvZz0iJHtuZXdQcm9nfSIKKyAgICBlbHNlCisgICAgICAgIHByb2dkaXI9YGRpcm5hbWUgIiR7cHJvZ30iYAorICAgICAgICBwcm9nPSIke3Byb2dkaXJ9LyR7bmV3UHJvZ30iCisgICAgZmkKK2RvbmUKK29sZHdkPWBwd2RgCitwcm9nZGlyPWBkaXJuYW1lICIke3Byb2d9ImAKK2NkICIke3Byb2dkaXJ9IgorcHJvZ2Rpcj1gcHdkYAorcHJvZz0iJHtwcm9nZGlyfSIvYGJhc2VuYW1lICIke3Byb2d9ImAKK2NkICIke29sZHdkfSIKKworamFyZmlsZT1kOC5qYXIKK2xpYmRpcj0iJHByb2dkaXIiCisKK2lmIFsgISAtciAiJGxpYmRpci8kamFyZmlsZSIgXTsgdGhlbgorICAgICMgc2V0IGQ4LmphciBsb2NhdGlvbiBmb3IgdGhlIFNESyBjYXNlCisgICAgbGliZGlyPSIkbGliZGlyL2xpYiIKK2ZpCisKKworaWYgWyAhIC1yICIkbGliZGlyLyRqYXJmaWxlIiBdOyB0aGVuCisgICAgIyBzZXQgZDguamFyIGxvY2F0aW9uIGZvciB0aGUgQW5kcm9pZCB0cmVlIGNhc2UKKyAgICBsaWJkaXI9YGRpcm5hbWUgIiRwcm9nZGlyImAvZnJhbWV3b3JrCitmaQorCitpZiBbICEgLXIgIiRsaWJkaXIvJGphcmZpbGUiIF07IHRoZW4KKyAgICBlY2hvIGBiYXNlbmFtZSAiJHByb2ciYCI6IGNhbid0IGZpbmQgJGphcmZpbGUiCisgICAgZXhpdCAxCitmaQorCisjIEJ5IGRlZmF1bHQsIGdpdmUgZDggYSBtYXggaGVhcCBzaXplIG9mIDIgZ2lncy4gVGhpcyBjYW4gYmUgb3ZlcnJpZGRlbgorIyBieSB1c2luZyBhICItSiIgb3B0aW9uIChzZWUgYmVsb3cpLgorZGVmYXVsdE14PSItWG14MkciCisKKyMgVGhlIGZvbGxvd2luZyB3aWxsIGV4dHJhY3QgYW55IGluaXRpYWwgcGFyYW1ldGVycyBvZiB0aGUgZm9ybQorIyAiLUo8c3R1ZmY+IiBmcm9tIHRoZSBjb21tYW5kIGxpbmUgYW5kIHBhc3MgdGhlbSB0byB0aGUgSmF2YQorIyBpbnZvY2F0aW9uIChpbnN0ZWFkIG9mIHRvIGQ4KS4gVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSBmb3IgeW91IHRvIGFkZAorIyBhIGNvbW1hbmQtbGluZSBwYXJhbWV0ZXIgc3VjaCBhcyAiLUpYbXgyNTZNIiBpbiB5b3VyIHNjcmlwdHMsIGZvcgorIyBleGFtcGxlLiAiamF2YSIgKHdpdGggbm8gYXJncykgYW5kICJqYXZhIC1YIiBnaXZlIGEgc3VtbWFyeSBvZgorIyBhdmFpbGFibGUgb3B0aW9ucy4KKworamF2YU9wdHM9IiIKKword2hpbGUgZXhwciAieCQxIiA6ICd4LUonID4vZGV2L251bGw7IGRvCisgICAgb3B0PWBleHByICJ4JDEiIDogJ3gtSlwoLipcKSdgCisgICAgamF2YU9wdHM9IiR7amF2YU9wdHN9IC0ke29wdH0iCisgICAgaWYgZXhwciAieCR7b3B0fSIgOiAieFhteFswLTldIiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgIGRlZmF1bHRNeD0ibm8iCisgICAgZmkKKyAgICBzaGlmdAorZG9uZQorCitpZiBbICIke2RlZmF1bHRNeH0iICE9ICJubyIgXTsgdGhlbgorICAgIGphdmFPcHRzPSIke2phdmFPcHRzfSAke2RlZmF1bHRNeH0iCitmaQorCitpZiBbICIkT1NUWVBFIiA9ICJjeWd3aW4iIF07IHRoZW4KKyAgICAjIEZvciBDeWd3aW4sIGNvbnZlcnQgdGhlIGphcmZpbGUgcGF0aCBpbnRvIG5hdGl2ZSBXaW5kb3dzIHN0eWxlLgorICAgIGphcnBhdGg9YGN5Z3BhdGggLXcgIiRsaWJkaXIvJGphcmZpbGUiYAorZWxzZQorICAgIGphcnBhdGg9IiRsaWJkaXIvJGphcmZpbGUiCitmaQorCitleGVjIGphdmEgJGphdmFPcHRzIC1jcCAiJGphcnBhdGgiIGNvbS5hbmRyb2lkLnRvb2xzLnI4LkQ4ICIkQCIKZGlmZiAtLWdpdCBhL2RleGR1bXAgYi9kZXhkdW1wCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY3YmJiM2IKLS0tIC9kZXYvbnVsbAorKysgYi9kZXhkdW1wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2R4IGIvZHgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjMyYWY0MwotLS0gL2Rldi9udWxsCisrKyBiL2R4CkBAIC0wLDAgKzEsODkgQEAKKyMhL2Jpbi9iYXNoCisjCisjIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgU2V0IHVwIHByb2cgdG8gYmUgdGhlIHBhdGggb2YgdGhpcyBzY3JpcHQsIGluY2x1ZGluZyBmb2xsb3dpbmcgc3ltbGlua3MsCisjIGFuZCBzZXQgdXAgcHJvZ2RpciB0byBiZSB0aGUgZnVsbHktcXVhbGlmaWVkIHBhdGhuYW1lIG9mIGl0cyBkaXJlY3RvcnkuCitwcm9nPSIkMCIKK3doaWxlIFsgLWggIiR7cHJvZ30iIF07IGRvCisgICAgbmV3UHJvZz1gL2Jpbi9scyAtbGQgIiR7cHJvZ30iYAorICAgIG5ld1Byb2c9YGV4cHIgIiR7bmV3UHJvZ30iIDogIi4qIC0+IFwoLipcKSQiYAorICAgIGlmIGV4cHIgIngke25ld1Byb2d9IiA6ICd4LycgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICBwcm9nPSIke25ld1Byb2d9IgorICAgIGVsc2UKKyAgICAgICAgcHJvZ2Rpcj1gZGlybmFtZSAiJHtwcm9nfSJgCisgICAgICAgIHByb2c9IiR7cHJvZ2Rpcn0vJHtuZXdQcm9nfSIKKyAgICBmaQorZG9uZQorb2xkd2Q9YHB3ZGAKK3Byb2dkaXI9YGRpcm5hbWUgIiR7cHJvZ30iYAorY2QgIiR7cHJvZ2Rpcn0iCitwcm9nZGlyPWBwd2RgCitwcm9nPSIke3Byb2dkaXJ9Ii9gYmFzZW5hbWUgIiR7cHJvZ30iYAorY2QgIiR7b2xkd2R9IgorCitqYXJmaWxlPWR4LmphcgorbGliZGlyPSIkcHJvZ2RpciIKKworaWYgWyAhIC1yICIkbGliZGlyLyRqYXJmaWxlIiBdOyB0aGVuCisgICAgIyBzZXQgZHguamFyIGxvY2F0aW9uIGZvciB0aGUgU0RLIGNhc2UKKyAgICBsaWJkaXI9IiRsaWJkaXIvbGliIgorZmkKKworCitpZiBbICEgLXIgIiRsaWJkaXIvJGphcmZpbGUiIF07IHRoZW4KKyAgICAjIHNldCBkeC5qYXIgbG9jYXRpb24gZm9yIHRoZSBBbmRyb2lkIHRyZWUgY2FzZQorICAgIGxpYmRpcj1gZGlybmFtZSAiJHByb2dkaXIiYC9mcmFtZXdvcmsKK2ZpCisKK2lmIFsgISAtciAiJGxpYmRpci8kamFyZmlsZSIgXTsgdGhlbgorICAgIGVjaG8gYGJhc2VuYW1lICIkcHJvZyJgIjogY2FuJ3QgZmluZCAkamFyZmlsZSIKKyAgICBleGl0IDEKK2ZpCisKKyMgQnkgZGVmYXVsdCwgZ2l2ZSBkeCBhIG1heCBoZWFwIHNpemUgb2YgMSBnaWcuIFRoaXMgY2FuIGJlIG92ZXJyaWRkZW4KKyMgYnkgdXNpbmcgYSAiLUoiIG9wdGlvbiAoc2VlIGJlbG93KS4KK2RlZmF1bHRNeD0iLVhteDEwMjRNIgorCisjIFRoZSBmb2xsb3dpbmcgd2lsbCBleHRyYWN0IGFueSBpbml0aWFsIHBhcmFtZXRlcnMgb2YgdGhlIGZvcm0KKyMgIi1KPHN0dWZmPiIgZnJvbSB0aGUgY29tbWFuZCBsaW5lIGFuZCBwYXNzIHRoZW0gdG8gdGhlIEphdmEKKyMgaW52b2NhdGlvbiAoaW5zdGVhZCBvZiB0byBkeCkuIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgZm9yIHlvdSB0byBhZGQKKyMgYSBjb21tYW5kLWxpbmUgcGFyYW1ldGVyIHN1Y2ggYXMgIi1KWG14MjU2TSIgaW4geW91ciBzY3JpcHRzLCBmb3IKKyMgZXhhbXBsZS4gImphdmEiICh3aXRoIG5vIGFyZ3MpIGFuZCAiamF2YSAtWCIgZ2l2ZSBhIHN1bW1hcnkgb2YKKyMgYXZhaWxhYmxlIG9wdGlvbnMuCisKK2phdmFPcHRzPSIiCisKK3doaWxlIGV4cHIgIngkMSIgOiAneC1KJyA+L2Rldi9udWxsOyBkbworICAgIG9wdD1gZXhwciAieCQxIiA6ICd4LUpcKC4qXCknYAorICAgIGphdmFPcHRzPSIke2phdmFPcHRzfSAtJHtvcHR9IgorICAgIGlmIGV4cHIgIngke29wdH0iIDogInhYbXhbMC05XSIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICBkZWZhdWx0TXg9Im5vIgorICAgIGZpCisgICAgc2hpZnQKK2RvbmUKKworaWYgWyAiJHtkZWZhdWx0TXh9IiAhPSAibm8iIF07IHRoZW4KKyAgICBqYXZhT3B0cz0iJHtqYXZhT3B0c30gJHtkZWZhdWx0TXh9IgorZmkKKworaWYgWyAiJE9TVFlQRSIgPSAiY3lnd2luIiBdOyB0aGVuCisgICAgIyBGb3IgQ3lnd2luLCBjb252ZXJ0IHRoZSBqYXJmaWxlIHBhdGggaW50byBuYXRpdmUgV2luZG93cyBzdHlsZS4KKyAgICBqYXJwYXRoPWBjeWdwYXRoIC13ICIkbGliZGlyLyRqYXJmaWxlImAKK2Vsc2UKKyAgICBqYXJwYXRoPSIkbGliZGlyLyRqYXJmaWxlIgorZmkKKworZXhlYyBqYXZhICRqYXZhT3B0cyAtamFyICIkamFycGF0aCIgIiRAIgpkaWZmIC0tZ2l0IGEvaTY4Ni1saW51eC1hbmRyb2lkLWxkIGIvaTY4Ni1saW51eC1hbmRyb2lkLWxkCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjczZDBiMmEKLS0tIC9kZXYvbnVsbAorKysgYi9pNjg2LWxpbnV4LWFuZHJvaWQtbGQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL2Fwa3NpZ25lci5qYXIgYi9saWIvYXBrc2lnbmVyLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjM4ZGU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2Fwa3NpZ25lci5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL2Q4LmphciBiL2xpYi9kOC5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ3Y2M3NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kOC5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL2R4LmphciBiL2xpYi9keC5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUwYWVjMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9keC5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3Nocmlua2VkQW5kcm9pZC5qYXIgYi9saWIvc2hyaW5rZWRBbmRyb2lkLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWYyODQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3Nocmlua2VkQW5kcm9pZC5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliNjQvbGliTExWTV9hbmRyb2lkLmR5bGliIGIvbGliNjQvbGliTExWTV9hbmRyb2lkLmR5bGliCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZTZjMDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWI2NC9saWJMTFZNX2FuZHJvaWQuZHlsaWIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliNjQvbGliYWFwdDJfam5pLmR5bGliIGIvbGliNjQvbGliYWFwdDJfam5pLmR5bGliCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjAxYWMzM2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWI2NC9saWJhYXB0Ml9qbmkuZHlsaWIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliNjQvbGliYmNjLmR5bGliIGIvbGliNjQvbGliYmNjLmR5bGliCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk3OTU0ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWI2NC9saWJiY2MuZHlsaWIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliNjQvbGliYmNpbmZvLmR5bGliIGIvbGliNjQvbGliYmNpbmZvLmR5bGliCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUyNzU5ODYKLS0tIC9kZXYvbnVsbAorKysgYi9saWI2NC9saWJiY2luZm8uZHlsaWIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliNjQvbGliYysrLmR5bGliIGIvbGliNjQvbGliYysrLmR5bGliCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE5Nzk0NGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWI2NC9saWJjKysuZHlsaWIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliNjQvbGliY2xhbmdfYW5kcm9pZC5keWxpYiBiL2xpYjY0L2xpYmNsYW5nX2FuZHJvaWQuZHlsaWIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI0OGU4ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYjY0L2xpYmNsYW5nX2FuZHJvaWQuZHlsaWIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGxkIGIvbGxkCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE3MmU5OTkKLS0tIC9kZXYvbnVsbAorKysgYi9sbGQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGx2bS1ycy1jYyBiL2xsdm0tcnMtY2MKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWY3MzBkNwotLS0gL2Rldi9udWxsCisrKyBiL2xsdm0tcnMtY2MKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWFpbkRleENsYXNzZXMgYi9tYWluRGV4Q2xhc3NlcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MDkyYTkxCi0tLSAvZGV2L251bGwKKysrIGIvbWFpbkRleENsYXNzZXMKQEAgLTAsMCArMSwxODAgQEAKKyMhL2Jpbi9iYXNoCisjCisjIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2Z1bmN0aW9uIG1ha2VUZW1wSmFyICgpCit7CisgIGxvY2FsIHRlbXBEaXI9L3RtcAorICBpZiBbICEgLWUgIiR7dGVtcERpcn0iIF07IHRoZW4KKyAgICB0ZW1wRGlyPS4KKyAgZmkKKyAgbG9jYWwgdGVtcGZpbGU9IiR7dGVtcERpcn0vbWFpbkRleENsYXNzZXMtJCQudG1wLmphciIKKyAgaWYgWyAtZSAiJHt0ZW1wZmlsZX0iIF07IHRoZW4KKyAgICBlY2hvICJGYWlsZWQgdG8gY3JlYXRlIHRlbXBvcmFyeSBmaWxlIiA+MgorICAgIGV4aXQgNgorICBmaQorICBlY2hvICIke3RlbXBmaWxlfSIKK30KKworZnVuY3Rpb24gY2xlYW5UbXAgKCkKK3sKKyAgaWYgWyAtZSAiJHt0bXBPdXR9IiBdIDsgdGhlbgorICAgIHJtICIke3RtcE91dH0iCisgIGZpCit9CisKKworIyBTZXQgdXAgcHJvZyB0byBiZSB0aGUgcGF0aCBvZiB0aGlzIHNjcmlwdCwgaW5jbHVkaW5nIGZvbGxvd2luZyBzeW1saW5rcywKKyMgYW5kIHNldCB1cCBwcm9nZGlyIHRvIGJlIHRoZSBmdWxseS1xdWFsaWZpZWQgcGF0aG5hbWUgb2YgaXRzIGRpcmVjdG9yeS4KK3Byb2c9IiQwIgorCit3aGlsZSBbIC1oICIke3Byb2d9IiBdOyBkbworICAgIG5ld1Byb2c9YC9iaW4vbHMgLWxkICIke3Byb2d9ImAKKyAgICBuZXdQcm9nPWBleHByICIke25ld1Byb2d9IiA6ICIuKiAtPiBcKC4qXCkkImAKKyAgICBpZiBleHByICJ4JHtuZXdQcm9nfSIgOiAneC8nID4vZGV2L251bGw7IHRoZW4KKyAgICAgICAgcHJvZz0iJHtuZXdQcm9nfSIKKyAgICBlbHNlCisgICAgICAgIHByb2dkaXI9YGRpcm5hbWUgIiR7cHJvZ30iYAorICAgICAgICBwcm9nPSIke3Byb2dkaXJ9LyR7bmV3UHJvZ30iCisgICAgZmkKK2RvbmUKK29sZHdkPWBwd2RgCitwcm9nZGlyPWBkaXJuYW1lICIke3Byb2d9ImAKK2NkICIke3Byb2dkaXJ9IgorcHJvZ2Rpcj1gcHdkYAorcHJvZz0iJHtwcm9nZGlyfSIvYGJhc2VuYW1lICIke3Byb2d9ImAKK2NkICIke29sZHdkfSIKKworYmFzZXJ1bGVzPSIke3Byb2dkaXJ9Ii9tYWluRGV4Q2xhc3Nlcy5ydWxlcworaWYgWyAhIC1yICIke2Jhc2VydWxlc30iIF07IHRoZW4KKyAgICBlY2hvIGBiYXNlbmFtZSAiJHByb2ciYCI6IGNhbid0IGZpbmQgbWFpbkRleENsYXNzZXMucnVsZXMiIDE+JjIKKyAgICBleGl0IDEKK2ZpCisKK2V4dHJhcnVsZXM9IiR7cHJvZ2Rpcn0iL21haW5EZXhDbGFzc2VzTm9BYXB0LnJ1bGVzCitpZiBbICEgLXIgJHtleHRyYXJ1bGVzfSBdOyB0aGVuCisgICAgZWNobyBgYmFzZW5hbWUgIiRwcm9nImAiOiBjYW4ndCBmaW5kIG1haW5EZXhDbGFzc2VzTm9BYXB0LnJ1bGVzIiAxPiYyCisgICAgZXhpdCAxCitmaQorCitqYXJmaWxlPWR4LmphcgorbGliZGlyPSIkcHJvZ2RpciIKKworaWYgWyAhIC1yICIkbGliZGlyLyRqYXJmaWxlIiBdOyB0aGVuCisgICAgIyBzZXQgZHguamFyIGxvY2F0aW9uIGZvciB0aGUgU0RLIGNhc2UKKyAgICBsaWJkaXI9IiRsaWJkaXIvbGliIgorZmkKKworCitpZiBbICEgLXIgIiRsaWJkaXIvJGphcmZpbGUiIF07IHRoZW4KKyAgICAjIHNldCBkeC5qYXIgbG9jYXRpb24gZm9yIHRoZSBBbmRyb2lkIHRyZWUgY2FzZQorICAgIGxpYmRpcj1gZGlybmFtZSAiJHByb2dkaXIiYC9mcmFtZXdvcmsKK2ZpCisKK2lmIFsgISAtciAiJGxpYmRpci8kamFyZmlsZSIgXTsgdGhlbgorICAgIGVjaG8gYGJhc2VuYW1lICIkcHJvZyJgIjogY2FuJ3QgZmluZCAkamFyZmlsZSIgMT4mMgorICAgIGV4aXQgMQorZmkKKworcHJvZ3VhcmRFeGVjPSJwcm9ndWFyZC5zaCIKK3Byb2d1YXJkPSR7UFJPR1VBUkRfSE9NRX0vYmluLyR7cHJvZ3VhcmRFeGVjfQorCitpZiBbICEgLXIgIiR7cHJvZ3VhcmR9IiBdOyB0aGVuCisgICMgc2V0IHByb2d1YXJkIGxvY2F0aW9uIGZvciB0aGUgU0RLIGNhc2UKKyAgcHJvZ3VhcmRCYXNlRGlyPWBkaXJuYW1lICIkcHJvZ2RpciJgCisgICMgIiR7cHJvZ2Rpcn0iLy4uLy4uCisgIHByb2d1YXJkQmFzZURpcj1gZGlybmFtZSAiJHByb2d1YXJkQmFzZURpciJgCisgIHByb2d1YXJkPSIke3Byb2d1YXJkQmFzZURpcn0iL3Rvb2xzL3Byb2d1YXJkL2Jpbi8ke3Byb2d1YXJkRXhlY30KK2ZpCisKK2lmIFsgISAtciAiJHtwcm9ndWFyZH0iIF07IHRoZW4KKyAgIyBzZXQgcHJvZ3VhcmQgbG9jYXRpb24gZm9yIHRoZSBBbmRyb2lkIHRyZWUgY2FzZQorICBwcm9ndWFyZEJhc2VEaXI9YGRpcm5hbWUgIiRwcm9ndWFyZEJhc2VEaXIiYAorICAjICIke3Byb2dkaXJ9Ii8uLi8uLi8uLi8uLgorICBwcm9ndWFyZEJhc2VEaXI9YGRpcm5hbWUgIiRwcm9ndWFyZEJhc2VEaXIiYAorICBwcm9ndWFyZD0iJHtwcm9ndWFyZEJhc2VEaXJ9Ii9leHRlcm5hbC9wcm9ndWFyZC9iaW4vJHtwcm9ndWFyZEV4ZWN9CitmaQorCitpZiBbICEgLXIgIiR7cHJvZ3VhcmR9IiBdOyB0aGVuCisgIHByb2d1YXJkPSIke0FORFJPSURfQlVJTERfVE9QfSIvZXh0ZXJuYWwvcHJvZ3VhcmQvYmluLyR7cHJvZ3VhcmRFeGVjfQorZmkKKworaWYgWyAhIC1yICIke3Byb2d1YXJkfSIgXTsgdGhlbgorICAgIHByb2d1YXJkPSJgd2hpY2ggcHJvZ3VhcmRgIgorZmkKKworaWYgWyAteiAiJHtwcm9ndWFyZH0iIC1vICEgLXIgIiR7cHJvZ3VhcmR9IiBdOyB0aGVuCisgICAgcHJvZ3VhcmQ9ImB3aGljaCAke3Byb2d1YXJkRXhlY31gIgorZmkKKworaWYgWyAteiAiJHtwcm9ndWFyZH0iIC1vICEgLXIgIiR7cHJvZ3VhcmR9IiBdOyB0aGVuCisgICAgZWNobyBgYmFzZW5hbWUgIiRwcm9nImAiOiBjYW4ndCBmaW5kICR7cHJvZ3VhcmRFeGVjfSIgMT4mMgorICAgIGV4aXQgMQorZmkKKworc2hyaW5rZWRBbmRyb2lkSmFyPSIke1NIUklOS0VEX0FORFJPSURfSkFSfSIKK2lmIFsgLXogIiR7c2hyaW5rZWRBbmRyb2lkSmFyfSIgXTsgdGhlbgorICBzaHJpbmtlZEFuZHJvaWRKYXI9c2hyaW5rZWRBbmRyb2lkLmphcgorZmkKKworaWYgWyAhIC1yICIke3Nocmlua2VkQW5kcm9pZEphcn0iIF07IHRoZW4KKyAgc2hyaW5rZWRBbmRyb2lkSmFyPSR7bGliZGlyfS8ke3Nocmlua2VkQW5kcm9pZEphcn0KK2ZpCisKK2lmIFsgISAtciAiJHtzaHJpbmtlZEFuZHJvaWRKYXJ9IiBdOyB0aGVuCisgICAgZWNobyBgYmFzZW5hbWUgIiRwcm9nImAiOiBjYW4ndCBmaW5kIHNocmlua2VkQW5kcm9pZC5qYXIiIDE+JjIKKyAgICBleGl0IDEKK2ZpCisKK2lmIFsgIiRPU1RZUEUiID0gImN5Z3dpbiIgXTsgdGhlbgorICAgICMgRm9yIEN5Z3dpbiwgY29udmVydCB0aGUgamFyZmlsZSBwYXRoIGludG8gbmF0aXZlIFdpbmRvd3Mgc3R5bGUuCisgICAgamFycGF0aD1gY3lncGF0aCAtdyAiJGxpYmRpci8kamFyZmlsZSJgCisgIHByb2d1YXJkPWBjeWdwYXRoIC13ICIke3Byb2d1YXJkfSJgCisgIHNocmlua2VkQW5kcm9pZEphcj1gY3lncGF0aCAtdyAiJHtzaHJpbmtlZEFuZHJvaWRKYXJ9ImAKK2Vsc2UKKyAgICBqYXJwYXRoPSIkbGliZGlyLyRqYXJmaWxlIgorZmkKKworZGlzYWJsZUtlZXBBbm5vdGF0ZWQ9CisKK3doaWxlIHRydWU7IGRvCitpZiBleHByICJ4JDEiIDogJ3gtLW91dHB1dCcgPi9kZXYvbnVsbDsgdGhlbgorICAgIGV4ZWMgMT4kMgorICAgIHNoaWZ0IDIKK2VsaWYgZXhwciAieCQxIiA6ICd4LS1kaXNhYmxlLWFubm90YXRpb24tcmVzb2x1dGlvbi13b3JrYXJvdW5kJyA+L2Rldi9udWxsOyB0aGVuCisgICAgZGlzYWJsZUtlZXBBbm5vdGF0ZWQ9JDEKKyAgICBzaGlmdCAxCitlbGlmIGV4cHIgIngkMSIgOiAieC0tYWFwdC1ydWxlcyIgPi9kZXYvbnVsbDsgdGhlbgorICAgIGV4dHJhcnVsZXM9JDIKKyAgICBzaGlmdCAyCitlbHNlCisgICAgYnJlYWsKK2ZpCitkb25lCisKK2lmIFsgJCMgLW5lIDEgXTsgdGhlbgorICBlY2hvICJVc2FnZSA6ICQwIFstLW91dHB1dCA8b3V0cHV0IGZpbGU+XSA8YXBwbGljYXRpb24gcGF0aD4iIDE+JjIKKyAgZXhpdCAyCitmaQorCit0bXBPdXQ9YG1ha2VUZW1wSmFyYAorCit0cmFwIGNsZWFuVG1wIDAKKworIiR7cHJvZ3VhcmR9IiAtaW5qYXJzICR7QH0gLWRvbnR3YXJuIC1mb3JjZXByb2Nlc3NpbmcgIC1vdXRqYXJzICIke3RtcE91dH0iIFwKKyAgLWxpYnJhcnlqYXJzICIke3Nocmlua2VkQW5kcm9pZEphcn0iIC1kb250b3B0aW1pemUgLWRvbnRvYmZ1c2NhdGUgLWRvbnRwcmV2ZXJpZnkgXAorICAtaW5jbHVkZSAiJHtiYXNlcnVsZXN9IiAtaW5jbHVkZSAiJHtleHRyYXJ1bGVzfSIgMT4vZGV2L251bGwgfHwgZXhpdCAxMAorCitqYXZhIC1jcCAiJGphcnBhdGgiIGNvbS5hbmRyb2lkLm11bHRpZGV4Lk1haW5EZXhMaXN0QnVpbGRlciAke2Rpc2FibGVLZWVwQW5ub3RhdGVkfSAiJHt0bXBPdXR9IiAke0B9IHx8ICBleGl0IDExCmRpZmYgLS1naXQgYS9tYWluRGV4Q2xhc3Nlcy5ydWxlcyBiL21haW5EZXhDbGFzc2VzLnJ1bGVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZDM4NDIKLS0tIC9kZXYvbnVsbAorKysgYi9tYWluRGV4Q2xhc3Nlcy5ydWxlcwpAQCAtMCwwICsxLDIwIEBACisgIC1rZWVwIHB1YmxpYyBjbGFzcyAqIGV4dGVuZHMgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uIHsNCisgICAgPGluaXQ+KCk7DQorICB9DQorICAta2VlcCBwdWJsaWMgY2xhc3MgKiBleHRlbmRzIGFuZHJvaWQuYXBwLkFwcGxpY2F0aW9uIHsNCisgICAgPGluaXQ+KCk7DQorICAgIHZvaWQgYXR0YWNoQmFzZUNvbnRleHQoYW5kcm9pZC5jb250ZW50LkNvbnRleHQpOw0KKyAgfQ0KKyAgLWtlZXAgcHVibGljIGNsYXNzICogZXh0ZW5kcyBhbmRyb2lkLmFwcC5iYWNrdXAuQmFja3VwQWdlbnQgew0KKyAgIDxpbml0PigpOw0KKyAgfQ0KKyMgV2UgbmVlZCB0byBrZWVwIGFsbCBhbm5vdGF0aW9uIGNsYXNzZXMgYmVjYXVzZSBwcm9ndWFyZCBkb2VzIG5vdCB0cmFjZSBhbm5vdGF0aW9uIGF0dHJpYnV0ZQ0KKyMgaXQganVzdCBmaWx0ZXIgdGhlIGFubm90YXRpb24gYXR0cmlidXRlcyBhY2NvcmRpbmcgdG8gYW5ub3RhdGlvbiBjbGFzc2VzIGl0IGFscmVhZHkga2VwdC4NCisgIC1rZWVwIHB1YmxpYyBjbGFzcyAqIGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbiB7DQorICAgKjsNCisgIH0NCisjIEtlZXAgb2xkIGZhc2hpb24gdGVzdHMgaW4gdGhlIG1haW4gZGV4IG9yIHRoZXknbGwgYmUgc2lsZW50bHkgaWdub3JlZCBieSBJbnN0cnVtZW50YXRpb25UZXN0UnVubmVyDQorICAta2VlcCBwdWJsaWMgY2xhc3MgKiBleHRlbmRzIGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0Q2FzZSB7DQorICAgPGluaXQ+KCk7DQorICB9DQorDQpkaWZmIC0tZ2l0IGEvbWFpbkRleENsYXNzZXNOb0FhcHQucnVsZXMgYi9tYWluRGV4Q2xhc3Nlc05vQWFwdC5ydWxlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjkwYTVlCi0tLSAvZGV2L251bGwKKysrIGIvbWFpbkRleENsYXNzZXNOb0FhcHQucnVsZXMKQEAgLTAsMCArMSwxMyBAQAorICAta2VlcCBwdWJsaWMgY2xhc3MgKiBleHRlbmRzIGFuZHJvaWQuYXBwLkFjdGl2aXR5IHsKKyAgICA8aW5pdD4oKTsKKyAgfQorICAta2VlcCBwdWJsaWMgY2xhc3MgKiBleHRlbmRzIGFuZHJvaWQuYXBwLlNlcnZpY2UgeworICAgIDxpbml0PigpOworICB9CisgIC1rZWVwIHB1YmxpYyBjbGFzcyAqIGV4dGVuZHMgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlciB7CisgICA8aW5pdD4oKTsKKyAgfQorICAta2VlcCBwdWJsaWMgY2xhc3MgKiBleHRlbmRzIGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlciB7CisgICA8aW5pdD4oKTsKKyAgfQorCmRpZmYgLS1naXQgYS9taXBzZWwtbGludXgtYW5kcm9pZC1sZCBiL21pcHNlbC1saW51eC1hbmRyb2lkLWxkCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFkOTUwZGMKLS0tIC9kZXYvbnVsbAorKysgYi9taXBzZWwtbGludXgtYW5kcm9pZC1sZApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9DTWFrZUxpc3RzLnR4dCBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1N2VmN2UKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDEyOCBAQAorc2V0KGZpbGVzCisgIGFkeGludHJpbi5oCisgIGFsdGl2ZWMuaAorICBhbW1pbnRyaW4uaAorICBhcm1fYWNsZS5oCisgIGF2eDJpbnRyaW4uaAorICBhdng1MTJid2ludHJpbi5oCisgIGF2eDUxMmNkaW50cmluLmgKKyAgYXZ4NTEyZHFpbnRyaW4uaAorICBhdng1MTJlcmludHJpbi5oCisgIGF2eDUxMmZpbnRyaW4uaAorICBhdng1MTJpZm1haW50cmluLmgKKyAgYXZ4NTEyaWZtYXZsaW50cmluLmgKKyAgYXZ4NTEycGZpbnRyaW4uaAorICBhdng1MTJ2Ym1paW50cmluLmgKKyAgYXZ4NTEydmJtaXZsaW50cmluLmgKKyAgYXZ4NTEydmxid2ludHJpbi5oCisgIGF2eDUxMnZsY2RpbnRyaW4uaAorICBhdng1MTJ2bGRxaW50cmluLmgKKyAgYXZ4NTEydmxpbnRyaW4uaAorICBhdnhpbnRyaW4uaAorICBibWkyaW50cmluLmgKKyAgYm1paW50cmluLmgKKyAgX19jbGFuZ19jdWRhX2NtYXRoLmgKKyAgX19jbGFuZ19jdWRhX2ludHJpbnNpY3MuaAorICBfX2NsYW5nX2N1ZGFfbWF0aF9mb3J3YXJkX2RlY2xhcmVzLmgKKyAgX19jbGFuZ19jdWRhX3J1bnRpbWVfd3JhcHBlci5oCisgIGNwdWlkLmgKKyAgY3VkYV9idWlsdGluX3ZhcnMuaAorICBjbGZsdXNob3B0aW50cmluLmgKKyAgZW1taW50cmluLmgKKyAgZjE2Y2ludHJpbi5oCisgIGZsb2F0LmgKKyAgZm1hNGludHJpbi5oCisgIGZtYWludHJpbi5oCisgIGZ4c3JpbnRyaW4uaAorICBodG1pbnRyaW4uaAorICBodG14bGludHJpbi5oCisgIGlhMzJpbnRyaW4uaAorICBpbW1pbnRyaW4uaAorICBpbnRyaW4uaAorICBpbnR0eXBlcy5oCisgIGlzbzY0Ni5oCisgIGxpbWl0cy5oCisgIGx6Y250aW50cmluLmgKKyAgbW0zZG5vdy5oCisgIG1taW50cmluLmgKKyAgbW1fbWFsbG9jLmgKKyAgbW9kdWxlLm1vZHVsZW1hcAorICBtd2FpdHhpbnRyaW4uaAorICBubW1pbnRyaW4uaAorICBvcGVuY2wtYy5oCisgIHBrdWludHJpbi5oCisgIHBtbWludHJpbi5oCisgIHBvcGNudGludHJpbi5oCisgIHByZmNod2ludHJpbi5oCisgIHJkc2VlZGludHJpbi5oCisgIHJ0bWludHJpbi5oCisgIHMzOTBpbnRyaW4uaAorICBzaGFpbnRyaW4uaAorICBzbW1pbnRyaW4uaAorICBzdGRhbGlnbi5oCisgIHN0ZGFyZy5oCisgIHN0ZGF0b21pYy5oCisgIHN0ZGJvb2wuaAorICBzdGRkZWYuaAorICBfX3N0ZGRlZl9tYXhfYWxpZ25fdC5oCisgIHN0ZGludC5oCisgIHN0ZG5vcmV0dXJuLmgKKyAgdGJtaW50cmluLmgKKyAgdGdtYXRoLmgKKyAgdG1taW50cmluLmgKKyAgdW53aW5kLmgKKyAgdmFkZWZzLmgKKyAgdmFyYXJncy5oCisgIHZlY2ludHJpbi5oCisgIHdtbWludHJpbi5oCisgIF9fd21taW50cmluX2Flcy5oCisgIF9fd21taW50cmluX3BjbG11bC5oCisgIHg4NmludHJpbi5oCisgIHhtbWludHJpbi5oCisgIHhvcGludHJpbi5oCisgIHhzYXZlY2ludHJpbi5oCisgIHhzYXZlaW50cmluLmgKKyAgeHNhdmVvcHRpbnRyaW4uaAorICB4c2F2ZXNpbnRyaW4uaAorICB4dGVzdGludHJpbi5oCisgICkKKworc2V0KG91dHB1dF9kaXIgJHtMTFZNX0xJQlJBUllfT1VUUFVUX0lOVERJUn0vY2xhbmcvJHtDTEFOR19WRVJTSU9OfS9pbmNsdWRlKQorCisjIEdlbmVyYXRlIGFybV9uZW9uLmgKK2NsYW5nX3RhYmxlZ2VuKGFybV9uZW9uLmggLWdlbi1hcm0tbmVvbgorICBTT1VSQ0UgJHtDTEFOR19TT1VSQ0VfRElSfS9pbmNsdWRlL2NsYW5nL0Jhc2ljL2FybV9uZW9uLnRkKQorCitzZXQob3V0X2ZpbGVzKQorZm9yZWFjaCggZiAke2ZpbGVzfSApCisgIHNldCggc3JjICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8ke2Z9ICkKKyAgc2V0KCBkc3QgJHtvdXRwdXRfZGlyfS8ke2Z9ICkKKyAgYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCAke2RzdH0KKyAgICBERVBFTkRTICR7c3JjfQorICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5X2lmX2RpZmZlcmVudCAke3NyY30gJHtkc3R9CisgICAgQ09NTUVOVCAiQ29weWluZyBjbGFuZydzICR7Zn0uLi4iKQorICBsaXN0KEFQUEVORCBvdXRfZmlsZXMgJHtkc3R9KQorZW5kZm9yZWFjaCggZiApCisKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgJHtvdXRwdXRfZGlyfS9hcm1fbmVvbi5oIAorICBERVBFTkRTICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9hcm1fbmVvbi5oCisgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5X2lmX2RpZmZlcmVudCAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vYXJtX25lb24uaCAke291dHB1dF9kaXJ9L2FybV9uZW9uLmgKKyAgQ09NTUVOVCAiQ29weWluZyBjbGFuZydzIGFybV9uZW9uLmguLi4iKQorbGlzdChBUFBFTkQgb3V0X2ZpbGVzICR7b3V0cHV0X2Rpcn0vYXJtX25lb24uaCkKKworYWRkX2N1c3RvbV90YXJnZXQoY2xhbmctaGVhZGVycyBBTEwgREVQRU5EUyAke291dF9maWxlc30pCitzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoY2xhbmctaGVhZGVycyBQUk9QRVJUSUVTIEZPTERFUiAiTWlzYyIpCisKK2luc3RhbGwoCisgIEZJTEVTICR7ZmlsZXN9ICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9hcm1fbmVvbi5oCisgIENPTVBPTkVOVCBjbGFuZy1oZWFkZXJzCisgIFBFUk1JU1NJT05TIE9XTkVSX1JFQUQgT1dORVJfV1JJVEUgR1JPVVBfUkVBRCBXT1JMRF9SRUFECisgIERFU1RJTkFUSU9OIGxpYiR7TExWTV9MSUJESVJfU1VGRklYfS9jbGFuZy8ke0NMQU5HX1ZFUlNJT059L2luY2x1ZGUpCisKK2lmIChOT1QgQ01BS0VfQ09ORklHVVJBVElPTl9UWVBFUykgIyBkb24ndCBhZGQgdGhpcyBmb3IgSURFJ3MuCisgIGFkZF9jdXN0b21fdGFyZ2V0KGluc3RhbGwtY2xhbmctaGVhZGVycworICAgIERFUEVORFMgY2xhbmctaGVhZGVycworICAgIENPTU1BTkQgIiR7Q01BS0VfQ09NTUFORH0iCisgICAgICAgICAgICAtRENNQUtFX0lOU1RBTExfQ09NUE9ORU5UPWNsYW5nLWhlYWRlcnMKKyAgICAgICAgICAgIC1QICIke0NNQUtFX0JJTkFSWV9ESVJ9L2NtYWtlX2luc3RhbGwuY21ha2UiKQorZW5kaWYoKQpkaWZmIC0tZ2l0IGEvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvTElDRU5TRS5UWFQgYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9MSUNFTlNFLlRYVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDUyY2EyCi0tLSAvZGV2L251bGwKKysrIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvTElDRU5TRS5UWFQKQEAgLTAsMCArMSw2MyBAQAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitMTFZNIFJlbGVhc2UgTGljZW5zZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitVbml2ZXJzaXR5IG9mIElsbGlub2lzL05DU0EKK09wZW4gU291cmNlIExpY2Vuc2UKKworQ29weXJpZ2h0IChjKSAyMDA3LTIwMTYgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBhdCBVcmJhbmEtQ2hhbXBhaWduLgorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworRGV2ZWxvcGVkIGJ5OgorCisgICAgTExWTSBUZWFtCisKKyAgICBVbml2ZXJzaXR5IG9mIElsbGlub2lzIGF0IFVyYmFuYS1DaGFtcGFpZ24KKworICAgIGh0dHA6Ly9sbHZtLm9yZworCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCit0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCB3aXRoCit0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCit1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvCitzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXJzLgorCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVycyBpbiB0aGUKKyAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAqIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBMTFZNIFRlYW0sIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgYXQKKyAgICAgIFVyYmFuYS1DaGFtcGFpZ24sIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0bworICAgICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMKKyAgICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCitGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorQ09OVFJJQlVUT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBXSVRIIFRIRQorU09GVFdBUkUuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorVGhlIExMVk0gc29mdHdhcmUgY29udGFpbnMgY29kZSB3cml0dGVuIGJ5IHRoaXJkIHBhcnRpZXMuICBTdWNoIHNvZnR3YXJlIHdpbGwKK2hhdmUgaXRzIG93biBpbmRpdmlkdWFsIExJQ0VOU0UuVFhUIGZpbGUgaW4gdGhlIGRpcmVjdG9yeSBpbiB3aGljaCBpdCBhcHBlYXJzLgorVGhpcyBmaWxlIHdpbGwgZGVzY3JpYmUgdGhlIGNvcHlyaWdodHMsIGxpY2Vuc2UsIGFuZCByZXN0cmljdGlvbnMgd2hpY2ggYXBwbHkKK3RvIHRoYXQgY29kZS4KKworVGhlIGRpc2NsYWltZXIgb2Ygd2FycmFudHkgaW4gdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgTGljZW5zZQorYXBwbGllcyB0byBhbGwgY29kZSBpbiB0aGUgTExWTSBEaXN0cmlidXRpb24sIGFuZCBub3RoaW5nIGluIGFueSBvZiB0aGUKK290aGVyIGxpY2Vuc2VzIGdpdmVzIHBlcm1pc3Npb24gdG8gdXNlIHRoZSBuYW1lcyBvZiB0aGUgTExWTSBUZWFtIG9yIHRoZQorVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKK1NvZnR3YXJlLgorCitUaGUgZm9sbG93aW5nIHBpZWNlcyBvZiBzb2Z0d2FyZSBoYXZlIGFkZGl0aW9uYWwgb3IgYWx0ZXJuYXRlIGNvcHlyaWdodHMsCitsaWNlbnNlcywgYW5kL29yIHJlc3RyaWN0aW9uczoKKworUHJvZ3JhbSAgICAgICAgICAgICBEaXJlY3RvcnkKKy0tLS0tLS0gICAgICAgICAgICAgLS0tLS0tLS0tCis8bm9uZSB5ZXQ+CisKZGlmZiAtLWdpdCBhL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL19fY2xhbmdfY3VkYV9jbWF0aC5oIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvX19jbGFuZ19jdWRhX2NtYXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU3ZmYyZgotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL19fY2xhbmdfY3VkYV9jbWF0aC5oCkBAIC0wLDAgKzEsMTQ4IEBACisvKj09PS0tLS0gX19jbGFuZ19jdWRhX2NtYXRoLmggLSBEZXZpY2Utc2lkZSBDVURBIGNtYXRoIHN1cHBvcnQgLS0tLS0tLS0tLS0tPT09CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICoKKyAqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqLworI2lmbmRlZiBfX0NMQU5HX0NVREFfQ01BVEhfSF9fCisjZGVmaW5lIF9fQ0xBTkdfQ1VEQV9DTUFUSF9IX18KKyNpZm5kZWYgX19DVURBX18KKyNlcnJvciAiVGhpcyBmaWxlIGlzIGZvciBDVURBIGNvbXBpbGF0aW9uIG9ubHkuIgorI2VuZGlmCisKKy8vIENVREEgbGV0cyB1cyB1c2UgdmFyaW91cyBzdGQgbWF0aCBmdW5jdGlvbnMgb24gdGhlIGRldmljZSBzaWRlLiAgVGhpcyBmaWxlCisvLyB3b3JrcyBpbiBjb25jZXJ0IHdpdGggX19jbGFuZ19jdWRhX21hdGhfZm9yd2FyZF9kZWNsYXJlcy5oIHRvIG1ha2UgdGhpcyB3b3JrLgorLy8KKy8vIFNwZWNpZmljYWxseSwgdGhlIGZvcndhcmQtZGVjbGFyZXMgaGVhZGVyIGRlY2xhcmVzIF9fZGV2aWNlX18gb3ZlcmxvYWRzIGZvcgorLy8gdGhlc2UgZnVuY3Rpb25zIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlLCB0aGVuIHB1bGxzIHRoZW0gaW50byBuYW1lc3BhY2Ugc3RkCisvLyB3aXRoICd1c2luZycgc3RhdGVtZW50cy4gIFRoZW4gdGhpcyBmaWxlIGltcGxlbWVudHMgdGhvc2UgZnVuY3Rpb25zLCBhZnRlcgorLy8gdGhlIGltcGxlbWVudGF0aW9ucyBoYXZlIGJlZW4gcHVsbGVkIGluLgorLy8KKy8vIEl0J3MgaW1wb3J0YW50IHRoYXQgd2UgZGVjbGFyZSB0aGUgZnVuY3Rpb25zIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlIGFuZCBwdWxsCisvLyB0aGVtIGludG8gbmFtZXNwYWNlIHN0ZCB3aXRoIHVzaW5nIHN0YXRlbWVudHMsIGFzIG9wcG9zZWQgdG8gc2ltcGx5IGRlY2xhcmluZworLy8gdGhlc2UgZnVuY3Rpb25zIGluIG5hbWVzcGFjZSBzdGQsIGJlY2F1c2Ugb3VyIGRldmljZSBmdW5jdGlvbnMgbmVlZCB0bworLy8gb3ZlcmxvYWQgdGhlIHN0YW5kYXJkIGxpYnJhcnkgZnVuY3Rpb25zLCB3aGljaCBtYXkgYmUgZGVjbGFyZWQgaW4gdGhlIGdsb2JhbAorLy8gbmFtZXNwYWNlIG9yIGluIHN0ZCwgZGVwZW5kaW5nIG9uIHRoZSBkZWdyZWUgb2YgY29uZm9ybWFuY2Ugb2YgdGhlIHN0ZGxpYgorLy8gaW1wbGVtZW50YXRpb24uICBEZWNsYXJpbmcgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UgYW5kIHB1bGxpbmcgaW50byBuYW1lc3BhY2UKKy8vIHN0ZCBjb3ZlcnMgYWxsIG9mIHRoZSBrbm93biBrbm93bnMuCisKKyNkZWZpbmUgX19ERVZJQ0VfXyBzdGF0aWMgX19kZXZpY2VfXyBfX2lubGluZV9fIF9fYXR0cmlidXRlX18oKGFsd2F5c19pbmxpbmUpKQorCitfX0RFVklDRV9fIGxvbmcgbG9uZyBhYnMobG9uZyBsb25nIF9fbikgeyByZXR1cm4gOjpsbGFicyhfX24pOyB9CitfX0RFVklDRV9fIGxvbmcgYWJzKGxvbmcgX19uKSB7IHJldHVybiA6OmxhYnMoX19uKTsgfQorX19ERVZJQ0VfXyBmbG9hdCBhYnMoZmxvYXQgX194KSB7IHJldHVybiA6OmZhYnNmKF9feCk7IH0KK19fREVWSUNFX18gZG91YmxlIGFicyhkb3VibGUgX194KSB7IHJldHVybiA6OmZhYnMoX194KTsgfQorX19ERVZJQ0VfXyBmbG9hdCBhY29zKGZsb2F0IF9feCkgeyByZXR1cm4gOjphY29zZihfX3gpOyB9CitfX0RFVklDRV9fIGZsb2F0IGFzaW4oZmxvYXQgX194KSB7IHJldHVybiA6OmFzaW5mKF9feCk7IH0KK19fREVWSUNFX18gZmxvYXQgYXRhbihmbG9hdCBfX3gpIHsgcmV0dXJuIDo6YXRhbmYoX194KTsgfQorX19ERVZJQ0VfXyBmbG9hdCBhdGFuMihmbG9hdCBfX3gsIGZsb2F0IF9feSkgeyByZXR1cm4gOjphdGFuMmYoX194LCBfX3kpOyB9CitfX0RFVklDRV9fIGZsb2F0IGNlaWwoZmxvYXQgX194KSB7IHJldHVybiA6OmNlaWxmKF9feCk7IH0KK19fREVWSUNFX18gZmxvYXQgY29zKGZsb2F0IF9feCkgeyByZXR1cm4gOjpjb3NmKF9feCk7IH0KK19fREVWSUNFX18gZmxvYXQgY29zaChmbG9hdCBfX3gpIHsgcmV0dXJuIDo6Y29zaGYoX194KTsgfQorX19ERVZJQ0VfXyBmbG9hdCBleHAoZmxvYXQgX194KSB7IHJldHVybiA6OmV4cGYoX194KTsgfQorX19ERVZJQ0VfXyBmbG9hdCBmYWJzKGZsb2F0IF9feCkgeyByZXR1cm4gOjpmYWJzZihfX3gpOyB9CitfX0RFVklDRV9fIGZsb2F0IGZsb29yKGZsb2F0IF9feCkgeyByZXR1cm4gOjpmbG9vcmYoX194KTsgfQorX19ERVZJQ0VfXyBmbG9hdCBmbW9kKGZsb2F0IF9feCwgZmxvYXQgX195KSB7IHJldHVybiA6OmZtb2RmKF9feCwgX195KTsgfQorX19ERVZJQ0VfXyBpbnQgZnBjbGFzc2lmeShmbG9hdCBfX3gpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9mcGNsYXNzaWZ5KEZQX05BTiwgRlBfSU5GSU5JVEUsIEZQX05PUk1BTCwgRlBfU1VCTk9STUFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBfWkVSTywgX194KTsKK30KK19fREVWSUNFX18gaW50IGZwY2xhc3NpZnkoZG91YmxlIF9feCkgeworICByZXR1cm4gX19idWlsdGluX2ZwY2xhc3NpZnkoRlBfTkFOLCBGUF9JTkZJTklURSwgRlBfTk9STUFMLCBGUF9TVUJOT1JNQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUF9aRVJPLCBfX3gpOworfQorX19ERVZJQ0VfXyBmbG9hdCBmcmV4cChmbG9hdCBfX2FyZywgaW50ICpfX2V4cCkgeworICByZXR1cm4gOjpmcmV4cGYoX19hcmcsIF9fZXhwKTsKK30KK19fREVWSUNFX18gYm9vbCBpc2luZihmbG9hdCBfX3gpIHsgcmV0dXJuIDo6X19pc2luZmYoX194KTsgfQorX19ERVZJQ0VfXyBib29sIGlzaW5mKGRvdWJsZSBfX3gpIHsgcmV0dXJuIDo6X19pc2luZihfX3gpOyB9CitfX0RFVklDRV9fIGJvb2wgaXNmaW5pdGUoZmxvYXQgX194KSB7IHJldHVybiA6Ol9fZmluaXRlZihfX3gpOyB9CitfX0RFVklDRV9fIGJvb2wgaXNmaW5pdGUoZG91YmxlIF9feCkgeyByZXR1cm4gOjpfX2Zpbml0ZShfX3gpOyB9CitfX0RFVklDRV9fIGJvb2wgaXNncmVhdGVyKGZsb2F0IF9feCwgZmxvYXQgX195KSB7CisgIHJldHVybiBfX2J1aWx0aW5faXNncmVhdGVyKF9feCwgX195KTsKK30KK19fREVWSUNFX18gYm9vbCBpc2dyZWF0ZXIoZG91YmxlIF9feCwgZG91YmxlIF9feSkgeworICByZXR1cm4gX19idWlsdGluX2lzZ3JlYXRlcihfX3gsIF9feSk7Cit9CitfX0RFVklDRV9fIGJvb2wgaXNncmVhdGVyZXF1YWwoZmxvYXQgX194LCBmbG9hdCBfX3kpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9pc2dyZWF0ZXJlcXVhbChfX3gsIF9feSk7Cit9CitfX0RFVklDRV9fIGJvb2wgaXNncmVhdGVyZXF1YWwoZG91YmxlIF9feCwgZG91YmxlIF9feSkgeworICByZXR1cm4gX19idWlsdGluX2lzZ3JlYXRlcmVxdWFsKF9feCwgX195KTsKK30KK19fREVWSUNFX18gYm9vbCBpc2xlc3MoZmxvYXQgX194LCBmbG9hdCBfX3kpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9pc2xlc3MoX194LCBfX3kpOworfQorX19ERVZJQ0VfXyBib29sIGlzbGVzcyhkb3VibGUgX194LCBkb3VibGUgX195KSB7CisgIHJldHVybiBfX2J1aWx0aW5faXNsZXNzKF9feCwgX195KTsKK30KK19fREVWSUNFX18gYm9vbCBpc2xlc3NlcXVhbChmbG9hdCBfX3gsIGZsb2F0IF9feSkgeworICByZXR1cm4gX19idWlsdGluX2lzbGVzc2VxdWFsKF9feCwgX195KTsKK30KK19fREVWSUNFX18gYm9vbCBpc2xlc3NlcXVhbChkb3VibGUgX194LCBkb3VibGUgX195KSB7CisgIHJldHVybiBfX2J1aWx0aW5faXNsZXNzZXF1YWwoX194LCBfX3kpOworfQorX19ERVZJQ0VfXyBib29sIGlzbGVzc2dyZWF0ZXIoZmxvYXQgX194LCBmbG9hdCBfX3kpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9pc2xlc3NncmVhdGVyKF9feCwgX195KTsKK30KK19fREVWSUNFX18gYm9vbCBpc2xlc3NncmVhdGVyKGRvdWJsZSBfX3gsIGRvdWJsZSBfX3kpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9pc2xlc3NncmVhdGVyKF9feCwgX195KTsKK30KK19fREVWSUNFX18gYm9vbCBpc25hbihmbG9hdCBfX3gpIHsgcmV0dXJuIDo6X19pc25hbmYoX194KTsgfQorX19ERVZJQ0VfXyBib29sIGlzbmFuKGRvdWJsZSBfX3gpIHsgcmV0dXJuIDo6X19pc25hbihfX3gpOyB9CitfX0RFVklDRV9fIGJvb2wgaXNub3JtYWwoZmxvYXQgX194KSB7IHJldHVybiBfX2J1aWx0aW5faXNub3JtYWwoX194KTsgfQorX19ERVZJQ0VfXyBib29sIGlzbm9ybWFsKGRvdWJsZSBfX3gpIHsgcmV0dXJuIF9fYnVpbHRpbl9pc25vcm1hbChfX3gpOyB9CitfX0RFVklDRV9fIGJvb2wgaXN1bm9yZGVyZWQoZmxvYXQgX194LCBmbG9hdCBfX3kpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9pc3Vub3JkZXJlZChfX3gsIF9feSk7Cit9CitfX0RFVklDRV9fIGJvb2wgaXN1bm9yZGVyZWQoZG91YmxlIF9feCwgZG91YmxlIF9feSkgeworICByZXR1cm4gX19idWlsdGluX2lzdW5vcmRlcmVkKF9feCwgX195KTsKK30KK19fREVWSUNFX18gZmxvYXQgbGRleHAoZmxvYXQgX19hcmcsIGludCBfX2V4cCkgeworICByZXR1cm4gOjpsZGV4cGYoX19hcmcsIF9fZXhwKTsKK30KK19fREVWSUNFX18gZmxvYXQgbG9nKGZsb2F0IF9feCkgeyByZXR1cm4gOjpsb2dmKF9feCk7IH0KK19fREVWSUNFX18gZmxvYXQgbG9nMTAoZmxvYXQgX194KSB7IHJldHVybiA6OmxvZzEwZihfX3gpOyB9CitfX0RFVklDRV9fIGZsb2F0IG1vZGYoZmxvYXQgX194LCBmbG9hdCAqX19pcHRyKSB7IHJldHVybiA6Om1vZGZmKF9feCwgX19pcHRyKTsgfQorX19ERVZJQ0VfXyBmbG9hdCBuZXh0dG93YXJkKGZsb2F0IF9fZnJvbSwgZmxvYXQgX190bykgeworICByZXR1cm4gX19idWlsdGluX25leHR0b3dhcmRmKF9fZnJvbSwgX190byk7Cit9CitfX0RFVklDRV9fIGRvdWJsZSBuZXh0dG93YXJkKGRvdWJsZSBfX2Zyb20sIGRvdWJsZSBfX3RvKSB7CisgIHJldHVybiBfX2J1aWx0aW5fbmV4dHRvd2FyZChfX2Zyb20sIF9fdG8pOworfQorX19ERVZJQ0VfXyBmbG9hdCBwb3coZmxvYXQgX19iYXNlLCBmbG9hdCBfX2V4cCkgeworICByZXR1cm4gOjpwb3dmKF9fYmFzZSwgX19leHApOworfQorX19ERVZJQ0VfXyBmbG9hdCBwb3coZmxvYXQgX19iYXNlLCBpbnQgX19pZXhwKSB7CisgIHJldHVybiA6OnBvd2lmKF9fYmFzZSwgX19pZXhwKTsKK30KK19fREVWSUNFX18gZG91YmxlIHBvdyhkb3VibGUgX19iYXNlLCBpbnQgX19pZXhwKSB7CisgIHJldHVybiA6OnBvd2koX19iYXNlLCBfX2lleHApOworfQorX19ERVZJQ0VfXyBib29sIHNpZ25iaXQoZmxvYXQgX194KSB7IHJldHVybiA6Ol9fc2lnbmJpdGYoX194KTsgfQorX19ERVZJQ0VfXyBib29sIHNpZ25iaXQoZG91YmxlIF9feCkgeyByZXR1cm4gOjpfX3NpZ25iaXQoX194KTsgfQorX19ERVZJQ0VfXyBmbG9hdCBzaW4oZmxvYXQgX194KSB7IHJldHVybiA6OnNpbmYoX194KTsgfQorX19ERVZJQ0VfXyBmbG9hdCBzaW5oKGZsb2F0IF9feCkgeyByZXR1cm4gOjpzaW5oZihfX3gpOyB9CitfX0RFVklDRV9fIGZsb2F0IHNxcnQoZmxvYXQgX194KSB7IHJldHVybiA6OnNxcnRmKF9feCk7IH0KK19fREVWSUNFX18gZmxvYXQgdGFuKGZsb2F0IF9feCkgeyByZXR1cm4gOjp0YW5mKF9feCk7IH0KK19fREVWSUNFX18gZmxvYXQgdGFuaChmbG9hdCBfX3gpIHsgcmV0dXJuIDo6dGFuaGYoX194KTsgfQorCisjdW5kZWYgX19ERVZJQ0VfXworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL19fY2xhbmdfY3VkYV9pbnRyaW5zaWNzLmggYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9fX2NsYW5nX2N1ZGFfaW50cmluc2ljcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZjQxZmEKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9fX2NsYW5nX2N1ZGFfaW50cmluc2ljcy5oCkBAIC0wLDAgKzEsMzIyIEBACisvKj09PS0tLSBfX2NsYW5nX2N1ZGFfaW50cmluc2ljcy5oIC0gRGV2aWNlLXNpZGUgQ1VEQSBpbnRyaW5zaWMgd3JhcHBlcnMgLS0tPT09CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICoKKyAqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqLworI2lmbmRlZiBfX0NMQU5HX0NVREFfSU5UUklOU0lDU19IX18KKyNkZWZpbmUgX19DTEFOR19DVURBX0lOVFJJTlNJQ1NfSF9fCisjaWZuZGVmIF9fQ1VEQV9fCisjZXJyb3IgIlRoaXMgZmlsZSBpcyBmb3IgQ1VEQSBjb21waWxhdGlvbiBvbmx5LiIKKyNlbmRpZgorCisvLyBzbV8zMCBpbnRyaW5zaWNzOiBfX3NoZmxfe3VwLGRvd24seG9yfS4KKworI2RlZmluZSBfX1NNXzMwX0lOVFJJTlNJQ1NfSF9fCisjZGVmaW5lIF9fU01fMzBfSU5UUklOU0lDU19IUFBfXworCisjaWYgIWRlZmluZWQoX19DVURBX0FSQ0hfXykgfHwgX19DVURBX0FSQ0hfXyA+PSAzMDAKKworI3ByYWdtYSBwdXNoX21hY3JvKCJfX01BS0VfU0hVRkZMRVMiKQorI2RlZmluZSBfX01BS0VfU0hVRkZMRVMoX19Gbk5hbWUsIF9fSW50SW50cmluc2ljLCBfX0Zsb2F0SW50cmluc2ljLCBfX01hc2spICAgIFwKKyAgaW5saW5lIF9fZGV2aWNlX18gaW50IF9fRm5OYW1lKGludCBfX2luLCBpbnQgX19vZmZzZXQsICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgX193aWR0aCA9IHdhcnBTaXplKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBfX0ludEludHJpbnNpYyhfX2luLCBfX29mZnNldCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCh3YXJwU2l6ZSAtIF9fd2lkdGgpIDw8IDgpIHwgKF9fTWFzaykpOyAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbmxpbmUgX19kZXZpY2VfXyBmbG9hdCBfX0ZuTmFtZShmbG9hdCBfX2luLCBpbnQgX19vZmZzZXQsICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IF9fd2lkdGggPSB3YXJwU2l6ZSkgeyAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIF9fRmxvYXRJbnRyaW5zaWMoX19pbiwgX19vZmZzZXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgod2FycFNpemUgLSBfX3dpZHRoKSA8PCA4KSB8IChfX01hc2spKTsgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlubGluZSBfX2RldmljZV9fIHVuc2lnbmVkIGludCBfX0ZuTmFtZSh1bnNpZ25lZCBpbnQgX19pbiwgaW50IF9fb2Zmc2V0LCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IF9fd2lkdGggPSB3YXJwU2l6ZSkgeyAgICAgICAgICAgIFwKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PiggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIDo6X19Gbk5hbWUoc3RhdGljX2Nhc3Q8aW50PihfX2luKSwgX19vZmZzZXQsIF9fd2lkdGgpKTsgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW5saW5lIF9fZGV2aWNlX18gbG9uZyBsb25nIF9fRm5OYW1lKGxvbmcgbG9uZyBfX2luLCBpbnQgX19vZmZzZXQsICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgX193aWR0aCA9IHdhcnBTaXplKSB7ICAgICAgICAgICAgICAgXAorICAgIHN0cnVjdCBfX0JpdHMgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGludCBfX2EsIF9fYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9TdGF0aWNfYXNzZXJ0KHNpemVvZihfX2luKSA9PSBzaXplb2YoX19CaXRzKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfU3RhdGljX2Fzc2VydChzaXplb2YoX19CaXRzKSA9PSAyICogc2l6ZW9mKGludCkpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19CaXRzIF9fdG1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1lbWNweSgmX19pbiwgJl9fdG1wLCBzaXplb2YoX19pbikpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX3RtcC5fX2EgPSA6Ol9fRm5OYW1lKF9fdG1wLl9fYSwgX19vZmZzZXQsIF9fd2lkdGgpOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX190bXAuX19iID0gOjpfX0ZuTmFtZShfX3RtcC5fX2IsIF9fb2Zmc2V0LCBfX3dpZHRoKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGxvbmcgbG9uZyBfX291dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtZW1jcHkoJl9fb3V0LCAmX190bXAsIHNpemVvZihfX3RtcCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIF9fb3V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW5saW5lIF9fZGV2aWNlX18gdW5zaWduZWQgbG9uZyBsb25nIF9fRm5OYW1lKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgX19pbiwgaW50IF9fb2Zmc2V0LCBpbnQgX193aWR0aCA9IHdhcnBTaXplKSB7ICAgICAgICAgXAorICAgIHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGxvbmc+KCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgOjpfX0ZuTmFtZShzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGxvbmc+KF9faW4pLCBfX29mZnNldCwgX193aWR0aCkpOyBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbmxpbmUgX19kZXZpY2VfXyBkb3VibGUgX19Gbk5hbWUoZG91YmxlIF9faW4sIGludCBfX29mZnNldCwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBfX3dpZHRoID0gd2FycFNpemUpIHsgICAgICAgICAgICAgICAgICBcCisgICAgbG9uZyBsb25nIF9fdG1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9TdGF0aWNfYXNzZXJ0KHNpemVvZihfX3RtcCkgPT0gc2l6ZW9mKF9faW4pKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtZW1jcHkoJl9fdG1wLCAmX19pbiwgc2l6ZW9mKF9faW4pKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX190bXAgPSA6Ol9fRm5OYW1lKF9fdG1wLCBfX29mZnNldCwgX193aWR0aCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvdWJsZSBfX291dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtZW1jcHkoJl9fb3V0LCAmX190bXAsIHNpemVvZihfX291dCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIF9fb3V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKK19fTUFLRV9TSFVGRkxFUyhfX3NoZmwsIF9fbnZ2bV9zaGZsX2lkeF9pMzIsIF9fbnZ2bV9zaGZsX2lkeF9mMzIsIDB4MWYpOworLy8gV2UgdXNlIDAgcmF0aGVyIHRoYW4gMzEgYXMgb3VyIG1hc2ssIGJlY2F1c2Ugc2hmbC51cCBhcHBsaWVzIHRvIGxhbmVzID49CisvLyBtYXhMYW5lLgorX19NQUtFX1NIVUZGTEVTKF9fc2hmbF91cCwgX19udnZtX3NoZmxfdXBfaTMyLCBfX252dm1fc2hmbF91cF9mMzIsIDApOworX19NQUtFX1NIVUZGTEVTKF9fc2hmbF9kb3duLCBfX252dm1fc2hmbF9kb3duX2kzMiwgX19udnZtX3NoZmxfZG93bl9mMzIsIDB4MWYpOworX19NQUtFX1NIVUZGTEVTKF9fc2hmbF94b3IsIF9fbnZ2bV9zaGZsX2JmbHlfaTMyLCBfX252dm1fc2hmbF9iZmx5X2YzMiwgMHgxZik7CisKKyNwcmFnbWEgcG9wX21hY3JvKCJfX01BS0VfU0hVRkZMRVMiKQorCisjZW5kaWYgLy8gIWRlZmluZWQoX19DVURBX0FSQ0hfXykgfHwgX19DVURBX0FSQ0hfXyA+PSAzMDAKKworLy8gc21fMzIgaW50cmluc2ljczogX19sZGcgYW5kIF9fZnVubmVsc2hpZnRfe2wsbGMscixyY30uCisKKy8vIFByZXZlbnQgdGhlIHZhbmlsbGEgc21fMzIgaW50cmluc2ljcyBoZWFkZXIgZnJvbSBiZWluZyBpbmNsdWRlZC4KKyNkZWZpbmUgX19TTV8zMl9JTlRSSU5TSUNTX0hfXworI2RlZmluZSBfX1NNXzMyX0lOVFJJTlNJQ1NfSFBQX18KKworI2lmICFkZWZpbmVkKF9fQ1VEQV9BUkNIX18pIHx8IF9fQ1VEQV9BUkNIX18gPj0gMzIwCisKK2lubGluZSBfX2RldmljZV9fIGNoYXIgX19sZGcoY29uc3QgY2hhciAqcHRyKSB7IHJldHVybiBfX252dm1fbGRnX2MocHRyKTsgfQoraW5saW5lIF9fZGV2aWNlX18gc2hvcnQgX19sZGcoY29uc3Qgc2hvcnQgKnB0cikgeyByZXR1cm4gX19udnZtX2xkZ19zKHB0cik7IH0KK2lubGluZSBfX2RldmljZV9fIGludCBfX2xkZyhjb25zdCBpbnQgKnB0cikgeyByZXR1cm4gX19udnZtX2xkZ19pKHB0cik7IH0KK2lubGluZSBfX2RldmljZV9fIGxvbmcgX19sZGcoY29uc3QgbG9uZyAqcHRyKSB7IHJldHVybiBfX252dm1fbGRnX2wocHRyKTsgfQoraW5saW5lIF9fZGV2aWNlX18gbG9uZyBsb25nIF9fbGRnKGNvbnN0IGxvbmcgbG9uZyAqcHRyKSB7CisgIHJldHVybiBfX252dm1fbGRnX2xsKHB0cik7Cit9CitpbmxpbmUgX19kZXZpY2VfXyB1bnNpZ25lZCBjaGFyIF9fbGRnKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0cikgeworICByZXR1cm4gX19udnZtX2xkZ191YyhwdHIpOworfQoraW5saW5lIF9fZGV2aWNlX18gdW5zaWduZWQgc2hvcnQgX19sZGcoY29uc3QgdW5zaWduZWQgc2hvcnQgKnB0cikgeworICByZXR1cm4gX19udnZtX2xkZ191cyhwdHIpOworfQoraW5saW5lIF9fZGV2aWNlX18gdW5zaWduZWQgaW50IF9fbGRnKGNvbnN0IHVuc2lnbmVkIGludCAqcHRyKSB7CisgIHJldHVybiBfX252dm1fbGRnX3VpKHB0cik7Cit9CitpbmxpbmUgX19kZXZpY2VfXyB1bnNpZ25lZCBsb25nIF9fbGRnKGNvbnN0IHVuc2lnbmVkIGxvbmcgKnB0cikgeworICByZXR1cm4gX19udnZtX2xkZ191bChwdHIpOworfQoraW5saW5lIF9fZGV2aWNlX18gdW5zaWduZWQgbG9uZyBsb25nIF9fbGRnKGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqcHRyKSB7CisgIHJldHVybiBfX252dm1fbGRnX3VsbChwdHIpOworfQoraW5saW5lIF9fZGV2aWNlX18gZmxvYXQgX19sZGcoY29uc3QgZmxvYXQgKnB0cikgeyByZXR1cm4gX19udnZtX2xkZ19mKHB0cik7IH0KK2lubGluZSBfX2RldmljZV9fIGRvdWJsZSBfX2xkZyhjb25zdCBkb3VibGUgKnB0cikgeyByZXR1cm4gX19udnZtX2xkZ19kKHB0cik7IH0KKworaW5saW5lIF9fZGV2aWNlX18gY2hhcjIgX19sZGcoY29uc3QgY2hhcjIgKnB0cikgeworICB0eXBlZGVmIGNoYXIgYzIgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDIpKSk7CisgIC8vIFdlIGNhbiBhc3N1bWUgdGhhdCBwdHIgaXMgYWxpZ25lZCBhdCBsZWFzdCB0byBjaGFyMidzIGFsaWdubWVudCwgYnV0IHRoZQorICAvLyBsb2FkIHdpbGwgYXNzdW1lIHRoYXQgcHRyIGlzIGFsaWduZWQgdG8gY2hhcjIncyBhbGlnbm1lbnQuICBUaGlzIGlzIG9ubHkKKyAgLy8gc2FmZSBpZiBhbGlnbm9mKGMyKSA8PSBhbGlnbm9mKGNoYXIyKS4KKyAgYzIgcnYgPSBfX252dm1fbGRnX2MyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYzIgKj4ocHRyKSk7CisgIGNoYXIyIHJldDsKKyAgcmV0LnggPSBydlswXTsKKyAgcmV0LnkgPSBydlsxXTsKKyAgcmV0dXJuIHJldDsKK30KK2lubGluZSBfX2RldmljZV9fIGNoYXI0IF9fbGRnKGNvbnN0IGNoYXI0ICpwdHIpIHsKKyAgdHlwZWRlZiBjaGFyIGM0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOworICBjNCBydiA9IF9fbnZ2bV9sZGdfYzQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjNCAqPihwdHIpKTsKKyAgY2hhcjQgcmV0OworICByZXQueCA9IHJ2WzBdOworICByZXQueSA9IHJ2WzFdOworICByZXQueiA9IHJ2WzJdOworICByZXQudyA9IHJ2WzNdOworICByZXR1cm4gcmV0OworfQoraW5saW5lIF9fZGV2aWNlX18gc2hvcnQyIF9fbGRnKGNvbnN0IHNob3J0MiAqcHRyKSB7CisgIHR5cGVkZWYgc2hvcnQgczIgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDIpKSk7CisgIHMyIHJ2ID0gX19udnZtX2xkZ19zMihyZWludGVycHJldF9jYXN0PGNvbnN0IHMyICo+KHB0cikpOworICBzaG9ydDIgcmV0OworICByZXQueCA9IHJ2WzBdOworICByZXQueSA9IHJ2WzFdOworICByZXR1cm4gcmV0OworfQoraW5saW5lIF9fZGV2aWNlX18gc2hvcnQ0IF9fbGRnKGNvbnN0IHNob3J0NCAqcHRyKSB7CisgIHR5cGVkZWYgc2hvcnQgczQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7CisgIHM0IHJ2ID0gX19udnZtX2xkZ19zNChyZWludGVycHJldF9jYXN0PGNvbnN0IHM0ICo+KHB0cikpOworICBzaG9ydDQgcmV0OworICByZXQueCA9IHJ2WzBdOworICByZXQueSA9IHJ2WzFdOworICByZXQueiA9IHJ2WzJdOworICByZXQudyA9IHJ2WzNdOworICByZXR1cm4gcmV0OworfQoraW5saW5lIF9fZGV2aWNlX18gaW50MiBfX2xkZyhjb25zdCBpbnQyICpwdHIpIHsKKyAgdHlwZWRlZiBpbnQgaTIgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDIpKSk7CisgIGkyIHJ2ID0gX19udnZtX2xkZ19pMihyZWludGVycHJldF9jYXN0PGNvbnN0IGkyICo+KHB0cikpOworICBpbnQyIHJldDsKKyAgcmV0LnggPSBydlswXTsKKyAgcmV0LnkgPSBydlsxXTsKKyAgcmV0dXJuIHJldDsKK30KK2lubGluZSBfX2RldmljZV9fIGludDQgX19sZGcoY29uc3QgaW50NCAqcHRyKSB7CisgIHR5cGVkZWYgaW50IGk0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOworICBpNCBydiA9IF9fbnZ2bV9sZGdfaTQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBpNCAqPihwdHIpKTsKKyAgaW50NCByZXQ7CisgIHJldC54ID0gcnZbMF07CisgIHJldC55ID0gcnZbMV07CisgIHJldC56ID0gcnZbMl07CisgIHJldC53ID0gcnZbM107CisgIHJldHVybiByZXQ7Cit9CitpbmxpbmUgX19kZXZpY2VfXyBsb25nbG9uZzIgX19sZGcoY29uc3QgbG9uZ2xvbmcyICpwdHIpIHsKKyAgdHlwZWRlZiBsb25nIGxvbmcgbGwyIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgyKSkpOworICBsbDIgcnYgPSBfX252dm1fbGRnX2xsMihyZWludGVycHJldF9jYXN0PGNvbnN0IGxsMiAqPihwdHIpKTsKKyAgbG9uZ2xvbmcyIHJldDsKKyAgcmV0LnggPSBydlswXTsKKyAgcmV0LnkgPSBydlsxXTsKKyAgcmV0dXJuIHJldDsKK30KKworaW5saW5lIF9fZGV2aWNlX18gdWNoYXIyIF9fbGRnKGNvbnN0IHVjaGFyMiAqcHRyKSB7CisgIHR5cGVkZWYgdW5zaWduZWQgY2hhciB1YzIgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDIpKSk7CisgIHVjMiBydiA9IF9fbnZ2bV9sZGdfdWMyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWMyICo+KHB0cikpOworICB1Y2hhcjIgcmV0OworICByZXQueCA9IHJ2WzBdOworICByZXQueSA9IHJ2WzFdOworICByZXR1cm4gcmV0OworfQoraW5saW5lIF9fZGV2aWNlX18gdWNoYXI0IF9fbGRnKGNvbnN0IHVjaGFyNCAqcHRyKSB7CisgIHR5cGVkZWYgdW5zaWduZWQgY2hhciB1YzQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7CisgIHVjNCBydiA9IF9fbnZ2bV9sZGdfdWM0KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWM0ICo+KHB0cikpOworICB1Y2hhcjQgcmV0OworICByZXQueCA9IHJ2WzBdOworICByZXQueSA9IHJ2WzFdOworICByZXQueiA9IHJ2WzJdOworICByZXQudyA9IHJ2WzNdOworICByZXR1cm4gcmV0OworfQoraW5saW5lIF9fZGV2aWNlX18gdXNob3J0MiBfX2xkZyhjb25zdCB1c2hvcnQyICpwdHIpIHsKKyAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1czIgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDIpKSk7CisgIHVzMiBydiA9IF9fbnZ2bV9sZGdfdXMyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdXMyICo+KHB0cikpOworICB1c2hvcnQyIHJldDsKKyAgcmV0LnggPSBydlswXTsKKyAgcmV0LnkgPSBydlsxXTsKKyAgcmV0dXJuIHJldDsKK30KK2lubGluZSBfX2RldmljZV9fIHVzaG9ydDQgX19sZGcoY29uc3QgdXNob3J0NCAqcHRyKSB7CisgIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgdXM0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOworICB1czQgcnYgPSBfX252dm1fbGRnX3VzNChyZWludGVycHJldF9jYXN0PGNvbnN0IHVzNCAqPihwdHIpKTsKKyAgdXNob3J0NCByZXQ7CisgIHJldC54ID0gcnZbMF07CisgIHJldC55ID0gcnZbMV07CisgIHJldC56ID0gcnZbMl07CisgIHJldC53ID0gcnZbM107CisgIHJldHVybiByZXQ7Cit9CitpbmxpbmUgX19kZXZpY2VfXyB1aW50MiBfX2xkZyhjb25zdCB1aW50MiAqcHRyKSB7CisgIHR5cGVkZWYgdW5zaWduZWQgaW50IHVpMiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMikpKTsKKyAgdWkyIHJ2ID0gX19udnZtX2xkZ191aTIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aTIgKj4ocHRyKSk7CisgIHVpbnQyIHJldDsKKyAgcmV0LnggPSBydlswXTsKKyAgcmV0LnkgPSBydlsxXTsKKyAgcmV0dXJuIHJldDsKK30KK2lubGluZSBfX2RldmljZV9fIHVpbnQ0IF9fbGRnKGNvbnN0IHVpbnQ0ICpwdHIpIHsKKyAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgdWk0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOworICB1aTQgcnYgPSBfX252dm1fbGRnX3VpNChyZWludGVycHJldF9jYXN0PGNvbnN0IHVpNCAqPihwdHIpKTsKKyAgdWludDQgcmV0OworICByZXQueCA9IHJ2WzBdOworICByZXQueSA9IHJ2WzFdOworICByZXQueiA9IHJ2WzJdOworICByZXQudyA9IHJ2WzNdOworICByZXR1cm4gcmV0OworfQoraW5saW5lIF9fZGV2aWNlX18gdWxvbmdsb25nMiBfX2xkZyhjb25zdCB1bG9uZ2xvbmcyICpwdHIpIHsKKyAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdWxsMiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMikpKTsKKyAgdWxsMiBydiA9IF9fbnZ2bV9sZGdfdWxsMihyZWludGVycHJldF9jYXN0PGNvbnN0IHVsbDIgKj4ocHRyKSk7CisgIHVsb25nbG9uZzIgcmV0OworICByZXQueCA9IHJ2WzBdOworICByZXQueSA9IHJ2WzFdOworICByZXR1cm4gcmV0OworfQorCitpbmxpbmUgX19kZXZpY2VfXyBmbG9hdDIgX19sZGcoY29uc3QgZmxvYXQyICpwdHIpIHsKKyAgdHlwZWRlZiBmbG9hdCBmMiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMikpKTsKKyAgZjIgcnYgPSBfX252dm1fbGRnX2YyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZjIgKj4ocHRyKSk7CisgIGZsb2F0MiByZXQ7CisgIHJldC54ID0gcnZbMF07CisgIHJldC55ID0gcnZbMV07CisgIHJldHVybiByZXQ7Cit9CitpbmxpbmUgX19kZXZpY2VfXyBmbG9hdDQgX19sZGcoY29uc3QgZmxvYXQ0ICpwdHIpIHsKKyAgdHlwZWRlZiBmbG9hdCBmNCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsKKyAgZjQgcnYgPSBfX252dm1fbGRnX2Y0KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZjQgKj4ocHRyKSk7CisgIGZsb2F0NCByZXQ7CisgIHJldC54ID0gcnZbMF07CisgIHJldC55ID0gcnZbMV07CisgIHJldC56ID0gcnZbMl07CisgIHJldC53ID0gcnZbM107CisgIHJldHVybiByZXQ7Cit9CitpbmxpbmUgX19kZXZpY2VfXyBkb3VibGUyIF9fbGRnKGNvbnN0IGRvdWJsZTIgKnB0cikgeworICB0eXBlZGVmIGRvdWJsZSBkMiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMikpKTsKKyAgZDIgcnYgPSBfX252dm1fbGRnX2QyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZDIgKj4ocHRyKSk7CisgIGRvdWJsZTIgcmV0OworICByZXQueCA9IHJ2WzBdOworICByZXQueSA9IHJ2WzFdOworICByZXR1cm4gcmV0OworfQorCisvLyBUT0RPOiBJbXBsZW1lbnQgdGhlc2UgYXMgaW50cmluc2ljcywgc28gdGhlIGJhY2tlbmQgY2FuIHdvcmsgaXRzIG1hZ2ljIG9uCisvLyB0aGVzZS4gIEFsdGVybmF0aXZlbHksIHdlIGNvdWxkIGltcGxlbWVudCB0aGVzZSBhcyBwbGFpbiBDIGFuZCB0cnkgdG8gZ2V0CisvLyBsbHZtIHRvIHJlY29nbml6ZSB0aGUgcmVsZXZhbnQgcGF0dGVybnMuCitpbmxpbmUgX19kZXZpY2VfXyB1bnNpZ25lZCBfX2Z1bm5lbHNoaWZ0X2wodW5zaWduZWQgbG93MzIsIHVuc2lnbmVkIGhpZ2gzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaGlmdFdpZHRoKSB7CisgIHVuc2lnbmVkIHJlc3VsdDsKKyAgYXNtKCJzaGYubC53cmFwLmIzMiAlMCwgJTEsICUyLCAlMzsiCisgICAgICA6ICI9ciIocmVzdWx0KQorICAgICAgOiAiciIobG93MzIpLCAiciIoaGlnaDMyKSwgInIiKHNoaWZ0V2lkdGgpKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KK2lubGluZSBfX2RldmljZV9fIHVuc2lnbmVkIF9fZnVubmVsc2hpZnRfbGModW5zaWduZWQgbG93MzIsIHVuc2lnbmVkIGhpZ2gzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hpZnRXaWR0aCkgeworICB1bnNpZ25lZCByZXN1bHQ7CisgIGFzbSgic2hmLmwuY2xhbXAuYjMyICUwLCAlMSwgJTIsICUzOyIKKyAgICAgIDogIj1yIihyZXN1bHQpCisgICAgICA6ICJyIihsb3czMiksICJyIihoaWdoMzIpLCAiciIoc2hpZnRXaWR0aCkpOworICByZXR1cm4gcmVzdWx0OworfQoraW5saW5lIF9fZGV2aWNlX18gdW5zaWduZWQgX19mdW5uZWxzaGlmdF9yKHVuc2lnbmVkIGxvdzMyLCB1bnNpZ25lZCBoaWdoMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hpZnRXaWR0aCkgeworICB1bnNpZ25lZCByZXN1bHQ7CisgIGFzbSgic2hmLnIud3JhcC5iMzIgJTAsICUxLCAlMiwgJTM7IgorICAgICAgOiAiPXIiKHJlc3VsdCkKKyAgICAgIDogInIiKGxvdzMyKSwgInIiKGhpZ2gzMiksICJyIihzaGlmdFdpZHRoKSk7CisgIHJldHVybiByZXN1bHQ7Cit9CitpbmxpbmUgX19kZXZpY2VfXyB1bnNpZ25lZCBfX2Z1bm5lbHNoaWZ0X3JjKHVuc2lnbmVkIGxvdzMyLCB1bnNpZ25lZCBoaWdoMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNoaWZ0V2lkdGgpIHsKKyAgdW5zaWduZWQgcmV0OworICBhc20oInNoZi5yLmNsYW1wLmIzMiAlMCwgJTEsICUyLCAlMzsiCisgICAgICA6ICI9ciIocmV0KQorICAgICAgOiAiciIobG93MzIpLCAiciIoaGlnaDMyKSwgInIiKHNoaWZ0V2lkdGgpKTsKKyAgcmV0dXJuIHJldDsKK30KKworI2VuZGlmIC8vICFkZWZpbmVkKF9fQ1VEQV9BUkNIX18pIHx8IF9fQ1VEQV9BUkNIX18gPj0gMzIwCisKKyNlbmRpZiAvLyBkZWZpbmVkKF9fQ0xBTkdfQ1VEQV9JTlRSSU5TSUNTX0hfXykKZGlmZiAtLWdpdCBhL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL19fY2xhbmdfY3VkYV9tYXRoX2ZvcndhcmRfZGVjbGFyZXMuaCBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL19fY2xhbmdfY3VkYV9tYXRoX2ZvcndhcmRfZGVjbGFyZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjI4MzRkCi0tLSAvZGV2L251bGwKKysrIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvX19jbGFuZ19jdWRhX21hdGhfZm9yd2FyZF9kZWNsYXJlcy5oCkBAIC0wLDAgKzEsMjYzIEBACisvKj09PS0gX19jbGFuZ19tYXRoX2ZvcndhcmRfZGVjbGFyZXMuaCAtIFByb3RvdHlwZXMgb2YgX19kZXZpY2VfXyBtYXRoIGZucyAtLT09PQorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqCisgKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisgKi8KKyNpZm5kZWYgX19DTEFOR19fQ1VEQV9NQVRIX0ZPUldBUkRfREVDTEFSRVNfSF9fCisjZGVmaW5lIF9fQ0xBTkdfX0NVREFfTUFUSF9GT1JXQVJEX0RFQ0xBUkVTX0hfXworI2lmbmRlZiBfX0NVREFfXworI2Vycm9yICJUaGlzIGZpbGUgaXMgZm9yIENVREEgY29tcGlsYXRpb24gb25seS4iCisjZW5kaWYKKworLy8gVGhpcyBmaWxlIGZvcndhcmQtZGVjbGFyZXMgb2Ygc29tZSBtYXRoIGZ1bmN0aW9ucyB3ZSAob3IgdGhlIENVREEgaGVhZGVycykKKy8vIHdpbGwgZGVmaW5lIGxhdGVyLiAgV2UgbmVlZCB0byBkbyB0aGlzLCBhbmQgZG8gaXQgYmVmb3JlIGNtYXRoIGlzIGluY2x1ZGVkLAorLy8gYmVjYXVzZSB0aGUgc3RhbmRhcmQgbGlicmFyeSBtYXkgaGF2ZSBjb25zdGV4cHIgbWF0aCBmdW5jdGlvbnMuICBJbiB0aGUKKy8vIGFic2VuY2Ugb2YgYSBwcmlvciBfX2RldmljZV9fIGRlY2wsIHRob3NlIGNvbnN0ZXhwciBmdW5jdGlvbnMgbWF5IGJlY29tZQorLy8gaW1wbGljaXRseSBob3N0K2RldmljZS4gIGhvc3QrZGV2aWNlIGZ1bmN0aW9ucyBjYW4ndCBiZSBvdmVybG9hZGVkLCBzbyB0aGF0CisvLyB3b3VsZCBwcmVjbHVkZSB0aGUgdXNlIG9mIG91ciBvd24gX19kZXZpY2VfXyBvdmVybG9hZHMgZm9yIHRoZXNlIGZ1bmN0aW9ucy4KKworI3ByYWdtYSBwdXNoX21hY3JvKCJfX0RFVklDRV9fIikKKyNkZWZpbmUgX19ERVZJQ0VfXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyBfX2lubGluZV9fIF9fYXR0cmlidXRlX18oKGFsd2F5c19pbmxpbmUpKSBfX2F0dHJpYnV0ZV9fKChkZXZpY2UpKQorCitfX0RFVklDRV9fIGRvdWJsZSBhYnMoZG91YmxlKTsKK19fREVWSUNFX18gZmxvYXQgYWJzKGZsb2F0KTsKK19fREVWSUNFX18gaW50IGFicyhpbnQpOworX19ERVZJQ0VfXyBsb25nIGFicyhsb25nKTsKK19fREVWSUNFX18gbG9uZyBsb25nIGFicyhsb25nIGxvbmcpOworX19ERVZJQ0VfXyBkb3VibGUgYWNvcyhkb3VibGUpOworX19ERVZJQ0VfXyBmbG9hdCBhY29zKGZsb2F0KTsKK19fREVWSUNFX18gZG91YmxlIGFjb3NoKGRvdWJsZSk7CitfX0RFVklDRV9fIGZsb2F0IGFjb3NoKGZsb2F0KTsKK19fREVWSUNFX18gZG91YmxlIGFzaW4oZG91YmxlKTsKK19fREVWSUNFX18gZmxvYXQgYXNpbihmbG9hdCk7CitfX0RFVklDRV9fIGRvdWJsZSBhc2luaChkb3VibGUpOworX19ERVZJQ0VfXyBmbG9hdCBhc2luaChmbG9hdCk7CitfX0RFVklDRV9fIGRvdWJsZSBhdGFuMihkb3VibGUsIGRvdWJsZSk7CitfX0RFVklDRV9fIGZsb2F0IGF0YW4yKGZsb2F0LCBmbG9hdCk7CitfX0RFVklDRV9fIGRvdWJsZSBhdGFuKGRvdWJsZSk7CitfX0RFVklDRV9fIGZsb2F0IGF0YW4oZmxvYXQpOworX19ERVZJQ0VfXyBkb3VibGUgYXRhbmgoZG91YmxlKTsKK19fREVWSUNFX18gZmxvYXQgYXRhbmgoZmxvYXQpOworX19ERVZJQ0VfXyBkb3VibGUgY2JydChkb3VibGUpOworX19ERVZJQ0VfXyBmbG9hdCBjYnJ0KGZsb2F0KTsKK19fREVWSUNFX18gZG91YmxlIGNlaWwoZG91YmxlKTsKK19fREVWSUNFX18gZmxvYXQgY2VpbChmbG9hdCk7CitfX0RFVklDRV9fIGRvdWJsZSBjb3B5c2lnbihkb3VibGUsIGRvdWJsZSk7CitfX0RFVklDRV9fIGZsb2F0IGNvcHlzaWduKGZsb2F0LCBmbG9hdCk7CitfX0RFVklDRV9fIGRvdWJsZSBjb3MoZG91YmxlKTsKK19fREVWSUNFX18gZmxvYXQgY29zKGZsb2F0KTsKK19fREVWSUNFX18gZG91YmxlIGNvc2goZG91YmxlKTsKK19fREVWSUNFX18gZmxvYXQgY29zaChmbG9hdCk7CitfX0RFVklDRV9fIGRvdWJsZSBlcmZjKGRvdWJsZSk7CitfX0RFVklDRV9fIGZsb2F0IGVyZmMoZmxvYXQpOworX19ERVZJQ0VfXyBkb3VibGUgZXJmKGRvdWJsZSk7CitfX0RFVklDRV9fIGZsb2F0IGVyZihmbG9hdCk7CitfX0RFVklDRV9fIGRvdWJsZSBleHAyKGRvdWJsZSk7CitfX0RFVklDRV9fIGZsb2F0IGV4cDIoZmxvYXQpOworX19ERVZJQ0VfXyBkb3VibGUgZXhwKGRvdWJsZSk7CitfX0RFVklDRV9fIGZsb2F0IGV4cChmbG9hdCk7CitfX0RFVklDRV9fIGRvdWJsZSBleHBtMShkb3VibGUpOworX19ERVZJQ0VfXyBmbG9hdCBleHBtMShmbG9hdCk7CitfX0RFVklDRV9fIGRvdWJsZSBmYWJzKGRvdWJsZSk7CitfX0RFVklDRV9fIGZsb2F0IGZhYnMoZmxvYXQpOworX19ERVZJQ0VfXyBkb3VibGUgZmRpbShkb3VibGUsIGRvdWJsZSk7CitfX0RFVklDRV9fIGZsb2F0IGZkaW0oZmxvYXQsIGZsb2F0KTsKK19fREVWSUNFX18gZG91YmxlIGZsb29yKGRvdWJsZSk7CitfX0RFVklDRV9fIGZsb2F0IGZsb29yKGZsb2F0KTsKK19fREVWSUNFX18gZG91YmxlIGZtYShkb3VibGUsIGRvdWJsZSwgZG91YmxlKTsKK19fREVWSUNFX18gZmxvYXQgZm1hKGZsb2F0LCBmbG9hdCwgZmxvYXQpOworX19ERVZJQ0VfXyBkb3VibGUgZm1heChkb3VibGUsIGRvdWJsZSk7CitfX0RFVklDRV9fIGZsb2F0IGZtYXgoZmxvYXQsIGZsb2F0KTsKK19fREVWSUNFX18gZG91YmxlIGZtaW4oZG91YmxlLCBkb3VibGUpOworX19ERVZJQ0VfXyBmbG9hdCBmbWluKGZsb2F0LCBmbG9hdCk7CitfX0RFVklDRV9fIGRvdWJsZSBmbW9kKGRvdWJsZSwgZG91YmxlKTsKK19fREVWSUNFX18gZmxvYXQgZm1vZChmbG9hdCwgZmxvYXQpOworX19ERVZJQ0VfXyBpbnQgZnBjbGFzc2lmeShkb3VibGUpOworX19ERVZJQ0VfXyBpbnQgZnBjbGFzc2lmeShmbG9hdCk7CitfX0RFVklDRV9fIGRvdWJsZSBmcmV4cChkb3VibGUsIGludCAqKTsKK19fREVWSUNFX18gZmxvYXQgZnJleHAoZmxvYXQsIGludCAqKTsKK19fREVWSUNFX18gZG91YmxlIGh5cG90KGRvdWJsZSwgZG91YmxlKTsKK19fREVWSUNFX18gZmxvYXQgaHlwb3QoZmxvYXQsIGZsb2F0KTsKK19fREVWSUNFX18gaW50IGlsb2diKGRvdWJsZSk7CitfX0RFVklDRV9fIGludCBpbG9nYihmbG9hdCk7CitfX0RFVklDRV9fIGJvb2wgaXNmaW5pdGUoZG91YmxlKTsKK19fREVWSUNFX18gYm9vbCBpc2Zpbml0ZShmbG9hdCk7CitfX0RFVklDRV9fIGJvb2wgaXNncmVhdGVyKGRvdWJsZSwgZG91YmxlKTsKK19fREVWSUNFX18gYm9vbCBpc2dyZWF0ZXJlcXVhbChkb3VibGUsIGRvdWJsZSk7CitfX0RFVklDRV9fIGJvb2wgaXNncmVhdGVyZXF1YWwoZmxvYXQsIGZsb2F0KTsKK19fREVWSUNFX18gYm9vbCBpc2dyZWF0ZXIoZmxvYXQsIGZsb2F0KTsKK19fREVWSUNFX18gYm9vbCBpc2luZihkb3VibGUpOworX19ERVZJQ0VfXyBib29sIGlzaW5mKGZsb2F0KTsKK19fREVWSUNFX18gYm9vbCBpc2xlc3MoZG91YmxlLCBkb3VibGUpOworX19ERVZJQ0VfXyBib29sIGlzbGVzc2VxdWFsKGRvdWJsZSwgZG91YmxlKTsKK19fREVWSUNFX18gYm9vbCBpc2xlc3NlcXVhbChmbG9hdCwgZmxvYXQpOworX19ERVZJQ0VfXyBib29sIGlzbGVzcyhmbG9hdCwgZmxvYXQpOworX19ERVZJQ0VfXyBib29sIGlzbGVzc2dyZWF0ZXIoZG91YmxlLCBkb3VibGUpOworX19ERVZJQ0VfXyBib29sIGlzbGVzc2dyZWF0ZXIoZmxvYXQsIGZsb2F0KTsKK19fREVWSUNFX18gYm9vbCBpc25hbihkb3VibGUpOworX19ERVZJQ0VfXyBib29sIGlzbmFuKGZsb2F0KTsKK19fREVWSUNFX18gYm9vbCBpc25vcm1hbChkb3VibGUpOworX19ERVZJQ0VfXyBib29sIGlzbm9ybWFsKGZsb2F0KTsKK19fREVWSUNFX18gYm9vbCBpc3Vub3JkZXJlZChkb3VibGUsIGRvdWJsZSk7CitfX0RFVklDRV9fIGJvb2wgaXN1bm9yZGVyZWQoZmxvYXQsIGZsb2F0KTsKK19fREVWSUNFX18gbG9uZyBsYWJzKGxvbmcpOworX19ERVZJQ0VfXyBkb3VibGUgbGRleHAoZG91YmxlLCBpbnQpOworX19ERVZJQ0VfXyBmbG9hdCBsZGV4cChmbG9hdCwgaW50KTsKK19fREVWSUNFX18gZG91YmxlIGxnYW1tYShkb3VibGUpOworX19ERVZJQ0VfXyBmbG9hdCBsZ2FtbWEoZmxvYXQpOworX19ERVZJQ0VfXyBsb25nIGxvbmcgbGxhYnMobG9uZyBsb25nKTsKK19fREVWSUNFX18gbG9uZyBsb25nIGxscmludChkb3VibGUpOworX19ERVZJQ0VfXyBsb25nIGxvbmcgbGxyaW50KGZsb2F0KTsKK19fREVWSUNFX18gZG91YmxlIGxvZzEwKGRvdWJsZSk7CitfX0RFVklDRV9fIGZsb2F0IGxvZzEwKGZsb2F0KTsKK19fREVWSUNFX18gZG91YmxlIGxvZzFwKGRvdWJsZSk7CitfX0RFVklDRV9fIGZsb2F0IGxvZzFwKGZsb2F0KTsKK19fREVWSUNFX18gZG91YmxlIGxvZzIoZG91YmxlKTsKK19fREVWSUNFX18gZmxvYXQgbG9nMihmbG9hdCk7CitfX0RFVklDRV9fIGRvdWJsZSBsb2diKGRvdWJsZSk7CitfX0RFVklDRV9fIGZsb2F0IGxvZ2IoZmxvYXQpOworX19ERVZJQ0VfXyBkb3VibGUgbG9nKGRvdWJsZSk7CitfX0RFVklDRV9fIGZsb2F0IGxvZyhmbG9hdCk7CitfX0RFVklDRV9fIGxvbmcgbHJpbnQoZG91YmxlKTsKK19fREVWSUNFX18gbG9uZyBscmludChmbG9hdCk7CitfX0RFVklDRV9fIGxvbmcgbHJvdW5kKGRvdWJsZSk7CitfX0RFVklDRV9fIGxvbmcgbHJvdW5kKGZsb2F0KTsKK19fREVWSUNFX18gZG91YmxlIG1vZGYoZG91YmxlLCBkb3VibGUgKik7CitfX0RFVklDRV9fIGZsb2F0IG1vZGYoZmxvYXQsIGZsb2F0ICopOworX19ERVZJQ0VfXyBkb3VibGUgbmFuKGNvbnN0IGNoYXIgKik7CitfX0RFVklDRV9fIGZsb2F0IG5hbmYoY29uc3QgY2hhciAqKTsKK19fREVWSUNFX18gZG91YmxlIG5lYXJieWludChkb3VibGUpOworX19ERVZJQ0VfXyBmbG9hdCBuZWFyYnlpbnQoZmxvYXQpOworX19ERVZJQ0VfXyBkb3VibGUgbmV4dGFmdGVyKGRvdWJsZSwgZG91YmxlKTsKK19fREVWSUNFX18gZmxvYXQgbmV4dGFmdGVyKGZsb2F0LCBmbG9hdCk7CitfX0RFVklDRV9fIGRvdWJsZSBuZXh0dG93YXJkKGRvdWJsZSwgZG91YmxlKTsKK19fREVWSUNFX18gZmxvYXQgbmV4dHRvd2FyZChmbG9hdCwgZmxvYXQpOworX19ERVZJQ0VfXyBkb3VibGUgcG93KGRvdWJsZSwgZG91YmxlKTsKK19fREVWSUNFX18gZG91YmxlIHBvdyhkb3VibGUsIGludCk7CitfX0RFVklDRV9fIGZsb2F0IHBvdyhmbG9hdCwgZmxvYXQpOworX19ERVZJQ0VfXyBmbG9hdCBwb3coZmxvYXQsIGludCk7CitfX0RFVklDRV9fIGRvdWJsZSByZW1haW5kZXIoZG91YmxlLCBkb3VibGUpOworX19ERVZJQ0VfXyBmbG9hdCByZW1haW5kZXIoZmxvYXQsIGZsb2F0KTsKK19fREVWSUNFX18gZG91YmxlIHJlbXF1byhkb3VibGUsIGRvdWJsZSwgaW50ICopOworX19ERVZJQ0VfXyBmbG9hdCByZW1xdW8oZmxvYXQsIGZsb2F0LCBpbnQgKik7CitfX0RFVklDRV9fIGRvdWJsZSByaW50KGRvdWJsZSk7CitfX0RFVklDRV9fIGZsb2F0IHJpbnQoZmxvYXQpOworX19ERVZJQ0VfXyBkb3VibGUgcm91bmQoZG91YmxlKTsKK19fREVWSUNFX18gZmxvYXQgcm91bmQoZmxvYXQpOworX19ERVZJQ0VfXyBkb3VibGUgc2NhbGJsbihkb3VibGUsIGxvbmcpOworX19ERVZJQ0VfXyBmbG9hdCBzY2FsYmxuKGZsb2F0LCBsb25nKTsKK19fREVWSUNFX18gZG91YmxlIHNjYWxibihkb3VibGUsIGludCk7CitfX0RFVklDRV9fIGZsb2F0IHNjYWxibihmbG9hdCwgaW50KTsKK19fREVWSUNFX18gYm9vbCBzaWduYml0KGRvdWJsZSk7CitfX0RFVklDRV9fIGJvb2wgc2lnbmJpdChmbG9hdCk7CitfX0RFVklDRV9fIGRvdWJsZSBzaW4oZG91YmxlKTsKK19fREVWSUNFX18gZmxvYXQgc2luKGZsb2F0KTsKK19fREVWSUNFX18gZG91YmxlIHNpbmgoZG91YmxlKTsKK19fREVWSUNFX18gZmxvYXQgc2luaChmbG9hdCk7CitfX0RFVklDRV9fIGRvdWJsZSBzcXJ0KGRvdWJsZSk7CitfX0RFVklDRV9fIGZsb2F0IHNxcnQoZmxvYXQpOworX19ERVZJQ0VfXyBkb3VibGUgdGFuKGRvdWJsZSk7CitfX0RFVklDRV9fIGZsb2F0IHRhbihmbG9hdCk7CitfX0RFVklDRV9fIGRvdWJsZSB0YW5oKGRvdWJsZSk7CitfX0RFVklDRV9fIGZsb2F0IHRhbmgoZmxvYXQpOworX19ERVZJQ0VfXyBkb3VibGUgdGdhbW1hKGRvdWJsZSk7CitfX0RFVklDRV9fIGZsb2F0IHRnYW1tYShmbG9hdCk7CitfX0RFVklDRV9fIGRvdWJsZSB0cnVuYyhkb3VibGUpOworX19ERVZJQ0VfXyBmbG9hdCB0cnVuYyhmbG9hdCk7CisKK25hbWVzcGFjZSBzdGQgewordXNpbmcgOjphYnM7Cit1c2luZyA6OmFjb3M7Cit1c2luZyA6OmFjb3NoOwordXNpbmcgOjphc2luOwordXNpbmcgOjphc2luaDsKK3VzaW5nIDo6YXRhbjsKK3VzaW5nIDo6YXRhbjI7Cit1c2luZyA6OmF0YW5oOwordXNpbmcgOjpjYnJ0OwordXNpbmcgOjpjZWlsOwordXNpbmcgOjpjb3B5c2lnbjsKK3VzaW5nIDo6Y29zOwordXNpbmcgOjpjb3NoOwordXNpbmcgOjplcmY7Cit1c2luZyA6OmVyZmM7Cit1c2luZyA6OmV4cDsKK3VzaW5nIDo6ZXhwMjsKK3VzaW5nIDo6ZXhwbTE7Cit1c2luZyA6OmZhYnM7Cit1c2luZyA6OmZkaW07Cit1c2luZyA6OmZsb29yOwordXNpbmcgOjpmbWE7Cit1c2luZyA6OmZtYXg7Cit1c2luZyA6OmZtaW47Cit1c2luZyA6OmZtb2Q7Cit1c2luZyA6OmZwY2xhc3NpZnk7Cit1c2luZyA6OmZyZXhwOwordXNpbmcgOjpoeXBvdDsKK3VzaW5nIDo6aWxvZ2I7Cit1c2luZyA6OmlzZmluaXRlOwordXNpbmcgOjppc2dyZWF0ZXI7Cit1c2luZyA6OmlzZ3JlYXRlcmVxdWFsOwordXNpbmcgOjppc2luZjsKK3VzaW5nIDo6aXNsZXNzOwordXNpbmcgOjppc2xlc3NlcXVhbDsKK3VzaW5nIDo6aXNsZXNzZ3JlYXRlcjsKK3VzaW5nIDo6aXNuYW47Cit1c2luZyA6Omlzbm9ybWFsOwordXNpbmcgOjppc3Vub3JkZXJlZDsKK3VzaW5nIDo6bGFiczsKK3VzaW5nIDo6bGRleHA7Cit1c2luZyA6OmxnYW1tYTsKK3VzaW5nIDo6bGxhYnM7Cit1c2luZyA6OmxscmludDsKK3VzaW5nIDo6bG9nOwordXNpbmcgOjpsb2cxMDsKK3VzaW5nIDo6bG9nMXA7Cit1c2luZyA6OmxvZzI7Cit1c2luZyA6OmxvZ2I7Cit1c2luZyA6OmxyaW50OwordXNpbmcgOjpscm91bmQ7Cit1c2luZyA6Om1vZGY7Cit1c2luZyA6Om5hbjsKK3VzaW5nIDo6bmFuZjsKK3VzaW5nIDo6bmVhcmJ5aW50OwordXNpbmcgOjpuZXh0YWZ0ZXI7Cit1c2luZyA6Om5leHR0b3dhcmQ7Cit1c2luZyA6OnBvdzsKK3VzaW5nIDo6cmVtYWluZGVyOwordXNpbmcgOjpyZW1xdW87Cit1c2luZyA6OnJpbnQ7Cit1c2luZyA6OnJvdW5kOwordXNpbmcgOjpzY2FsYmxuOwordXNpbmcgOjpzY2FsYm47Cit1c2luZyA6OnNpZ25iaXQ7Cit1c2luZyA6OnNpbjsKK3VzaW5nIDo6c2luaDsKK3VzaW5nIDo6c3FydDsKK3VzaW5nIDo6dGFuOwordXNpbmcgOjp0YW5oOwordXNpbmcgOjp0Z2FtbWE7Cit1c2luZyA6OnRydW5jOworfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNwcmFnbWEgcG9wX21hY3JvKCJfX0RFVklDRV9fIikKKworI2VuZGlmCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9fX2NsYW5nX2N1ZGFfcnVudGltZV93cmFwcGVyLmggYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9fX2NsYW5nX2N1ZGFfcnVudGltZV93cmFwcGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ0NWY5YgotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL19fY2xhbmdfY3VkYV9ydW50aW1lX3dyYXBwZXIuaApAQCAtMCwwICsxLDMxNiBAQAorLyo9PT0tLS0tIF9fY2xhbmdfY3VkYV9ydW50aW1lX3dyYXBwZXIuaCAtIENVREEgcnVudGltZSBzdXBwb3J0IC0tLS0tLS0tLS0tLS09PT0KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKgorICo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICovCisKKy8qCisgKiBXQVJOSU5HOiBUaGlzIGhlYWRlciBpcyBpbnRlbmRlZCB0byBiZSBkaXJlY3RseSAtaW5jbHVkZSdkIGJ5CisgKiB0aGUgY29tcGlsZXIgYW5kIGlzIG5vdCBzdXBwb3NlZCB0byBiZSBpbmNsdWRlZCBieSB1c2Vycy4KKyAqCisgKiBDVURBIGhlYWRlcnMgYXJlIGltcGxlbWVudGVkIGluIGEgd2F5IHRoYXQgY3VycmVudGx5IG1ha2VzIGl0CisgKiBpbXBvc3NpYmxlIGZvciB1c2VyIGNvZGUgdG8gI2luY2x1ZGUgZGlyZWN0bHkgd2hlbiBjb21waWxpbmcgd2l0aAorICogQ2xhbmcuIFRoZXkgcHJlc2VudCBkaWZmZXJlbnQgdmlldyBvZiBDVURBLXN1cHBsaWVkIGZ1bmN0aW9ucworICogZGVwZW5kaW5nIG9uIHdoZXJlIGluIE5WQ0MncyBjb21waWxhdGlvbiBwaXBlbGluZSB0aGUgaGVhZGVycyBhcmUKKyAqIGluY2x1ZGVkLiBOZWl0aGVyIG9mIHRoZXNlIG1vZGVzIHByb3ZpZGVzIGZ1bmN0aW9uIGRlZmluaXRpb25zIHdpdGgKKyAqIGNvcnJlY3QgYXR0cmlidXRlcywgc28gd2UgdXNlIHByZXByb2Nlc3NvciB0byBmb3JjZSB0aGUgaGVhZGVycworICogaW50byBhIGZvcm0gdGhhdCBDbGFuZyBjYW4gdXNlLgorICoKKyAqIFNpbWlsYXJseSB0byBOVkNDIHdoaWNoIC1pbmNsdWRlJ3MgY3VkYV9ydW50aW1lLmgsIENsYW5nIC1pbmNsdWRlJ3MKKyAqIHRoaXMgZmlsZSBkdXJpbmcgZXZlcnkgQ1VEQSBjb21waWxhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fQ0xBTkdfQ1VEQV9SVU5USU1FX1dSQVBQRVJfSF9fCisjZGVmaW5lIF9fQ0xBTkdfQ1VEQV9SVU5USU1FX1dSQVBQRVJfSF9fCisKKyNpZiBkZWZpbmVkKF9fQ1VEQV9fKSAmJiBkZWZpbmVkKF9fY2xhbmdfXykKKworLy8gSW5jbHVkZSBzb21lIGZvcndhcmQgZGVjbGFyZXMgdGhhdCBtdXN0IGNvbWUgYmVmb3JlIGNtYXRoLgorI2luY2x1ZGUgPF9fY2xhbmdfY3VkYV9tYXRoX2ZvcndhcmRfZGVjbGFyZXMuaD4KKworLy8gSW5jbHVkZSBzb21lIHN0YW5kYXJkIGhlYWRlcnMgdG8gYXZvaWQgQ1VEQSBoZWFkZXJzIGluY2x1ZGluZyB0aGVtCisvLyB3aGlsZSBzb21lIHJlcXVpcmVkIG1hY3JvcyAobGlrZSBfX1RIUk9XKSBhcmUgaW4gYSB3ZWlyZCBzdGF0ZS4KKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisvLyBQcmVzZXJ2ZSBjb21tb24gbWFjcm9zIHRoYXQgd2lsbCBiZSBjaGFuZ2VkIGJlbG93IGJ5IHVzIG9yIGJ5IENVREEKKy8vIGhlYWRlcnMuCisjcHJhZ21hIHB1c2hfbWFjcm8oIl9fVEhST1ciKQorI3ByYWdtYSBwdXNoX21hY3JvKCJfX0NVREFfQVJDSF9fIikKKworLy8gV0FSTklORzogUHJlcHJvY2Vzc29yIGhhY2tzIGJlbG93IGFyZSBiYXNlZCBvbiBzcGVjaWZpYyBkZXRhaWxzIG9mCisvLyBDVURBLTcueCBoZWFkZXJzIGFuZCBhcmUgbm90IGV4cGVjdGVkIHRvIHdvcmsgd2l0aCBhbnkgb3RoZXIKKy8vIHZlcnNpb24gb2YgQ1VEQSBoZWFkZXJzLgorI2luY2x1ZGUgImN1ZGEuaCIKKyNpZiAhZGVmaW5lZChDVURBX1ZFUlNJT04pCisjZXJyb3IgImN1ZGEuaCBkaWQgbm90IGRlZmluZSBDVURBX1ZFUlNJT04iCisjZWxpZiBDVURBX1ZFUlNJT04gPCA3MDAwIHx8IENVREFfVkVSU0lPTiA+IDcwNTAKKyNlcnJvciAiVW5zdXBwb3J0ZWQgQ1VEQSB2ZXJzaW9uISIKKyNlbmRpZgorCisvLyBNYWtlIGxhcmdlc3Qgc3Vic2V0IG9mIGRldmljZSBmdW5jdGlvbnMgYXZhaWxhYmxlIGR1cmluZyBob3N0CisvLyBjb21waWxhdGlvbiAtLSBTTV8zNSBmb3IgdGhlIHRpbWUgYmVpbmcuCisjaWZuZGVmIF9fQ1VEQV9BUkNIX18KKyNkZWZpbmUgX19DVURBX0FSQ0hfXyAzNTAKKyNlbmRpZgorCisjaW5jbHVkZSAiY3VkYV9idWlsdGluX3ZhcnMuaCIKKworLy8gTm8gbmVlZCBmb3IgZGV2aWNlX2xhdW5jaF9wYXJhbWV0ZXJzLmggYXMgY3VkYV9idWlsdGluX3ZhcnMuaCBhYm92ZQorLy8gaGFzIHRha2VuIGNhcmUgb2YgYnVpbHRpbiB2YXJpYWJsZXMgZGVjbGFyZWQgaW4gdGhlIGZpbGUuCisjZGVmaW5lIF9fREVWSUNFX0xBVU5DSF9QQVJBTUVURVJTX0hfXworCisvLyB7bWF0aCxkZXZpY2V9X2Z1bmN0aW9ucy5oIG9ubHkgaGF2ZSBkZWNsYXJhdGlvbnMgb2YgdGhlCisvLyBmdW5jdGlvbnMuIFdlIGRvbid0IG5lZWQgdGhlbSBhcyB3ZSdyZSBnb2luZyB0byBwdWxsIGluIHRoZWlyCisvLyBkZWZpbml0aW9ucyBmcm9tIC5ocHAgZmlsZXMuCisjZGVmaW5lIF9fREVWSUNFX0ZVTkNUSU9OU19IX18KKyNkZWZpbmUgX19NQVRIX0ZVTkNUSU9OU19IX18KKyNkZWZpbmUgX19DT01NT05fRlVOQ1RJT05TX0hfXworCisjdW5kZWYgX19DVURBQ0NfXworI2RlZmluZSBfX0NVREFCRV9fCisvLyBEaXNhYmxlcyBkZWZpbml0aW9ucyBvZiBkZXZpY2Utc2lkZSBydW50aW1lIHN1cHBvcnQgc3R1YnMgaW4KKy8vIGN1ZGFfZGV2aWNlX3J1bnRpbWVfYXBpLmgKKyNpbmNsdWRlICJkcml2ZXJfdHlwZXMuaCIKKyNpbmNsdWRlICJob3N0X2NvbmZpZy5oIgorI2luY2x1ZGUgImhvc3RfZGVmaW5lcy5oIgorCisjdW5kZWYgX19DVURBQkVfXworI2RlZmluZSBfX0NVREFDQ19fCisjaW5jbHVkZSAiY3VkYV9ydW50aW1lLmgiCisKKyN1bmRlZiBfX0NVREFDQ19fCisjZGVmaW5lIF9fQ1VEQUJFX18KKworLy8gQ1VEQSBoZWFkZXJzIHVzZSBfX252dm1fbWVtY3B5IGFuZCBfX252dm1fbWVtc2V0IHdoaWNoIENsYW5nIGRvZXMKKy8vIG5vdCBoYXZlIGF0IHRoZSBtb21lbnQuIEVtdWxhdGUgdGhlbSB3aXRoIGEgYnVpbHRpbiBtZW1jcHkvbWVtc2V0LgorI2RlZmluZSBfX252dm1fbWVtY3B5KHMsIGQsIG4sIGEpIF9fYnVpbHRpbl9tZW1jcHkocywgZCwgbikKKyNkZWZpbmUgX19udnZtX21lbXNldChkLCBjLCBuLCBhKSBfX2J1aWx0aW5fbWVtc2V0KGQsIGMsIG4pCisKKyNpbmNsdWRlICJjcnQvZGV2aWNlX3J1bnRpbWUuaCIKKyNpbmNsdWRlICJjcnQvaG9zdF9ydW50aW1lLmgiCisvLyBkZXZpY2VfcnVudGltZS5oIGRlZmluZXMgX19jeGFfKiBtYWNyb3MgdGhhdCB3aWxsIGNvbmZsaWN0IHdpdGgKKy8vIGN4eGFiaS5oLgorLy8gRklYTUU6IHJlZGVmaW5lIHRoZXNlIGFzIF9fZGV2aWNlX18gZnVuY3Rpb25zLgorI3VuZGVmIF9fY3hhX3ZlY19jdG9yCisjdW5kZWYgX19jeGFfdmVjX2NjdG9yCisjdW5kZWYgX19jeGFfdmVjX2R0b3IKKyN1bmRlZiBfX2N4YV92ZWNfbmV3MgorI3VuZGVmIF9fY3hhX3ZlY19uZXczCisjdW5kZWYgX19jeGFfdmVjX2RlbGV0ZTIKKyN1bmRlZiBfX2N4YV92ZWNfZGVsZXRlCisjdW5kZWYgX19jeGFfdmVjX2RlbGV0ZTMKKyN1bmRlZiBfX2N4YV9wdXJlX3ZpcnR1YWwKKworLy8gV2UgbmVlZCBkZWNscyBmb3IgZnVuY3Rpb25zIGluIENVREEncyBsaWJkZXZpY2Ugd2l0aCBfX2RldmljZV9fCisvLyBhdHRyaWJ1dGUgb25seS4gQWxhcyB0aGV5IGNvbWUgZWl0aGVyIGFzIF9faG9zdF9fIF9fZGV2aWNlX18gb3IKKy8vIHdpdGggbm8gYXR0cmlidXRlcyBhdCBhbGwuIFRvIHdvcmsgYXJvdW5kIHRoYXQsIGRlZmluZSBfX0NVREFfUlRDX18KKy8vIHdoaWNoIHByb2R1Y2VzIEhEIHZhcmlhbnQgYW5kIHVuZGVmIF9faG9zdF9fIHdoaWNoIGdpdmVzIHVzIGRlc2lkZWQKKy8vIGRlY2xzIHdpdGggX19kZXZpY2VfXyBhdHRyaWJ1dGUuCisjcHJhZ21hIHB1c2hfbWFjcm8oIl9faG9zdF9fIikKKyNkZWZpbmUgX19ob3N0X18KKyNkZWZpbmUgX19DVURBQ0NfUlRDX18KKyNpbmNsdWRlICJkZXZpY2VfZnVuY3Rpb25zX2RlY2xzLmgiCisjdW5kZWYgX19DVURBQ0NfUlRDX18KKworLy8gVGVtcG9yYXJpbHkgcG9pc29uIF9faG9zdF9fIG1hY3JvIHRvIGVuc3VyZSBpdCdzIG5vdCB1c2VkIGJ5IGFueSBvZgorLy8gdGhlIGhlYWRlcnMgd2UncmUgYWJvdXQgdG8gaW5jbHVkZS4KKyNkZWZpbmUgX19ob3N0X18gVU5FWFBFQ1RFRF9IT1NUX0FUVFJJQlVURQorCisvLyBkZXZpY2VfZnVuY3Rpb25zLmhwcCBhbmQgbWF0aF9mdW5jdGlvbnMqLmhwcCB1c2UgJ3N0YXRpYworLy8gX19mb3JjZWlubGluZV9fJyAod2l0aCBubyBfX2RldmljZV9fKSBmb3IgZGVmaW5pdGlvbnMgb2YgZGV2aWNlCisvLyBmdW5jdGlvbnMuIFRlbXBvcmFyaWx5IHJlZGVmaW5lIF9fZm9yY2VpbmxpbmVfXyB0byBpbmNsdWRlCisvLyBfX2RldmljZV9fLgorI3ByYWdtYSBwdXNoX21hY3JvKCJfX2ZvcmNlaW5saW5lX18iKQorI2RlZmluZSBfX2ZvcmNlaW5saW5lX18gX19kZXZpY2VfXyBfX2lubGluZV9fIF9fYXR0cmlidXRlX18oKGFsd2F5c19pbmxpbmUpKQorI2luY2x1ZGUgImRldmljZV9mdW5jdGlvbnMuaHBwIgorCisvLyBtYXRoX2Z1bmN0aW9uLmhwcCB1c2VzIHRoZSBfX1VTRV9GQVNUX01BVEhfXyBtYWNybyB0byBkZXRlcm1pbmUgd2hldGhlciB3ZQorLy8gZ2V0IHRoZSBzbG93LWJ1dC1hY2N1cmF0ZSBvciBmYXN0LWJ1dC1pbmFjY3VyYXRlIHZlcnNpb25zIG9mIGZ1bmN0aW9ucyBsaWtlCisvLyBzaW4gYW5kIGV4cC4gIFRoaXMgaXMgY29udHJvbGxlZCBpbiBjbGFuZyBieSAtZmN1ZGEtYXBwcm94LXRyYW5zY2VuZGVudGFscy4KKy8vCisvLyBkZXZpY2VfZnVuY3Rpb25zLmhwcCB1c2VzIF9fVVNFX0ZBU1RfTUFUSF9fIGZvciBhIGRpZmZlcmVudCBwdXJwb3NlIChmYXN0IHZzLgorLy8gc2xvdyBkaXZpZGVzKSwgc28gd2UgbmVlZCB0byBzY29wZSBvdXIgZGVmaW5lIGNhcmVmdWxseSBoZXJlLgorI3ByYWdtYSBwdXNoX21hY3JvKCJfX1VTRV9GQVNUX01BVEhfXyIpCisjaWYgZGVmaW5lZChfX0NMQU5HX0NVREFfQVBQUk9YX1RSQU5TQ0VOREVOVEFMU19fKQorI2RlZmluZSBfX1VTRV9GQVNUX01BVEhfXworI2VuZGlmCisjaW5jbHVkZSAibWF0aF9mdW5jdGlvbnMuaHBwIgorI3ByYWdtYSBwb3BfbWFjcm8oIl9fVVNFX0ZBU1RfTUFUSF9fIikKKworI2luY2x1ZGUgIm1hdGhfZnVuY3Rpb25zX2RibF9wdHgzLmhwcCIKKyNwcmFnbWEgcG9wX21hY3JvKCJfX2ZvcmNlaW5saW5lX18iKQorCisvLyBQdWxsIGluIGhvc3Qtb25seSBmdW5jdGlvbnMgdGhhdCBhcmUgb25seSBhdmFpbGFibGUgd2hlbiBuZWl0aGVyCisvLyBfX0NVREFDQ19fIG5vciBfX0NVREFCRV9fIGFyZSBkZWZpbmVkLgorI3VuZGVmIF9fTUFUSF9GVU5DVElPTlNfSFBQX18KKyN1bmRlZiBfX0NVREFCRV9fCisjaW5jbHVkZSAibWF0aF9mdW5jdGlvbnMuaHBwIgorLy8gQWxhcywgYWRkaXRpb25hbCBvdmVybG9hZHMgZm9yIHRoZXNlIGZ1bmN0aW9ucyBhcmUgaGFyZCB0byBnZXQgdG8uCisvLyBDb25zaWRlcmluZyB0aGF0IHdlIG9ubHkgbmVlZCB0aGVzZSBvdmVybG9hZHMgZm9yIGEgZmV3IGZ1bmN0aW9ucywKKy8vIHdlIGNhbiBwcm92aWRlIHRoZW0gaGVyZS4KK3N0YXRpYyBpbmxpbmUgZmxvYXQgcnNxcnQoZmxvYXQgX19hKSB7IHJldHVybiByc3FydGYoX19hKTsgfQorc3RhdGljIGlubGluZSBmbG9hdCByY2JydChmbG9hdCBfX2EpIHsgcmV0dXJuIHJjYnJ0ZihfX2EpOyB9CitzdGF0aWMgaW5saW5lIGZsb2F0IHNpbnBpKGZsb2F0IF9fYSkgeyByZXR1cm4gc2lucGlmKF9fYSk7IH0KK3N0YXRpYyBpbmxpbmUgZmxvYXQgY29zcGkoZmxvYXQgX19hKSB7IHJldHVybiBjb3NwaWYoX19hKTsgfQorc3RhdGljIGlubGluZSB2b2lkIHNpbmNvc3BpKGZsb2F0IF9fYSwgZmxvYXQgKl9fYiwgZmxvYXQgKl9fYykgeworICByZXR1cm4gc2luY29zcGlmKF9fYSwgX19iLCBfX2MpOworfQorc3RhdGljIGlubGluZSBmbG9hdCBlcmZjaW52KGZsb2F0IF9fYSkgeyByZXR1cm4gZXJmY2ludmYoX19hKTsgfQorc3RhdGljIGlubGluZSBmbG9hdCBub3JtY2RmaW52KGZsb2F0IF9fYSkgeyByZXR1cm4gbm9ybWNkZmludmYoX19hKTsgfQorc3RhdGljIGlubGluZSBmbG9hdCBub3JtY2RmKGZsb2F0IF9fYSkgeyByZXR1cm4gbm9ybWNkZmYoX19hKTsgfQorc3RhdGljIGlubGluZSBmbG9hdCBlcmZjeChmbG9hdCBfX2EpIHsgcmV0dXJuIGVyZmN4ZihfX2EpOyB9CisKKy8vIEZvciBzb21lIHJlYXNvbiBzaW5nbGUtYXJndW1lbnQgdmFyaWFudCBpcyBub3QgYWx3YXlzIGRlY2xhcmVkIGJ5CisvLyBDVURBIGhlYWRlcnMuIEFsYXMsIGRldmljZV9mdW5jdGlvbnMuaHBwIGluY2x1ZGVkIGJlbG93IG5lZWRzIGl0Lgorc3RhdGljIGlubGluZSBfX2RldmljZV9fIHZvaWQgX19icmtwdChpbnQgX19jKSB7IF9fYnJrcHQoKTsgfQorCisvLyBOb3cgaW5jbHVkZSAqLmhwcCB3aXRoIGRlZmluaXRpb25zIG9mIHZhcmlvdXMgR1BVIGZ1bmN0aW9ucy4gIEFsYXMsCisvLyBhIGxvdCBvZiB0aGlucyBnZXQgZGVjbGFyZWQvZGVmaW5lZCB3aXRoIF9faG9zdF9fIGF0dHJpYnV0ZSB3aGljaAorLy8gd2UgZG9uJ3Qgd2FudCBhbmQgd2UgaGF2ZSB0byBkZWZpbmUgaXQgb3V0LiBXZSBhbHNvIGhhdmUgdG8gaW5jbHVkZQorLy8ge2RldmljZSxtYXRofV9mdW5jdGlvbnMuaHBwIGFnYWluIGluIG9yZGVyIHRvIGV4dHJhY3QgdGhlIG90aGVyCisvLyBicmFuY2ggb2YgI2lmL2Vsc2UgaW5zaWRlLgorCisjZGVmaW5lIF9faG9zdF9fCisjdW5kZWYgX19DVURBQkVfXworI2RlZmluZSBfX0NVREFDQ19fCisjdW5kZWYgX19ERVZJQ0VfRlVOQ1RJT05TX0hQUF9fCisjaW5jbHVkZSAiZGV2aWNlX2F0b21pY19mdW5jdGlvbnMuaHBwIgorI2luY2x1ZGUgImRldmljZV9mdW5jdGlvbnMuaHBwIgorI2luY2x1ZGUgInNtXzIwX2F0b21pY19mdW5jdGlvbnMuaHBwIgorI2luY2x1ZGUgInNtXzIwX2ludHJpbnNpY3MuaHBwIgorI2luY2x1ZGUgInNtXzMyX2F0b21pY19mdW5jdGlvbnMuaHBwIgorCisvLyBEb24ndCBpbmNsdWRlIHNtXzMwX2ludHJpbnNpY3MuaCBhbmQgc21fMzJfaW50cmluc2ljcy5oLiAgVGhlc2UgZGVmaW5lIHRoZQorLy8gX19zaGZsIGFuZCBfX2xkZyBpbnRyaW5zaWNzIHVzaW5nIGlubGluZSAodm9sYXRpbGUpIGFzbSwgYnV0IHdlIHdhbnQgdG8KKy8vIGRlZmluZSB0aGVtIHVzaW5nIGJ1aWx0aW5zIHNvIHRoYXQgdGhlIG9wdGltaXplciBjYW4gcmVhc29uIGFib3V0IGFuZCBhY3Jvc3MKKy8vIHRoZXNlIGluc3RydWN0aW9ucy4gIEluIHBhcnRpY3VsYXIsIHVzaW5nIGludHJpbnNpY3MgZm9yIGxkZyBnZXRzIHVzIHRoZQorLy8gW2FkZHIraW1tXSBhZGRyZXNzaW5nIG1vZGUsIHdoaWNoLCBhbHRob3VnaCBpdCBkb2Vzbid0IGFjdHVhbGx5IGV4aXN0IGluIHRoZQorLy8gaGFyZHdhcmUsIHNlZW1zIHRvIGdlbmVyYXRlIGZhc3RlciBtYWNoaW5lIGNvZGUgYmVjYXVzZSBwdHhhcyBjYW4gbW9yZSBlYXNpbHkKKy8vIHJlYXNvbiBhYm91dCBvdXIgY29kZS4KKworI3VuZGVmIF9fTUFUSF9GVU5DVElPTlNfSFBQX18KKworLy8gbWF0aF9mdW5jdGlvbnMuaHBwIGRlZmluZXMgOjpzaWduYml0IGFzIGEgX19ob3N0X18gX19kZXZpY2VfXyBmdW5jdGlvbi4gIFRoaXMKKy8vIGNvbmZsaWN0cyB3aXRoIGxpYnN0ZGMrKydzIGNvbnN0ZXhwciA6OnNpZ25iaXQsIHNvIHdlIGhhdmUgdG8gcmVuYW1lCisvLyBtYXRoX2Z1bmN0aW9uLmhwcCdzIDo6c2lnbmJpdC4gIEl0J3MgZ3VhcmRlZCBieSAjdW5kZWYgc2lnbmJpdCwgYnV0IHRoYXQncworLy8gY29uZGl0aW9uYWwgb24gX19HTlVDX18uICA6KQorI3ByYWdtYSBwdXNoX21hY3JvKCJzaWduYml0IikKKyNwcmFnbWEgcHVzaF9tYWNybygiX19HTlVDX18iKQorI3VuZGVmIF9fR05VQ19fCisjZGVmaW5lIHNpZ25iaXQgX19pZ25vcmVkX2N1ZGFfc2lnbmJpdAorI2luY2x1ZGUgIm1hdGhfZnVuY3Rpb25zLmhwcCIKKyNwcmFnbWEgcG9wX21hY3JvKCJfX0dOVUNfXyIpCisjcHJhZ21hIHBvcF9tYWNybygic2lnbmJpdCIpCisKKyNwcmFnbWEgcG9wX21hY3JvKCJfX2hvc3RfXyIpCisKKyNpbmNsdWRlICJ0ZXh0dXJlX2luZGlyZWN0X2Z1bmN0aW9ucy5oIgorCisvLyBSZXN0b3JlIHN0YXRlIG9mIF9fQ1VEQV9BUkNIX18gYW5kIF9fVEhST1cgd2UgaGFkIG9uIGVudHJ5LgorI3ByYWdtYSBwb3BfbWFjcm8oIl9fQ1VEQV9BUkNIX18iKQorI3ByYWdtYSBwb3BfbWFjcm8oIl9fVEhST1ciKQorCisvLyBTZXQgdXAgY29tcGlsZXIgbWFjcm9zIGV4cGVjdGVkIHRvIGJlIHNlZW4gZHVyaW5nIGNvbXBpbGF0aW9uLgorI3VuZGVmIF9fQ1VEQUJFX18KKyNkZWZpbmUgX19DVURBQ0NfXworCitleHRlcm4gIkMiIHsKKy8vIERldmljZS1zaWRlIENVREEgc3lzdGVtIGNhbGxzLgorLy8gaHR0cDovL2RvY3MubnZpZGlhLmNvbS9jdWRhL3B0eC13cml0ZXJzLWd1aWRlLXRvLWludGVyb3BlcmFiaWxpdHkvaW5kZXguaHRtbCNzeXN0ZW0tY2FsbHMKKy8vIFdlIG5lZWQgdGhlc2UgZGVjbGFyYXRpb25zIGFuZCB3cmFwcGVycyBmb3IgZGV2aWNlLXNpZGUKKy8vIG1hbGxvYy9mcmVlL3ByaW50ZiBjYWxscyB0byB3b3JrIHdpdGhvdXQgcmVseWluZyBvbgorLy8gLWZjdWRhLWRpc2FibGUtdGFyZ2V0LWNhbGwtY2hlY2tzIG9wdGlvbi4KK19fZGV2aWNlX18gaW50IHZwcmludGYoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworX19kZXZpY2VfXyB2b2lkIGZyZWUodm9pZCAqKSBfX2F0dHJpYnV0ZSgobm90aHJvdykpOworX19kZXZpY2VfXyB2b2lkICptYWxsb2Moc2l6ZV90KSBfX2F0dHJpYnV0ZSgobm90aHJvdykpIF9fYXR0cmlidXRlX18oKG1hbGxvYykpOworX19kZXZpY2VfXyB2b2lkIF9fYXNzZXJ0ZmFpbChjb25zdCBjaGFyICpfX21lc3NhZ2UsIGNvbnN0IGNoYXIgKl9fZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgX19saW5lLCBjb25zdCBjaGFyICpfX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgX19jaGFyU2l6ZSkgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKKworLy8gSW4gb3JkZXIgZm9yIHN0YW5kYXJkIGFzc2VydCgpIG1hY3JvIG9uIGxpbnV4IHRvIHdvcmsgd2UgbmVlZCB0bworLy8gcHJvdmlkZSBkZXZpY2Utc2lkZSBfX2Fzc2VydF9mYWlsKCkKK19fZGV2aWNlX18gc3RhdGljIGlubGluZSB2b2lkIF9fYXNzZXJ0X2ZhaWwoY29uc3QgY2hhciAqX19tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpfX2ZpbGUsIHVuc2lnbmVkIF9fbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqX19mdW5jdGlvbikgeworICBfX2Fzc2VydGZhaWwoX19tZXNzYWdlLCBfX2ZpbGUsIF9fbGluZSwgX19mdW5jdGlvbiwgc2l6ZW9mKGNoYXIpKTsKK30KKworLy8gQ2xhbmcgd2lsbCBjb252ZXJ0IHByaW50ZiBpbnRvIHZwcmludGYsIGJ1dCB3ZSBzdGlsbCBuZWVkCisvLyBkZXZpY2Utc2lkZSBkZWNsYXJhdGlvbiBmb3IgaXQuCitfX2RldmljZV9fIGludCBwcmludGYoY29uc3QgY2hhciAqLCAuLi4pOworfSAvLyBleHRlcm4gIkMiCisKKy8vIFdlIGFsc28gbmVlZCBkZXZpY2Utc2lkZSBzdGQ6Om1hbGxvYyBhbmQgc3RkOjpmcmVlLgorbmFtZXNwYWNlIHN0ZCB7CitfX2RldmljZV9fIHN0YXRpYyBpbmxpbmUgdm9pZCBmcmVlKHZvaWQgKl9fcHRyKSB7IDo6ZnJlZShfX3B0cik7IH0KK19fZGV2aWNlX18gc3RhdGljIGlubGluZSB2b2lkICptYWxsb2Moc2l6ZV90IF9fc2l6ZSkgeworICByZXR1cm4gOjptYWxsb2MoX19zaXplKTsKK30KK30gLy8gbmFtZXNwYWNlIHN0ZAorCisvLyBPdXQtb2YtbGluZSBpbXBsZW1lbnRhdGlvbnMgZnJvbSBjdWRhX2J1aWx0aW5fdmFycy5oLiAgVGhlc2UgbmVlZCB0byBjb21lCisvLyBhZnRlciB3ZSd2ZSBwdWxsZWQgaW4gdGhlIGRlZmluaXRpb24gb2YgdWludDMgYW5kIGRpbTMuCisKK19fZGV2aWNlX18gaW5saW5lIF9fY3VkYV9idWlsdGluX3RocmVhZElkeF90OjpvcGVyYXRvciB1aW50MygpIGNvbnN0IHsKKyAgdWludDMgcmV0OworICByZXQueCA9IHg7CisgIHJldC55ID0geTsKKyAgcmV0LnogPSB6OworICByZXR1cm4gcmV0OworfQorCitfX2RldmljZV9fIGlubGluZSBfX2N1ZGFfYnVpbHRpbl9ibG9ja0lkeF90OjpvcGVyYXRvciB1aW50MygpIGNvbnN0IHsKKyAgdWludDMgcmV0OworICByZXQueCA9IHg7CisgIHJldC55ID0geTsKKyAgcmV0LnogPSB6OworICByZXR1cm4gcmV0OworfQorCitfX2RldmljZV9fIGlubGluZSBfX2N1ZGFfYnVpbHRpbl9ibG9ja0RpbV90OjpvcGVyYXRvciBkaW0zKCkgY29uc3QgeworICByZXR1cm4gZGltMyh4LCB5LCB6KTsKK30KKworX19kZXZpY2VfXyBpbmxpbmUgX19jdWRhX2J1aWx0aW5fZ3JpZERpbV90OjpvcGVyYXRvciBkaW0zKCkgY29uc3QgeworICByZXR1cm4gZGltMyh4LCB5LCB6KTsKK30KKworI2luY2x1ZGUgPF9fY2xhbmdfY3VkYV9jbWF0aC5oPgorI2luY2x1ZGUgPF9fY2xhbmdfY3VkYV9pbnRyaW5zaWNzLmg+CisKKy8vIGN1cmFuZF9tdGdwMzJfa2VybmVsIGhlbHBmdWxseSByZWRlY2xhcmVzIGJsb2NrRGltIGFuZCB0aHJlYWRJZHggaW4gaG9zdAorLy8gbW9kZSwgZ2l2aW5nIHRoZW0gdGhlaXIgInByb3BlciIgdHlwZXMgb2YgZGltMyBhbmQgdWludDMuICBUaGlzIGlzCisvLyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgdHlwZXMgd2UgZ2l2ZSBpbiBjdWRhX2J1aWx0aW5fdmFycy5oLiAgQXMgYXMgaGFjaywKKy8vIGZvcmNlLWluY2x1ZGUgdGhlIGhlYWRlciAobnZjYyBkb2Vzbid0IGluY2x1ZGUgaXQgYnkgZGVmYXVsdCkgYnV0IHJlZGVmaW5lCisvLyBkaW0zIGFuZCB1aW50MyB0byBvdXIgYnVpbHRpbiB0eXBlcy4gIChUaGFua2Z1bGx5IGRpbTMgYW5kIHVpbnQzIGFyZSBvbmx5CisvLyB1c2VkIGhlcmUgZm9yIHRoZSByZWRlY2xhcmF0aW9ucyBvZiBibG9ja0RpbSBhbmQgdGhyZWFkSWR4LikKKyNwcmFnbWEgcHVzaF9tYWNybygiZGltMyIpCisjcHJhZ21hIHB1c2hfbWFjcm8oInVpbnQzIikKKyNkZWZpbmUgZGltMyBfX2N1ZGFfYnVpbHRpbl9ibG9ja0RpbV90CisjZGVmaW5lIHVpbnQzIF9fY3VkYV9idWlsdGluX3RocmVhZElkeF90CisjaW5jbHVkZSAiY3VyYW5kX210Z3AzMl9rZXJuZWwuaCIKKyNwcmFnbWEgcG9wX21hY3JvKCJkaW0zIikKKyNwcmFnbWEgcG9wX21hY3JvKCJ1aW50MyIpCisjcHJhZ21hIHBvcF9tYWNybygiX19VU0VfRkFTVF9NQVRIX18iKQorCisjZW5kaWYgLy8gX19DVURBX18KKyNlbmRpZiAvLyBfX0NMQU5HX0NVREFfUlVOVElNRV9XUkFQUEVSX0hfXwpkaWZmIC0tZ2l0IGEvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvX19zdGRkZWZfbWF4X2FsaWduX3QuaCBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL19fc3RkZGVmX21heF9hbGlnbl90LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUxMGNhOQotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL19fc3RkZGVmX21heF9hbGlnbl90LmgKQEAgLTAsMCArMSw0MyBAQAorLyo9PT0tLS0tIF9fc3RkZGVmX21heF9hbGlnbl90LmggLSBEZWZpbml0aW9uIG9mIG1heF9hbGlnbl90IGZvciBtb2R1bGVzIC0tLT09PQorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNCBDaGFuZGxlciBDYXJydXRoCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICoKKyAqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqLworCisjaWZuZGVmIF9fQ0xBTkdfTUFYX0FMSUdOX1RfREVGSU5FRAorI2RlZmluZSBfX0NMQU5HX01BWF9BTElHTl9UX0RFRklORUQKKworI2lmIGRlZmluZWQoX01TQ19WRVIpCit0eXBlZGVmIGRvdWJsZSBtYXhfYWxpZ25fdDsKKyNlbGlmIGRlZmluZWQoX19BUFBMRV9fKQordHlwZWRlZiBsb25nIGRvdWJsZSBtYXhfYWxpZ25fdDsKKyNlbHNlCisvLyBEZWZpbmUgJ21heF9hbGlnbl90JyB0byBtYXRjaCB0aGUgR0NDIGRlZmluaXRpb24uCit0eXBlZGVmIHN0cnVjdCB7CisgIGxvbmcgbG9uZyBfX2NsYW5nX21heF9hbGlnbl9ub25jZTEKKyAgICAgIF9fYXR0cmlidXRlX18oKF9fYWxpZ25lZF9fKF9fYWxpZ25vZl9fKGxvbmcgbG9uZykpKSk7CisgIGxvbmcgZG91YmxlIF9fY2xhbmdfbWF4X2FsaWduX25vbmNlMgorICAgICAgX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oX19hbGlnbm9mX18obG9uZyBkb3VibGUpKSkpOworfSBtYXhfYWxpZ25fdDsKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL19fd21taW50cmluX2Flcy5oIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvX193bW1pbnRyaW5fYWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjExNTE4ZQotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL19fd21taW50cmluX2Flcy5oCkBAIC0wLDAgKzEsMTUxIEBACisvKj09PS0tLS0gX193bW1pbnRyaW5fYWVzLmggLSBBRVMgaW50cmluc2ljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICoKKyAqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqLworI2lmbmRlZiBfV01NSU5UUklOX0FFU19ICisjZGVmaW5lIF9XTU1JTlRSSU5fQUVTX0gKKworI2luY2x1ZGUgPGVtbWludHJpbi5oPgorCisvKiBEZWZpbmUgdGhlIGRlZmF1bHQgYXR0cmlidXRlcyBmb3IgdGhlIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUuICovCisjZGVmaW5lIF9fREVGQVVMVF9GTl9BVFRSUyBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18sIF9fdGFyZ2V0X18oImFlcyIpKSkKKworLy8vIFxicmllZiBQZXJmb3JtcyBhIHNpbmdsZSByb3VuZCBvZiBBRVMgZW5jcnlwdGlvbiB1c2luZyB0aGUgRXF1aXZhbGVudAorLy8vICAgIEludmVyc2UgQ2lwaGVyLCB0cmFuc2Zvcm1pbmcgdGhlIHN0YXRlIHZhbHVlIGZyb20gdGhlIGZpcnN0IHNvdXJjZQorLy8vICAgIG9wZXJhbmQgdXNpbmcgYSAxMjgtYml0IHJvdW5kIGtleSB2YWx1ZSBjb250YWluZWQgaW4gdGhlIHNlY29uZCBzb3VyY2UKKy8vLyAgICBvcGVyYW5kLCBhbmQgd3JpdGVzIHRoZSByZXN1bHQgdG8gdGhlIGRlc3RpbmF0aW9uLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZBRVNFTkMgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19WCisvLy8gICAgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIHN0YXRlIHZhbHVlLgorLy8vIFxwYXJhbSBfX1IKKy8vLyAgICBBIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgcm91bmQga2V5IHZhbHVlLgorLy8vIFxyZXR1cm5zIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIHRoZSBlbmNyeXB0ZWQgdmFsdWUuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2Flc2VuY19zaTEyOChfX20xMjhpIF9fViwgX19tMTI4aSBfX1IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9hZXNlbmMxMjgoKF9fdjJkaSlfX1YsIChfX3YyZGkpX19SKTsKK30KKworLy8vIFxicmllZiBQZXJmb3JtcyB0aGUgZmluYWwgcm91bmQgb2YgQUVTIGVuY3J5cHRpb24gdXNpbmcgdGhlIEVxdWl2YWxlbnQKKy8vLyAgICBJbnZlcnNlIENpcGhlciwgdHJhbnNmb3JtaW5nIHRoZSBzdGF0ZSB2YWx1ZSBmcm9tIHRoZSBmaXJzdCBzb3VyY2UKKy8vLyAgICBvcGVyYW5kIHVzaW5nIGEgMTI4LWJpdCByb3VuZCBrZXkgdmFsdWUgY29udGFpbmVkIGluIHRoZSBzZWNvbmQgc291cmNlCisvLy8gICAgb3BlcmFuZCwgYW5kIHdyaXRlcyB0aGUgcmVzdWx0IHRvIHRoZSBkZXN0aW5hdGlvbi4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWQUVTRU5DTEFTVCBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX1YKKy8vLyAgICBBIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgc3RhdGUgdmFsdWUuCisvLy8gXHBhcmFtIF9fUgorLy8vICAgIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIHRoZSByb3VuZCBrZXkgdmFsdWUuCisvLy8gXHJldHVybnMgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIGVuY3J5cHRlZCB2YWx1ZS4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fYWVzZW5jbGFzdF9zaTEyOChfX20xMjhpIF9fViwgX19tMTI4aSBfX1IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9hZXNlbmNsYXN0MTI4KChfX3YyZGkpX19WLCAoX192MmRpKV9fUik7Cit9CisKKy8vLyBcYnJpZWYgUGVyZm9ybXMgYSBzaW5nbGUgcm91bmQgb2YgQUVTIGRlY3J5cHRpb24gdXNpbmcgdGhlIEVxdWl2YWxlbnQKKy8vLyAgICBJbnZlcnNlIENpcGhlciwgdHJhbnNmb3JtaW5nIHRoZSBzdGF0ZSB2YWx1ZSBmcm9tIHRoZSBmaXJzdCBzb3VyY2UKKy8vLyAgICBvcGVyYW5kIHVzaW5nIGEgMTI4LWJpdCByb3VuZCBrZXkgdmFsdWUgY29udGFpbmVkIGluIHRoZSBzZWNvbmQgc291cmNlCisvLy8gICAgb3BlcmFuZCwgYW5kIHdyaXRlcyB0aGUgcmVzdWx0IHRvIHRoZSBkZXN0aW5hdGlvbi4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWQUVTREVDIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fVgorLy8vICAgIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIHRoZSBzdGF0ZSB2YWx1ZS4KKy8vLyBccGFyYW0gX19SCisvLy8gICAgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIHJvdW5kIGtleSB2YWx1ZS4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgZGVjcnlwdGVkIHZhbHVlLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9hZXNkZWNfc2kxMjgoX19tMTI4aSBfX1YsIF9fbTEyOGkgX19SKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfYWVzZGVjMTI4KChfX3YyZGkpX19WLCAoX192MmRpKV9fUik7Cit9CisKKy8vLyBcYnJpZWYgUGVyZm9ybXMgdGhlIGZpbmFsIHJvdW5kIG9mIEFFUyBkZWNyeXB0aW9uIHVzaW5nIHRoZSBFcXVpdmFsZW50CisvLy8gICAgSW52ZXJzZSBDaXBoZXIsIHRyYW5zZm9ybWluZyB0aGUgc3RhdGUgdmFsdWUgZnJvbSB0aGUgZmlyc3Qgc291cmNlCisvLy8gICAgb3BlcmFuZCB1c2luZyBhIDEyOC1iaXQgcm91bmQga2V5IHZhbHVlIGNvbnRhaW5lZCBpbiB0aGUgc2Vjb25kIHNvdXJjZQorLy8vICAgIG9wZXJhbmQsIGFuZCB3cml0ZXMgdGhlIHJlc3VsdCB0byB0aGUgZGVzdGluYXRpb24uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVkFFU0RFQ0xBU1QgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19WCisvLy8gICAgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIHN0YXRlIHZhbHVlLgorLy8vIFxwYXJhbSBfX1IKKy8vLyAgICBBIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgcm91bmQga2V5IHZhbHVlLgorLy8vIFxyZXR1cm5zIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIHRoZSBkZWNyeXB0ZWQgdmFsdWUuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2Flc2RlY2xhc3Rfc2kxMjgoX19tMTI4aSBfX1YsIF9fbTEyOGkgX19SKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfYWVzZGVjbGFzdDEyOCgoX192MmRpKV9fViwgKF9fdjJkaSlfX1IpOworfQorCisvLy8gXGJyaWVmIEFwcGxpZXMgdGhlIEFFUyBJbnZNaXhDb2x1bW5zKCkgdHJhbnNmb3JtYXRpb24gdG8gYW4gZXhwYW5kZWQga2V5CisvLy8gICAgY29udGFpbmVkIGluIHRoZSBzb3VyY2Ugb3BlcmFuZCwgYW5kIHdyaXRlcyB0aGUgcmVzdWx0IHRvIHRoZQorLy8vICAgIGRlc3RpbmF0aW9uLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZBRVNJTUMgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19WCisvLy8gICAgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIGV4cGFuZGVkIGtleS4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgdHJhbnNmb3JtZWQgdmFsdWUuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2Flc2ltY19zaTEyOChfX20xMjhpIF9fVikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX2Flc2ltYzEyOCgoX192MmRpKV9fVik7Cit9CisKKy8vLyBcYnJpZWYgR2VuZXJhdGVzIGEgcm91bmQga2V5IGZvciBBRVMgZW5jeXB0aW9uLCBvcGVyYXRpbmcgb24gMTI4LWJpdCBkYXRhCisvLy8gICAgc3BlY2lmaWVkIGluIHRoZSBmaXJzdCBzb3VyY2Ugb3BlcmFuZCBhbmQgdXNpbmcgYW4gOC1iaXQgcm91bmQgY29uc3RhbnQKKy8vLyAgICBzcGVjaWZpZWQgYnkgdGhlIHNlY29uZCBzb3VyY2Ugb3BlcmFuZCwgYW5kIHdyaXRlcyB0aGUgcmVzdWx0IHRvIHRoZQorLy8vICAgIGRlc3RpbmF0aW9uLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gXGNvZGUKKy8vLyBfX20xMjhpIF9tbV9hZXNrZXlnZW5hc3Npc3Rfc2kxMjgoX19tMTI4aSBDLCBjb25zdCBpbnQgUik7CisvLy8gXGVuZGNvZGUKKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBBRVNLRVlHRU5BU1NJU1QgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gQworLy8vICAgIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciB0aGF0IGlzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIEFFUyBlbmNyeXB0aW9uIGtleS4KKy8vLyBccGFyYW0gUgorLy8vICAgIEFuIDgtYml0IHJvdW5kIGNvbnN0YW50IHVzZWQgdG8gZ2VuZXJhdGUgdGhlIEFFUyBlbmNyeXB0aW9uIGtleS4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgcm91bmQga2V5IGZvciBBRVMgZW5jcnlwdGlvbi4KKyNkZWZpbmUgX21tX2Flc2tleWdlbmFzc2lzdF9zaTEyOChDLCBSKSBcCisgIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX2Flc2tleWdlbmFzc2lzdDEyOCgoX192MmRpKShfX20xMjhpKShDKSwgKGludCkoUikpCisKKyN1bmRlZiBfX0RFRkFVTFRfRk5fQVRUUlMKKworI2VuZGlmICAvKiBfV01NSU5UUklOX0FFU19IICovCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9fX3dtbWludHJpbl9wY2xtdWwuaCBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL19fd21taW50cmluX3BjbG11bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZTA3M2YKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9fX3dtbWludHJpbl9wY2xtdWwuaApAQCAtMCwwICsxLDU4IEBACisvKj09PS0tLS0gX193bW1pbnRyaW5fcGNsbXVsLmggLSBQQ01VTCBpbnRyaW5zaWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqCisgKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisgKi8KKyNpZm5kZWYgX1dNTUlOVFJJTl9QQ0xNVUxfSAorI2RlZmluZSBfV01NSU5UUklOX1BDTE1VTF9ICisKKy8vLyBcYnJpZWYgTXVsdGlwbGllcyB0d28gNjQtYml0IGludGVnZXIgdmFsdWVzLCB3aGljaCBhcmUgc2VsZWN0ZWQgZnJvbSBzb3VyY2UKKy8vLyAgICBvcGVyYW5kcyB1c2luZyB0aGUgaW1tZWRpYXRlLXZhbHVlIG9wZXJhbmQuIFRoZSBtdWx0aXBsaWNhdGlvbiBpcyBhCisvLy8gICAgY2FycnktbGVzcyBtdWx0aXBsaWNhdGlvbiwgYW5kIHRoZSAxMjgtYml0IGludGVnZXIgcHJvZHVjdCBpcyBzdG9yZWQgaW4KKy8vLyAgICB0aGUgZGVzdGluYXRpb24uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBcY29kZQorLy8vIF9fbTEyOGkgX21tX2NsbXVsZXBpNjRfc2kxMjgoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZLCBjb25zdCBpbnQgX19JKTsKKy8vLyBcZW5kY29kZQorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZQQ0xNVUxRRFEgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19YCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbMiB4IGk2NF0gY29udGFpbmluZyBvbmUgb2YgdGhlIHNvdXJjZSBvcGVyYW5kcy4KKy8vLyBccGFyYW0gX19ZCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbMiB4IGk2NF0gY29udGFpbmluZyBvbmUgb2YgdGhlIHNvdXJjZSBvcGVyYW5kcy4KKy8vLyBccGFyYW0gX19JCisvLy8gICAgQW4gaW1tZWRpYXRlIHZhbHVlIHNwZWNpZnlpbmcgd2hpY2ggNjQtYml0IHZhbHVlcyB0byBzZWxlY3QgZnJvbSB0aGUKKy8vLyAgICBvcGVyYW5kcy4KKy8vLyAgICBCaXQgMCBpcyB1c2VkIHRvIHNlbGVjdCBhIHZhbHVlIGZyb20gb3BlcmFuZCBfX1gsCisvLy8gICAgYW5kIGJpdCA0IGlzIHVzZWQgdG8gc2VsZWN0IGEgdmFsdWUgZnJvbSBvcGVyYW5kIF9fWToKKy8vLyAgICBCaXRbMF09MCBpbmRpY2F0ZXMgdGhhdCBiaXRzWzYzOjBdIG9mIG9wZXJhbmQgX19YIGFyZSB1c2VkLgorLy8vICAgIEJpdFswXT0xIGluZGljYXRlcyB0aGF0IGJpdHNbMTI3OjY0XSBvZiBvcGVyYW5kIF9fWCBhcmUgdXNlZC4KKy8vLyAgICBCaXRbNF09MCBpbmRpY2F0ZXMgdGhhdCBiaXRzWzYzOjBdIG9mIG9wZXJhbmQgX19ZIGFyZSB1c2VkLgorLy8vICAgIEJpdFs0XT0xIGluZGljYXRlcyB0aGF0IGJpdHNbMTI3OjY0XSBvZiBvcGVyYW5kIF9fWSBhcmUgdXNlZC4KKy8vLyBccmV0dXJucyBUaGUgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIHRoZSByZXN1bHQgb2YgdGhlIGNhcnJ5LWxlc3MKKy8vLyAgICBtdWx0aXBsaWNhdGlvbiBvZiB0aGUgc2VsZWN0ZWQgNjQtYml0IHZhbHVlcy4KKyNkZWZpbmUgX21tX2NsbXVsZXBpNjRfc2kxMjgoX19YLCBfX1ksIF9fSSkgXAorICAoKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcGNsbXVscWRxMTI4KChfX3YyZGkpKF9fbTEyOGkpKF9fWCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRpKShfX20xMjhpKShfX1kpLCAoY2hhcikoX19JKSkpCisKKyNlbmRpZiAvKiBfV01NSU5UUklOX1BDTE1VTF9IICovCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9hZHhpbnRyaW4uaCBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL2FkeGludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMzQ3MjgKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9hZHhpbnRyaW4uaApAQCAtMCwwICsxLDg2IEBACisvKj09PS0tLS0gYWR4aW50cmluLmggLSBBRFggaW50cmluc2ljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICoKKyAqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqLworCisjaWZuZGVmIF9fSU1NSU5UUklOX0gKKyNlcnJvciAiTmV2ZXIgdXNlIDxhZHhpbnRyaW4uaD4gZGlyZWN0bHk7IGluY2x1ZGUgPGltbWludHJpbi5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9fQURYSU5UUklOX0gKKyNkZWZpbmUgX19BRFhJTlRSSU5fSAorCisvKiBEZWZpbmUgdGhlIGRlZmF1bHQgYXR0cmlidXRlcyBmb3IgdGhlIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUuICovCisjZGVmaW5lIF9fREVGQVVMVF9GTl9BVFRSUyBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18pKQorCisvKiBJbnRyaW5zaWNzIHRoYXQgYXJlIGF2YWlsYWJsZSBvbmx5IGlmIF9fQURYX18gZGVmaW5lZCAqLworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGNoYXIgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fLCBfX3RhcmdldF9fKCJhZHgiKSkpCitfYWRkY2Fycnl4X3UzMih1bnNpZ25lZCBjaGFyIF9fY2YsIHVuc2lnbmVkIGludCBfX3gsIHVuc2lnbmVkIGludCBfX3ksCisgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKl9fcCkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2FkZGNhcnJ5eF91MzIoX19jZiwgX194LCBfX3ksIF9fcCk7Cit9CisKKyNpZmRlZiBfX3g4Nl82NF9fCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgY2hhciBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18sIF9fdGFyZ2V0X18oImFkeCIpKSkKK19hZGRjYXJyeXhfdTY0KHVuc2lnbmVkIGNoYXIgX19jZiwgdW5zaWduZWQgbG9uZyBsb25nIF9feCwKKyAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBfX3ksIHVuc2lnbmVkIGxvbmcgbG9uZyAgKl9fcCkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2FkZGNhcnJ5eF91NjQoX19jZiwgX194LCBfX3ksIF9fcCk7Cit9CisjZW5kaWYKKworLyogSW50cmluc2ljcyB0aGF0IGFyZSBhbHNvIGF2YWlsYWJsZSBpZiBfX0FEWF9fIHVuZGVmaW5lZCAqLworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGNoYXIgX19ERUZBVUxUX0ZOX0FUVFJTCitfYWRkY2FycnlfdTMyKHVuc2lnbmVkIGNoYXIgX19jZiwgdW5zaWduZWQgaW50IF9feCwgdW5zaWduZWQgaW50IF9feSwKKyAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpfX3ApCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9hZGRjYXJyeV91MzIoX19jZiwgX194LCBfX3ksIF9fcCk7Cit9CisKKyNpZmRlZiBfX3g4Nl82NF9fCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgY2hhciBfX0RFRkFVTFRfRk5fQVRUUlMKK19hZGRjYXJyeV91NjQodW5zaWduZWQgY2hhciBfX2NmLCB1bnNpZ25lZCBsb25nIGxvbmcgX194LAorICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgX195LCB1bnNpZ25lZCBsb25nIGxvbmcgICpfX3ApCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9hZGRjYXJyeV91NjQoX19jZiwgX194LCBfX3ksIF9fcCk7Cit9CisjZW5kaWYKKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGNoYXIgX19ERUZBVUxUX0ZOX0FUVFJTCitfc3ViYm9ycm93X3UzMih1bnNpZ25lZCBjaGFyIF9fY2YsIHVuc2lnbmVkIGludCBfX3gsIHVuc2lnbmVkIGludCBfX3ksCisgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqX19wKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfc3ViYm9ycm93X3UzMihfX2NmLCBfX3gsIF9feSwgX19wKTsKK30KKworI2lmZGVmIF9feDg2XzY0X18KK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBjaGFyIF9fREVGQVVMVF9GTl9BVFRSUworX3N1YmJvcnJvd191NjQodW5zaWduZWQgY2hhciBfX2NmLCB1bnNpZ25lZCBsb25nIGxvbmcgX194LAorICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIF9feSwgdW5zaWduZWQgbG9uZyBsb25nICAqX19wKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfc3ViYm9ycm93X3U2NChfX2NmLCBfX3gsIF9feSwgX19wKTsKK30KKyNlbmRpZgorCisjdW5kZWYgX19ERUZBVUxUX0ZOX0FUVFJTCisKKyNlbmRpZiAvKiBfX0FEWElOVFJJTl9IICovCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9hbHRpdmVjLmggYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9hbHRpdmVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRhMTkxNAotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL2FsdGl2ZWMuaApAQCAtMCwwICsxLDE0NDU4IEBACisvKj09PS0tLS0gYWx0aXZlYy5oIC0gU3RhbmRhcmQgaGVhZGVyIGZvciB0eXBlIGdlbmVyaWMgbWF0aCAtLS0tLS0tLS0tLS0tLS09PT0qXAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqCitcKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qLworCisjaWZuZGVmIF9fQUxUSVZFQ19ICisjZGVmaW5lIF9fQUxUSVZFQ19ICisKKyNpZm5kZWYgX19BTFRJVkVDX18KKyNlcnJvciAiQWx0aVZlYyBzdXBwb3J0IG5vdCBlbmFibGVkIgorI2VuZGlmCisKKy8qIENvbnN0YW50cyBmb3IgbWFwcGluZyBDUjYgYml0cyB0byBwcmVkaWNhdGUgcmVzdWx0LiAqLworCisjZGVmaW5lIF9fQ1I2X0VRIDAKKyNkZWZpbmUgX19DUjZfRVFfUkVWIDEKKyNkZWZpbmUgX19DUjZfTFQgMgorI2RlZmluZSBfX0NSNl9MVF9SRVYgMworCisjZGVmaW5lIF9fQVRUUlNfb19haSBfX2F0dHJpYnV0ZV9fKChfX292ZXJsb2FkYWJsZV9fLCBfX2Fsd2F5c19pbmxpbmVfXykpCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkgdmVjX3Blcm0oCisgICAgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYiwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19jKTsKKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfcGVybSh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYiwKKyAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYyk7CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfcGVybSh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIGJvb2wgY2hhciBfX2IsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYyk7CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaG9ydCBfX0FUVFJTX29fYWkgdmVjX3Blcm0odmVjdG9yIHNpZ25lZCBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaWduZWQgc2hvcnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2MpOworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfcGVybSh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iLAorICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19jKTsKKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgc2hvcnQgX19BVFRSU19vX2FpIHZlY19wZXJtKAorICAgIHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIGJvb2wgc2hvcnQgX19iLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2MpOworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgcGl4ZWwgX19BVFRSU19vX2FpIHZlY19wZXJtKHZlY3RvciBwaXhlbCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBwaXhlbCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYyk7CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY19wZXJtKHZlY3RvciBzaWduZWQgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaWduZWQgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYyk7CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpIHZlY19wZXJtKAorICAgIHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYiwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19jKTsKKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgaW50IF9fQVRUUlNfb19haQordmVjX3Blcm0odmVjdG9yIGJvb2wgaW50IF9fYSwgdmVjdG9yIGJvb2wgaW50IF9fYiwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19jKTsKKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGZsb2F0IF9fQVRUUlNfb19haSB2ZWNfcGVybSh2ZWN0b3IgZmxvYXQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgZmxvYXQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2MpOworCisjaWZkZWYgX19WU1hfXworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY19wZXJtKHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19iLAorICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19jKTsKKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY19wZXJtKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYiwKKyAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYyk7CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY19wZXJtKHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2IsCisgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2MpOworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZG91YmxlIF9fQVRUUlNfb19haSB2ZWNfcGVybSh2ZWN0b3IgZG91YmxlIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBkb3VibGUgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19jKTsKKyNlbmRpZgorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY194b3IodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpOworCisvKiB2ZWNfYWJzICovCisKKyNkZWZpbmUgX19idWlsdGluX2FsdGl2ZWNfYWJzX3YxNnFpIHZlY19hYnMKKyNkZWZpbmUgX19idWlsdGluX2FsdGl2ZWNfYWJzX3Y4aGkgdmVjX2FicworI2RlZmluZSBfX2J1aWx0aW5fYWx0aXZlY19hYnNfdjRzaSB2ZWNfYWJzCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19hYnModmVjdG9yIHNpZ25lZCBjaGFyIF9fYSkgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdm1heHNiKF9fYSwgLV9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfYWJzKHZlY3RvciBzaWduZWQgc2hvcnQgX19hKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bWF4c2goX19hLCAtX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfYWJzKHZlY3RvciBzaWduZWQgaW50IF9fYSkgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdm1heHN3KF9fYSwgLV9fYSk7Cit9CisKKyNpZiBkZWZpbmVkKF9fUE9XRVI4X1ZFQ1RPUl9fKSAmJiBkZWZpbmVkKF9fcG93ZXJwYzY0X18pCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY19hYnModmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bWF4c2QoX19hLCAtX19hKTsKK30KKyNlbmRpZgorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZmxvYXQgX19BVFRSU19vX2FpIHZlY19hYnModmVjdG9yIGZsb2F0IF9fYSkgeworI2lmZGVmIF9fVlNYX18KKyAgcmV0dXJuIF9fYnVpbHRpbl92c3hfeHZhYnNzcChfX2EpOworI2Vsc2UKKyAgdmVjdG9yIHVuc2lnbmVkIGludCBfX3JlcyA9CisgICAgICAodmVjdG9yIHVuc2lnbmVkIGludClfX2EgJiAodmVjdG9yIHVuc2lnbmVkIGludCkoMHg3RkZGRkZGRik7CisgIHJldHVybiAodmVjdG9yIGZsb2F0KV9fcmVzOworI2VuZGlmCit9CisKKyNpZiBkZWZpbmVkKF9fUE9XRVI4X1ZFQ1RPUl9fKSAmJiBkZWZpbmVkKF9fcG93ZXJwYzY0X18pCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZG91YmxlIF9fQVRUUlNfb19haSB2ZWNfYWJzKHZlY3RvciBkb3VibGUgX19hKSB7CisgIHJldHVybiBfX2J1aWx0aW5fdnN4X3h2YWJzZHAoX19hKTsKK30KKyNlbmRpZgorCisvKiB2ZWNfYWJzcyAqLworI2RlZmluZSBfX2J1aWx0aW5fYWx0aXZlY19hYnNzX3YxNnFpIHZlY19hYnNzCisjZGVmaW5lIF9fYnVpbHRpbl9hbHRpdmVjX2Fic3NfdjhoaSB2ZWNfYWJzcworI2RlZmluZSBfX2J1aWx0aW5fYWx0aXZlY19hYnNzX3Y0c2kgdmVjX2Fic3MKKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX2Fic3ModmVjdG9yIHNpZ25lZCBjaGFyIF9fYSkgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdm1heHNiKAorICAgICAgX19hLCBfX2J1aWx0aW5fYWx0aXZlY192c3Vic2JzKCh2ZWN0b3Igc2lnbmVkIGNoYXIpKDApLCBfX2EpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19hYnNzKHZlY3RvciBzaWduZWQgc2hvcnQgX19hKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bWF4c2goCisgICAgICBfX2EsIF9fYnVpbHRpbl9hbHRpdmVjX3ZzdWJzaHMoKHZlY3RvciBzaWduZWQgc2hvcnQpKDApLCBfX2EpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfYWJzcyh2ZWN0b3Igc2lnbmVkIGludCBfX2EpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZtYXhzdygKKyAgICAgIF9fYSwgX19idWlsdGluX2FsdGl2ZWNfdnN1YnN3cygodmVjdG9yIHNpZ25lZCBpbnQpKDApLCBfX2EpKTsKK30KKworLyogdmVjX2FkZCAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfYWRkKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYSArIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX2FkZCh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgY2hhcilfX2EgKyBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19hZGQodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYSArICh2ZWN0b3Igc2lnbmVkIGNoYXIpX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19hZGQodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYSArIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfYWRkKHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EgKyBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX2FkZCh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2EgKyAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY19hZGQodmVjdG9yIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2EgKyBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaG9ydCBfX0FUVFJTX29fYWkgdmVjX2FkZCh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNob3J0IF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaG9ydClfX2EgKyBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaG9ydCBfX0FUVFJTX29fYWkgdmVjX2FkZCh2ZWN0b3Igc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICByZXR1cm4gX19hICsgKHZlY3RvciBzaG9ydClfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19hZGQodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gX19hICsgX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfYWRkKHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2EgKyBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19hZGQodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2EgKyAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX0FUVFJTX29fYWkgdmVjX2FkZCh2ZWN0b3IgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYSArIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX0FUVFJTX29fYWkgdmVjX2FkZCh2ZWN0b3IgYm9vbCBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciBpbnQpX19hICsgX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfYWRkKHZlY3RvciBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIHJldHVybiBfX2EgKyAodmVjdG9yIGludClfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfYWRkKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gX19hICsgX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX2FkZCh2ZWN0b3IgYm9vbCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hICsgX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX2FkZCh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICByZXR1cm4gX19hICsgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iOworfQorCisjaWYgZGVmaW5lZChfX1BPV0VSOF9WRUNUT1JfXykgJiYgZGVmaW5lZChfX3Bvd2VycGM2NF9fKQorc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfYWRkKHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2EgKyBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfYWRkKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19hICsgX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIF9faW50MTI4IF9fQVRUUlNfb19haQordmVjX2FkZCh2ZWN0b3Igc2lnbmVkIF9faW50MTI4IF9fYSwgdmVjdG9yIHNpZ25lZCBfX2ludDEyOCBfX2IpIHsKKyAgcmV0dXJuIF9fYSArIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIF9faW50MTI4IF9fQVRUUlNfb19haQordmVjX2FkZCh2ZWN0b3IgdW5zaWduZWQgX19pbnQxMjggX19hLCB2ZWN0b3IgdW5zaWduZWQgX19pbnQxMjggX19iKSB7CisgIHJldHVybiBfX2EgKyBfX2I7Cit9CisjZW5kaWYgLy8gZGVmaW5lZChfX1BPV0VSOF9WRUNUT1JfXykgJiYgZGVmaW5lZChfX3Bvd2VycGM2NF9fKQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZmxvYXQgX19BVFRSU19vX2FpIHZlY19hZGQodmVjdG9yIGZsb2F0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgZmxvYXQgX19iKSB7CisgIHJldHVybiBfX2EgKyBfX2I7Cit9CisKKyNpZmRlZiBfX1ZTWF9fCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZG91YmxlIF9fQVRUUlNfb19haSB2ZWNfYWRkKHZlY3RvciBkb3VibGUgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgZG91YmxlIF9fYikgeworICByZXR1cm4gX19hICsgX19iOworfQorI2VuZGlmIC8vIF9fVlNYX18KKworLyogdmVjX2FkZGUgKi8KKworI2lmIGRlZmluZWQoX19QT1dFUjhfVkVDVE9SX18pICYmIGRlZmluZWQoX19wb3dlcnBjNjRfXykKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgX19pbnQxMjggX19BVFRSU19vX2FpCit2ZWNfYWRkZSh2ZWN0b3Igc2lnbmVkIF9faW50MTI4IF9fYSwgdmVjdG9yIHNpZ25lZCBfX2ludDEyOCBfX2IsCisgICAgICAgICB2ZWN0b3Igc2lnbmVkIF9faW50MTI4IF9fYykgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmFkZGV1cW0oX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBfX2ludDEyOCBfX0FUVFJTX29fYWkKK3ZlY19hZGRlKHZlY3RvciB1bnNpZ25lZCBfX2ludDEyOCBfX2EsIHZlY3RvciB1bnNpZ25lZCBfX2ludDEyOCBfX2IsCisgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgX19pbnQxMjggX19jKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192YWRkZXVxbShfX2EsIF9fYiwgX19jKTsKK30KKyNlbmRpZgorCisvKiB2ZWNfYWRkZWMgKi8KKworI2lmIGRlZmluZWQoX19QT1dFUjhfVkVDVE9SX18pICYmIGRlZmluZWQoX19wb3dlcnBjNjRfXykKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgX19pbnQxMjggX19BVFRSU19vX2FpCit2ZWNfYWRkZWModmVjdG9yIHNpZ25lZCBfX2ludDEyOCBfX2EsIHZlY3RvciBzaWduZWQgX19pbnQxMjggX19iLAorICAgICAgICAgIHZlY3RvciBzaWduZWQgX19pbnQxMjggX19jKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192YWRkZWN1cShfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIF9faW50MTI4IF9fQVRUUlNfb19haQordmVjX2FkZGVjKHZlY3RvciB1bnNpZ25lZCBfX2ludDEyOCBfX2EsIHZlY3RvciB1bnNpZ25lZCBfX2ludDEyOCBfX2IsCisgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIF9faW50MTI4IF9fYykgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmFkZGVjdXEoX19hLCBfX2IsIF9fYyk7Cit9CisjZW5kaWYKKworLyogdmVjX3ZhZGR1Ym0gKi8KKworI2RlZmluZSBfX2J1aWx0aW5fYWx0aXZlY192YWRkdWJtIHZlY192YWRkdWJtCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY192YWRkdWJtKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYSArIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3ZhZGR1Ym0odmVjdG9yIGJvb2wgY2hhciBfX2EsIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGNoYXIpX19hICsgX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfdmFkZHVibSh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICByZXR1cm4gX19hICsgKHZlY3RvciBzaWduZWQgY2hhcilfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3ZhZGR1Ym0odmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYSArIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfdmFkZHVibSh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hICsgX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY192YWRkdWJtKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYSArICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2I7Cit9CisKKy8qIHZlY192YWRkdWhtICovCisKKyNkZWZpbmUgX19idWlsdGluX2FsdGl2ZWNfdmFkZHVobSB2ZWNfdmFkZHVobQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY192YWRkdWhtKHZlY3RvciBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYSArIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNob3J0IF9fQVRUUlNfb19haSB2ZWNfdmFkZHVobSh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2hvcnQpX19hICsgX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY192YWRkdWhtKHZlY3RvciBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICByZXR1cm4gX19hICsgKHZlY3RvciBzaG9ydClfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY192YWRkdWhtKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYSArIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX3ZhZGR1aG0odmVjdG9yIGJvb2wgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYSArIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX3ZhZGR1aG0odmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2EgKyAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYjsKK30KKworLyogdmVjX3ZhZGR1d20gKi8KKworI2RlZmluZSBfX2J1aWx0aW5fYWx0aXZlY192YWRkdXdtIHZlY192YWRkdXdtCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY192YWRkdXdtKHZlY3RvciBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYSArIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX0FUVFJTX29fYWkgdmVjX3ZhZGR1d20odmVjdG9yIGJvb2wgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGludClfX2EgKyBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY192YWRkdXdtKHZlY3RvciBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICByZXR1cm4gX19hICsgKHZlY3RvciBpbnQpX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX3ZhZGR1d20odmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiBfX2EgKyBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfdmFkZHV3bSh2ZWN0b3IgYm9vbCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hICsgX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX3ZhZGR1d20odmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYSArICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYjsKK30KKworLyogdmVjX3ZhZGRmcCAqLworCisjZGVmaW5lIF9fYnVpbHRpbl9hbHRpdmVjX3ZhZGRmcCB2ZWNfdmFkZGZwCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBmbG9hdCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpCit2ZWNfdmFkZGZwKHZlY3RvciBmbG9hdCBfX2EsIHZlY3RvciBmbG9hdCBfX2IpIHsKKyAgcmV0dXJuIF9fYSArIF9fYjsKK30KKworLyogdmVjX2FkZGMgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfYWRkYyh2ZWN0b3Igc2lnbmVkIGludCBfX2EsIHZlY3RvciBzaWduZWQgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgaW50KV9fYnVpbHRpbl9hbHRpdmVjX3ZhZGRjdXcoKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY19hZGRjKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmFkZGN1dyhfX2EsIF9fYik7Cit9CisKKyNpZiBkZWZpbmVkKF9fUE9XRVI4X1ZFQ1RPUl9fKSAmJiBkZWZpbmVkKF9fcG93ZXJwYzY0X18pCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIF9faW50MTI4IF9fQVRUUlNfb19haQordmVjX2FkZGModmVjdG9yIHNpZ25lZCBfX2ludDEyOCBfX2EsIHZlY3RvciBzaWduZWQgX19pbnQxMjggX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBfX2ludDEyOClfX2J1aWx0aW5fYWx0aXZlY192YWRkY3VxKAorICAgICAgKHZlY3RvciB1bnNpZ25lZCBfX2ludDEyOClfX2EsICh2ZWN0b3IgdW5zaWduZWQgX19pbnQxMjgpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIF9faW50MTI4IF9fQVRUUlNfb19haQordmVjX2FkZGModmVjdG9yIHVuc2lnbmVkIF9faW50MTI4IF9fYSwgdmVjdG9yIHVuc2lnbmVkIF9faW50MTI4IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmFkZGN1cShfX2EsIF9fYik7Cit9CisjZW5kaWYgLy8gZGVmaW5lZChfX1BPV0VSOF9WRUNUT1JfXykgJiYgZGVmaW5lZChfX3Bvd2VycGM2NF9fKQorCisvKiB2ZWNfdmFkZGN1dyAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKK3ZlY192YWRkY3V3KHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmFkZGN1dyhfX2EsIF9fYik7Cit9CisKKy8qIHZlY19hZGRzICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19hZGRzKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZhZGRzYnMoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfYWRkcyh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmFkZHNicygodmVjdG9yIHNpZ25lZCBjaGFyKV9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX2FkZHModmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZhZGRzYnMoX19hLCAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX2FkZHModmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZhZGR1YnMoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19hZGRzKHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZhZGR1YnMoKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfYWRkcyh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192YWRkdWJzKF9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaG9ydCBfX0FUVFJTX29fYWkgdmVjX2FkZHModmVjdG9yIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmFkZHNocyhfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaG9ydCBfX0FUVFJTX29fYWkgdmVjX2FkZHModmVjdG9yIGJvb2wgc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192YWRkc2hzKCh2ZWN0b3Igc2hvcnQpX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY19hZGRzKHZlY3RvciBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmFkZHNocyhfX2EsICh2ZWN0b3Igc2hvcnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX2FkZHModmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmFkZHVocyhfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19hZGRzKHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmFkZHVocygodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX2FkZHModmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192YWRkdWhzKF9fYSwgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfYWRkcyh2ZWN0b3IgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192YWRkc3dzKF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX0FUVFJTX29fYWkgdmVjX2FkZHModmVjdG9yIGJvb2wgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192YWRkc3dzKCh2ZWN0b3IgaW50KV9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX0FUVFJTX29fYWkgdmVjX2FkZHModmVjdG9yIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192YWRkc3dzKF9fYSwgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY19hZGRzKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmFkZHV3cyhfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfYWRkcyh2ZWN0b3IgYm9vbCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmFkZHV3cygodmVjdG9yIHVuc2lnbmVkIGludClfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfYWRkcyh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmFkZHV3cyhfX2EsICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYik7Cit9CisKKy8qIHZlY192YWRkc2JzICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY192YWRkc2JzKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZhZGRzYnMoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfdmFkZHNicyh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmFkZHNicygodmVjdG9yIHNpZ25lZCBjaGFyKV9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3ZhZGRzYnModmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZhZGRzYnMoX19hLCAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYik7Cit9CisKKy8qIHZlY192YWRkdWJzICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3ZhZGR1YnModmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZhZGR1YnMoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY192YWRkdWJzKHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZhZGR1YnMoKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfdmFkZHVicyh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192YWRkdWJzKF9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKKy8qIHZlY192YWRkc2hzICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaG9ydCBfX0FUVFJTX29fYWkgdmVjX3ZhZGRzaHModmVjdG9yIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmFkZHNocyhfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaG9ydCBfX0FUVFJTX29fYWkgdmVjX3ZhZGRzaHModmVjdG9yIGJvb2wgc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192YWRkc2hzKCh2ZWN0b3Igc2hvcnQpX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY192YWRkc2hzKHZlY3RvciBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmFkZHNocyhfX2EsICh2ZWN0b3Igc2hvcnQpX19iKTsKK30KKworLyogdmVjX3ZhZGR1aHMgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX3ZhZGR1aHModmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmFkZHVocyhfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY192YWRkdWhzKHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmFkZHVocygodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX3ZhZGR1aHModmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192YWRkdWhzKF9fYSwgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2IpOworfQorCisvKiB2ZWNfdmFkZHN3cyAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfdmFkZHN3cyh2ZWN0b3IgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192YWRkc3dzKF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX0FUVFJTX29fYWkgdmVjX3ZhZGRzd3ModmVjdG9yIGJvb2wgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192YWRkc3dzKCh2ZWN0b3IgaW50KV9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX0FUVFJTX29fYWkgdmVjX3ZhZGRzd3ModmVjdG9yIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192YWRkc3dzKF9fYSwgKHZlY3RvciBpbnQpX19iKTsKK30KKworLyogdmVjX3ZhZGR1d3MgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY192YWRkdXdzKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmFkZHV3cyhfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfdmFkZHV3cyh2ZWN0b3IgYm9vbCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmFkZHV3cygodmVjdG9yIHVuc2lnbmVkIGludClfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfdmFkZHV3cyh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmFkZHV3cyhfX2EsICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYik7Cit9CisKKyNpZiBkZWZpbmVkKF9fUE9XRVI4X1ZFQ1RPUl9fKSAmJiBkZWZpbmVkKF9fcG93ZXJwYzY0X18pCisvKiB2ZWNfdmFkZHVxbSAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIF9faW50MTI4IF9fQVRUUlNfb19haQordmVjX3ZhZGR1cW0odmVjdG9yIHNpZ25lZCBfX2ludDEyOCBfX2EsIHZlY3RvciBzaWduZWQgX19pbnQxMjggX19iKSB7CisgIHJldHVybiBfX2EgKyBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBfX2ludDEyOCBfX0FUVFJTX29fYWkKK3ZlY192YWRkdXFtKHZlY3RvciB1bnNpZ25lZCBfX2ludDEyOCBfX2EsIHZlY3RvciB1bnNpZ25lZCBfX2ludDEyOCBfX2IpIHsKKyAgcmV0dXJuIF9fYSArIF9fYjsKK30KKworLyogdmVjX3ZhZGRldXFtICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgX19pbnQxMjggX19BVFRSU19vX2FpCit2ZWNfdmFkZGV1cW0odmVjdG9yIHNpZ25lZCBfX2ludDEyOCBfX2EsIHZlY3RvciBzaWduZWQgX19pbnQxMjggX19iLAorICAgICAgICAgICAgIHZlY3RvciBzaWduZWQgX19pbnQxMjggX19jKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192YWRkZXVxbShfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIF9faW50MTI4IF9fQVRUUlNfb19haQordmVjX3ZhZGRldXFtKHZlY3RvciB1bnNpZ25lZCBfX2ludDEyOCBfX2EsIHZlY3RvciB1bnNpZ25lZCBfX2ludDEyOCBfX2IsCisgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIF9faW50MTI4IF9fYykgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmFkZGV1cW0oX19hLCBfX2IsIF9fYyk7Cit9CisKKy8qIHZlY192YWRkY3VxICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgX19pbnQxMjggX19BVFRSU19vX2FpCit2ZWNfdmFkZGN1cSh2ZWN0b3Igc2lnbmVkIF9faW50MTI4IF9fYSwgdmVjdG9yIHNpZ25lZCBfX2ludDEyOCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZhZGRjdXEoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgX19pbnQxMjggX19BVFRSU19vX2FpCit2ZWNfdmFkZGN1cSh2ZWN0b3IgdW5zaWduZWQgX19pbnQxMjggX19hLCB2ZWN0b3IgdW5zaWduZWQgX19pbnQxMjggX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192YWRkY3VxKF9fYSwgX19iKTsKK30KKworLyogdmVjX3ZhZGRlY3VxICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgX19pbnQxMjggX19BVFRSU19vX2FpCit2ZWNfdmFkZGVjdXEodmVjdG9yIHNpZ25lZCBfX2ludDEyOCBfX2EsIHZlY3RvciBzaWduZWQgX19pbnQxMjggX19iLAorICAgICAgICAgICAgIHZlY3RvciBzaWduZWQgX19pbnQxMjggX19jKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192YWRkZWN1cShfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIF9faW50MTI4IF9fQVRUUlNfb19haQordmVjX3ZhZGRlY3VxKHZlY3RvciB1bnNpZ25lZCBfX2ludDEyOCBfX2EsIHZlY3RvciB1bnNpZ25lZCBfX2ludDEyOCBfX2IsCisgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIF9faW50MTI4IF9fYykgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmFkZGVjdXEoX19hLCBfX2IsIF9fYyk7Cit9CisjZW5kaWYgLy8gZGVmaW5lZChfX1BPV0VSOF9WRUNUT1JfXykgJiYgZGVmaW5lZChfX3Bvd2VycGM2NF9fKQorCisvKiB2ZWNfYW5kICovCisKKyNkZWZpbmUgX19idWlsdGluX2FsdGl2ZWNfdmFuZCB2ZWNfYW5kCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19hbmQodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19hICYgX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfYW5kKHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYSAmIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX2FuZCh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICByZXR1cm4gX19hICYgKHZlY3RvciBzaWduZWQgY2hhcilfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX2FuZCh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19hICYgX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19hbmQodmVjdG9yIGJvb2wgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSAmIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfYW5kKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYSAmICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGNoYXIgX19BVFRSU19vX2FpIHZlY19hbmQodmVjdG9yIGJvb2wgY2hhciBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2EgJiBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaG9ydCBfX0FUVFJTX29fYWkgdmVjX2FuZCh2ZWN0b3Igc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYSAmIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNob3J0IF9fQVRUUlNfb19haSB2ZWNfYW5kKHZlY3RvciBib29sIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNob3J0KV9fYSAmIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNob3J0IF9fQVRUUlNfb19haSB2ZWNfYW5kKHZlY3RvciBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2EgJiAodmVjdG9yIHNob3J0KV9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX2FuZCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2EgJiBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19hbmQodmVjdG9yIGJvb2wgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYSAmIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX2FuZCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYSAmICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19hbmQodmVjdG9yIGJvb2wgc2hvcnQgX19hLCB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYSAmIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX0FUVFJTX29fYWkgdmVjX2FuZCh2ZWN0b3IgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYSAmIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX0FUVFJTX29fYWkgdmVjX2FuZCh2ZWN0b3IgYm9vbCBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciBpbnQpX19hICYgX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfYW5kKHZlY3RvciBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIHJldHVybiBfX2EgJiAodmVjdG9yIGludClfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfYW5kKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gX19hICYgX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX2FuZCh2ZWN0b3IgYm9vbCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hICYgX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX2FuZCh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICByZXR1cm4gX19hICYgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBpbnQgX19BVFRSU19vX2FpIHZlY19hbmQodmVjdG9yIGJvb2wgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIHJldHVybiBfX2EgJiBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBmbG9hdCBfX0FUVFJTX29fYWkgdmVjX2FuZCh2ZWN0b3IgZmxvYXQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBmbG9hdCBfX2IpIHsKKyAgdmVjdG9yIHVuc2lnbmVkIGludCBfX3JlcyA9CisgICAgICAodmVjdG9yIHVuc2lnbmVkIGludClfX2EgJiAodmVjdG9yIHVuc2lnbmVkIGludClfX2I7CisgIHJldHVybiAodmVjdG9yIGZsb2F0KV9fcmVzOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZmxvYXQgX19BVFRSU19vX2FpIHZlY19hbmQodmVjdG9yIGJvb2wgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgZmxvYXQgX19iKSB7CisgIHZlY3RvciB1bnNpZ25lZCBpbnQgX19yZXMgPQorICAgICAgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hICYgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iOworICByZXR1cm4gKHZlY3RvciBmbG9hdClfX3JlczsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGZsb2F0IF9fQVRUUlNfb19haSB2ZWNfYW5kKHZlY3RvciBmbG9hdCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICB2ZWN0b3IgdW5zaWduZWQgaW50IF9fcmVzID0KKyAgICAgICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSAmICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYjsKKyAgcmV0dXJuICh2ZWN0b3IgZmxvYXQpX19yZXM7Cit9CisKKyNpZmRlZiBfX1ZTWF9fCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZG91YmxlIF9fQVRUUlNfb19haSB2ZWNfYW5kKHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBkb3VibGUgX19iKSB7CisgIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19yZXMgPQorICAgICAgKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19hICYgKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19iOworICByZXR1cm4gKHZlY3RvciBkb3VibGUpX19yZXM7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBkb3VibGUgX19BVFRSU19vX2FpCit2ZWNfYW5kKHZlY3RvciBkb3VibGUgX19hLCB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19iKSB7CisgIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19yZXMgPQorICAgICAgKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19hICYgKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19iOworICByZXR1cm4gKHZlY3RvciBkb3VibGUpX19yZXM7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBkb3VibGUgX19BVFRSU19vX2FpIHZlY19hbmQodmVjdG9yIGRvdWJsZSBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBkb3VibGUgX19iKSB7CisgIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19yZXMgPQorICAgICAgKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19hICYgKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19iOworICByZXR1cm4gKHZlY3RvciBkb3VibGUpX19yZXM7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX2FuZCh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19hICYgX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY19hbmQodmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpX19hICYgX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY19hbmQodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2EgJiAodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX2FuZCh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYSAmIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY19hbmQodmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYSAmIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY19hbmQodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYSAmICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX2FuZCh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2EgJiBfX2I7Cit9CisjZW5kaWYKKworLyogdmVjX3ZhbmQgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3ZhbmQodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19hICYgX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfdmFuZCh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgY2hhcilfX2EgJiBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY192YW5kKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2EgJiAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfdmFuZCh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19hICYgX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY192YW5kKHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EgJiBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3ZhbmQodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICByZXR1cm4gX19hICYgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgY2hhciBfX0FUVFJTX29fYWkgdmVjX3ZhbmQodmVjdG9yIGJvb2wgY2hhciBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICByZXR1cm4gX19hICYgX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY192YW5kKHZlY3RvciBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYSAmIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNob3J0IF9fQVRUUlNfb19haSB2ZWNfdmFuZCh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2hvcnQpX19hICYgX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY192YW5kKHZlY3RvciBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICByZXR1cm4gX19hICYgKHZlY3RvciBzaG9ydClfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY192YW5kKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYSAmIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX3ZhbmQodmVjdG9yIGJvb2wgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYSAmIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX3ZhbmQodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2EgJiAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfdmFuZCh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICByZXR1cm4gX19hICYgX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfdmFuZCh2ZWN0b3IgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBpbnQgX19iKSB7CisgIHJldHVybiBfX2EgJiBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY192YW5kKHZlY3RvciBib29sIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciBpbnQpX19hICYgX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfdmFuZCh2ZWN0b3IgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYSAmICh2ZWN0b3IgaW50KV9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY192YW5kKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gX19hICYgX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX3ZhbmQodmVjdG9yIGJvb2wgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSAmIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY192YW5kKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIHJldHVybiBfX2EgJiAodmVjdG9yIHVuc2lnbmVkIGludClfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGludCBfX0FUVFJTX29fYWkgdmVjX3ZhbmQodmVjdG9yIGJvb2wgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICByZXR1cm4gX19hICYgX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZmxvYXQgX19BVFRSU19vX2FpIHZlY192YW5kKHZlY3RvciBmbG9hdCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBmbG9hdCBfX2IpIHsKKyAgdmVjdG9yIHVuc2lnbmVkIGludCBfX3JlcyA9CisgICAgICAodmVjdG9yIHVuc2lnbmVkIGludClfX2EgJiAodmVjdG9yIHVuc2lnbmVkIGludClfX2I7CisgIHJldHVybiAodmVjdG9yIGZsb2F0KV9fcmVzOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZmxvYXQgX19BVFRSU19vX2FpIHZlY192YW5kKHZlY3RvciBib29sIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBmbG9hdCBfX2IpIHsKKyAgdmVjdG9yIHVuc2lnbmVkIGludCBfX3JlcyA9CisgICAgICAodmVjdG9yIHVuc2lnbmVkIGludClfX2EgJiAodmVjdG9yIHVuc2lnbmVkIGludClfX2I7CisgIHJldHVybiAodmVjdG9yIGZsb2F0KV9fcmVzOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZmxvYXQgX19BVFRSU19vX2FpIHZlY192YW5kKHZlY3RvciBmbG9hdCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgdmVjdG9yIHVuc2lnbmVkIGludCBfX3JlcyA9CisgICAgICAodmVjdG9yIHVuc2lnbmVkIGludClfX2EgJiAodmVjdG9yIHVuc2lnbmVkIGludClfX2I7CisgIHJldHVybiAodmVjdG9yIGZsb2F0KV9fcmVzOworfQorCisjaWZkZWYgX19WU1hfXworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfdmFuZCh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19hICYgX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY192YW5kKHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYSAmIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfdmFuZCh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYSAmICh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZylfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfdmFuZCh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYSAmIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY192YW5kKHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2EgJiBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfdmFuZCh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19hICYgKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfdmFuZCh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2EgJiBfX2I7Cit9CisjZW5kaWYKKworLyogdmVjX2FuZGMgKi8KKworI2RlZmluZSBfX2J1aWx0aW5fYWx0aXZlY192YW5kYyB2ZWNfYW5kYworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfYW5kYyh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2EgJiB+X19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfYW5kYyh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgY2hhcilfX2EgJiB+X19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfYW5kYyh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICByZXR1cm4gX19hICYgfih2ZWN0b3Igc2lnbmVkIGNoYXIpX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19hbmRjKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2EgJiB+X19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19hbmRjKHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EgJiB+X19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19hbmRjKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYSAmIH4odmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBjaGFyIF9fQVRUUlNfb19haSB2ZWNfYW5kYyh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2EgJiB+X19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY19hbmRjKHZlY3RvciBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYSAmIH5fX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaG9ydCBfX0FUVFJTX29fYWkgdmVjX2FuZGModmVjdG9yIGJvb2wgc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNob3J0KV9fYSAmIH5fX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaG9ydCBfX0FUVFJTX29fYWkgdmVjX2FuZGModmVjdG9yIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2EgJiB+KHZlY3RvciBzaG9ydClfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19hbmRjKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYSAmIH5fX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19hbmRjKHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2EgJiB+X19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfYW5kYyh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYSAmIH4odmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfYW5kYyh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICByZXR1cm4gX19hICYgfl9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX0FUVFJTX29fYWkgdmVjX2FuZGModmVjdG9yIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgaW50IF9fYikgeworICByZXR1cm4gX19hICYgfl9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX0FUVFJTX29fYWkgdmVjX2FuZGModmVjdG9yIGJvb2wgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGludClfX2EgJiB+X19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfYW5kYyh2ZWN0b3IgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYSAmIH4odmVjdG9yIGludClfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfYW5kYyh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYSAmIH5fX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfYW5kYyh2ZWN0b3IgYm9vbCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hICYgfl9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY19hbmRjKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIHJldHVybiBfX2EgJiB+KHZlY3RvciB1bnNpZ25lZCBpbnQpX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBpbnQgX19BVFRSU19vX2FpIHZlY19hbmRjKHZlY3RvciBib29sIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYSAmIH5fX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBmbG9hdCBfX0FUVFJTX29fYWkgdmVjX2FuZGModmVjdG9yIGZsb2F0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGZsb2F0IF9fYikgeworICB2ZWN0b3IgdW5zaWduZWQgaW50IF9fcmVzID0KKyAgICAgICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSAmIH4odmVjdG9yIHVuc2lnbmVkIGludClfX2I7CisgIHJldHVybiAodmVjdG9yIGZsb2F0KV9fcmVzOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZmxvYXQgX19BVFRSU19vX2FpIHZlY19hbmRjKHZlY3RvciBib29sIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBmbG9hdCBfX2IpIHsKKyAgdmVjdG9yIHVuc2lnbmVkIGludCBfX3JlcyA9CisgICAgICAodmVjdG9yIHVuc2lnbmVkIGludClfX2EgJiB+KHZlY3RvciB1bnNpZ25lZCBpbnQpX19iOworICByZXR1cm4gKHZlY3RvciBmbG9hdClfX3JlczsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGZsb2F0IF9fQVRUUlNfb19haSB2ZWNfYW5kYyh2ZWN0b3IgZmxvYXQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIHZlY3RvciB1bnNpZ25lZCBpbnQgX19yZXMgPQorICAgICAgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hICYgfih2ZWN0b3IgdW5zaWduZWQgaW50KV9fYjsKKyAgcmV0dXJuICh2ZWN0b3IgZmxvYXQpX19yZXM7Cit9CisKKyNpZmRlZiBfX1ZTWF9fCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZG91YmxlIF9fQVRUUlNfb19haSB2ZWNfYW5kYyh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGRvdWJsZSBfX2IpIHsKKyAgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX3JlcyA9CisgICAgICAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2EgJiB+KHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19iOworICByZXR1cm4gKHZlY3RvciBkb3VibGUpX19yZXM7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBkb3VibGUgX19BVFRSU19vX2FpCit2ZWNfYW5kYyh2ZWN0b3IgZG91YmxlIF9fYSwgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fcmVzID0KKyAgICAgICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYSAmIH4odmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2I7CisgIHJldHVybiAodmVjdG9yIGRvdWJsZSlfX3JlczsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGRvdWJsZSBfX0FUVFJTX29fYWkgdmVjX2FuZGModmVjdG9yIGRvdWJsZSBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgZG91YmxlIF9fYikgeworICB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fcmVzID0KKyAgICAgICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYSAmIH4odmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2I7CisgIHJldHVybiAodmVjdG9yIGRvdWJsZSlfX3JlczsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfYW5kYyh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19hICYgfl9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfYW5kYyh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLCB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZylfX2EgJiB+X19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY19hbmRjKHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19hICYgfih2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZylfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfYW5kYyh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYSAmIH5fX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfYW5kYyh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19hICYgfl9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY19hbmRjKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2EgJiB+KHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfYW5kYyh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2EgJiB+X19iOworfQorI2VuZGlmCisKKy8qIHZlY192YW5kYyAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfdmFuZGModmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19hICYgfl9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3ZhbmRjKHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYSAmIH5fX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY192YW5kYyh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICByZXR1cm4gX19hICYgfih2ZWN0b3Igc2lnbmVkIGNoYXIpX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY192YW5kYyh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19hICYgfl9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfdmFuZGModmVjdG9yIGJvb2wgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSAmIH5fX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3ZhbmRjKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYSAmIH4odmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBjaGFyIF9fQVRUUlNfb19haQordmVjX3ZhbmRjKHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICByZXR1cm4gX19hICYgfl9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNob3J0IF9fQVRUUlNfb19haSB2ZWNfdmFuZGModmVjdG9yIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYSAmIH5fX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaG9ydCBfX0FUVFJTX29fYWkgdmVjX3ZhbmRjKHZlY3RvciBib29sIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2hvcnQpX19hICYgfl9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNob3J0IF9fQVRUUlNfb19haSB2ZWNfdmFuZGModmVjdG9yIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICByZXR1cm4gX19hICYgfih2ZWN0b3Igc2hvcnQpX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfdmFuZGModmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gX19hICYgfl9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX3ZhbmRjKHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2EgJiB+X19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfdmFuZGModmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2EgJiB+KHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIHNob3J0IF9fQVRUUlNfb19haQordmVjX3ZhbmRjKHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2EgJiB+X19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfdmFuZGModmVjdG9yIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYSAmIH5fX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY192YW5kYyh2ZWN0b3IgYm9vbCBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGludClfX2EgJiB+X19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfdmFuZGModmVjdG9yIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICByZXR1cm4gX19hICYgfih2ZWN0b3IgaW50KV9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY192YW5kYyh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYSAmIH5fX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfdmFuZGModmVjdG9yIGJvb2wgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSAmIH5fX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfdmFuZGModmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYSAmIH4odmVjdG9yIHVuc2lnbmVkIGludClfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGludCBfX0FUVFJTX29fYWkgdmVjX3ZhbmRjKHZlY3RvciBib29sIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIHJldHVybiBfX2EgJiB+X19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZmxvYXQgX19BVFRSU19vX2FpIHZlY192YW5kYyh2ZWN0b3IgZmxvYXQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGZsb2F0IF9fYikgeworICB2ZWN0b3IgdW5zaWduZWQgaW50IF9fcmVzID0KKyAgICAgICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSAmIH4odmVjdG9yIHVuc2lnbmVkIGludClfX2I7CisgIHJldHVybiAodmVjdG9yIGZsb2F0KV9fcmVzOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZmxvYXQgX19BVFRSU19vX2FpIHZlY192YW5kYyh2ZWN0b3IgYm9vbCBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGZsb2F0IF9fYikgeworICB2ZWN0b3IgdW5zaWduZWQgaW50IF9fcmVzID0KKyAgICAgICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSAmIH4odmVjdG9yIHVuc2lnbmVkIGludClfX2I7CisgIHJldHVybiAodmVjdG9yIGZsb2F0KV9fcmVzOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZmxvYXQgX19BVFRSU19vX2FpIHZlY192YW5kYyh2ZWN0b3IgZmxvYXQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICB2ZWN0b3IgdW5zaWduZWQgaW50IF9fcmVzID0KKyAgICAgICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSAmIH4odmVjdG9yIHVuc2lnbmVkIGludClfX2I7CisgIHJldHVybiAodmVjdG9yIGZsb2F0KV9fcmVzOworfQorCisjaWZkZWYgX19WU1hfXworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfdmFuZGModmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYSAmIH5fX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX3ZhbmRjKHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYSAmIH5fX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX3ZhbmRjKHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19hICYgfih2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZylfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfdmFuZGModmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2EgJiB+X19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX3ZhbmRjKHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2EgJiB+X19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX3ZhbmRjKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2EgJiB+KHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfdmFuZGModmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19hICYgfl9fYjsKK30KKyNlbmRpZgorCisvKiB2ZWNfYXZnICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19hdmcodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmF2Z3NiKF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfYXZnKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192YXZndWIoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY19hdmcodmVjdG9yIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192YXZnc2goX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfYXZnKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3Zhdmd1aChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY19hdmcodmVjdG9yIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192YXZnc3coX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX2F2Zyh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3Zhdmd1dyhfX2EsIF9fYik7Cit9CisKKy8qIHZlY192YXZnc2IgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKK3ZlY192YXZnc2IodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmF2Z3NiKF9fYSwgX19iKTsKK30KKworLyogdmVjX3Zhdmd1YiAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpCit2ZWNfdmF2Z3ViKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192YXZndWIoX19hLCBfX2IpOworfQorCisvKiB2ZWNfdmF2Z3NoICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaG9ydCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpCit2ZWNfdmF2Z3NoKHZlY3RvciBzaG9ydCBfX2EsIHZlY3RvciBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZhdmdzaChfX2EsIF9fYik7Cit9CisKKy8qIHZlY192YXZndWggKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKK3ZlY192YXZndWgodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmF2Z3VoKF9fYSwgX19iKTsKK30KKworLyogdmVjX3ZhdmdzdyAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKK3ZlY192YXZnc3codmVjdG9yIGludCBfX2EsIHZlY3RvciBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192YXZnc3coX19hLCBfX2IpOworfQorCisvKiB2ZWNfdmF2Z3V3ICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKQordmVjX3Zhdmd1dyh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3Zhdmd1dyhfX2EsIF9fYik7Cit9CisKKy8qIHZlY19jZWlsICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBmbG9hdCBfX0FUVFJTX29fYWkgdmVjX2NlaWwodmVjdG9yIGZsb2F0IF9fYSkgeworI2lmZGVmIF9fVlNYX18KKyAgcmV0dXJuIF9fYnVpbHRpbl92c3hfeHZyc3BpcChfX2EpOworI2Vsc2UKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZyZmlwKF9fYSk7CisjZW5kaWYKK30KKworI2lmZGVmIF9fVlNYX18KK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBkb3VibGUgX19BVFRSU19vX2FpIHZlY19jZWlsKHZlY3RvciBkb3VibGUgX19hKSB7CisgIHJldHVybiBfX2J1aWx0aW5fdnN4X3h2cmRwaXAoX19hKTsKK30KKyNlbmRpZgorCisvKiB2ZWNfdnJmaXAgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGZsb2F0IF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKK3ZlY192cmZpcCh2ZWN0b3IgZmxvYXQgX19hKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192cmZpcChfX2EpOworfQorCisvKiB2ZWNfY21wYiAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKK3ZlY19jbXBiKHZlY3RvciBmbG9hdCBfX2EsIHZlY3RvciBmbG9hdCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBiZnAoX19hLCBfX2IpOworfQorCisvKiB2ZWNfdmNtcGJmcCAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKK3ZlY192Y21wYmZwKHZlY3RvciBmbG9hdCBfX2EsIHZlY3RvciBmbG9hdCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBiZnAoX19hLCBfX2IpOworfQorCisvKiB2ZWNfY21wZXEgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19jbXBlcSh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgY2hhcilfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1YigodmVjdG9yIGNoYXIpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfY21wZXEodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcXViKCh2ZWN0b3IgY2hhcilfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGNoYXIpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgc2hvcnQgX19BVFRSU19vX2FpIHZlY19jbXBlcSh2ZWN0b3Igc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgc2hvcnQpX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWgoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19jbXBlcSh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgc2hvcnQpX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWgoKHZlY3RvciBzaG9ydClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBzaG9ydClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBpbnQgX19BVFRSU19vX2FpIHZlY19jbXBlcSh2ZWN0b3IgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgaW50KV9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcXV3KF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgaW50IF9fQVRUUlNfb19haQordmVjX2NtcGVxKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIGludClfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1dygodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKKyNpZmRlZiBfX1BPV0VSOF9WRUNUT1JfXworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX2NtcGVxKHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgbG9uZyBsb25nKV9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcXVkKF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX2NtcGVxKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIGxvbmcgbG9uZylfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1ZCgKKyAgICAgICh2ZWN0b3IgbG9uZyBsb25nKV9fYSwgKHZlY3RvciBsb25nIGxvbmcpX19iKTsKK30KKyNlbmRpZgorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBpbnQgX19BVFRSU19vX2FpIHZlY19jbXBlcSh2ZWN0b3IgZmxvYXQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGZsb2F0IF9fYikgeworI2lmZGVmIF9fVlNYX18KKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBpbnQpX19idWlsdGluX3ZzeF94dmNtcGVxc3AoX19hLCBfX2IpOworI2Vsc2UKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBpbnQpX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxZnAoX19hLCBfX2IpOworI2VuZGlmCit9CisKKyNpZmRlZiBfX1ZTWF9fCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfY21wZXEodmVjdG9yIGRvdWJsZSBfX2EsIHZlY3RvciBkb3VibGUgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgbG9uZyBsb25nKV9fYnVpbHRpbl92c3hfeHZjbXBlcWRwKF9fYSwgX19iKTsKK30KKyNlbmRpZgorCisvKiB2ZWNfY21wZ3QgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19jbXBndCh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgY2hhcilfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3RzYihfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfY21wZ3QodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHViKF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgc2hvcnQgX19BVFRSU19vX2FpIHZlY19jbXBndCh2ZWN0b3Igc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgc2hvcnQpX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0c2goX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19jbXBndCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgc2hvcnQpX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWgoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBpbnQgX19BVFRSU19vX2FpIHZlY19jbXBndCh2ZWN0b3IgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgaW50KV9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHN3KF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgaW50IF9fQVRUUlNfb19haQordmVjX2NtcGd0KHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIGludClfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1dyhfX2EsIF9fYik7Cit9CisKKyNpZmRlZiBfX1BPV0VSOF9WRUNUT1JfXworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX2NtcGd0KHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgbG9uZyBsb25nKV9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHNkKF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX2NtcGd0KHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIGxvbmcgbG9uZylfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1ZChfX2EsIF9fYik7Cit9CisjZW5kaWYKKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgaW50IF9fQVRUUlNfb19haSB2ZWNfY21wZ3QodmVjdG9yIGZsb2F0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBmbG9hdCBfX2IpIHsKKyNpZmRlZiBfX1ZTWF9fCisgIHJldHVybiAodmVjdG9yIGJvb2wgaW50KV9fYnVpbHRpbl92c3hfeHZjbXBndHNwKF9fYSwgX19iKTsKKyNlbHNlCisgIHJldHVybiAodmVjdG9yIGJvb2wgaW50KV9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndGZwKF9fYSwgX19iKTsKKyNlbmRpZgorfQorCisjaWZkZWYgX19WU1hfXworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX2NtcGd0KHZlY3RvciBkb3VibGUgX19hLCB2ZWN0b3IgZG91YmxlIF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIGxvbmcgbG9uZylfX2J1aWx0aW5fdnN4X3h2Y21wZ3RkcChfX2EsIF9fYik7Cit9CisjZW5kaWYKKworLyogdmVjX2NtcGdlICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfY21wZ2UodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gfih2ZWNfY21wZ3QoX19iLCBfX2EpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19jbXBnZSh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gfih2ZWNfY21wZ3QoX19iLCBfX2EpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfY21wZ2UodmVjdG9yIHNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBzaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiB+KHZlY19jbXBndChfX2IsIF9fYSkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19jbXBnZSh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiB+KHZlY19jbXBndChfX2IsIF9fYSkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBpbnQgX19BVFRSU19vX2FpCit2ZWNfY21wZ2UodmVjdG9yIHNpZ25lZCBpbnQgX19hLCB2ZWN0b3Igc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuIH4odmVjX2NtcGd0KF9fYiwgX19hKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGludCBfX0FUVFJTX29fYWkKK3ZlY19jbXBnZSh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuIH4odmVjX2NtcGd0KF9fYiwgX19hKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGludCBfX0FUVFJTX29fYWkgdmVjX2NtcGdlKHZlY3RvciBmbG9hdCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgZmxvYXQgX19iKSB7CisjaWZkZWYgX19WU1hfXworICByZXR1cm4gKHZlY3RvciBib29sIGludClfX2J1aWx0aW5fdnN4X3h2Y21wZ2VzcChfX2EsIF9fYik7CisjZWxzZQorICByZXR1cm4gKHZlY3RvciBib29sIGludClfX2J1aWx0aW5fYWx0aXZlY192Y21wZ2VmcChfX2EsIF9fYik7CisjZW5kaWYKK30KKworI2lmZGVmIF9fVlNYX18KK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY19jbXBnZSh2ZWN0b3IgZG91YmxlIF9fYSwgdmVjdG9yIGRvdWJsZSBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBsb25nIGxvbmcpX19idWlsdGluX3ZzeF94dmNtcGdlZHAoX19hLCBfX2IpOworfQorI2VuZGlmCisKKyNpZmRlZiBfX1BPV0VSOF9WRUNUT1JfXworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX2NtcGdlKHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiB+KHZlY19jbXBndChfX2IsIF9fYSkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfY21wZ2UodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiB+KHZlY19jbXBndChfX2IsIF9fYSkpOworfQorI2VuZGlmCisKKy8qIHZlY192Y21wZ2VmcCAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBpbnQgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKQordmVjX3ZjbXBnZWZwKHZlY3RvciBmbG9hdCBfX2EsIHZlY3RvciBmbG9hdCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBpbnQpX19idWlsdGluX2FsdGl2ZWNfdmNtcGdlZnAoX19hLCBfX2IpOworfQorCisvKiB2ZWNfdmNtcGd0c2IgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgY2hhciBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpCit2ZWNfdmNtcGd0c2IodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIGNoYXIpX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0c2IoX19hLCBfX2IpOworfQorCisvKiB2ZWNfdmNtcGd0dWIgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgY2hhciBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpCit2ZWNfdmNtcGd0dWIodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHViKF9fYSwgX19iKTsKK30KKworLyogdmVjX3ZjbXBndHNoICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIHNob3J0IF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKK3ZlY192Y21wZ3RzaCh2ZWN0b3Igc2hvcnQgX19hLCB2ZWN0b3Igc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgc2hvcnQpX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0c2goX19hLCBfX2IpOworfQorCisvKiB2ZWNfdmNtcGd0dWggKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgc2hvcnQgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKQordmVjX3ZjbXBndHVoKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBzaG9ydClfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1aChfX2EsIF9fYik7Cit9CisKKy8qIHZlY192Y21wZ3RzdyAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBpbnQgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKQordmVjX3ZjbXBndHN3KHZlY3RvciBpbnQgX19hLCB2ZWN0b3IgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIGludClfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3RzdyhfX2EsIF9fYik7Cit9CisKKy8qIHZlY192Y21wZ3R1dyAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBpbnQgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKQordmVjX3ZjbXBndHV3KHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIGludClfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1dyhfX2EsIF9fYik7Cit9CisKKy8qIHZlY192Y21wZ3RmcCAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBpbnQgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKQordmVjX3ZjbXBndGZwKHZlY3RvciBmbG9hdCBfX2EsIHZlY3RvciBmbG9hdCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBpbnQpX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0ZnAoX19hLCBfX2IpOworfQorCisvKiB2ZWNfY21wbGUgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19jbXBsZSh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiB2ZWNfY21wZ2UoX19iLCBfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBjaGFyIF9fQVRUUlNfb19haQordmVjX2NtcGxlKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiB2ZWNfY21wZ2UoX19iLCBfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19jbXBsZSh2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIHZlY19jbXBnZShfX2IsIF9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIHNob3J0IF9fQVRUUlNfb19haQordmVjX2NtcGxlKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIHZlY19jbXBnZShfX2IsIF9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGludCBfX0FUVFJTX29fYWkKK3ZlY19jbXBsZSh2ZWN0b3Igc2lnbmVkIGludCBfX2EsIHZlY3RvciBzaWduZWQgaW50IF9fYikgeworICByZXR1cm4gdmVjX2NtcGdlKF9fYiwgX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgaW50IF9fQVRUUlNfb19haQordmVjX2NtcGxlKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gdmVjX2NtcGdlKF9fYiwgX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgaW50IF9fQVRUUlNfb19haSB2ZWNfY21wbGUodmVjdG9yIGZsb2F0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBmbG9hdCBfX2IpIHsKKyAgcmV0dXJuIHZlY19jbXBnZShfX2IsIF9fYSk7Cit9CisKKyNpZmRlZiBfX1ZTWF9fCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfY21wbGUodmVjdG9yIGRvdWJsZSBfX2EsIHZlY3RvciBkb3VibGUgX19iKSB7CisgIHJldHVybiB2ZWNfY21wZ2UoX19iLCBfX2EpOworfQorI2VuZGlmCisKKyNpZmRlZiBfX1BPV0VSOF9WRUNUT1JfXworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX2NtcGxlKHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiB2ZWNfY21wZ2UoX19iLCBfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfY21wbGUodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiB2ZWNfY21wZ2UoX19iLCBfX2EpOworfQorI2VuZGlmCisKKy8qIHZlY19jbXBsdCAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBjaGFyIF9fQVRUUlNfb19haQordmVjX2NtcGx0KHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIHZlY19jbXBndChfX2IsIF9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfY21wbHQodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIHZlY19jbXBndChfX2IsIF9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIHNob3J0IF9fQVRUUlNfb19haSB2ZWNfY21wbHQodmVjdG9yIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNob3J0IF9fYikgeworICByZXR1cm4gdmVjX2NtcGd0KF9fYiwgX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfY21wbHQodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gdmVjX2NtcGd0KF9fYiwgX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgaW50IF9fQVRUUlNfb19haSB2ZWNfY21wbHQodmVjdG9yIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgaW50IF9fYikgeworICByZXR1cm4gdmVjX2NtcGd0KF9fYiwgX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgaW50IF9fQVRUUlNfb19haQordmVjX2NtcGx0KHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gdmVjX2NtcGd0KF9fYiwgX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgaW50IF9fQVRUUlNfb19haSB2ZWNfY21wbHQodmVjdG9yIGZsb2F0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBmbG9hdCBfX2IpIHsKKyAgcmV0dXJuIHZlY19jbXBndChfX2IsIF9fYSk7Cit9CisKKyNpZmRlZiBfX1ZTWF9fCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfY21wbHQodmVjdG9yIGRvdWJsZSBfX2EsIHZlY3RvciBkb3VibGUgX19iKSB7CisgIHJldHVybiB2ZWNfY21wZ3QoX19iLCBfX2EpOworfQorI2VuZGlmCisKKyNpZmRlZiBfX1BPV0VSOF9WRUNUT1JfXworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX2NtcGx0KHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiB2ZWNfY21wZ3QoX19iLCBfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfY21wbHQodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiB2ZWNfY21wZ3QoX19iLCBfX2EpOworfQorCisvKiB2ZWNfY250bHogKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX2NudGx6KHZlY3RvciBzaWduZWQgY2hhciBfX2EpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbHpiKF9fYSk7Cit9CitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19jbnRseih2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbHpiKF9fYSk7Cit9CitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX2NudGx6KHZlY3RvciBzaWduZWQgc2hvcnQgX19hKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y2x6aChfX2EpOworfQorc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX2NudGx6KHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbHpoKF9fYSk7Cit9CitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY19jbnRseih2ZWN0b3Igc2lnbmVkIGludCBfX2EpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbHp3KF9fYSk7Cit9CitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX2NudGx6KHZlY3RvciB1bnNpZ25lZCBpbnQgX19hKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y2x6dyhfX2EpOworfQorc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfY250bHoodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y2x6ZChfX2EpOworfQorc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY19jbnRseih2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSkgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNsemQoX19hKTsKK30KKyNlbmRpZgorCisvKiB2ZWNfY3BzZ24gKi8KKworI2lmZGVmIF9fVlNYX18KK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBmbG9hdCBfX0FUVFJTX29fYWkgdmVjX2Nwc2duKHZlY3RvciBmbG9hdCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgZmxvYXQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fdnN4X3h2Y3BzZ25zcChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBkb3VibGUgX19BVFRSU19vX2FpIHZlY19jcHNnbih2ZWN0b3IgZG91YmxlIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgZG91YmxlIF9fYikgeworICByZXR1cm4gX19idWlsdGluX3ZzeF94dmNwc2duZHAoX19hLCBfX2IpOworfQorI2VuZGlmCisKKy8qIHZlY19jdGYgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGZsb2F0IF9fQVRUUlNfb19haSB2ZWNfY3RmKHZlY3RvciBpbnQgX19hLCBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y2ZzeChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBmbG9hdCBfX0FUVFJTX29fYWkgdmVjX2N0Zih2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y2Z1eCgodmVjdG9yIGludClfX2EsIF9fYik7Cit9CisKKyNpZmRlZiBfX1ZTWF9fCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZG91YmxlIF9fQVRUUlNfb19haQordmVjX2N0Zih2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgaW50IF9fYikgeworICB2ZWN0b3IgZG91YmxlIF9fcmV0ID0gX19idWlsdGluX2NvbnZlcnR2ZWN0b3IoX19hLCB2ZWN0b3IgZG91YmxlKTsKKyAgX19yZXQgKj0gKHZlY3RvciBkb3VibGUpKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpKCgweDNmZlVMTCAtIF9fYikgPDwgNTIpOworICByZXR1cm4gX19yZXQ7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBkb3VibGUgX19BVFRSU19vX2FpCit2ZWNfY3RmKHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwgaW50IF9fYikgeworICB2ZWN0b3IgZG91YmxlIF9fcmV0ID0gX19idWlsdGluX2NvbnZlcnR2ZWN0b3IoX19hLCB2ZWN0b3IgZG91YmxlKTsKKyAgX19yZXQgKj0gKHZlY3RvciBkb3VibGUpKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpKCgweDNmZlVMTCAtIF9fYikgPDwgNTIpOworICByZXR1cm4gX19yZXQ7Cit9CisjZW5kaWYKKworLyogdmVjX3ZjZnN4ICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBmbG9hdCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpCit2ZWNfdmNmc3godmVjdG9yIGludCBfX2EsIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjZnN4KF9fYSwgX19iKTsKK30KKworLyogdmVjX3ZjZnV4ICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBmbG9hdCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpCit2ZWNfdmNmdXgodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjZnV4KCh2ZWN0b3IgaW50KV9fYSwgX19iKTsKK30KKworLyogdmVjX2N0cyAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfY3RzKHZlY3RvciBmbG9hdCBfX2EsIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjdHN4cyhfX2EsIF9fYik7Cit9CisKKyNpZmRlZiBfX1ZTWF9fCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY19jdHModmVjdG9yIGRvdWJsZSBfX2EsIGludCBfX2IpIHsKKyAgX19hICo9ICh2ZWN0b3IgZG91YmxlKSh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKSgoMHgzZmZVTEwgKyBfX2IpIDw8IDUyKTsKKyAgcmV0dXJuIF9fYnVpbHRpbl9jb252ZXJ0dmVjdG9yKF9fYSwgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpOworfQorI2VuZGlmCisKKy8qIHZlY192Y3RzeHMgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpCit2ZWNfdmN0c3hzKHZlY3RvciBmbG9hdCBfX2EsIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjdHN4cyhfX2EsIF9fYik7Cit9CisKKy8qIHZlY19jdHUgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkgdmVjX2N0dSh2ZWN0b3IgZmxvYXQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y3R1eHMoX19hLCBfX2IpOworfQorCisjaWZkZWYgX19WU1hfXworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY19jdHUodmVjdG9yIGRvdWJsZSBfX2EsIGludCBfX2IpIHsKKyAgX19hICo9ICh2ZWN0b3IgZG91YmxlKSh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKSgoMHgzZmZVTEwgKyBfX2IpIDw8IDUyKTsKKyAgcmV0dXJuIF9fYnVpbHRpbl9jb252ZXJ0dmVjdG9yKF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyk7Cit9CisjZW5kaWYKKworLyogdmVjX3ZjdHV4cyAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKK3ZlY192Y3R1eHModmVjdG9yIGZsb2F0IF9fYSwgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmN0dXhzKF9fYSwgX19iKTsKK30KKworLyogdmVjX2RvdWJsZSAqLworCisjaWZkZWYgX19WU1hfXworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGRvdWJsZSBfX0FUVFJTX29fYWkKK3ZlY19kb3VibGUodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hKSB7CisgIHZlY3RvciBkb3VibGUgX19yZXQgPSB7X19hWzBdLCBfX2FbMV19OworICByZXR1cm4gX19yZXQ7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBkb3VibGUgX19BVFRSU19vX2FpCit2ZWNfZG91YmxlKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hKSB7CisgIHZlY3RvciBkb3VibGUgX19yZXQgPSB7X19hWzBdLCBfX2FbMV19OworICByZXR1cm4gX19yZXQ7Cit9CisjZW5kaWYKKworLyogdmVjX2RpdiAqLworCisvKiBJbnRlZ2VyIHZlY3RvciBkaXZpZGVzICh2ZWN0b3JzIGFyZSBzY2FsYXJpemVkLCBlbGVtZW50cyBkaXZpZGVkCisgICBhbmQgdGhlIHZlY3RvcnMgcmVhc3NlbWJsZWQpLgorKi8KK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19kaXYodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19hIC8gX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19kaXYodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYSAvIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19kaXYodmVjdG9yIHNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBzaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2EgLyBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19kaXYodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gX19hIC8gX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY19kaXYodmVjdG9yIHNpZ25lZCBpbnQgX19hLCB2ZWN0b3Igc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYSAvIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY19kaXYodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiBfX2EgLyBfX2I7Cit9CisKKyNpZmRlZiBfX1ZTWF9fCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY19kaXYodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYSAvIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY19kaXYodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2EgLyBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBmbG9hdCBfX0FUVFJTX29fYWkgdmVjX2Rpdih2ZWN0b3IgZmxvYXQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBmbG9hdCBfX2IpIHsKKyAgcmV0dXJuIF9fYSAvIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGRvdWJsZSBfX0FUVFJTX29fYWkgdmVjX2Rpdih2ZWN0b3IgZG91YmxlIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGRvdWJsZSBfX2IpIHsKKyAgcmV0dXJuIF9fYSAvIF9fYjsKK30KKyNlbmRpZgorCisvKiB2ZWNfZHNzICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKSB2ZWNfZHNzKGludCBfX2EpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfZHNzKF9fYSk7Cit9CisKKy8qIHZlY19kc3NhbGwgKi8KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpIHZlY19kc3NhbGwodm9pZCkgeworICBfX2J1aWx0aW5fYWx0aXZlY19kc3NhbGwoKTsKK30KKworLyogdmVjX2RzdCAqLworI2RlZmluZSB2ZWNfZHN0KF9fUFRSLCBfX0NXLCBfX1NUUikgXAorICBfX2V4dGVuc2lvbl9fKCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgeyBfX2J1aWx0aW5fYWx0aXZlY19kc3QoKGNvbnN0IHZvaWQgKikoX19QVFIpLCAoX19DVyksIChfX1NUUikpOyB9KQorCisvKiB2ZWNfZHN0c3QgKi8KKyNkZWZpbmUgdmVjX2RzdHN0KF9fUFRSLCBfX0NXLCBfX1NUUikgXAorICBfX2V4dGVuc2lvbl9fKCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB7IF9fYnVpbHRpbl9hbHRpdmVjX2RzdHN0KChjb25zdCB2b2lkICopKF9fUFRSKSwgKF9fQ1cpLCAoX19TVFIpKTsgfSkKKworLyogdmVjX2RzdHN0dCAqLworI2RlZmluZSB2ZWNfZHN0c3R0KF9fUFRSLCBfX0NXLCBfX1NUUikgXAorICBfX2V4dGVuc2lvbl9fKCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgeyBfX2J1aWx0aW5fYWx0aXZlY19kc3RzdHQoKGNvbnN0IHZvaWQgKikoX19QVFIpLCAoX19DVyksIChfX1NUUikpOyB9KQorCisvKiB2ZWNfZHN0dCAqLworI2RlZmluZSB2ZWNfZHN0dChfX1BUUiwgX19DVywgX19TVFIpIFwKKyAgX19leHRlbnNpb25fXyggICAgICAgICAgICAgICAgICAgICBcCisgICAgICB7IF9fYnVpbHRpbl9hbHRpdmVjX2RzdHQoKGNvbnN0IHZvaWQgKikoX19QVFIpLCAoX19DVyksIChfX1NUUikpOyB9KQorCisvKiB2ZWNfZXF2ICovCisKKyNpZmRlZiBfX1BPV0VSOF9WRUNUT1JfXworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX2Vxdih2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYnVpbHRpbl92c3hfeHhsZXF2KCh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfZXF2KHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19idWlsdGluX3ZzeF94eGxlcXYoKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGNoYXIgX19BVFRSU19vX2FpIHZlY19lcXYodmVjdG9yIGJvb2wgY2hhciBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgY2hhcilfX2J1aWx0aW5fdnN4X3h4bGVxdigodmVjdG9yIHVuc2lnbmVkIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX2Vxdih2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIHNob3J0KV9fYnVpbHRpbl92c3hfeHhsZXF2KCh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19lcXYodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2J1aWx0aW5fdnN4X3h4bGVxdigodmVjdG9yIHVuc2lnbmVkIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIHNob3J0IF9fQVRUUlNfb19haQordmVjX2Vxdih2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIHNob3J0KV9fYnVpbHRpbl92c3hfeHhsZXF2KCh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY19lcXYodmVjdG9yIHNpZ25lZCBpbnQgX19hLCB2ZWN0b3Igc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGludClfX2J1aWx0aW5fdnN4X3h4bGVxdigodmVjdG9yIHVuc2lnbmVkIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY19lcXYodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fdnN4X3h4bGVxdihfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGludCBfX0FUVFJTX29fYWkgdmVjX2Vxdih2ZWN0b3IgYm9vbCBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBpbnQpX19idWlsdGluX3ZzeF94eGxlcXYoKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY19lcXYodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZylfX2J1aWx0aW5fdnN4X3h4bGVxdigKKyAgICAgICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSwgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY19lcXYodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2J1aWx0aW5fdnN4X3h4bGVxdigKKyAgICAgICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSwgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX2Vxdih2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgbG9uZyBsb25nKV9fYnVpbHRpbl92c3hfeHhsZXF2KCh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGZsb2F0IF9fQVRUUlNfb19haSB2ZWNfZXF2KHZlY3RvciBmbG9hdCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGZsb2F0IF9fYikgeworICByZXR1cm4gKHZlY3RvciBmbG9hdClfX2J1aWx0aW5fdnN4X3h4bGVxdigodmVjdG9yIHVuc2lnbmVkIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBkb3VibGUgX19BVFRSU19vX2FpIHZlY19lcXYodmVjdG9yIGRvdWJsZSBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBkb3VibGUgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGRvdWJsZSlfX2J1aWx0aW5fdnN4X3h4bGVxdigodmVjdG9yIHVuc2lnbmVkIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGludClfX2IpOworfQorI2VuZGlmCisKKy8qIHZlY19leHB0ZSAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZmxvYXQgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKQordmVjX2V4cHRlKHZlY3RvciBmbG9hdCBfX2EpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZleHB0ZWZwKF9fYSk7Cit9CisKKy8qIHZlY192ZXhwdGVmcCAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZmxvYXQgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKQordmVjX3ZleHB0ZWZwKHZlY3RvciBmbG9hdCBfX2EpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZleHB0ZWZwKF9fYSk7Cit9CisKKy8qIHZlY19mbG9vciAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZmxvYXQgX19BVFRSU19vX2FpIHZlY19mbG9vcih2ZWN0b3IgZmxvYXQgX19hKSB7CisjaWZkZWYgX19WU1hfXworICByZXR1cm4gX19idWlsdGluX3ZzeF94dnJzcGltKF9fYSk7CisjZWxzZQorICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdnJmaW0oX19hKTsKKyNlbmRpZgorfQorCisjaWZkZWYgX19WU1hfXworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGRvdWJsZSBfX0FUVFJTX29fYWkgdmVjX2Zsb29yKHZlY3RvciBkb3VibGUgX19hKSB7CisgIHJldHVybiBfX2J1aWx0aW5fdnN4X3h2cmRwaW0oX19hKTsKK30KKyNlbmRpZgorCisvKiB2ZWNfdnJmaW0gKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGZsb2F0IF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKK3ZlY192cmZpbSh2ZWN0b3IgZmxvYXQgX19hKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192cmZpbShfX2EpOworfQorCisvKiB2ZWNfbGQgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX2xkKGludCBfX2EsIGNvbnN0IHZlY3RvciBzaWduZWQgY2hhciAqX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX2x2eChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19sZChpbnQgX19hLCBjb25zdCBzaWduZWQgY2hhciAqX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX2x2eChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX2xkKGludCBfX2EsIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBjaGFyICpfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2J1aWx0aW5fYWx0aXZlY19sdngoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19sZChpbnQgX19hLCBjb25zdCB1bnNpZ25lZCBjaGFyICpfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2J1aWx0aW5fYWx0aXZlY19sdngoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBjaGFyIF9fQVRUUlNfb19haQordmVjX2xkKGludCBfX2EsIGNvbnN0IHZlY3RvciBib29sIGNoYXIgKl9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIGNoYXIpX19idWlsdGluX2FsdGl2ZWNfbHZ4KF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNob3J0IF9fQVRUUlNfb19haSB2ZWNfbGQoaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3RvciBzaG9ydCAqX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNob3J0KV9fYnVpbHRpbl9hbHRpdmVjX2x2eChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaG9ydCBfX0FUVFJTX29fYWkgdmVjX2xkKGludCBfX2EsIGNvbnN0IHNob3J0ICpfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2hvcnQpX19idWlsdGluX2FsdGl2ZWNfbHZ4KF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX2xkKGludCBfX2EsIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBzaG9ydCAqX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYnVpbHRpbl9hbHRpdmVjX2x2eChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19sZChpbnQgX19hLCBjb25zdCB1bnNpZ25lZCBzaG9ydCAqX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYnVpbHRpbl9hbHRpdmVjX2x2eChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIHNob3J0IF9fQVRUUlNfb19haQordmVjX2xkKGludCBfX2EsIGNvbnN0IHZlY3RvciBib29sIHNob3J0ICpfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBzaG9ydClfX2J1aWx0aW5fYWx0aXZlY19sdngoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgcGl4ZWwgX19BVFRSU19vX2FpIHZlY19sZChpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yIHBpeGVsICpfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgcGl4ZWwpX19idWlsdGluX2FsdGl2ZWNfbHZ4KF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX0FUVFJTX29fYWkgdmVjX2xkKGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yIGludCAqX19iKSB7CisgIHJldHVybiAodmVjdG9yIGludClfX2J1aWx0aW5fYWx0aXZlY19sdngoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfbGQoaW50IF9fYSwgY29uc3QgaW50ICpfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgaW50KV9fYnVpbHRpbl9hbHRpdmVjX2x2eChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfbGQoaW50IF9fYSwgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGludCAqX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGludClfX2J1aWx0aW5fYWx0aXZlY19sdngoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX2xkKGludCBfX2EsIGNvbnN0IHVuc2lnbmVkIGludCAqX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGludClfX2J1aWx0aW5fYWx0aXZlY19sdngoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBpbnQgX19BVFRSU19vX2FpCit2ZWNfbGQoaW50IF9fYSwgY29uc3QgdmVjdG9yIGJvb2wgaW50ICpfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBpbnQpX19idWlsdGluX2FsdGl2ZWNfbHZ4KF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGZsb2F0IF9fQVRUUlNfb19haSB2ZWNfbGQoaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3RvciBmbG9hdCAqX19iKSB7CisgIHJldHVybiAodmVjdG9yIGZsb2F0KV9fYnVpbHRpbl9hbHRpdmVjX2x2eChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBmbG9hdCBfX0FUVFJTX29fYWkgdmVjX2xkKGludCBfX2EsIGNvbnN0IGZsb2F0ICpfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgZmxvYXQpX19idWlsdGluX2FsdGl2ZWNfbHZ4KF9fYSwgX19iKTsKK30KKworLyogdmVjX2x2eCAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfbHZ4KGludCBfX2EsIGNvbnN0IHZlY3RvciBzaWduZWQgY2hhciAqX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX2x2eChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19sdngoaW50IF9fYSwgY29uc3Qgc2lnbmVkIGNoYXIgKl9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgY2hhcilfX2J1aWx0aW5fYWx0aXZlY19sdngoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19sdngoaW50IF9fYSwgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgKl9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX2x2eChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX2x2eChpbnQgX19hLCBjb25zdCB1bnNpZ25lZCBjaGFyICpfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2J1aWx0aW5fYWx0aXZlY19sdngoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBjaGFyIF9fQVRUUlNfb19haQordmVjX2x2eChpbnQgX19hLCBjb25zdCB2ZWN0b3IgYm9vbCBjaGFyICpfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX2x2eChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaG9ydCBfX0FUVFJTX29fYWkgdmVjX2x2eChpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3RvciBzaG9ydCAqX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNob3J0KV9fYnVpbHRpbl9hbHRpdmVjX2x2eChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaG9ydCBfX0FUVFJTX29fYWkgdmVjX2x2eChpbnQgX19hLCBjb25zdCBzaG9ydCAqX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNob3J0KV9fYnVpbHRpbl9hbHRpdmVjX2x2eChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19sdngoaW50IF9fYSwgY29uc3QgdmVjdG9yIHVuc2lnbmVkIHNob3J0ICpfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19idWlsdGluX2FsdGl2ZWNfbHZ4KF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX2x2eChpbnQgX19hLCBjb25zdCB1bnNpZ25lZCBzaG9ydCAqX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYnVpbHRpbl9hbHRpdmVjX2x2eChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIHNob3J0IF9fQVRUUlNfb19haQordmVjX2x2eChpbnQgX19hLCBjb25zdCB2ZWN0b3IgYm9vbCBzaG9ydCAqX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgc2hvcnQpX19idWlsdGluX2FsdGl2ZWNfbHZ4KF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHBpeGVsIF9fQVRUUlNfb19haSB2ZWNfbHZ4KGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yIHBpeGVsICpfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgcGl4ZWwpX19idWlsdGluX2FsdGl2ZWNfbHZ4KF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX0FUVFJTX29fYWkgdmVjX2x2eChpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3IgaW50ICpfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgaW50KV9fYnVpbHRpbl9hbHRpdmVjX2x2eChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY19sdngoaW50IF9fYSwgY29uc3QgaW50ICpfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgaW50KV9fYnVpbHRpbl9hbHRpdmVjX2x2eChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfbHZ4KGludCBfX2EsIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBpbnQgKl9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBpbnQpX19idWlsdGluX2FsdGl2ZWNfbHZ4KF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY19sdngoaW50IF9fYSwgY29uc3QgdW5zaWduZWQgaW50ICpfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYnVpbHRpbl9hbHRpdmVjX2x2eChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGludCBfX0FUVFJTX29fYWkKK3ZlY19sdngoaW50IF9fYSwgY29uc3QgdmVjdG9yIGJvb2wgaW50ICpfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBpbnQpX19idWlsdGluX2FsdGl2ZWNfbHZ4KF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGZsb2F0IF9fQVRUUlNfb19haSB2ZWNfbHZ4KGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yIGZsb2F0ICpfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgZmxvYXQpX19idWlsdGluX2FsdGl2ZWNfbHZ4KF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGZsb2F0IF9fQVRUUlNfb19haSB2ZWNfbHZ4KGludCBfX2EsIGNvbnN0IGZsb2F0ICpfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgZmxvYXQpX19idWlsdGluX2FsdGl2ZWNfbHZ4KF9fYSwgX19iKTsKK30KKworLyogdmVjX2xkZSAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfbGRlKGludCBfX2EsIGNvbnN0IHNpZ25lZCBjaGFyICpfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGNoYXIpX19idWlsdGluX2FsdGl2ZWNfbHZlYngoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19sZGUoaW50IF9fYSwgY29uc3QgdW5zaWduZWQgY2hhciAqX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19idWlsdGluX2FsdGl2ZWNfbHZlYngoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY19sZGUoaW50IF9fYSwgY29uc3Qgc2hvcnQgKl9fYikgeworICByZXR1cm4gKHZlY3RvciBzaG9ydClfX2J1aWx0aW5fYWx0aXZlY19sdmVoeChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19sZGUoaW50IF9fYSwgY29uc3QgdW5zaWduZWQgc2hvcnQgKl9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2J1aWx0aW5fYWx0aXZlY19sdmVoeChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY19sZGUoaW50IF9fYSwgY29uc3QgaW50ICpfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgaW50KV9fYnVpbHRpbl9hbHRpdmVjX2x2ZXd4KF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY19sZGUoaW50IF9fYSwgY29uc3QgdW5zaWduZWQgaW50ICpfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYnVpbHRpbl9hbHRpdmVjX2x2ZXd4KF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGZsb2F0IF9fQVRUUlNfb19haSB2ZWNfbGRlKGludCBfX2EsIGNvbnN0IGZsb2F0ICpfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgZmxvYXQpX19idWlsdGluX2FsdGl2ZWNfbHZld3goX19hLCBfX2IpOworfQorCisvKiB2ZWNfbHZlYnggKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX2x2ZWJ4KGludCBfX2EsIGNvbnN0IHNpZ25lZCBjaGFyICpfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGNoYXIpX19idWlsdGluX2FsdGl2ZWNfbHZlYngoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19sdmVieChpbnQgX19hLCBjb25zdCB1bnNpZ25lZCBjaGFyICpfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2J1aWx0aW5fYWx0aXZlY19sdmVieChfX2EsIF9fYik7Cit9CisKKy8qIHZlY19sdmVoeCAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY19sdmVoeChpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hvcnQgKl9fYikgeworICByZXR1cm4gKHZlY3RvciBzaG9ydClfX2J1aWx0aW5fYWx0aXZlY19sdmVoeChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19sdmVoeChpbnQgX19hLCBjb25zdCB1bnNpZ25lZCBzaG9ydCAqX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYnVpbHRpbl9hbHRpdmVjX2x2ZWh4KF9fYSwgX19iKTsKK30KKworLyogdmVjX2x2ZXd4ICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY19sdmV3eChpbnQgX19hLCBjb25zdCBpbnQgKl9fYikgeworICByZXR1cm4gKHZlY3RvciBpbnQpX19idWlsdGluX2FsdGl2ZWNfbHZld3goX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX2x2ZXd4KGludCBfX2EsIGNvbnN0IHVuc2lnbmVkIGludCAqX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGludClfX2J1aWx0aW5fYWx0aXZlY19sdmV3eChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBmbG9hdCBfX0FUVFJTX29fYWkgdmVjX2x2ZXd4KGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqX19iKSB7CisgIHJldHVybiAodmVjdG9yIGZsb2F0KV9fYnVpbHRpbl9hbHRpdmVjX2x2ZXd4KF9fYSwgX19iKTsKK30KKworLyogdmVjX2xkbCAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfbGRsKGludCBfX2EsIGNvbnN0IHZlY3RvciBzaWduZWQgY2hhciAqX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX2x2eGwoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfbGRsKGludCBfX2EsIGNvbnN0IHNpZ25lZCBjaGFyICpfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGNoYXIpX19idWlsdGluX2FsdGl2ZWNfbHZ4bChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX2xkbChpbnQgX19hLCBjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhciAqX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19idWlsdGluX2FsdGl2ZWNfbHZ4bChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX2xkbChpbnQgX19hLCBjb25zdCB1bnNpZ25lZCBjaGFyICpfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2J1aWx0aW5fYWx0aXZlY19sdnhsKF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19sZGwoaW50IF9fYSwgY29uc3QgdmVjdG9yIGJvb2wgY2hhciAqX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgY2hhcilfX2J1aWx0aW5fYWx0aXZlY19sdnhsKF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNob3J0IF9fQVRUUlNfb19haSB2ZWNfbGRsKGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yIHNob3J0ICpfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2hvcnQpX19idWlsdGluX2FsdGl2ZWNfbHZ4bChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaG9ydCBfX0FUVFJTX29fYWkgdmVjX2xkbChpbnQgX19hLCBjb25zdCBzaG9ydCAqX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNob3J0KV9fYnVpbHRpbl9hbHRpdmVjX2x2eGwoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfbGRsKGludCBfX2EsIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBzaG9ydCAqX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYnVpbHRpbl9hbHRpdmVjX2x2eGwoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfbGRsKGludCBfX2EsIGNvbnN0IHVuc2lnbmVkIHNob3J0ICpfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19idWlsdGluX2FsdGl2ZWNfbHZ4bChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIHNob3J0IF9fQVRUUlNfb19haQordmVjX2xkbChpbnQgX19hLCBjb25zdCB2ZWN0b3IgYm9vbCBzaG9ydCAqX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgc2hvcnQpX19idWlsdGluX2FsdGl2ZWNfbHZ4bChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBwaXhlbCBfX0FUVFJTX29fYWkgdmVjX2xkbChpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3RvciBwaXhlbCAqX19iKSB7CisgIHJldHVybiAodmVjdG9yIHBpeGVsIHNob3J0KV9fYnVpbHRpbl9hbHRpdmVjX2x2eGwoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfbGRsKGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3RvciBpbnQgKl9fYikgeworICByZXR1cm4gKHZlY3RvciBpbnQpX19idWlsdGluX2FsdGl2ZWNfbHZ4bChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY19sZGwoaW50IF9fYSwgY29uc3QgaW50ICpfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgaW50KV9fYnVpbHRpbl9hbHRpdmVjX2x2eGwoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX2xkbChpbnQgX19hLCBjb25zdCB2ZWN0b3IgdW5zaWduZWQgaW50ICpfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYnVpbHRpbl9hbHRpdmVjX2x2eGwoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX2xkbChpbnQgX19hLCBjb25zdCB1bnNpZ25lZCBpbnQgKl9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBpbnQpX19idWlsdGluX2FsdGl2ZWNfbHZ4bChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGludCBfX0FUVFJTX29fYWkKK3ZlY19sZGwoaW50IF9fYSwgY29uc3QgdmVjdG9yIGJvb2wgaW50ICpfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBpbnQpX19idWlsdGluX2FsdGl2ZWNfbHZ4bChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBmbG9hdCBfX0FUVFJTX29fYWkgdmVjX2xkbChpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3RvciBmbG9hdCAqX19iKSB7CisgIHJldHVybiAodmVjdG9yIGZsb2F0KV9fYnVpbHRpbl9hbHRpdmVjX2x2eGwoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZmxvYXQgX19BVFRSU19vX2FpIHZlY19sZGwoaW50IF9fYSwgY29uc3QgZmxvYXQgKl9fYikgeworICByZXR1cm4gKHZlY3RvciBmbG9hdClfX2J1aWx0aW5fYWx0aXZlY19sdnhsKF9fYSwgX19iKTsKK30KKworLyogdmVjX2x2eGwgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX2x2eGwoaW50IF9fYSwgY29uc3QgdmVjdG9yIHNpZ25lZCBjaGFyICpfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGNoYXIpX19idWlsdGluX2FsdGl2ZWNfbHZ4bChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19sdnhsKGludCBfX2EsIGNvbnN0IHNpZ25lZCBjaGFyICpfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGNoYXIpX19idWlsdGluX2FsdGl2ZWNfbHZ4bChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX2x2eGwoaW50IF9fYSwgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgKl9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX2x2eGwoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19sdnhsKGludCBfX2EsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKl9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX2x2eGwoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBjaGFyIF9fQVRUUlNfb19haQordmVjX2x2eGwoaW50IF9fYSwgY29uc3QgdmVjdG9yIGJvb2wgY2hhciAqX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgY2hhcilfX2J1aWx0aW5fYWx0aXZlY19sdnhsKF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNob3J0IF9fQVRUUlNfb19haSB2ZWNfbHZ4bChpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3Igc2hvcnQgKl9fYikgeworICByZXR1cm4gKHZlY3RvciBzaG9ydClfX2J1aWx0aW5fYWx0aXZlY19sdnhsKF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNob3J0IF9fQVRUUlNfb19haSB2ZWNfbHZ4bChpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaG9ydCAqX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNob3J0KV9fYnVpbHRpbl9hbHRpdmVjX2x2eGwoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfbHZ4bChpbnQgX19hLCBjb25zdCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgKl9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2J1aWx0aW5fYWx0aXZlY19sdnhsKF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX2x2eGwoaW50IF9fYSwgY29uc3QgdW5zaWduZWQgc2hvcnQgKl9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2J1aWx0aW5fYWx0aXZlY19sdnhsKF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfbHZ4bChpbnQgX19hLCBjb25zdCB2ZWN0b3IgYm9vbCBzaG9ydCAqX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgc2hvcnQpX19idWlsdGluX2FsdGl2ZWNfbHZ4bChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBwaXhlbCBfX0FUVFJTX29fYWkgdmVjX2x2eGwoaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yIHBpeGVsICpfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgcGl4ZWwpX19idWlsdGluX2FsdGl2ZWNfbHZ4bChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY19sdnhsKGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3IgaW50ICpfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgaW50KV9fYnVpbHRpbl9hbHRpdmVjX2x2eGwoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfbHZ4bChpbnQgX19hLCBjb25zdCBpbnQgKl9fYikgeworICByZXR1cm4gKHZlY3RvciBpbnQpX19idWlsdGluX2FsdGl2ZWNfbHZ4bChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfbHZ4bChpbnQgX19hLCBjb25zdCB2ZWN0b3IgdW5zaWduZWQgaW50ICpfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYnVpbHRpbl9hbHRpdmVjX2x2eGwoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX2x2eGwoaW50IF9fYSwgY29uc3QgdW5zaWduZWQgaW50ICpfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYnVpbHRpbl9hbHRpdmVjX2x2eGwoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBpbnQgX19BVFRSU19vX2FpCit2ZWNfbHZ4bChpbnQgX19hLCBjb25zdCB2ZWN0b3IgYm9vbCBpbnQgKl9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIGludClfX2J1aWx0aW5fYWx0aXZlY19sdnhsKF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGZsb2F0IF9fQVRUUlNfb19haSB2ZWNfbHZ4bChpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3IgZmxvYXQgKl9fYikgeworICByZXR1cm4gKHZlY3RvciBmbG9hdClfX2J1aWx0aW5fYWx0aXZlY19sdnhsKF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGZsb2F0IF9fQVRUUlNfb19haSB2ZWNfbHZ4bChpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqX19iKSB7CisgIHJldHVybiAodmVjdG9yIGZsb2F0KV9fYnVpbHRpbl9hbHRpdmVjX2x2eGwoX19hLCBfX2IpOworfQorCisvKiB2ZWNfbG9nZSAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZmxvYXQgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKQordmVjX2xvZ2UodmVjdG9yIGZsb2F0IF9fYSkgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmxvZ2VmcChfX2EpOworfQorCisvKiB2ZWNfdmxvZ2VmcCAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZmxvYXQgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKQordmVjX3Zsb2dlZnAodmVjdG9yIGZsb2F0IF9fYSkgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmxvZ2VmcChfX2EpOworfQorCisvKiB2ZWNfbHZzbCAqLworCisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQorICAgIF9fYXR0cmlidXRlX18oKF9fZGVwcmVjYXRlZF9fKCJ1c2UgYXNzaWdubWVudCBmb3IgdW5hbGlnbmVkIGxpdHRsZSBlbmRpYW4gXAorbG9hZHMvc3RvcmVzIikpKSB2ZWNfbHZzbChpbnQgX19hLCBjb25zdCBzaWduZWQgY2hhciAqX19iKSB7CisgIHZlY3RvciB1bnNpZ25lZCBjaGFyIG1hc2sgPQorICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX2x2c2woX19hLCBfX2IpOworICB2ZWN0b3IgdW5zaWduZWQgY2hhciByZXZlcnNlID0gezE1LCAxNCwgMTMsIDEyLCAxMSwgMTAsIDksIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNywgIDYsICA1LCAgNCwgIDMsICAyLCAgMSwgMH07CisgIHJldHVybiB2ZWNfcGVybShtYXNrLCBtYXNrLCByZXZlcnNlKTsKK30KKyNlbHNlCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19sdnNsKGludCBfX2EsIGNvbnN0IHNpZ25lZCBjaGFyICpfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2J1aWx0aW5fYWx0aXZlY19sdnNsKF9fYSwgX19iKTsKK30KKyNlbmRpZgorCisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQorICAgIF9fYXR0cmlidXRlX18oKF9fZGVwcmVjYXRlZF9fKCJ1c2UgYXNzaWdubWVudCBmb3IgdW5hbGlnbmVkIGxpdHRsZSBlbmRpYW4gXAorbG9hZHMvc3RvcmVzIikpKSB2ZWNfbHZzbChpbnQgX19hLCBjb25zdCB1bnNpZ25lZCBjaGFyICpfX2IpIHsKKyAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgbWFzayA9CisgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19idWlsdGluX2FsdGl2ZWNfbHZzbChfX2EsIF9fYik7CisgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHJldmVyc2UgPSB7MTUsIDE0LCAxMywgMTIsIDExLCAxMCwgOSwgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3LCAgNiwgIDUsICA0LCAgMywgIDIsICAxLCAwfTsKKyAgcmV0dXJuIHZlY19wZXJtKG1hc2ssIG1hc2ssIHJldmVyc2UpOworfQorI2Vsc2UKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX2x2c2woaW50IF9fYSwgY29uc3QgdW5zaWduZWQgY2hhciAqX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19idWlsdGluX2FsdGl2ZWNfbHZzbChfX2EsIF9fYik7Cit9CisjZW5kaWYKKworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKKyAgICBfX2F0dHJpYnV0ZV9fKChfX2RlcHJlY2F0ZWRfXygidXNlIGFzc2lnbm1lbnQgZm9yIHVuYWxpZ25lZCBsaXR0bGUgZW5kaWFuIFwKK2xvYWRzL3N0b3JlcyIpKSkgdmVjX2x2c2woaW50IF9fYSwgY29uc3Qgc2hvcnQgKl9fYikgeworICB2ZWN0b3IgdW5zaWduZWQgY2hhciBtYXNrID0KKyAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2J1aWx0aW5fYWx0aXZlY19sdnNsKF9fYSwgX19iKTsKKyAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgcmV2ZXJzZSA9IHsxNSwgMTQsIDEzLCAxMiwgMTEsIDEwLCA5LCA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsICA2LCAgNSwgIDQsICAzLCAgMiwgIDEsIDB9OworICByZXR1cm4gdmVjX3Blcm0obWFzaywgbWFzaywgcmV2ZXJzZSk7Cit9CisjZWxzZQorc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpIHZlY19sdnNsKGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hvcnQgKl9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX2x2c2woX19hLCBfX2IpOworfQorI2VuZGlmCisKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCisgICAgX19hdHRyaWJ1dGVfXygoX19kZXByZWNhdGVkX18oInVzZSBhc3NpZ25tZW50IGZvciB1bmFsaWduZWQgbGl0dGxlIGVuZGlhbiBcCitsb2Fkcy9zdG9yZXMiKSkpIHZlY19sdnNsKGludCBfX2EsIGNvbnN0IHVuc2lnbmVkIHNob3J0ICpfX2IpIHsKKyAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgbWFzayA9CisgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19idWlsdGluX2FsdGl2ZWNfbHZzbChfX2EsIF9fYik7CisgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHJldmVyc2UgPSB7MTUsIDE0LCAxMywgMTIsIDExLCAxMCwgOSwgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3LCAgNiwgIDUsICA0LCAgMywgIDIsICAxLCAwfTsKKyAgcmV0dXJuIHZlY19wZXJtKG1hc2ssIG1hc2ssIHJldmVyc2UpOworfQorI2Vsc2UKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX2x2c2woaW50IF9fYSwgY29uc3QgdW5zaWduZWQgc2hvcnQgKl9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX2x2c2woX19hLCBfX2IpOworfQorI2VuZGlmCisKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCisgICAgX19hdHRyaWJ1dGVfXygoX19kZXByZWNhdGVkX18oInVzZSBhc3NpZ25tZW50IGZvciB1bmFsaWduZWQgbGl0dGxlIGVuZGlhbiBcCitsb2Fkcy9zdG9yZXMiKSkpIHZlY19sdnNsKGludCBfX2EsIGNvbnN0IGludCAqX19iKSB7CisgIHZlY3RvciB1bnNpZ25lZCBjaGFyIG1hc2sgPQorICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX2x2c2woX19hLCBfX2IpOworICB2ZWN0b3IgdW5zaWduZWQgY2hhciByZXZlcnNlID0gezE1LCAxNCwgMTMsIDEyLCAxMSwgMTAsIDksIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNywgIDYsICA1LCAgNCwgIDMsICAyLCAgMSwgMH07CisgIHJldHVybiB2ZWNfcGVybShtYXNrLCBtYXNrLCByZXZlcnNlKTsKK30KKyNlbHNlCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkgdmVjX2x2c2woaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgKl9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX2x2c2woX19hLCBfX2IpOworfQorI2VuZGlmCisKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCisgICAgX19hdHRyaWJ1dGVfXygoX19kZXByZWNhdGVkX18oInVzZSBhc3NpZ25tZW50IGZvciB1bmFsaWduZWQgbGl0dGxlIGVuZGlhbiBcCitsb2Fkcy9zdG9yZXMiKSkpIHZlY19sdnNsKGludCBfX2EsIGNvbnN0IHVuc2lnbmVkIGludCAqX19iKSB7CisgIHZlY3RvciB1bnNpZ25lZCBjaGFyIG1hc2sgPQorICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX2x2c2woX19hLCBfX2IpOworICB2ZWN0b3IgdW5zaWduZWQgY2hhciByZXZlcnNlID0gezE1LCAxNCwgMTMsIDEyLCAxMSwgMTAsIDksIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNywgIDYsICA1LCAgNCwgIDMsICAyLCAgMSwgMH07CisgIHJldHVybiB2ZWNfcGVybShtYXNrLCBtYXNrLCByZXZlcnNlKTsKK30KKyNlbHNlCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19sdnNsKGludCBfX2EsIGNvbnN0IHVuc2lnbmVkIGludCAqX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19idWlsdGluX2FsdGl2ZWNfbHZzbChfX2EsIF9fYik7Cit9CisjZW5kaWYKKworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKKyAgICBfX2F0dHJpYnV0ZV9fKChfX2RlcHJlY2F0ZWRfXygidXNlIGFzc2lnbm1lbnQgZm9yIHVuYWxpZ25lZCBsaXR0bGUgZW5kaWFuIFwKK2xvYWRzL3N0b3JlcyIpKSkgdmVjX2x2c2woaW50IF9fYSwgY29uc3QgZmxvYXQgKl9fYikgeworICB2ZWN0b3IgdW5zaWduZWQgY2hhciBtYXNrID0KKyAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2J1aWx0aW5fYWx0aXZlY19sdnNsKF9fYSwgX19iKTsKKyAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgcmV2ZXJzZSA9IHsxNSwgMTQsIDEzLCAxMiwgMTEsIDEwLCA5LCA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsICA2LCAgNSwgIDQsICAzLCAgMiwgIDEsIDB9OworICByZXR1cm4gdmVjX3Blcm0obWFzaywgbWFzaywgcmV2ZXJzZSk7Cit9CisjZWxzZQorc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpIHZlY19sdnNsKGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKl9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX2x2c2woX19hLCBfX2IpOworfQorI2VuZGlmCisKKy8qIHZlY19sdnNyICovCisKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCisgICAgX19hdHRyaWJ1dGVfXygoX19kZXByZWNhdGVkX18oInVzZSBhc3NpZ25tZW50IGZvciB1bmFsaWduZWQgbGl0dGxlIGVuZGlhbiBcCitsb2Fkcy9zdG9yZXMiKSkpIHZlY19sdnNyKGludCBfX2EsIGNvbnN0IHNpZ25lZCBjaGFyICpfX2IpIHsKKyAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgbWFzayA9CisgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19idWlsdGluX2FsdGl2ZWNfbHZzcihfX2EsIF9fYik7CisgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHJldmVyc2UgPSB7MTUsIDE0LCAxMywgMTIsIDExLCAxMCwgOSwgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3LCAgNiwgIDUsICA0LCAgMywgIDIsICAxLCAwfTsKKyAgcmV0dXJuIHZlY19wZXJtKG1hc2ssIG1hc2ssIHJldmVyc2UpOworfQorI2Vsc2UKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX2x2c3IoaW50IF9fYSwgY29uc3Qgc2lnbmVkIGNoYXIgKl9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX2x2c3IoX19hLCBfX2IpOworfQorI2VuZGlmCisKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCisgICAgX19hdHRyaWJ1dGVfXygoX19kZXByZWNhdGVkX18oInVzZSBhc3NpZ25tZW50IGZvciB1bmFsaWduZWQgbGl0dGxlIGVuZGlhbiBcCitsb2Fkcy9zdG9yZXMiKSkpIHZlY19sdnNyKGludCBfX2EsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKl9fYikgeworICB2ZWN0b3IgdW5zaWduZWQgY2hhciBtYXNrID0KKyAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2J1aWx0aW5fYWx0aXZlY19sdnNyKF9fYSwgX19iKTsKKyAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgcmV2ZXJzZSA9IHsxNSwgMTQsIDEzLCAxMiwgMTEsIDEwLCA5LCA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsICA2LCAgNSwgIDQsICAzLCAgMiwgIDEsIDB9OworICByZXR1cm4gdmVjX3Blcm0obWFzaywgbWFzaywgcmV2ZXJzZSk7Cit9CisjZWxzZQorc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfbHZzcihpbnQgX19hLCBjb25zdCB1bnNpZ25lZCBjaGFyICpfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2J1aWx0aW5fYWx0aXZlY19sdnNyKF9fYSwgX19iKTsKK30KKyNlbmRpZgorCisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQorICAgIF9fYXR0cmlidXRlX18oKF9fZGVwcmVjYXRlZF9fKCJ1c2UgYXNzaWdubWVudCBmb3IgdW5hbGlnbmVkIGxpdHRsZSBlbmRpYW4gXAorbG9hZHMvc3RvcmVzIikpKSB2ZWNfbHZzcihpbnQgX19hLCBjb25zdCBzaG9ydCAqX19iKSB7CisgIHZlY3RvciB1bnNpZ25lZCBjaGFyIG1hc2sgPQorICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX2x2c3IoX19hLCBfX2IpOworICB2ZWN0b3IgdW5zaWduZWQgY2hhciByZXZlcnNlID0gezE1LCAxNCwgMTMsIDEyLCAxMSwgMTAsIDksIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNywgIDYsICA1LCAgNCwgIDMsICAyLCAgMSwgMH07CisgIHJldHVybiB2ZWNfcGVybShtYXNrLCBtYXNrLCByZXZlcnNlKTsKK30KKyNlbHNlCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkgdmVjX2x2c3IoaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaG9ydCAqX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19idWlsdGluX2FsdGl2ZWNfbHZzcihfX2EsIF9fYik7Cit9CisjZW5kaWYKKworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKKyAgICBfX2F0dHJpYnV0ZV9fKChfX2RlcHJlY2F0ZWRfXygidXNlIGFzc2lnbm1lbnQgZm9yIHVuYWxpZ25lZCBsaXR0bGUgZW5kaWFuIFwKK2xvYWRzL3N0b3JlcyIpKSkgdmVjX2x2c3IoaW50IF9fYSwgY29uc3QgdW5zaWduZWQgc2hvcnQgKl9fYikgeworICB2ZWN0b3IgdW5zaWduZWQgY2hhciBtYXNrID0KKyAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2J1aWx0aW5fYWx0aXZlY19sdnNyKF9fYSwgX19iKTsKKyAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgcmV2ZXJzZSA9IHsxNSwgMTQsIDEzLCAxMiwgMTEsIDEwLCA5LCA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsICA2LCAgNSwgIDQsICAzLCAgMiwgIDEsIDB9OworICByZXR1cm4gdmVjX3Blcm0obWFzaywgbWFzaywgcmV2ZXJzZSk7Cit9CisjZWxzZQorc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfbHZzcihpbnQgX19hLCBjb25zdCB1bnNpZ25lZCBzaG9ydCAqX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19idWlsdGluX2FsdGl2ZWNfbHZzcihfX2EsIF9fYik7Cit9CisjZW5kaWYKKworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKKyAgICBfX2F0dHJpYnV0ZV9fKChfX2RlcHJlY2F0ZWRfXygidXNlIGFzc2lnbm1lbnQgZm9yIHVuYWxpZ25lZCBsaXR0bGUgZW5kaWFuIFwKK2xvYWRzL3N0b3JlcyIpKSkgdmVjX2x2c3IoaW50IF9fYSwgY29uc3QgaW50ICpfX2IpIHsKKyAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgbWFzayA9CisgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19idWlsdGluX2FsdGl2ZWNfbHZzcihfX2EsIF9fYik7CisgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHJldmVyc2UgPSB7MTUsIDE0LCAxMywgMTIsIDExLCAxMCwgOSwgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3LCAgNiwgIDUsICA0LCAgMywgIDIsICAxLCAwfTsKKyAgcmV0dXJuIHZlY19wZXJtKG1hc2ssIG1hc2ssIHJldmVyc2UpOworfQorI2Vsc2UKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haSB2ZWNfbHZzcihpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAqX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19idWlsdGluX2FsdGl2ZWNfbHZzcihfX2EsIF9fYik7Cit9CisjZW5kaWYKKworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKKyAgICBfX2F0dHJpYnV0ZV9fKChfX2RlcHJlY2F0ZWRfXygidXNlIGFzc2lnbm1lbnQgZm9yIHVuYWxpZ25lZCBsaXR0bGUgZW5kaWFuIFwKK2xvYWRzL3N0b3JlcyIpKSkgdmVjX2x2c3IoaW50IF9fYSwgY29uc3QgdW5zaWduZWQgaW50ICpfX2IpIHsKKyAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgbWFzayA9CisgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19idWlsdGluX2FsdGl2ZWNfbHZzcihfX2EsIF9fYik7CisgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHJldmVyc2UgPSB7MTUsIDE0LCAxMywgMTIsIDExLCAxMCwgOSwgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3LCAgNiwgIDUsICA0LCAgMywgIDIsICAxLCAwfTsKKyAgcmV0dXJuIHZlY19wZXJtKG1hc2ssIG1hc2ssIHJldmVyc2UpOworfQorI2Vsc2UKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX2x2c3IoaW50IF9fYSwgY29uc3QgdW5zaWduZWQgaW50ICpfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2J1aWx0aW5fYWx0aXZlY19sdnNyKF9fYSwgX19iKTsKK30KKyNlbmRpZgorCisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQorICAgIF9fYXR0cmlidXRlX18oKF9fZGVwcmVjYXRlZF9fKCJ1c2UgYXNzaWdubWVudCBmb3IgdW5hbGlnbmVkIGxpdHRsZSBlbmRpYW4gXAorbG9hZHMvc3RvcmVzIikpKSB2ZWNfbHZzcihpbnQgX19hLCBjb25zdCBmbG9hdCAqX19iKSB7CisgIHZlY3RvciB1bnNpZ25lZCBjaGFyIG1hc2sgPQorICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX2x2c3IoX19hLCBfX2IpOworICB2ZWN0b3IgdW5zaWduZWQgY2hhciByZXZlcnNlID0gezE1LCAxNCwgMTMsIDEyLCAxMSwgMTAsIDksIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNywgIDYsICA1LCAgNCwgIDMsICAyLCAgMSwgMH07CisgIHJldHVybiB2ZWNfcGVybShtYXNrLCBtYXNrLCByZXZlcnNlKTsKK30KKyNlbHNlCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkgdmVjX2x2c3IoaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19idWlsdGluX2FsdGl2ZWNfbHZzcihfX2EsIF9fYik7Cit9CisjZW5kaWYKKworLyogdmVjX21hZGQgKi8KK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfbWxhZGQodmVjdG9yIHNpZ25lZCBzaG9ydCwgdmVjdG9yIHNpZ25lZCBzaG9ydCwgdmVjdG9yIHNpZ25lZCBzaG9ydCk7CitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX21sYWRkKHZlY3RvciBzaWduZWQgc2hvcnQsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCwgdmVjdG9yIHVuc2lnbmVkIHNob3J0KTsKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfbWxhZGQodmVjdG9yIHVuc2lnbmVkIHNob3J0LCB2ZWN0b3Igc2lnbmVkIHNob3J0LCB2ZWN0b3Igc2lnbmVkIHNob3J0KTsKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19tbGFkZCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCwgdmVjdG9yIHVuc2lnbmVkIHNob3J0KTsKKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkgdmVjX21hZGQoCisgICAgdmVjdG9yIHNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBzaWduZWQgc2hvcnQgX19iLCB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYykgeworICByZXR1cm4gdmVjX21sYWRkKF9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX21hZGQodmVjdG9yIHNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IsCisgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19jKSB7CisgIHJldHVybiB2ZWNfbWxhZGQoX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfbWFkZCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYiwKKyAgICAgICAgIHZlY3RvciBzaWduZWQgc2hvcnQgX19jKSB7CisgIHJldHVybiB2ZWNfbWxhZGQoX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19tYWRkKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IsCisgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19jKSB7CisgIHJldHVybiB2ZWNfbWxhZGQoX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBmbG9hdCBfX0FUVFJTX29fYWkgdmVjX21hZGQodmVjdG9yIGZsb2F0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGZsb2F0IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGZsb2F0IF9fYykgeworI2lmZGVmIF9fVlNYX18KKyAgcmV0dXJuIF9fYnVpbHRpbl92c3hfeHZtYWRkYXNwKF9fYSwgX19iLCBfX2MpOworI2Vsc2UKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZtYWRkZnAoX19hLCBfX2IsIF9fYyk7CisjZW5kaWYKK30KKworI2lmZGVmIF9fVlNYX18KK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBkb3VibGUgX19BVFRSU19vX2FpIHZlY19tYWRkKHZlY3RvciBkb3VibGUgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGRvdWJsZSBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgZG91YmxlIF9fYykgeworICByZXR1cm4gX19idWlsdGluX3ZzeF94dm1hZGRhZHAoX19hLCBfX2IsIF9fYyk7Cit9CisjZW5kaWYKKworLyogdmVjX3ZtYWRkZnAgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGZsb2F0IF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKK3ZlY192bWFkZGZwKHZlY3RvciBmbG9hdCBfX2EsIHZlY3RvciBmbG9hdCBfX2IsIHZlY3RvciBmbG9hdCBfX2MpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZtYWRkZnAoX19hLCBfX2IsIF9fYyk7Cit9CisKKy8qIHZlY19tYWRkcyAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKK3ZlY19tYWRkcyh2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHNpZ25lZCBzaG9ydCBfX2IsCisgICAgICAgICAgdmVjdG9yIHNpZ25lZCBzaG9ydCBfX2MpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZtaGFkZHNocyhfX2EsIF9fYiwgX19jKTsKK30KKworLyogdmVjX3ZtaGFkZHNocyAqLworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBzaG9ydCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpCit2ZWNfdm1oYWRkc2hzKHZlY3RvciBzaWduZWQgc2hvcnQgX19hLCB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYiwKKyAgICAgICAgICAgICAgdmVjdG9yIHNpZ25lZCBzaG9ydCBfX2MpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZtaGFkZHNocyhfX2EsIF9fYiwgX19jKTsKK30KKworLyogdmVjX21zdWIgKi8KKworI2lmZGVmIF9fVlNYX18KK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBmbG9hdCBfX0FUVFJTX29fYWkgdmVjX21zdWIodmVjdG9yIGZsb2F0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGZsb2F0IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGZsb2F0IF9fYykgeworICByZXR1cm4gX19idWlsdGluX3ZzeF94dm1zdWJhc3AoX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBkb3VibGUgX19BVFRSU19vX2FpIHZlY19tc3ViKHZlY3RvciBkb3VibGUgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGRvdWJsZSBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgZG91YmxlIF9fYykgeworICByZXR1cm4gX19idWlsdGluX3ZzeF94dm1zdWJhZHAoX19hLCBfX2IsIF9fYyk7Cit9CisjZW5kaWYKKworLyogdmVjX21heCAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfbWF4KHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZtYXhzYihfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19tYXgodmVjdG9yIGJvb2wgY2hhciBfX2EsIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZtYXhzYigodmVjdG9yIHNpZ25lZCBjaGFyKV9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX21heCh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdm1heHNiKF9fYSwgKHZlY3RvciBzaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19tYXgodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZtYXh1YihfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX21heCh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bWF4dWIoKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfbWF4KHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZtYXh1YihfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY19tYXgodmVjdG9yIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bWF4c2goX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY19tYXgodmVjdG9yIGJvb2wgc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZtYXhzaCgodmVjdG9yIHNob3J0KV9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNob3J0IF9fQVRUUlNfb19haSB2ZWNfbWF4KHZlY3RvciBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bWF4c2goX19hLCAodmVjdG9yIHNob3J0KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19tYXgodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdm1heHVoKF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX21heCh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZtYXh1aCgodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX21heCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZtYXh1aChfX2EsICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX0FUVFJTX29fYWkgdmVjX21heCh2ZWN0b3IgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZtYXhzdyhfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY19tYXgodmVjdG9yIGJvb2wgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZtYXhzdygodmVjdG9yIGludClfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY19tYXgodmVjdG9yIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZtYXhzdyhfX2EsICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfbWF4KHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdm1heHV3KF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY19tYXgodmVjdG9yIGJvb2wgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZtYXh1dygodmVjdG9yIHVuc2lnbmVkIGludClfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfbWF4KHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bWF4dXcoX19hLCAodmVjdG9yIHVuc2lnbmVkIGludClfX2IpOworfQorCisjaWZkZWYgX19QT1dFUjhfVkVDVE9SX18KK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX21heCh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdm1heHNkKF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfbWF4KHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdm1heHNkKCh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZylfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX21heCh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZtYXhzZChfX2EsICh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZylfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX21heCh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZtYXh1ZChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfbWF4KHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bWF4dWQoKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX21heCh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdm1heHVkKF9fYSwgKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19iKTsKK30KKyNlbmRpZgorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZmxvYXQgX19BVFRSU19vX2FpIHZlY19tYXgodmVjdG9yIGZsb2F0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgZmxvYXQgX19iKSB7CisjaWZkZWYgX19WU1hfXworICByZXR1cm4gX19idWlsdGluX3ZzeF94dm1heHNwKF9fYSwgX19iKTsKKyNlbHNlCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bWF4ZnAoX19hLCBfX2IpOworI2VuZGlmCit9CisKKyNpZmRlZiBfX1ZTWF9fCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZG91YmxlIF9fQVRUUlNfb19haSB2ZWNfbWF4KHZlY3RvciBkb3VibGUgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgZG91YmxlIF9fYikgeworICByZXR1cm4gX19idWlsdGluX3ZzeF94dm1heGRwKF9fYSwgX19iKTsKK30KKyNlbmRpZgorCisvKiB2ZWNfdm1heHNiICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY192bWF4c2IodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdm1heHNiKF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3ZtYXhzYih2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdm1heHNiKCh2ZWN0b3Igc2lnbmVkIGNoYXIpX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfdm1heHNiKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bWF4c2IoX19hLCAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYik7Cit9CisKKy8qIHZlY192bWF4dWIgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfdm1heHViKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bWF4dWIoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY192bWF4dWIodmVjdG9yIGJvb2wgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdm1heHViKCh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3ZtYXh1Yih2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bWF4dWIoX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworLyogdmVjX3ZtYXhzaCAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY192bWF4c2godmVjdG9yIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bWF4c2goX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY192bWF4c2godmVjdG9yIGJvb2wgc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZtYXhzaCgodmVjdG9yIHNob3J0KV9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNob3J0IF9fQVRUUlNfb19haSB2ZWNfdm1heHNoKHZlY3RvciBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bWF4c2goX19hLCAodmVjdG9yIHNob3J0KV9fYik7Cit9CisKKy8qIHZlY192bWF4dWggKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX3ZtYXh1aCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bWF4dWgoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfdm1heHVoKHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdm1heHVoKCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfdm1heHVoKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdm1heHVoKF9fYSwgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2IpOworfQorCisvKiB2ZWNfdm1heHN3ICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY192bWF4c3codmVjdG9yIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bWF4c3coX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfdm1heHN3KHZlY3RvciBib29sIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bWF4c3coKHZlY3RvciBpbnQpX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfdm1heHN3KHZlY3RvciBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bWF4c3coX19hLCAodmVjdG9yIGludClfX2IpOworfQorCisvKiB2ZWNfdm1heHV3ICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfdm1heHV3KHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdm1heHV3KF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY192bWF4dXcodmVjdG9yIGJvb2wgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZtYXh1dygodmVjdG9yIHVuc2lnbmVkIGludClfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfdm1heHV3KHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bWF4dXcoX19hLCAodmVjdG9yIHVuc2lnbmVkIGludClfX2IpOworfQorCisvKiB2ZWNfdm1heGZwICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBmbG9hdCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpCit2ZWNfdm1heGZwKHZlY3RvciBmbG9hdCBfX2EsIHZlY3RvciBmbG9hdCBfX2IpIHsKKyNpZmRlZiBfX1ZTWF9fCisgIHJldHVybiBfX2J1aWx0aW5fdnN4X3h2bWF4c3AoX19hLCBfX2IpOworI2Vsc2UKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZtYXhmcChfX2EsIF9fYik7CisjZW5kaWYKK30KKworLyogdmVjX21lcmdlaCAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfbWVyZ2VoKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKF9fYSwgX19iLAorICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgweDAwLCAweDEwLCAweDAxLCAweDExLCAweDAyLCAweDEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAzLCAweDEzLCAweDA0LCAweDE0LCAweDA1LCAweDE1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2LCAweDE2LCAweDA3LCAweDE3KSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX21lcmdlaCh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gdmVjX3Blcm0oX19hLCBfX2IsCisgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDB4MDAsIDB4MTAsIDB4MDEsIDB4MTEsIDB4MDIsIDB4MTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDMsIDB4MTMsIDB4MDQsIDB4MTQsIDB4MDUsIDB4MTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYsIDB4MTYsIDB4MDcsIDB4MTcpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19tZXJnZWgodmVjdG9yIGJvb2wgY2hhciBfX2EsIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIHJldHVybiB2ZWNfcGVybShfX2EsIF9fYiwKKyAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMHgwMCwgMHgxMCwgMHgwMSwgMHgxMSwgMHgwMiwgMHgxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMywgMHgxMywgMHgwNCwgMHgxNCwgMHgwNSwgMHgxNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNiwgMHgxNiwgMHgwNywgMHgxNykpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY19tZXJnZWgodmVjdG9yIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2hvcnQgX19iKSB7CisgIHJldHVybiB2ZWNfcGVybShfX2EsIF9fYiwKKyAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMHgwMCwgMHgwMSwgMHgxMCwgMHgxMSwgMHgwMiwgMHgwMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMiwgMHgxMywgMHgwNCwgMHgwNSwgMHgxNCwgMHgxNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNiwgMHgwNywgMHgxNiwgMHgxNykpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfbWVyZ2VoKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKF9fYSwgX19iLAorICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgweDAwLCAweDAxLCAweDEwLCAweDExLCAweDAyLCAweDAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEyLCAweDEzLCAweDA0LCAweDA1LCAweDE0LCAweDE1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2LCAweDA3LCAweDE2LCAweDE3KSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIHNob3J0IF9fQVRUUlNfb19haQordmVjX21lcmdlaCh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICByZXR1cm4gdmVjX3Blcm0oX19hLCBfX2IsCisgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDB4MDAsIDB4MDEsIDB4MTAsIDB4MTEsIDB4MDIsIDB4MDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTIsIDB4MTMsIDB4MDQsIDB4MDUsIDB4MTQsIDB4MTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYsIDB4MDcsIDB4MTYsIDB4MTcpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHBpeGVsIF9fQVRUUlNfb19haSB2ZWNfbWVyZ2VoKHZlY3RvciBwaXhlbCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHBpeGVsIF9fYikgeworICByZXR1cm4gdmVjX3Blcm0oX19hLCBfX2IsCisgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDB4MDAsIDB4MDEsIDB4MTAsIDB4MTEsIDB4MDIsIDB4MDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTIsIDB4MTMsIDB4MDQsIDB4MDUsIDB4MTQsIDB4MTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYsIDB4MDcsIDB4MTYsIDB4MTcpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX0FUVFJTX29fYWkgdmVjX21lcmdlaCh2ZWN0b3IgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGludCBfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKF9fYSwgX19iLAorICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDEwLCAweDExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEyLCAweDEzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0LCAweDE1LCAweDE2LCAweDE3KSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfbWVyZ2VoKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gdmVjX3Blcm0oX19hLCBfX2IsCisgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MTAsIDB4MTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTIsIDB4MTMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgaW50IF9fQVRUUlNfb19haSB2ZWNfbWVyZ2VoKHZlY3RvciBib29sIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICByZXR1cm4gdmVjX3Blcm0oX19hLCBfX2IsCisgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MTAsIDB4MTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTIsIDB4MTMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGZsb2F0IF9fQVRUUlNfb19haSB2ZWNfbWVyZ2VoKHZlY3RvciBmbG9hdCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGZsb2F0IF9fYikgeworICByZXR1cm4gdmVjX3Blcm0oX19hLCBfX2IsCisgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MTAsIDB4MTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTIsIDB4MTMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcpKTsKK30KKworI2lmZGVmIF9fVlNYX18KK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX21lcmdlaCh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gdmVjX3Blcm0oX19hLCBfX2IsCisgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYsIDB4MDcsIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfbWVyZ2VoKHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gdmVjX3Blcm0oX19hLCAodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpX19iLAorICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2LCAweDA3LCAweDEwLCAweDExLCAweDEyLCAweDEzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0LCAweDE1LCAweDE2LCAweDE3KSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX21lcmdlaCh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLCB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKCh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZylfX2EsIF9fYiwKKyAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNiwgMHgwNywgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNykpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX21lcmdlaCh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKF9fYSwgX19iLAorICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2LCAweDA3LCAweDEwLCAweDExLCAweDEyLCAweDEzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0LCAweDE1LCAweDE2LCAweDE3KSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfbWVyZ2VoKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiB2ZWNfcGVybShfX2EsICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYiwKKyAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNiwgMHgwNywgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNykpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX21lcmdlaCh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gdmVjX3Blcm0oKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19hLCBfX2IsCisgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYsIDB4MDcsIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX21lcmdlaCh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiB2ZWNfcGVybShfX2EsIF9fYiwKKyAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNiwgMHgwNywgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNykpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZG91YmxlIF9fQVRUUlNfb19haSB2ZWNfbWVyZ2VoKHZlY3RvciBkb3VibGUgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgZG91YmxlIF9fYikgeworICByZXR1cm4gdmVjX3Blcm0oX19hLCBfX2IsCisgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYsIDB4MDcsIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcpKTsKK30KK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBkb3VibGUgX19BVFRSU19vX2FpCit2ZWNfbWVyZ2VoKHZlY3RvciBkb3VibGUgX19hLCB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiB2ZWNfcGVybShfX2EsICh2ZWN0b3IgZG91YmxlKV9fYiwKKyAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNiwgMHgwNywgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNykpOworfQorc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGRvdWJsZSBfX0FUVFJTX29fYWkKK3ZlY19tZXJnZWgodmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwgdmVjdG9yIGRvdWJsZSBfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKCh2ZWN0b3IgZG91YmxlKV9fYSwgX19iLAorICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2LCAweDA3LCAweDEwLCAweDExLCAweDEyLCAweDEzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0LCAweDE1LCAweDE2LCAweDE3KSk7Cit9CisjZW5kaWYKKworLyogdmVjX3ZtcmdoYiAqLworCisjZGVmaW5lIF9fYnVpbHRpbl9hbHRpdmVjX3ZtcmdoYiB2ZWNfdm1yZ2hiCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY192bXJnaGIodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gdmVjX3Blcm0oX19hLCBfX2IsCisgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDB4MDAsIDB4MTAsIDB4MDEsIDB4MTEsIDB4MDIsIDB4MTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDMsIDB4MTMsIDB4MDQsIDB4MTQsIDB4MDUsIDB4MTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYsIDB4MTYsIDB4MDcsIDB4MTcpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfdm1yZ2hiKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiB2ZWNfcGVybShfX2EsIF9fYiwKKyAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMHgwMCwgMHgxMCwgMHgwMSwgMHgxMSwgMHgwMiwgMHgxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMywgMHgxMywgMHgwNCwgMHgxNCwgMHgwNSwgMHgxNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNiwgMHgxNiwgMHgwNywgMHgxNykpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBjaGFyIF9fQVRUUlNfb19haQordmVjX3ZtcmdoYih2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKF9fYSwgX19iLAorICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgweDAwLCAweDEwLCAweDAxLCAweDExLCAweDAyLCAweDEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAzLCAweDEzLCAweDA0LCAweDE0LCAweDA1LCAweDE1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2LCAweDE2LCAweDA3LCAweDE3KSk7Cit9CisKKy8qIHZlY192bXJnaGggKi8KKworI2RlZmluZSBfX2J1aWx0aW5fYWx0aXZlY192bXJnaGggdmVjX3ZtcmdoaAorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY192bXJnaGgodmVjdG9yIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2hvcnQgX19iKSB7CisgIHJldHVybiB2ZWNfcGVybShfX2EsIF9fYiwKKyAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMHgwMCwgMHgwMSwgMHgxMCwgMHgxMSwgMHgwMiwgMHgwMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMiwgMHgxMywgMHgwNCwgMHgwNSwgMHgxNCwgMHgxNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNiwgMHgwNywgMHgxNiwgMHgxNykpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfdm1yZ2hoKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKF9fYSwgX19iLAorICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgweDAwLCAweDAxLCAweDEwLCAweDExLCAweDAyLCAweDAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEyLCAweDEzLCAweDA0LCAweDA1LCAweDE0LCAweDE1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2LCAweDA3LCAweDE2LCAweDE3KSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIHNob3J0IF9fQVRUUlNfb19haQordmVjX3ZtcmdoaCh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICByZXR1cm4gdmVjX3Blcm0oX19hLCBfX2IsCisgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDB4MDAsIDB4MDEsIDB4MTAsIDB4MTEsIDB4MDIsIDB4MDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTIsIDB4MTMsIDB4MDQsIDB4MDUsIDB4MTQsIDB4MTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYsIDB4MDcsIDB4MTYsIDB4MTcpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHBpeGVsIF9fQVRUUlNfb19haSB2ZWNfdm1yZ2hoKHZlY3RvciBwaXhlbCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHBpeGVsIF9fYikgeworICByZXR1cm4gdmVjX3Blcm0oX19hLCBfX2IsCisgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDB4MDAsIDB4MDEsIDB4MTAsIDB4MTEsIDB4MDIsIDB4MDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTIsIDB4MTMsIDB4MDQsIDB4MDUsIDB4MTQsIDB4MTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYsIDB4MDcsIDB4MTYsIDB4MTcpKTsKK30KKworLyogdmVjX3ZtcmdodyAqLworCisjZGVmaW5lIF9fYnVpbHRpbl9hbHRpdmVjX3ZtcmdodyB2ZWNfdm1yZ2h3CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY192bXJnaHcodmVjdG9yIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBpbnQgX19iKSB7CisgIHJldHVybiB2ZWNfcGVybShfX2EsIF9fYiwKKyAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgxMCwgMHgxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMiwgMHgxMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNykpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX3Ztcmdodyh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKF9fYSwgX19iLAorICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDEwLCAweDExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEyLCAweDEzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0LCAweDE1LCAweDE2LCAweDE3KSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGludCBfX0FUVFJTX29fYWkgdmVjX3Ztcmdodyh2ZWN0b3IgYm9vbCBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKF9fYSwgX19iLAorICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDEwLCAweDExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEyLCAweDEzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0LCAweDE1LCAweDE2LCAweDE3KSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBmbG9hdCBfX0FUVFJTX29fYWkgdmVjX3Ztcmdodyh2ZWN0b3IgZmxvYXQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBmbG9hdCBfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKF9fYSwgX19iLAorICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDEwLCAweDExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEyLCAweDEzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0LCAweDE1LCAweDE2LCAweDE3KSk7Cit9CisKKy8qIHZlY19tZXJnZWwgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX21lcmdlbCh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiB2ZWNfcGVybShfX2EsIF9fYiwKKyAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMHgwOCwgMHgxOCwgMHgwOSwgMHgxOSwgMHgwQSwgMHgxQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQiwgMHgxQiwgMHgwQywgMHgxQywgMHgwRCwgMHgxRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwRSwgMHgxRSwgMHgwRiwgMHgxRikpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19tZXJnZWwodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKF9fYSwgX19iLAorICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgweDA4LCAweDE4LCAweDA5LCAweDE5LCAweDBBLCAweDFBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBCLCAweDFCLCAweDBDLCAweDFDLCAweDBELCAweDFELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBFLCAweDFFLCAweDBGLCAweDFGKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfbWVyZ2VsKHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICByZXR1cm4gdmVjX3Blcm0oX19hLCBfX2IsCisgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDB4MDgsIDB4MTgsIDB4MDksIDB4MTksIDB4MEEsIDB4MUEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEIsIDB4MUIsIDB4MEMsIDB4MUMsIDB4MEQsIDB4MUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEUsIDB4MUUsIDB4MEYsIDB4MUYpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNob3J0IF9fQVRUUlNfb19haSB2ZWNfbWVyZ2VsKHZlY3RvciBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNob3J0IF9fYikgeworICByZXR1cm4gdmVjX3Blcm0oX19hLCBfX2IsCisgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDB4MDgsIDB4MDksIDB4MTgsIDB4MTksIDB4MEEsIDB4MEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUEsIDB4MUIsIDB4MEMsIDB4MEQsIDB4MUMsIDB4MUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEUsIDB4MEYsIDB4MUUsIDB4MUYpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX21lcmdlbCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiB2ZWNfcGVybShfX2EsIF9fYiwKKyAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMHgwOCwgMHgwOSwgMHgxOCwgMHgxOSwgMHgwQSwgMHgwQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxQSwgMHgxQiwgMHgwQywgMHgwRCwgMHgxQywgMHgxRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwRSwgMHgwRiwgMHgxRSwgMHgxRikpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19tZXJnZWwodmVjdG9yIGJvb2wgc2hvcnQgX19hLCB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKF9fYSwgX19iLAorICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgweDA4LCAweDA5LCAweDE4LCAweDE5LCAweDBBLCAweDBCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFBLCAweDFCLCAweDBDLCAweDBELCAweDFDLCAweDFELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBFLCAweDBGLCAweDFFLCAweDFGKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBwaXhlbCBfX0FUVFJTX29fYWkgdmVjX21lcmdlbCh2ZWN0b3IgcGl4ZWwgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBwaXhlbCBfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKF9fYSwgX19iLAorICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgweDA4LCAweDA5LCAweDE4LCAweDE5LCAweDBBLCAweDBCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFBLCAweDFCLCAweDBDLCAweDBELCAweDFDLCAweDFELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBFLCAweDBGLCAweDFFLCAweDFGKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY19tZXJnZWwodmVjdG9yIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBpbnQgX19iKSB7CisgIHJldHVybiB2ZWNfcGVybShfX2EsIF9fYiwKKyAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgxOCwgMHgxOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxQSwgMHgxQiwgMHgwQywgMHgwRCwgMHgwRSwgMHgwRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxQywgMHgxRCwgMHgxRSwgMHgxRikpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX21lcmdlbCh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKF9fYSwgX19iLAorICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDE4LCAweDE5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFBLCAweDFCLCAweDBDLCAweDBELCAweDBFLCAweDBGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFDLCAweDFELCAweDFFLCAweDFGKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGludCBfX0FUVFJTX29fYWkgdmVjX21lcmdlbCh2ZWN0b3IgYm9vbCBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKF9fYSwgX19iLAorICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDE4LCAweDE5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFBLCAweDFCLCAweDBDLCAweDBELCAweDBFLCAweDBGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFDLCAweDFELCAweDFFLCAweDFGKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBmbG9hdCBfX0FUVFJTX29fYWkgdmVjX21lcmdlbCh2ZWN0b3IgZmxvYXQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBmbG9hdCBfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKF9fYSwgX19iLAorICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDE4LCAweDE5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFBLCAweDFCLCAweDBDLCAweDBELCAweDBFLCAweDBGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFDLCAweDFELCAweDFFLCAweDFGKSk7Cit9CisKKyNpZmRlZiBfX1ZTWF9fCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY19tZXJnZWwodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKF9fYSwgX19iLAorICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBFLCAweDBGLCAweDE4LCAwWDE5LCAweDFBLCAweDFCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFDLCAweDFELCAweDFFLCAweDFGKSk7Cit9CitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY19tZXJnZWwodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiB2ZWNfcGVybShfX2EsICh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZylfX2IsCisgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDB4MDgsIDB4MDksIDB4MEEsIDB4MEIsIDB4MEMsIDB4MEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEUsIDB4MEYsIDB4MTgsIDBYMTksIDB4MUEsIDB4MUIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUMsIDB4MUQsIDB4MUUsIDB4MUYpKTsKK30KK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX21lcmdlbCh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLCB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKCh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZylfX2EsIF9fYiwKKyAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwQywgMHgwRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwRSwgMHgwRiwgMHgxOCwgMFgxOSwgMHgxQSwgMHgxQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxQywgMHgxRCwgMHgxRSwgMHgxRikpOworfQorc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY19tZXJnZWwodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiB2ZWNfcGVybShfX2EsIF9fYiwKKyAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwQywgMHgwRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwRSwgMHgwRiwgMHgxOCwgMFgxOSwgMHgxQSwgMHgxQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxQywgMHgxRCwgMHgxRSwgMHgxRikpOworfQorc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY19tZXJnZWwodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKF9fYSwgKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19iLAorICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBFLCAweDBGLCAweDE4LCAwWDE5LCAweDFBLCAweDFCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFDLCAweDFELCAweDFFLCAweDFGKSk7Cit9CitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX21lcmdlbCh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gdmVjX3Blcm0oKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19hLCBfX2IsCisgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDB4MDgsIDB4MDksIDB4MEEsIDB4MEIsIDB4MEMsIDB4MEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEUsIDB4MEYsIDB4MTgsIDBYMTksIDB4MUEsIDB4MUIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUMsIDB4MUQsIDB4MUUsIDB4MUYpKTsKK30KK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY19tZXJnZWwodmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gdmVjX3Blcm0oX19hLCBfX2IsCisgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDB4MDgsIDB4MDksIDB4MEEsIDB4MEIsIDB4MEMsIDB4MEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEUsIDB4MEYsIDB4MTgsIDBYMTksIDB4MUEsIDB4MUIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUMsIDB4MUQsIDB4MUUsIDB4MUYpKTsKK30KK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBkb3VibGUgX19BVFRSU19vX2FpIHZlY19tZXJnZWwodmVjdG9yIGRvdWJsZSBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBkb3VibGUgX19iKSB7CisgIHJldHVybiB2ZWNfcGVybShfX2EsIF9fYiwKKyAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwQywgMHgwRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwRSwgMHgwRiwgMHgxOCwgMFgxOSwgMHgxQSwgMHgxQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxQywgMHgxRCwgMHgxRSwgMHgxRikpOworfQorc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGRvdWJsZSBfX0FUVFJTX29fYWkKK3ZlY19tZXJnZWwodmVjdG9yIGRvdWJsZSBfX2EsIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKF9fYSwgKHZlY3RvciBkb3VibGUpX19iLAorICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBFLCAweDBGLCAweDE4LCAwWDE5LCAweDFBLCAweDFCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFDLCAweDFELCAweDFFLCAweDFGKSk7Cit9CitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZG91YmxlIF9fQVRUUlNfb19haQordmVjX21lcmdlbCh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgZG91YmxlIF9fYikgeworICByZXR1cm4gdmVjX3Blcm0oKHZlY3RvciBkb3VibGUpX19hLCBfX2IsCisgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDB4MDgsIDB4MDksIDB4MEEsIDB4MEIsIDB4MEMsIDB4MEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEUsIDB4MEYsIDB4MTgsIDBYMTksIDB4MUEsIDB4MUIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUMsIDB4MUQsIDB4MUUsIDB4MUYpKTsKK30KKyNlbmRpZgorCisvKiB2ZWNfdm1yZ2xiICovCisKKyNkZWZpbmUgX19idWlsdGluX2FsdGl2ZWNfdm1yZ2xiIHZlY192bXJnbGIKKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3ZtcmdsYih2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiB2ZWNfcGVybShfX2EsIF9fYiwKKyAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMHgwOCwgMHgxOCwgMHgwOSwgMHgxOSwgMHgwQSwgMHgxQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQiwgMHgxQiwgMHgwQywgMHgxQywgMHgwRCwgMHgxRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwRSwgMHgxRSwgMHgwRiwgMHgxRikpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY192bXJnbGIodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKF9fYSwgX19iLAorICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgweDA4LCAweDE4LCAweDA5LCAweDE5LCAweDBBLCAweDFBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBCLCAweDFCLCAweDBDLCAweDFDLCAweDBELCAweDFELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBFLCAweDFFLCAweDBGLCAweDFGKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfdm1yZ2xiKHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICByZXR1cm4gdmVjX3Blcm0oX19hLCBfX2IsCisgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDB4MDgsIDB4MTgsIDB4MDksIDB4MTksIDB4MEEsIDB4MUEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEIsIDB4MUIsIDB4MEMsIDB4MUMsIDB4MEQsIDB4MUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEUsIDB4MUUsIDB4MEYsIDB4MUYpKTsKK30KKworLyogdmVjX3ZtcmdsaCAqLworCisjZGVmaW5lIF9fYnVpbHRpbl9hbHRpdmVjX3ZtcmdsaCB2ZWNfdm1yZ2xoCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaG9ydCBfX0FUVFJTX29fYWkgdmVjX3ZtcmdsaCh2ZWN0b3Igc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKF9fYSwgX19iLAorICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgweDA4LCAweDA5LCAweDE4LCAweDE5LCAweDBBLCAweDBCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFBLCAweDFCLCAweDBDLCAweDBELCAweDFDLCAweDFELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBFLCAweDBGLCAweDFFLCAweDFGKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY192bXJnbGgodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gdmVjX3Blcm0oX19hLCBfX2IsCisgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDB4MDgsIDB4MDksIDB4MTgsIDB4MTksIDB4MEEsIDB4MEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUEsIDB4MUIsIDB4MEMsIDB4MEQsIDB4MUMsIDB4MUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEUsIDB4MEYsIDB4MUUsIDB4MUYpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfdm1yZ2xoKHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIHJldHVybiB2ZWNfcGVybShfX2EsIF9fYiwKKyAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMHgwOCwgMHgwOSwgMHgxOCwgMHgxOSwgMHgwQSwgMHgwQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxQSwgMHgxQiwgMHgwQywgMHgwRCwgMHgxQywgMHgxRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwRSwgMHgwRiwgMHgxRSwgMHgxRikpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgcGl4ZWwgX19BVFRSU19vX2FpIHZlY192bXJnbGgodmVjdG9yIHBpeGVsIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgcGl4ZWwgX19iKSB7CisgIHJldHVybiB2ZWNfcGVybShfX2EsIF9fYiwKKyAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMHgwOCwgMHgwOSwgMHgxOCwgMHgxOSwgMHgwQSwgMHgwQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxQSwgMHgxQiwgMHgwQywgMHgwRCwgMHgxQywgMHgxRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwRSwgMHgwRiwgMHgxRSwgMHgxRikpOworfQorCisvKiB2ZWNfdm1yZ2x3ICovCisKKyNkZWZpbmUgX19idWlsdGluX2FsdGl2ZWNfdm1yZ2x3IHZlY192bXJnbHcKKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX0FUVFJTX29fYWkgdmVjX3Ztcmdsdyh2ZWN0b3IgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGludCBfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKF9fYSwgX19iLAorICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDE4LCAweDE5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFBLCAweDFCLCAweDBDLCAweDBELCAweDBFLCAweDBGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFDLCAweDFELCAweDFFLCAweDFGKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfdm1yZ2x3KHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gdmVjX3Blcm0oX19hLCBfX2IsCisgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDB4MDgsIDB4MDksIDB4MEEsIDB4MEIsIDB4MTgsIDB4MTksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUEsIDB4MUIsIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUMsIDB4MUQsIDB4MUUsIDB4MUYpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgaW50IF9fQVRUUlNfb19haSB2ZWNfdm1yZ2x3KHZlY3RvciBib29sIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICByZXR1cm4gdmVjX3Blcm0oX19hLCBfX2IsCisgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDB4MDgsIDB4MDksIDB4MEEsIDB4MEIsIDB4MTgsIDB4MTksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUEsIDB4MUIsIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUMsIDB4MUQsIDB4MUUsIDB4MUYpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGZsb2F0IF9fQVRUUlNfb19haSB2ZWNfdm1yZ2x3KHZlY3RvciBmbG9hdCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGZsb2F0IF9fYikgeworICByZXR1cm4gdmVjX3Blcm0oX19hLCBfX2IsCisgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDB4MDgsIDB4MDksIDB4MEEsIDB4MEIsIDB4MTgsIDB4MTksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUEsIDB4MUIsIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUMsIDB4MUQsIDB4MUUsIDB4MUYpKTsKK30KKworI2lmZGVmIF9fUE9XRVI4X1ZFQ1RPUl9fCisvKiB2ZWNfbWVyZ2VlICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGludCBfX0FUVFJTX29fYWkgdmVjX21lcmdlZSh2ZWN0b3IgYm9vbCBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKF9fYSwgX19iLAorICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDEwLCAweDExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEyLCAweDEzLCAweDA4LCAweDA5LCAweDBBLCAweDBCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4LCAweDE5LCAweDFBLCAweDFCKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX21lcmdlZSh2ZWN0b3Igc2lnbmVkIGludCBfX2EsIHZlY3RvciBzaWduZWQgaW50IF9fYikgeworICByZXR1cm4gdmVjX3Blcm0oX19hLCBfX2IsCisgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MTAsIDB4MTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTIsIDB4MTMsIDB4MDgsIDB4MDksIDB4MEEsIDB4MEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTgsIDB4MTksIDB4MUEsIDB4MUIpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY19tZXJnZWUodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiB2ZWNfcGVybShfX2EsIF9fYiwKKyAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgxMCwgMHgxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMiwgMHgxMywgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxOCwgMHgxOSwgMHgxQSwgMHgxQikpOworfQorCisvKiB2ZWNfbWVyZ2VvICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGludCBfX0FUVFJTX29fYWkgdmVjX21lcmdlbyh2ZWN0b3IgYm9vbCBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKF9fYSwgX19iLAorICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDE0LCAweDE1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE2LCAweDE3LCAweDBDLCAweDBELCAweDBFLCAweDBGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFDLCAweDFELCAweDFFLCAweDFGKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX21lcmdlbyh2ZWN0b3Igc2lnbmVkIGludCBfX2EsIHZlY3RvciBzaWduZWQgaW50IF9fYikgeworICByZXR1cm4gdmVjX3Blcm0oX19hLCBfX2IsCisgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MTQsIDB4MTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTYsIDB4MTcsIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUMsIDB4MUQsIDB4MUUsIDB4MUYpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY19tZXJnZW8odmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiB2ZWNfcGVybShfX2EsIF9fYiwKKyAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgxNCwgMHgxNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNiwgMHgxNywgMHgwQywgMHgwRCwgMHgwRSwgMHgwRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxQywgMHgxRCwgMHgxRSwgMHgxRikpOworfQorCisjZW5kaWYKKworLyogdmVjX21mdnNjciAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKQordmVjX21mdnNjcih2b2lkKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY19tZnZzY3IoKTsKK30KKworLyogdmVjX21pbiAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfbWluKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZtaW5zYihfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19taW4odmVjdG9yIGJvb2wgY2hhciBfX2EsIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZtaW5zYigodmVjdG9yIHNpZ25lZCBjaGFyKV9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX21pbih2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdm1pbnNiKF9fYSwgKHZlY3RvciBzaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19taW4odmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZtaW51YihfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX21pbih2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bWludWIoKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfbWluKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZtaW51YihfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY19taW4odmVjdG9yIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bWluc2goX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY19taW4odmVjdG9yIGJvb2wgc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZtaW5zaCgodmVjdG9yIHNob3J0KV9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNob3J0IF9fQVRUUlNfb19haSB2ZWNfbWluKHZlY3RvciBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bWluc2goX19hLCAodmVjdG9yIHNob3J0KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19taW4odmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdm1pbnVoKF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX21pbih2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZtaW51aCgodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX21pbih2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZtaW51aChfX2EsICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX0FUVFJTX29fYWkgdmVjX21pbih2ZWN0b3IgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZtaW5zdyhfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY19taW4odmVjdG9yIGJvb2wgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZtaW5zdygodmVjdG9yIGludClfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY19taW4odmVjdG9yIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZtaW5zdyhfX2EsICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfbWluKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdm1pbnV3KF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY19taW4odmVjdG9yIGJvb2wgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZtaW51dygodmVjdG9yIHVuc2lnbmVkIGludClfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfbWluKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bWludXcoX19hLCAodmVjdG9yIHVuc2lnbmVkIGludClfX2IpOworfQorCisjaWZkZWYgX19QT1dFUjhfVkVDVE9SX18KK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX21pbih2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdm1pbnNkKF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfbWluKHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdm1pbnNkKCh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZylfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX21pbih2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZtaW5zZChfX2EsICh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZylfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX21pbih2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZtaW51ZChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfbWluKHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bWludWQoKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX21pbih2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdm1pbnVkKF9fYSwgKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19iKTsKK30KKyNlbmRpZgorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZmxvYXQgX19BVFRSU19vX2FpIHZlY19taW4odmVjdG9yIGZsb2F0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgZmxvYXQgX19iKSB7CisjaWZkZWYgX19WU1hfXworICByZXR1cm4gX19idWlsdGluX3ZzeF94dm1pbnNwKF9fYSwgX19iKTsKKyNlbHNlCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bWluZnAoX19hLCBfX2IpOworI2VuZGlmCit9CisKKyNpZmRlZiBfX1ZTWF9fCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZG91YmxlIF9fQVRUUlNfb19haSB2ZWNfbWluKHZlY3RvciBkb3VibGUgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgZG91YmxlIF9fYikgeworICByZXR1cm4gX19idWlsdGluX3ZzeF94dm1pbmRwKF9fYSwgX19iKTsKK30KKyNlbmRpZgorCisvKiB2ZWNfdm1pbnNiICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY192bWluc2IodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdm1pbnNiKF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3ZtaW5zYih2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdm1pbnNiKCh2ZWN0b3Igc2lnbmVkIGNoYXIpX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfdm1pbnNiKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bWluc2IoX19hLCAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYik7Cit9CisKKy8qIHZlY192bWludWIgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfdm1pbnViKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bWludWIoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY192bWludWIodmVjdG9yIGJvb2wgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdm1pbnViKCh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3ZtaW51Yih2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bWludWIoX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworLyogdmVjX3ZtaW5zaCAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY192bWluc2godmVjdG9yIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bWluc2goX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY192bWluc2godmVjdG9yIGJvb2wgc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZtaW5zaCgodmVjdG9yIHNob3J0KV9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNob3J0IF9fQVRUUlNfb19haSB2ZWNfdm1pbnNoKHZlY3RvciBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bWluc2goX19hLCAodmVjdG9yIHNob3J0KV9fYik7Cit9CisKKy8qIHZlY192bWludWggKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX3ZtaW51aCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bWludWgoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfdm1pbnVoKHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdm1pbnVoKCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfdm1pbnVoKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdm1pbnVoKF9fYSwgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2IpOworfQorCisvKiB2ZWNfdm1pbnN3ICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY192bWluc3codmVjdG9yIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bWluc3coX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfdm1pbnN3KHZlY3RvciBib29sIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bWluc3coKHZlY3RvciBpbnQpX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfdm1pbnN3KHZlY3RvciBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bWluc3coX19hLCAodmVjdG9yIGludClfX2IpOworfQorCisvKiB2ZWNfdm1pbnV3ICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfdm1pbnV3KHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdm1pbnV3KF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY192bWludXcodmVjdG9yIGJvb2wgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZtaW51dygodmVjdG9yIHVuc2lnbmVkIGludClfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfdm1pbnV3KHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bWludXcoX19hLCAodmVjdG9yIHVuc2lnbmVkIGludClfX2IpOworfQorCisvKiB2ZWNfdm1pbmZwICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBmbG9hdCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpCit2ZWNfdm1pbmZwKHZlY3RvciBmbG9hdCBfX2EsIHZlY3RvciBmbG9hdCBfX2IpIHsKKyNpZmRlZiBfX1ZTWF9fCisgIHJldHVybiBfX2J1aWx0aW5fdnN4X3h2bWluc3AoX19hLCBfX2IpOworI2Vsc2UKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZtaW5mcChfX2EsIF9fYik7CisjZW5kaWYKK30KKworLyogdmVjX21sYWRkICovCisKKyNkZWZpbmUgX19idWlsdGluX2FsdGl2ZWNfdm1sYWRkdWhtIHZlY19tbGFkZAorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY19tbGFkZCh2ZWN0b3Igc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNob3J0IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaG9ydCBfX2MpIHsKKyAgcmV0dXJuIF9fYSAqIF9fYiArIF9fYzsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNob3J0IF9fQVRUUlNfb19haSB2ZWNfbWxhZGQoCisgICAgdmVjdG9yIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYiwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYykgeworICByZXR1cm4gX19hICogKHZlY3RvciBzaG9ydClfX2IgKyAodmVjdG9yIHNob3J0KV9fYzsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNob3J0IF9fQVRUUlNfb19haSB2ZWNfbWxhZGQodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaG9ydCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2hvcnQgX19jKSB7CisgIHJldHVybiAodmVjdG9yIHNob3J0KV9fYSAqIF9fYiArIF9fYzsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX21sYWRkKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IsCisgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYykgeworICByZXR1cm4gX19hICogX19iICsgX19jOworfQorCisvKiB2ZWNfdm1sYWRkdWhtICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaG9ydCBfX0FUVFJTX29fYWkgdmVjX3ZtbGFkZHVobSh2ZWN0b3Igc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaG9ydCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNob3J0IF9fYykgeworICByZXR1cm4gX19hICogX19iICsgX19jOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY192bWxhZGR1aG0oCisgICAgdmVjdG9yIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYiwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYykgeworICByZXR1cm4gX19hICogKHZlY3RvciBzaG9ydClfX2IgKyAodmVjdG9yIHNob3J0KV9fYzsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNob3J0IF9fQVRUUlNfb19haQordmVjX3ZtbGFkZHVobSh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3Igc2hvcnQgX19iLCB2ZWN0b3Igc2hvcnQgX19jKSB7CisgIHJldHVybiAodmVjdG9yIHNob3J0KV9fYSAqIF9fYiArIF9fYzsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX3ZtbGFkZHVobSh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iLAorICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19jKSB7CisgIHJldHVybiBfX2EgKiBfX2IgKyBfX2M7Cit9CisKKy8qIHZlY19tcmFkZHMgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNob3J0IF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKK3ZlY19tcmFkZHModmVjdG9yIHNob3J0IF9fYSwgdmVjdG9yIHNob3J0IF9fYiwgdmVjdG9yIHNob3J0IF9fYykgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdm1ocmFkZHNocyhfX2EsIF9fYiwgX19jKTsKK30KKworLyogdmVjX3ZtaHJhZGRzaHMgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNob3J0IF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKK3ZlY192bWhyYWRkc2hzKHZlY3RvciBzaG9ydCBfX2EsIHZlY3RvciBzaG9ydCBfX2IsIHZlY3RvciBzaG9ydCBfX2MpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZtaHJhZGRzaHMoX19hLCBfX2IsIF9fYyk7Cit9CisKKy8qIHZlY19tc3VtICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY19tc3VtKHZlY3RvciBzaWduZWQgY2hhciBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgaW50IF9fYykgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdm1zdW1tYm0oX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfbXN1bSh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYiwKKyAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBpbnQgX19jKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bXN1bXVibShfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX0FUVFJTX29fYWkgdmVjX21zdW0odmVjdG9yIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaG9ydCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgaW50IF9fYykgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdm1zdW1zaG0oX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfbXN1bSh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iLAorICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGludCBfX2MpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3Ztc3VtdWhtKF9fYSwgX19iLCBfX2MpOworfQorCisvKiB2ZWNfdm1zdW1tYm0gKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpCit2ZWNfdm1zdW1tYm0odmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iLCB2ZWN0b3IgaW50IF9fYykgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdm1zdW1tYm0oX19hLCBfX2IsIF9fYyk7Cit9CisKKy8qIHZlY192bXN1bXVibSAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKK3ZlY192bXN1bXVibSh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYiwKKyAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYykgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdm1zdW11Ym0oX19hLCBfX2IsIF9fYyk7Cit9CisKKy8qIHZlY192bXN1bXNobSAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKK3ZlY192bXN1bXNobSh2ZWN0b3Igc2hvcnQgX19hLCB2ZWN0b3Igc2hvcnQgX19iLCB2ZWN0b3IgaW50IF9fYykgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdm1zdW1zaG0oX19hLCBfX2IsIF9fYyk7Cit9CisKKy8qIHZlY192bXN1bXVobSAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKK3ZlY192bXN1bXVobSh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iLAorICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBpbnQgX19jKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bXN1bXVobShfX2EsIF9fYiwgX19jKTsKK30KKworLyogdmVjX21zdW1zICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY19tc3Vtcyh2ZWN0b3Igc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaG9ydCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGludCBfX2MpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3Ztc3Vtc2hzKF9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX21zdW1zKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IsCisgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGludCBfX2MpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3Ztc3VtdWhzKF9fYSwgX19iLCBfX2MpOworfQorCisvKiB2ZWNfdm1zdW1zaHMgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpCit2ZWNfdm1zdW1zaHModmVjdG9yIHNob3J0IF9fYSwgdmVjdG9yIHNob3J0IF9fYiwgdmVjdG9yIGludCBfX2MpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3Ztc3Vtc2hzKF9fYSwgX19iLCBfX2MpOworfQorCisvKiB2ZWNfdm1zdW11aHMgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpCit2ZWNfdm1zdW11aHModmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYiwKKyAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYykgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdm1zdW11aHMoX19hLCBfX2IsIF9fYyk7Cit9CisKKy8qIHZlY19tdHZzY3IgKi8KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX210dnNjcih2ZWN0b3Igc2lnbmVkIGNoYXIgX19hKSB7CisgIF9fYnVpbHRpbl9hbHRpdmVjX210dnNjcigodmVjdG9yIGludClfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfbXR2c2NyKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSkgeworICBfX2J1aWx0aW5fYWx0aXZlY19tdHZzY3IoKHZlY3RvciBpbnQpX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX210dnNjcih2ZWN0b3IgYm9vbCBjaGFyIF9fYSkgeworICBfX2J1aWx0aW5fYWx0aXZlY19tdHZzY3IoKHZlY3RvciBpbnQpX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX210dnNjcih2ZWN0b3Igc2hvcnQgX19hKSB7CisgIF9fYnVpbHRpbl9hbHRpdmVjX210dnNjcigodmVjdG9yIGludClfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfbXR2c2NyKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfbXR2c2NyKCh2ZWN0b3IgaW50KV9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19tdHZzY3IodmVjdG9yIGJvb2wgc2hvcnQgX19hKSB7CisgIF9fYnVpbHRpbl9hbHRpdmVjX210dnNjcigodmVjdG9yIGludClfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfbXR2c2NyKHZlY3RvciBwaXhlbCBfX2EpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfbXR2c2NyKCh2ZWN0b3IgaW50KV9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19tdHZzY3IodmVjdG9yIGludCBfX2EpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfbXR2c2NyKCh2ZWN0b3IgaW50KV9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19tdHZzY3IodmVjdG9yIHVuc2lnbmVkIGludCBfX2EpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfbXR2c2NyKCh2ZWN0b3IgaW50KV9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19tdHZzY3IodmVjdG9yIGJvb2wgaW50IF9fYSkgeworICBfX2J1aWx0aW5fYWx0aXZlY19tdHZzY3IoKHZlY3RvciBpbnQpX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX210dnNjcih2ZWN0b3IgZmxvYXQgX19hKSB7CisgIF9fYnVpbHRpbl9hbHRpdmVjX210dnNjcigodmVjdG9yIGludClfX2EpOworfQorCisvKiB2ZWNfbXVsICovCisKKy8qIEludGVnZXIgdmVjdG9yIG11bHRpcGxpY2F0aW9uIHdpbGwgaW52b2x2ZSBtdWx0aXBsaWNhdGlvbiBvZiB0aGUgb2RkL2V2ZW4KKyAgIGVsZW1lbnRzIHNlcGFyYXRlbHksIHRoZW4gdHJ1bmNhdGluZyB0aGUgcmVzdWx0cyBhbmQgbW92aW5nIHRvIHRoZQorICAgcmVzdWx0IHZlY3Rvci4KKyovCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfbXVsKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYSAqIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfbXVsKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2EgKiBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfbXVsKHZlY3RvciBzaWduZWQgc2hvcnQgX19hLCB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gX19hICogX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfbXVsKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYSAqIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfbXVsKHZlY3RvciBzaWduZWQgaW50IF9fYSwgdmVjdG9yIHNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiBfX2EgKiBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfbXVsKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gX19hICogX19iOworfQorCisjaWZkZWYgX19WU1hfXworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfbXVsKHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2EgKiBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfbXVsKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19hICogX19iOworfQorI2VuZGlmCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBmbG9hdCBfX0FUVFJTX29fYWkgdmVjX211bCh2ZWN0b3IgZmxvYXQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBmbG9hdCBfX2IpIHsKKyAgcmV0dXJuIF9fYSAqIF9fYjsKK30KKworI2lmZGVmIF9fVlNYX18KK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBkb3VibGUgX19BVFRSU19vX2FpIHZlY19tdWwodmVjdG9yIGRvdWJsZSBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBkb3VibGUgX19iKSB7CisgIHJldHVybiBfX2EgKiBfX2I7Cit9CisjZW5kaWYKKworLyogVGhlIHZtdWxvcyogYW5kIHZtdWxlcyogaW5zdHJ1Y3Rpb25zIGhhdmUgYSBiaWcgZW5kaWFuIGJpYXMsIHNvCisgICB3ZSBtdXN0IHJldmVyc2UgdGhlIG1lYW5pbmcgb2YgImV2ZW4iIGFuZCAib2RkIiBmb3IgbGl0dGxlIGVuZGlhbi4gICovCisKKy8qIHZlY19tdWxlICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaG9ydCBfX0FUVFJTX29fYWkgdmVjX211bGUodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bXVsb3NiKF9fYSwgX19iKTsKKyNlbHNlCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bXVsZXNiKF9fYSwgX19iKTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfbXVsZSh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bXVsb3ViKF9fYSwgX19iKTsKKyNlbHNlCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bXVsZXViKF9fYSwgX19iKTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfbXVsZSh2ZWN0b3Igc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNob3J0IF9fYikgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bXVsb3NoKF9fYSwgX19iKTsKKyNlbHNlCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bXVsZXNoKF9fYSwgX19iKTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX211bGUodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bXVsb3VoKF9fYSwgX19iKTsKKyNlbHNlCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bXVsZXVoKF9fYSwgX19iKTsKKyNlbmRpZgorfQorCisjaWZkZWYgX19QT1dFUjhfVkVDVE9SX18KK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX211bGUodmVjdG9yIHNpZ25lZCBpbnQgX19hLCB2ZWN0b3Igc2lnbmVkIGludCBfX2IpIHsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdm11bG9zdyhfX2EsIF9fYik7CisjZWxzZQorICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdm11bGVzdyhfX2EsIF9fYik7CisjZW5kaWYKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY19tdWxlKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bXVsb3V3KF9fYSwgX19iKTsKKyNlbHNlCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bXVsZXV3KF9fYSwgX19iKTsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qIHZlY192bXVsZXNiICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaG9ydCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpCit2ZWNfdm11bGVzYih2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZtdWxvc2IoX19hLCBfX2IpOworI2Vsc2UKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZtdWxlc2IoX19hLCBfX2IpOworI2VuZGlmCit9CisKKy8qIHZlY192bXVsZXViICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpCit2ZWNfdm11bGV1Yih2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bXVsb3ViKF9fYSwgX19iKTsKKyNlbHNlCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bXVsZXViKF9fYSwgX19iKTsKKyNlbmRpZgorfQorCisvKiB2ZWNfdm11bGVzaCAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKK3ZlY192bXVsZXNoKHZlY3RvciBzaG9ydCBfX2EsIHZlY3RvciBzaG9ydCBfX2IpIHsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdm11bG9zaChfX2EsIF9fYik7CisjZWxzZQorICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdm11bGVzaChfX2EsIF9fYik7CisjZW5kaWYKK30KKworLyogdmVjX3ZtdWxldWggKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpCit2ZWNfdm11bGV1aCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZtdWxvdWgoX19hLCBfX2IpOworI2Vsc2UKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZtdWxldWgoX19hLCBfX2IpOworI2VuZGlmCit9CisKKy8qIHZlY19tdWxvICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaG9ydCBfX0FUVFJTX29fYWkgdmVjX211bG8odmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bXVsZXNiKF9fYSwgX19iKTsKKyNlbHNlCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bXVsb3NiKF9fYSwgX19iKTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfbXVsbyh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bXVsZXViKF9fYSwgX19iKTsKKyNlbHNlCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bXVsb3ViKF9fYSwgX19iKTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfbXVsbyh2ZWN0b3Igc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNob3J0IF9fYikgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bXVsZXNoKF9fYSwgX19iKTsKKyNlbHNlCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bXVsb3NoKF9fYSwgX19iKTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX211bG8odmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bXVsZXVoKF9fYSwgX19iKTsKKyNlbHNlCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bXVsb3VoKF9fYSwgX19iKTsKKyNlbmRpZgorfQorCisjaWZkZWYgX19QT1dFUjhfVkVDVE9SX18KK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX211bG8odmVjdG9yIHNpZ25lZCBpbnQgX19hLCB2ZWN0b3Igc2lnbmVkIGludCBfX2IpIHsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdm11bGVzdyhfX2EsIF9fYik7CisjZWxzZQorICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdm11bG9zdyhfX2EsIF9fYik7CisjZW5kaWYKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY19tdWxvKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bXVsZXV3KF9fYSwgX19iKTsKKyNlbHNlCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bXVsb3V3KF9fYSwgX19iKTsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qIHZlY192bXVsb3NiICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaG9ydCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpCit2ZWNfdm11bG9zYih2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZtdWxlc2IoX19hLCBfX2IpOworI2Vsc2UKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZtdWxvc2IoX19hLCBfX2IpOworI2VuZGlmCit9CisKKy8qIHZlY192bXVsb3ViICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpCit2ZWNfdm11bG91Yih2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bXVsZXViKF9fYSwgX19iKTsKKyNlbHNlCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bXVsb3ViKF9fYSwgX19iKTsKKyNlbmRpZgorfQorCisvKiB2ZWNfdm11bG9zaCAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKK3ZlY192bXVsb3NoKHZlY3RvciBzaG9ydCBfX2EsIHZlY3RvciBzaG9ydCBfX2IpIHsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdm11bGVzaChfX2EsIF9fYik7CisjZWxzZQorICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdm11bG9zaChfX2EsIF9fYik7CisjZW5kaWYKK30KKworLyogdmVjX3ZtdWxvdWggKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpCit2ZWNfdm11bG91aCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZtdWxldWgoX19hLCBfX2IpOworI2Vsc2UKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZtdWxvdWgoX19hLCBfX2IpOworI2VuZGlmCit9CisKKy8qICB2ZWNfbmFuZCAqLworCisjaWZkZWYgX19QT1dFUjhfVkVDVE9SX18KK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19uYW5kKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIH4oX19hICYgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX25hbmQodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgcmV0dXJuIH4oX19hICYgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX25hbmQodmVjdG9yIGJvb2wgY2hhciBfX2EsIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIH4oX19hICYgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfbmFuZCh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gfihfX2EgJiBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19uYW5kKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgcmV0dXJuIH4oX19hICYgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfbmFuZCh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiB+KF9fYSAmIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGNoYXIgX19BVFRSU19vX2FpIHZlY19uYW5kKHZlY3RvciBib29sIGNoYXIgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgcmV0dXJuIH4oX19hICYgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19uYW5kKHZlY3RvciBzaWduZWQgc2hvcnQgX19hLCB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gfihfX2EgJiBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX25hbmQodmVjdG9yIHNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICByZXR1cm4gfihfX2EgJiBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX25hbmQodmVjdG9yIGJvb2wgc2hvcnQgX19hLCB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gfihfX2EgJiBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfbmFuZCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiB+KF9fYSAmIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19uYW5kKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICByZXR1cm4gfihfX2EgJiBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19uYW5kKHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIHJldHVybiB+KF9fYSAmIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX25hbmQodmVjdG9yIHNpZ25lZCBpbnQgX19hLCB2ZWN0b3Igc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuIH4oX19hICYgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBpbnQgX19BVFRSU19vX2FpIHZlY19uYW5kKHZlY3RvciBzaWduZWQgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIHJldHVybiB+KF9fYSAmIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX25hbmQodmVjdG9yIGJvb2wgaW50IF9fYSwgdmVjdG9yIHNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiB+KF9fYSAmIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfbmFuZCh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuIH4oX19hICYgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY19uYW5kKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIHJldHVybiB+KF9fYSAmIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfbmFuZCh2ZWN0b3IgYm9vbCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gfihfX2EgJiBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBpbnQgX19BVFRSU19vX2FpIHZlY19uYW5kKHZlY3RvciBib29sIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgcmV0dXJuIH4oX19hICYgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfbmFuZCh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gfihfX2EgJiBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY19uYW5kKHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gfihfX2EgJiBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY19uYW5kKHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gfihfX2EgJiBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX25hbmQodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiB+KF9fYSAmIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfbmFuZCh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gfihfX2EgJiBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX25hbmQodmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIH4oX19hICYgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX25hbmQodmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gfihfX2EgJiBfX2IpOworfQorCisjZW5kaWYKKworLyogdmVjX25tYWRkICovCisKKyNpZmRlZiBfX1ZTWF9fCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZmxvYXQgX19BVFRSU19vX2FpIHZlY19ubWFkZCh2ZWN0b3IgZmxvYXQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGZsb2F0IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBmbG9hdCBfX2MpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl92c3hfeHZubWFkZGFzcChfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGRvdWJsZSBfX0FUVFJTX29fYWkgdmVjX25tYWRkKHZlY3RvciBkb3VibGUgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBkb3VibGUgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBkb3VibGUgX19jKSB7CisgIHJldHVybiBfX2J1aWx0aW5fdnN4X3h2bm1hZGRhZHAoX19hLCBfX2IsIF9fYyk7Cit9CisjZW5kaWYKKworLyogdmVjX25tc3ViICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBmbG9hdCBfX0FUVFJTX29fYWkgdmVjX25tc3ViKHZlY3RvciBmbG9hdCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgZmxvYXQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGZsb2F0IF9fYykgeworI2lmZGVmIF9fVlNYX18KKyAgcmV0dXJuIF9fYnVpbHRpbl92c3hfeHZubXN1YmFzcChfX2EsIF9fYiwgX19jKTsKKyNlbHNlCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192bm1zdWJmcChfX2EsIF9fYiwgX19jKTsKKyNlbmRpZgorfQorCisjaWZkZWYgX19WU1hfXworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGRvdWJsZSBfX0FUVFJTX29fYWkgdmVjX25tc3ViKHZlY3RvciBkb3VibGUgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBkb3VibGUgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBkb3VibGUgX19jKSB7CisgIHJldHVybiBfX2J1aWx0aW5fdnN4X3h2bm1zdWJhZHAoX19hLCBfX2IsIF9fYyk7Cit9CisjZW5kaWYKKworLyogdmVjX3ZubXN1YmZwICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBmbG9hdCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpCit2ZWNfdm5tc3ViZnAodmVjdG9yIGZsb2F0IF9fYSwgdmVjdG9yIGZsb2F0IF9fYiwgdmVjdG9yIGZsb2F0IF9fYykgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdm5tc3ViZnAoX19hLCBfX2IsIF9fYyk7Cit9CisKKy8qIHZlY19ub3IgKi8KKworI2RlZmluZSBfX2J1aWx0aW5fYWx0aXZlY192bm9yIHZlY19ub3IKKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX25vcih2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiB+KF9fYSB8IF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX25vcih2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gfihfX2EgfCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBjaGFyIF9fQVRUUlNfb19haSB2ZWNfbm9yKHZlY3RvciBib29sIGNoYXIgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICByZXR1cm4gfihfX2EgfCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY19ub3IodmVjdG9yIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2hvcnQgX19iKSB7CisgIHJldHVybiB+KF9fYSB8IF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19ub3IodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gfihfX2EgfCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19ub3IodmVjdG9yIGJvb2wgc2hvcnQgX19hLCB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIH4oX19hIHwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX0FUVFJTX29fYWkgdmVjX25vcih2ZWN0b3IgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGludCBfX2IpIHsKKyAgcmV0dXJuIH4oX19hIHwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY19ub3IodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiB+KF9fYSB8IF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGludCBfX0FUVFJTX29fYWkgdmVjX25vcih2ZWN0b3IgYm9vbCBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgcmV0dXJuIH4oX19hIHwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGZsb2F0IF9fQVRUUlNfb19haSB2ZWNfbm9yKHZlY3RvciBmbG9hdCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGZsb2F0IF9fYikgeworICB2ZWN0b3IgdW5zaWduZWQgaW50IF9fcmVzID0KKyAgICAgIH4oKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hIHwgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iKTsKKyAgcmV0dXJuICh2ZWN0b3IgZmxvYXQpX19yZXM7Cit9CisKKyNpZmRlZiBfX1ZTWF9fCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZG91YmxlIF9fQVRUUlNfb19haSB2ZWNfbm9yKHZlY3RvciBkb3VibGUgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgZG91YmxlIF9fYikgeworICB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fcmVzID0KKyAgICAgIH4oKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19hIHwgKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19iKTsKKyAgcmV0dXJuICh2ZWN0b3IgZG91YmxlKV9fcmVzOworfQorI2VuZGlmCisKKy8qIHZlY192bm9yICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY192bm9yKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIH4oX19hIHwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfdm5vcih2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gfihfX2EgfCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBjaGFyIF9fQVRUUlNfb19haSB2ZWNfdm5vcih2ZWN0b3IgYm9vbCBjaGFyIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIHJldHVybiB+KF9fYSB8IF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaG9ydCBfX0FUVFJTX29fYWkgdmVjX3Zub3IodmVjdG9yIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNob3J0IF9fYikgeworICByZXR1cm4gfihfX2EgfCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfdm5vcih2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiB+KF9fYSB8IF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIHNob3J0IF9fQVRUUlNfb19haQordmVjX3Zub3IodmVjdG9yIGJvb2wgc2hvcnQgX19hLCB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIH4oX19hIHwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX0FUVFJTX29fYWkgdmVjX3Zub3IodmVjdG9yIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgaW50IF9fYikgeworICByZXR1cm4gfihfX2EgfCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX3Zub3IodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiB+KF9fYSB8IF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGludCBfX0FUVFJTX29fYWkgdmVjX3Zub3IodmVjdG9yIGJvb2wgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICByZXR1cm4gfihfX2EgfCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZmxvYXQgX19BVFRSU19vX2FpIHZlY192bm9yKHZlY3RvciBmbG9hdCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBmbG9hdCBfX2IpIHsKKyAgdmVjdG9yIHVuc2lnbmVkIGludCBfX3JlcyA9CisgICAgICB+KCh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSB8ICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYik7CisgIHJldHVybiAodmVjdG9yIGZsb2F0KV9fcmVzOworfQorCisjaWZkZWYgX19WU1hfXworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfbm9yKHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiB+KF9fYSB8IF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfbm9yKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gfihfX2EgfCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfbm9yKHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIH4oX19hIHwgX19iKTsKK30KKyNlbmRpZgorCisvKiB2ZWNfb3IgKi8KKworI2RlZmluZSBfX2J1aWx0aW5fYWx0aXZlY192b3IgdmVjX29yCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19vcih2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2EgfCBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19vcih2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgY2hhcilfX2EgfCBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkgdmVjX29yKHZlY3RvciBzaWduZWQgY2hhciBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICByZXR1cm4gX19hIHwgKHZlY3RvciBzaWduZWQgY2hhcilfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX29yKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2EgfCBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX29yKHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EgfCBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX29yKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYSB8ICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGNoYXIgX19BVFRSU19vX2FpIHZlY19vcih2ZWN0b3IgYm9vbCBjaGFyIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICByZXR1cm4gX19hIHwgX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY19vcih2ZWN0b3Igc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNob3J0IF9fYikgeworICByZXR1cm4gX19hIHwgX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY19vcih2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNob3J0KV9fYSB8IF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNob3J0IF9fQVRUUlNfb19haSB2ZWNfb3IodmVjdG9yIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICByZXR1cm4gX19hIHwgKHZlY3RvciBzaG9ydClfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19vcih2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2EgfCBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19vcih2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19hIHwgX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfb3IodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2EgfCAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgc2hvcnQgX19BVFRSU19vX2FpIHZlY19vcih2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICByZXR1cm4gX19hIHwgX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfb3IodmVjdG9yIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYSB8IF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX0FUVFJTX29fYWkgdmVjX29yKHZlY3RvciBib29sIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgaW50KV9fYSB8IF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX0FUVFJTX29fYWkgdmVjX29yKHZlY3RvciBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYSB8ICh2ZWN0b3IgaW50KV9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY19vcih2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYSB8IF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY19vcih2ZWN0b3IgYm9vbCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hIHwgX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX29yKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIHJldHVybiBfX2EgfCAodmVjdG9yIHVuc2lnbmVkIGludClfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGludCBfX0FUVFJTX29fYWkgdmVjX29yKHZlY3RvciBib29sIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIHJldHVybiBfX2EgfCBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBmbG9hdCBfX0FUVFJTX29fYWkgdmVjX29yKHZlY3RvciBmbG9hdCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgZmxvYXQgX19iKSB7CisgIHZlY3RvciB1bnNpZ25lZCBpbnQgX19yZXMgPQorICAgICAgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hIHwgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iOworICByZXR1cm4gKHZlY3RvciBmbG9hdClfX3JlczsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGZsb2F0IF9fQVRUUlNfb19haSB2ZWNfb3IodmVjdG9yIGJvb2wgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBmbG9hdCBfX2IpIHsKKyAgdmVjdG9yIHVuc2lnbmVkIGludCBfX3JlcyA9CisgICAgICAodmVjdG9yIHVuc2lnbmVkIGludClfX2EgfCAodmVjdG9yIHVuc2lnbmVkIGludClfX2I7CisgIHJldHVybiAodmVjdG9yIGZsb2F0KV9fcmVzOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZmxvYXQgX19BVFRSU19vX2FpIHZlY19vcih2ZWN0b3IgZmxvYXQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICB2ZWN0b3IgdW5zaWduZWQgaW50IF9fcmVzID0KKyAgICAgICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSB8ICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYjsKKyAgcmV0dXJuICh2ZWN0b3IgZmxvYXQpX19yZXM7Cit9CisKKyNpZmRlZiBfX1ZTWF9fCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZG91YmxlIF9fQVRUUlNfb19haSB2ZWNfb3IodmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgZG91YmxlIF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19hIHwgKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZG91YmxlIF9fQVRUUlNfb19haSB2ZWNfb3IodmVjdG9yIGRvdWJsZSBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19hIHwgKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZG91YmxlIF9fQVRUUlNfb19haSB2ZWNfb3IodmVjdG9yIGRvdWJsZSBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGRvdWJsZSBfX2IpIHsKKyAgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX3JlcyA9CisgICAgICAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2EgfCAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2I7CisgIHJldHVybiAodmVjdG9yIGRvdWJsZSlfX3JlczsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfb3IodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYSB8IF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfb3IodmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpX19hIHwgX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY19vcih2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYSB8ICh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZylfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfb3IodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2EgfCBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfb3IodmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYSB8IF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY19vcih2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19hIHwgKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfb3IodmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19hIHwgX19iOworfQorI2VuZGlmCisKKyNpZmRlZiBfX1BPV0VSOF9WRUNUT1JfXworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX29yYyh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2EgfCB+X19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfb3JjKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2EgfCB+X19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfb3JjKHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2EgfCB+X19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19vcmModmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYSB8IH5fX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX29yYyh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2EgfCB+X19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19vcmModmVjdG9yIGJvb2wgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19hIHwgfl9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgY2hhciBfX0FUVFJTX29fYWkgdmVjX29yYyh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYSB8IH5fX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfb3JjKHZlY3RvciBzaWduZWQgc2hvcnQgX19hLCB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gX19hIHwgfl9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19vcmModmVjdG9yIHNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICByZXR1cm4gX19hIHwgfl9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19vcmModmVjdG9yIGJvb2wgc2hvcnQgX19hLCB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gX19hIHwgfl9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX29yYyh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2EgfCB+X19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfb3JjKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICByZXR1cm4gX19hIHwgfl9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX29yYyh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYSB8IH5fX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIHNob3J0IF9fQVRUUlNfb19haQordmVjX29yYyh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICByZXR1cm4gX19hIHwgfl9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfb3JjKHZlY3RvciBzaWduZWQgaW50IF9fYSwgdmVjdG9yIHNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiBfX2EgfCB+X19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGludCBfX0FUVFJTX29fYWkgdmVjX29yYyh2ZWN0b3Igc2lnbmVkIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIHJldHVybiBfX2EgfCB+X19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY19vcmModmVjdG9yIGJvb2wgaW50IF9fYSwgdmVjdG9yIHNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiBfX2EgfCB+X19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX29yYyh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYSB8IH5fX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfb3JjKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIHJldHVybiBfX2EgfCB+X19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX29yYyh2ZWN0b3IgYm9vbCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gX19hIHwgfl9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgaW50IF9fQVRUUlNfb19haSB2ZWNfb3JjKHZlY3RvciBib29sIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICByZXR1cm4gX19hIHwgfl9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfb3JjKHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2EgfCB+X19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY19vcmModmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2EgfCB+X19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY19vcmModmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2EgfCB+X19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX29yYyh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYSB8IH5fX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfb3JjKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2EgfCB+X19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX29yYyh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19hIHwgfl9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX29yYyh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2EgfCB+X19iOworfQorI2VuZGlmCisKKy8qIHZlY192b3IgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3Zvcih2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2EgfCBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY192b3IodmVjdG9yIGJvb2wgY2hhciBfX2EsIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGNoYXIpX19hIHwgX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfdm9yKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2EgfCAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfdm9yKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2EgfCBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3Zvcih2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hIHwgX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY192b3IodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICByZXR1cm4gX19hIHwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgY2hhciBfX0FUVFJTX29fYWkgdmVjX3Zvcih2ZWN0b3IgYm9vbCBjaGFyIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYSB8IF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNob3J0IF9fQVRUUlNfb19haSB2ZWNfdm9yKHZlY3RvciBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNob3J0IF9fYikgeworICByZXR1cm4gX19hIHwgX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY192b3IodmVjdG9yIGJvb2wgc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2hvcnQpX19hIHwgX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY192b3IodmVjdG9yIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYSB8ICh2ZWN0b3Igc2hvcnQpX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfdm9yKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYSB8IF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX3Zvcih2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19hIHwgX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfdm9yKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICByZXR1cm4gX19hIHwgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIHNob3J0IF9fQVRUUlNfb19haQordmVjX3Zvcih2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICByZXR1cm4gX19hIHwgX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfdm9yKHZlY3RvciBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgaW50IF9fYikgeworICByZXR1cm4gX19hIHwgX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfdm9yKHZlY3RvciBib29sIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGludClfX2EgfCBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY192b3IodmVjdG9yIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYSB8ICh2ZWN0b3IgaW50KV9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY192b3IodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiBfX2EgfCBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfdm9yKHZlY3RvciBib29sIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGludClfX2EgfCBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfdm9yKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIHJldHVybiBfX2EgfCAodmVjdG9yIHVuc2lnbmVkIGludClfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGludCBfX0FUVFJTX29fYWkgdmVjX3Zvcih2ZWN0b3IgYm9vbCBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYSB8IF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGZsb2F0IF9fQVRUUlNfb19haSB2ZWNfdm9yKHZlY3RvciBmbG9hdCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGZsb2F0IF9fYikgeworICB2ZWN0b3IgdW5zaWduZWQgaW50IF9fcmVzID0KKyAgICAgICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSB8ICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYjsKKyAgcmV0dXJuICh2ZWN0b3IgZmxvYXQpX19yZXM7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBmbG9hdCBfX0FUVFJTX29fYWkgdmVjX3Zvcih2ZWN0b3IgYm9vbCBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBmbG9hdCBfX2IpIHsKKyAgdmVjdG9yIHVuc2lnbmVkIGludCBfX3JlcyA9CisgICAgICAodmVjdG9yIHVuc2lnbmVkIGludClfX2EgfCAodmVjdG9yIHVuc2lnbmVkIGludClfX2I7CisgIHJldHVybiAodmVjdG9yIGZsb2F0KV9fcmVzOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZmxvYXQgX19BVFRSU19vX2FpIHZlY192b3IodmVjdG9yIGZsb2F0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIHZlY3RvciB1bnNpZ25lZCBpbnQgX19yZXMgPQorICAgICAgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hIHwgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iOworICByZXR1cm4gKHZlY3RvciBmbG9hdClfX3JlczsKK30KKworI2lmZGVmIF9fVlNYX18KK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX3Zvcih2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19hIHwgX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY192b3IodmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpX19hIHwgX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY192b3IodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2EgfCAodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX3Zvcih2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYSB8IF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY192b3IodmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYSB8IF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY192b3IodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYSB8ICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX3Zvcih2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2EgfCBfX2I7Cit9CisjZW5kaWYKKworLyogdmVjX3BhY2sgKi8KKworLyogVGhlIHZhcmlvdXMgdmVjdG9yIHBhY2sgaW5zdHJ1Y3Rpb25zIGhhdmUgYSBiaWctZW5kaWFuIGJpYXMsIHNvIGZvcgorICAgbGl0dGxlIGVuZGlhbiB3ZSBtdXN0IGhhbmRsZSByZXZlcnNlZCBlbGVtZW50IG51bWJlcmluZy4gICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19wYWNrKHZlY3RvciBzaWduZWQgc2hvcnQgX19hLCB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYikgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBjaGFyKXZlY19wZXJtKAorICAgICAgX19hLCBfX2IsCisgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDB4MDAsIDB4MDIsIDB4MDQsIDB4MDYsIDB4MDgsIDB4MEEsIDB4MEMsIDB4MEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAsIDB4MTIsIDB4MTQsIDB4MTYsIDB4MTgsIDB4MUEsIDB4MUMsIDB4MUUpKTsKKyNlbHNlCisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBjaGFyKXZlY19wZXJtKAorICAgICAgX19hLCBfX2IsCisgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDB4MDEsIDB4MDMsIDB4MDUsIDB4MDcsIDB4MDksIDB4MEIsIDB4MEQsIDB4MEYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTEsIDB4MTMsIDB4MTUsIDB4MTcsIDB4MTksIDB4MUIsIDB4MUQsIDB4MUYpKTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19wYWNrKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZlY19wZXJtKAorICAgICAgX19hLCBfX2IsCisgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDB4MDAsIDB4MDIsIDB4MDQsIDB4MDYsIDB4MDgsIDB4MEEsIDB4MEMsIDB4MEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAsIDB4MTIsIDB4MTQsIDB4MTYsIDB4MTgsIDB4MUEsIDB4MUMsIDB4MUUpKTsKKyNlbHNlCisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGNoYXIpdmVjX3Blcm0oCisgICAgICBfX2EsIF9fYiwKKyAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMHgwMSwgMHgwMywgMHgwNSwgMHgwNywgMHgwOSwgMHgwQiwgMHgwRCwgMHgwRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMSwgMHgxMywgMHgxNSwgMHgxNywgMHgxOSwgMHgxQiwgMHgxRCwgMHgxRikpOworI2VuZGlmCit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfcGFjayh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIHZlY3RvciBib29sIHNob3J0IF9fYikgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHJldHVybiAodmVjdG9yIGJvb2wgY2hhcil2ZWNfcGVybSgKKyAgICAgIF9fYSwgX19iLAorICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgweDAwLCAweDAyLCAweDA0LCAweDA2LCAweDA4LCAweDBBLCAweDBDLCAweDBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwLCAweDEyLCAweDE0LCAweDE2LCAweDE4LCAweDFBLCAweDFDLCAweDFFKSk7CisjZWxzZQorICByZXR1cm4gKHZlY3RvciBib29sIGNoYXIpdmVjX3Blcm0oCisgICAgICBfX2EsIF9fYiwKKyAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMHgwMSwgMHgwMywgMHgwNSwgMHgwNywgMHgwOSwgMHgwQiwgMHgwRCwgMHgwRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMSwgMHgxMywgMHgxNSwgMHgxNywgMHgxOSwgMHgxQiwgMHgxRCwgMHgxRikpOworI2VuZGlmCit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaG9ydCBfX0FUVFJTX29fYWkgdmVjX3BhY2sodmVjdG9yIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBpbnQgX19iKSB7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKyAgcmV0dXJuICh2ZWN0b3Igc2hvcnQpdmVjX3Blcm0oCisgICAgICBfX2EsIF9fYiwKKyAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMHgwMCwgMHgwMSwgMHgwNCwgMHgwNSwgMHgwOCwgMHgwOSwgMHgwQywgMHgwRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMCwgMHgxMSwgMHgxNCwgMHgxNSwgMHgxOCwgMHgxOSwgMHgxQywgMHgxRCkpOworI2Vsc2UKKyAgcmV0dXJuICh2ZWN0b3Igc2hvcnQpdmVjX3Blcm0oCisgICAgICBfX2EsIF9fYiwKKyAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMHgwMiwgMHgwMywgMHgwNiwgMHgwNywgMHgwQSwgMHgwQiwgMHgwRSwgMHgwRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMiwgMHgxMywgMHgxNiwgMHgxNywgMHgxQSwgMHgxQiwgMHgxRSwgMHgxRikpOworI2VuZGlmCit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19wYWNrKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIHNob3J0KXZlY19wZXJtKAorICAgICAgX19hLCBfX2IsCisgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDB4MDAsIDB4MDEsIDB4MDQsIDB4MDUsIDB4MDgsIDB4MDksIDB4MEMsIDB4MEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAsIDB4MTEsIDB4MTQsIDB4MTUsIDB4MTgsIDB4MTksIDB4MUMsIDB4MUQpKTsKKyNlbHNlCisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIHNob3J0KXZlY19wZXJtKAorICAgICAgX19hLCBfX2IsCisgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDB4MDIsIDB4MDMsIDB4MDYsIDB4MDcsIDB4MEEsIDB4MEIsIDB4MEUsIDB4MEYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTIsIDB4MTMsIDB4MTYsIDB4MTcsIDB4MUEsIDB4MUIsIDB4MUUsIDB4MUYpKTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBzaG9ydCBfX0FUVFJTX29fYWkgdmVjX3BhY2sodmVjdG9yIGJvb2wgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBzaG9ydCl2ZWNfcGVybSgKKyAgICAgIF9fYSwgX19iLAorICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgweDAwLCAweDAxLCAweDA0LCAweDA1LCAweDA4LCAweDA5LCAweDBDLCAweDBELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwLCAweDExLCAweDE0LCAweDE1LCAweDE4LCAweDE5LCAweDFDLCAweDFEKSk7CisjZWxzZQorICByZXR1cm4gKHZlY3RvciBib29sIHNob3J0KXZlY19wZXJtKAorICAgICAgX19hLCBfX2IsCisgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDB4MDIsIDB4MDMsIDB4MDYsIDB4MDcsIDB4MEEsIDB4MEIsIDB4MEUsIDB4MEYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTIsIDB4MTMsIDB4MTYsIDB4MTcsIDB4MUEsIDB4MUIsIDB4MUUsIDB4MUYpKTsKKyNlbmRpZgorfQorCisjaWZkZWYgX19WU1hfXworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfcGFjayh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYikgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBpbnQpdmVjX3Blcm0oCisgICAgICBfX2EsIF9fYiwKKyAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxOCwgMHgxOSwgMHgxQSwgMHgxQikpOworI2Vsc2UKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGludCl2ZWNfcGVybSgKKyAgICAgIF9fYSwgX19iLAorICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDBDLCAweDBELCAweDBFLCAweDBGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0LCAweDE1LCAweDE2LCAweDE3LCAweDFDLCAweDFELCAweDFFLCAweDFGKSk7CisjZW5kaWYKK30KK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfcGFjayh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBpbnQpdmVjX3Blcm0oCisgICAgICBfX2EsIF9fYiwKKyAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxOCwgMHgxOSwgMHgxQSwgMHgxQikpOworI2Vsc2UKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgaW50KXZlY19wZXJtKAorICAgICAgX19hLCBfX2IsCisgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIDB4MUMsIDB4MUQsIDB4MUUsIDB4MUYpKTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBpbnQgX19BVFRSU19vX2FpCit2ZWNfcGFjayh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19iKSB7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBpbnQpdmVjX3Blcm0oCisgICAgICBfX2EsIF9fYiwKKyAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxOCwgMHgxOSwgMHgxQSwgMHgxQikpOworI2Vsc2UKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBpbnQpdmVjX3Blcm0oCisgICAgICBfX2EsIF9fYiwKKyAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwQywgMHgwRCwgMHgwRSwgMHgwRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgMHgxQywgMHgxRCwgMHgxRSwgMHgxRikpOworI2VuZGlmCit9CisKKyNlbmRpZgorCisvKiB2ZWNfdnBrdWh1bSAqLworCisjZGVmaW5lIF9fYnVpbHRpbl9hbHRpdmVjX3Zwa3VodW0gdmVjX3Zwa3VodW0KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3Zwa3VodW0odmVjdG9yIHNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBzaWduZWQgc2hvcnQgX19iKSB7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGNoYXIpdmVjX3Blcm0oCisgICAgICBfX2EsIF9fYiwKKyAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMHgwMCwgMHgwMiwgMHgwNCwgMHgwNiwgMHgwOCwgMHgwQSwgMHgwQywgMHgwRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMCwgMHgxMiwgMHgxNCwgMHgxNiwgMHgxOCwgMHgxQSwgMHgxQywgMHgxRSkpOworI2Vsc2UKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGNoYXIpdmVjX3Blcm0oCisgICAgICBfX2EsIF9fYiwKKyAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMHgwMSwgMHgwMywgMHgwNSwgMHgwNywgMHgwOSwgMHgwQiwgMHgwRCwgMHgwRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMSwgMHgxMywgMHgxNSwgMHgxNywgMHgxOSwgMHgxQiwgMHgxRCwgMHgxRikpOworI2VuZGlmCit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3Zwa3VodW0odmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGNoYXIpdmVjX3Blcm0oCisgICAgICBfX2EsIF9fYiwKKyAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMHgwMCwgMHgwMiwgMHgwNCwgMHgwNiwgMHgwOCwgMHgwQSwgMHgwQywgMHgwRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMCwgMHgxMiwgMHgxNCwgMHgxNiwgMHgxOCwgMHgxQSwgMHgxQywgMHgxRSkpOworI2Vsc2UKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgY2hhcil2ZWNfcGVybSgKKyAgICAgIF9fYSwgX19iLAorICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgweDAxLCAweDAzLCAweDA1LCAweDA3LCAweDA5LCAweDBCLCAweDBELCAweDBGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDExLCAweDEzLCAweDE1LCAweDE3LCAweDE5LCAweDFCLCAweDFELCAweDFGKSk7CisjZW5kaWYKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgY2hhciBfX0FUVFJTX29fYWkKK3ZlY192cGt1aHVtKHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBjaGFyKXZlY19wZXJtKAorICAgICAgX19hLCBfX2IsCisgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDB4MDAsIDB4MDIsIDB4MDQsIDB4MDYsIDB4MDgsIDB4MEEsIDB4MEMsIDB4MEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAsIDB4MTIsIDB4MTQsIDB4MTYsIDB4MTgsIDB4MUEsIDB4MUMsIDB4MUUpKTsKKyNlbHNlCisgIHJldHVybiAodmVjdG9yIGJvb2wgY2hhcil2ZWNfcGVybSgKKyAgICAgIF9fYSwgX19iLAorICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgweDAxLCAweDAzLCAweDA1LCAweDA3LCAweDA5LCAweDBCLCAweDBELCAweDBGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDExLCAweDEzLCAweDE1LCAweDE3LCAweDE5LCAweDFCLCAweDFELCAweDFGKSk7CisjZW5kaWYKK30KKworLyogdmVjX3Zwa3V3dW0gKi8KKworI2RlZmluZSBfX2J1aWx0aW5fYWx0aXZlY192cGt1d3VtIHZlY192cGt1d3VtCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaG9ydCBfX0FUVFJTX29fYWkgdmVjX3Zwa3V3dW0odmVjdG9yIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBpbnQgX19iKSB7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKyAgcmV0dXJuICh2ZWN0b3Igc2hvcnQpdmVjX3Blcm0oCisgICAgICBfX2EsIF9fYiwKKyAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMHgwMCwgMHgwMSwgMHgwNCwgMHgwNSwgMHgwOCwgMHgwOSwgMHgwQywgMHgwRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMCwgMHgxMSwgMHgxNCwgMHgxNSwgMHgxOCwgMHgxOSwgMHgxQywgMHgxRCkpOworI2Vsc2UKKyAgcmV0dXJuICh2ZWN0b3Igc2hvcnQpdmVjX3Blcm0oCisgICAgICBfX2EsIF9fYiwKKyAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMHgwMiwgMHgwMywgMHgwNiwgMHgwNywgMHgwQSwgMHgwQiwgMHgwRSwgMHgwRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMiwgMHgxMywgMHgxNiwgMHgxNywgMHgxQSwgMHgxQiwgMHgxRSwgMHgxRikpOworI2VuZGlmCit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY192cGt1d3VtKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIHNob3J0KXZlY19wZXJtKAorICAgICAgX19hLCBfX2IsCisgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDB4MDAsIDB4MDEsIDB4MDQsIDB4MDUsIDB4MDgsIDB4MDksIDB4MEMsIDB4MEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAsIDB4MTEsIDB4MTQsIDB4MTUsIDB4MTgsIDB4MTksIDB4MUMsIDB4MUQpKTsKKyNlbHNlCisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIHNob3J0KXZlY19wZXJtKAorICAgICAgX19hLCBfX2IsCisgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDB4MDIsIDB4MDMsIDB4MDYsIDB4MDcsIDB4MEEsIDB4MEIsIDB4MEUsIDB4MEYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTIsIDB4MTMsIDB4MTYsIDB4MTcsIDB4MUEsIDB4MUIsIDB4MUUsIDB4MUYpKTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY192cGt1d3VtKHZlY3RvciBib29sIGludCBfX2EsIHZlY3RvciBib29sIGludCBfX2IpIHsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworICByZXR1cm4gKHZlY3RvciBib29sIHNob3J0KXZlY19wZXJtKAorICAgICAgX19hLCBfX2IsCisgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDB4MDAsIDB4MDEsIDB4MDQsIDB4MDUsIDB4MDgsIDB4MDksIDB4MEMsIDB4MEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAsIDB4MTEsIDB4MTQsIDB4MTUsIDB4MTgsIDB4MTksIDB4MUMsIDB4MUQpKTsKKyNlbHNlCisgIHJldHVybiAodmVjdG9yIGJvb2wgc2hvcnQpdmVjX3Blcm0oCisgICAgICBfX2EsIF9fYiwKKyAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMHgwMiwgMHgwMywgMHgwNiwgMHgwNywgMHgwQSwgMHgwQiwgMHgwRSwgMHgwRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMiwgMHgxMywgMHgxNiwgMHgxNywgMHgxQSwgMHgxQiwgMHgxRSwgMHgxRikpOworI2VuZGlmCit9CisKKy8qIHZlY192cGt1ZHVtICovCisKKyNpZmRlZiBfX1BPV0VSOF9WRUNUT1JfXworI2RlZmluZSBfX2J1aWx0aW5fYWx0aXZlY192cGt1ZHVtIHZlY192cGt1ZHVtCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY192cGt1ZHVtKHZlY3RvciBsb25nIGxvbmcgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGxvbmcgbG9uZyBfX2IpIHsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworICByZXR1cm4gKHZlY3RvciBpbnQpdmVjX3Blcm0oCisgICAgICBfX2EsIF9fYiwKKyAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxOCwgMHgxOSwgMHgxQSwgMHgxQikpOworI2Vsc2UKKyAgcmV0dXJuICh2ZWN0b3IgaW50KXZlY19wZXJtKAorICAgICAgX19hLCBfX2IsCisgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIDB4MUMsIDB4MUQsIDB4MUUsIDB4MUYpKTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX3Zwa3VkdW0odmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgaW50KXZlY19wZXJtKAorICAgICAgX19hLCBfX2IsCisgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDgsIDB4MDksIDB4MEEsIDB4MEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTgsIDB4MTksIDB4MUEsIDB4MUIpKTsKKyNlbHNlCisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGludCl2ZWNfcGVybSgKKyAgICAgIF9fYSwgX19iLAorICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDBDLCAweDBELCAweDBFLCAweDBGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0LCAweDE1LCAweDE2LCAweDE3LCAweDFDLCAweDFELCAweDFFLCAweDFGKSk7CisjZW5kaWYKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgaW50IF9fQVRUUlNfb19haQordmVjX3Zwa3VkdW0odmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHJldHVybiAodmVjdG9yIGJvb2wgaW50KXZlY19wZXJtKAorICAgICAgKHZlY3RvciBsb25nIGxvbmcpX19hLCAodmVjdG9yIGxvbmcgbG9uZylfX2IsCisgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDgsIDB4MDksIDB4MEEsIDB4MEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTgsIDB4MTksIDB4MUEsIDB4MUIpKTsKKyNlbHNlCisgIHJldHVybiAodmVjdG9yIGJvb2wgaW50KXZlY19wZXJtKAorICAgICAgKHZlY3RvciBsb25nIGxvbmcpX19hLCAodmVjdG9yIGxvbmcgbG9uZylfX2IsCisgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIDB4MUMsIDB4MUQsIDB4MUUsIDB4MUYpKTsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qIHZlY19wYWNrcHggKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHBpeGVsIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKK3ZlY19wYWNrcHgodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKyAgcmV0dXJuICh2ZWN0b3IgcGl4ZWwpX19idWlsdGluX2FsdGl2ZWNfdnBrcHgoX19iLCBfX2EpOworI2Vsc2UKKyAgcmV0dXJuICh2ZWN0b3IgcGl4ZWwpX19idWlsdGluX2FsdGl2ZWNfdnBrcHgoX19hLCBfX2IpOworI2VuZGlmCit9CisKKy8qIHZlY192cGtweCAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgcGl4ZWwgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKQordmVjX3Zwa3B4KHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHJldHVybiAodmVjdG9yIHBpeGVsKV9fYnVpbHRpbl9hbHRpdmVjX3Zwa3B4KF9fYiwgX19hKTsKKyNlbHNlCisgIHJldHVybiAodmVjdG9yIHBpeGVsKV9fYnVpbHRpbl9hbHRpdmVjX3Zwa3B4KF9fYSwgX19iKTsKKyNlbmRpZgorfQorCisvKiB2ZWNfcGFja3MgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haSB2ZWNfcGFja3ModmVjdG9yIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaG9ydCBfX2IpIHsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdnBrc2hzcyhfX2IsIF9fYSk7CisjZWxzZQorICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdnBrc2hzcyhfX2EsIF9fYik7CisjZW5kaWYKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfcGFja3ModmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192cGt1aHVzKF9fYiwgX19hKTsKKyNlbHNlCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192cGt1aHVzKF9fYSwgX19iKTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haSB2ZWNfcGFja3ModmVjdG9yIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGludCBfX2IpIHsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdnBrc3dzcyhfX2IsIF9fYSk7CisjZWxzZQorICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdnBrc3dzcyhfX2EsIF9fYik7CisjZW5kaWYKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX3BhY2tzKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192cGt1d3VzKF9fYiwgX19hKTsKKyNlbHNlCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192cGt1d3VzKF9fYSwgX19iKTsKKyNlbmRpZgorfQorCisjaWZkZWYgX19QT1dFUjhfVkVDVE9SX18KK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY19wYWNrcyh2ZWN0b3IgbG9uZyBsb25nIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgbG9uZyBsb25nIF9fYikgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192cGtzZHNzKF9fYiwgX19hKTsKKyNlbHNlCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192cGtzZHNzKF9fYSwgX19iKTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX3BhY2tzKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYikgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192cGt1ZHVzKF9fYiwgX19hKTsKKyNlbHNlCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192cGt1ZHVzKF9fYSwgX19iKTsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qIHZlY192cGtzaHNzICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpCit2ZWNfdnBrc2hzcyh2ZWN0b3Igc2hvcnQgX19hLCB2ZWN0b3Igc2hvcnQgX19iKSB7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3Zwa3Noc3MoX19iLCBfX2EpOworI2Vsc2UKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3Zwa3Noc3MoX19hLCBfX2IpOworI2VuZGlmCit9CisKKy8qIHZlY192cGtzZHNzICovCisKKyNpZmRlZiBfX1BPV0VSOF9WRUNUT1JfXworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX0FUVFJTX29fYWkgdmVjX3Zwa3Nkc3ModmVjdG9yIGxvbmcgbG9uZyBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgbG9uZyBsb25nIF9fYikgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192cGtzZHNzKF9fYiwgX19hKTsKKyNlbHNlCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192cGtzZHNzKF9fYSwgX19iKTsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qIHZlY192cGt1aHVzICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKK3ZlY192cGt1aHVzKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdnBrdWh1cyhfX2IsIF9fYSk7CisjZWxzZQorICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdnBrdWh1cyhfX2EsIF9fYik7CisjZW5kaWYKK30KKworLyogdmVjX3Zwa3VkdXMgKi8KKworI2lmZGVmIF9fUE9XRVI4X1ZFQ1RPUl9fCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKK3ZlY192cGt1ZHVzKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYikgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192cGt1ZHVzKF9fYiwgX19hKTsKKyNlbHNlCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192cGt1ZHVzKF9fYSwgX19iKTsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qIHZlY192cGtzd3NzICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgc2hvcnQgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKQordmVjX3Zwa3N3c3ModmVjdG9yIGludCBfX2EsIHZlY3RvciBpbnQgX19iKSB7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3Zwa3N3c3MoX19iLCBfX2EpOworI2Vsc2UKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3Zwa3N3c3MoX19hLCBfX2IpOworI2VuZGlmCit9CisKKy8qIHZlY192cGt1d3VzICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpCit2ZWNfdnBrdXd1cyh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdnBrdXd1cyhfX2IsIF9fYSk7CisjZWxzZQorICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdnBrdXd1cyhfX2EsIF9fYik7CisjZW5kaWYKK30KKworLyogdmVjX3BhY2tzdSAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19wYWNrc3UodmVjdG9yIHNob3J0IF9fYSwgdmVjdG9yIHNob3J0IF9fYikgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192cGtzaHVzKF9fYiwgX19hKTsKKyNlbHNlCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192cGtzaHVzKF9fYSwgX19iKTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19wYWNrc3UodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192cGt1aHVzKF9fYiwgX19hKTsKKyNlbHNlCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192cGt1aHVzKF9fYSwgX19iKTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfcGFja3N1KHZlY3RvciBpbnQgX19hLCB2ZWN0b3IgaW50IF9fYikgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192cGtzd3VzKF9fYiwgX19hKTsKKyNlbHNlCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192cGtzd3VzKF9fYSwgX19iKTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfcGFja3N1KHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192cGt1d3VzKF9fYiwgX19hKTsKKyNlbHNlCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192cGt1d3VzKF9fYSwgX19iKTsKKyNlbmRpZgorfQorCisjaWZkZWYgX19QT1dFUjhfVkVDVE9SX18KK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfcGFja3N1KHZlY3RvciBsb25nIGxvbmcgX19hLCB2ZWN0b3IgbG9uZyBsb25nIF9fYikgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192cGtzZHVzKF9fYiwgX19hKTsKKyNlbHNlCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192cGtzZHVzKF9fYSwgX19iKTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX3BhY2tzdSh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdnBrdWR1cyhfX2IsIF9fYSk7CisjZWxzZQorICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdnBrdWR1cyhfX2EsIF9fYik7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKiB2ZWNfdnBrc2h1cyAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY192cGtzaHVzKHZlY3RvciBzaG9ydCBfX2EsIHZlY3RvciBzaG9ydCBfX2IpIHsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdnBrc2h1cyhfX2IsIF9fYSk7CisjZWxzZQorICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdnBrc2h1cyhfX2EsIF9fYik7CisjZW5kaWYKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfdnBrc2h1cyh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3Zwa3VodXMoX19iLCBfX2EpOworI2Vsc2UKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3Zwa3VodXMoX19hLCBfX2IpOworI2VuZGlmCit9CisKKy8qIHZlY192cGtzd3VzICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY192cGtzd3VzKHZlY3RvciBpbnQgX19hLCB2ZWN0b3IgaW50IF9fYikgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192cGtzd3VzKF9fYiwgX19hKTsKKyNlbHNlCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192cGtzd3VzKF9fYSwgX19iKTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfdnBrc3d1cyh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdnBrdXd1cyhfX2IsIF9fYSk7CisjZWxzZQorICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdnBrdXd1cyhfX2EsIF9fYik7CisjZW5kaWYKK30KKworLyogdmVjX3Zwa3NkdXMgKi8KKworI2lmZGVmIF9fUE9XRVI4X1ZFQ1RPUl9fCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX3Zwa3NkdXModmVjdG9yIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBsb25nIGxvbmcgX19iKSB7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3Zwa3NkdXMoX19iLCBfX2EpOworI2Vsc2UKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3Zwa3NkdXMoX19hLCBfX2IpOworI2VuZGlmCit9CisjZW5kaWYKKworLyogdmVjX3Blcm0gKi8KKworLy8gVGhlIHZwZXJtIGluc3RydWN0aW9uIGlzIGRlZmluZWQgYXJjaGl0ZWN0dXJhbGx5IHdpdGggYSBiaWctZW5kaWFuIGJpYXMuCisvLyBGb3IgbGl0dGxlIGVuZGlhbiwgd2Ugc3dhcCB0aGUgaW5wdXQgb3BlcmFuZHMgYW5kIGludmVydCB0aGUgcGVybXV0ZQorLy8gY29udHJvbCB2ZWN0b3IuICBPbmx5IHRoZSByaWdodG1vc3QgNSBiaXRzIG1hdHRlciwgc28gd2UgY291bGQgdXNlCisvLyBhIHZlY3RvciBvZiBhbGwgMzFzIGluc3RlYWQgb2YgYWxsIDI1NXMgdG8gcGVyZm9ybSB0aGUgaW52ZXJzaW9uLgorLy8gSG93ZXZlciwgd2hlbiB0aGUgUENWIGlzIG5vdCBhIGNvbnN0YW50LCB1c2luZyAyNTUgaGFzIGFuIGFkdmFudGFnZQorLy8gaW4gdGhhdCB0aGUgdmVjX3hvciBjYW4gYmUgcmVjb2duaXplZCBhcyBhIHZlY19ub3IgKGFuZCBmb3IgUDggYW5kCisvLyBsYXRlciwgcG9zc2libHkgYSB2ZWNfbmFuZCkuCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkgdmVjX3Blcm0oCisgICAgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYiwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19jKSB7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKyAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19kID0gezI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTV9OworICBfX2QgPSB2ZWNfeG9yKF9fYywgX19kKTsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGNoYXIpX19idWlsdGluX2FsdGl2ZWNfdnBlcm1fNHNpKCh2ZWN0b3IgaW50KV9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYSwgX19kKTsKKyNlbHNlCisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX3ZwZXJtXzRzaSgodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGludClfX2IsIF9fYyk7CisjZW5kaWYKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfcGVybSh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYiwKKyAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYykgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fZCA9IHsyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fTsKKyAgX19kID0gdmVjX3hvcihfX2MsIF9fZCk7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19idWlsdGluX2FsdGl2ZWNfdnBlcm1fNHNpKAorICAgICAgKHZlY3RvciBpbnQpX19iLCAodmVjdG9yIGludClfX2EsIF9fZCk7CisjZWxzZQorICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX3ZwZXJtXzRzaSgKKyAgICAgICh2ZWN0b3IgaW50KV9fYSwgKHZlY3RvciBpbnQpX19iLCBfX2MpOworI2VuZGlmCit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfcGVybSh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIGJvb2wgY2hhciBfX2IsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYykgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fZCA9IHsyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fTsKKyAgX19kID0gdmVjX3hvcihfX2MsIF9fZCk7CisgIHJldHVybiAodmVjdG9yIGJvb2wgY2hhcilfX2J1aWx0aW5fYWx0aXZlY192cGVybV80c2koKHZlY3RvciBpbnQpX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYSwgX19kKTsKKyNlbHNlCisgIHJldHVybiAodmVjdG9yIGJvb2wgY2hhcilfX2J1aWx0aW5fYWx0aXZlY192cGVybV80c2koKHZlY3RvciBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYiwgX19jKTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY19wZXJtKHZlY3RvciBzaWduZWQgc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19jKSB7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKyAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19kID0gezI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTV9OworICBfX2QgPSB2ZWNfeG9yKF9fYywgX19kKTsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIHNob3J0KV9fYnVpbHRpbl9hbHRpdmVjX3ZwZXJtXzRzaSgodmVjdG9yIGludClfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19hLCBfX2QpOworI2Vsc2UKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIHNob3J0KV9fYnVpbHRpbl9hbHRpdmVjX3ZwZXJtXzRzaSgodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iLCBfX2MpOworI2VuZGlmCit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19wZXJtKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IsCisgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2MpIHsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2QgPSB7MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NX07CisgIF9fZCA9IHZlY194b3IoX19jLCBfX2QpOworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2J1aWx0aW5fYWx0aXZlY192cGVybV80c2koCisgICAgICAodmVjdG9yIGludClfX2IsICh2ZWN0b3IgaW50KV9fYSwgX19kKTsKKyNlbHNlCisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYnVpbHRpbl9hbHRpdmVjX3ZwZXJtXzRzaSgKKyAgICAgICh2ZWN0b3IgaW50KV9fYSwgKHZlY3RvciBpbnQpX19iLCBfX2MpOworI2VuZGlmCit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIHNob3J0IF9fQVRUUlNfb19haSB2ZWNfcGVybSgKKyAgICB2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIHZlY3RvciBib29sIHNob3J0IF9fYiwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19jKSB7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKyAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19kID0gezI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTV9OworICBfX2QgPSB2ZWNfeG9yKF9fYywgX19kKTsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBzaG9ydClfX2J1aWx0aW5fYWx0aXZlY192cGVybV80c2koKHZlY3RvciBpbnQpX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGludClfX2EsIF9fZCk7CisjZWxzZQorICByZXR1cm4gKHZlY3RvciBib29sIHNob3J0KV9fYnVpbHRpbl9hbHRpdmVjX3ZwZXJtXzRzaSgodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYiwgX19jKTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgcGl4ZWwgX19BVFRSU19vX2FpIHZlY19wZXJtKHZlY3RvciBwaXhlbCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBwaXhlbCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYykgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fZCA9IHsyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fTsKKyAgX19kID0gdmVjX3hvcihfX2MsIF9fZCk7CisgIHJldHVybiAodmVjdG9yIHBpeGVsKV9fYnVpbHRpbl9hbHRpdmVjX3ZwZXJtXzRzaSgodmVjdG9yIGludClfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGludClfX2EsIF9fZCk7CisjZWxzZQorICByZXR1cm4gKHZlY3RvciBwaXhlbClfX2J1aWx0aW5fYWx0aXZlY192cGVybV80c2koKHZlY3RvciBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iLCBfX2MpOworI2VuZGlmCit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY19wZXJtKHZlY3RvciBzaWduZWQgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaWduZWQgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYykgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fZCA9IHsyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fTsKKyAgX19kID0gdmVjX3hvcihfX2MsIF9fZCk7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBpbnQpX19idWlsdGluX2FsdGl2ZWNfdnBlcm1fNHNpKF9fYiwgX19hLCBfX2QpOworI2Vsc2UKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGludClfX2J1aWx0aW5fYWx0aXZlY192cGVybV80c2koX19hLCBfX2IsIF9fYyk7CisjZW5kaWYKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY19wZXJtKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYiwKKyAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYykgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fZCA9IHsyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fTsKKyAgX19kID0gdmVjX3hvcihfX2MsIF9fZCk7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGludClfX2J1aWx0aW5fYWx0aXZlY192cGVybV80c2koKHZlY3RvciBpbnQpX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYSwgX19kKTsKKyNlbHNlCisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGludClfX2J1aWx0aW5fYWx0aXZlY192cGVybV80c2koKHZlY3RvciBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYiwgX19jKTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBpbnQgX19BVFRSU19vX2FpCit2ZWNfcGVybSh2ZWN0b3IgYm9vbCBpbnQgX19hLCB2ZWN0b3IgYm9vbCBpbnQgX19iLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2MpIHsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2QgPSB7MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NX07CisgIF9fZCA9IHZlY194b3IoX19jLCBfX2QpOworICByZXR1cm4gKHZlY3RvciBib29sIGludClfX2J1aWx0aW5fYWx0aXZlY192cGVybV80c2koKHZlY3RvciBpbnQpX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19hLCBfX2QpOworI2Vsc2UKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBpbnQpX19idWlsdGluX2FsdGl2ZWNfdnBlcm1fNHNpKCh2ZWN0b3IgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYiwgX19jKTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZmxvYXQgX19BVFRSU19vX2FpIHZlY19wZXJtKHZlY3RvciBmbG9hdCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBmbG9hdCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYykgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fZCA9IHsyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fTsKKyAgX19kID0gdmVjX3hvcihfX2MsIF9fZCk7CisgIHJldHVybiAodmVjdG9yIGZsb2F0KV9fYnVpbHRpbl9hbHRpdmVjX3ZwZXJtXzRzaSgodmVjdG9yIGludClfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGludClfX2EsIF9fZCk7CisjZWxzZQorICByZXR1cm4gKHZlY3RvciBmbG9hdClfX2J1aWx0aW5fYWx0aXZlY192cGVybV80c2koKHZlY3RvciBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iLCBfX2MpOworI2VuZGlmCit9CisKKyNpZmRlZiBfX1ZTWF9fCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX3Blcm0odmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2IsCisgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2MpIHsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2QgPSB7MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NX07CisgIF9fZCA9IHZlY194b3IoX19jLCBfX2QpOworICByZXR1cm4gKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYnVpbHRpbl9hbHRpdmVjX3ZwZXJtXzRzaSgKKyAgICAgICh2ZWN0b3IgaW50KV9fYiwgKHZlY3RvciBpbnQpX19hLCBfX2QpOworI2Vsc2UKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZylfX2J1aWx0aW5fYWx0aXZlY192cGVybV80c2koCisgICAgICAodmVjdG9yIGludClfX2EsICh2ZWN0b3IgaW50KV9fYiwgX19jKTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX3Blcm0odmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iLAorICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19jKSB7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKyAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19kID0gezI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTV9OworICBfX2QgPSB2ZWNfeG9yKF9fYywgX19kKTsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYnVpbHRpbl9hbHRpdmVjX3ZwZXJtXzRzaSgKKyAgICAgICh2ZWN0b3IgaW50KV9fYiwgKHZlY3RvciBpbnQpX19hLCBfX2QpOworI2Vsc2UKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYnVpbHRpbl9hbHRpdmVjX3ZwZXJtXzRzaSgKKyAgICAgICh2ZWN0b3IgaW50KV9fYSwgKHZlY3RvciBpbnQpX19iLCBfX2MpOworI2VuZGlmCit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY19wZXJtKHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2IsCisgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2MpIHsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2QgPSB7MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NX07CisgIF9fZCA9IHZlY194b3IoX19jLCBfX2QpOworICByZXR1cm4gKHZlY3RvciBib29sIGxvbmcgbG9uZylfX2J1aWx0aW5fYWx0aXZlY192cGVybV80c2koCisgICAgICAodmVjdG9yIGludClfX2IsICh2ZWN0b3IgaW50KV9fYSwgX19kKTsKKyNlbHNlCisgIHJldHVybiAodmVjdG9yIGJvb2wgbG9uZyBsb25nKV9fYnVpbHRpbl9hbHRpdmVjX3ZwZXJtXzRzaSgKKyAgICAgICh2ZWN0b3IgaW50KV9fYSwgKHZlY3RvciBpbnQpX19iLCBfX2MpOworI2VuZGlmCit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBkb3VibGUgX19BVFRSU19vX2FpCit2ZWNfcGVybSh2ZWN0b3IgZG91YmxlIF9fYSwgdmVjdG9yIGRvdWJsZSBfX2IsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYykgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fZCA9IHsyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fTsKKyAgX19kID0gdmVjX3hvcihfX2MsIF9fZCk7CisgIHJldHVybiAodmVjdG9yIGRvdWJsZSlfX2J1aWx0aW5fYWx0aXZlY192cGVybV80c2koKHZlY3RvciBpbnQpX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYSwgX19kKTsKKyNlbHNlCisgIHJldHVybiAodmVjdG9yIGRvdWJsZSlfX2J1aWx0aW5fYWx0aXZlY192cGVybV80c2koKHZlY3RvciBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYiwgX19jKTsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qIHZlY192cGVybSAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpIHZlY192cGVybSgKKyAgICB2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2MpIHsKKyAgcmV0dXJuIHZlY19wZXJtKF9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY192cGVybSh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYiwKKyAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2MpIHsKKyAgcmV0dXJuIHZlY19wZXJtKF9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBjaGFyIF9fQVRUUlNfb19haSB2ZWNfdnBlcm0oCisgICAgdmVjdG9yIGJvb2wgY2hhciBfX2EsIHZlY3RvciBib29sIGNoYXIgX19iLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2MpIHsKKyAgcmV0dXJuIHZlY19wZXJtKF9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfdnBlcm0odmVjdG9yIHNob3J0IF9fYSwgdmVjdG9yIHNob3J0IF9fYiwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19jKSB7CisgIHJldHVybiB2ZWNfcGVybShfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX3ZwZXJtKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IsCisgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19jKSB7CisgIHJldHVybiB2ZWNfcGVybShfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgc2hvcnQgX19BVFRSU19vX2FpIHZlY192cGVybSgKKyAgICB2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIHZlY3RvciBib29sIHNob3J0IF9fYiwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19jKSB7CisgIHJldHVybiB2ZWNfcGVybShfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHBpeGVsIF9fQVRUUlNfb19haQordmVjX3ZwZXJtKHZlY3RvciBwaXhlbCBfX2EsIHZlY3RvciBwaXhlbCBfX2IsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYykgeworICByZXR1cm4gdmVjX3Blcm0oX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY192cGVybSh2ZWN0b3IgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2MpIHsKKyAgcmV0dXJuIHZlY19wZXJtKF9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX3ZwZXJtKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYiwKKyAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2MpIHsKKyAgcmV0dXJuIHZlY19wZXJtKF9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBpbnQgX19BVFRSU19vX2FpCit2ZWNfdnBlcm0odmVjdG9yIGJvb2wgaW50IF9fYSwgdmVjdG9yIGJvb2wgaW50IF9fYiwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19jKSB7CisgIHJldHVybiB2ZWNfcGVybShfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGZsb2F0IF9fQVRUUlNfb19haQordmVjX3ZwZXJtKHZlY3RvciBmbG9hdCBfX2EsIHZlY3RvciBmbG9hdCBfX2IsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYykgeworICByZXR1cm4gdmVjX3Blcm0oX19hLCBfX2IsIF9fYyk7Cit9CisKKyNpZmRlZiBfX1ZTWF9fCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgbG9uZyBsb25nIF9fQVRUUlNfb19haSB2ZWNfdnBlcm0oCisgICAgdmVjdG9yIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBsb25nIGxvbmcgX19iLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2MpIHsKKyAgcmV0dXJuIHZlY19wZXJtKF9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX3ZwZXJtKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYiwKKyAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2MpIHsKKyAgcmV0dXJuIHZlY19wZXJtKF9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZG91YmxlIF9fQVRUUlNfb19haQordmVjX3ZwZXJtKHZlY3RvciBkb3VibGUgX19hLCB2ZWN0b3IgZG91YmxlIF9fYiwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19jKSB7CisgIHJldHVybiB2ZWNfcGVybShfX2EsIF9fYiwgX19jKTsKK30KKyNlbmRpZgorCisvKiB2ZWNfcmUgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGZsb2F0IF9fQVRUUlNfb19haSB2ZWNfcmUodmVjdG9yIGZsb2F0IF9fYSkgeworI2lmZGVmIF9fVlNYX18KKyAgcmV0dXJuIF9fYnVpbHRpbl92c3hfeHZyZXNwKF9fYSk7CisjZWxzZQorICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdnJlZnAoX19hKTsKKyNlbmRpZgorfQorCisjaWZkZWYgX19WU1hfXworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGRvdWJsZSBfX0FUVFJTX29fYWkgdmVjX3JlKHZlY3RvciBkb3VibGUgX19hKSB7CisgIHJldHVybiBfX2J1aWx0aW5fdnN4X3h2cmVkcChfX2EpOworfQorI2VuZGlmCisKKy8qIHZlY192cmVmcCAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZmxvYXQgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKQordmVjX3ZyZWZwKHZlY3RvciBmbG9hdCBfX2EpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZyZWZwKF9fYSk7Cit9CisKKy8qIHZlY19ybCAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfcmwodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX3ZybGIoKHZlY3RvciBjaGFyKV9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfcmwodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2J1aWx0aW5fYWx0aXZlY192cmxiKCh2ZWN0b3IgY2hhcilfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaG9ydCBfX0FUVFJTX29fYWkgdmVjX3JsKHZlY3RvciBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192cmxoKF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX3JsKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19idWlsdGluX2FsdGl2ZWNfdnJsaCgodmVjdG9yIHNob3J0KV9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX0FUVFJTX29fYWkgdmVjX3JsKHZlY3RvciBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192cmx3KF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY19ybCh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYnVpbHRpbl9hbHRpdmVjX3ZybHcoKHZlY3RvciBpbnQpX19hLCBfX2IpOworfQorCisjaWZkZWYgX19QT1dFUjhfVkVDVE9SX18KK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX3JsKHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZybGQoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX3JsKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdnJsZChfX2EsIF9fYik7Cit9CisjZW5kaWYKKworLyogdmVjX3ZybGIgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3ZybGIodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX3ZybGIoKHZlY3RvciBjaGFyKV9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfdnJsYih2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX3ZybGIoKHZlY3RvciBjaGFyKV9fYSwgX19iKTsKK30KKworLyogdmVjX3ZybGggKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNob3J0IF9fQVRUUlNfb19haQordmVjX3ZybGgodmVjdG9yIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdnJsaChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY192cmxoKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19idWlsdGluX2FsdGl2ZWNfdnJsaCgodmVjdG9yIHNob3J0KV9fYSwgX19iKTsKK30KKworLyogdmVjX3ZybHcgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX0FUVFJTX29fYWkgdmVjX3ZybHcodmVjdG9yIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdnJsdyhfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfdnJsdyh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYnVpbHRpbl9hbHRpdmVjX3ZybHcoKHZlY3RvciBpbnQpX19hLCBfX2IpOworfQorCisvKiB2ZWNfcm91bmQgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGZsb2F0IF9fQVRUUlNfb19haSB2ZWNfcm91bmQodmVjdG9yIGZsb2F0IF9fYSkgeworI2lmZGVmIF9fVlNYX18KKyAgcmV0dXJuIF9fYnVpbHRpbl92c3hfeHZyc3BpKF9fYSk7CisjZWxzZQorICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdnJmaW4oX19hKTsKKyNlbmRpZgorfQorCisjaWZkZWYgX19WU1hfXworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGRvdWJsZSBfX0FUVFJTX29fYWkgdmVjX3JvdW5kKHZlY3RvciBkb3VibGUgX19hKSB7CisgIHJldHVybiBfX2J1aWx0aW5fdnN4X3h2cmRwaShfX2EpOworfQorCisvKiB2ZWNfcmludCAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZmxvYXQgX19BVFRSU19vX2FpIHZlY19yaW50KHZlY3RvciBmbG9hdCBfX2EpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl92c3hfeHZyc3BpYyhfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZG91YmxlIF9fQVRUUlNfb19haSB2ZWNfcmludCh2ZWN0b3IgZG91YmxlIF9fYSkgeworICByZXR1cm4gX19idWlsdGluX3ZzeF94dnJkcGljKF9fYSk7Cit9CisKKy8qIHZlY19uZWFyYnlpbnQgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGZsb2F0IF9fQVRUUlNfb19haSB2ZWNfbmVhcmJ5aW50KHZlY3RvciBmbG9hdCBfX2EpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl92c3hfeHZyc3BpKF9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBkb3VibGUgX19BVFRSU19vX2FpIHZlY19uZWFyYnlpbnQodmVjdG9yIGRvdWJsZSBfX2EpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl92c3hfeHZyZHBpKF9fYSk7Cit9CisjZW5kaWYKKworLyogdmVjX3ZyZmluICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBmbG9hdCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpCit2ZWNfdnJmaW4odmVjdG9yIGZsb2F0IF9fYSkgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdnJmaW4oX19hKTsKK30KKworLyogdmVjX3NxcnQgKi8KKworI2lmZGVmIF9fVlNYX18KK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBmbG9hdCBfX0FUVFJTX29fYWkgdmVjX3NxcnQodmVjdG9yIGZsb2F0IF9fYSkgeworICByZXR1cm4gX19idWlsdGluX3ZzeF94dnNxcnRzcChfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZG91YmxlIF9fQVRUUlNfb19haSB2ZWNfc3FydCh2ZWN0b3IgZG91YmxlIF9fYSkgeworICByZXR1cm4gX19idWlsdGluX3ZzeF94dnNxcnRkcChfX2EpOworfQorI2VuZGlmCisKKy8qIHZlY19yc3FydGUgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGZsb2F0IF9fQVRUUlNfb19haSB2ZWNfcnNxcnRlKHZlY3RvciBmbG9hdCBfX2EpIHsKKyNpZmRlZiBfX1ZTWF9fCisgIHJldHVybiBfX2J1aWx0aW5fdnN4X3h2cnNxcnRlc3AoX19hKTsKKyNlbHNlCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192cnNxcnRlZnAoX19hKTsKKyNlbmRpZgorfQorCisjaWZkZWYgX19WU1hfXworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGRvdWJsZSBfX0FUVFJTX29fYWkgdmVjX3JzcXJ0ZSh2ZWN0b3IgZG91YmxlIF9fYSkgeworICByZXR1cm4gX19idWlsdGluX3ZzeF94dnJzcXJ0ZWRwKF9fYSk7Cit9CisjZW5kaWYKKworLyogdmVjX3Zyc3FydGVmcCAqLworCitzdGF0aWMgX19pbmxpbmVfXyBfX3ZlY3RvciBmbG9hdCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpCit2ZWNfdnJzcXJ0ZWZwKHZlY3RvciBmbG9hdCBfX2EpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3Zyc3FydGVmcChfX2EpOworfQorCisvKiB2ZWNfc2VsICovCisKKyNkZWZpbmUgX19idWlsdGluX2FsdGl2ZWNfdnNlbF80c2kgdmVjX3NlbAorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpIHZlY19zZWwoCisgICAgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYiwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19jKSB7CisgIHJldHVybiAoX19hICYgfih2ZWN0b3Igc2lnbmVkIGNoYXIpX19jKSB8IChfX2IgJiAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19zZWwodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYiwgdmVjdG9yIGJvb2wgY2hhciBfX2MpIHsKKyAgcmV0dXJuIChfX2EgJiB+KHZlY3RvciBzaWduZWQgY2hhcilfX2MpIHwgKF9fYiAmICh2ZWN0b3Igc2lnbmVkIGNoYXIpX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfc2VsKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iLAorICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2MpIHsKKyAgcmV0dXJuIChfX2EgJiB+X19jKSB8IChfX2IgJiBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkgdmVjX3NlbCgKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYiwgdmVjdG9yIGJvb2wgY2hhciBfX2MpIHsKKyAgcmV0dXJuIChfX2EgJiB+KHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYykgfCAoX19iICYgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfc2VsKHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3IgYm9vbCBjaGFyIF9fYiwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19jKSB7CisgIHJldHVybiAoX19hICYgfih2ZWN0b3IgYm9vbCBjaGFyKV9fYykgfCAoX19iICYgKHZlY3RvciBib29sIGNoYXIpX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgY2hhciBfX0FUVFJTX29fYWkgdmVjX3NlbCh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgY2hhciBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGNoYXIgX19jKSB7CisgIHJldHVybiAoX19hICYgfl9fYykgfCAoX19iICYgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNob3J0IF9fQVRUUlNfb19haSB2ZWNfc2VsKHZlY3RvciBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNob3J0IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19jKSB7CisgIHJldHVybiAoX19hICYgfih2ZWN0b3Igc2hvcnQpX19jKSB8IChfX2IgJiAodmVjdG9yIHNob3J0KV9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaG9ydCBfX0FUVFJTX29fYWkgdmVjX3NlbCh2ZWN0b3Igc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaG9ydCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgc2hvcnQgX19jKSB7CisgIHJldHVybiAoX19hICYgfih2ZWN0b3Igc2hvcnQpX19jKSB8IChfX2IgJiAodmVjdG9yIHNob3J0KV9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19zZWwodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYiwKKyAgICAgICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYykgeworICByZXR1cm4gKF9fYSAmIH5fX2MpIHwgKF9fYiAmIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19zZWwodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYiwKKyAgICAgICAgdmVjdG9yIGJvb2wgc2hvcnQgX19jKSB7CisgIHJldHVybiAoX19hICYgfih2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19jKSB8CisgICAgICAgICAoX19iICYgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBzaG9ydCBfX0FUVFJTX29fYWkgdmVjX3NlbCgKKyAgICB2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIHZlY3RvciBib29sIHNob3J0IF9fYiwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYykgeworICByZXR1cm4gKF9fYSAmIH4odmVjdG9yIGJvb2wgc2hvcnQpX19jKSB8IChfX2IgJiAodmVjdG9yIGJvb2wgc2hvcnQpX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfc2VsKHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIGJvb2wgc2hvcnQgX19iLCB2ZWN0b3IgYm9vbCBzaG9ydCBfX2MpIHsKKyAgcmV0dXJuIChfX2EgJiB+X19jKSB8IChfX2IgJiBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfc2VsKHZlY3RvciBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGludCBfX2MpIHsKKyAgcmV0dXJuIChfX2EgJiB+KHZlY3RvciBpbnQpX19jKSB8IChfX2IgJiAodmVjdG9yIGludClfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfc2VsKHZlY3RvciBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgaW50IF9fYykgeworICByZXR1cm4gKF9fYSAmIH4odmVjdG9yIGludClfX2MpIHwgKF9fYiAmICh2ZWN0b3IgaW50KV9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpIHZlY19zZWwoCisgICAgdmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYykgeworICByZXR1cm4gKF9fYSAmIH5fX2MpIHwgKF9fYiAmIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfc2VsKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYiwgdmVjdG9yIGJvb2wgaW50IF9fYykgeworICByZXR1cm4gKF9fYSAmIH4odmVjdG9yIHVuc2lnbmVkIGludClfX2MpIHwgKF9fYiAmICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGludCBfX0FUVFJTX29fYWkKK3ZlY19zZWwodmVjdG9yIGJvb2wgaW50IF9fYSwgdmVjdG9yIGJvb2wgaW50IF9fYiwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2MpIHsKKyAgcmV0dXJuIChfX2EgJiB+KHZlY3RvciBib29sIGludClfX2MpIHwgKF9fYiAmICh2ZWN0b3IgYm9vbCBpbnQpX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgaW50IF9fQVRUUlNfb19haSB2ZWNfc2VsKHZlY3RvciBib29sIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBpbnQgX19jKSB7CisgIHJldHVybiAoX19hICYgfl9fYykgfCAoX19iICYgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGZsb2F0IF9fQVRUUlNfb19haSB2ZWNfc2VsKHZlY3RvciBmbG9hdCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGZsb2F0IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYykgeworICB2ZWN0b3IgaW50IF9fcmVzID0gKCh2ZWN0b3IgaW50KV9fYSAmIH4odmVjdG9yIGludClfX2MpIHwKKyAgICAgICAgICAgICAgICAgICAgICgodmVjdG9yIGludClfX2IgJiAodmVjdG9yIGludClfX2MpOworICByZXR1cm4gKHZlY3RvciBmbG9hdClfX3JlczsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGZsb2F0IF9fQVRUUlNfb19haSB2ZWNfc2VsKHZlY3RvciBmbG9hdCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGZsb2F0IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBpbnQgX19jKSB7CisgIHZlY3RvciBpbnQgX19yZXMgPSAoKHZlY3RvciBpbnQpX19hICYgfih2ZWN0b3IgaW50KV9fYykgfAorICAgICAgICAgICAgICAgICAgICAgKCh2ZWN0b3IgaW50KV9fYiAmICh2ZWN0b3IgaW50KV9fYyk7CisgIHJldHVybiAodmVjdG9yIGZsb2F0KV9fcmVzOworfQorCisjaWZkZWYgX19WU1hfXworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGRvdWJsZSBfX0FUVFJTX29fYWkKK3ZlY19zZWwodmVjdG9yIGRvdWJsZSBfX2EsIHZlY3RvciBkb3VibGUgX19iLCB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19jKSB7CisgIHZlY3RvciBsb25nIGxvbmcgX19yZXMgPSAoKHZlY3RvciBsb25nIGxvbmcpX19hICYgfih2ZWN0b3IgbG9uZyBsb25nKV9fYykgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh2ZWN0b3IgbG9uZyBsb25nKV9fYiAmICh2ZWN0b3IgbG9uZyBsb25nKV9fYyk7CisgIHJldHVybiAodmVjdG9yIGRvdWJsZSlfX3JlczsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGRvdWJsZSBfX0FUVFJTX29fYWkKK3ZlY19zZWwodmVjdG9yIGRvdWJsZSBfX2EsIHZlY3RvciBkb3VibGUgX19iLCB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYykgeworICB2ZWN0b3IgbG9uZyBsb25nIF9fcmVzID0gKCh2ZWN0b3IgbG9uZyBsb25nKV9fYSAmIH4odmVjdG9yIGxvbmcgbG9uZylfX2MpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgodmVjdG9yIGxvbmcgbG9uZylfX2IgJiAodmVjdG9yIGxvbmcgbG9uZylfX2MpOworICByZXR1cm4gKHZlY3RvciBkb3VibGUpX19yZXM7Cit9CisjZW5kaWYKKworLyogdmVjX3ZzZWwgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haSB2ZWNfdnNlbCgKKyAgICB2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2MpIHsKKyAgcmV0dXJuIChfX2EgJiB+KHZlY3RvciBzaWduZWQgY2hhcilfX2MpIHwgKF9fYiAmICh2ZWN0b3Igc2lnbmVkIGNoYXIpX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3ZzZWwodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYiwgdmVjdG9yIGJvb2wgY2hhciBfX2MpIHsKKyAgcmV0dXJuIChfX2EgJiB+KHZlY3RvciBzaWduZWQgY2hhcilfX2MpIHwgKF9fYiAmICh2ZWN0b3Igc2lnbmVkIGNoYXIpX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfdnNlbCh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYiwKKyAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYykgeworICByZXR1cm4gKF9fYSAmIH5fX2MpIHwgKF9fYiAmIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haSB2ZWNfdnNlbCgKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYiwgdmVjdG9yIGJvb2wgY2hhciBfX2MpIHsKKyAgcmV0dXJuIChfX2EgJiB+KHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYykgfCAoX19iICYgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfdnNlbCh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIGJvb2wgY2hhciBfX2IsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYykgeworICByZXR1cm4gKF9fYSAmIH4odmVjdG9yIGJvb2wgY2hhcilfX2MpIHwgKF9fYiAmICh2ZWN0b3IgYm9vbCBjaGFyKV9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGNoYXIgX19BVFRSU19vX2FpIHZlY192c2VsKHZlY3RvciBib29sIGNoYXIgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgY2hhciBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBjaGFyIF9fYykgeworICByZXR1cm4gKF9fYSAmIH5fX2MpIHwgKF9fYiAmIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY192c2VsKHZlY3RvciBzaG9ydCBfX2EsIHZlY3RvciBzaG9ydCBfX2IsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2MpIHsKKyAgcmV0dXJuIChfX2EgJiB+KHZlY3RvciBzaG9ydClfX2MpIHwgKF9fYiAmICh2ZWN0b3Igc2hvcnQpX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNob3J0IF9fQVRUUlNfb19haSB2ZWNfdnNlbCh2ZWN0b3Igc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2hvcnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBzaG9ydCBfX2MpIHsKKyAgcmV0dXJuIChfX2EgJiB+KHZlY3RvciBzaG9ydClfX2MpIHwgKF9fYiAmICh2ZWN0b3Igc2hvcnQpX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX3ZzZWwodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYiwKKyAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2MpIHsKKyAgcmV0dXJuIChfX2EgJiB+X19jKSB8IChfX2IgJiBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfdnNlbCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iLAorICAgICAgICAgdmVjdG9yIGJvb2wgc2hvcnQgX19jKSB7CisgIHJldHVybiAoX19hICYgfih2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19jKSB8CisgICAgICAgICAoX19iICYgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBzaG9ydCBfX0FUVFJTX29fYWkgdmVjX3ZzZWwoCisgICAgdmVjdG9yIGJvb2wgc2hvcnQgX19hLCB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2MpIHsKKyAgcmV0dXJuIChfX2EgJiB+KHZlY3RvciBib29sIHNob3J0KV9fYykgfCAoX19iICYgKHZlY3RvciBib29sIHNob3J0KV9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIHNob3J0IF9fQVRUUlNfb19haQordmVjX3ZzZWwodmVjdG9yIGJvb2wgc2hvcnQgX19hLCB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IsIHZlY3RvciBib29sIHNob3J0IF9fYykgeworICByZXR1cm4gKF9fYSAmIH5fX2MpIHwgKF9fYiAmIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY192c2VsKHZlY3RvciBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYykgeworICByZXR1cm4gKF9fYSAmIH4odmVjdG9yIGludClfX2MpIHwgKF9fYiAmICh2ZWN0b3IgaW50KV9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY192c2VsKHZlY3RvciBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBpbnQgX19jKSB7CisgIHJldHVybiAoX19hICYgfih2ZWN0b3IgaW50KV9fYykgfCAoX19iICYgKHZlY3RvciBpbnQpX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkgdmVjX3ZzZWwoCisgICAgdmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYykgeworICByZXR1cm4gKF9fYSAmIH5fX2MpIHwgKF9fYiAmIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpIHZlY192c2VsKAorICAgIHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYiwgdmVjdG9yIGJvb2wgaW50IF9fYykgeworICByZXR1cm4gKF9fYSAmIH4odmVjdG9yIHVuc2lnbmVkIGludClfX2MpIHwgKF9fYiAmICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGludCBfX0FUVFJTX29fYWkKK3ZlY192c2VsKHZlY3RvciBib29sIGludCBfX2EsIHZlY3RvciBib29sIGludCBfX2IsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19jKSB7CisgIHJldHVybiAoX19hICYgfih2ZWN0b3IgYm9vbCBpbnQpX19jKSB8IChfX2IgJiAodmVjdG9yIGJvb2wgaW50KV9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGludCBfX0FUVFJTX29fYWkgdmVjX3ZzZWwodmVjdG9yIGJvb2wgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgaW50IF9fYykgeworICByZXR1cm4gKF9fYSAmIH5fX2MpIHwgKF9fYiAmIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBmbG9hdCBfX0FUVFJTX29fYWkgdmVjX3ZzZWwodmVjdG9yIGZsb2F0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGZsb2F0IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGludCBfX2MpIHsKKyAgdmVjdG9yIGludCBfX3JlcyA9ICgodmVjdG9yIGludClfX2EgJiB+KHZlY3RvciBpbnQpX19jKSB8CisgICAgICAgICAgICAgICAgICAgICAoKHZlY3RvciBpbnQpX19iICYgKHZlY3RvciBpbnQpX19jKTsKKyAgcmV0dXJuICh2ZWN0b3IgZmxvYXQpX19yZXM7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBmbG9hdCBfX0FUVFJTX29fYWkgdmVjX3ZzZWwodmVjdG9yIGZsb2F0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGZsb2F0IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgaW50IF9fYykgeworICB2ZWN0b3IgaW50IF9fcmVzID0gKCh2ZWN0b3IgaW50KV9fYSAmIH4odmVjdG9yIGludClfX2MpIHwKKyAgICAgICAgICAgICAgICAgICAgICgodmVjdG9yIGludClfX2IgJiAodmVjdG9yIGludClfX2MpOworICByZXR1cm4gKHZlY3RvciBmbG9hdClfX3JlczsKK30KKworLyogdmVjX3NsICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19zbCh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYSA8PCAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfc2wodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYSA8PCBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaG9ydCBfX0FUVFJTX29fYWkgdmVjX3NsKHZlY3RvciBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2EgPDwgKHZlY3RvciBzaG9ydClfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19zbCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2EgPDwgX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfc2wodmVjdG9yIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYSA8PCAodmVjdG9yIGludClfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfc2wodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiBfX2EgPDwgX19iOworfQorCisjaWZkZWYgX19QT1dFUjhfVkVDVE9SX18KK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX3NsKHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYSA8PCAodmVjdG9yIGxvbmcgbG9uZylfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfc2wodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2EgPDwgX19iOworfQorI2VuZGlmCisKKy8qIHZlY192c2xiICovCisKKyNkZWZpbmUgX19idWlsdGluX2FsdGl2ZWNfdnNsYiB2ZWNfdnNsYgorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfdnNsYih2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIHZlY19zbChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3ZzbGIodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIHZlY19zbChfX2EsIF9fYik7Cit9CisKKy8qIHZlY192c2xoICovCisKKyNkZWZpbmUgX19idWlsdGluX2FsdGl2ZWNfdnNsaCB2ZWNfdnNsaAorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfdnNsaCh2ZWN0b3Igc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiB2ZWNfc2woX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfdnNsaCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiB2ZWNfc2woX19hLCBfX2IpOworfQorCisvKiB2ZWNfdnNsdyAqLworCisjZGVmaW5lIF9fYnVpbHRpbl9hbHRpdmVjX3ZzbHcgdmVjX3ZzbHcKKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX0FUVFJTX29fYWkgdmVjX3ZzbHcodmVjdG9yIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gdmVjX3NsKF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY192c2x3KHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gdmVjX3NsKF9fYSwgX19iKTsKK30KKworLyogdmVjX3NsZCAqLworCisjZGVmaW5lIF9fYnVpbHRpbl9hbHRpdmVjX3ZzbGRvaV80c2kgdmVjX3NsZAorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpIHZlY19zbGQoCisgICAgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYiwgdW5zaWduZWQgY29uc3QgaW50IF9fYykgeworICB1bnNpZ25lZCBjaGFyIF9fZCA9IF9fYyAmIDB4MEY7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKyAgcmV0dXJuIHZlY19wZXJtKAorICAgICAgX19iLCBfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMTYgLSBfX2QsIDE3IC0gX19kLCAxOCAtIF9fZCwgMTkgLSBfX2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMCAtIF9fZCwgMjEgLSBfX2QsIDIyIC0gX19kLCAyMyAtIF9fZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0IC0gX19kLCAyNSAtIF9fZCwgMjYgLSBfX2QsIDI3IC0gX19kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjggLSBfX2QsIDI5IC0gX19kLCAzMCAtIF9fZCwgMzEgLSBfX2QpKTsKKyNlbHNlCisgIHJldHVybiB2ZWNfcGVybSgKKyAgICAgIF9fYSwgX19iLAorICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKShfX2QsIF9fZCArIDEsIF9fZCArIDIsIF9fZCArIDMsIF9fZCArIDQsIF9fZCArIDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZCArIDYsIF9fZCArIDcsIF9fZCArIDgsIF9fZCArIDksIF9fZCArIDEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2QgKyAxMSwgX19kICsgMTIsIF9fZCArIDEzLCBfX2QgKyAxNCwgX19kICsgMTUpKTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19zbGQodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IsCisgICAgICAgIHVuc2lnbmVkIGNvbnN0IGludCBfX2MpIHsKKyAgdW5zaWduZWQgY2hhciBfX2QgPSBfX2MgJiAweDBGOworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHJldHVybiB2ZWNfcGVybSgKKyAgICAgIF9fYiwgX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDE2IC0gX19kLCAxNyAtIF9fZCwgMTggLSBfX2QsIDE5IC0gX19kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAgLSBfX2QsIDIxIC0gX19kLCAyMiAtIF9fZCwgMjMgLSBfX2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNCAtIF9fZCwgMjUgLSBfX2QsIDI2IC0gX19kLCAyNyAtIF9fZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4IC0gX19kLCAyOSAtIF9fZCwgMzAgLSBfX2QsIDMxIC0gX19kKSk7CisjZWxzZQorICByZXR1cm4gdmVjX3Blcm0oCisgICAgICBfX2EsIF9fYiwKKyAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoX19kLCBfX2QgKyAxLCBfX2QgKyAyLCBfX2QgKyAzLCBfX2QgKyA0LCBfX2QgKyA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2QgKyA2LCBfX2QgKyA3LCBfX2QgKyA4LCBfX2QgKyA5LCBfX2QgKyAxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19kICsgMTEsIF9fZCArIDEyLCBfX2QgKyAxMywgX19kICsgMTQsIF9fZCArIDE1KSk7CisjZW5kaWYKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19zbGQodmVjdG9yIGJvb2wgY2hhciBfX2EsIHZlY3RvciBib29sIGNoYXIgX19iLCB1bnNpZ25lZCBjb25zdCBpbnQgX19jKSB7CisgIHVuc2lnbmVkIGNoYXIgX19kID0gX19jICYgMHgwRjsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworICByZXR1cm4gdmVjX3Blcm0oCisgICAgICBfX2IsIF9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgxNiAtIF9fZCwgMTcgLSBfX2QsIDE4IC0gX19kLCAxOSAtIF9fZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwIC0gX19kLCAyMSAtIF9fZCwgMjIgLSBfX2QsIDIzIC0gX19kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQgLSBfX2QsIDI1IC0gX19kLCAyNiAtIF9fZCwgMjcgLSBfX2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOCAtIF9fZCwgMjkgLSBfX2QsIDMwIC0gX19kLCAzMSAtIF9fZCkpOworI2Vsc2UKKyAgcmV0dXJuIHZlY19wZXJtKAorICAgICAgX19hLCBfX2IsCisgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKF9fZCwgX19kICsgMSwgX19kICsgMiwgX19kICsgMywgX19kICsgNCwgX19kICsgNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19kICsgNiwgX19kICsgNywgX19kICsgOCwgX19kICsgOSwgX19kICsgMTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZCArIDExLCBfX2QgKyAxMiwgX19kICsgMTMsIF9fZCArIDE0LCBfX2QgKyAxNSkpOworI2VuZGlmCit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgc2hvcnQgX19BVFRSU19vX2FpIHZlY19zbGQoCisgICAgdmVjdG9yIHNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBzaWduZWQgc2hvcnQgX19iLCB1bnNpZ25lZCBjb25zdCBpbnQgX19jKSB7CisgIHVuc2lnbmVkIGNoYXIgX19kID0gX19jICYgMHgwRjsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworICByZXR1cm4gdmVjX3Blcm0oCisgICAgICBfX2IsIF9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgxNiAtIF9fZCwgMTcgLSBfX2QsIDE4IC0gX19kLCAxOSAtIF9fZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwIC0gX19kLCAyMSAtIF9fZCwgMjIgLSBfX2QsIDIzIC0gX19kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQgLSBfX2QsIDI1IC0gX19kLCAyNiAtIF9fZCwgMjcgLSBfX2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOCAtIF9fZCwgMjkgLSBfX2QsIDMwIC0gX19kLCAzMSAtIF9fZCkpOworI2Vsc2UKKyAgcmV0dXJuIHZlY19wZXJtKAorICAgICAgX19hLCBfX2IsCisgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKF9fZCwgX19kICsgMSwgX19kICsgMiwgX19kICsgMywgX19kICsgNCwgX19kICsgNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19kICsgNiwgX19kICsgNywgX19kICsgOCwgX19kICsgOSwgX19kICsgMTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZCArIDExLCBfX2QgKyAxMiwgX19kICsgMTMsIF9fZCArIDE0LCBfX2QgKyAxNSkpOworI2VuZGlmCit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19zbGQodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYiwKKyAgICAgICAgdW5zaWduZWQgY29uc3QgaW50IF9fYykgeworICB1bnNpZ25lZCBjaGFyIF9fZCA9IF9fYyAmIDB4MEY7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKyAgcmV0dXJuIHZlY19wZXJtKAorICAgICAgX19iLCBfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMTYgLSBfX2QsIDE3IC0gX19kLCAxOCAtIF9fZCwgMTkgLSBfX2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMCAtIF9fZCwgMjEgLSBfX2QsIDIyIC0gX19kLCAyMyAtIF9fZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0IC0gX19kLCAyNSAtIF9fZCwgMjYgLSBfX2QsIDI3IC0gX19kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjggLSBfX2QsIDI5IC0gX19kLCAzMCAtIF9fZCwgMzEgLSBfX2QpKTsKKyNlbHNlCisgIHJldHVybiB2ZWNfcGVybSgKKyAgICAgIF9fYSwgX19iLAorICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKShfX2QsIF9fZCArIDEsIF9fZCArIDIsIF9fZCArIDMsIF9fZCArIDQsIF9fZCArIDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZCArIDYsIF9fZCArIDcsIF9fZCArIDgsIF9fZCArIDksIF9fZCArIDEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2QgKyAxMSwgX19kICsgMTIsIF9fZCArIDEzLCBfX2QgKyAxNCwgX19kICsgMTUpKTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19zbGQodmVjdG9yIGJvb2wgc2hvcnQgX19hLCB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IsIHVuc2lnbmVkIGNvbnN0IGludCBfX2MpIHsKKyAgdW5zaWduZWQgY2hhciBfX2QgPSBfX2MgJiAweDBGOworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHJldHVybiB2ZWNfcGVybSgKKyAgICAgIF9fYiwgX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDE2IC0gX19kLCAxNyAtIF9fZCwgMTggLSBfX2QsIDE5IC0gX19kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAgLSBfX2QsIDIxIC0gX19kLCAyMiAtIF9fZCwgMjMgLSBfX2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNCAtIF9fZCwgMjUgLSBfX2QsIDI2IC0gX19kLCAyNyAtIF9fZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4IC0gX19kLCAyOSAtIF9fZCwgMzAgLSBfX2QsIDMxIC0gX19kKSk7CisjZWxzZQorICByZXR1cm4gdmVjX3Blcm0oCisgICAgICBfX2EsIF9fYiwKKyAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoX19kLCBfX2QgKyAxLCBfX2QgKyAyLCBfX2QgKyAzLCBfX2QgKyA0LCBfX2QgKyA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2QgKyA2LCBfX2QgKyA3LCBfX2QgKyA4LCBfX2QgKyA5LCBfX2QgKyAxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19kICsgMTEsIF9fZCArIDEyLCBfX2QgKyAxMywgX19kICsgMTQsIF9fZCArIDE1KSk7CisjZW5kaWYKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHBpeGVsIF9fQVRUUlNfb19haSB2ZWNfc2xkKHZlY3RvciBwaXhlbCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHBpeGVsIF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjb25zdCBpbnQgX19jKSB7CisgIHVuc2lnbmVkIGNoYXIgX19kID0gX19jICYgMHgwRjsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworICByZXR1cm4gdmVjX3Blcm0oCisgICAgICBfX2IsIF9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgxNiAtIF9fZCwgMTcgLSBfX2QsIDE4IC0gX19kLCAxOSAtIF9fZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwIC0gX19kLCAyMSAtIF9fZCwgMjIgLSBfX2QsIDIzIC0gX19kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQgLSBfX2QsIDI1IC0gX19kLCAyNiAtIF9fZCwgMjcgLSBfX2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOCAtIF9fZCwgMjkgLSBfX2QsIDMwIC0gX19kLCAzMSAtIF9fZCkpOworI2Vsc2UKKyAgcmV0dXJuIHZlY19wZXJtKAorICAgICAgX19hLCBfX2IsCisgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKF9fZCwgX19kICsgMSwgX19kICsgMiwgX19kICsgMywgX19kICsgNCwgX19kICsgNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19kICsgNiwgX19kICsgNywgX19kICsgOCwgX19kICsgOSwgX19kICsgMTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZCArIDExLCBfX2QgKyAxMiwgX19kICsgMTMsIF9fZCArIDE0LCBfX2QgKyAxNSkpOworI2VuZGlmCit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX3NsZCh2ZWN0b3Igc2lnbmVkIGludCBfX2EsIHZlY3RvciBzaWduZWQgaW50IF9fYiwgdW5zaWduZWQgY29uc3QgaW50IF9fYykgeworICB1bnNpZ25lZCBjaGFyIF9fZCA9IF9fYyAmIDB4MEY7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKyAgcmV0dXJuIHZlY19wZXJtKAorICAgICAgX19iLCBfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMTYgLSBfX2QsIDE3IC0gX19kLCAxOCAtIF9fZCwgMTkgLSBfX2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMCAtIF9fZCwgMjEgLSBfX2QsIDIyIC0gX19kLCAyMyAtIF9fZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0IC0gX19kLCAyNSAtIF9fZCwgMjYgLSBfX2QsIDI3IC0gX19kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjggLSBfX2QsIDI5IC0gX19kLCAzMCAtIF9fZCwgMzEgLSBfX2QpKTsKKyNlbHNlCisgIHJldHVybiB2ZWNfcGVybSgKKyAgICAgIF9fYSwgX19iLAorICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKShfX2QsIF9fZCArIDEsIF9fZCArIDIsIF9fZCArIDMsIF9fZCArIDQsIF9fZCArIDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZCArIDYsIF9fZCArIDcsIF9fZCArIDgsIF9fZCArIDksIF9fZCArIDEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2QgKyAxMSwgX19kICsgMTIsIF9fZCArIDEzLCBfX2QgKyAxNCwgX19kICsgMTUpKTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haSB2ZWNfc2xkKAorICAgIHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYiwgdW5zaWduZWQgY29uc3QgaW50IF9fYykgeworICB1bnNpZ25lZCBjaGFyIF9fZCA9IF9fYyAmIDB4MEY7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKyAgcmV0dXJuIHZlY19wZXJtKAorICAgICAgX19iLCBfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMTYgLSBfX2QsIDE3IC0gX19kLCAxOCAtIF9fZCwgMTkgLSBfX2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMCAtIF9fZCwgMjEgLSBfX2QsIDIyIC0gX19kLCAyMyAtIF9fZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0IC0gX19kLCAyNSAtIF9fZCwgMjYgLSBfX2QsIDI3IC0gX19kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjggLSBfX2QsIDI5IC0gX19kLCAzMCAtIF9fZCwgMzEgLSBfX2QpKTsKKyNlbHNlCisgIHJldHVybiB2ZWNfcGVybSgKKyAgICAgIF9fYSwgX19iLAorICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKShfX2QsIF9fZCArIDEsIF9fZCArIDIsIF9fZCArIDMsIF9fZCArIDQsIF9fZCArIDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZCArIDYsIF9fZCArIDcsIF9fZCArIDgsIF9fZCArIDksIF9fZCArIDEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2QgKyAxMSwgX19kICsgMTIsIF9fZCArIDEzLCBfX2QgKyAxNCwgX19kICsgMTUpKTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBpbnQgX19BVFRSU19vX2FpIHZlY19zbGQodmVjdG9yIGJvb2wgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNvbnN0IGludCBfX2MpIHsKKyAgdW5zaWduZWQgY2hhciBfX2QgPSBfX2MgJiAweDBGOworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHJldHVybiB2ZWNfcGVybSgKKyAgICAgIF9fYiwgX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDE2IC0gX19kLCAxNyAtIF9fZCwgMTggLSBfX2QsIDE5IC0gX19kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAgLSBfX2QsIDIxIC0gX19kLCAyMiAtIF9fZCwgMjMgLSBfX2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNCAtIF9fZCwgMjUgLSBfX2QsIDI2IC0gX19kLCAyNyAtIF9fZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4IC0gX19kLCAyOSAtIF9fZCwgMzAgLSBfX2QsIDMxIC0gX19kKSk7CisjZWxzZQorICByZXR1cm4gdmVjX3Blcm0oCisgICAgICBfX2EsIF9fYiwKKyAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoX19kLCBfX2QgKyAxLCBfX2QgKyAyLCBfX2QgKyAzLCBfX2QgKyA0LCBfX2QgKyA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2QgKyA2LCBfX2QgKyA3LCBfX2QgKyA4LCBfX2QgKyA5LCBfX2QgKyAxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19kICsgMTEsIF9fZCArIDEyLCBfX2QgKyAxMywgX19kICsgMTQsIF9fZCArIDE1KSk7CisjZW5kaWYKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGZsb2F0IF9fQVRUUlNfb19haSB2ZWNfc2xkKHZlY3RvciBmbG9hdCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGZsb2F0IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjb25zdCBpbnQgX19jKSB7CisgIHVuc2lnbmVkIGNoYXIgX19kID0gX19jICYgMHgwRjsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworICByZXR1cm4gdmVjX3Blcm0oCisgICAgICBfX2IsIF9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgxNiAtIF9fZCwgMTcgLSBfX2QsIDE4IC0gX19kLCAxOSAtIF9fZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwIC0gX19kLCAyMSAtIF9fZCwgMjIgLSBfX2QsIDIzIC0gX19kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQgLSBfX2QsIDI1IC0gX19kLCAyNiAtIF9fZCwgMjcgLSBfX2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOCAtIF9fZCwgMjkgLSBfX2QsIDMwIC0gX19kLCAzMSAtIF9fZCkpOworI2Vsc2UKKyAgcmV0dXJuIHZlY19wZXJtKAorICAgICAgX19hLCBfX2IsCisgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKF9fZCwgX19kICsgMSwgX19kICsgMiwgX19kICsgMywgX19kICsgNCwgX19kICsgNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19kICsgNiwgX19kICsgNywgX19kICsgOCwgX19kICsgOSwgX19kICsgMTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZCArIDExLCBfX2QgKyAxMiwgX19kICsgMTMsIF9fZCArIDE0LCBfX2QgKyAxNSkpOworI2VuZGlmCit9CisKKy8qIHZlY192c2xkb2kgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3ZzbGRvaSh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iLCB1bnNpZ25lZCBjaGFyIF9fYykgeworICB1bnNpZ25lZCBjaGFyIF9fZCA9IF9fYyAmIDB4MEY7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKyAgcmV0dXJuIHZlY19wZXJtKAorICAgICAgX19iLCBfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMTYgLSBfX2QsIDE3IC0gX19kLCAxOCAtIF9fZCwgMTkgLSBfX2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMCAtIF9fZCwgMjEgLSBfX2QsIDIyIC0gX19kLCAyMyAtIF9fZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0IC0gX19kLCAyNSAtIF9fZCwgMjYgLSBfX2QsIDI3IC0gX19kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjggLSBfX2QsIDI5IC0gX19kLCAzMCAtIF9fZCwgMzEgLSBfX2QpKTsKKyNlbHNlCisgIHJldHVybiB2ZWNfcGVybSgKKyAgICAgIF9fYSwgX19iLAorICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKShfX2QsIF9fZCArIDEsIF9fZCArIDIsIF9fZCArIDMsIF9fZCArIDQsIF9fZCArIDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZCArIDYsIF9fZCArIDcsIF9fZCArIDgsIF9fZCArIDksIF9fZCArIDEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2QgKyAxMSwgX19kICsgMTIsIF9fZCArIDEzLCBfX2QgKyAxNCwgX19kICsgMTUpKTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkgdmVjX3ZzbGRvaSgKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYiwgdW5zaWduZWQgY2hhciBfX2MpIHsKKyAgdW5zaWduZWQgY2hhciBfX2QgPSBfX2MgJiAweDBGOworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHJldHVybiB2ZWNfcGVybSgKKyAgICAgIF9fYiwgX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDE2IC0gX19kLCAxNyAtIF9fZCwgMTggLSBfX2QsIDE5IC0gX19kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAgLSBfX2QsIDIxIC0gX19kLCAyMiAtIF9fZCwgMjMgLSBfX2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNCAtIF9fZCwgMjUgLSBfX2QsIDI2IC0gX19kLCAyNyAtIF9fZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4IC0gX19kLCAyOSAtIF9fZCwgMzAgLSBfX2QsIDMxIC0gX19kKSk7CisjZWxzZQorICByZXR1cm4gdmVjX3Blcm0oCisgICAgICBfX2EsIF9fYiwKKyAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoX19kLCBfX2QgKyAxLCBfX2QgKyAyLCBfX2QgKyAzLCBfX2QgKyA0LCBfX2QgKyA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2QgKyA2LCBfX2QgKyA3LCBfX2QgKyA4LCBfX2QgKyA5LCBfX2QgKyAxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19kICsgMTEsIF9fZCArIDEyLCBfX2QgKyAxMywgX19kICsgMTQsIF9fZCArIDE1KSk7CisjZW5kaWYKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNob3J0IF9fQVRUUlNfb19haSB2ZWNfdnNsZG9pKHZlY3RvciBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNob3J0IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIF9fYykgeworICB1bnNpZ25lZCBjaGFyIF9fZCA9IF9fYyAmIDB4MEY7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKyAgcmV0dXJuIHZlY19wZXJtKAorICAgICAgX19iLCBfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMTYgLSBfX2QsIDE3IC0gX19kLCAxOCAtIF9fZCwgMTkgLSBfX2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMCAtIF9fZCwgMjEgLSBfX2QsIDIyIC0gX19kLCAyMyAtIF9fZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0IC0gX19kLCAyNSAtIF9fZCwgMjYgLSBfX2QsIDI3IC0gX19kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjggLSBfX2QsIDI5IC0gX19kLCAzMCAtIF9fZCwgMzEgLSBfX2QpKTsKKyNlbHNlCisgIHJldHVybiB2ZWNfcGVybSgKKyAgICAgIF9fYSwgX19iLAorICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKShfX2QsIF9fZCArIDEsIF9fZCArIDIsIF9fZCArIDMsIF9fZCArIDQsIF9fZCArIDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZCArIDYsIF9fZCArIDcsIF9fZCArIDgsIF9fZCArIDksIF9fZCArIDEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2QgKyAxMSwgX19kICsgMTIsIF9fZCArIDEzLCBfX2QgKyAxNCwgX19kICsgMTUpKTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpIHZlY192c2xkb2koCisgICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYiwgdW5zaWduZWQgY2hhciBfX2MpIHsKKyAgdW5zaWduZWQgY2hhciBfX2QgPSBfX2MgJiAweDBGOworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHJldHVybiB2ZWNfcGVybSgKKyAgICAgIF9fYiwgX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDE2IC0gX19kLCAxNyAtIF9fZCwgMTggLSBfX2QsIDE5IC0gX19kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAgLSBfX2QsIDIxIC0gX19kLCAyMiAtIF9fZCwgMjMgLSBfX2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNCAtIF9fZCwgMjUgLSBfX2QsIDI2IC0gX19kLCAyNyAtIF9fZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4IC0gX19kLCAyOSAtIF9fZCwgMzAgLSBfX2QsIDMxIC0gX19kKSk7CisjZWxzZQorICByZXR1cm4gdmVjX3Blcm0oCisgICAgICBfX2EsIF9fYiwKKyAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoX19kLCBfX2QgKyAxLCBfX2QgKyAyLCBfX2QgKyAzLCBfX2QgKyA0LCBfX2QgKyA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2QgKyA2LCBfX2QgKyA3LCBfX2QgKyA4LCBfX2QgKyA5LCBfX2QgKyAxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19kICsgMTEsIF9fZCArIDEyLCBfX2QgKyAxMywgX19kICsgMTQsIF9fZCArIDE1KSk7CisjZW5kaWYKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHBpeGVsIF9fQVRUUlNfb19haSB2ZWNfdnNsZG9pKHZlY3RvciBwaXhlbCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHBpeGVsIF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIF9fYykgeworICB1bnNpZ25lZCBjaGFyIF9fZCA9IF9fYyAmIDB4MEY7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKyAgcmV0dXJuIHZlY19wZXJtKAorICAgICAgX19iLCBfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMTYgLSBfX2QsIDE3IC0gX19kLCAxOCAtIF9fZCwgMTkgLSBfX2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMCAtIF9fZCwgMjEgLSBfX2QsIDIyIC0gX19kLCAyMyAtIF9fZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0IC0gX19kLCAyNSAtIF9fZCwgMjYgLSBfX2QsIDI3IC0gX19kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjggLSBfX2QsIDI5IC0gX19kLCAzMCAtIF9fZCwgMzEgLSBfX2QpKTsKKyNlbHNlCisgIHJldHVybiB2ZWNfcGVybSgKKyAgICAgIF9fYSwgX19iLAorICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKShfX2QsIF9fZCArIDEsIF9fZCArIDIsIF9fZCArIDMsIF9fZCArIDQsIF9fZCArIDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZCArIDYsIF9fZCArIDcsIF9fZCArIDgsIF9fZCArIDksIF9fZCArIDEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2QgKyAxMSwgX19kICsgMTIsIF9fZCArIDEzLCBfX2QgKyAxNCwgX19kICsgMTUpKTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfdnNsZG9pKHZlY3RvciBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBfX2MpIHsKKyAgdW5zaWduZWQgY2hhciBfX2QgPSBfX2MgJiAweDBGOworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHJldHVybiB2ZWNfcGVybSgKKyAgICAgIF9fYiwgX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDE2IC0gX19kLCAxNyAtIF9fZCwgMTggLSBfX2QsIDE5IC0gX19kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAgLSBfX2QsIDIxIC0gX19kLCAyMiAtIF9fZCwgMjMgLSBfX2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNCAtIF9fZCwgMjUgLSBfX2QsIDI2IC0gX19kLCAyNyAtIF9fZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4IC0gX19kLCAyOSAtIF9fZCwgMzAgLSBfX2QsIDMxIC0gX19kKSk7CisjZWxzZQorICByZXR1cm4gdmVjX3Blcm0oCisgICAgICBfX2EsIF9fYiwKKyAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoX19kLCBfX2QgKyAxLCBfX2QgKyAyLCBfX2QgKyAzLCBfX2QgKyA0LCBfX2QgKyA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2QgKyA2LCBfX2QgKyA3LCBfX2QgKyA4LCBfX2QgKyA5LCBfX2QgKyAxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19kICsgMTEsIF9fZCArIDEyLCBfX2QgKyAxMywgX19kICsgMTQsIF9fZCArIDE1KSk7CisjZW5kaWYKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkgdmVjX3ZzbGRvaSgKKyAgICB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IsIHVuc2lnbmVkIGNoYXIgX19jKSB7CisgIHVuc2lnbmVkIGNoYXIgX19kID0gX19jICYgMHgwRjsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworICByZXR1cm4gdmVjX3Blcm0oCisgICAgICBfX2IsIF9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgxNiAtIF9fZCwgMTcgLSBfX2QsIDE4IC0gX19kLCAxOSAtIF9fZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwIC0gX19kLCAyMSAtIF9fZCwgMjIgLSBfX2QsIDIzIC0gX19kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQgLSBfX2QsIDI1IC0gX19kLCAyNiAtIF9fZCwgMjcgLSBfX2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOCAtIF9fZCwgMjkgLSBfX2QsIDMwIC0gX19kLCAzMSAtIF9fZCkpOworI2Vsc2UKKyAgcmV0dXJuIHZlY19wZXJtKAorICAgICAgX19hLCBfX2IsCisgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKF9fZCwgX19kICsgMSwgX19kICsgMiwgX19kICsgMywgX19kICsgNCwgX19kICsgNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19kICsgNiwgX19kICsgNywgX19kICsgOCwgX19kICsgOSwgX19kICsgMTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZCArIDExLCBfX2QgKyAxMiwgX19kICsgMTMsIF9fZCArIDE0LCBfX2QgKyAxNSkpOworI2VuZGlmCit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBmbG9hdCBfX0FUVFJTX29fYWkgdmVjX3ZzbGRvaSh2ZWN0b3IgZmxvYXQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBmbG9hdCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBfX2MpIHsKKyAgdW5zaWduZWQgY2hhciBfX2QgPSBfX2MgJiAweDBGOworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHJldHVybiB2ZWNfcGVybSgKKyAgICAgIF9fYiwgX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDE2IC0gX19kLCAxNyAtIF9fZCwgMTggLSBfX2QsIDE5IC0gX19kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAgLSBfX2QsIDIxIC0gX19kLCAyMiAtIF9fZCwgMjMgLSBfX2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNCAtIF9fZCwgMjUgLSBfX2QsIDI2IC0gX19kLCAyNyAtIF9fZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4IC0gX19kLCAyOSAtIF9fZCwgMzAgLSBfX2QsIDMxIC0gX19kKSk7CisjZWxzZQorICByZXR1cm4gdmVjX3Blcm0oCisgICAgICBfX2EsIF9fYiwKKyAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoX19kLCBfX2QgKyAxLCBfX2QgKyAyLCBfX2QgKyAzLCBfX2QgKyA0LCBfX2QgKyA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2QgKyA2LCBfX2QgKyA3LCBfX2QgKyA4LCBfX2QgKyA5LCBfX2QgKyAxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19kICsgMTEsIF9fZCArIDEyLCBfX2QgKyAxMywgX19kICsgMTQsIF9fZCArIDE1KSk7CisjZW5kaWYKK30KKworLyogdmVjX3NsbCAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfc2xsKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgY2hhcilfX2J1aWx0aW5fYWx0aXZlY192c2woKHZlY3RvciBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3NsbCh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX3ZzbCgodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfc2xsKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX3ZzbCgodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19zbGwodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2J1aWx0aW5fYWx0aXZlY192c2woKHZlY3RvciBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19zbGwodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19idWlsdGluX2FsdGl2ZWNfdnNsKCh2ZWN0b3IgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfc2xsKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2J1aWx0aW5fYWx0aXZlY192c2woKHZlY3RvciBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBjaGFyIF9fQVRUUlNfb19haQordmVjX3NsbCh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgY2hhcilfX2J1aWx0aW5fYWx0aXZlY192c2woKHZlY3RvciBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfc2xsKHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgY2hhcilfX2J1aWx0aW5fYWx0aXZlY192c2woKHZlY3RvciBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfc2xsKHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIGNoYXIpX19idWlsdGluX2FsdGl2ZWNfdnNsKCh2ZWN0b3IgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY19zbGwodmVjdG9yIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2hvcnQpX19idWlsdGluX2FsdGl2ZWNfdnNsKCh2ZWN0b3IgaW50KV9fYSwgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNob3J0IF9fQVRUUlNfb19haSB2ZWNfc2xsKHZlY3RvciBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaG9ydClfX2J1aWx0aW5fYWx0aXZlY192c2woKHZlY3RvciBpbnQpX19hLCAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY19zbGwodmVjdG9yIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaG9ydClfX2J1aWx0aW5fYWx0aXZlY192c2woKHZlY3RvciBpbnQpX19hLCAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfc2xsKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2J1aWx0aW5fYWx0aXZlY192c2woKHZlY3RvciBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX3NsbCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYnVpbHRpbl9hbHRpdmVjX3ZzbCgodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfc2xsKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYnVpbHRpbl9hbHRpdmVjX3ZzbCgodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19zbGwodmVjdG9yIGJvb2wgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBzaG9ydClfX2J1aWx0aW5fYWx0aXZlY192c2woKHZlY3RvciBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19zbGwodmVjdG9yIGJvb2wgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgc2hvcnQpX19idWlsdGluX2FsdGl2ZWNfdnNsKCh2ZWN0b3IgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfc2xsKHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBzaG9ydClfX2J1aWx0aW5fYWx0aXZlY192c2woKHZlY3RvciBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgcGl4ZWwgX19BVFRSU19vX2FpIHZlY19zbGwodmVjdG9yIHBpeGVsIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgcGl4ZWwpX19idWlsdGluX2FsdGl2ZWNfdnNsKCh2ZWN0b3IgaW50KV9fYSwgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHBpeGVsIF9fQVRUUlNfb19haSB2ZWNfc2xsKHZlY3RvciBwaXhlbCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gKHZlY3RvciBwaXhlbClfX2J1aWx0aW5fYWx0aXZlY192c2woKHZlY3RvciBpbnQpX19hLCAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgcGl4ZWwgX19BVFRSU19vX2FpIHZlY19zbGwodmVjdG9yIHBpeGVsIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciBwaXhlbClfX2J1aWx0aW5fYWx0aXZlY192c2woKHZlY3RvciBpbnQpX19hLCAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfc2xsKHZlY3RvciBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgaW50KV9fYnVpbHRpbl9hbHRpdmVjX3ZzbChfX2EsICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY19zbGwodmVjdG9yIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgaW50KV9fYnVpbHRpbl9hbHRpdmVjX3ZzbChfX2EsICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY19zbGwodmVjdG9yIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGludClfX2J1aWx0aW5fYWx0aXZlY192c2woX19hLCAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX3NsbCh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGludClfX2J1aWx0aW5fYWx0aXZlY192c2woKHZlY3RvciBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfc2xsKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGludClfX2J1aWx0aW5fYWx0aXZlY192c2woKHZlY3RvciBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfc2xsKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBpbnQpX19idWlsdGluX2FsdGl2ZWNfdnNsKCh2ZWN0b3IgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBpbnQgX19BVFRSU19vX2FpCit2ZWNfc2xsKHZlY3RvciBib29sIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIGludClfX2J1aWx0aW5fYWx0aXZlY192c2woKHZlY3RvciBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgaW50IF9fQVRUUlNfb19haQordmVjX3NsbCh2ZWN0b3IgYm9vbCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgaW50KV9fYnVpbHRpbl9hbHRpdmVjX3ZzbCgodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBpbnQgX19BVFRSU19vX2FpCit2ZWNfc2xsKHZlY3RvciBib29sIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgaW50KV9fYnVpbHRpbl9hbHRpdmVjX3ZzbCgodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGludClfX2IpOworfQorCisvKiB2ZWNfdnNsICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY192c2wodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX3ZzbCgodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfdnNsKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGNoYXIpX19idWlsdGluX2FsdGl2ZWNfdnNsKCh2ZWN0b3IgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY192c2wodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGNoYXIpX19idWlsdGluX2FsdGl2ZWNfdnNsKCh2ZWN0b3IgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3ZzbCh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX3ZzbCgodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3ZzbCh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2J1aWx0aW5fYWx0aXZlY192c2woKHZlY3RvciBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY192c2wodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX3ZzbCgodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfdnNsKHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX3ZzbCgodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgY2hhciBfX0FUVFJTX29fYWkKK3ZlY192c2wodmVjdG9yIGJvb2wgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX3ZzbCgodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgY2hhciBfX0FUVFJTX29fYWkKK3ZlY192c2wodmVjdG9yIGJvb2wgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgY2hhcilfX2J1aWx0aW5fYWx0aXZlY192c2woKHZlY3RvciBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaG9ydCBfX0FUVFJTX29fYWkgdmVjX3ZzbCh2ZWN0b3Igc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaG9ydClfX2J1aWx0aW5fYWx0aXZlY192c2woKHZlY3RvciBpbnQpX19hLCAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY192c2wodmVjdG9yIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNob3J0KV9fYnVpbHRpbl9hbHRpdmVjX3ZzbCgodmVjdG9yIGludClfX2EsICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaG9ydCBfX0FUVFJTX29fYWkgdmVjX3ZzbCh2ZWN0b3Igc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNob3J0KV9fYnVpbHRpbl9hbHRpdmVjX3ZzbCgodmVjdG9yIGludClfX2EsICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY192c2wodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYnVpbHRpbl9hbHRpdmVjX3ZzbCgodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfdnNsKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19idWlsdGluX2FsdGl2ZWNfdnNsKCh2ZWN0b3IgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY192c2wodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19idWlsdGluX2FsdGl2ZWNfdnNsKCh2ZWN0b3IgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIHNob3J0IF9fQVRUUlNfb19haQordmVjX3ZzbCh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIHNob3J0KV9fYnVpbHRpbl9hbHRpdmVjX3ZzbCgodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIHNob3J0IF9fQVRUUlNfb19haQordmVjX3ZzbCh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBzaG9ydClfX2J1aWx0aW5fYWx0aXZlY192c2woKHZlY3RvciBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY192c2wodmVjdG9yIGJvb2wgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIHNob3J0KV9fYnVpbHRpbl9hbHRpdmVjX3ZzbCgodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBwaXhlbCBfX0FUVFJTX29fYWkgdmVjX3ZzbCh2ZWN0b3IgcGl4ZWwgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBwaXhlbClfX2J1aWx0aW5fYWx0aXZlY192c2woKHZlY3RvciBpbnQpX19hLCAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgcGl4ZWwgX19BVFRSU19vX2FpIHZlY192c2wodmVjdG9yIHBpeGVsIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHBpeGVsKV9fYnVpbHRpbl9hbHRpdmVjX3ZzbCgodmVjdG9yIGludClfX2EsICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBwaXhlbCBfX0FUVFJTX29fYWkgdmVjX3ZzbCh2ZWN0b3IgcGl4ZWwgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHBpeGVsKV9fYnVpbHRpbl9hbHRpdmVjX3ZzbCgodmVjdG9yIGludClfX2EsICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY192c2wodmVjdG9yIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBpbnQpX19idWlsdGluX2FsdGl2ZWNfdnNsKF9fYSwgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX0FUVFJTX29fYWkgdmVjX3ZzbCh2ZWN0b3IgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gKHZlY3RvciBpbnQpX19idWlsdGluX2FsdGl2ZWNfdnNsKF9fYSwgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX0FUVFJTX29fYWkgdmVjX3ZzbCh2ZWN0b3IgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgaW50KV9fYnVpbHRpbl9hbHRpdmVjX3ZzbChfX2EsICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfdnNsKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYnVpbHRpbl9hbHRpdmVjX3ZzbCgodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY192c2wodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYnVpbHRpbl9hbHRpdmVjX3ZzbCgodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY192c2wodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGludClfX2J1aWx0aW5fYWx0aXZlY192c2woKHZlY3RvciBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGludCBfX0FUVFJTX29fYWkKK3ZlY192c2wodmVjdG9yIGJvb2wgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgaW50KV9fYnVpbHRpbl9hbHRpdmVjX3ZzbCgodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBpbnQgX19BVFRSU19vX2FpCit2ZWNfdnNsKHZlY3RvciBib29sIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBpbnQpX19idWlsdGluX2FsdGl2ZWNfdnNsKCh2ZWN0b3IgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGludCBfX0FUVFJTX29fYWkKK3ZlY192c2wodmVjdG9yIGJvb2wgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBpbnQpX19idWlsdGluX2FsdGl2ZWNfdnNsKCh2ZWN0b3IgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKKy8qIHZlY19zbG8gKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3Nsbyh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX3ZzbG8oKHZlY3RvciBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19zbG8odmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX3ZzbG8oKHZlY3RvciBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3Nsbyh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2J1aWx0aW5fYWx0aXZlY192c2xvKCh2ZWN0b3IgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3Nsbyh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX3ZzbG8oKHZlY3RvciBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNob3J0IF9fQVRUUlNfb19haSB2ZWNfc2xvKHZlY3RvciBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaG9ydClfX2J1aWx0aW5fYWx0aXZlY192c2xvKCh2ZWN0b3IgaW50KV9fYSwgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNob3J0IF9fQVRUUlNfb19haSB2ZWNfc2xvKHZlY3RvciBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNob3J0KV9fYnVpbHRpbl9hbHRpdmVjX3ZzbG8oKHZlY3RvciBpbnQpX19hLCAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfc2xvKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19idWlsdGluX2FsdGl2ZWNfdnNsbygodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX3Nsbyh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19idWlsdGluX2FsdGl2ZWNfdnNsbygodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHBpeGVsIF9fQVRUUlNfb19haSB2ZWNfc2xvKHZlY3RvciBwaXhlbCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBwaXhlbClfX2J1aWx0aW5fYWx0aXZlY192c2xvKCh2ZWN0b3IgaW50KV9fYSwgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHBpeGVsIF9fQVRUUlNfb19haSB2ZWNfc2xvKHZlY3RvciBwaXhlbCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHBpeGVsKV9fYnVpbHRpbl9hbHRpdmVjX3ZzbG8oKHZlY3RvciBpbnQpX19hLCAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfc2xvKHZlY3RvciBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGludClfX2J1aWx0aW5fYWx0aXZlY192c2xvKF9fYSwgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX0FUVFJTX29fYWkgdmVjX3Nsbyh2ZWN0b3IgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGludClfX2J1aWx0aW5fYWx0aXZlY192c2xvKF9fYSwgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY19zbG8odmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYnVpbHRpbl9hbHRpdmVjX3ZzbG8oKHZlY3RvciBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX3Nsbyh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGludClfX2J1aWx0aW5fYWx0aXZlY192c2xvKCh2ZWN0b3IgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGZsb2F0IF9fQVRUUlNfb19haSB2ZWNfc2xvKHZlY3RvciBmbG9hdCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBmbG9hdClfX2J1aWx0aW5fYWx0aXZlY192c2xvKCh2ZWN0b3IgaW50KV9fYSwgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGZsb2F0IF9fQVRUUlNfb19haSB2ZWNfc2xvKHZlY3RvciBmbG9hdCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGZsb2F0KV9fYnVpbHRpbl9hbHRpdmVjX3ZzbG8oKHZlY3RvciBpbnQpX19hLCAodmVjdG9yIGludClfX2IpOworfQorCisvKiB2ZWNfdnNsbyAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfdnNsbyh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX3ZzbG8oKHZlY3RvciBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY192c2xvKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgY2hhcilfX2J1aWx0aW5fYWx0aXZlY192c2xvKCh2ZWN0b3IgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY192c2xvKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX3ZzbG8oKHZlY3RvciBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfdnNsbyh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX3ZzbG8oKHZlY3RvciBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNob3J0IF9fQVRUUlNfb19haSB2ZWNfdnNsbyh2ZWN0b3Igc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNob3J0KV9fYnVpbHRpbl9hbHRpdmVjX3ZzbG8oKHZlY3RvciBpbnQpX19hLCAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY192c2xvKHZlY3RvciBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaG9ydClfX2J1aWx0aW5fYWx0aXZlY192c2xvKCh2ZWN0b3IgaW50KV9fYSwgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX3ZzbG8odmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2J1aWx0aW5fYWx0aXZlY192c2xvKCh2ZWN0b3IgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfdnNsbyh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19idWlsdGluX2FsdGl2ZWNfdnNsbygodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHBpeGVsIF9fQVRUUlNfb19haSB2ZWNfdnNsbyh2ZWN0b3IgcGl4ZWwgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHBpeGVsKV9fYnVpbHRpbl9hbHRpdmVjX3ZzbG8oKHZlY3RvciBpbnQpX19hLCAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgcGl4ZWwgX19BVFRSU19vX2FpIHZlY192c2xvKHZlY3RvciBwaXhlbCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBwaXhlbClfX2J1aWx0aW5fYWx0aXZlY192c2xvKCh2ZWN0b3IgaW50KV9fYSwgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX0FUVFJTX29fYWkgdmVjX3ZzbG8odmVjdG9yIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGludClfX2J1aWx0aW5fYWx0aXZlY192c2xvKF9fYSwgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX0FUVFJTX29fYWkgdmVjX3ZzbG8odmVjdG9yIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgaW50KV9fYnVpbHRpbl9hbHRpdmVjX3ZzbG8oX19hLCAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX3ZzbG8odmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYnVpbHRpbl9hbHRpdmVjX3ZzbG8oKHZlY3RvciBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX3ZzbG8odmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBpbnQpX19idWlsdGluX2FsdGl2ZWNfdnNsbygodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBmbG9hdCBfX0FUVFJTX29fYWkgdmVjX3ZzbG8odmVjdG9yIGZsb2F0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBmbG9hdClfX2J1aWx0aW5fYWx0aXZlY192c2xvKCh2ZWN0b3IgaW50KV9fYSwgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGZsb2F0IF9fQVRUUlNfb19haSB2ZWNfdnNsbyh2ZWN0b3IgZmxvYXQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgZmxvYXQpX19idWlsdGluX2FsdGl2ZWNfdnNsbygodmVjdG9yIGludClfX2EsICh2ZWN0b3IgaW50KV9fYik7Cit9CisKKy8qIHZlY19zcGxhdCAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfc3BsYXQodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdW5zaWduZWQgY29uc3QgaW50IF9fYikgeworICByZXR1cm4gdmVjX3Blcm0oX19hLCBfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoX19iICYgMHgwRikpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19zcGxhdCh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHVuc2lnbmVkIGNvbnN0IGludCBfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKF9fYSwgX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKF9fYiAmIDB4MEYpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19zcGxhdCh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdW5zaWduZWQgY29uc3QgaW50IF9fYikgeworICByZXR1cm4gdmVjX3Blcm0oX19hLCBfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoX19iICYgMHgwRikpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX3NwbGF0KHZlY3RvciBzaWduZWQgc2hvcnQgX19hLCB1bnNpZ25lZCBjb25zdCBpbnQgX19iKSB7CisgIHVuc2lnbmVkIGNoYXIgYjAgPSAoX19iICYgMHgwNykgKiAyOworICB1bnNpZ25lZCBjaGFyIGIxID0gYjAgKyAxOworICByZXR1cm4gdmVjX3Blcm0oX19hLCBfX2EsCisgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKGIwLCBiMSwgYjAsIGIxLCBiMCwgYjEsIGIwLCBiMSwgYjAsIGIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiMCwgYjEsIGIwLCBiMSwgYjAsIGIxKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19zcGxhdCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB1bnNpZ25lZCBjb25zdCBpbnQgX19iKSB7CisgIHVuc2lnbmVkIGNoYXIgYjAgPSAoX19iICYgMHgwNykgKiAyOworICB1bnNpZ25lZCBjaGFyIGIxID0gYjAgKyAxOworICByZXR1cm4gdmVjX3Blcm0oX19hLCBfX2EsCisgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKGIwLCBiMSwgYjAsIGIxLCBiMCwgYjEsIGIwLCBiMSwgYjAsIGIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiMCwgYjEsIGIwLCBiMSwgYjAsIGIxKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIHNob3J0IF9fQVRUUlNfb19haQordmVjX3NwbGF0KHZlY3RvciBib29sIHNob3J0IF9fYSwgdW5zaWduZWQgY29uc3QgaW50IF9fYikgeworICB1bnNpZ25lZCBjaGFyIGIwID0gKF9fYiAmIDB4MDcpICogMjsKKyAgdW5zaWduZWQgY2hhciBiMSA9IGIwICsgMTsKKyAgcmV0dXJuIHZlY19wZXJtKF9fYSwgX19hLAorICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKShiMCwgYjEsIGIwLCBiMSwgYjAsIGIxLCBiMCwgYjEsIGIwLCBiMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYjAsIGIxLCBiMCwgYjEsIGIwLCBiMSkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgcGl4ZWwgX19BVFRSU19vX2FpIHZlY19zcGxhdCh2ZWN0b3IgcGl4ZWwgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY29uc3QgaW50IF9fYikgeworICB1bnNpZ25lZCBjaGFyIGIwID0gKF9fYiAmIDB4MDcpICogMjsKKyAgdW5zaWduZWQgY2hhciBiMSA9IGIwICsgMTsKKyAgcmV0dXJuIHZlY19wZXJtKF9fYSwgX19hLAorICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKShiMCwgYjEsIGIwLCBiMSwgYjAsIGIxLCBiMCwgYjEsIGIwLCBiMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYjAsIGIxLCBiMCwgYjEsIGIwLCBiMSkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY19zcGxhdCh2ZWN0b3Igc2lnbmVkIGludCBfX2EsIHVuc2lnbmVkIGNvbnN0IGludCBfX2IpIHsKKyAgdW5zaWduZWQgY2hhciBiMCA9IChfX2IgJiAweDAzKSAqIDQ7CisgIHVuc2lnbmVkIGNoYXIgYjEgPSBiMCArIDEsIGIyID0gYjAgKyAyLCBiMyA9IGIwICsgMzsKKyAgcmV0dXJuIHZlY19wZXJtKF9fYSwgX19hLAorICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKShiMCwgYjEsIGIyLCBiMywgYjAsIGIxLCBiMiwgYjMsIGIwLCBiMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYjIsIGIzLCBiMCwgYjEsIGIyLCBiMykpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX3NwbGF0KHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB1bnNpZ25lZCBjb25zdCBpbnQgX19iKSB7CisgIHVuc2lnbmVkIGNoYXIgYjAgPSAoX19iICYgMHgwMykgKiA0OworICB1bnNpZ25lZCBjaGFyIGIxID0gYjAgKyAxLCBiMiA9IGIwICsgMiwgYjMgPSBiMCArIDM7CisgIHJldHVybiB2ZWNfcGVybShfX2EsIF9fYSwKKyAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoYjAsIGIxLCBiMiwgYjMsIGIwLCBiMSwgYjIsIGIzLCBiMCwgYjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIyLCBiMywgYjAsIGIxLCBiMiwgYjMpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgaW50IF9fQVRUUlNfb19haQordmVjX3NwbGF0KHZlY3RvciBib29sIGludCBfX2EsIHVuc2lnbmVkIGNvbnN0IGludCBfX2IpIHsKKyAgdW5zaWduZWQgY2hhciBiMCA9IChfX2IgJiAweDAzKSAqIDQ7CisgIHVuc2lnbmVkIGNoYXIgYjEgPSBiMCArIDEsIGIyID0gYjAgKyAyLCBiMyA9IGIwICsgMzsKKyAgcmV0dXJuIHZlY19wZXJtKF9fYSwgX19hLAorICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKShiMCwgYjEsIGIyLCBiMywgYjAsIGIxLCBiMiwgYjMsIGIwLCBiMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYjIsIGIzLCBiMCwgYjEsIGIyLCBiMykpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZmxvYXQgX19BVFRSU19vX2FpIHZlY19zcGxhdCh2ZWN0b3IgZmxvYXQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY29uc3QgaW50IF9fYikgeworICB1bnNpZ25lZCBjaGFyIGIwID0gKF9fYiAmIDB4MDMpICogNDsKKyAgdW5zaWduZWQgY2hhciBiMSA9IGIwICsgMSwgYjIgPSBiMCArIDIsIGIzID0gYjAgKyAzOworICByZXR1cm4gdmVjX3Blcm0oX19hLCBfX2EsCisgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKGIwLCBiMSwgYjIsIGIzLCBiMCwgYjEsIGIyLCBiMywgYjAsIGIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiMiwgYjMsIGIwLCBiMSwgYjIsIGIzKSk7Cit9CisKKyNpZmRlZiBfX1ZTWF9fCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZG91YmxlIF9fQVRUUlNfb19haSB2ZWNfc3BsYXQodmVjdG9yIGRvdWJsZSBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY29uc3QgaW50IF9fYikgeworICB1bnNpZ25lZCBjaGFyIGIwID0gKF9fYiAmIDB4MDEpICogODsKKyAgdW5zaWduZWQgY2hhciBiMSA9IGIwICsgMSwgYjIgPSBiMCArIDIsIGIzID0gYjAgKyAzLCBiNCA9IGIwICsgNCwgYjUgPSBiMCArIDUsCisgICAgICAgICAgICAgICAgYjYgPSBiMCArIDYsIGI3ID0gYjAgKyA3OworICByZXR1cm4gdmVjX3Blcm0oX19hLCBfX2EsCisgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKGIwLCBiMSwgYjIsIGIzLCBiNCwgYjUsIGI2LCBiNywgYjAsIGIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiMiwgYjMsIGI0LCBiNSwgYjYsIGI3KSk7Cit9CitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfc3BsYXQodmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwgdW5zaWduZWQgY29uc3QgaW50IF9fYikgeworICB1bnNpZ25lZCBjaGFyIGIwID0gKF9fYiAmIDB4MDEpICogODsKKyAgdW5zaWduZWQgY2hhciBiMSA9IGIwICsgMSwgYjIgPSBiMCArIDIsIGIzID0gYjAgKyAzLCBiNCA9IGIwICsgNCwgYjUgPSBiMCArIDUsCisgICAgICAgICAgICAgICAgYjYgPSBiMCArIDYsIGI3ID0gYjAgKyA3OworICByZXR1cm4gdmVjX3Blcm0oX19hLCBfX2EsCisgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKGIwLCBiMSwgYjIsIGIzLCBiNCwgYjUsIGI2LCBiNywgYjAsIGIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiMiwgYjMsIGI0LCBiNSwgYjYsIGI3KSk7Cit9CitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY19zcGxhdCh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHVuc2lnbmVkIGNvbnN0IGludCBfX2IpIHsKKyAgdW5zaWduZWQgY2hhciBiMCA9IChfX2IgJiAweDAxKSAqIDg7CisgIHVuc2lnbmVkIGNoYXIgYjEgPSBiMCArIDEsIGIyID0gYjAgKyAyLCBiMyA9IGIwICsgMywgYjQgPSBiMCArIDQsIGI1ID0gYjAgKyA1LAorICAgICAgICAgICAgICAgIGI2ID0gYjAgKyA2LCBiNyA9IGIwICsgNzsKKyAgcmV0dXJuIHZlY19wZXJtKF9fYSwgX19hLAorICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKShiMCwgYjEsIGIyLCBiMywgYjQsIGI1LCBiNiwgYjcsIGIwLCBiMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYjIsIGIzLCBiNCwgYjUsIGI2LCBiNykpOworfQorc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY19zcGxhdCh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdW5zaWduZWQgY29uc3QgaW50IF9fYikgeworICB1bnNpZ25lZCBjaGFyIGIwID0gKF9fYiAmIDB4MDEpICogODsKKyAgdW5zaWduZWQgY2hhciBiMSA9IGIwICsgMSwgYjIgPSBiMCArIDIsIGIzID0gYjAgKyAzLCBiNCA9IGIwICsgNCwgYjUgPSBiMCArIDUsCisgICAgICAgICAgICAgICAgYjYgPSBiMCArIDYsIGI3ID0gYjAgKyA3OworICByZXR1cm4gdmVjX3Blcm0oX19hLCBfX2EsCisgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKGIwLCBiMSwgYjIsIGIzLCBiNCwgYjUsIGI2LCBiNywgYjAsIGIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiMiwgYjMsIGI0LCBiNSwgYjYsIGI3KSk7Cit9CisjZW5kaWYKKworLyogdmVjX3ZzcGx0YiAqLworCisjZGVmaW5lIF9fYnVpbHRpbl9hbHRpdmVjX3ZzcGx0YiB2ZWNfdnNwbHRiCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY192c3BsdGIodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKF9fYSwgX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKF9fYikpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY192c3BsdGIodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gdmVjX3Blcm0oX19hLCBfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoX19iKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGNoYXIgX19BVFRSU19vX2FpIHZlY192c3BsdGIodmVjdG9yIGJvb2wgY2hhciBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiB2ZWNfcGVybShfX2EsIF9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKShfX2IpKTsKK30KKworLyogdmVjX3ZzcGx0aCAqLworCisjZGVmaW5lIF9fYnVpbHRpbl9hbHRpdmVjX3ZzcGx0aCB2ZWNfdnNwbHRoCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaG9ydCBfX0FUVFJTX29fYWkgdmVjX3ZzcGx0aCh2ZWN0b3Igc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIF9fYiAqPSAyOworICB1bnNpZ25lZCBjaGFyIGIxID0gX19iICsgMTsKKyAgcmV0dXJuIHZlY19wZXJtKF9fYSwgX19hLAorICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKShfX2IsIGIxLCBfX2IsIGIxLCBfX2IsIGIxLCBfX2IsIGIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2IsIGIxLCBfX2IsIGIxLCBfX2IsIGIxLCBfX2IsIGIxKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY192c3BsdGgodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgX19iICo9IDI7CisgIHVuc2lnbmVkIGNoYXIgYjEgPSBfX2IgKyAxOworICByZXR1cm4gdmVjX3Blcm0oX19hLCBfX2EsCisgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKF9fYiwgYjEsIF9fYiwgYjEsIF9fYiwgYjEsIF9fYiwgYjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYiwgYjEsIF9fYiwgYjEsIF9fYiwgYjEsIF9fYiwgYjEpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfdnNwbHRoKHZlY3RvciBib29sIHNob3J0IF9fYSwgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgX19iICo9IDI7CisgIHVuc2lnbmVkIGNoYXIgYjEgPSBfX2IgKyAxOworICByZXR1cm4gdmVjX3Blcm0oX19hLCBfX2EsCisgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKF9fYiwgYjEsIF9fYiwgYjEsIF9fYiwgYjEsIF9fYiwgYjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYiwgYjEsIF9fYiwgYjEsIF9fYiwgYjEsIF9fYiwgYjEpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHBpeGVsIF9fQVRUUlNfb19haSB2ZWNfdnNwbHRoKHZlY3RvciBwaXhlbCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgX19iICo9IDI7CisgIHVuc2lnbmVkIGNoYXIgYjEgPSBfX2IgKyAxOworICByZXR1cm4gdmVjX3Blcm0oX19hLCBfX2EsCisgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKF9fYiwgYjEsIF9fYiwgYjEsIF9fYiwgYjEsIF9fYiwgYjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYiwgYjEsIF9fYiwgYjEsIF9fYiwgYjEsIF9fYiwgYjEpKTsKK30KKworLyogdmVjX3ZzcGx0dyAqLworCisjZGVmaW5lIF9fYnVpbHRpbl9hbHRpdmVjX3ZzcGx0dyB2ZWNfdnNwbHR3CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY192c3BsdHcodmVjdG9yIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIF9fYiAqPSA0OworICB1bnNpZ25lZCBjaGFyIGIxID0gX19iICsgMSwgYjIgPSBfX2IgKyAyLCBiMyA9IF9fYiArIDM7CisgIHJldHVybiB2ZWNfcGVybShfX2EsIF9fYSwKKyAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoX19iLCBiMSwgYjIsIGIzLCBfX2IsIGIxLCBiMiwgYjMsIF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYjEsIGIyLCBiMywgX19iLCBiMSwgYjIsIGIzKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfdnNwbHR3KHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB1bnNpZ25lZCBjaGFyIF9fYikgeworICBfX2IgKj0gNDsKKyAgdW5zaWduZWQgY2hhciBiMSA9IF9fYiArIDEsIGIyID0gX19iICsgMiwgYjMgPSBfX2IgKyAzOworICByZXR1cm4gdmVjX3Blcm0oX19hLCBfX2EsCisgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKF9fYiwgYjEsIGIyLCBiMywgX19iLCBiMSwgYjIsIGIzLCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIxLCBiMiwgYjMsIF9fYiwgYjEsIGIyLCBiMykpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBpbnQgX19BVFRSU19vX2FpIHZlY192c3BsdHcodmVjdG9yIGJvb2wgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIF9fYikgeworICBfX2IgKj0gNDsKKyAgdW5zaWduZWQgY2hhciBiMSA9IF9fYiArIDEsIGIyID0gX19iICsgMiwgYjMgPSBfX2IgKyAzOworICByZXR1cm4gdmVjX3Blcm0oX19hLCBfX2EsCisgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKF9fYiwgYjEsIGIyLCBiMywgX19iLCBiMSwgYjIsIGIzLCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIxLCBiMiwgYjMsIF9fYiwgYjEsIGIyLCBiMykpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZmxvYXQgX19BVFRSU19vX2FpIHZlY192c3BsdHcodmVjdG9yIGZsb2F0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIF9fYikgeworICBfX2IgKj0gNDsKKyAgdW5zaWduZWQgY2hhciBiMSA9IF9fYiArIDEsIGIyID0gX19iICsgMiwgYjMgPSBfX2IgKyAzOworICByZXR1cm4gdmVjX3Blcm0oX19hLCBfX2EsCisgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKF9fYiwgYjEsIGIyLCBiMywgX19iLCBiMSwgYjIsIGIzLCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIxLCBiMiwgYjMsIF9fYiwgYjEsIGIyLCBiMykpOworfQorCisvKiB2ZWNfc3BsYXRfczggKi8KKworI2RlZmluZSBfX2J1aWx0aW5fYWx0aXZlY192c3BsdGlzYiB2ZWNfc3BsYXRfczgKKworLy8gRklYTUU6IHBhcmFtZXRlciBzaG91bGQgYmUgdHJlYXRlZCBhcyA1LWJpdCBzaWduZWQgbGl0ZXJhbAorc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3NwbGF0X3M4KHNpZ25lZCBjaGFyIF9fYSkgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgY2hhcikoX19hKTsKK30KKworLyogdmVjX3ZzcGx0aXNiICovCisKKy8vIEZJWE1FOiBwYXJhbWV0ZXIgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgNS1iaXQgc2lnbmVkIGxpdGVyYWwKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY192c3BsdGlzYihzaWduZWQgY2hhciBfX2EpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGNoYXIpKF9fYSk7Cit9CisKKy8qIHZlY19zcGxhdF9zMTYgKi8KKworI2RlZmluZSBfX2J1aWx0aW5fYWx0aXZlY192c3BsdGlzaCB2ZWNfc3BsYXRfczE2CisKKy8vIEZJWE1FOiBwYXJhbWV0ZXIgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgNS1iaXQgc2lnbmVkIGxpdGVyYWwKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaG9ydCBfX0FUVFJTX29fYWkgdmVjX3NwbGF0X3MxNihzaWduZWQgY2hhciBfX2EpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2hvcnQpKF9fYSk7Cit9CisKKy8qIHZlY192c3BsdGlzaCAqLworCisvLyBGSVhNRTogcGFyYW1ldGVyIHNob3VsZCBiZSB0cmVhdGVkIGFzIDUtYml0IHNpZ25lZCBsaXRlcmFsCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY192c3BsdGlzaChzaWduZWQgY2hhciBfX2EpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2hvcnQpKF9fYSk7Cit9CisKKy8qIHZlY19zcGxhdF9zMzIgKi8KKworI2RlZmluZSBfX2J1aWx0aW5fYWx0aXZlY192c3BsdGlzdyB2ZWNfc3BsYXRfczMyCisKKy8vIEZJWE1FOiBwYXJhbWV0ZXIgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgNS1iaXQgc2lnbmVkIGxpdGVyYWwKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY19zcGxhdF9zMzIoc2lnbmVkIGNoYXIgX19hKSB7CisgIHJldHVybiAodmVjdG9yIGludCkoX19hKTsKK30KKworLyogdmVjX3ZzcGx0aXN3ICovCisKKy8vIEZJWE1FOiBwYXJhbWV0ZXIgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgNS1iaXQgc2lnbmVkIGxpdGVyYWwKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY192c3BsdGlzdyhzaWduZWQgY2hhciBfX2EpIHsKKyAgcmV0dXJuICh2ZWN0b3IgaW50KShfX2EpOworfQorCisvKiB2ZWNfc3BsYXRfdTggKi8KKworLy8gRklYTUU6IHBhcmFtZXRlciBzaG91bGQgYmUgdHJlYXRlZCBhcyA1LWJpdCBzaWduZWQgbGl0ZXJhbAorc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfc3BsYXRfdTgodW5zaWduZWQgY2hhciBfX2EpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoX19hKTsKK30KKworLyogdmVjX3NwbGF0X3UxNiAqLworCisvLyBGSVhNRTogcGFyYW1ldGVyIHNob3VsZCBiZSB0cmVhdGVkIGFzIDUtYml0IHNpZ25lZCBsaXRlcmFsCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfc3BsYXRfdTE2KHNpZ25lZCBjaGFyIF9fYSkgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBzaG9ydCkoX19hKTsKK30KKworLyogdmVjX3NwbGF0X3UzMiAqLworCisvLyBGSVhNRTogcGFyYW1ldGVyIHNob3VsZCBiZSB0cmVhdGVkIGFzIDUtYml0IHNpZ25lZCBsaXRlcmFsCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX3NwbGF0X3UzMihzaWduZWQgY2hhciBfX2EpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgaW50KShfX2EpOworfQorCisvKiB2ZWNfc3IgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3NyKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX3JlcyA9ICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EgPj4gX19iOworICByZXR1cm4gKHZlY3RvciBzaWduZWQgY2hhcilfX3JlczsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfc3IodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYSA+PiBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfc3IodmVjdG9yIHNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fcmVzID0gKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2EgPj4gX19iOworICByZXR1cm4gKHZlY3RvciBzaWduZWQgc2hvcnQpX19yZXM7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19zcih2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2EgPj4gX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY19zcih2ZWN0b3Igc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHZlY3RvciB1bnNpZ25lZCBpbnQgX19yZXMgPSAodmVjdG9yIHVuc2lnbmVkIGludClfX2EgPj4gX19iOworICByZXR1cm4gKHZlY3RvciBzaWduZWQgaW50KV9fcmVzOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX3NyKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gX19hID4+IF9fYjsKK30KKworI2lmZGVmIF9fUE9XRVI4X1ZFQ1RPUl9fCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY19zcih2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19yZXMgPSAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2EgPj4gX19iOworICByZXR1cm4gKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fcmVzOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX3NyKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19hID4+IF9fYjsKK30KKyNlbmRpZgorCisvKiB2ZWNfdnNyYiAqLworCisjZGVmaW5lIF9fYnVpbHRpbl9hbHRpdmVjX3ZzcmIgdmVjX3ZzcmIKKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3ZzcmIodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2EgPj4gKHZlY3RvciBzaWduZWQgY2hhcilfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3ZzcmIodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYSA+PiBfX2I7Cit9CisKKy8qIHZlY192c3JoICovCisKKyNkZWZpbmUgX19idWlsdGluX2FsdGl2ZWNfdnNyaCB2ZWNfdnNyaAorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfdnNyaCh2ZWN0b3Igc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2EgPj4gKHZlY3RvciBzaG9ydClfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY192c3JoKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYSA+PiBfX2I7Cit9CisKKy8qIHZlY192c3J3ICovCisKKyNkZWZpbmUgX19idWlsdGluX2FsdGl2ZWNfdnNydyB2ZWNfdnNydworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfdnNydyh2ZWN0b3IgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiBfX2EgPj4gKHZlY3RvciBpbnQpX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX3ZzcncodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiBfX2EgPj4gX19iOworfQorCisvKiB2ZWNfc3JhICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19zcmEodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX3ZzcmFiKCh2ZWN0b3IgY2hhcilfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3NyYSh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX3ZzcmFiKCh2ZWN0b3IgY2hhcilfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaG9ydCBfX0FUVFJTX29fYWkgdmVjX3NyYSh2ZWN0b3Igc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZzcmFoKF9fYSwgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfc3JhKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19idWlsdGluX2FsdGl2ZWNfdnNyYWgoKHZlY3RvciBzaG9ydClfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY19zcmEodmVjdG9yIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192c3JhdyhfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfc3JhKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBpbnQpX19idWlsdGluX2FsdGl2ZWNfdnNyYXcoKHZlY3RvciBpbnQpX19hLCBfX2IpOworfQorCisjaWZkZWYgX19QT1dFUjhfVkVDVE9SX18KK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX3NyYSh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2EgPj4gX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX3NyYSh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKSgodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpX19hID4+IF9fYik7Cit9CisjZW5kaWYKKworLyogdmVjX3ZzcmFiICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY192c3JhYih2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGNoYXIpX19idWlsdGluX2FsdGl2ZWNfdnNyYWIoKHZlY3RvciBjaGFyKV9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfdnNyYWIodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2J1aWx0aW5fYWx0aXZlY192c3JhYigodmVjdG9yIGNoYXIpX19hLCBfX2IpOworfQorCisvKiB2ZWNfdnNyYWggKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNob3J0IF9fQVRUUlNfb19haQordmVjX3ZzcmFoKHZlY3RvciBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZzcmFoKF9fYSwgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfdnNyYWgodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2J1aWx0aW5fYWx0aXZlY192c3JhaCgodmVjdG9yIHNob3J0KV9fYSwgX19iKTsKK30KKworLyogdmVjX3ZzcmF3ICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY192c3Jhdyh2ZWN0b3IgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdnNyYXcoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX3ZzcmF3KHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBpbnQpX19idWlsdGluX2FsdGl2ZWNfdnNyYXcoKHZlY3RvciBpbnQpX19hLCBfX2IpOworfQorCisvKiB2ZWNfc3JsICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19zcmwodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX3ZzcigodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfc3JsKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGNoYXIpX19idWlsdGluX2FsdGl2ZWNfdnNyKCh2ZWN0b3IgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19zcmwodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGNoYXIpX19idWlsdGluX2FsdGl2ZWNfdnNyKCh2ZWN0b3IgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3NybCh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX3ZzcigodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3NybCh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2J1aWx0aW5fYWx0aXZlY192c3IoKHZlY3RvciBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19zcmwodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX3ZzcigodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfc3JsKHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX3ZzcigodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19zcmwodmVjdG9yIGJvb2wgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX3ZzcigodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19zcmwodmVjdG9yIGJvb2wgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgY2hhcilfX2J1aWx0aW5fYWx0aXZlY192c3IoKHZlY3RvciBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaG9ydCBfX0FUVFJTX29fYWkgdmVjX3NybCh2ZWN0b3Igc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaG9ydClfX2J1aWx0aW5fYWx0aXZlY192c3IoKHZlY3RvciBpbnQpX19hLCAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY19zcmwodmVjdG9yIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNob3J0KV9fYnVpbHRpbl9hbHRpdmVjX3ZzcigodmVjdG9yIGludClfX2EsICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaG9ydCBfX0FUVFJTX29fYWkgdmVjX3NybCh2ZWN0b3Igc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNob3J0KV9fYnVpbHRpbl9hbHRpdmVjX3ZzcigodmVjdG9yIGludClfX2EsICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19zcmwodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYnVpbHRpbl9hbHRpdmVjX3ZzcigodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfc3JsKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19idWlsdGluX2FsdGl2ZWNfdnNyKCh2ZWN0b3IgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19zcmwodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19idWlsdGluX2FsdGl2ZWNfdnNyKCh2ZWN0b3IgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIHNob3J0IF9fQVRUUlNfb19haQordmVjX3NybCh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIHNob3J0KV9fYnVpbHRpbl9hbHRpdmVjX3ZzcigodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIHNob3J0IF9fQVRUUlNfb19haQordmVjX3NybCh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBzaG9ydClfX2J1aWx0aW5fYWx0aXZlY192c3IoKHZlY3RvciBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19zcmwodmVjdG9yIGJvb2wgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIHNob3J0KV9fYnVpbHRpbl9hbHRpdmVjX3ZzcigodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBwaXhlbCBfX0FUVFJTX29fYWkgdmVjX3NybCh2ZWN0b3IgcGl4ZWwgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBwaXhlbClfX2J1aWx0aW5fYWx0aXZlY192c3IoKHZlY3RvciBpbnQpX19hLCAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgcGl4ZWwgX19BVFRSU19vX2FpIHZlY19zcmwodmVjdG9yIHBpeGVsIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHBpeGVsKV9fYnVpbHRpbl9hbHRpdmVjX3ZzcigodmVjdG9yIGludClfX2EsICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBwaXhlbCBfX0FUVFJTX29fYWkgdmVjX3NybCh2ZWN0b3IgcGl4ZWwgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHBpeGVsKV9fYnVpbHRpbl9hbHRpdmVjX3ZzcigodmVjdG9yIGludClfX2EsICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY19zcmwodmVjdG9yIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBpbnQpX19idWlsdGluX2FsdGl2ZWNfdnNyKF9fYSwgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX0FUVFJTX29fYWkgdmVjX3NybCh2ZWN0b3IgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gKHZlY3RvciBpbnQpX19idWlsdGluX2FsdGl2ZWNfdnNyKF9fYSwgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX0FUVFJTX29fYWkgdmVjX3NybCh2ZWN0b3IgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgaW50KV9fYnVpbHRpbl9hbHRpdmVjX3ZzcihfX2EsICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfc3JsKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYnVpbHRpbl9hbHRpdmVjX3ZzcigodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY19zcmwodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYnVpbHRpbl9hbHRpdmVjX3ZzcigodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY19zcmwodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGludClfX2J1aWx0aW5fYWx0aXZlY192c3IoKHZlY3RvciBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGludCBfX0FUVFJTX29fYWkKK3ZlY19zcmwodmVjdG9yIGJvb2wgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgaW50KV9fYnVpbHRpbl9hbHRpdmVjX3ZzcigodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBpbnQgX19BVFRSU19vX2FpCit2ZWNfc3JsKHZlY3RvciBib29sIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBpbnQpX19idWlsdGluX2FsdGl2ZWNfdnNyKCh2ZWN0b3IgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGludCBfX0FUVFJTX29fYWkKK3ZlY19zcmwodmVjdG9yIGJvb2wgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBpbnQpX19idWlsdGluX2FsdGl2ZWNfdnNyKCh2ZWN0b3IgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKKy8qIHZlY192c3IgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3Zzcih2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGNoYXIpX19idWlsdGluX2FsdGl2ZWNfdnNyKCh2ZWN0b3IgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY192c3IodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgY2hhcilfX2J1aWx0aW5fYWx0aXZlY192c3IoKHZlY3RvciBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3Zzcih2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgY2hhcilfX2J1aWx0aW5fYWx0aXZlY192c3IoKHZlY3RvciBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfdnNyKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19idWlsdGluX2FsdGl2ZWNfdnNyKCh2ZWN0b3IgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfdnNyKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX3ZzcigodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3Zzcih2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19idWlsdGluX2FsdGl2ZWNfdnNyKCh2ZWN0b3IgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgY2hhciBfX0FUVFJTX29fYWkKK3ZlY192c3IodmVjdG9yIGJvb2wgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIGNoYXIpX19idWlsdGluX2FsdGl2ZWNfdnNyKCh2ZWN0b3IgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBjaGFyIF9fQVRUUlNfb19haQordmVjX3Zzcih2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIGNoYXIpX19idWlsdGluX2FsdGl2ZWNfdnNyKCh2ZWN0b3IgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBjaGFyIF9fQVRUUlNfb19haQordmVjX3Zzcih2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX3ZzcigodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNob3J0IF9fQVRUUlNfb19haSB2ZWNfdnNyKHZlY3RvciBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNob3J0KV9fYnVpbHRpbl9hbHRpdmVjX3ZzcigodmVjdG9yIGludClfX2EsICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaG9ydCBfX0FUVFJTX29fYWkgdmVjX3Zzcih2ZWN0b3Igc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2hvcnQpX19idWlsdGluX2FsdGl2ZWNfdnNyKCh2ZWN0b3IgaW50KV9fYSwgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNob3J0IF9fQVRUUlNfb19haSB2ZWNfdnNyKHZlY3RvciBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2hvcnQpX19idWlsdGluX2FsdGl2ZWNfdnNyKCh2ZWN0b3IgaW50KV9fYSwgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX3Zzcih2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19idWlsdGluX2FsdGl2ZWNfdnNyKCh2ZWN0b3IgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY192c3IodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2J1aWx0aW5fYWx0aXZlY192c3IoKHZlY3RvciBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX3Zzcih2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2J1aWx0aW5fYWx0aXZlY192c3IoKHZlY3RvciBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfdnNyKHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgc2hvcnQpX19idWlsdGluX2FsdGl2ZWNfdnNyKCh2ZWN0b3IgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfdnNyKHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIHNob3J0KV9fYnVpbHRpbl9hbHRpdmVjX3ZzcigodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIHNob3J0IF9fQVRUUlNfb19haQordmVjX3Zzcih2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgc2hvcnQpX19idWlsdGluX2FsdGl2ZWNfdnNyKCh2ZWN0b3IgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHBpeGVsIF9fQVRUUlNfb19haSB2ZWNfdnNyKHZlY3RvciBwaXhlbCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHBpeGVsKV9fYnVpbHRpbl9hbHRpdmVjX3ZzcigodmVjdG9yIGludClfX2EsICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBwaXhlbCBfX0FUVFJTX29fYWkgdmVjX3Zzcih2ZWN0b3IgcGl4ZWwgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgcGl4ZWwpX19idWlsdGluX2FsdGl2ZWNfdnNyKCh2ZWN0b3IgaW50KV9fYSwgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHBpeGVsIF9fQVRUUlNfb19haSB2ZWNfdnNyKHZlY3RvciBwaXhlbCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgcGl4ZWwpX19idWlsdGluX2FsdGl2ZWNfdnNyKCh2ZWN0b3IgaW50KV9fYSwgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX0FUVFJTX29fYWkgdmVjX3Zzcih2ZWN0b3IgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGludClfX2J1aWx0aW5fYWx0aXZlY192c3IoX19hLCAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfdnNyKHZlY3RvciBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGludClfX2J1aWx0aW5fYWx0aXZlY192c3IoX19hLCAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfdnNyKHZlY3RvciBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciBpbnQpX19idWlsdGluX2FsdGl2ZWNfdnNyKF9fYSwgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY192c3IodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBpbnQpX19idWlsdGluX2FsdGl2ZWNfdnNyKCh2ZWN0b3IgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX3Zzcih2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBpbnQpX19idWlsdGluX2FsdGl2ZWNfdnNyKCh2ZWN0b3IgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX3Zzcih2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYnVpbHRpbl9hbHRpdmVjX3ZzcigodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgaW50IF9fQVRUUlNfb19haQordmVjX3Zzcih2ZWN0b3IgYm9vbCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBpbnQpX19idWlsdGluX2FsdGl2ZWNfdnNyKCh2ZWN0b3IgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGludCBfX0FUVFJTX29fYWkKK3ZlY192c3IodmVjdG9yIGJvb2wgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIGludClfX2J1aWx0aW5fYWx0aXZlY192c3IoKHZlY3RvciBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgaW50IF9fQVRUUlNfb19haQordmVjX3Zzcih2ZWN0b3IgYm9vbCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIGludClfX2J1aWx0aW5fYWx0aXZlY192c3IoKHZlY3RvciBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworLyogdmVjX3NybyAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfc3JvKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGNoYXIpX19idWlsdGluX2FsdGl2ZWNfdnNybygodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3Nybyh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGNoYXIpX19idWlsdGluX2FsdGl2ZWNfdnNybygodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfc3JvKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX3Zzcm8oKHZlY3RvciBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfc3JvKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19idWlsdGluX2FsdGl2ZWNfdnNybygodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY19zcm8odmVjdG9yIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNob3J0KV9fYnVpbHRpbl9hbHRpdmVjX3Zzcm8oKHZlY3RvciBpbnQpX19hLCAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY19zcm8odmVjdG9yIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2hvcnQpX19idWlsdGluX2FsdGl2ZWNfdnNybygodmVjdG9yIGludClfX2EsICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19zcm8odmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2J1aWx0aW5fYWx0aXZlY192c3JvKCh2ZWN0b3IgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfc3JvKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2J1aWx0aW5fYWx0aXZlY192c3JvKCh2ZWN0b3IgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgcGl4ZWwgX19BVFRSU19vX2FpIHZlY19zcm8odmVjdG9yIHBpeGVsIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHBpeGVsKV9fYnVpbHRpbl9hbHRpdmVjX3Zzcm8oKHZlY3RvciBpbnQpX19hLCAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgcGl4ZWwgX19BVFRSU19vX2FpIHZlY19zcm8odmVjdG9yIHBpeGVsIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgcGl4ZWwpX19idWlsdGluX2FsdGl2ZWNfdnNybygodmVjdG9yIGludClfX2EsICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY19zcm8odmVjdG9yIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgaW50KV9fYnVpbHRpbl9hbHRpdmVjX3Zzcm8oX19hLCAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfc3JvKHZlY3RvciBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgaW50KV9fYnVpbHRpbl9hbHRpdmVjX3Zzcm8oX19hLCAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX3Nybyh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBpbnQpX19idWlsdGluX2FsdGl2ZWNfdnNybygodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfc3JvKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYnVpbHRpbl9hbHRpdmVjX3Zzcm8oKHZlY3RvciBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZmxvYXQgX19BVFRSU19vX2FpIHZlY19zcm8odmVjdG9yIGZsb2F0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGZsb2F0KV9fYnVpbHRpbl9hbHRpdmVjX3Zzcm8oKHZlY3RvciBpbnQpX19hLCAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZmxvYXQgX19BVFRSU19vX2FpIHZlY19zcm8odmVjdG9yIGZsb2F0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgZmxvYXQpX19idWlsdGluX2FsdGl2ZWNfdnNybygodmVjdG9yIGludClfX2EsICh2ZWN0b3IgaW50KV9fYik7Cit9CisKKy8qIHZlY192c3JvICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY192c3JvKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGNoYXIpX19idWlsdGluX2FsdGl2ZWNfdnNybygodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3Zzcm8odmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYnVpbHRpbl9hbHRpdmVjX3Zzcm8oKHZlY3RvciBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3Zzcm8odmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19idWlsdGluX2FsdGl2ZWNfdnNybygodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY192c3JvKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19idWlsdGluX2FsdGl2ZWNfdnNybygodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY192c3JvKHZlY3RvciBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2hvcnQpX19idWlsdGluX2FsdGl2ZWNfdnNybygodmVjdG9yIGludClfX2EsICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaG9ydCBfX0FUVFJTX29fYWkgdmVjX3Zzcm8odmVjdG9yIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNob3J0KV9fYnVpbHRpbl9hbHRpdmVjX3Zzcm8oKHZlY3RvciBpbnQpX19hLCAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfdnNybyh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYnVpbHRpbl9hbHRpdmVjX3Zzcm8oKHZlY3RvciBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY192c3JvKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2J1aWx0aW5fYWx0aXZlY192c3JvKCh2ZWN0b3IgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgcGl4ZWwgX19BVFRSU19vX2FpIHZlY192c3JvKHZlY3RvciBwaXhlbCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgcGl4ZWwpX19idWlsdGluX2FsdGl2ZWNfdnNybygodmVjdG9yIGludClfX2EsICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBwaXhlbCBfX0FUVFJTX29fYWkgdmVjX3Zzcm8odmVjdG9yIHBpeGVsIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHBpeGVsKV9fYnVpbHRpbl9hbHRpdmVjX3Zzcm8oKHZlY3RvciBpbnQpX19hLCAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfdnNybyh2ZWN0b3IgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgaW50KV9fYnVpbHRpbl9hbHRpdmVjX3Zzcm8oX19hLCAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfdnNybyh2ZWN0b3IgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBpbnQpX19idWlsdGluX2FsdGl2ZWNfdnNybyhfX2EsICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfdnNybyh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBpbnQpX19idWlsdGluX2FsdGl2ZWNfdnNybygodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfdnNybyh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGludClfX2J1aWx0aW5fYWx0aXZlY192c3JvKCh2ZWN0b3IgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGZsb2F0IF9fQVRUUlNfb19haSB2ZWNfdnNybyh2ZWN0b3IgZmxvYXQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGZsb2F0KV9fYnVpbHRpbl9hbHRpdmVjX3Zzcm8oKHZlY3RvciBpbnQpX19hLCAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZmxvYXQgX19BVFRSU19vX2FpIHZlY192c3JvKHZlY3RvciBmbG9hdCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBmbG9hdClfX2J1aWx0aW5fYWx0aXZlY192c3JvKCh2ZWN0b3IgaW50KV9fYSwgKHZlY3RvciBpbnQpX19iKTsKK30KKworLyogdmVjX3N0ICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdCh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaWduZWQgY2hhciAqX19jKSB7CisgIF9fYnVpbHRpbl9hbHRpdmVjX3N0dngoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdCh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lZCBjaGFyICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2eCgodmVjdG9yIGludClfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0KHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciAqX19jKSB7CisgIF9fYnVpbHRpbl9hbHRpdmVjX3N0dngoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdCh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqX19jKSB7CisgIF9fYnVpbHRpbl9hbHRpdmVjX3N0dngoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdCh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduZWQgY2hhciAqX19jKSB7CisgIF9fYnVpbHRpbl9hbHRpdmVjX3N0dngoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdCh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2eCgodmVjdG9yIGludClfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0KHZlY3RvciBib29sIGNoYXIgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGNoYXIgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZ4KCh2ZWN0b3IgaW50KV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3QodmVjdG9yIHNob3J0IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2hvcnQgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZ4KCh2ZWN0b3IgaW50KV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3QodmVjdG9yIHNob3J0IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCAqX19jKSB7CisgIF9fYnVpbHRpbl9hbHRpdmVjX3N0dngoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCAqX19jKSB7CisgIF9fYnVpbHRpbl9hbHRpdmVjX3N0dngoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0ICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2eCgodmVjdG9yIGludClfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0KHZlY3RvciBib29sIHNob3J0IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCAqX19jKSB7CisgIF9fYnVpbHRpbl9hbHRpdmVjX3N0dngoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdCh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZ4KCh2ZWN0b3IgaW50KV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3QodmVjdG9yIGJvb2wgc2hvcnQgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIHNob3J0ICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2eCgodmVjdG9yIGludClfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0KHZlY3RvciBwaXhlbCBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZ4KCh2ZWN0b3IgaW50KV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3QodmVjdG9yIHBpeGVsIF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCAqX19jKSB7CisgIF9fYnVpbHRpbl9hbHRpdmVjX3N0dngoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdCh2ZWN0b3IgcGl4ZWwgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBwaXhlbCAqX19jKSB7CisgIF9fYnVpbHRpbl9hbHRpdmVjX3N0dngoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdCh2ZWN0b3IgaW50IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgaW50ICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2eChfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0KHZlY3RvciBpbnQgX19hLCBpbnQgX19iLCBpbnQgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZ4KF9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3QodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGludCAqX19jKSB7CisgIF9fYnVpbHRpbl9hbHRpdmVjX3N0dngoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdCh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZ4KCh2ZWN0b3IgaW50KV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3QodmVjdG9yIGJvb2wgaW50IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZ4KCh2ZWN0b3IgaW50KV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3QodmVjdG9yIGJvb2wgaW50IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZ4KCh2ZWN0b3IgaW50KV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3QodmVjdG9yIGJvb2wgaW50IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBpbnQgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZ4KCh2ZWN0b3IgaW50KV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3QodmVjdG9yIGZsb2F0IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgZmxvYXQgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZ4KCh2ZWN0b3IgaW50KV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3QodmVjdG9yIGZsb2F0IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqX19jKSB7CisgIF9fYnVpbHRpbl9hbHRpdmVjX3N0dngoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKKy8qIHZlY19zdHZ4ICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdHZ4KHZlY3RvciBzaWduZWQgY2hhciBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2lnbmVkIGNoYXIgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZ4KCh2ZWN0b3IgaW50KV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2eCh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVkIGNoYXIgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZ4KCh2ZWN0b3IgaW50KV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2eCh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciAqX19jKSB7CisgIF9fYnVpbHRpbl9hbHRpdmVjX3N0dngoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdHZ4KHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZ4KCh2ZWN0b3IgaW50KV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2eCh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lZCBjaGFyICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2eCgodmVjdG9yIGludClfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0dngodmVjdG9yIGJvb2wgY2hhciBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2eCgodmVjdG9yIGludClfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0dngodmVjdG9yIGJvb2wgY2hhciBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBjaGFyICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2eCgodmVjdG9yIGludClfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0dngodmVjdG9yIHNob3J0IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaG9ydCAqX19jKSB7CisgIF9fYnVpbHRpbl9hbHRpdmVjX3N0dngoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdHZ4KHZlY3RvciBzaG9ydCBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCAqX19jKSB7CisgIF9fYnVpbHRpbl9hbHRpdmVjX3N0dngoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdHZ4KHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZ4KCh2ZWN0b3IgaW50KV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2eCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZ4KCh2ZWN0b3IgaW50KV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2eCh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCAqX19jKSB7CisgIF9fYnVpbHRpbl9hbHRpdmVjX3N0dngoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdHZ4KHZlY3RvciBib29sIHNob3J0IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0ICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2eCgodmVjdG9yIGludClfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0dngodmVjdG9yIGJvb2wgc2hvcnQgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgc2hvcnQgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZ4KCh2ZWN0b3IgaW50KV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2eCh2ZWN0b3IgcGl4ZWwgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZ4KCh2ZWN0b3IgaW50KV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2eCh2ZWN0b3IgcGl4ZWwgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZ4KCh2ZWN0b3IgaW50KV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2eCh2ZWN0b3IgcGl4ZWwgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHBpeGVsICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2eCgodmVjdG9yIGludClfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0dngodmVjdG9yIGludCBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgaW50ICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2eChfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0dngodmVjdG9yIGludCBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZ4KF9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2eCh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBpbnQgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZ4KCh2ZWN0b3IgaW50KV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2eCh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqX19jKSB7CisgIF9fYnVpbHRpbl9hbHRpdmVjX3N0dngoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdHZ4KHZlY3RvciBib29sIGludCBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZ4KCh2ZWN0b3IgaW50KV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2eCh2ZWN0b3IgYm9vbCBpbnQgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2eCgodmVjdG9yIGludClfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0dngodmVjdG9yIGJvb2wgaW50IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGludCAqX19jKSB7CisgIF9fYnVpbHRpbl9hbHRpdmVjX3N0dngoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdHZ4KHZlY3RvciBmbG9hdCBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgZmxvYXQgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZ4KCh2ZWN0b3IgaW50KV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2eCh2ZWN0b3IgZmxvYXQgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZ4KCh2ZWN0b3IgaW50KV9fYSwgX19iLCBfX2MpOworfQorCisvKiB2ZWNfc3RlICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdGUodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVkIGNoYXIgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZlYngoKHZlY3RvciBjaGFyKV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3RlKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqX19jKSB7CisgIF9fYnVpbHRpbl9hbHRpdmVjX3N0dmVieCgodmVjdG9yIGNoYXIpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdGUodmVjdG9yIGJvb2wgY2hhciBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lZCBjaGFyICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2ZWJ4KCh2ZWN0b3IgY2hhcilfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0ZSh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqX19jKSB7CisgIF9fYnVpbHRpbl9hbHRpdmVjX3N0dmVieCgodmVjdG9yIGNoYXIpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdGUodmVjdG9yIHNob3J0IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZlaHgoX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdGUodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZlaHgoKHZlY3RvciBzaG9ydClfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0ZSh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0ICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2ZWh4KCh2ZWN0b3Igc2hvcnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdGUodmVjdG9yIGJvb2wgc2hvcnQgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCAqX19jKSB7CisgIF9fYnVpbHRpbl9hbHRpdmVjX3N0dmVoeCgodmVjdG9yIHNob3J0KV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3RlKHZlY3RvciBwaXhlbCBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0ICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2ZWh4KCh2ZWN0b3Igc2hvcnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdGUodmVjdG9yIHBpeGVsIF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZlaHgoKHZlY3RvciBzaG9ydClfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0ZSh2ZWN0b3IgaW50IF9fYSwgaW50IF9fYiwgaW50ICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2ZXd4KF9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3RlKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZld3goKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdGUodmVjdG9yIGJvb2wgaW50IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2ZXd4KCh2ZWN0b3IgaW50KV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3RlKHZlY3RvciBib29sIGludCBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqX19jKSB7CisgIF9fYnVpbHRpbl9hbHRpdmVjX3N0dmV3eCgodmVjdG9yIGludClfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0ZSh2ZWN0b3IgZmxvYXQgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqX19jKSB7CisgIF9fYnVpbHRpbl9hbHRpdmVjX3N0dmV3eCgodmVjdG9yIGludClfX2EsIF9fYiwgX19jKTsKK30KKworLyogdmVjX3N0dmVieCAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2ZWJ4KHZlY3RvciBzaWduZWQgY2hhciBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lZCBjaGFyICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2ZWJ4KCh2ZWN0b3IgY2hhcilfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0dmVieCh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBfX2IsIHVuc2lnbmVkIGNoYXIgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZlYngoKHZlY3RvciBjaGFyKV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2ZWJ4KHZlY3RvciBib29sIGNoYXIgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduZWQgY2hhciAqX19jKSB7CisgIF9fYnVpbHRpbl9hbHRpdmVjX3N0dmVieCgodmVjdG9yIGNoYXIpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdHZlYngodmVjdG9yIGJvb2wgY2hhciBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZlYngoKHZlY3RvciBjaGFyKV9fYSwgX19iLCBfX2MpOworfQorCisvKiB2ZWNfc3R2ZWh4ICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdHZlaHgodmVjdG9yIHNob3J0IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZlaHgoX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdHZlaHgodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IF9fYiwgdW5zaWduZWQgc2hvcnQgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZlaHgoKHZlY3RvciBzaG9ydClfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0dmVoeCh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0ICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2ZWh4KCh2ZWN0b3Igc2hvcnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdHZlaHgodmVjdG9yIGJvb2wgc2hvcnQgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCAqX19jKSB7CisgIF9fYnVpbHRpbl9hbHRpdmVjX3N0dmVoeCgodmVjdG9yIHNob3J0KV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2ZWh4KHZlY3RvciBwaXhlbCBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0ICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2ZWh4KCh2ZWN0b3Igc2hvcnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdHZlaHgodmVjdG9yIHBpeGVsIF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZlaHgoKHZlY3RvciBzaG9ydClfX2EsIF9fYiwgX19jKTsKK30KKworLyogdmVjX3N0dmV3eCAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2ZXd4KHZlY3RvciBpbnQgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZld3goX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdHZld3godmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqX19jKSB7CisgIF9fYnVpbHRpbl9hbHRpdmVjX3N0dmV3eCgodmVjdG9yIGludClfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0dmV3eCh2ZWN0b3IgYm9vbCBpbnQgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZld3goKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdHZld3godmVjdG9yIGJvb2wgaW50IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2ZXd4KCh2ZWN0b3IgaW50KV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2ZXd4KHZlY3RvciBmbG9hdCBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2ZXd4KCh2ZWN0b3IgaW50KV9fYSwgX19iLCBfX2MpOworfQorCisvKiB2ZWNfc3RsICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdGwodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNpZ25lZCBjaGFyICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2eGwoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdGwodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVkIGNoYXIgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZ4bCgodmVjdG9yIGludClfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0bCh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2eGwoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdGwodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2eGwoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdGwodmVjdG9yIGJvb2wgY2hhciBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lZCBjaGFyICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2eGwoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdGwodmVjdG9yIGJvb2wgY2hhciBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZ4bCgodmVjdG9yIGludClfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0bCh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgY2hhciAqX19jKSB7CisgIF9fYnVpbHRpbl9hbHRpdmVjX3N0dnhsKCh2ZWN0b3IgaW50KV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3RsKHZlY3RvciBzaG9ydCBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaG9ydCAqX19jKSB7CisgIF9fYnVpbHRpbl9hbHRpdmVjX3N0dnhsKCh2ZWN0b3IgaW50KV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3RsKHZlY3RvciBzaG9ydCBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0ICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2eGwoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdGwodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0ICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2eGwoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdGwodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZ4bCgodmVjdG9yIGludClfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0bCh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0ICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2eGwoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdGwodmVjdG9yIGJvb2wgc2hvcnQgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCAqX19jKSB7CisgIF9fYnVpbHRpbl9hbHRpdmVjX3N0dnhsKCh2ZWN0b3IgaW50KV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3RsKHZlY3RvciBib29sIHNob3J0IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgc2hvcnQgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZ4bCgodmVjdG9yIGludClfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0bCh2ZWN0b3IgcGl4ZWwgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCAqX19jKSB7CisgIF9fYnVpbHRpbl9hbHRpdmVjX3N0dnhsKCh2ZWN0b3IgaW50KV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3RsKHZlY3RvciBwaXhlbCBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0ICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2eGwoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdGwodmVjdG9yIHBpeGVsIF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHBpeGVsICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2eGwoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdGwodmVjdG9yIGludCBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBpbnQgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZ4bChfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0bCh2ZWN0b3IgaW50IF9fYSwgaW50IF9fYiwgaW50ICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2eGwoX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdGwodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBpbnQgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZ4bCgodmVjdG9yIGludClfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0bCh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2eGwoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdGwodmVjdG9yIGJvb2wgaW50IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2eGwoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdGwodmVjdG9yIGJvb2wgaW50IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2eGwoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdGwodmVjdG9yIGJvb2wgaW50IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgaW50ICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2eGwoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdGwodmVjdG9yIGZsb2F0IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGZsb2F0ICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2eGwoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdGwodmVjdG9yIGZsb2F0IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZ4bCgodmVjdG9yIGludClfX2EsIF9fYiwgX19jKTsKK30KKworLyogdmVjX3N0dnhsICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdHZ4bCh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaWduZWQgY2hhciAqX19jKSB7CisgIF9fYnVpbHRpbl9hbHRpdmVjX3N0dnhsKCh2ZWN0b3IgaW50KV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2eGwodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduZWQgY2hhciAqX19jKSB7CisgIF9fYnVpbHRpbl9hbHRpdmVjX3N0dnhsKCh2ZWN0b3IgaW50KV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2eGwodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2eGwoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdHZ4bCh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqX19jKSB7CisgIF9fYnVpbHRpbl9hbHRpdmVjX3N0dnhsKCh2ZWN0b3IgaW50KV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2eGwodmVjdG9yIGJvb2wgY2hhciBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVkIGNoYXIgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZ4bCgodmVjdG9yIGludClfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0dnhsKHZlY3RvciBib29sIGNoYXIgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZ4bCgodmVjdG9yIGludClfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0dnhsKHZlY3RvciBib29sIGNoYXIgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGNoYXIgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZ4bCgodmVjdG9yIGludClfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0dnhsKHZlY3RvciBzaG9ydCBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNob3J0ICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2eGwoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdHZ4bCh2ZWN0b3Igc2hvcnQgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0ICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2eGwoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdHZ4bCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0ICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2eGwoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdHZ4bCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBfX2IsIHVuc2lnbmVkIHNob3J0ICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2eGwoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdHZ4bCh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZ4bCgodmVjdG9yIGludClfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0dnhsKHZlY3RvciBib29sIHNob3J0IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCAqX19jKSB7CisgIF9fYnVpbHRpbl9hbHRpdmVjX3N0dnhsKCh2ZWN0b3IgaW50KV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2eGwodmVjdG9yIGJvb2wgc2hvcnQgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIHNob3J0ICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2eGwoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdHZ4bCh2ZWN0b3IgcGl4ZWwgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0ICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2eGwoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdHZ4bCh2ZWN0b3IgcGl4ZWwgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0ICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2eGwoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdHZ4bCh2ZWN0b3IgcGl4ZWwgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBwaXhlbCAqX19jKSB7CisgIF9fYnVpbHRpbl9hbHRpdmVjX3N0dnhsKCh2ZWN0b3IgaW50KV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2eGwodmVjdG9yIGludCBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGludCAqX19jKSB7CisgIF9fYnVpbHRpbl9hbHRpdmVjX3N0dnhsKF9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2eGwodmVjdG9yIGludCBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2eGwoX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdHZ4bCh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgaW50ICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2eGwoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdHZ4bCh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZ4bCgodmVjdG9yIGludClfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0dnhsKHZlY3RvciBib29sIGludCBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2eGwoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdHZ4bCh2ZWN0b3IgYm9vbCBpbnQgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqX19jKSB7CisgIF9fYnVpbHRpbl9hbHRpdmVjX3N0dnhsKCh2ZWN0b3IgaW50KV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2eGwodmVjdG9yIGJvb2wgaW50IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBpbnQgKl9fYykgeworICBfX2J1aWx0aW5fYWx0aXZlY19zdHZ4bCgodmVjdG9yIGludClfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0dnhsKHZlY3RvciBmbG9hdCBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGZsb2F0ICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2eGwoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdHZ4bCh2ZWN0b3IgZmxvYXQgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpfX2MpIHsKKyAgX19idWlsdGluX2FsdGl2ZWNfc3R2eGwoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKKy8qIHZlY19zdWIgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3N1Yih2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2EgLSBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19zdWIodmVjdG9yIGJvb2wgY2hhciBfX2EsIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGNoYXIpX19hIC0gX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfc3ViKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2EgLSAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfc3ViKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2EgLSBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3N1Yih2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hIC0gX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19zdWIodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICByZXR1cm4gX19hIC0gKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNob3J0IF9fQVRUUlNfb19haSB2ZWNfc3ViKHZlY3RvciBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNob3J0IF9fYikgeworICByZXR1cm4gX19hIC0gX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY19zdWIodmVjdG9yIGJvb2wgc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2hvcnQpX19hIC0gX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY19zdWIodmVjdG9yIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYSAtICh2ZWN0b3Igc2hvcnQpX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfc3ViKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYSAtIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX3N1Yih2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19hIC0gX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfc3ViKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICByZXR1cm4gX19hIC0gKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY19zdWIodmVjdG9yIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBpbnQgX19iKSB7CisgIHJldHVybiBfX2EgLSBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY19zdWIodmVjdG9yIGJvb2wgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgaW50KV9fYSAtIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX0FUVFJTX29fYWkgdmVjX3N1Yih2ZWN0b3IgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICByZXR1cm4gX19hIC0gKHZlY3RvciBpbnQpX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX3N1Yih2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYSAtIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY19zdWIodmVjdG9yIGJvb2wgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSAtIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY19zdWIodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYSAtICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYjsKK30KKworI2lmIGRlZmluZWQoX19QT1dFUjhfVkVDVE9SX18pICYmIGRlZmluZWQoX19wb3dlcnBjNjRfXykKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgX19pbnQxMjggX19BVFRSU19vX2FpCit2ZWNfc3ViKHZlY3RvciBzaWduZWQgX19pbnQxMjggX19hLCB2ZWN0b3Igc2lnbmVkIF9faW50MTI4IF9fYikgeworICByZXR1cm4gX19hIC0gX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgX19pbnQxMjggX19BVFRSU19vX2FpCit2ZWNfc3ViKHZlY3RvciB1bnNpZ25lZCBfX2ludDEyOCBfX2EsIHZlY3RvciB1bnNpZ25lZCBfX2ludDEyOCBfX2IpIHsKKyAgcmV0dXJuIF9fYSAtIF9fYjsKK30KKyNlbmRpZiAvLyBkZWZpbmVkKF9fUE9XRVI4X1ZFQ1RPUl9fKSAmJiBkZWZpbmVkKF9fcG93ZXJwYzY0X18pCisKKyNpZmRlZiBfX1ZTWF9fCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY19zdWIodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYSAtIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY19zdWIodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2EgLSBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBkb3VibGUgX19BVFRSU19vX2FpIHZlY19zdWIodmVjdG9yIGRvdWJsZSBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBkb3VibGUgX19iKSB7CisgIHJldHVybiBfX2EgLSBfX2I7Cit9CisjZW5kaWYKKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGZsb2F0IF9fQVRUUlNfb19haSB2ZWNfc3ViKHZlY3RvciBmbG9hdCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGZsb2F0IF9fYikgeworICByZXR1cm4gX19hIC0gX19iOworfQorCisvKiB2ZWNfdnN1YnVibSAqLworCisjZGVmaW5lIF9fYnVpbHRpbl9hbHRpdmVjX3ZzdWJ1Ym0gdmVjX3ZzdWJ1Ym0KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3ZzdWJ1Ym0odmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19hIC0gX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfdnN1YnVibSh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgY2hhcilfX2EgLSBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY192c3VidWJtKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2EgLSAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfdnN1YnVibSh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19hIC0gX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY192c3VidWJtKHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EgLSBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3ZzdWJ1Ym0odmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICByZXR1cm4gX19hIC0gKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYjsKK30KKworLyogdmVjX3ZzdWJ1aG0gKi8KKworI2RlZmluZSBfX2J1aWx0aW5fYWx0aXZlY192c3VidWhtIHZlY192c3VidWhtCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaG9ydCBfX0FUVFJTX29fYWkgdmVjX3ZzdWJ1aG0odmVjdG9yIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNob3J0IF9fYikgeworICByZXR1cm4gX19hIC0gX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY192c3VidWhtKHZlY3RvciBib29sIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNob3J0IF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaG9ydClfX2EgLSBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaG9ydCBfX0FUVFJTX29fYWkgdmVjX3ZzdWJ1aG0odmVjdG9yIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2EgLSAodmVjdG9yIHNob3J0KV9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX3ZzdWJ1aG0odmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gX19hIC0gX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfdnN1YnVobSh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19hIC0gX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfdnN1YnVobSh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYSAtICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19iOworfQorCisvKiB2ZWNfdnN1YnV3bSAqLworCisjZGVmaW5lIF9fYnVpbHRpbl9hbHRpdmVjX3ZzdWJ1d20gdmVjX3ZzdWJ1d20KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX0FUVFJTX29fYWkgdmVjX3ZzdWJ1d20odmVjdG9yIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgaW50IF9fYikgeworICByZXR1cm4gX19hIC0gX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfdnN1YnV3bSh2ZWN0b3IgYm9vbCBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgaW50KV9fYSAtIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX0FUVFJTX29fYWkgdmVjX3ZzdWJ1d20odmVjdG9yIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIHJldHVybiBfX2EgLSAodmVjdG9yIGludClfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfdnN1YnV3bSh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYSAtIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY192c3VidXdtKHZlY3RvciBib29sIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGludClfX2EgLSBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfdnN1YnV3bSh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICByZXR1cm4gX19hIC0gKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iOworfQorCisvKiB2ZWNfdnN1YmZwICovCisKKyNkZWZpbmUgX19idWlsdGluX2FsdGl2ZWNfdnN1YmZwIHZlY192c3ViZnAKKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGZsb2F0IF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKK3ZlY192c3ViZnAodmVjdG9yIGZsb2F0IF9fYSwgdmVjdG9yIGZsb2F0IF9fYikgeworICByZXR1cm4gX19hIC0gX19iOworfQorCisvKiB2ZWNfc3ViYyAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX3N1YmModmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192c3ViY3V3KF9fYSwgX19iKTsKK30KKworI2lmIGRlZmluZWQoX19QT1dFUjhfVkVDVE9SX18pICYmIGRlZmluZWQoX19wb3dlcnBjNjRfXykKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBfX2ludDEyOCBfX0FUVFJTX29fYWkKK3ZlY19zdWJjKHZlY3RvciB1bnNpZ25lZCBfX2ludDEyOCBfX2EsIHZlY3RvciB1bnNpZ25lZCBfX2ludDEyOCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZzdWJjdXEoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIF9faW50MTI4IF9fQVRUUlNfb19haQordmVjX3N1YmModmVjdG9yIHNpZ25lZCBfX2ludDEyOCBfX2EsIHZlY3RvciBzaWduZWQgX19pbnQxMjggX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192c3ViY3VxKF9fYSwgX19iKTsKK30KKyNlbmRpZiAvLyBkZWZpbmVkKF9fUE9XRVI4X1ZFQ1RPUl9fKSAmJiBkZWZpbmVkKF9fcG93ZXJwYzY0X18pCisKKy8qIHZlY192c3ViY3V3ICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKQordmVjX3ZzdWJjdXcodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192c3ViY3V3KF9fYSwgX19iKTsKK30KKworLyogdmVjX3N1YnMgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3N1YnModmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdnN1YnNicyhfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19zdWJzKHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192c3Vic2JzKCh2ZWN0b3Igc2lnbmVkIGNoYXIpX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfc3Vicyh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdnN1YnNicyhfX2EsICh2ZWN0b3Igc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfc3Vicyh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdnN1YnVicyhfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3N1YnModmVjdG9yIGJvb2wgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdnN1YnVicygodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19zdWJzKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZzdWJ1YnMoX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNob3J0IF9fQVRUUlNfb19haSB2ZWNfc3Vicyh2ZWN0b3Igc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192c3Vic2hzKF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNob3J0IF9fQVRUUlNfb19haSB2ZWNfc3Vicyh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZzdWJzaHMoKHZlY3RvciBzaG9ydClfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaG9ydCBfX0FUVFJTX29fYWkgdmVjX3N1YnModmVjdG9yIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192c3Vic2hzKF9fYSwgKHZlY3RvciBzaG9ydClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfc3Vicyh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192c3VidWhzKF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX3N1YnModmVjdG9yIGJvb2wgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192c3VidWhzKCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfc3Vicyh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZzdWJ1aHMoX19hLCAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY19zdWJzKHZlY3RvciBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZzdWJzd3MoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfc3Vicyh2ZWN0b3IgYm9vbCBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZzdWJzd3MoKHZlY3RvciBpbnQpX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfc3Vicyh2ZWN0b3IgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZzdWJzd3MoX19hLCAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX3N1YnModmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192c3VidXdzKF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY19zdWJzKHZlY3RvciBib29sIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192c3VidXdzKCh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY19zdWJzKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192c3VidXdzKF9fYSwgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iKTsKK30KKworLyogdmVjX3ZzdWJzYnMgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3ZzdWJzYnModmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdnN1YnNicyhfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY192c3Vic2JzKHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192c3Vic2JzKCh2ZWN0b3Igc2lnbmVkIGNoYXIpX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfdnN1YnNicyh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdnN1YnNicyhfX2EsICh2ZWN0b3Igc2lnbmVkIGNoYXIpX19iKTsKK30KKworLyogdmVjX3ZzdWJ1YnMgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfdnN1YnVicyh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdnN1YnVicyhfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3ZzdWJ1YnModmVjdG9yIGJvb2wgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdnN1YnVicygodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY192c3VidWJzKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZzdWJ1YnMoX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworLyogdmVjX3ZzdWJzaHMgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNob3J0IF9fQVRUUlNfb19haSB2ZWNfdnN1YnNocyh2ZWN0b3Igc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192c3Vic2hzKF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNob3J0IF9fQVRUUlNfb19haSB2ZWNfdnN1YnNocyh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZzdWJzaHMoKHZlY3RvciBzaG9ydClfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaG9ydCBfX0FUVFJTX29fYWkgdmVjX3ZzdWJzaHModmVjdG9yIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192c3Vic2hzKF9fYSwgKHZlY3RvciBzaG9ydClfX2IpOworfQorCisvKiB2ZWNfdnN1YnVocyAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfdnN1YnVocyh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192c3VidWhzKF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX3ZzdWJ1aHModmVjdG9yIGJvb2wgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192c3VidWhzKCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfdnN1YnVocyh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZzdWJ1aHMoX19hLCAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYik7Cit9CisKKy8qIHZlY192c3Vic3dzICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY192c3Vic3dzKHZlY3RvciBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZzdWJzd3MoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfdnN1YnN3cyh2ZWN0b3IgYm9vbCBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZzdWJzd3MoKHZlY3RvciBpbnQpX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfdnN1YnN3cyh2ZWN0b3IgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZzdWJzd3MoX19hLCAodmVjdG9yIGludClfX2IpOworfQorCisvKiB2ZWNfdnN1YnV3cyAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX3ZzdWJ1d3ModmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192c3VidXdzKF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY192c3VidXdzKHZlY3RvciBib29sIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192c3VidXdzKCh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY192c3VidXdzKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192c3VidXdzKF9fYSwgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iKTsKK30KKworI2lmIGRlZmluZWQoX19QT1dFUjhfVkVDVE9SX18pICYmIGRlZmluZWQoX19wb3dlcnBjNjRfXykKKy8qIHZlY192c3VidXFtICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgX19pbnQxMjggX19BVFRSU19vX2FpCit2ZWNfdnN1YnVxbSh2ZWN0b3Igc2lnbmVkIF9faW50MTI4IF9fYSwgdmVjdG9yIHNpZ25lZCBfX2ludDEyOCBfX2IpIHsKKyAgcmV0dXJuIF9fYSAtIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIF9faW50MTI4IF9fQVRUUlNfb19haQordmVjX3ZzdWJ1cW0odmVjdG9yIHVuc2lnbmVkIF9faW50MTI4IF9fYSwgdmVjdG9yIHVuc2lnbmVkIF9faW50MTI4IF9fYikgeworICByZXR1cm4gX19hIC0gX19iOworfQorCisvKiB2ZWNfdnN1YmV1cW0gKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBfX2ludDEyOCBfX0FUVFJTX29fYWkKK3ZlY192c3ViZXVxbSh2ZWN0b3Igc2lnbmVkIF9faW50MTI4IF9fYSwgdmVjdG9yIHNpZ25lZCBfX2ludDEyOCBfX2IsCisgICAgICAgICAgICAgdmVjdG9yIHNpZ25lZCBfX2ludDEyOCBfX2MpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZzdWJldXFtKF9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgX19pbnQxMjggX19BVFRSU19vX2FpCit2ZWNfdnN1YmV1cW0odmVjdG9yIHVuc2lnbmVkIF9faW50MTI4IF9fYSwgdmVjdG9yIHVuc2lnbmVkIF9faW50MTI4IF9fYiwKKyAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgX19pbnQxMjggX19jKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192c3ViZXVxbShfX2EsIF9fYiwgX19jKTsKK30KKworLyogdmVjX3ZzdWJjdXEgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBfX2ludDEyOCBfX0FUVFJTX29fYWkKK3ZlY192c3ViY3VxKHZlY3RvciBzaWduZWQgX19pbnQxMjggX19hLCB2ZWN0b3Igc2lnbmVkIF9faW50MTI4IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdnN1YmN1cShfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBfX2ludDEyOCBfX0FUVFJTX29fYWkKK3ZlY192c3ViY3VxKHZlY3RvciB1bnNpZ25lZCBfX2ludDEyOCBfX2EsIHZlY3RvciB1bnNpZ25lZCBfX2ludDEyOCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZzdWJjdXEoX19hLCBfX2IpOworfQorCisvKiB2ZWNfdnN1YmVjdXEgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBfX2ludDEyOCBfX0FUVFJTX29fYWkKK3ZlY192c3ViZWN1cSh2ZWN0b3Igc2lnbmVkIF9faW50MTI4IF9fYSwgdmVjdG9yIHNpZ25lZCBfX2ludDEyOCBfX2IsCisgICAgICAgICAgICAgdmVjdG9yIHNpZ25lZCBfX2ludDEyOCBfX2MpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZzdWJlY3VxKF9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgX19pbnQxMjggX19BVFRSU19vX2FpCit2ZWNfdnN1YmVjdXEodmVjdG9yIHVuc2lnbmVkIF9faW50MTI4IF9fYSwgdmVjdG9yIHVuc2lnbmVkIF9faW50MTI4IF9fYiwKKyAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgX19pbnQxMjggX19jKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192c3ViZWN1cShfX2EsIF9fYiwgX19jKTsKK30KKyNlbmRpZiAvLyBkZWZpbmVkKF9fUE9XRVI4X1ZFQ1RPUl9fKSAmJiBkZWZpbmVkKF9fcG93ZXJwYzY0X18pCisKKy8qIHZlY19zdW00cyAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfc3VtNHModmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdnN1bTRzYnMoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX3N1bTRzKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZzdW00dWJzKF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX0FUVFJTX29fYWkgdmVjX3N1bTRzKHZlY3RvciBzaWduZWQgc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192c3VtNHNocyhfX2EsIF9fYik7Cit9CisKKy8qIHZlY192c3VtNHNicyAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKK3ZlY192c3VtNHNicyh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdnN1bTRzYnMoX19hLCBfX2IpOworfQorCisvKiB2ZWNfdnN1bTR1YnMgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpCit2ZWNfdnN1bTR1YnModmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdnN1bTR1YnMoX19hLCBfX2IpOworfQorCisvKiB2ZWNfdnN1bTRzaHMgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpCit2ZWNfdnN1bTRzaHModmVjdG9yIHNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192c3VtNHNocyhfX2EsIF9fYik7Cit9CisKKy8qIHZlY19zdW0ycyAqLworCisvKiBUaGUgdnN1bTJzd3MgaW5zdHJ1Y3Rpb24gaGFzIGEgYmlnLWVuZGlhbiBiaWFzLCBzbyB0aGF0IHRoZSBzZWNvbmQKKyAgIGlucHV0IHZlY3RvciBhbmQgdGhlIHJlc3VsdCBhbHdheXMgcmVmZXJlbmNlIGJpZy1lbmRpYW4gZWxlbWVudHMKKyAgIDEgYW5kIDMgKGxpdHRsZS1lbmRpYW4gZWxlbWVudCAwIGFuZCAyKS4gIEZvciBlYXNlIG9mIHBvcnRpbmcgdGhlCisgICBwcm9ncmFtbWVyIHdhbnRzIGVsZW1lbnRzIDEgYW5kIDMgaW4gYm90aCBjYXNlcywgc28gZm9yIGxpdHRsZQorICAgZW5kaWFuIHdlIG11c3QgcGVyZm9ybSBzb21lIHBlcm11dGVzLiAgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBpbnQgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKQordmVjX3N1bTJzKHZlY3RvciBpbnQgX19hLCB2ZWN0b3IgaW50IF9fYikgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHZlY3RvciBpbnQgX19jID0gKHZlY3RvciBzaWduZWQgaW50KXZlY19wZXJtKAorICAgICAgX19iLCBfX2IsICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoNCwgNSwgNiwgNywgMCwgMSwgMiwgMywgMTIsIDEzLCAxNCwgMTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LCA5LCAxMCwgMTEpKTsKKyAgX19jID0gX19idWlsdGluX2FsdGl2ZWNfdnN1bTJzd3MoX19hLCBfX2MpOworICByZXR1cm4gKHZlY3RvciBzaWduZWQgaW50KXZlY19wZXJtKAorICAgICAgX19jLCBfX2MsICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoNCwgNSwgNiwgNywgMCwgMSwgMiwgMywgMTIsIDEzLCAxNCwgMTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LCA5LCAxMCwgMTEpKTsKKyNlbHNlCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192c3VtMnN3cyhfX2EsIF9fYik7CisjZW5kaWYKK30KKworLyogdmVjX3ZzdW0yc3dzICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgaW50IF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKK3ZlY192c3VtMnN3cyh2ZWN0b3IgaW50IF9fYSwgdmVjdG9yIGludCBfX2IpIHsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworICB2ZWN0b3IgaW50IF9fYyA9ICh2ZWN0b3Igc2lnbmVkIGludCl2ZWNfcGVybSgKKyAgICAgIF9fYiwgX19iLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDQsIDUsIDYsIDcsIDAsIDEsIDIsIDMsIDEyLCAxMywgMTQsIDE1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwgOSwgMTAsIDExKSk7CisgIF9fYyA9IF9fYnVpbHRpbl9hbHRpdmVjX3ZzdW0yc3dzKF9fYSwgX19jKTsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGludCl2ZWNfcGVybSgKKyAgICAgIF9fYywgX19jLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDQsIDUsIDYsIDcsIDAsIDEsIDIsIDMsIDEyLCAxMywgMTQsIDE1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwgOSwgMTAsIDExKSk7CisjZWxzZQorICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdnN1bTJzd3MoX19hLCBfX2IpOworI2VuZGlmCit9CisKKy8qIHZlY19zdW1zICovCisKKy8qIFRoZSB2c3Vtc3dzIGluc3RydWN0aW9uIGhhcyBhIGJpZy1lbmRpYW4gYmlhcywgc28gdGhhdCB0aGUgc2Vjb25kCisgICBpbnB1dCB2ZWN0b3IgYW5kIHRoZSByZXN1bHQgYWx3YXlzIHJlZmVyZW5jZSBiaWctZW5kaWFuIGVsZW1lbnQgMworICAgKGxpdHRsZS1lbmRpYW4gZWxlbWVudCAwKS4gIEZvciBlYXNlIG9mIHBvcnRpbmcgdGhlIHByb2dyYW1tZXIKKyAgIHdhbnRzIGVsZW1lbnQgMyBpbiBib3RoIGNhc2VzLCBzbyBmb3IgbGl0dGxlIGVuZGlhbiB3ZSBtdXN0IHBlcmZvcm0KKyAgIHNvbWUgcGVybXV0ZXMuICAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpCit2ZWNfc3Vtcyh2ZWN0b3Igc2lnbmVkIGludCBfX2EsIHZlY3RvciBzaWduZWQgaW50IF9fYikgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIF9fYiA9ICh2ZWN0b3Igc2lnbmVkIGludCl2ZWNfc3BsYXQoX19iLCAzKTsKKyAgX19iID0gX19idWlsdGluX2FsdGl2ZWNfdnN1bXN3cyhfX2EsIF9fYik7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBpbnQpKDAsIDAsIDAsIF9fYlswXSk7CisjZWxzZQorICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdnN1bXN3cyhfX2EsIF9fYik7CisjZW5kaWYKK30KKworLyogdmVjX3ZzdW1zd3MgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBpbnQgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKQordmVjX3ZzdW1zd3ModmVjdG9yIHNpZ25lZCBpbnQgX19hLCB2ZWN0b3Igc2lnbmVkIGludCBfX2IpIHsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworICBfX2IgPSAodmVjdG9yIHNpZ25lZCBpbnQpdmVjX3NwbGF0KF9fYiwgMyk7CisgIF9fYiA9IF9fYnVpbHRpbl9hbHRpdmVjX3ZzdW1zd3MoX19hLCBfX2IpOworICByZXR1cm4gKHZlY3RvciBzaWduZWQgaW50KSgwLCAwLCAwLCBfX2JbMF0pOworI2Vsc2UKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZzdW1zd3MoX19hLCBfX2IpOworI2VuZGlmCit9CisKKy8qIHZlY190cnVuYyAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZmxvYXQgX19BVFRSU19vX2FpIHZlY190cnVuYyh2ZWN0b3IgZmxvYXQgX19hKSB7CisjaWZkZWYgX19WU1hfXworICByZXR1cm4gX19idWlsdGluX3ZzeF94dnJzcGl6KF9fYSk7CisjZWxzZQorICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdnJmaXooX19hKTsKKyNlbmRpZgorfQorCisjaWZkZWYgX19WU1hfXworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGRvdWJsZSBfX0FUVFJTX29fYWkgdmVjX3RydW5jKHZlY3RvciBkb3VibGUgX19hKSB7CisgIHJldHVybiBfX2J1aWx0aW5fdnN4X3h2cmRwaXooX19hKTsKK30KKyNlbmRpZgorCisvKiB2ZWNfdnJmaXogKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGZsb2F0IF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKK3ZlY192cmZpeih2ZWN0b3IgZmxvYXQgX19hKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192cmZpeihfX2EpOworfQorCisvKiB2ZWNfdW5wYWNraCAqLworCisvKiBUaGUgdmVjdG9yIHVucGFjayBpbnN0cnVjdGlvbnMgYWxsIGhhdmUgYSBiaWctZW5kaWFuIGJpYXMsIHNvIGZvcgorICAgbGl0dGxlIGVuZGlhbiB3ZSBtdXN0IHJldmVyc2UgdGhlIG1lYW5pbmdzIG9mICJoaWdoIiBhbmQgImxvdy4iICAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfdW5wYWNraCh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hKSB7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3Z1cGtsc2IoKHZlY3RvciBjaGFyKV9fYSk7CisjZWxzZQorICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdnVwa2hzYigodmVjdG9yIGNoYXIpX19hKTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY191bnBhY2toKHZlY3RvciBib29sIGNoYXIgX19hKSB7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBzaG9ydClfX2J1aWx0aW5fYWx0aXZlY192dXBrbHNiKCh2ZWN0b3IgY2hhcilfX2EpOworI2Vsc2UKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBzaG9ydClfX2J1aWx0aW5fYWx0aXZlY192dXBraHNiKCh2ZWN0b3IgY2hhcilfX2EpOworI2VuZGlmCit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY191bnBhY2toKHZlY3RvciBzaG9ydCBfX2EpIHsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdnVwa2xzaChfX2EpOworI2Vsc2UKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3Z1cGtoc2goX19hKTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBpbnQgX19BVFRSU19vX2FpCit2ZWNfdW5wYWNraCh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EpIHsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworICByZXR1cm4gKHZlY3RvciBib29sIGludClfX2J1aWx0aW5fYWx0aXZlY192dXBrbHNoKCh2ZWN0b3Igc2hvcnQpX19hKTsKKyNlbHNlCisgIHJldHVybiAodmVjdG9yIGJvb2wgaW50KV9fYnVpbHRpbl9hbHRpdmVjX3Z1cGtoc2goKHZlY3RvciBzaG9ydClfX2EpOworI2VuZGlmCit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfdW5wYWNraCh2ZWN0b3IgcGl4ZWwgX19hKSB7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYnVpbHRpbl9hbHRpdmVjX3Z1cGtscHgoKHZlY3RvciBzaG9ydClfX2EpOworI2Vsc2UKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYnVpbHRpbl9hbHRpdmVjX3Z1cGtocHgoKHZlY3RvciBzaG9ydClfX2EpOworI2VuZGlmCit9CisKKyNpZmRlZiBfX1BPV0VSOF9WRUNUT1JfXworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkgdmVjX3VucGFja2godmVjdG9yIGludCBfX2EpIHsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdnVwa2xzdyhfX2EpOworI2Vsc2UKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3Z1cGtoc3coX19hKTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfdW5wYWNraCh2ZWN0b3IgYm9vbCBpbnQgX19hKSB7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBsb25nIGxvbmcpX19idWlsdGluX2FsdGl2ZWNfdnVwa2xzdygodmVjdG9yIGludClfX2EpOworI2Vsc2UKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBsb25nIGxvbmcpX19idWlsdGluX2FsdGl2ZWNfdnVwa2hzdygodmVjdG9yIGludClfX2EpOworI2VuZGlmCit9CisjZW5kaWYKKworLyogdmVjX3Z1cGtoc2IgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNob3J0IF9fQVRUUlNfb19haQordmVjX3Z1cGtoc2IodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSkgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192dXBrbHNiKCh2ZWN0b3IgY2hhcilfX2EpOworI2Vsc2UKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3Z1cGtoc2IoKHZlY3RvciBjaGFyKV9fYSk7CisjZW5kaWYKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfdnVwa2hzYih2ZWN0b3IgYm9vbCBjaGFyIF9fYSkgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHJldHVybiAodmVjdG9yIGJvb2wgc2hvcnQpX19idWlsdGluX2FsdGl2ZWNfdnVwa2xzYigodmVjdG9yIGNoYXIpX19hKTsKKyNlbHNlCisgIHJldHVybiAodmVjdG9yIGJvb2wgc2hvcnQpX19idWlsdGluX2FsdGl2ZWNfdnVwa2hzYigodmVjdG9yIGNoYXIpX19hKTsKKyNlbmRpZgorfQorCisvKiB2ZWNfdnVwa2hzaCAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfdnVwa2hzaCh2ZWN0b3Igc2hvcnQgX19hKSB7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3Z1cGtsc2goX19hKTsKKyNlbHNlCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192dXBraHNoKF9fYSk7CisjZW5kaWYKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgaW50IF9fQVRUUlNfb19haQordmVjX3Z1cGtoc2godmVjdG9yIGJvb2wgc2hvcnQgX19hKSB7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBpbnQpX19idWlsdGluX2FsdGl2ZWNfdnVwa2xzaCgodmVjdG9yIHNob3J0KV9fYSk7CisjZWxzZQorICByZXR1cm4gKHZlY3RvciBib29sIGludClfX2J1aWx0aW5fYWx0aXZlY192dXBraHNoKCh2ZWN0b3Igc2hvcnQpX19hKTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX3Z1cGtoc2godmVjdG9yIHBpeGVsIF9fYSkgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGludClfX2J1aWx0aW5fYWx0aXZlY192dXBrbHB4KCh2ZWN0b3Igc2hvcnQpX19hKTsKKyNlbHNlCisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGludClfX2J1aWx0aW5fYWx0aXZlY192dXBraHB4KCh2ZWN0b3Igc2hvcnQpX19hKTsKKyNlbmRpZgorfQorCisvKiB2ZWNfdnVwa2hzdyAqLworCisjaWZkZWYgX19QT1dFUjhfVkVDVE9SX18KK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBsb25nIGxvbmcgX19BVFRSU19vX2FpIHZlY192dXBraHN3KHZlY3RvciBpbnQgX19hKSB7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3Z1cGtsc3coX19hKTsKKyNlbHNlCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192dXBraHN3KF9fYSk7CisjZW5kaWYKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX3Z1cGtoc3codmVjdG9yIGJvb2wgaW50IF9fYSkgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHJldHVybiAodmVjdG9yIGJvb2wgbG9uZyBsb25nKV9fYnVpbHRpbl9hbHRpdmVjX3Z1cGtsc3coKHZlY3RvciBpbnQpX19hKTsKKyNlbHNlCisgIHJldHVybiAodmVjdG9yIGJvb2wgbG9uZyBsb25nKV9fYnVpbHRpbl9hbHRpdmVjX3Z1cGtoc3coKHZlY3RvciBpbnQpX19hKTsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qIHZlY191bnBhY2tsICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY191bnBhY2tsKHZlY3RvciBzaWduZWQgY2hhciBfX2EpIHsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdnVwa2hzYigodmVjdG9yIGNoYXIpX19hKTsKKyNlbHNlCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192dXBrbHNiKCh2ZWN0b3IgY2hhcilfX2EpOworI2VuZGlmCit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIHNob3J0IF9fQVRUUlNfb19haQordmVjX3VucGFja2wodmVjdG9yIGJvb2wgY2hhciBfX2EpIHsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworICByZXR1cm4gKHZlY3RvciBib29sIHNob3J0KV9fYnVpbHRpbl9hbHRpdmVjX3Z1cGtoc2IoKHZlY3RvciBjaGFyKV9fYSk7CisjZWxzZQorICByZXR1cm4gKHZlY3RvciBib29sIHNob3J0KV9fYnVpbHRpbl9hbHRpdmVjX3Z1cGtsc2IoKHZlY3RvciBjaGFyKV9fYSk7CisjZW5kaWYKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX0FUVFJTX29fYWkgdmVjX3VucGFja2wodmVjdG9yIHNob3J0IF9fYSkgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192dXBraHNoKF9fYSk7CisjZWxzZQorICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdnVwa2xzaChfX2EpOworI2VuZGlmCit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGludCBfX0FUVFJTX29fYWkKK3ZlY191bnBhY2tsKHZlY3RvciBib29sIHNob3J0IF9fYSkgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHJldHVybiAodmVjdG9yIGJvb2wgaW50KV9fYnVpbHRpbl9hbHRpdmVjX3Z1cGtoc2goKHZlY3RvciBzaG9ydClfX2EpOworI2Vsc2UKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBpbnQpX19idWlsdGluX2FsdGl2ZWNfdnVwa2xzaCgodmVjdG9yIHNob3J0KV9fYSk7CisjZW5kaWYKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY191bnBhY2tsKHZlY3RvciBwaXhlbCBfX2EpIHsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBpbnQpX19idWlsdGluX2FsdGl2ZWNfdnVwa2hweCgodmVjdG9yIHNob3J0KV9fYSk7CisjZWxzZQorICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBpbnQpX19idWlsdGluX2FsdGl2ZWNfdnVwa2xweCgodmVjdG9yIHNob3J0KV9fYSk7CisjZW5kaWYKK30KKworI2lmZGVmIF9fUE9XRVI4X1ZFQ1RPUl9fCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgbG9uZyBsb25nIF9fQVRUUlNfb19haSB2ZWNfdW5wYWNrbCh2ZWN0b3IgaW50IF9fYSkgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192dXBraHN3KF9fYSk7CisjZWxzZQorICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdnVwa2xzdyhfX2EpOworI2VuZGlmCit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY191bnBhY2tsKHZlY3RvciBib29sIGludCBfX2EpIHsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworICByZXR1cm4gKHZlY3RvciBib29sIGxvbmcgbG9uZylfX2J1aWx0aW5fYWx0aXZlY192dXBraHN3KCh2ZWN0b3IgaW50KV9fYSk7CisjZWxzZQorICByZXR1cm4gKHZlY3RvciBib29sIGxvbmcgbG9uZylfX2J1aWx0aW5fYWx0aXZlY192dXBrbHN3KCh2ZWN0b3IgaW50KV9fYSk7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKiB2ZWNfdnVwa2xzYiAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfdnVwa2xzYih2ZWN0b3Igc2lnbmVkIGNoYXIgX19hKSB7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3Z1cGtoc2IoKHZlY3RvciBjaGFyKV9fYSk7CisjZWxzZQorICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdnVwa2xzYigodmVjdG9yIGNoYXIpX19hKTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY192dXBrbHNiKHZlY3RvciBib29sIGNoYXIgX19hKSB7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBzaG9ydClfX2J1aWx0aW5fYWx0aXZlY192dXBraHNiKCh2ZWN0b3IgY2hhcilfX2EpOworI2Vsc2UKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBzaG9ydClfX2J1aWx0aW5fYWx0aXZlY192dXBrbHNiKCh2ZWN0b3IgY2hhcilfX2EpOworI2VuZGlmCit9CisKKy8qIHZlY192dXBrbHNoICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY192dXBrbHNoKHZlY3RvciBzaG9ydCBfX2EpIHsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdnVwa2hzaChfX2EpOworI2Vsc2UKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3Z1cGtsc2goX19hKTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBpbnQgX19BVFRSU19vX2FpCit2ZWNfdnVwa2xzaCh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EpIHsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworICByZXR1cm4gKHZlY3RvciBib29sIGludClfX2J1aWx0aW5fYWx0aXZlY192dXBraHNoKCh2ZWN0b3Igc2hvcnQpX19hKTsKKyNlbHNlCisgIHJldHVybiAodmVjdG9yIGJvb2wgaW50KV9fYnVpbHRpbl9hbHRpdmVjX3Z1cGtsc2goKHZlY3RvciBzaG9ydClfX2EpOworI2VuZGlmCit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfdnVwa2xzaCh2ZWN0b3IgcGl4ZWwgX19hKSB7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYnVpbHRpbl9hbHRpdmVjX3Z1cGtocHgoKHZlY3RvciBzaG9ydClfX2EpOworI2Vsc2UKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYnVpbHRpbl9hbHRpdmVjX3Z1cGtscHgoKHZlY3RvciBzaG9ydClfX2EpOworI2VuZGlmCit9CisKKy8qIHZlY192dXBrbHN3ICovCisKKyNpZmRlZiBfX1BPV0VSOF9WRUNUT1JfXworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkgdmVjX3Z1cGtsc3codmVjdG9yIGludCBfX2EpIHsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdnVwa2hzdyhfX2EpOworI2Vsc2UKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3Z1cGtsc3coX19hKTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfdnVwa2xzdyh2ZWN0b3IgYm9vbCBpbnQgX19hKSB7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBsb25nIGxvbmcpX19idWlsdGluX2FsdGl2ZWNfdnVwa2hzdygodmVjdG9yIGludClfX2EpOworI2Vsc2UKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBsb25nIGxvbmcpX19idWlsdGluX2FsdGl2ZWNfdnVwa2xzdygodmVjdG9yIGludClfX2EpOworI2VuZGlmCit9CisjZW5kaWYKKworLyogdmVjX3ZzeF9sZCAqLworCisjaWZkZWYgX19WU1hfXworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBpbnQgX19BVFRSU19vX2FpCit2ZWNfdnN4X2xkKGludCBfX2EsIGNvbnN0IHZlY3RvciBib29sIGludCAqX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgaW50KV9fYnVpbHRpbl92c3hfbHh2dzR4KF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfdnN4X2xkKGludCBfX2EsIGNvbnN0IHZlY3RvciBzaWduZWQgaW50ICpfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGludClfX2J1aWx0aW5fdnN4X2x4dnc0eChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX3ZzeF9sZChpbnQgX19hLCBjb25zdCBzaWduZWQgaW50ICpfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGludClfX2J1aWx0aW5fdnN4X2x4dnc0eChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfdnN4X2xkKGludCBfX2EsIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBpbnQgKl9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBpbnQpX19idWlsdGluX3ZzeF9seHZ3NHgoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX3ZzeF9sZChpbnQgX19hLCBjb25zdCB1bnNpZ25lZCBpbnQgKl9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBpbnQpX19idWlsdGluX3ZzeF9seHZ3NHgoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZmxvYXQgX19BVFRSU19vX2FpCit2ZWNfdnN4X2xkKGludCBfX2EsIGNvbnN0IHZlY3RvciBmbG9hdCAqX19iKSB7CisgIHJldHVybiAodmVjdG9yIGZsb2F0KV9fYnVpbHRpbl92c3hfbHh2dzR4KF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGZsb2F0IF9fQVRUUlNfb19haSB2ZWNfdnN4X2xkKGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKl9fYikgeworICByZXR1cm4gKHZlY3RvciBmbG9hdClfX2J1aWx0aW5fdnN4X2x4dnc0eChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX3ZzeF9sZChpbnQgX19hLCBjb25zdCB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyAqX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpX19idWlsdGluX3ZzeF9seHZkMngoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX3ZzeF9sZChpbnQgX19hLCBjb25zdCB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nICpfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYnVpbHRpbl92c3hfbHh2ZDJ4KF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGRvdWJsZSBfX0FUVFJTX29fYWkKK3ZlY192c3hfbGQoaW50IF9fYSwgY29uc3QgdmVjdG9yIGRvdWJsZSAqX19iKSB7CisgIHJldHVybiAodmVjdG9yIGRvdWJsZSlfX2J1aWx0aW5fdnN4X2x4dmQyeChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBkb3VibGUgX19BVFRSU19vX2FpCit2ZWNfdnN4X2xkKGludCBfX2EsIGNvbnN0IGRvdWJsZSAqX19iKSB7CisgIHJldHVybiAodmVjdG9yIGRvdWJsZSlfX2J1aWx0aW5fdnN4X2x4dmQyeChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIHNob3J0IF9fQVRUUlNfb19haQordmVjX3ZzeF9sZChpbnQgX19hLCBjb25zdCB2ZWN0b3IgYm9vbCBzaG9ydCAqX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgc2hvcnQpX19idWlsdGluX3ZzeF9seHZ3NHgoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX3ZzeF9sZChpbnQgX19hLCBjb25zdCB2ZWN0b3Igc2lnbmVkIHNob3J0ICpfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIHNob3J0KV9fYnVpbHRpbl92c3hfbHh2dzR4KF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY192c3hfbGQoaW50IF9fYSwgY29uc3Qgc2lnbmVkIHNob3J0ICpfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIHNob3J0KV9fYnVpbHRpbl92c3hfbHh2dzR4KF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX3ZzeF9sZChpbnQgX19hLCBjb25zdCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgKl9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2J1aWx0aW5fdnN4X2x4dnc0eChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY192c3hfbGQoaW50IF9fYSwgY29uc3QgdW5zaWduZWQgc2hvcnQgKl9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2J1aWx0aW5fdnN4X2x4dnc0eChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfdnN4X2xkKGludCBfX2EsIGNvbnN0IHZlY3RvciBib29sIGNoYXIgKl9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIGNoYXIpX19idWlsdGluX3ZzeF9seHZ3NHgoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfdnN4X2xkKGludCBfX2EsIGNvbnN0IHZlY3RvciBzaWduZWQgY2hhciAqX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYnVpbHRpbl92c3hfbHh2dzR4KF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3ZzeF9sZChpbnQgX19hLCBjb25zdCBzaWduZWQgY2hhciAqX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYnVpbHRpbl92c3hfbHh2dzR4KF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfdnN4X2xkKGludCBfX2EsIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBjaGFyICpfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2J1aWx0aW5fdnN4X2x4dnc0eChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3ZzeF9sZChpbnQgX19hLCBjb25zdCB1bnNpZ25lZCBjaGFyICpfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2J1aWx0aW5fdnN4X2x4dnc0eChfX2EsIF9fYik7Cit9CisKKyNlbmRpZgorCisvKiB2ZWNfdnN4X3N0ICovCisKKyNpZmRlZiBfX1ZTWF9fCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY192c3hfc3QodmVjdG9yIGJvb2wgaW50IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgaW50ICpfX2MpIHsKKyAgX19idWlsdGluX3ZzeF9zdHh2dzR4KCh2ZWN0b3IgaW50KV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfdnN4X3N0KHZlY3RvciBib29sIGludCBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lZCBpbnQgKl9fYykgeworICBfX2J1aWx0aW5fdnN4X3N0eHZ3NHgoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY192c3hfc3QodmVjdG9yIGJvb2wgaW50IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpfX2MpIHsKKyAgX19idWlsdGluX3ZzeF9zdHh2dzR4KCh2ZWN0b3IgaW50KV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfdnN4X3N0KHZlY3RvciBzaWduZWQgaW50IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNpZ25lZCBpbnQgKl9fYykgeworICBfX2J1aWx0aW5fdnN4X3N0eHZ3NHgoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY192c3hfc3QodmVjdG9yIHNpZ25lZCBpbnQgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduZWQgaW50ICpfX2MpIHsKKyAgX19idWlsdGluX3ZzeF9zdHh2dzR4KCh2ZWN0b3IgaW50KV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfdnN4X3N0KHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgaW50ICpfX2MpIHsKKyAgX19idWlsdGluX3ZzeF9zdHh2dzR4KCh2ZWN0b3IgaW50KV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfdnN4X3N0KHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKl9fYykgeworICBfX2J1aWx0aW5fdnN4X3N0eHZ3NHgoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY192c3hfc3QodmVjdG9yIGZsb2F0IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGZsb2F0ICpfX2MpIHsKKyAgX19idWlsdGluX3ZzeF9zdHh2dzR4KCh2ZWN0b3IgaW50KV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfdnN4X3N0KHZlY3RvciBmbG9hdCBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpfX2MpIHsKKyAgX19idWlsdGluX3ZzeF9zdHh2dzR4KCh2ZWN0b3IgaW50KV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfdnN4X3N0KHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgKl9fYykgeworICBfX2J1aWx0aW5fdnN4X3N0eHZkMngoKHZlY3RvciBkb3VibGUpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY192c3hfc3QodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgKl9fYykgeworICBfX2J1aWx0aW5fdnN4X3N0eHZkMngoKHZlY3RvciBkb3VibGUpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY192c3hfc3QodmVjdG9yIGRvdWJsZSBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBkb3VibGUgKl9fYykgeworICBfX2J1aWx0aW5fdnN4X3N0eHZkMngoKHZlY3RvciBkb3VibGUpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY192c3hfc3QodmVjdG9yIGRvdWJsZSBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAqX19jKSB7CisgIF9fYnVpbHRpbl92c3hfc3R4dmQyeCgodmVjdG9yIGRvdWJsZSlfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3ZzeF9zdCh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIHNob3J0ICpfX2MpIHsKKyAgX19idWlsdGluX3ZzeF9zdHh2dzR4KCh2ZWN0b3IgaW50KV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfdnN4X3N0KHZlY3RvciBib29sIHNob3J0IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVkIHNob3J0ICpfX2MpIHsKKyAgX19idWlsdGluX3ZzeF9zdHh2dzR4KCh2ZWN0b3IgaW50KV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfdnN4X3N0KHZlY3RvciBib29sIHNob3J0IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgKl9fYykgeworICBfX2J1aWx0aW5fdnN4X3N0eHZ3NHgoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfdnN4X3N0KHZlY3RvciBzaWduZWQgc2hvcnQgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2lnbmVkIHNob3J0ICpfX2MpIHsKKyAgX19idWlsdGluX3ZzeF9zdHh2dzR4KCh2ZWN0b3IgaW50KV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfdnN4X3N0KHZlY3RvciBzaWduZWQgc2hvcnQgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduZWQgc2hvcnQgKl9fYykgeworICBfX2J1aWx0aW5fdnN4X3N0eHZ3NHgoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY192c3hfc3QodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0ICpfX2MpIHsKKyAgX19idWlsdGluX3ZzeF9zdHh2dzR4KCh2ZWN0b3IgaW50KV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfdnN4X3N0KHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBfX2IsIHVuc2lnbmVkIHNob3J0ICpfX2MpIHsKKyAgX19idWlsdGluX3ZzeF9zdHh2dzR4KCh2ZWN0b3IgaW50KV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfdnN4X3N0KHZlY3RvciBib29sIGNoYXIgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBjaGFyICpfX2MpIHsKKyAgX19idWlsdGluX3ZzeF9zdHh2dzR4KCh2ZWN0b3IgaW50KV9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfdnN4X3N0KHZlY3RvciBib29sIGNoYXIgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduZWQgY2hhciAqX19jKSB7CisgIF9fYnVpbHRpbl92c3hfc3R4dnc0eCgodmVjdG9yIGludClfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3ZzeF9zdCh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqX19jKSB7CisgIF9fYnVpbHRpbl92c3hfc3R4dnc0eCgodmVjdG9yIGludClfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3ZzeF9zdCh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2lnbmVkIGNoYXIgKl9fYykgeworICBfX2J1aWx0aW5fdnN4X3N0eHZ3NHgoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY192c3hfc3QodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVkIGNoYXIgKl9fYykgeworICBfX2J1aWx0aW5fdnN4X3N0eHZ3NHgoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY192c3hfc3QodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciAqX19jKSB7CisgIF9fYnVpbHRpbl92c3hfc3R4dnc0eCgodmVjdG9yIGludClfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3ZzeF9zdCh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBfX2IsIHVuc2lnbmVkIGNoYXIgKl9fYykgeworICBfX2J1aWx0aW5fdnN4X3N0eHZ3NHgoKHZlY3RvciBpbnQpX19hLCBfX2IsIF9fYyk7Cit9CisKKyNlbmRpZgorCisvKiB2ZWNfeG9yICovCisKKyNkZWZpbmUgX19idWlsdGluX2FsdGl2ZWNfdnhvciB2ZWNfeG9yCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY194b3IodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19hIF4gX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfeG9yKHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYSBeIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3hvcih2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICByZXR1cm4gX19hIF4gKHZlY3RvciBzaWduZWQgY2hhcilfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3hvcih2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19hIF4gX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY194b3IodmVjdG9yIGJvb2wgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSBeIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfeG9yKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYSBeICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGNoYXIgX19BVFRSU19vX2FpIHZlY194b3IodmVjdG9yIGJvb2wgY2hhciBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2EgXiBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaG9ydCBfX0FUVFJTX29fYWkgdmVjX3hvcih2ZWN0b3Igc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYSBeIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNob3J0IF9fQVRUUlNfb19haSB2ZWNfeG9yKHZlY3RvciBib29sIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNob3J0KV9fYSBeIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNob3J0IF9fQVRUUlNfb19haSB2ZWNfeG9yKHZlY3RvciBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2EgXiAodmVjdG9yIHNob3J0KV9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX3hvcih2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2EgXiBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY194b3IodmVjdG9yIGJvb2wgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYSBeIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX3hvcih2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYSBeICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY194b3IodmVjdG9yIGJvb2wgc2hvcnQgX19hLCB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYSBeIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX0FUVFJTX29fYWkgdmVjX3hvcih2ZWN0b3IgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYSBeIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX0FUVFJTX29fYWkgdmVjX3hvcih2ZWN0b3IgYm9vbCBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciBpbnQpX19hIF4gX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfeG9yKHZlY3RvciBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIHJldHVybiBfX2EgXiAodmVjdG9yIGludClfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfeG9yKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gX19hIF4gX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX3hvcih2ZWN0b3IgYm9vbCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hIF4gX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX3hvcih2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICByZXR1cm4gX19hIF4gKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBpbnQgX19BVFRSU19vX2FpIHZlY194b3IodmVjdG9yIGJvb2wgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIHJldHVybiBfX2EgXiBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBmbG9hdCBfX0FUVFJTX29fYWkgdmVjX3hvcih2ZWN0b3IgZmxvYXQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBmbG9hdCBfX2IpIHsKKyAgdmVjdG9yIHVuc2lnbmVkIGludCBfX3JlcyA9CisgICAgICAodmVjdG9yIHVuc2lnbmVkIGludClfX2EgXiAodmVjdG9yIHVuc2lnbmVkIGludClfX2I7CisgIHJldHVybiAodmVjdG9yIGZsb2F0KV9fcmVzOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZmxvYXQgX19BVFRSU19vX2FpIHZlY194b3IodmVjdG9yIGJvb2wgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgZmxvYXQgX19iKSB7CisgIHZlY3RvciB1bnNpZ25lZCBpbnQgX19yZXMgPQorICAgICAgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hIF4gKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iOworICByZXR1cm4gKHZlY3RvciBmbG9hdClfX3JlczsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGZsb2F0IF9fQVRUUlNfb19haSB2ZWNfeG9yKHZlY3RvciBmbG9hdCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICB2ZWN0b3IgdW5zaWduZWQgaW50IF9fcmVzID0KKyAgICAgICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSBeICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYjsKKyAgcmV0dXJuICh2ZWN0b3IgZmxvYXQpX19yZXM7Cit9CisKKyNpZmRlZiBfX1ZTWF9fCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY194b3IodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYSBeIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfeG9yKHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYSBeIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfeG9yKHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19hIF4gKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY194b3IodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2EgXiBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfeG9yKHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2EgXiBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfeG9yKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2EgXiAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY194b3IodmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19hIF4gX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZG91YmxlIF9fQVRUUlNfb19haSB2ZWNfeG9yKHZlY3RvciBkb3VibGUgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgZG91YmxlIF9fYikgeworICByZXR1cm4gKHZlY3RvciBkb3VibGUpKCh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYSBeCisgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGRvdWJsZSBfX0FUVFJTX29fYWkKK3ZlY194b3IodmVjdG9yIGRvdWJsZSBfX2EsIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgZG91YmxlKSgodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2EgXgorICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBkb3VibGUgX19BVFRSU19vX2FpIHZlY194b3IodmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGRvdWJsZSBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgZG91YmxlKSgodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2EgXgorICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYik7Cit9CisjZW5kaWYKKworLyogdmVjX3Z4b3IgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3Z4b3IodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19hIF4gX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfdnhvcih2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgY2hhcilfX2EgXiBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY192eG9yKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2EgXiAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfdnhvcih2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19hIF4gX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY192eG9yKHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EgXiBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3Z4b3IodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICByZXR1cm4gX19hIF4gKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgY2hhciBfX0FUVFJTX29fYWkgdmVjX3Z4b3IodmVjdG9yIGJvb2wgY2hhciBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICByZXR1cm4gX19hIF4gX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY192eG9yKHZlY3RvciBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYSBeIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNob3J0IF9fQVRUUlNfb19haSB2ZWNfdnhvcih2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2hvcnQpX19hIF4gX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY192eG9yKHZlY3RvciBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICByZXR1cm4gX19hIF4gKHZlY3RvciBzaG9ydClfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY192eG9yKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYSBeIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX3Z4b3IodmVjdG9yIGJvb2wgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYSBeIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX3Z4b3IodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2EgXiAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfdnhvcih2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICByZXR1cm4gX19hIF4gX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfdnhvcih2ZWN0b3IgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBpbnQgX19iKSB7CisgIHJldHVybiBfX2EgXiBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY192eG9yKHZlY3RvciBib29sIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciBpbnQpX19hIF4gX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfdnhvcih2ZWN0b3IgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYSBeICh2ZWN0b3IgaW50KV9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY192eG9yKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gX19hIF4gX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX3Z4b3IodmVjdG9yIGJvb2wgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSBeIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY192eG9yKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIHJldHVybiBfX2EgXiAodmVjdG9yIHVuc2lnbmVkIGludClfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGludCBfX0FUVFJTX29fYWkgdmVjX3Z4b3IodmVjdG9yIGJvb2wgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICByZXR1cm4gX19hIF4gX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZmxvYXQgX19BVFRSU19vX2FpIHZlY192eG9yKHZlY3RvciBmbG9hdCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBmbG9hdCBfX2IpIHsKKyAgdmVjdG9yIHVuc2lnbmVkIGludCBfX3JlcyA9CisgICAgICAodmVjdG9yIHVuc2lnbmVkIGludClfX2EgXiAodmVjdG9yIHVuc2lnbmVkIGludClfX2I7CisgIHJldHVybiAodmVjdG9yIGZsb2F0KV9fcmVzOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZmxvYXQgX19BVFRSU19vX2FpIHZlY192eG9yKHZlY3RvciBib29sIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBmbG9hdCBfX2IpIHsKKyAgdmVjdG9yIHVuc2lnbmVkIGludCBfX3JlcyA9CisgICAgICAodmVjdG9yIHVuc2lnbmVkIGludClfX2EgXiAodmVjdG9yIHVuc2lnbmVkIGludClfX2I7CisgIHJldHVybiAodmVjdG9yIGZsb2F0KV9fcmVzOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZmxvYXQgX19BVFRSU19vX2FpIHZlY192eG9yKHZlY3RvciBmbG9hdCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgdmVjdG9yIHVuc2lnbmVkIGludCBfX3JlcyA9CisgICAgICAodmVjdG9yIHVuc2lnbmVkIGludClfX2EgXiAodmVjdG9yIHVuc2lnbmVkIGludClfX2I7CisgIHJldHVybiAodmVjdG9yIGZsb2F0KV9fcmVzOworfQorCisjaWZkZWYgX19WU1hfXworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfdnhvcih2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19hIF4gX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY192eG9yKHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYSBeIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfdnhvcih2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYSBeICh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZylfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfdnhvcih2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYSBeIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY192eG9yKHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2EgXiBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfdnhvcih2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19hIF4gKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfdnhvcih2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2EgXiBfX2I7Cit9CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGV4dGVuc2lvbnMgZm9yIENCRUEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogdmVjX2V4dHJhY3QgKi8KKworc3RhdGljIF9faW5saW5lX18gc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpIHZlY19leHRyYWN0KHZlY3RvciBzaWduZWQgY2hhciBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IF9fYikgeworICByZXR1cm4gX19hW19fYl07Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfZXh0cmFjdCh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYVtfX2JdOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haSB2ZWNfZXh0cmFjdCh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYVtfX2JdOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBzaWduZWQgc2hvcnQgX19BVFRSU19vX2FpIHZlY19leHRyYWN0KHZlY3RvciBzaWduZWQgc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgX19iKSB7CisgIHJldHVybiBfX2FbX19iXTsKK30KKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfZXh0cmFjdCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCBpbnQgX19iKSB7CisgIHJldHVybiBfX2FbX19iXTsKK30KKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpIHZlY19leHRyYWN0KHZlY3RvciBib29sIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgX19iKSB7CisgIHJldHVybiBfX2FbX19iXTsKK30KKworc3RhdGljIF9faW5saW5lX18gc2lnbmVkIGludCBfX0FUVFJTX29fYWkgdmVjX2V4dHJhY3QodmVjdG9yIHNpZ25lZCBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IF9fYikgeworICByZXR1cm4gX19hW19fYl07Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkgdmVjX2V4dHJhY3QodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYVtfX2JdOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpIHZlY19leHRyYWN0KHZlY3RvciBib29sIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYVtfX2JdOworfQorCisjaWZkZWYgX19WU1hfXworc3RhdGljIF9faW5saW5lX18gc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY19leHRyYWN0KHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwgaW50IF9fYikgeworICByZXR1cm4gX19hW19fYl07Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY19leHRyYWN0KHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLCBpbnQgX19iKSB7CisgIHJldHVybiBfX2FbX19iXTsKK30KKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZyBsb25nIF9fQVRUUlNfb19haQordmVjX2V4dHJhY3QodmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwgaW50IF9fYikgeworICByZXR1cm4gX19hW19fYl07Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGRvdWJsZSBfX0FUVFJTX29fYWkgdmVjX2V4dHJhY3QodmVjdG9yIGRvdWJsZSBfX2EsIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYVtfX2JdOworfQorI2VuZGlmCisKK3N0YXRpYyBfX2lubGluZV9fIGZsb2F0IF9fQVRUUlNfb19haSB2ZWNfZXh0cmFjdCh2ZWN0b3IgZmxvYXQgX19hLCBpbnQgX19iKSB7CisgIHJldHVybiBfX2FbX19iXTsKK30KKworLyogdmVjX2luc2VydCAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfaW5zZXJ0KHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYiwgaW50IF9fYykgeworICBfX2JbX19jXSA9IF9fYTsKKyAgcmV0dXJuIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfaW5zZXJ0KHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IsIGludCBfX2MpIHsKKyAgX19iW19fY10gPSBfX2E7CisgIHJldHVybiBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGNoYXIgX19BVFRSU19vX2FpIHZlY19pbnNlcnQodW5zaWduZWQgY2hhciBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGNoYXIgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgX19jKSB7CisgIF9fYltfX2NdID0gX19hOworICByZXR1cm4gX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX2luc2VydChzaWduZWQgc2hvcnQgX19hLCB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYiwgaW50IF9fYykgeworICBfX2JbX19jXSA9IF9fYTsKKyAgcmV0dXJuIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX2luc2VydCh1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IsIGludCBfX2MpIHsKKyAgX19iW19fY10gPSBfX2E7CisgIHJldHVybiBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIHNob3J0IF9fQVRUUlNfb19haQordmVjX2luc2VydCh1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBib29sIHNob3J0IF9fYiwgaW50IF9fYykgeworICBfX2JbX19jXSA9IF9fYTsKKyAgcmV0dXJuIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfaW5zZXJ0KHNpZ25lZCBpbnQgX19hLCB2ZWN0b3Igc2lnbmVkIGludCBfX2IsIGludCBfX2MpIHsKKyAgX19iW19fY10gPSBfX2E7CisgIHJldHVybiBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfaW5zZXJ0KHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iLCBpbnQgX19jKSB7CisgIF9fYltfX2NdID0gX19hOworICByZXR1cm4gX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBpbnQgX19BVFRSU19vX2FpIHZlY19pbnNlcnQodW5zaWduZWQgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBfX2MpIHsKKyAgX19iW19fY10gPSBfX2E7CisgIHJldHVybiBfX2I7Cit9CisKKyNpZmRlZiBfX1ZTWF9fCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY19pbnNlcnQoc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYiwgaW50IF9fYykgeworICBfX2JbX19jXSA9IF9fYTsKKyAgcmV0dXJuIF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY19pbnNlcnQodW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IsIGludCBfX2MpIHsKKyAgX19iW19fY10gPSBfX2E7CisgIHJldHVybiBfX2I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY19pbnNlcnQodW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYiwgaW50IF9fYykgeworICBfX2JbX19jXSA9IF9fYTsKKyAgcmV0dXJuIF9fYjsKK30KK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBkb3VibGUgX19BVFRSU19vX2FpIHZlY19pbnNlcnQoZG91YmxlIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGRvdWJsZSBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBfX2MpIHsKKyAgX19iW19fY10gPSBfX2E7CisgIHJldHVybiBfX2I7Cit9CisjZW5kaWYKKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGZsb2F0IF9fQVRUUlNfb19haSB2ZWNfaW5zZXJ0KGZsb2F0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgZmxvYXQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBfX2MpIHsKKyAgX19iW19fY10gPSBfX2E7CisgIHJldHVybiBfX2I7Cit9CisKKy8qIHZlY19sdmx4ICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19sdmx4KGludCBfX2EsIGNvbnN0IHNpZ25lZCBjaGFyICpfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKHZlY19sZChfX2EsIF9fYiksICh2ZWN0b3Igc2lnbmVkIGNoYXIpKDApLAorICAgICAgICAgICAgICAgICAgdmVjX2x2c2woX19hLCBfX2IpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX2x2bHgoaW50IF9fYSwgY29uc3QgdmVjdG9yIHNpZ25lZCBjaGFyICpfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKHZlY19sZChfX2EsIF9fYiksICh2ZWN0b3Igc2lnbmVkIGNoYXIpKDApLAorICAgICAgICAgICAgICAgICAgdmVjX2x2c2woX19hLCAodW5zaWduZWQgY2hhciAqKV9fYikpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19sdmx4KGludCBfX2EsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKl9fYikgeworICByZXR1cm4gdmVjX3Blcm0odmVjX2xkKF9fYSwgX19iKSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgwKSwKKyAgICAgICAgICAgICAgICAgIHZlY19sdnNsKF9fYSwgX19iKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX2x2bHgoaW50IF9fYSwgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgKl9fYikgeworICByZXR1cm4gdmVjX3Blcm0odmVjX2xkKF9fYSwgX19iKSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgwKSwKKyAgICAgICAgICAgICAgICAgIHZlY19sdnNsKF9fYSwgKHVuc2lnbmVkIGNoYXIgKilfX2IpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19sdmx4KGludCBfX2EsIGNvbnN0IHZlY3RvciBib29sIGNoYXIgKl9fYikgeworICByZXR1cm4gdmVjX3Blcm0odmVjX2xkKF9fYSwgX19iKSwgKHZlY3RvciBib29sIGNoYXIpKDApLAorICAgICAgICAgICAgICAgICAgdmVjX2x2c2woX19hLCAodW5zaWduZWQgY2hhciAqKV9fYikpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY19sdmx4KGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNob3J0ICpfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKHZlY19sZChfX2EsIF9fYiksICh2ZWN0b3Igc2hvcnQpKDApLCB2ZWNfbHZzbChfX2EsIF9fYikpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY19sdmx4KGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3RvciBzaG9ydCAqX19iKSB7CisgIHJldHVybiB2ZWNfcGVybSh2ZWNfbGQoX19hLCBfX2IpLCAodmVjdG9yIHNob3J0KSgwKSwKKyAgICAgICAgICAgICAgICAgIHZlY19sdnNsKF9fYSwgKHVuc2lnbmVkIGNoYXIgKilfX2IpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX2x2bHgoaW50IF9fYSwgY29uc3QgdW5zaWduZWQgc2hvcnQgKl9fYikgeworICByZXR1cm4gdmVjX3Blcm0odmVjX2xkKF9fYSwgX19iKSwgKHZlY3RvciB1bnNpZ25lZCBzaG9ydCkoMCksCisgICAgICAgICAgICAgICAgICB2ZWNfbHZzbChfX2EsIF9fYikpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfbHZseChpbnQgX19hLCBjb25zdCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgKl9fYikgeworICByZXR1cm4gdmVjX3Blcm0odmVjX2xkKF9fYSwgX19iKSwgKHZlY3RvciB1bnNpZ25lZCBzaG9ydCkoMCksCisgICAgICAgICAgICAgICAgICB2ZWNfbHZzbChfX2EsICh1bnNpZ25lZCBjaGFyICopX19iKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIHNob3J0IF9fQVRUUlNfb19haQordmVjX2x2bHgoaW50IF9fYSwgY29uc3QgdmVjdG9yIGJvb2wgc2hvcnQgKl9fYikgeworICByZXR1cm4gdmVjX3Blcm0odmVjX2xkKF9fYSwgX19iKSwgKHZlY3RvciBib29sIHNob3J0KSgwKSwKKyAgICAgICAgICAgICAgICAgIHZlY19sdnNsKF9fYSwgKHVuc2lnbmVkIGNoYXIgKilfX2IpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHBpeGVsIF9fQVRUUlNfb19haSB2ZWNfbHZseChpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3IgcGl4ZWwgKl9fYikgeworICByZXR1cm4gdmVjX3Blcm0odmVjX2xkKF9fYSwgX19iKSwgKHZlY3RvciBwaXhlbCkoMCksCisgICAgICAgICAgICAgICAgICB2ZWNfbHZzbChfX2EsICh1bnNpZ25lZCBjaGFyICopX19iKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY19sdmx4KGludCBfX2EsIGNvbnN0IGludCAqX19iKSB7CisgIHJldHVybiB2ZWNfcGVybSh2ZWNfbGQoX19hLCBfX2IpLCAodmVjdG9yIGludCkoMCksIHZlY19sdnNsKF9fYSwgX19iKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY19sdmx4KGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3IgaW50ICpfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKHZlY19sZChfX2EsIF9fYiksICh2ZWN0b3IgaW50KSgwKSwKKyAgICAgICAgICAgICAgICAgIHZlY19sdnNsKF9fYSwgKHVuc2lnbmVkIGNoYXIgKilfX2IpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY19sdmx4KGludCBfX2EsIGNvbnN0IHVuc2lnbmVkIGludCAqX19iKSB7CisgIHJldHVybiB2ZWNfcGVybSh2ZWNfbGQoX19hLCBfX2IpLCAodmVjdG9yIHVuc2lnbmVkIGludCkoMCksCisgICAgICAgICAgICAgICAgICB2ZWNfbHZzbChfX2EsIF9fYikpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX2x2bHgoaW50IF9fYSwgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGludCAqX19iKSB7CisgIHJldHVybiB2ZWNfcGVybSh2ZWNfbGQoX19hLCBfX2IpLCAodmVjdG9yIHVuc2lnbmVkIGludCkoMCksCisgICAgICAgICAgICAgICAgICB2ZWNfbHZzbChfX2EsICh1bnNpZ25lZCBjaGFyICopX19iKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGludCBfX0FUVFJTX29fYWkKK3ZlY19sdmx4KGludCBfX2EsIGNvbnN0IHZlY3RvciBib29sIGludCAqX19iKSB7CisgIHJldHVybiB2ZWNfcGVybSh2ZWNfbGQoX19hLCBfX2IpLCAodmVjdG9yIGJvb2wgaW50KSgwKSwKKyAgICAgICAgICAgICAgICAgIHZlY19sdnNsKF9fYSwgKHVuc2lnbmVkIGNoYXIgKilfX2IpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGZsb2F0IF9fQVRUUlNfb19haSB2ZWNfbHZseChpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqX19iKSB7CisgIHJldHVybiB2ZWNfcGVybSh2ZWNfbGQoX19hLCBfX2IpLCAodmVjdG9yIGZsb2F0KSgwKSwgdmVjX2x2c2woX19hLCBfX2IpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGZsb2F0IF9fQVRUUlNfb19haSB2ZWNfbHZseChpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3IgZmxvYXQgKl9fYikgeworICByZXR1cm4gdmVjX3Blcm0odmVjX2xkKF9fYSwgX19iKSwgKHZlY3RvciBmbG9hdCkoMCksCisgICAgICAgICAgICAgICAgICB2ZWNfbHZzbChfX2EsICh1bnNpZ25lZCBjaGFyICopX19iKSk7Cit9CisKKy8qIHZlY19sdmx4bCAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfbHZseGwoaW50IF9fYSwgY29uc3Qgc2lnbmVkIGNoYXIgKl9fYikgeworICByZXR1cm4gdmVjX3Blcm0odmVjX2xkbChfX2EsIF9fYiksICh2ZWN0b3Igc2lnbmVkIGNoYXIpKDApLAorICAgICAgICAgICAgICAgICAgdmVjX2x2c2woX19hLCBfX2IpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX2x2bHhsKGludCBfX2EsIGNvbnN0IHZlY3RvciBzaWduZWQgY2hhciAqX19iKSB7CisgIHJldHVybiB2ZWNfcGVybSh2ZWNfbGRsKF9fYSwgX19iKSwgKHZlY3RvciBzaWduZWQgY2hhcikoMCksCisgICAgICAgICAgICAgICAgICB2ZWNfbHZzbChfX2EsICh1bnNpZ25lZCBjaGFyICopX19iKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX2x2bHhsKGludCBfX2EsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKl9fYikgeworICByZXR1cm4gdmVjX3Blcm0odmVjX2xkbChfX2EsIF9fYiksICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMCksCisgICAgICAgICAgICAgICAgICB2ZWNfbHZzbChfX2EsIF9fYikpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19sdmx4bChpbnQgX19hLCBjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhciAqX19iKSB7CisgIHJldHVybiB2ZWNfcGVybSh2ZWNfbGRsKF9fYSwgX19iKSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgwKSwKKyAgICAgICAgICAgICAgICAgIHZlY19sdnNsKF9fYSwgKHVuc2lnbmVkIGNoYXIgKilfX2IpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19sdmx4bChpbnQgX19hLCBjb25zdCB2ZWN0b3IgYm9vbCBjaGFyICpfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKHZlY19sZGwoX19hLCBfX2IpLCAodmVjdG9yIGJvb2wgY2hhcikoMCksCisgICAgICAgICAgICAgICAgICB2ZWNfbHZzbChfX2EsICh1bnNpZ25lZCBjaGFyICopX19iKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaG9ydCBfX0FUVFJTX29fYWkgdmVjX2x2bHhsKGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaG9ydCAqX19iKSB7CisgIHJldHVybiB2ZWNfcGVybSh2ZWNfbGRsKF9fYSwgX19iKSwgKHZlY3RvciBzaG9ydCkoMCksIHZlY19sdnNsKF9fYSwgX19iKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaG9ydCBfX0FUVFJTX29fYWkgdmVjX2x2bHhsKGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3Igc2hvcnQgKl9fYikgeworICByZXR1cm4gdmVjX3Blcm0odmVjX2xkbChfX2EsIF9fYiksICh2ZWN0b3Igc2hvcnQpKDApLAorICAgICAgICAgICAgICAgICAgdmVjX2x2c2woX19hLCAodW5zaWduZWQgY2hhciAqKV9fYikpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfbHZseGwoaW50IF9fYSwgY29uc3QgdW5zaWduZWQgc2hvcnQgKl9fYikgeworICByZXR1cm4gdmVjX3Blcm0odmVjX2xkbChfX2EsIF9fYiksICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpKDApLAorICAgICAgICAgICAgICAgICAgdmVjX2x2c2woX19hLCBfX2IpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX2x2bHhsKGludCBfX2EsIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBzaG9ydCAqX19iKSB7CisgIHJldHVybiB2ZWNfcGVybSh2ZWNfbGRsKF9fYSwgX19iKSwgKHZlY3RvciB1bnNpZ25lZCBzaG9ydCkoMCksCisgICAgICAgICAgICAgICAgICB2ZWNfbHZzbChfX2EsICh1bnNpZ25lZCBjaGFyICopX19iKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIHNob3J0IF9fQVRUUlNfb19haQordmVjX2x2bHhsKGludCBfX2EsIGNvbnN0IHZlY3RvciBib29sIHNob3J0ICpfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKHZlY19sZGwoX19hLCBfX2IpLCAodmVjdG9yIGJvb2wgc2hvcnQpKDApLAorICAgICAgICAgICAgICAgICAgdmVjX2x2c2woX19hLCAodW5zaWduZWQgY2hhciAqKV9fYikpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgcGl4ZWwgX19BVFRSU19vX2FpIHZlY19sdmx4bChpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yIHBpeGVsICpfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKHZlY19sZGwoX19hLCBfX2IpLCAodmVjdG9yIHBpeGVsKSgwKSwKKyAgICAgICAgICAgICAgICAgIHZlY19sdnNsKF9fYSwgKHVuc2lnbmVkIGNoYXIgKilfX2IpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX0FUVFJTX29fYWkgdmVjX2x2bHhsKGludCBfX2EsIGNvbnN0IGludCAqX19iKSB7CisgIHJldHVybiB2ZWNfcGVybSh2ZWNfbGRsKF9fYSwgX19iKSwgKHZlY3RvciBpbnQpKDApLCB2ZWNfbHZzbChfX2EsIF9fYikpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfbHZseGwoaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3IgaW50ICpfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKHZlY19sZGwoX19hLCBfX2IpLCAodmVjdG9yIGludCkoMCksCisgICAgICAgICAgICAgICAgICB2ZWNfbHZzbChfX2EsICh1bnNpZ25lZCBjaGFyICopX19iKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfbHZseGwoaW50IF9fYSwgY29uc3QgdW5zaWduZWQgaW50ICpfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKHZlY19sZGwoX19hLCBfX2IpLCAodmVjdG9yIHVuc2lnbmVkIGludCkoMCksCisgICAgICAgICAgICAgICAgICB2ZWNfbHZzbChfX2EsIF9fYikpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX2x2bHhsKGludCBfX2EsIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBpbnQgKl9fYikgeworICByZXR1cm4gdmVjX3Blcm0odmVjX2xkbChfX2EsIF9fYiksICh2ZWN0b3IgdW5zaWduZWQgaW50KSgwKSwKKyAgICAgICAgICAgICAgICAgIHZlY19sdnNsKF9fYSwgKHVuc2lnbmVkIGNoYXIgKilfX2IpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGJvb2wgaW50IF9fQVRUUlNfb19haQordmVjX2x2bHhsKGludCBfX2EsIGNvbnN0IHZlY3RvciBib29sIGludCAqX19iKSB7CisgIHJldHVybiB2ZWNfcGVybSh2ZWNfbGRsKF9fYSwgX19iKSwgKHZlY3RvciBib29sIGludCkoMCksCisgICAgICAgICAgICAgICAgICB2ZWNfbHZzbChfX2EsICh1bnNpZ25lZCBjaGFyICopX19iKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBmbG9hdCBfX0FUVFJTX29fYWkgdmVjX2x2bHhsKGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqX19iKSB7CisgIHJldHVybiB2ZWNfcGVybSh2ZWNfbGRsKF9fYSwgX19iKSwgKHZlY3RvciBmbG9hdCkoMCksIHZlY19sdnNsKF9fYSwgX19iKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBmbG9hdCBfX0FUVFJTX29fYWkgdmVjX2x2bHhsKGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgZmxvYXQgKl9fYikgeworICByZXR1cm4gdmVjX3Blcm0odmVjX2xkbChfX2EsIF9fYiksICh2ZWN0b3IgZmxvYXQpKDApLAorICAgICAgICAgICAgICAgICAgdmVjX2x2c2woX19hLCAodW5zaWduZWQgY2hhciAqKV9fYikpOworfQorCisvKiB2ZWNfbHZyeCAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfbHZyeChpbnQgX19hLCBjb25zdCBzaWduZWQgY2hhciAqX19iKSB7CisgIHJldHVybiB2ZWNfcGVybSgodmVjdG9yIHNpZ25lZCBjaGFyKSgwKSwgdmVjX2xkKF9fYSwgX19iKSwKKyAgICAgICAgICAgICAgICAgIHZlY19sdnNsKF9fYSwgX19iKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19sdnJ4KGludCBfX2EsIGNvbnN0IHZlY3RvciBzaWduZWQgY2hhciAqX19iKSB7CisgIHJldHVybiB2ZWNfcGVybSgodmVjdG9yIHNpZ25lZCBjaGFyKSgwKSwgdmVjX2xkKF9fYSwgX19iKSwKKyAgICAgICAgICAgICAgICAgIHZlY19sdnNsKF9fYSwgKHVuc2lnbmVkIGNoYXIgKilfX2IpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfbHZyeChpbnQgX19hLCBjb25zdCB1bnNpZ25lZCBjaGFyICpfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKCh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMCksIHZlY19sZChfX2EsIF9fYiksCisgICAgICAgICAgICAgICAgICB2ZWNfbHZzbChfX2EsIF9fYikpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19sdnJ4KGludCBfX2EsIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBjaGFyICpfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKCh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMCksIHZlY19sZChfX2EsIF9fYiksCisgICAgICAgICAgICAgICAgICB2ZWNfbHZzbChfX2EsICh1bnNpZ25lZCBjaGFyICopX19iKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfbHZyeChpbnQgX19hLCBjb25zdCB2ZWN0b3IgYm9vbCBjaGFyICpfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKCh2ZWN0b3IgYm9vbCBjaGFyKSgwKSwgdmVjX2xkKF9fYSwgX19iKSwKKyAgICAgICAgICAgICAgICAgIHZlY19sdnNsKF9fYSwgKHVuc2lnbmVkIGNoYXIgKilfX2IpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNob3J0IF9fQVRUUlNfb19haSB2ZWNfbHZyeChpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaG9ydCAqX19iKSB7CisgIHJldHVybiB2ZWNfcGVybSgodmVjdG9yIHNob3J0KSgwKSwgdmVjX2xkKF9fYSwgX19iKSwgdmVjX2x2c2woX19hLCBfX2IpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNob3J0IF9fQVRUUlNfb19haSB2ZWNfbHZyeChpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3Igc2hvcnQgKl9fYikgeworICByZXR1cm4gdmVjX3Blcm0oKHZlY3RvciBzaG9ydCkoMCksIHZlY19sZChfX2EsIF9fYiksCisgICAgICAgICAgICAgICAgICB2ZWNfbHZzbChfX2EsICh1bnNpZ25lZCBjaGFyICopX19iKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19sdnJ4KGludCBfX2EsIGNvbnN0IHVuc2lnbmVkIHNob3J0ICpfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpKDApLCB2ZWNfbGQoX19hLCBfX2IpLAorICAgICAgICAgICAgICAgICAgdmVjX2x2c2woX19hLCBfX2IpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX2x2cngoaW50IF9fYSwgY29uc3QgdmVjdG9yIHVuc2lnbmVkIHNob3J0ICpfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpKDApLCB2ZWNfbGQoX19hLCBfX2IpLAorICAgICAgICAgICAgICAgICAgdmVjX2x2c2woX19hLCAodW5zaWduZWQgY2hhciAqKV9fYikpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19sdnJ4KGludCBfX2EsIGNvbnN0IHZlY3RvciBib29sIHNob3J0ICpfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKCh2ZWN0b3IgYm9vbCBzaG9ydCkoMCksIHZlY19sZChfX2EsIF9fYiksCisgICAgICAgICAgICAgICAgICB2ZWNfbHZzbChfX2EsICh1bnNpZ25lZCBjaGFyICopX19iKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBwaXhlbCBfX0FUVFJTX29fYWkgdmVjX2x2cngoaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yIHBpeGVsICpfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKCh2ZWN0b3IgcGl4ZWwpKDApLCB2ZWNfbGQoX19hLCBfX2IpLAorICAgICAgICAgICAgICAgICAgdmVjX2x2c2woX19hLCAodW5zaWduZWQgY2hhciAqKV9fYikpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfbHZyeChpbnQgX19hLCBjb25zdCBpbnQgKl9fYikgeworICByZXR1cm4gdmVjX3Blcm0oKHZlY3RvciBpbnQpKDApLCB2ZWNfbGQoX19hLCBfX2IpLCB2ZWNfbHZzbChfX2EsIF9fYikpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfbHZyeChpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yIGludCAqX19iKSB7CisgIHJldHVybiB2ZWNfcGVybSgodmVjdG9yIGludCkoMCksIHZlY19sZChfX2EsIF9fYiksCisgICAgICAgICAgICAgICAgICB2ZWNfbHZzbChfX2EsICh1bnNpZ25lZCBjaGFyICopX19iKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCit2ZWNfbHZyeChpbnQgX19hLCBjb25zdCB1bnNpZ25lZCBpbnQgKl9fYikgeworICByZXR1cm4gdmVjX3Blcm0oKHZlY3RvciB1bnNpZ25lZCBpbnQpKDApLCB2ZWNfbGQoX19hLCBfX2IpLAorICAgICAgICAgICAgICAgICAgdmVjX2x2c2woX19hLCBfX2IpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY19sdnJ4KGludCBfX2EsIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBpbnQgKl9fYikgeworICByZXR1cm4gdmVjX3Blcm0oKHZlY3RvciB1bnNpZ25lZCBpbnQpKDApLCB2ZWNfbGQoX19hLCBfX2IpLAorICAgICAgICAgICAgICAgICAgdmVjX2x2c2woX19hLCAodW5zaWduZWQgY2hhciAqKV9fYikpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBpbnQgX19BVFRSU19vX2FpCit2ZWNfbHZyeChpbnQgX19hLCBjb25zdCB2ZWN0b3IgYm9vbCBpbnQgKl9fYikgeworICByZXR1cm4gdmVjX3Blcm0oKHZlY3RvciBib29sIGludCkoMCksIHZlY19sZChfX2EsIF9fYiksCisgICAgICAgICAgICAgICAgICB2ZWNfbHZzbChfX2EsICh1bnNpZ25lZCBjaGFyICopX19iKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBmbG9hdCBfX0FUVFJTX29fYWkgdmVjX2x2cngoaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKl9fYikgeworICByZXR1cm4gdmVjX3Blcm0oKHZlY3RvciBmbG9hdCkoMCksIHZlY19sZChfX2EsIF9fYiksIHZlY19sdnNsKF9fYSwgX19iKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBmbG9hdCBfX0FUVFJTX29fYWkgdmVjX2x2cngoaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yIGZsb2F0ICpfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKCh2ZWN0b3IgZmxvYXQpKDApLCB2ZWNfbGQoX19hLCBfX2IpLAorICAgICAgICAgICAgICAgICAgdmVjX2x2c2woX19hLCAodW5zaWduZWQgY2hhciAqKV9fYikpOworfQorCisvKiB2ZWNfbHZyeGwgKi8KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX2x2cnhsKGludCBfX2EsIGNvbnN0IHNpZ25lZCBjaGFyICpfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKCh2ZWN0b3Igc2lnbmVkIGNoYXIpKDApLCB2ZWNfbGRsKF9fYSwgX19iKSwKKyAgICAgICAgICAgICAgICAgIHZlY19sdnNsKF9fYSwgX19iKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19sdnJ4bChpbnQgX19hLCBjb25zdCB2ZWN0b3Igc2lnbmVkIGNoYXIgKl9fYikgeworICByZXR1cm4gdmVjX3Blcm0oKHZlY3RvciBzaWduZWQgY2hhcikoMCksIHZlY19sZGwoX19hLCBfX2IpLAorICAgICAgICAgICAgICAgICAgdmVjX2x2c2woX19hLCAodW5zaWduZWQgY2hhciAqKV9fYikpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX0FUVFJTX29fYWkKK3ZlY19sdnJ4bChpbnQgX19hLCBjb25zdCB1bnNpZ25lZCBjaGFyICpfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKCh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMCksIHZlY19sZGwoX19hLCBfX2IpLAorICAgICAgICAgICAgICAgICAgdmVjX2x2c2woX19hLCBfX2IpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfbHZyeGwoaW50IF9fYSwgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgKl9fYikgeworICByZXR1cm4gdmVjX3Blcm0oKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgwKSwgdmVjX2xkbChfX2EsIF9fYiksCisgICAgICAgICAgICAgICAgICB2ZWNfbHZzbChfX2EsICh1bnNpZ25lZCBjaGFyICopX19iKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGNoYXIgX19BVFRSU19vX2FpCit2ZWNfbHZyeGwoaW50IF9fYSwgY29uc3QgdmVjdG9yIGJvb2wgY2hhciAqX19iKSB7CisgIHJldHVybiB2ZWNfcGVybSgodmVjdG9yIGJvb2wgY2hhcikoMCksIHZlY19sZGwoX19hLCBfX2IpLAorICAgICAgICAgICAgICAgICAgdmVjX2x2c2woX19hLCAodW5zaWduZWQgY2hhciAqKV9fYikpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY19sdnJ4bChpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hvcnQgKl9fYikgeworICByZXR1cm4gdmVjX3Blcm0oKHZlY3RvciBzaG9ydCkoMCksIHZlY19sZGwoX19hLCBfX2IpLCB2ZWNfbHZzbChfX2EsIF9fYikpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY19sdnJ4bChpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yIHNob3J0ICpfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKCh2ZWN0b3Igc2hvcnQpKDApLCB2ZWNfbGRsKF9fYSwgX19iKSwKKyAgICAgICAgICAgICAgICAgIHZlY19sdnNsKF9fYSwgKHVuc2lnbmVkIGNoYXIgKilfX2IpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fQVRUUlNfb19haQordmVjX2x2cnhsKGludCBfX2EsIGNvbnN0IHVuc2lnbmVkIHNob3J0ICpfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpKDApLCB2ZWNfbGRsKF9fYSwgX19iKSwKKyAgICAgICAgICAgICAgICAgIHZlY19sdnNsKF9fYSwgX19iKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19sdnJ4bChpbnQgX19hLCBjb25zdCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgKl9fYikgeworICByZXR1cm4gdmVjX3Blcm0oKHZlY3RvciB1bnNpZ25lZCBzaG9ydCkoMCksIHZlY19sZGwoX19hLCBfX2IpLAorICAgICAgICAgICAgICAgICAgdmVjX2x2c2woX19hLCAodW5zaWduZWQgY2hhciAqKV9fYikpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgYm9vbCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19sdnJ4bChpbnQgX19hLCBjb25zdCB2ZWN0b3IgYm9vbCBzaG9ydCAqX19iKSB7CisgIHJldHVybiB2ZWNfcGVybSgodmVjdG9yIGJvb2wgc2hvcnQpKDApLCB2ZWNfbGRsKF9fYSwgX19iKSwKKyAgICAgICAgICAgICAgICAgIHZlY19sdnNsKF9fYSwgKHVuc2lnbmVkIGNoYXIgKilfX2IpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHBpeGVsIF9fQVRUUlNfb19haSB2ZWNfbHZyeGwoaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3RvciBwaXhlbCAqX19iKSB7CisgIHJldHVybiB2ZWNfcGVybSgodmVjdG9yIHBpeGVsKSgwKSwgdmVjX2xkbChfX2EsIF9fYiksCisgICAgICAgICAgICAgICAgICB2ZWNfbHZzbChfX2EsICh1bnNpZ25lZCBjaGFyICopX19iKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBpbnQgX19BVFRSU19vX2FpIHZlY19sdnJ4bChpbnQgX19hLCBjb25zdCBpbnQgKl9fYikgeworICByZXR1cm4gdmVjX3Blcm0oKHZlY3RvciBpbnQpKDApLCB2ZWNfbGRsKF9fYSwgX19iKSwgdmVjX2x2c2woX19hLCBfX2IpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX0FUVFJTX29fYWkgdmVjX2x2cnhsKGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yIGludCAqX19iKSB7CisgIHJldHVybiB2ZWNfcGVybSgodmVjdG9yIGludCkoMCksIHZlY19sZGwoX19hLCBfX2IpLAorICAgICAgICAgICAgICAgICAgdmVjX2x2c2woX19hLCAodW5zaWduZWQgY2hhciAqKV9fYikpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgaW50IF9fQVRUUlNfb19haQordmVjX2x2cnhsKGludCBfX2EsIGNvbnN0IHVuc2lnbmVkIGludCAqX19iKSB7CisgIHJldHVybiB2ZWNfcGVybSgodmVjdG9yIHVuc2lnbmVkIGludCkoMCksIHZlY19sZGwoX19hLCBfX2IpLAorICAgICAgICAgICAgICAgICAgdmVjX2x2c2woX19hLCBfX2IpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY19sdnJ4bChpbnQgX19hLCBjb25zdCB2ZWN0b3IgdW5zaWduZWQgaW50ICpfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKCh2ZWN0b3IgdW5zaWduZWQgaW50KSgwKSwgdmVjX2xkbChfX2EsIF9fYiksCisgICAgICAgICAgICAgICAgICB2ZWNfbHZzbChfX2EsICh1bnNpZ25lZCBjaGFyICopX19iKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBib29sIGludCBfX0FUVFJTX29fYWkKK3ZlY19sdnJ4bChpbnQgX19hLCBjb25zdCB2ZWN0b3IgYm9vbCBpbnQgKl9fYikgeworICByZXR1cm4gdmVjX3Blcm0oKHZlY3RvciBib29sIGludCkoMCksIHZlY19sZGwoX19hLCBfX2IpLAorICAgICAgICAgICAgICAgICAgdmVjX2x2c2woX19hLCAodW5zaWduZWQgY2hhciAqKV9fYikpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZmxvYXQgX19BVFRSU19vX2FpIHZlY19sdnJ4bChpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKl9fYikgeworICByZXR1cm4gdmVjX3Blcm0oKHZlY3RvciBmbG9hdCkoMCksIHZlY19sZGwoX19hLCBfX2IpLCB2ZWNfbHZzbChfX2EsIF9fYikpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZmxvYXQgX19BVFRSU19vX2FpIHZlY19sdnJ4bChpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yIGZsb2F0ICpfX2IpIHsKKyAgcmV0dXJuIHZlY19wZXJtKCh2ZWN0b3IgZmxvYXQpKDApLCB2ZWNfbGRsKF9fYSwgX19iKSwKKyAgICAgICAgICAgICAgICAgIHZlY19sdnNsKF9fYSwgKHVuc2lnbmVkIGNoYXIgKilfX2IpKTsKK30KKworLyogdmVjX3N0dmx4ICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdHZseCh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lZCBjaGFyICpfX2MpIHsKKyAgcmV0dXJuIHZlY19zdCh2ZWNfcGVybSh2ZWNfbHZyeChfX2IsIF9fYyksIF9fYSwgdmVjX2x2c3IoX19iLCBfX2MpKSwgX19iLAorICAgICAgICAgICAgICAgIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdHZseCh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaWduZWQgY2hhciAqX19jKSB7CisgIHJldHVybiB2ZWNfc3QoCisgICAgICB2ZWNfcGVybSh2ZWNfbHZyeChfX2IsIF9fYyksIF9fYSwgdmVjX2x2c3IoX19iLCAodW5zaWduZWQgY2hhciAqKV9fYykpLAorICAgICAgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2bHgodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKl9fYykgeworICByZXR1cm4gdmVjX3N0KHZlY19wZXJtKHZlY19sdnJ4KF9fYiwgX19jKSwgX19hLCB2ZWNfbHZzcihfX2IsIF9fYykpLCBfX2IsCisgICAgICAgICAgICAgICAgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0dmx4KHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciAqX19jKSB7CisgIHJldHVybiB2ZWNfc3QoCisgICAgICB2ZWNfcGVybSh2ZWNfbHZyeChfX2IsIF9fYyksIF9fYSwgdmVjX2x2c3IoX19iLCAodW5zaWduZWQgY2hhciAqKV9fYykpLAorICAgICAgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2bHgodmVjdG9yIGJvb2wgY2hhciBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgY2hhciAqX19jKSB7CisgIHJldHVybiB2ZWNfc3QoCisgICAgICB2ZWNfcGVybSh2ZWNfbHZyeChfX2IsIF9fYyksIF9fYSwgdmVjX2x2c3IoX19iLCAodW5zaWduZWQgY2hhciAqKV9fYykpLAorICAgICAgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2bHgodmVjdG9yIHNob3J0IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCAqX19jKSB7CisgIHJldHVybiB2ZWNfc3QodmVjX3Blcm0odmVjX2x2cngoX19iLCBfX2MpLCBfX2EsIHZlY19sdnNyKF9fYiwgX19jKSksIF9fYiwKKyAgICAgICAgICAgICAgICBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2bHgodmVjdG9yIHNob3J0IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2hvcnQgKl9fYykgeworICByZXR1cm4gdmVjX3N0KAorICAgICAgdmVjX3Blcm0odmVjX2x2cngoX19iLCBfX2MpLCBfX2EsIHZlY19sdnNyKF9fYiwgKHVuc2lnbmVkIGNoYXIgKilfX2MpKSwKKyAgICAgIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0dmx4KHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IF9fYiwgdW5zaWduZWQgc2hvcnQgKl9fYykgeworICByZXR1cm4gdmVjX3N0KHZlY19wZXJtKHZlY19sdnJ4KF9fYiwgX19jKSwgX19hLCB2ZWNfbHZzcihfX2IsIF9fYykpLCBfX2IsCisgICAgICAgICAgICAgICAgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0dmx4KHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgKl9fYykgeworICByZXR1cm4gdmVjX3N0KAorICAgICAgdmVjX3Blcm0odmVjX2x2cngoX19iLCBfX2MpLCBfX2EsIHZlY19sdnNyKF9fYiwgKHVuc2lnbmVkIGNoYXIgKilfX2MpKSwKKyAgICAgIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0dmx4KHZlY3RvciBib29sIHNob3J0IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBzaG9ydCAqX19jKSB7CisgIHJldHVybiB2ZWNfc3QoCisgICAgICB2ZWNfcGVybSh2ZWNfbHZyeChfX2IsIF9fYyksIF9fYSwgdmVjX2x2c3IoX19iLCAodW5zaWduZWQgY2hhciAqKV9fYykpLAorICAgICAgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2bHgodmVjdG9yIHBpeGVsIF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgcGl4ZWwgKl9fYykgeworICByZXR1cm4gdmVjX3N0KAorICAgICAgdmVjX3Blcm0odmVjX2x2cngoX19iLCBfX2MpLCBfX2EsIHZlY19sdnNyKF9fYiwgKHVuc2lnbmVkIGNoYXIgKilfX2MpKSwKKyAgICAgIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0dmx4KHZlY3RvciBpbnQgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqX19jKSB7CisgIHJldHVybiB2ZWNfc3QodmVjX3Blcm0odmVjX2x2cngoX19iLCBfX2MpLCBfX2EsIHZlY19sdnNyKF9fYiwgX19jKSksIF9fYiwKKyAgICAgICAgICAgICAgICBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2bHgodmVjdG9yIGludCBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGludCAqX19jKSB7CisgIHJldHVybiB2ZWNfc3QoCisgICAgICB2ZWNfcGVybSh2ZWNfbHZyeChfX2IsIF9fYyksIF9fYSwgdmVjX2x2c3IoX19iLCAodW5zaWduZWQgY2hhciAqKV9fYykpLAorICAgICAgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2bHgodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpfX2MpIHsKKyAgcmV0dXJuIHZlY19zdCh2ZWNfcGVybSh2ZWNfbHZyeChfX2IsIF9fYyksIF9fYSwgdmVjX2x2c3IoX19iLCBfX2MpKSwgX19iLAorICAgICAgICAgICAgICAgIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdHZseCh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgaW50ICpfX2MpIHsKKyAgcmV0dXJuIHZlY19zdCgKKyAgICAgIHZlY19wZXJtKHZlY19sdnJ4KF9fYiwgX19jKSwgX19hLCB2ZWNfbHZzcihfX2IsICh1bnNpZ25lZCBjaGFyICopX19jKSksCisgICAgICBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdHZseCh2ZWN0b3IgYm9vbCBpbnQgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGludCAqX19jKSB7CisgIHJldHVybiB2ZWNfc3QoCisgICAgICB2ZWNfcGVybSh2ZWNfbHZyeChfX2IsIF9fYyksIF9fYSwgdmVjX2x2c3IoX19iLCAodW5zaWduZWQgY2hhciAqKV9fYykpLAorICAgICAgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2bHgodmVjdG9yIGZsb2F0IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgZmxvYXQgKl9fYykgeworICByZXR1cm4gdmVjX3N0KAorICAgICAgdmVjX3Blcm0odmVjX2x2cngoX19iLCBfX2MpLCBfX2EsIHZlY19sdnNyKF9fYiwgKHVuc2lnbmVkIGNoYXIgKilfX2MpKSwKKyAgICAgIF9fYiwgX19jKTsKK30KKworLyogdmVjX3N0dmx4bCAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2bHhsKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lZCBjaGFyICpfX2MpIHsKKyAgcmV0dXJuIHZlY19zdGwodmVjX3Blcm0odmVjX2x2cngoX19iLCBfX2MpLCBfX2EsIHZlY19sdnNyKF9fYiwgX19jKSksIF9fYiwKKyAgICAgICAgICAgICAgICAgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0dmx4bCh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2lnbmVkIGNoYXIgKl9fYykgeworICByZXR1cm4gdmVjX3N0bCgKKyAgICAgIHZlY19wZXJtKHZlY19sdnJ4KF9fYiwgX19jKSwgX19hLCB2ZWNfbHZzcihfX2IsICh1bnNpZ25lZCBjaGFyICopX19jKSksCisgICAgICBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdHZseGwodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgX19iLCB1bnNpZ25lZCBjaGFyICpfX2MpIHsKKyAgcmV0dXJuIHZlY19zdGwodmVjX3Blcm0odmVjX2x2cngoX19iLCBfX2MpLCBfX2EsIHZlY19sdnNyKF9fYiwgX19jKSksIF9fYiwKKyAgICAgICAgICAgICAgICAgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0dmx4bCh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyICpfX2MpIHsKKyAgcmV0dXJuIHZlY19zdGwoCisgICAgICB2ZWNfcGVybSh2ZWNfbHZyeChfX2IsIF9fYyksIF9fYSwgdmVjX2x2c3IoX19iLCAodW5zaWduZWQgY2hhciAqKV9fYykpLAorICAgICAgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2bHhsKHZlY3RvciBib29sIGNoYXIgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBjaGFyICpfX2MpIHsKKyAgcmV0dXJuIHZlY19zdGwoCisgICAgICB2ZWNfcGVybSh2ZWNfbHZyeChfX2IsIF9fYyksIF9fYSwgdmVjX2x2c3IoX19iLCAodW5zaWduZWQgY2hhciAqKV9fYykpLAorICAgICAgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2bHhsKHZlY3RvciBzaG9ydCBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0ICpfX2MpIHsKKyAgcmV0dXJuIHZlY19zdGwodmVjX3Blcm0odmVjX2x2cngoX19iLCBfX2MpLCBfX2EsIHZlY19sdnNyKF9fYiwgX19jKSksIF9fYiwKKyAgICAgICAgICAgICAgICAgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0dmx4bCh2ZWN0b3Igc2hvcnQgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2hvcnQgKl9fYykgeworICByZXR1cm4gdmVjX3N0bCgKKyAgICAgIHZlY19wZXJtKHZlY19sdnJ4KF9fYiwgX19jKSwgX19hLCB2ZWNfbHZzcihfX2IsICh1bnNpZ25lZCBjaGFyICopX19jKSksCisgICAgICBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdHZseGwodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IF9fYiwgdW5zaWduZWQgc2hvcnQgKl9fYykgeworICByZXR1cm4gdmVjX3N0bCh2ZWNfcGVybSh2ZWNfbHZyeChfX2IsIF9fYyksIF9fYSwgdmVjX2x2c3IoX19iLCBfX2MpKSwgX19iLAorICAgICAgICAgICAgICAgICBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2bHhsKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCAqX19jKSB7CisgIHJldHVybiB2ZWNfc3RsKAorICAgICAgdmVjX3Blcm0odmVjX2x2cngoX19iLCBfX2MpLCBfX2EsIHZlY19sdnNyKF9fYiwgKHVuc2lnbmVkIGNoYXIgKilfX2MpKSwKKyAgICAgIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0dmx4bCh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIHNob3J0ICpfX2MpIHsKKyAgcmV0dXJuIHZlY19zdGwoCisgICAgICB2ZWNfcGVybSh2ZWNfbHZyeChfX2IsIF9fYyksIF9fYSwgdmVjX2x2c3IoX19iLCAodW5zaWduZWQgY2hhciAqKV9fYykpLAorICAgICAgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2bHhsKHZlY3RvciBwaXhlbCBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBwaXhlbCAqX19jKSB7CisgIHJldHVybiB2ZWNfc3RsKAorICAgICAgdmVjX3Blcm0odmVjX2x2cngoX19iLCBfX2MpLCBfX2EsIHZlY19sdnNyKF9fYiwgKHVuc2lnbmVkIGNoYXIgKilfX2MpKSwKKyAgICAgIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0dmx4bCh2ZWN0b3IgaW50IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpfX2MpIHsKKyAgcmV0dXJuIHZlY19zdGwodmVjX3Blcm0odmVjX2x2cngoX19iLCBfX2MpLCBfX2EsIHZlY19sdnNyKF9fYiwgX19jKSksIF9fYiwKKyAgICAgICAgICAgICAgICAgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0dmx4bCh2ZWN0b3IgaW50IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGludCAqX19jKSB7CisgIHJldHVybiB2ZWNfc3RsKAorICAgICAgdmVjX3Blcm0odmVjX2x2cngoX19iLCBfX2MpLCBfX2EsIHZlY19sdnNyKF9fYiwgKHVuc2lnbmVkIGNoYXIgKilfX2MpKSwKKyAgICAgIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0dmx4bCh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpfX2MpIHsKKyAgcmV0dXJuIHZlY19zdGwodmVjX3Blcm0odmVjX2x2cngoX19iLCBfX2MpLCBfX2EsIHZlY19sdnNyKF9fYiwgX19jKSksIF9fYiwKKyAgICAgICAgICAgICAgICAgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0dmx4bCh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGludCAqX19jKSB7CisgIHJldHVybiB2ZWNfc3RsKAorICAgICAgdmVjX3Blcm0odmVjX2x2cngoX19iLCBfX2MpLCBfX2EsIHZlY19sdnNyKF9fYiwgKHVuc2lnbmVkIGNoYXIgKilfX2MpKSwKKyAgICAgIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0dmx4bCh2ZWN0b3IgYm9vbCBpbnQgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBpbnQgKl9fYykgeworICByZXR1cm4gdmVjX3N0bCgKKyAgICAgIHZlY19wZXJtKHZlY19sdnJ4KF9fYiwgX19jKSwgX19hLCB2ZWNfbHZzcihfX2IsICh1bnNpZ25lZCBjaGFyICopX19jKSksCisgICAgICBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdHZseGwodmVjdG9yIGZsb2F0IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGZsb2F0ICpfX2MpIHsKKyAgcmV0dXJuIHZlY19zdGwoCisgICAgICB2ZWNfcGVybSh2ZWNfbHZyeChfX2IsIF9fYyksIF9fYSwgdmVjX2x2c3IoX19iLCAodW5zaWduZWQgY2hhciAqKV9fYykpLAorICAgICAgX19iLCBfX2MpOworfQorCisvKiB2ZWNfc3R2cnggKi8KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0dnJ4KHZlY3RvciBzaWduZWQgY2hhciBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVkIGNoYXIgKl9fYykgeworICByZXR1cm4gdmVjX3N0KHZlY19wZXJtKF9fYSwgdmVjX2x2bHgoX19iLCBfX2MpLCB2ZWNfbHZzcihfX2IsIF9fYykpLCBfX2IsCisgICAgICAgICAgICAgICAgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0dnJ4KHZlY3RvciBzaWduZWQgY2hhciBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNpZ25lZCBjaGFyICpfX2MpIHsKKyAgcmV0dXJuIHZlY19zdCgKKyAgICAgIHZlY19wZXJtKF9fYSwgdmVjX2x2bHgoX19iLCBfX2MpLCB2ZWNfbHZzcihfX2IsICh1bnNpZ25lZCBjaGFyICopX19jKSksCisgICAgICBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdHZyeCh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqX19jKSB7CisgIHJldHVybiB2ZWNfc3QodmVjX3Blcm0oX19hLCB2ZWNfbHZseChfX2IsIF9fYyksIHZlY19sdnNyKF9fYiwgX19jKSksIF9fYiwKKyAgICAgICAgICAgICAgICBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2cngodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyICpfX2MpIHsKKyAgcmV0dXJuIHZlY19zdCgKKyAgICAgIHZlY19wZXJtKF9fYSwgdmVjX2x2bHgoX19iLCBfX2MpLCB2ZWNfbHZzcihfX2IsICh1bnNpZ25lZCBjaGFyICopX19jKSksCisgICAgICBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdHZyeCh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBjaGFyICpfX2MpIHsKKyAgcmV0dXJuIHZlY19zdCgKKyAgICAgIHZlY19wZXJtKF9fYSwgdmVjX2x2bHgoX19iLCBfX2MpLCB2ZWNfbHZzcihfX2IsICh1bnNpZ25lZCBjaGFyICopX19jKSksCisgICAgICBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdHZyeCh2ZWN0b3Igc2hvcnQgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0ICpfX2MpIHsKKyAgcmV0dXJuIHZlY19zdCh2ZWNfcGVybShfX2EsIHZlY19sdmx4KF9fYiwgX19jKSwgdmVjX2x2c3IoX19iLCBfX2MpKSwgX19iLAorICAgICAgICAgICAgICAgIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdHZyeCh2ZWN0b3Igc2hvcnQgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaG9ydCAqX19jKSB7CisgIHJldHVybiB2ZWNfc3QoCisgICAgICB2ZWNfcGVybShfX2EsIHZlY19sdmx4KF9fYiwgX19jKSwgdmVjX2x2c3IoX19iLCAodW5zaWduZWQgY2hhciAqKV9fYykpLAorICAgICAgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2cngodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgX19iLCB1bnNpZ25lZCBzaG9ydCAqX19jKSB7CisgIHJldHVybiB2ZWNfc3QodmVjX3Blcm0oX19hLCB2ZWNfbHZseChfX2IsIF9fYyksIHZlY19sdnNyKF9fYiwgX19jKSksIF9fYiwKKyAgICAgICAgICAgICAgICBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2cngodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCAqX19jKSB7CisgIHJldHVybiB2ZWNfc3QoCisgICAgICB2ZWNfcGVybShfX2EsIHZlY19sdmx4KF9fYiwgX19jKSwgdmVjX2x2c3IoX19iLCAodW5zaWduZWQgY2hhciAqKV9fYykpLAorICAgICAgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2cngodmVjdG9yIGJvb2wgc2hvcnQgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIHNob3J0ICpfX2MpIHsKKyAgcmV0dXJuIHZlY19zdCgKKyAgICAgIHZlY19wZXJtKF9fYSwgdmVjX2x2bHgoX19iLCBfX2MpLCB2ZWNfbHZzcihfX2IsICh1bnNpZ25lZCBjaGFyICopX19jKSksCisgICAgICBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdHZyeCh2ZWN0b3IgcGl4ZWwgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBwaXhlbCAqX19jKSB7CisgIHJldHVybiB2ZWNfc3QoCisgICAgICB2ZWNfcGVybShfX2EsIHZlY19sdmx4KF9fYiwgX19jKSwgdmVjX2x2c3IoX19iLCAodW5zaWduZWQgY2hhciAqKV9fYykpLAorICAgICAgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2cngodmVjdG9yIGludCBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpfX2MpIHsKKyAgcmV0dXJuIHZlY19zdCh2ZWNfcGVybShfX2EsIHZlY19sdmx4KF9fYiwgX19jKSwgdmVjX2x2c3IoX19iLCBfX2MpKSwgX19iLAorICAgICAgICAgICAgICAgIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdHZyeCh2ZWN0b3IgaW50IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgaW50ICpfX2MpIHsKKyAgcmV0dXJuIHZlY19zdCgKKyAgICAgIHZlY19wZXJtKF9fYSwgdmVjX2x2bHgoX19iLCBfX2MpLCB2ZWNfbHZzcihfX2IsICh1bnNpZ25lZCBjaGFyICopX19jKSksCisgICAgICBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdHZyeCh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKl9fYykgeworICByZXR1cm4gdmVjX3N0KHZlY19wZXJtKF9fYSwgdmVjX2x2bHgoX19iLCBfX2MpLCB2ZWNfbHZzcihfX2IsIF9fYykpLCBfX2IsCisgICAgICAgICAgICAgICAgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0dnJ4KHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBpbnQgKl9fYykgeworICByZXR1cm4gdmVjX3N0KAorICAgICAgdmVjX3Blcm0oX19hLCB2ZWNfbHZseChfX2IsIF9fYyksIHZlY19sdnNyKF9fYiwgKHVuc2lnbmVkIGNoYXIgKilfX2MpKSwKKyAgICAgIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0dnJ4KHZlY3RvciBib29sIGludCBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgaW50ICpfX2MpIHsKKyAgcmV0dXJuIHZlY19zdCgKKyAgICAgIHZlY19wZXJtKF9fYSwgdmVjX2x2bHgoX19iLCBfX2MpLCB2ZWNfbHZzcihfX2IsICh1bnNpZ25lZCBjaGFyICopX19jKSksCisgICAgICBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdHZyeCh2ZWN0b3IgZmxvYXQgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBmbG9hdCAqX19jKSB7CisgIHJldHVybiB2ZWNfc3QoCisgICAgICB2ZWNfcGVybShfX2EsIHZlY19sdmx4KF9fYiwgX19jKSwgdmVjX2x2c3IoX19iLCAodW5zaWduZWQgY2hhciAqKV9fYykpLAorICAgICAgX19iLCBfX2MpOworfQorCisvKiB2ZWNfc3R2cnhsICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdHZyeGwodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVkIGNoYXIgKl9fYykgeworICByZXR1cm4gdmVjX3N0bCh2ZWNfcGVybShfX2EsIHZlY19sdmx4KF9fYiwgX19jKSwgdmVjX2x2c3IoX19iLCBfX2MpKSwgX19iLAorICAgICAgICAgICAgICAgICBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2cnhsKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaWduZWQgY2hhciAqX19jKSB7CisgIHJldHVybiB2ZWNfc3RsKAorICAgICAgdmVjX3Blcm0oX19hLCB2ZWNfbHZseChfX2IsIF9fYyksIHZlY19sdnNyKF9fYiwgKHVuc2lnbmVkIGNoYXIgKilfX2MpKSwKKyAgICAgIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0dnJ4bCh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBfX2IsIHVuc2lnbmVkIGNoYXIgKl9fYykgeworICByZXR1cm4gdmVjX3N0bCh2ZWNfcGVybShfX2EsIHZlY19sdmx4KF9fYiwgX19jKSwgdmVjX2x2c3IoX19iLCBfX2MpKSwgX19iLAorICAgICAgICAgICAgICAgICBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2cnhsKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgKl9fYykgeworICByZXR1cm4gdmVjX3N0bCgKKyAgICAgIHZlY19wZXJtKF9fYSwgdmVjX2x2bHgoX19iLCBfX2MpLCB2ZWNfbHZzcihfX2IsICh1bnNpZ25lZCBjaGFyICopX19jKSksCisgICAgICBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdHZyeGwodmVjdG9yIGJvb2wgY2hhciBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGNoYXIgKl9fYykgeworICByZXR1cm4gdmVjX3N0bCgKKyAgICAgIHZlY19wZXJtKF9fYSwgdmVjX2x2bHgoX19iLCBfX2MpLCB2ZWNfbHZzcihfX2IsICh1bnNpZ25lZCBjaGFyICopX19jKSksCisgICAgICBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdHZyeGwodmVjdG9yIHNob3J0IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgKl9fYykgeworICByZXR1cm4gdmVjX3N0bCh2ZWNfcGVybShfX2EsIHZlY19sdmx4KF9fYiwgX19jKSwgdmVjX2x2c3IoX19iLCBfX2MpKSwgX19iLAorICAgICAgICAgICAgICAgICBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2cnhsKHZlY3RvciBzaG9ydCBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaG9ydCAqX19jKSB7CisgIHJldHVybiB2ZWNfc3RsKAorICAgICAgdmVjX3Blcm0oX19hLCB2ZWNfbHZseChfX2IsIF9fYyksIHZlY19sdnNyKF9fYiwgKHVuc2lnbmVkIGNoYXIgKilfX2MpKSwKKyAgICAgIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0dnJ4bCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgX19iLCB1bnNpZ25lZCBzaG9ydCAqX19jKSB7CisgIHJldHVybiB2ZWNfc3RsKHZlY19wZXJtKF9fYSwgdmVjX2x2bHgoX19iLCBfX2MpLCB2ZWNfbHZzcihfX2IsIF9fYykpLCBfX2IsCisgICAgICAgICAgICAgICAgIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdHZyeGwodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0ICpfX2MpIHsKKyAgcmV0dXJuIHZlY19zdGwoCisgICAgICB2ZWNfcGVybShfX2EsIHZlY19sdmx4KF9fYiwgX19jKSwgdmVjX2x2c3IoX19iLCAodW5zaWduZWQgY2hhciAqKV9fYykpLAorICAgICAgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2cnhsKHZlY3RvciBib29sIHNob3J0IF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgc2hvcnQgKl9fYykgeworICByZXR1cm4gdmVjX3N0bCgKKyAgICAgIHZlY19wZXJtKF9fYSwgdmVjX2x2bHgoX19iLCBfX2MpLCB2ZWNfbHZzcihfX2IsICh1bnNpZ25lZCBjaGFyICopX19jKSksCisgICAgICBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19BVFRSU19vX2FpIHZlY19zdHZyeGwodmVjdG9yIHBpeGVsIF9fYSwgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHBpeGVsICpfX2MpIHsKKyAgcmV0dXJuIHZlY19zdGwoCisgICAgICB2ZWNfcGVybShfX2EsIHZlY19sdmx4KF9fYiwgX19jKSwgdmVjX2x2c3IoX19iLCAodW5zaWduZWQgY2hhciAqKV9fYykpLAorICAgICAgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2cnhsKHZlY3RvciBpbnQgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKl9fYykgeworICByZXR1cm4gdmVjX3N0bCh2ZWNfcGVybShfX2EsIHZlY19sdmx4KF9fYiwgX19jKSwgdmVjX2x2c3IoX19iLCBfX2MpKSwgX19iLAorICAgICAgICAgICAgICAgICBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2cnhsKHZlY3RvciBpbnQgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgaW50ICpfX2MpIHsKKyAgcmV0dXJuIHZlY19zdGwoCisgICAgICB2ZWNfcGVybShfX2EsIHZlY19sdmx4KF9fYiwgX19jKSwgdmVjX2x2c3IoX19iLCAodW5zaWduZWQgY2hhciAqKV9fYykpLAorICAgICAgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2cnhsKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKl9fYykgeworICByZXR1cm4gdmVjX3N0bCh2ZWNfcGVybShfX2EsIHZlY19sdmx4KF9fYiwgX19jKSwgdmVjX2x2c3IoX19iLCBfX2MpKSwgX19iLAorICAgICAgICAgICAgICAgICBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2cnhsKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgaW50ICpfX2MpIHsKKyAgcmV0dXJuIHZlY19zdGwoCisgICAgICB2ZWNfcGVybShfX2EsIHZlY19sdmx4KF9fYiwgX19jKSwgdmVjX2x2c3IoX19iLCAodW5zaWduZWQgY2hhciAqKV9fYykpLAorICAgICAgX19iLCBfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fQVRUUlNfb19haSB2ZWNfc3R2cnhsKHZlY3RvciBib29sIGludCBfX2EsIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGludCAqX19jKSB7CisgIHJldHVybiB2ZWNfc3RsKAorICAgICAgdmVjX3Blcm0oX19hLCB2ZWNfbHZseChfX2IsIF9fYyksIHZlY19sdnNyKF9fYiwgKHVuc2lnbmVkIGNoYXIgKilfX2MpKSwKKyAgICAgIF9fYiwgX19jKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0FUVFJTX29fYWkgdmVjX3N0dnJ4bCh2ZWN0b3IgZmxvYXQgX19hLCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgZmxvYXQgKl9fYykgeworICByZXR1cm4gdmVjX3N0bCgKKyAgICAgIHZlY19wZXJtKF9fYSwgdmVjX2x2bHgoX19iLCBfX2MpLCB2ZWNfbHZzcihfX2IsICh1bnNpZ25lZCBjaGFyICopX19jKSksCisgICAgICBfX2IsIF9fYyk7Cit9CisKKy8qIHZlY19wcm9tb3RlICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkgdmVjX3Byb21vdGUoc2lnbmVkIGNoYXIgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgX19iKSB7CisgIHZlY3RvciBzaWduZWQgY2hhciBfX3JlcyA9ICh2ZWN0b3Igc2lnbmVkIGNoYXIpKDApOworICBfX3Jlc1tfX2JdID0gX19hOworICByZXR1cm4gX19yZXM7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3Byb21vdGUodW5zaWduZWQgY2hhciBfX2EsIGludCBfX2IpIHsKKyAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19yZXMgPSAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDApOworICBfX3Jlc1tfX2JdID0gX19hOworICByZXR1cm4gX19yZXM7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaG9ydCBfX0FUVFJTX29fYWkgdmVjX3Byb21vdGUoc2hvcnQgX19hLCBpbnQgX19iKSB7CisgIHZlY3RvciBzaG9ydCBfX3JlcyA9ICh2ZWN0b3Igc2hvcnQpKDApOworICBfX3Jlc1tfX2JdID0gX19hOworICByZXR1cm4gX19yZXM7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK3ZlY19wcm9tb3RlKHVuc2lnbmVkIHNob3J0IF9fYSwgaW50IF9fYikgeworICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19yZXMgPSAodmVjdG9yIHVuc2lnbmVkIHNob3J0KSgwKTsKKyAgX19yZXNbX19iXSA9IF9fYTsKKyAgcmV0dXJuIF9fcmVzOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgaW50IF9fQVRUUlNfb19haSB2ZWNfcHJvbW90ZShpbnQgX19hLCBpbnQgX19iKSB7CisgIHZlY3RvciBpbnQgX19yZXMgPSAodmVjdG9yIGludCkoMCk7CisgIF9fcmVzW19fYl0gPSBfX2E7CisgIHJldHVybiBfX3JlczsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkgdmVjX3Byb21vdGUodW5zaWduZWQgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBfX2IpIHsKKyAgdmVjdG9yIHVuc2lnbmVkIGludCBfX3JlcyA9ICh2ZWN0b3IgdW5zaWduZWQgaW50KSgwKTsKKyAgX19yZXNbX19iXSA9IF9fYTsKKyAgcmV0dXJuIF9fcmVzOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZmxvYXQgX19BVFRSU19vX2FpIHZlY19wcm9tb3RlKGZsb2F0IF9fYSwgaW50IF9fYikgeworICB2ZWN0b3IgZmxvYXQgX19yZXMgPSAodmVjdG9yIGZsb2F0KSgwKTsKKyAgX19yZXNbX19iXSA9IF9fYTsKKyAgcmV0dXJuIF9fcmVzOworfQorCisvKiB2ZWNfc3BsYXRzICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBzaWduZWQgY2hhciBfX0FUVFJTX29fYWkgdmVjX3NwbGF0cyhzaWduZWQgY2hhciBfX2EpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGNoYXIpKF9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3NwbGF0cyh1bnNpZ25lZCBjaGFyIF9fYSkgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBjaGFyKShfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2hvcnQgX19BVFRSU19vX2FpIHZlY19zcGxhdHMoc2hvcnQgX19hKSB7CisgIHJldHVybiAodmVjdG9yIHNob3J0KShfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19BVFRSU19vX2FpCit2ZWNfc3BsYXRzKHVuc2lnbmVkIHNob3J0IF9fYSkgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBzaG9ydCkoX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGludCBfX0FUVFJTX29fYWkgdmVjX3NwbGF0cyhpbnQgX19hKSB7CisgIHJldHVybiAodmVjdG9yIGludCkoX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGludCBfX0FUVFJTX29fYWkKK3ZlY19zcGxhdHModW5zaWduZWQgaW50IF9fYSkgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBpbnQpKF9fYSk7Cit9CisKKyNpZmRlZiBfX1ZTWF9fCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY19zcGxhdHMoc2lnbmVkIGxvbmcgbG9uZyBfX2EpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZykoX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY19zcGxhdHModW5zaWduZWQgbG9uZyBsb25nIF9fYSkgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpKF9fYSk7Cit9CisKKyNpZiBkZWZpbmVkKF9fUE9XRVI4X1ZFQ1RPUl9fKSAmJiBkZWZpbmVkKF9fcG93ZXJwYzY0X18pCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3Igc2lnbmVkIF9faW50MTI4IF9fQVRUUlNfb19haQordmVjX3NwbGF0cyhzaWduZWQgX19pbnQxMjggX19hKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBfX2ludDEyOCkoX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHVuc2lnbmVkIF9faW50MTI4IF9fQVRUUlNfb19haQordmVjX3NwbGF0cyh1bnNpZ25lZCBfX2ludDEyOCBfX2EpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgX19pbnQxMjgpKF9fYSk7Cit9CisKKyNlbmRpZgorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgZG91YmxlIF9fQVRUUlNfb19haSB2ZWNfc3BsYXRzKGRvdWJsZSBfX2EpIHsKKyAgcmV0dXJuICh2ZWN0b3IgZG91YmxlKShfX2EpOworfQorI2VuZGlmCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBmbG9hdCBfX0FUVFJTX29fYWkgdmVjX3NwbGF0cyhmbG9hdCBfX2EpIHsKKyAgcmV0dXJuICh2ZWN0b3IgZmxvYXQpKF9fYSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHByZWRpY2F0ZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIHZlY19hbGxfZXEgKi8KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2VxKHZlY3RvciBzaWduZWQgY2hhciBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWJfcChfX0NSNl9MVCwgKHZlY3RvciBjaGFyKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9lcSh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1Yl9wKF9fQ1I2X0xULCAodmVjdG9yIGNoYXIpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGNoYXIpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2VxKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcXViX3AoX19DUjZfTFQsICh2ZWN0b3IgY2hhcilfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgY2hhcilfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfZXEodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1Yl9wKF9fQ1I2X0xULCAodmVjdG9yIGNoYXIpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGNoYXIpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2VxKHZlY3RvciBib29sIGNoYXIgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcXViX3AoX19DUjZfTFQsICh2ZWN0b3IgY2hhcilfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgY2hhcilfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfZXEodmVjdG9yIGJvb2wgY2hhciBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1Yl9wKF9fQ1I2X0xULCAodmVjdG9yIGNoYXIpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGNoYXIpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2VxKHZlY3RvciBib29sIGNoYXIgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1Yl9wKF9fQ1I2X0xULCAodmVjdG9yIGNoYXIpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGNoYXIpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2VxKHZlY3RvciBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWhfcChfX0NSNl9MVCwgX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfZXEodmVjdG9yIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcXVoX3AoX19DUjZfTFQsIF9fYSwgKHZlY3RvciBzaG9ydClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfZXEodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1aF9wKF9fQ1I2X0xULCAodmVjdG9yIHNob3J0KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBzaG9ydClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfZXEodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcXVoX3AoX19DUjZfTFQsICh2ZWN0b3Igc2hvcnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHNob3J0KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9lcSh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWhfcChfX0NSNl9MVCwgKHZlY3RvciBzaG9ydClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Igc2hvcnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2VxKHZlY3RvciBib29sIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1aF9wKF9fQ1I2X0xULCAodmVjdG9yIHNob3J0KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBzaG9ydClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfZXEodmVjdG9yIGJvb2wgc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWhfcChfX0NSNl9MVCwgKHZlY3RvciBzaG9ydClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Igc2hvcnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2VxKHZlY3RvciBwaXhlbCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHBpeGVsIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWhfcChfX0NSNl9MVCwgKHZlY3RvciBzaG9ydClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Igc2hvcnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2VxKHZlY3RvciBpbnQgX19hLCB2ZWN0b3IgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdXdfcChfX0NSNl9MVCwgX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfZXEodmVjdG9yIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdXdfcChfX0NSNl9MVCwgX19hLCAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfZXEodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcXV3X3AoX19DUjZfTFQsICh2ZWN0b3IgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2VxKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcXV3X3AoX19DUjZfTFQsICh2ZWN0b3IgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2VxKHZlY3RvciBib29sIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcXV3X3AoX19DUjZfTFQsICh2ZWN0b3IgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2VxKHZlY3RvciBib29sIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcXV3X3AoX19DUjZfTFQsICh2ZWN0b3IgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2VxKHZlY3RvciBib29sIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdXdfcChfX0NSNl9MVCwgKHZlY3RvciBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGludClfX2IpOworfQorCisjaWZkZWYgX19QT1dFUjhfVkVDVE9SX18KK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9lcSh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1ZF9wKF9fQ1I2X0xULCBfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9lcSh2ZWN0b3IgbG9uZyBsb25nIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1ZF9wKF9fQ1I2X0xULCBfX2EsICh2ZWN0b3IgbG9uZyBsb25nKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9lcSh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWRfcChfX0NSNl9MVCwgKHZlY3RvciBsb25nIGxvbmcpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGxvbmcgbG9uZylfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfZXEodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWRfcChfX0NSNl9MVCwgKHZlY3RvciBsb25nIGxvbmcpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGxvbmcgbG9uZylfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfZXEodmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWRfcChfX0NSNl9MVCwgKHZlY3RvciBsb25nIGxvbmcpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGxvbmcgbG9uZylfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfZXEodmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWRfcChfX0NSNl9MVCwgKHZlY3RvciBsb25nIGxvbmcpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGxvbmcgbG9uZylfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfZXEodmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1ZF9wKF9fQ1I2X0xULCAodmVjdG9yIGxvbmcgbG9uZylfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgbG9uZyBsb25nKV9fYik7Cit9CisjZW5kaWYKKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2VxKHZlY3RvciBmbG9hdCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGZsb2F0IF9fYikgeworI2lmZGVmIF9fVlNYX18KKyAgcmV0dXJuIF9fYnVpbHRpbl92c3hfeHZjbXBlcXNwX3AoX19DUjZfTFQsIF9fYSwgX19iKTsKKyNlbHNlCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXFmcF9wKF9fQ1I2X0xULCBfX2EsIF9fYik7CisjZW5kaWYKK30KKworI2lmZGVmIF9fVlNYX18KK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9lcSh2ZWN0b3IgZG91YmxlIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgZG91YmxlIF9fYikgeworICByZXR1cm4gX19idWlsdGluX3ZzeF94dmNtcGVxZHBfcChfX0NSNl9MVCwgX19hLCBfX2IpOworfQorI2VuZGlmCisKKy8qIHZlY19hbGxfZ2UgKi8KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2dlKHZlY3RvciBzaWduZWQgY2hhciBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0c2JfcChfX0NSNl9FUSwgX19iLCBfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfZ2UodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0c2JfcChfX0NSNl9FUSwgKHZlY3RvciBzaWduZWQgY2hhcilfX2IsIF9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9nZSh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1Yl9wKF9fQ1I2X0VRLCBfX2IsIF9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9nZSh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHViX3AoX19DUjZfRVEsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IsIF9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9nZSh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1Yl9wKF9fQ1I2X0VRLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2dlKHZlY3RvciBib29sIGNoYXIgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWJfcChfX0NSNl9FUSwgX19iLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2dlKHZlY3RvciBib29sIGNoYXIgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1Yl9wKF9fQ1I2X0VRLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2dlKHZlY3RvciBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0c2hfcChfX0NSNl9FUSwgX19iLCBfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfZ2UodmVjdG9yIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHNoX3AoX19DUjZfRVEsICh2ZWN0b3Igc2hvcnQpX19iLCBfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfZ2UodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1aF9wKF9fQ1I2X0VRLCBfX2IsIF9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9nZSh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWhfcChfX0NSNl9FUSwgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9nZSh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWhfcChfX0NSNl9FUSwgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2dlKHZlY3RvciBib29sIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1aF9wKF9fQ1I2X0VRLCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2dlKHZlY3RvciBib29sIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHVoX3AoX19DUjZfRVEsICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9nZSh2ZWN0b3IgaW50IF9fYSwgdmVjdG9yIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHN3X3AoX19DUjZfRVEsIF9fYiwgX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2dlKHZlY3RvciBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHN3X3AoX19DUjZfRVEsICh2ZWN0b3IgaW50KV9fYiwgX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2dlKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1d19wKF9fQ1I2X0VRLCBfX2IsIF9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9nZSh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1d19wKF9fQ1I2X0VRLCAodmVjdG9yIHVuc2lnbmVkIGludClfX2IsIF9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9nZSh2ZWN0b3IgYm9vbCBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1d19wKF9fQ1I2X0VRLCAodmVjdG9yIHVuc2lnbmVkIGludClfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9nZSh2ZWN0b3IgYm9vbCBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1d19wKF9fQ1I2X0VRLCBfX2IsICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9nZSh2ZWN0b3IgYm9vbCBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHV3X3AoX19DUjZfRVEsICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hKTsKK30KKworI2lmZGVmIF9fUE9XRVI4X1ZFQ1RPUl9fCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfZ2UodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0c2RfcChfX0NSNl9FUSwgX19iLCBfX2EpOworfQorc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2dlKHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3RzZF9wKF9fQ1I2X0VRLCAodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfZ2UodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHVkX3AoX19DUjZfRVEsIF9fYiwgX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2dlKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHVkX3AoX19DUjZfRVEsICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2dlKHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1ZF9wKF9fQ1I2X0VRLCAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9nZSh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1ZF9wKF9fQ1I2X0VRLCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9nZSh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHVkX3AoX19DUjZfRVEsICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19hKTsKK30KKyNlbmRpZgorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfZ2UodmVjdG9yIGZsb2F0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgZmxvYXQgX19iKSB7CisjaWZkZWYgX19WU1hfXworICByZXR1cm4gX19idWlsdGluX3ZzeF94dmNtcGdlc3BfcChfX0NSNl9MVCwgX19hLCBfX2IpOworI2Vsc2UKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBnZWZwX3AoX19DUjZfTFQsIF9fYSwgX19iKTsKKyNlbmRpZgorfQorCisjaWZkZWYgX19WU1hfXworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2dlKHZlY3RvciBkb3VibGUgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBkb3VibGUgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fdnN4X3h2Y21wZ2VkcF9wKF9fQ1I2X0xULCBfX2EsIF9fYik7Cit9CisjZW5kaWYKKworLyogdmVjX2FsbF9ndCAqLworCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfZ3QodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3RzYl9wKF9fQ1I2X0xULCBfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9ndCh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3RzYl9wKF9fQ1I2X0xULCBfX2EsICh2ZWN0b3Igc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2d0KHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHViX3AoX19DUjZfTFQsIF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2d0KHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWJfcChfX0NSNl9MVCwgX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2d0KHZlY3RvciBib29sIGNoYXIgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHViX3AoX19DUjZfTFQsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfZ3QodmVjdG9yIGJvb2wgY2hhciBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1Yl9wKF9fQ1I2X0xULCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfZ3QodmVjdG9yIGJvb2wgY2hhciBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHViX3AoX19DUjZfTFQsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfZ3QodmVjdG9yIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3RzaF9wKF9fQ1I2X0xULCBfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9ndCh2ZWN0b3Igc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0c2hfcChfX0NSNl9MVCwgX19hLCAodmVjdG9yIHNob3J0KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9ndCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHVoX3AoX19DUjZfTFQsIF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2d0KHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1aF9wKF9fQ1I2X0xULCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2d0KHZlY3RvciBib29sIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1aF9wKF9fQ1I2X0xULCAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfZ3QodmVjdG9yIGJvb2wgc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHVoX3AoX19DUjZfTFQsICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfZ3QodmVjdG9yIGJvb2wgc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWhfcChfX0NSNl9MVCwgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2d0KHZlY3RvciBpbnQgX19hLCB2ZWN0b3IgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0c3dfcChfX0NSNl9MVCwgX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfZ3QodmVjdG9yIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0c3dfcChfX0NSNl9MVCwgX19hLCAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfZ3QodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHV3X3AoX19DUjZfTFQsIF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2d0KHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHV3X3AoX19DUjZfTFQsIF9fYSwgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2d0KHZlY3RvciBib29sIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHV3X3AoX19DUjZfTFQsICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2d0KHZlY3RvciBib29sIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHV3X3AoX19DUjZfTFQsICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2d0KHZlY3RvciBib29sIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dXdfcChfX0NSNl9MVCwgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGludClfX2IpOworfQorCisjaWZkZWYgX19QT1dFUjhfVkVDVE9SX18KK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9ndCh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3RzZF9wKF9fQ1I2X0xULCBfX2EsIF9fYik7Cit9CitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfZ3QodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHNkX3AoX19DUjZfTFQsIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9ndCh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWRfcChfX0NSNl9MVCwgX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfZ3QodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWRfcChfX0NSNl9MVCwgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfZ3QodmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHVkX3AoX19DUjZfTFQsICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2d0KHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHVkX3AoX19DUjZfTFQsICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2d0KHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWRfcChfX0NSNl9MVCwgKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2IpOworfQorI2VuZGlmCisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9ndCh2ZWN0b3IgZmxvYXQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBmbG9hdCBfX2IpIHsKKyNpZmRlZiBfX1ZTWF9fCisgIHJldHVybiBfX2J1aWx0aW5fdnN4X3h2Y21wZ3RzcF9wKF9fQ1I2X0xULCBfX2EsIF9fYik7CisjZWxzZQorICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0ZnBfcChfX0NSNl9MVCwgX19hLCBfX2IpOworI2VuZGlmCit9CisKKyNpZmRlZiBfX1ZTWF9fCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfZ3QodmVjdG9yIGRvdWJsZSBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGRvdWJsZSBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl92c3hfeHZjbXBndGRwX3AoX19DUjZfTFQsIF9fYSwgX19iKTsKK30KKyNlbmRpZgorCisvKiB2ZWNfYWxsX2luICovCisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpCit2ZWNfYWxsX2luKHZlY3RvciBmbG9hdCBfX2EsIHZlY3RvciBmbG9hdCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBiZnBfcChfX0NSNl9FUSwgX19hLCBfX2IpOworfQorCisvKiB2ZWNfYWxsX2xlICovCisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9sZSh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHNiX3AoX19DUjZfRVEsIF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2xlKHZlY3RvciBzaWduZWQgY2hhciBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHNiX3AoX19DUjZfRVEsIF9fYSwgKHZlY3RvciBzaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfbGUodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWJfcChfX0NSNl9FUSwgX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfbGUodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1Yl9wKF9fQ1I2X0VRLCBfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfbGUodmVjdG9yIGJvb2wgY2hhciBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWJfcChfX0NSNl9FUSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9sZSh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHViX3AoX19DUjZfRVEsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9sZSh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWJfcChfX0NSNl9FUSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9sZSh2ZWN0b3Igc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHNoX3AoX19DUjZfRVEsIF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2xlKHZlY3RvciBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3RzaF9wKF9fQ1I2X0VRLCBfX2EsICh2ZWN0b3Igc2hvcnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2xlKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWhfcChfX0NSNl9FUSwgX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfbGUodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHVoX3AoX19DUjZfRVEsIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfbGUodmVjdG9yIGJvb2wgc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHVoX3AoX19DUjZfRVEsICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9sZSh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWhfcChfX0NSNl9FUSwgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9sZSh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1aF9wKF9fQ1I2X0VRLCAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfbGUodmVjdG9yIGludCBfX2EsIHZlY3RvciBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3Rzd19wKF9fQ1I2X0VRLCBfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9sZSh2ZWN0b3IgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3Rzd19wKF9fQ1I2X0VRLCBfX2EsICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9sZSh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dXdfcChfX0NSNl9FUSwgX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfbGUodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dXdfcChfX0NSNl9FUSwgX19hLCAodmVjdG9yIHVuc2lnbmVkIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfbGUodmVjdG9yIGJvb2wgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dXdfcChfX0NSNl9FUSwgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfbGUodmVjdG9yIGJvb2wgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dXdfcChfX0NSNl9FUSwgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfbGUodmVjdG9yIGJvb2wgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1d19wKF9fQ1I2X0VRLCAodmVjdG9yIHVuc2lnbmVkIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYik7Cit9CisKKyNpZmRlZiBfX1BPV0VSOF9WRUNUT1JfXworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2xlKHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHNkX3AoX19DUjZfRVEsIF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2xlKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1ZF9wKF9fQ1I2X0VRLCBfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9sZSh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0c2RfcChfX0NSNl9FUSwgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2xlKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHVkX3AoX19DUjZfRVEsIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2xlKHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1ZF9wKF9fQ1I2X0VRLCAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9sZSh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1ZF9wKF9fQ1I2X0VRLCAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9sZSh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHVkX3AoX19DUjZfRVEsICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19iKTsKK30KKyNlbmRpZgorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfbGUodmVjdG9yIGZsb2F0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgZmxvYXQgX19iKSB7CisjaWZkZWYgX19WU1hfXworICByZXR1cm4gX19idWlsdGluX3ZzeF94dmNtcGdlc3BfcChfX0NSNl9MVCwgX19iLCBfX2EpOworI2Vsc2UKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBnZWZwX3AoX19DUjZfTFQsIF9fYiwgX19hKTsKKyNlbmRpZgorfQorCisjaWZkZWYgX19WU1hfXworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2xlKHZlY3RvciBkb3VibGUgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBkb3VibGUgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fdnN4X3h2Y21wZ2VkcF9wKF9fQ1I2X0xULCBfX2IsIF9fYSk7Cit9CisjZW5kaWYKKworLyogdmVjX2FsbF9sdCAqLworCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfbHQodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3RzYl9wKF9fQ1I2X0xULCBfX2IsIF9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9sdCh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3RzYl9wKF9fQ1I2X0xULCAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYiwgX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2x0KHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHViX3AoX19DUjZfTFQsIF9fYiwgX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2x0KHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWJfcChfX0NSNl9MVCwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYiwgX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2x0KHZlY3RvciBib29sIGNoYXIgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHViX3AoX19DUjZfTFQsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfbHQodmVjdG9yIGJvb2wgY2hhciBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1Yl9wKF9fQ1I2X0xULCBfX2IsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfbHQodmVjdG9yIGJvb2wgY2hhciBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHViX3AoX19DUjZfTFQsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfbHQodmVjdG9yIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3RzaF9wKF9fQ1I2X0xULCBfX2IsIF9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9sdCh2ZWN0b3Igc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0c2hfcChfX0NSNl9MVCwgKHZlY3RvciBzaG9ydClfX2IsIF9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9sdCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHVoX3AoX19DUjZfTFQsIF9fYiwgX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2x0KHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1aF9wKF9fQ1I2X0xULCAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2x0KHZlY3RvciBib29sIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1aF9wKF9fQ1I2X0xULCAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfbHQodmVjdG9yIGJvb2wgc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHVoX3AoX19DUjZfTFQsIF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfbHQodmVjdG9yIGJvb2wgc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWhfcChfX0NSNl9MVCwgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2x0KHZlY3RvciBpbnQgX19hLCB2ZWN0b3IgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0c3dfcChfX0NSNl9MVCwgX19iLCBfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfbHQodmVjdG9yIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0c3dfcChfX0NSNl9MVCwgKHZlY3RvciBpbnQpX19iLCBfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfbHQodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHV3X3AoX19DUjZfTFQsIF9fYiwgX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2x0KHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHV3X3AoX19DUjZfTFQsICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYiwgX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2x0KHZlY3RvciBib29sIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHV3X3AoX19DUjZfTFQsICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2x0KHZlY3RvciBib29sIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHV3X3AoX19DUjZfTFQsIF9fYiwgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2x0KHZlY3RvciBib29sIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dXdfcChfX0NSNl9MVCwgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGludClfX2EpOworfQorCisjaWZkZWYgX19QT1dFUjhfVkVDVE9SX18KK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9sdCh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3RzZF9wKF9fQ1I2X0xULCBfX2IsIF9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9sdCh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWRfcChfX0NSNl9MVCwgX19iLCBfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfbHQodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHNkX3AoX19DUjZfTFQsICh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZylfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9sdCh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1ZF9wKF9fQ1I2X0xULCAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9sdCh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWRfcChfX0NSNl9MVCwgKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfbHQodmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWRfcChfX0NSNl9MVCwgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfbHQodmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1ZF9wKF9fQ1I2X0xULCAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYSk7Cit9CisjZW5kaWYKKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX2x0KHZlY3RvciBmbG9hdCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGZsb2F0IF9fYikgeworI2lmZGVmIF9fVlNYX18KKyAgcmV0dXJuIF9fYnVpbHRpbl92c3hfeHZjbXBndHNwX3AoX19DUjZfTFQsIF9fYiwgX19hKTsKKyNlbHNlCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3RmcF9wKF9fQ1I2X0xULCBfX2IsIF9fYSk7CisjZW5kaWYKK30KKworI2lmZGVmIF9fVlNYX18KK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9sdCh2ZWN0b3IgZG91YmxlIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgZG91YmxlIF9fYikgeworICByZXR1cm4gX19idWlsdGluX3ZzeF94dmNtcGd0ZHBfcChfX0NSNl9MVCwgX19iLCBfX2EpOworfQorI2VuZGlmCisKKy8qIHZlY19hbGxfbmFuICovCisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9uYW4odmVjdG9yIGZsb2F0IF9fYSkgeworI2lmZGVmIF9fVlNYX18KKyAgcmV0dXJuIF9fYnVpbHRpbl92c3hfeHZjbXBlcXNwX3AoX19DUjZfRVEsIF9fYSwgX19hKTsKKyNlbHNlCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXFmcF9wKF9fQ1I2X0VRLCBfX2EsIF9fYSk7CisjZW5kaWYKK30KKworI2lmZGVmIF9fVlNYX18KK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9uYW4odmVjdG9yIGRvdWJsZSBfX2EpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl92c3hfeHZjbXBlcWRwX3AoX19DUjZfRVEsIF9fYSwgX19hKTsKK30KKyNlbmRpZgorCisvKiB2ZWNfYWxsX25lICovCisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9uZSh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcXViX3AoX19DUjZfRVEsICh2ZWN0b3IgY2hhcilfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgY2hhcilfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfbmUodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWJfcChfX0NSNl9FUSwgKHZlY3RvciBjaGFyKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9uZSh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1Yl9wKF9fQ1I2X0VRLCAodmVjdG9yIGNoYXIpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGNoYXIpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX25lKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWJfcChfX0NSNl9FUSwgKHZlY3RvciBjaGFyKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9uZSh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1Yl9wKF9fQ1I2X0VRLCAodmVjdG9yIGNoYXIpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGNoYXIpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX25lKHZlY3RvciBib29sIGNoYXIgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWJfcChfX0NSNl9FUSwgKHZlY3RvciBjaGFyKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9uZSh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWJfcChfX0NSNl9FUSwgKHZlY3RvciBjaGFyKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9uZSh2ZWN0b3Igc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcXVoX3AoX19DUjZfRVEsIF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX25lKHZlY3RvciBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1aF9wKF9fQ1I2X0VRLCBfX2EsICh2ZWN0b3Igc2hvcnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX25lKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWhfcChfX0NSNl9FUSwgKHZlY3RvciBzaG9ydClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Igc2hvcnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX25lKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1aF9wKF9fQ1I2X0VRLCAodmVjdG9yIHNob3J0KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBzaG9ydClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfbmUodmVjdG9yIGJvb2wgc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcXVoX3AoX19DUjZfRVEsICh2ZWN0b3Igc2hvcnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHNob3J0KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9uZSh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWhfcChfX0NSNl9FUSwgKHZlY3RvciBzaG9ydClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Igc2hvcnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX25lKHZlY3RvciBib29sIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcXVoX3AoX19DUjZfRVEsICh2ZWN0b3Igc2hvcnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHNob3J0KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9uZSh2ZWN0b3IgcGl4ZWwgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBwaXhlbCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcXVoX3AoX19DUjZfRVEsICh2ZWN0b3Igc2hvcnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHNob3J0KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9uZSh2ZWN0b3IgaW50IF9fYSwgdmVjdG9yIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcXV3X3AoX19DUjZfRVEsIF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX25lKHZlY3RvciBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcXV3X3AoX19DUjZfRVEsIF9fYSwgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX25lKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1d19wKF9fQ1I2X0VRLCAodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9uZSh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1d19wKF9fQ1I2X0VRLCAodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9uZSh2ZWN0b3IgYm9vbCBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1d19wKF9fQ1I2X0VRLCAodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9uZSh2ZWN0b3IgYm9vbCBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1d19wKF9fQ1I2X0VRLCAodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9uZSh2ZWN0b3IgYm9vbCBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcXV3X3AoX19DUjZfRVEsICh2ZWN0b3IgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworI2lmZGVmIF9fUE9XRVI4X1ZFQ1RPUl9fCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfbmUodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWRfcChfX0NSNl9FUSwgX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfbmUodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcXVkX3AoX19DUjZfRVEsICh2ZWN0b3IgbG9uZyBsb25nKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBsb25nIGxvbmcpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX25lKHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1ZF9wKF9fQ1I2X0VRLCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZylfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbGxfbmUodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWRfcChfX0NSNl9FUSwgKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9uZSh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWRfcChfX0NSNl9FUSwgKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9uZSh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1ZF9wKF9fQ1I2X0VRLCAodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX25lKHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWRfcChfX0NSNl9FUSwgKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYik7Cit9CisjZW5kaWYKKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX25lKHZlY3RvciBmbG9hdCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGZsb2F0IF9fYikgeworI2lmZGVmIF9fVlNYX18KKyAgcmV0dXJuIF9fYnVpbHRpbl92c3hfeHZjbXBlcWRwX3AoX19DUjZfRVEsIF9fYSwgX19iKTsKKyNlbHNlCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXFmcF9wKF9fQ1I2X0VRLCBfX2EsIF9fYik7CisjZW5kaWYKK30KKworI2lmZGVmIF9fVlNYX18KK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9uZSh2ZWN0b3IgZG91YmxlIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgZG91YmxlIF9fYikgeworICByZXR1cm4gX19idWlsdGluX3ZzeF94dmNtcGVxZHBfcChfX0NSNl9FUSwgX19hLCBfX2IpOworfQorI2VuZGlmCisKKy8qIHZlY19hbGxfbmdlICovCisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9uZ2UodmVjdG9yIGZsb2F0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGZsb2F0IF9fYikgeworI2lmZGVmIF9fVlNYX18KKyAgcmV0dXJuIF9fYnVpbHRpbl92c3hfeHZjbXBnZXNwX3AoX19DUjZfRVEsIF9fYSwgX19iKTsKKyNlbHNlCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ2VmcF9wKF9fQ1I2X0VRLCBfX2EsIF9fYik7CisjZW5kaWYKK30KKworI2lmZGVmIF9fVlNYX18KK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FsbF9uZ2UodmVjdG9yIGRvdWJsZSBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBkb3VibGUgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fdnN4X3h2Y21wZ2VkcF9wKF9fQ1I2X0VRLCBfX2EsIF9fYik7Cit9CisjZW5kaWYKKworLyogdmVjX2FsbF9uZ3QgKi8KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX25ndCh2ZWN0b3IgZmxvYXQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgZmxvYXQgX19iKSB7CisjaWZkZWYgX19WU1hfXworICByZXR1cm4gX19idWlsdGluX3ZzeF94dmNtcGd0c3BfcChfX0NSNl9FUSwgX19hLCBfX2IpOworI2Vsc2UKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndGZwX3AoX19DUjZfRVEsIF9fYSwgX19iKTsKKyNlbmRpZgorfQorCisjaWZkZWYgX19WU1hfXworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYWxsX25ndCh2ZWN0b3IgZG91YmxlIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGRvdWJsZSBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl92c3hfeHZjbXBndGRwX3AoX19DUjZfRVEsIF9fYSwgX19iKTsKK30KKyNlbmRpZgorCisvKiB2ZWNfYWxsX25sZSAqLworCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKQordmVjX2FsbF9ubGUodmVjdG9yIGZsb2F0IF9fYSwgdmVjdG9yIGZsb2F0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGdlZnBfcChfX0NSNl9FUSwgX19iLCBfX2EpOworfQorCisvKiB2ZWNfYWxsX25sdCAqLworCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKQordmVjX2FsbF9ubHQodmVjdG9yIGZsb2F0IF9fYSwgdmVjdG9yIGZsb2F0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0ZnBfcChfX0NSNl9FUSwgX19iLCBfX2EpOworfQorCisvKiB2ZWNfYWxsX251bWVyaWMgKi8KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKK3ZlY19hbGxfbnVtZXJpYyh2ZWN0b3IgZmxvYXQgX19hKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXFmcF9wKF9fQ1I2X0xULCBfX2EsIF9fYSk7Cit9CisKKy8qIHZlY19hbnlfZXEgKi8KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2VxKHZlY3RvciBzaWduZWQgY2hhciBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWJfcChfX0NSNl9FUV9SRVYsICh2ZWN0b3IgY2hhcilfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgY2hhcilfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfZXEodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWJfcChfX0NSNl9FUV9SRVYsICh2ZWN0b3IgY2hhcilfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgY2hhcilfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfZXEodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWJfcChfX0NSNl9FUV9SRVYsICh2ZWN0b3IgY2hhcilfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgY2hhcilfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfZXEodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1Yl9wKF9fQ1I2X0VRX1JFViwgKHZlY3RvciBjaGFyKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9lcSh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1Yl9wKF9fQ1I2X0VRX1JFViwgKHZlY3RvciBjaGFyKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9lcSh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcXViX3AoX19DUjZfRVFfUkVWLCAodmVjdG9yIGNoYXIpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGNoYXIpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2VxKHZlY3RvciBib29sIGNoYXIgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1Yl9wKF9fQ1I2X0VRX1JFViwgKHZlY3RvciBjaGFyKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9lcSh2ZWN0b3Igc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcXVoX3AoX19DUjZfRVFfUkVWLCBfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9lcSh2ZWN0b3Igc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWhfcChfX0NSNl9FUV9SRVYsIF9fYSwgKHZlY3RvciBzaG9ydClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfZXEodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1aF9wKF9fQ1I2X0VRX1JFViwgKHZlY3RvciBzaG9ydClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Igc2hvcnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2VxKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1aF9wKF9fQ1I2X0VRX1JFViwgKHZlY3RvciBzaG9ydClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Igc2hvcnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2VxKHZlY3RvciBib29sIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1aF9wKF9fQ1I2X0VRX1JFViwgKHZlY3RvciBzaG9ydClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Igc2hvcnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2VxKHZlY3RvciBib29sIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1aF9wKF9fQ1I2X0VRX1JFViwgKHZlY3RvciBzaG9ydClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Igc2hvcnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2VxKHZlY3RvciBib29sIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcXVoX3AoX19DUjZfRVFfUkVWLCAodmVjdG9yIHNob3J0KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBzaG9ydClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfZXEodmVjdG9yIHBpeGVsIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgcGl4ZWwgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1aF9wKF9fQ1I2X0VRX1JFViwgKHZlY3RvciBzaG9ydClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Igc2hvcnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2VxKHZlY3RvciBpbnQgX19hLCB2ZWN0b3IgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdXdfcChfX0NSNl9FUV9SRVYsIF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2VxKHZlY3RvciBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcXV3X3AoX19DUjZfRVFfUkVWLCBfX2EsICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9lcSh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdXdfcChfX0NSNl9FUV9SRVYsICh2ZWN0b3IgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2VxKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcXV3X3AoX19DUjZfRVFfUkVWLCAodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9lcSh2ZWN0b3IgYm9vbCBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1d19wKF9fQ1I2X0VRX1JFViwgKHZlY3RvciBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfZXEodmVjdG9yIGJvb2wgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdXdfcChfX0NSNl9FUV9SRVYsICh2ZWN0b3IgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2VxKHZlY3RvciBib29sIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdXdfcChfX0NSNl9FUV9SRVYsICh2ZWN0b3IgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworI2lmZGVmIF9fUE9XRVI4X1ZFQ1RPUl9fCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfZXEodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWRfcChfX0NSNl9FUV9SRVYsIF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2VxKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1ZF9wKF9fQ1I2X0VRX1JFViwgKHZlY3RvciBsb25nIGxvbmcpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGxvbmcgbG9uZylfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfZXEodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcXVkX3AoX19DUjZfRVFfUkVWLCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZylfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfZXEodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWRfcCgKKyAgICAgIF9fQ1I2X0VRX1JFViwgKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYSwgKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9lcSh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWRfcCgKKyAgICAgIF9fQ1I2X0VRX1JFViwgKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYSwgKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9lcSh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1ZF9wKAorICAgICAgX19DUjZfRVFfUkVWLCAodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpX19hLCAodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2VxKHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWRfcCgKKyAgICAgIF9fQ1I2X0VRX1JFViwgKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYSwgKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYik7Cit9CisjZW5kaWYKKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2VxKHZlY3RvciBmbG9hdCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGZsb2F0IF9fYikgeworI2lmZGVmIF9fVlNYX18KKyAgcmV0dXJuIF9fYnVpbHRpbl92c3hfeHZjbXBlcXNwX3AoX19DUjZfRVFfUkVWLCBfX2EsIF9fYik7CisjZWxzZQorICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxZnBfcChfX0NSNl9FUV9SRVYsIF9fYSwgX19iKTsKKyNlbmRpZgorfQorCisjaWZkZWYgX19WU1hfXworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2VxKHZlY3RvciBkb3VibGUgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBkb3VibGUgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fdnN4X3h2Y21wZXFkcF9wKF9fQ1I2X0VRX1JFViwgX19hLCBfX2IpOworfQorI2VuZGlmCisKKy8qIHZlY19hbnlfZ2UgKi8KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2dlKHZlY3RvciBzaWduZWQgY2hhciBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0c2JfcChfX0NSNl9MVF9SRVYsIF9fYiwgX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2dlKHZlY3RvciBzaWduZWQgY2hhciBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHNiX3AoX19DUjZfTFRfUkVWLCAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2dlKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHViX3AoX19DUjZfTFRfUkVWLCBfX2IsIF9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9nZSh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHViX3AoX19DUjZfTFRfUkVWLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfZ2UodmVjdG9yIGJvb2wgY2hhciBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWJfcChfX0NSNl9MVF9SRVYsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfZ2UodmVjdG9yIGJvb2wgY2hhciBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1Yl9wKF9fQ1I2X0xUX1JFViwgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2dlKHZlY3RvciBib29sIGNoYXIgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1Yl9wKF9fQ1I2X0xUX1JFViwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9nZSh2ZWN0b3Igc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHNoX3AoX19DUjZfTFRfUkVWLCBfX2IsIF9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9nZSh2ZWN0b3Igc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0c2hfcChfX0NSNl9MVF9SRVYsICh2ZWN0b3Igc2hvcnQpX19iLCBfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfZ2UodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1aF9wKF9fQ1I2X0xUX1JFViwgX19iLCBfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfZ2UodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHVoX3AoX19DUjZfTFRfUkVWLCAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2dlKHZlY3RvciBib29sIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1aF9wKF9fQ1I2X0xUX1JFViwgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2dlKHZlY3RvciBib29sIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1aF9wKF9fQ1I2X0xUX1JFViwgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9nZSh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1aF9wKF9fQ1I2X0xUX1JFViwgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2dlKHZlY3RvciBpbnQgX19hLCB2ZWN0b3IgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0c3dfcChfX0NSNl9MVF9SRVYsIF9fYiwgX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2dlKHZlY3RvciBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHN3X3AoX19DUjZfTFRfUkVWLCAodmVjdG9yIGludClfX2IsIF9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9nZSh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dXdfcChfX0NSNl9MVF9SRVYsIF9fYiwgX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2dlKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHV3X3AoX19DUjZfTFRfUkVWLCAodmVjdG9yIHVuc2lnbmVkIGludClfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9nZSh2ZWN0b3IgYm9vbCBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1d19wKF9fQ1I2X0xUX1JFViwgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGludClfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfZ2UodmVjdG9yIGJvb2wgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dXdfcChfX0NSNl9MVF9SRVYsIF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2dlKHZlY3RvciBib29sIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dXdfcChfX0NSNl9MVF9SRVYsICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hKTsKK30KKworI2lmZGVmIF9fUE9XRVI4X1ZFQ1RPUl9fCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfZ2UodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0c2RfcChfX0NSNl9MVF9SRVYsIF9fYiwgX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2dlKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1ZF9wKF9fQ1I2X0xUX1JFViwgX19iLCBfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfZ2UodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHNkX3AoX19DUjZfTFRfUkVWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpX19iLCBfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfZ2UodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWRfcChfX0NSNl9MVF9SRVYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYiwgX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2dlKHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1ZF9wKF9fQ1I2X0xUX1JFViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfZ2UodmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWRfcChfX0NSNl9MVF9SRVYsIF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2dlKHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWRfcChfX0NSNl9MVF9SRVYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19hKTsKK30KKyNlbmRpZgorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfZ2UodmVjdG9yIGZsb2F0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgZmxvYXQgX19iKSB7CisjaWZkZWYgX19WU1hfXworICByZXR1cm4gX19idWlsdGluX3ZzeF94dmNtcGdlc3BfcChfX0NSNl9FUV9SRVYsIF9fYSwgX19iKTsKKyNlbHNlCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ2VmcF9wKF9fQ1I2X0VRX1JFViwgX19hLCBfX2IpOworI2VuZGlmCit9CisKKyNpZmRlZiBfX1ZTWF9fCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfZ2UodmVjdG9yIGRvdWJsZSBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGRvdWJsZSBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl92c3hfeHZjbXBnZWRwX3AoX19DUjZfRVFfUkVWLCBfX2EsIF9fYik7Cit9CisjZW5kaWYKKworLyogdmVjX2FueV9ndCAqLworCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfZ3QodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3RzYl9wKF9fQ1I2X0VRX1JFViwgX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfZ3QodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0c2JfcChfX0NSNl9FUV9SRVYsIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBzaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfZ3QodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWJfcChfX0NSNl9FUV9SRVYsIF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2d0KHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWJfcChfX0NSNl9FUV9SRVYsIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9ndCh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1Yl9wKF9fQ1I2X0VRX1JFViwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9ndCh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHViX3AoX19DUjZfRVFfUkVWLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfZ3QodmVjdG9yIGJvb2wgY2hhciBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHViX3AoX19DUjZfRVFfUkVWLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2d0KHZlY3RvciBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0c2hfcChfX0NSNl9FUV9SRVYsIF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2d0KHZlY3RvciBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3RzaF9wKF9fQ1I2X0VRX1JFViwgX19hLCAodmVjdG9yIHNob3J0KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9ndCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHVoX3AoX19DUjZfRVFfUkVWLCBfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9ndCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWhfcChfX0NSNl9FUV9SRVYsIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfZ3QodmVjdG9yIGJvb2wgc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHVoX3AoX19DUjZfRVFfUkVWLCAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfZ3QodmVjdG9yIGJvb2wgc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHVoX3AoX19DUjZfRVFfUkVWLCAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2d0KHZlY3RvciBib29sIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHVoX3AoX19DUjZfRVFfUkVWLCAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfZ3QodmVjdG9yIGludCBfX2EsIHZlY3RvciBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3Rzd19wKF9fQ1I2X0VRX1JFViwgX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfZ3QodmVjdG9yIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0c3dfcChfX0NSNl9FUV9SRVYsIF9fYSwgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2d0KHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1d19wKF9fQ1I2X0VRX1JFViwgX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfZ3QodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dXdfcChfX0NSNl9FUV9SRVYsIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2d0KHZlY3RvciBib29sIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHV3X3AoX19DUjZfRVFfUkVWLCAodmVjdG9yIHVuc2lnbmVkIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9ndCh2ZWN0b3IgYm9vbCBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1d19wKF9fQ1I2X0VRX1JFViwgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfZ3QodmVjdG9yIGJvb2wgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1d19wKF9fQ1I2X0VRX1JFViwgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGludClfX2IpOworfQorCisjaWZkZWYgX19QT1dFUjhfVkVDVE9SX18KK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9ndCh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3RzZF9wKF9fQ1I2X0VRX1JFViwgX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfZ3QodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHVkX3AoX19DUjZfRVFfUkVWLCBfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9ndCh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0c2RfcChfX0NSNl9FUV9SRVYsIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9ndCh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1ZF9wKF9fQ1I2X0VRX1JFViwgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfZ3QodmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHVkX3AoX19DUjZfRVFfUkVWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9ndCh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1ZF9wKF9fQ1I2X0VRX1JFViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfZ3QodmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1ZF9wKF9fQ1I2X0VRX1JFViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2IpOworfQorI2VuZGlmCisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9ndCh2ZWN0b3IgZmxvYXQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBmbG9hdCBfX2IpIHsKKyNpZmRlZiBfX1ZTWF9fCisgIHJldHVybiBfX2J1aWx0aW5fdnN4X3h2Y21wZ3RzcF9wKF9fQ1I2X0VRX1JFViwgX19hLCBfX2IpOworI2Vsc2UKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndGZwX3AoX19DUjZfRVFfUkVWLCBfX2EsIF9fYik7CisjZW5kaWYKK30KKworI2lmZGVmIF9fVlNYX18KK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9ndCh2ZWN0b3IgZG91YmxlIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgZG91YmxlIF9fYikgeworICByZXR1cm4gX19idWlsdGluX3ZzeF94dmNtcGd0ZHBfcChfX0NSNl9FUV9SRVYsIF9fYSwgX19iKTsKK30KKyNlbmRpZgorCisvKiB2ZWNfYW55X2xlICovCisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9sZSh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHNiX3AoX19DUjZfTFRfUkVWLCBfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9sZSh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3RzYl9wKF9fQ1I2X0xUX1JFViwgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9sZSh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1Yl9wKF9fQ1I2X0xUX1JFViwgX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfbGUodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1Yl9wKF9fQ1I2X0xUX1JFViwgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2xlKHZlY3RvciBib29sIGNoYXIgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHViX3AoX19DUjZfTFRfUkVWLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2xlKHZlY3RvciBib29sIGNoYXIgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWJfcChfX0NSNl9MVF9SRVYsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9sZSh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWJfcChfX0NSNl9MVF9SRVYsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfbGUodmVjdG9yIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3RzaF9wKF9fQ1I2X0xUX1JFViwgX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfbGUodmVjdG9yIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHNoX3AoX19DUjZfTFRfUkVWLCBfX2EsICh2ZWN0b3Igc2hvcnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2xlKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWhfcChfX0NSNl9MVF9SRVYsIF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2xlKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1aF9wKF9fQ1I2X0xUX1JFViwgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9sZSh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWhfcChfX0NSNl9MVF9SRVYsICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9sZSh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWhfcChfX0NSNl9MVF9SRVYsICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfbGUodmVjdG9yIGJvb2wgc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWhfcChfX0NSNl9MVF9SRVYsICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9sZSh2ZWN0b3IgaW50IF9fYSwgdmVjdG9yIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHN3X3AoX19DUjZfTFRfUkVWLCBfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9sZSh2ZWN0b3IgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3Rzd19wKF9fQ1I2X0xUX1JFViwgX19hLCAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfbGUodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHV3X3AoX19DUjZfTFRfUkVWLCBfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9sZSh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1d19wKF9fQ1I2X0xUX1JFViwgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfbGUodmVjdG9yIGJvb2wgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dXdfcChfX0NSNl9MVF9SRVYsICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2xlKHZlY3RvciBib29sIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHV3X3AoX19DUjZfTFRfUkVWLCAodmVjdG9yIHVuc2lnbmVkIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9sZSh2ZWN0b3IgYm9vbCBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHV3X3AoX19DUjZfTFRfUkVWLCAodmVjdG9yIHVuc2lnbmVkIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYik7Cit9CisKKyNpZmRlZiBfX1BPV0VSOF9WRUNUT1JfXworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2xlKHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHNkX3AoX19DUjZfTFRfUkVWLCBfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9sZSh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWRfcChfX0NSNl9MVF9SRVYsIF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2xlKHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3RzZF9wKF9fQ1I2X0xUX1JFViwgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2xlKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHVkX3AoX19DUjZfTFRfUkVWLCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9sZSh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWRfcChfX0NSNl9MVF9SRVYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2xlKHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHVkX3AoX19DUjZfTFRfUkVWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9sZSh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHVkX3AoX19DUjZfTFRfUkVWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYik7Cit9CisjZW5kaWYKKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2xlKHZlY3RvciBmbG9hdCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGZsb2F0IF9fYikgeworI2lmZGVmIF9fVlNYX18KKyAgcmV0dXJuIF9fYnVpbHRpbl92c3hfeHZjbXBnZXNwX3AoX19DUjZfRVFfUkVWLCBfX2IsIF9fYSk7CisjZWxzZQorICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGdlZnBfcChfX0NSNl9FUV9SRVYsIF9fYiwgX19hKTsKKyNlbmRpZgorfQorCisjaWZkZWYgX19WU1hfXworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2xlKHZlY3RvciBkb3VibGUgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBkb3VibGUgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fdnN4X3h2Y21wZ2VkcF9wKF9fQ1I2X0VRX1JFViwgX19iLCBfX2EpOworfQorI2VuZGlmCisKKy8qIHZlY19hbnlfbHQgKi8KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2x0KHZlY3RvciBzaWduZWQgY2hhciBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0c2JfcChfX0NSNl9FUV9SRVYsIF9fYiwgX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2x0KHZlY3RvciBzaWduZWQgY2hhciBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHNiX3AoX19DUjZfRVFfUkVWLCAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2x0KHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHViX3AoX19DUjZfRVFfUkVWLCBfX2IsIF9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9sdCh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHViX3AoX19DUjZfRVFfUkVWLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfbHQodmVjdG9yIGJvb2wgY2hhciBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWJfcChfX0NSNl9FUV9SRVYsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfbHQodmVjdG9yIGJvb2wgY2hhciBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1Yl9wKF9fQ1I2X0VRX1JFViwgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2x0KHZlY3RvciBib29sIGNoYXIgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1Yl9wKF9fQ1I2X0VRX1JFViwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9sdCh2ZWN0b3Igc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHNoX3AoX19DUjZfRVFfUkVWLCBfX2IsIF9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9sdCh2ZWN0b3Igc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0c2hfcChfX0NSNl9FUV9SRVYsICh2ZWN0b3Igc2hvcnQpX19iLCBfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfbHQodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1aF9wKF9fQ1I2X0VRX1JFViwgX19iLCBfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfbHQodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHVoX3AoX19DUjZfRVFfUkVWLCAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2x0KHZlY3RvciBib29sIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1aF9wKF9fQ1I2X0VRX1JFViwgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2x0KHZlY3RvciBib29sIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1aF9wKF9fQ1I2X0VRX1JFViwgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9sdCh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1aF9wKF9fQ1I2X0VRX1JFViwgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2x0KHZlY3RvciBpbnQgX19hLCB2ZWN0b3IgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0c3dfcChfX0NSNl9FUV9SRVYsIF9fYiwgX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2x0KHZlY3RvciBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHN3X3AoX19DUjZfRVFfUkVWLCAodmVjdG9yIGludClfX2IsIF9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9sdCh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dXdfcChfX0NSNl9FUV9SRVYsIF9fYiwgX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2x0KHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHV3X3AoX19DUjZfRVFfUkVWLCAodmVjdG9yIHVuc2lnbmVkIGludClfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9sdCh2ZWN0b3IgYm9vbCBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1d19wKF9fQ1I2X0VRX1JFViwgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGludClfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfbHQodmVjdG9yIGJvb2wgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dXdfcChfX0NSNl9FUV9SRVYsIF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2x0KHZlY3RvciBib29sIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dXdfcChfX0NSNl9FUV9SRVYsICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hKTsKK30KKworI2lmZGVmIF9fUE9XRVI4X1ZFQ1RPUl9fCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfbHQodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0c2RfcChfX0NSNl9FUV9SRVYsIF9fYiwgX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2x0KHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1ZF9wKF9fQ1I2X0VRX1JFViwgX19iLCBfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfbHQodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHNkX3AoX19DUjZfRVFfUkVWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpX19iLCBfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfbHQodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWRfcChfX0NSNl9FUV9SRVYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYiwgX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2x0KHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1ZF9wKF9fQ1I2X0VRX1JFViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfbHQodmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWRfcChfX0NSNl9FUV9SRVYsIF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X2x0KHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWRfcChfX0NSNl9FUV9SRVYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19hKTsKK30KKyNlbmRpZgorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfbHQodmVjdG9yIGZsb2F0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgZmxvYXQgX19iKSB7CisjaWZkZWYgX19WU1hfXworICByZXR1cm4gX19idWlsdGluX3ZzeF94dmNtcGd0c3BfcChfX0NSNl9FUV9SRVYsIF9fYiwgX19hKTsKKyNlbHNlCisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3RmcF9wKF9fQ1I2X0VRX1JFViwgX19iLCBfX2EpOworI2VuZGlmCit9CisKKyNpZmRlZiBfX1ZTWF9fCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfbHQodmVjdG9yIGRvdWJsZSBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGRvdWJsZSBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl92c3hfeHZjbXBndGRwX3AoX19DUjZfRVFfUkVWLCBfX2IsIF9fYSk7Cit9CisjZW5kaWYKKworLyogdmVjX2FueV9uYW4gKi8KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKK3ZlY19hbnlfbmFuKHZlY3RvciBmbG9hdCBfX2EpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcWZwX3AoX19DUjZfTFRfUkVWLCBfX2EsIF9fYSk7Cit9CisKKy8qIHZlY19hbnlfbmUgKi8KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X25lKHZlY3RvciBzaWduZWQgY2hhciBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWJfcChfX0NSNl9MVF9SRVYsICh2ZWN0b3IgY2hhcilfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgY2hhcilfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfbmUodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWJfcChfX0NSNl9MVF9SRVYsICh2ZWN0b3IgY2hhcilfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgY2hhcilfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfbmUodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWJfcChfX0NSNl9MVF9SRVYsICh2ZWN0b3IgY2hhcilfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgY2hhcilfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfbmUodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1Yl9wKF9fQ1I2X0xUX1JFViwgKHZlY3RvciBjaGFyKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9uZSh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1Yl9wKF9fQ1I2X0xUX1JFViwgKHZlY3RvciBjaGFyKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9uZSh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcXViX3AoX19DUjZfTFRfUkVWLCAodmVjdG9yIGNoYXIpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGNoYXIpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X25lKHZlY3RvciBib29sIGNoYXIgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1Yl9wKF9fQ1I2X0xUX1JFViwgKHZlY3RvciBjaGFyKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9uZSh2ZWN0b3Igc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcXVoX3AoX19DUjZfTFRfUkVWLCBfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9uZSh2ZWN0b3Igc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWhfcChfX0NSNl9MVF9SRVYsIF9fYSwgKHZlY3RvciBzaG9ydClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfbmUodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1aF9wKF9fQ1I2X0xUX1JFViwgKHZlY3RvciBzaG9ydClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Igc2hvcnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X25lKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1aF9wKF9fQ1I2X0xUX1JFViwgKHZlY3RvciBzaG9ydClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Igc2hvcnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X25lKHZlY3RvciBib29sIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1aF9wKF9fQ1I2X0xUX1JFViwgKHZlY3RvciBzaG9ydClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Igc2hvcnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X25lKHZlY3RvciBib29sIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1aF9wKF9fQ1I2X0xUX1JFViwgKHZlY3RvciBzaG9ydClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Igc2hvcnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X25lKHZlY3RvciBib29sIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcXVoX3AoX19DUjZfTFRfUkVWLCAodmVjdG9yIHNob3J0KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBzaG9ydClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfbmUodmVjdG9yIHBpeGVsIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgcGl4ZWwgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1aF9wKF9fQ1I2X0xUX1JFViwgKHZlY3RvciBzaG9ydClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Igc2hvcnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X25lKHZlY3RvciBpbnQgX19hLCB2ZWN0b3IgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdXdfcChfX0NSNl9MVF9SRVYsIF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X25lKHZlY3RvciBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcXV3X3AoX19DUjZfTFRfUkVWLCBfX2EsICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9uZSh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdXdfcChfX0NSNl9MVF9SRVYsICh2ZWN0b3IgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X25lKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcXV3X3AoX19DUjZfTFRfUkVWLCAodmVjdG9yIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgaW50KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9uZSh2ZWN0b3IgYm9vbCBpbnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1d19wKF9fQ1I2X0xUX1JFViwgKHZlY3RvciBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGludClfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfbmUodmVjdG9yIGJvb2wgaW50IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdXdfcChfX0NSNl9MVF9SRVYsICh2ZWN0b3IgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X25lKHZlY3RvciBib29sIGludCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdXdfcChfX0NSNl9MVF9SRVYsICh2ZWN0b3IgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBpbnQpX19iKTsKK30KKworI2lmZGVmIF9fUE9XRVI4X1ZFQ1RPUl9fCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfbmUodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWRfcChfX0NSNl9MVF9SRVYsIF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X25lKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1ZF9wKF9fQ1I2X0xUX1JFViwgKHZlY3RvciBsb25nIGxvbmcpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIGxvbmcgbG9uZylfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfbmUodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcXVkX3AoX19DUjZfTFRfUkVWLCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZylfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19BVFRSU19vX2FpIHZlY19hbnlfbmUodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWRfcCgKKyAgICAgIF9fQ1I2X0xUX1JFViwgKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYSwgKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9uZSh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWRfcCgKKyAgICAgIF9fQ1I2X0xUX1JFViwgKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYSwgKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0FUVFJTX29fYWkgdmVjX2FueV9uZSh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1ZF9wKAorICAgICAgX19DUjZfTFRfUkVWLCAodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpX19hLCAodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X25lKHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWRfcCgKKyAgICAgIF9fQ1I2X0xUX1JFViwgKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYSwgKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYik7Cit9CisjZW5kaWYKKworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X25lKHZlY3RvciBmbG9hdCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGZsb2F0IF9fYikgeworI2lmZGVmIF9fVlNYX18KKyAgcmV0dXJuIF9fYnVpbHRpbl92c3hfeHZjbXBlcXNwX3AoX19DUjZfTFRfUkVWLCBfX2EsIF9fYik7CisjZWxzZQorICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxZnBfcChfX0NSNl9MVF9SRVYsIF9fYSwgX19iKTsKKyNlbmRpZgorfQorCisjaWZkZWYgX19WU1hfXworc3RhdGljIF9faW5saW5lX18gaW50IF9fQVRUUlNfb19haSB2ZWNfYW55X25lKHZlY3RvciBkb3VibGUgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBkb3VibGUgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fdnN4X3h2Y21wZXFkcF9wKF9fQ1I2X0xUX1JFViwgX19hLCBfX2IpOworfQorI2VuZGlmCisKKy8qIHZlY19hbnlfbmdlICovCisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpCit2ZWNfYW55X25nZSh2ZWN0b3IgZmxvYXQgX19hLCB2ZWN0b3IgZmxvYXQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ2VmcF9wKF9fQ1I2X0xUX1JFViwgX19hLCBfX2IpOworfQorCisvKiB2ZWNfYW55X25ndCAqLworCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKQordmVjX2FueV9uZ3QodmVjdG9yIGZsb2F0IF9fYSwgdmVjdG9yIGZsb2F0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0ZnBfcChfX0NSNl9MVF9SRVYsIF9fYSwgX19iKTsKK30KKworLyogdmVjX2FueV9ubGUgKi8KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKK3ZlY19hbnlfbmxlKHZlY3RvciBmbG9hdCBfX2EsIHZlY3RvciBmbG9hdCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBnZWZwX3AoX19DUjZfTFRfUkVWLCBfX2IsIF9fYSk7Cit9CisKKy8qIHZlY19hbnlfbmx0ICovCisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpCit2ZWNfYW55X25sdCh2ZWN0b3IgZmxvYXQgX19hLCB2ZWN0b3IgZmxvYXQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3RmcF9wKF9fQ1I2X0xUX1JFViwgX19iLCBfX2EpOworfQorCisvKiB2ZWNfYW55X251bWVyaWMgKi8KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKK3ZlY19hbnlfbnVtZXJpYyh2ZWN0b3IgZmxvYXQgX19hKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXFmcF9wKF9fQ1I2X0VRX1JFViwgX19hLCBfX2EpOworfQorCisvKiB2ZWNfYW55X291dCAqLworCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKQordmVjX2FueV9vdXQodmVjdG9yIGZsb2F0IF9fYSwgdmVjdG9yIGZsb2F0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmNtcGJmcF9wKF9fQ1I2X0VRX1JFViwgX19hLCBfX2IpOworfQorCisvKiBQb3dlciA4IENyeXB0byBmdW5jdGlvbnMKK05vdGU6IFdlIGRpdmVyZ2UgZnJvbSB0aGUgY3VycmVudCBHQ0MgaW1wbGVtZW50YXRpb24gd2l0aCByZWdhcmQKK3RvIGNyeXB0b2dyYXBoeSBhbmQgcmVsYXRlZCBmdW5jdGlvbnMgYXMgZm9sbG93czoKKy0gT25seSB0aGUgU0hBIGFuZCBBRVMgaW5zdHJ1Y3Rpb25zIGFuZCBidWlsdGlucyBhcmUgZGlzYWJsZWQgYnkgLW1uby1jcnlwdG8KKy0gVGhlIHJlbWFpbmluZyBvbmVzIGFyZSBvbmx5IGF2YWlsYWJsZSBvbiBQb3dlcjggYW5kIHVwIHNvCisgIHJlcXVpcmUgLW1wb3dlcjgtdmVjdG9yCitUaGUganVzdGlmaWNhdGlvbiBmb3IgdGhpcyBpcyB0aGF0IGV4cG9ydCByZXF1aXJlbWVudHMgcmVxdWlyZSB0aGF0CitDYXRlZ29yeTpWZWN0b3IuQ3J5cHRvIGlzIG9wdGlvbmFsIChpLmUuIGNvbXBsaWFudCBoYXJkd2FyZSBtYXkgbm90IHByb3ZpZGUKK3N1cHBvcnQpLiBBcyBhIHJlc3VsdCwgd2UgbmVlZCB0byBiZSBhYmxlIHRvIHR1cm4gb2ZmIHN1cHBvcnQgZm9yIHRob3NlLgorVGhlIHJlbWFpbmluZyBvbmVzIChjdXJyZW50bHkgY29udHJvbGxlZCBieSAtbWNyeXB0byBmb3IgR0NDKSBzdGlsbAorbmVlZCB0byBiZSBwcm92aWRlZCBvbiBjb21wbGlhbnQgaGFyZHdhcmUgZXZlbiBpZiBWZWN0b3IuQ3J5cHRvIGlzIG5vdAorcHJvdmlkZWQuCisqLworI2lmZGVmIF9fQ1JZUFRPX18KKyNkZWZpbmUgdmVjX3Nib3hfYmUgX19idWlsdGluX2FsdGl2ZWNfY3J5cHRvX3ZzYm94CisjZGVmaW5lIHZlY19jaXBoZXJfYmUgX19idWlsdGluX2FsdGl2ZWNfY3J5cHRvX3ZjaXBoZXIKKyNkZWZpbmUgdmVjX2NpcGhlcmxhc3RfYmUgX19idWlsdGluX2FsdGl2ZWNfY3J5cHRvX3ZjaXBoZXJsYXN0CisjZGVmaW5lIHZlY19uY2lwaGVyX2JlIF9fYnVpbHRpbl9hbHRpdmVjX2NyeXB0b192bmNpcGhlcgorI2RlZmluZSB2ZWNfbmNpcGhlcmxhc3RfYmUgX19idWlsdGluX2FsdGl2ZWNfY3J5cHRvX3ZuY2lwaGVybGFzdAorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKK19fYnVpbHRpbl9jcnlwdG9fdnNib3godmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX2NyeXB0b192c2JveChfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKK19fYnVpbHRpbl9jcnlwdG9fdmNpcGhlcih2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfY3J5cHRvX3ZjaXBoZXIoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKK19fYnVpbHRpbl9jcnlwdG9fdmNpcGhlcmxhc3QodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY19jcnlwdG9fdmNpcGhlcmxhc3QoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKK19fYnVpbHRpbl9jcnlwdG9fdm5jaXBoZXIodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY19jcnlwdG9fdm5jaXBoZXIoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKK19fYnVpbHRpbl9jcnlwdG9fdm5jaXBoZXJsYXN0KHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX2NyeXB0b192bmNpcGhlcmxhc3QoX19hLCBfX2IpOworfQorCisjZGVmaW5lIF9fYnVpbHRpbl9jcnlwdG9fdnNoYXNpZ21hZCBfX2J1aWx0aW5fYWx0aXZlY19jcnlwdG9fdnNoYXNpZ21hZAorI2RlZmluZSBfX2J1aWx0aW5fY3J5cHRvX3ZzaGFzaWdtYXcgX19idWlsdGluX2FsdGl2ZWNfY3J5cHRvX3ZzaGFzaWdtYXcKKworI2RlZmluZSB2ZWNfc2hhc2lnbWFfYmUoWCwgWSwgWikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX0dlbmVyaWMoKFgpLCB2ZWN0b3IgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIDogX19idWlsdGluX2NyeXB0b192c2hhc2lnbWF3LCB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nICAgICAgICAgICAgXAorICAgICAgICAgICA6IF9fYnVpbHRpbl9jcnlwdG9fdnNoYXNpZ21hZCkoKFgpLCAoWSksIChaKSkKKyNlbmRpZgorCisjaWZkZWYgX19QT1dFUjhfVkVDVE9SX18KK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQorX19idWlsdGluX2NyeXB0b192cGVybXhvcih2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19jKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY19jcnlwdG9fdnBlcm14b3IoX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK19fYnVpbHRpbl9jcnlwdG9fdnBlcm14b3IodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYykgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2J1aWx0aW5fYWx0aXZlY19jcnlwdG9fdnBlcm14b3IoCisgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iLAorICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpIF9fYnVpbHRpbl9jcnlwdG9fdnBlcm14b3IoCisgICAgdmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYykgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBpbnQpX19idWlsdGluX2FsdGl2ZWNfY3J5cHRvX3ZwZXJteG9yKAorICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYiwKKyAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fQVRUUlNfb19haQorX19idWlsdGluX2NyeXB0b192cGVybXhvcih2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19jKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2J1aWx0aW5fYWx0aXZlY19jcnlwdG9fdnBlcm14b3IoCisgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iLAorICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQorX19idWlsdGluX2NyeXB0b192cG1zdW1iKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY19jcnlwdG9fdnBtc3VtYihfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX0FUVFJTX29fYWkKK19fYnVpbHRpbl9jcnlwdG9fdnBtc3VtYih2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY19jcnlwdG9fdnBtc3VtaChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBpbnQgX19BVFRSU19vX2FpCitfX2J1aWx0aW5fY3J5cHRvX3ZwbXN1bWIodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYWx0aXZlY19jcnlwdG9fdnBtc3VtdyhfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19BVFRSU19vX2FpCitfX2J1aWx0aW5fY3J5cHRvX3ZwbXN1bWIodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX2NyeXB0b192cG1zdW1kKF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIHNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3ZnYmJkKHZlY3RvciBzaWduZWQgY2hhciBfX2EpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZnYmJkKCh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EpOworfQorCisjZGVmaW5lIHZlY19wbXN1bV9iZSBfX2J1aWx0aW5fY3J5cHRvX3ZwbXN1bWIKKyNkZWZpbmUgdmVjX2diIF9fYnVpbHRpbl9hbHRpdmVjX3ZnYmJkCisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fQVRUUlNfb19haQordmVjX3ZnYmJkKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSkgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmdiYmQoX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVjdG9yIGxvbmcgbG9uZyBfX0FUVFJTX29fYWkKK3ZlY192YnBlcm1xKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZicGVybXEoKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlY3RvciBsb25nIGxvbmcgX19BVFRSU19vX2FpCit2ZWNfdmJwZXJtcSh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FsdGl2ZWNfdmJwZXJtcShfX2EsIF9fYik7Cit9CisKKyNpZmRlZiBfX3Bvd2VycGM2NF9fCitzdGF0aWMgX19pbmxpbmVfXyB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKK3ZlY19icGVybSh2ZWN0b3IgdW5zaWduZWQgX19pbnQxMjggX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hbHRpdmVjX3ZicGVybXEoKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisjZW5kaWYKKyNlbmRpZgorCisjdW5kZWYgX19BVFRSU19vX2FpCisKKyNlbmRpZiAvKiBfX0FMVElWRUNfSCAqLwpkaWZmIC0tZ2l0IGEvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvYW1taW50cmluLmggYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9hbW1pbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTg1YmI0Ci0tLSAvZGV2L251bGwKKysrIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvYW1taW50cmluLmgKQEAgLTAsMCArMSwxOTQgQEAKKy8qPT09LS0tLSBhbW1pbnRyaW4uaCAtIFNTRTRhIGludHJpbnNpY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKgorICo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICovCisKKyNpZm5kZWYgX19BTU1JTlRSSU5fSAorI2RlZmluZSBfX0FNTUlOVFJJTl9ICisKKyNpbmNsdWRlIDxwbW1pbnRyaW4uaD4KKworLyogRGVmaW5lIHRoZSBkZWZhdWx0IGF0dHJpYnV0ZXMgZm9yIHRoZSBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlLiAqLworI2RlZmluZSBfX0RFRkFVTFRfRk5fQVRUUlMgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fLCBfX3RhcmdldF9fKCJzc2U0YSIpKSkKKworLy8vIFxicmllZiBFeHRyYWN0cyB0aGUgc3BlY2lmaWVkIGJpdHMgZnJvbSB0aGUgbG93ZXIgNjQgYml0cyBvZiB0aGUgMTI4LWJpdAorLy8vICAgIGludGVnZXIgdmVjdG9yIG9wZXJhbmQgYXQgdGhlIGluZGV4IGlkeCBhbmQgb2YgdGhlIGxlbmd0aCBsZW4uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBcY29kZQorLy8vIF9fbTEyOGkgX21tX2V4dHJhY3RpX3NpNjQoX19tMTI4aSB4LCBjb25zdCBpbnQgbGVuLCBjb25zdCBpbnQgaWR4KTsKKy8vLyBcZW5kY29kZQorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIEVYVFJRIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIHgKKy8vLyAgICBUaGUgdmFsdWUgZnJvbSB3aGljaCBiaXRzIGFyZSBleHRyYWN0ZWQuCisvLy8gXHBhcmFtIGxlbgorLy8vICAgIEJpdHMgWzU6MF0gc3BlY2lmeSB0aGUgbGVuZ3RoOyB0aGUgb3RoZXIgYml0cyBhcmUgaWdub3JlZC4gSWYgYml0cyBbNTowXQorLy8vICAgIGFyZSB6ZXJvLCB0aGUgbGVuZ3RoIGlzIGludGVycHJldGVkIGFzIDY0LgorLy8vIFxwYXJhbSBpZHgKKy8vLyAgICBCaXRzIFs1OjBdIHNwZWNpZnkgdGhlIGluZGV4IG9mIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQ7IHRoZSBvdGhlcgorLy8vICAgIGJpdHMgYXJlIGlnbm9yZWQuIElmIHRoZSBzdW0gb2YgdGhlIGluZGV4IGFuZCBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIDY0LAorLy8vICAgIHRoZSByZXN1bHQgaXMgdW5kZWZpbmVkLiBJZiB0aGUgbGVuZ3RoIGFuZCBpbmRleCBhcmUgYm90aCB6ZXJvLCBiaXRzCisvLy8gICAgWzYzOjBdIG9mIHBhcmFtZXRlciB4IGFyZSBleHRyYWN0ZWQuIElmIHRoZSBsZW5ndGggaXMgemVybyBidXQgdGhlIGluZGV4CisvLy8gICAgaXMgbm9uLXplcm8sIHRoZSByZXN1bHQgaXMgdW5kZWZpbmVkLgorLy8vIFxyZXR1cm5zIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciB3aG9zZSBsb3dlciA2NCBiaXRzIGNvbnRhaW4gdGhlIGJpdHMKKy8vLyAgICBleHRyYWN0ZWQgZnJvbSB0aGUgc291cmNlIG9wZXJhbmQuCisjZGVmaW5lIF9tbV9leHRyYWN0aV9zaTY0KHgsIGxlbiwgaWR4KSBcCisgICgoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9leHRycWkoKF9fdjJkaSkoX19tMTI4aSkoeCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhcikobGVuKSwgKGNoYXIpKGlkeCkpKQorCisvLy8gXGJyaWVmIEV4dHJhY3RzIHRoZSBzcGVjaWZpZWQgYml0cyBmcm9tIHRoZSBsb3dlciA2NCBiaXRzIG9mIHRoZSAxMjgtYml0CisvLy8gICAgaW50ZWdlciB2ZWN0b3Igb3BlcmFuZCBhdCB0aGUgaW5kZXggYW5kIG9mIHRoZSBsZW5ndGggc3BlY2lmaWVkIGJ5IF9feS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBFWFRSUSBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX3gKKy8vLyAgICBUaGUgdmFsdWUgZnJvbSB3aGljaCBiaXRzIGFyZSBleHRyYWN0ZWQuCisvLy8gXHBhcmFtIF9feQorLy8vICAgIFNwZWNpZmllcyB0aGUgaW5kZXggb2YgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCBhdCBbMTM6OF0gYW5kIHRoZQorLy8vICAgIGxlbmd0aCBhdCBbNTowXTsgYWxsIG90aGVyIGJpdHMgYXJlIGlnbm9yZWQuIElmIGJpdHMgWzU6MF0gYXJlIHplcm8sIHRoZQorLy8vICAgIGxlbmd0aCBpcyBpbnRlcnByZXRlZCBhcyA2NC4gSWYgdGhlIHN1bSBvZiB0aGUgaW5kZXggYW5kIGxlbmd0aCBpcworLy8vICAgIGdyZWF0ZXIgdGhhbiA2NCwgdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQuIElmIHRoZSBsZW5ndGggYW5kIGluZGV4IGFyZQorLy8vICAgIGJvdGggemVybywgYml0cyBbNjM6MF0gb2YgcGFyYW1ldGVyIF9feCBhcmUgZXh0cmFjdGVkLiBJZiB0aGUgbGVuZ3RoIGlzCisvLy8gICAgemVybyBidXQgdGhlIGluZGV4IGlzIG5vbi16ZXJvLCB0aGUgcmVzdWx0IGlzIHVuZGVmaW5lZC4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgdmVjdG9yIHdob3NlIGxvd2VyIDY0IGJpdHMgY29udGFpbiB0aGUgYml0cyBleHRyYWN0ZWQKKy8vLyAgICBmcm9tIHRoZSBzb3VyY2Ugb3BlcmFuZC4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fZXh0cmFjdF9zaTY0KF9fbTEyOGkgX194LCBfX20xMjhpIF9feSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX2V4dHJxKChfX3YyZGkpX194LCAoX192MTZxaSlfX3kpOworfQorCisvLy8gXGJyaWVmIEluc2VydHMgYml0cyBvZiBhIHNwZWNpZmllZCBsZW5ndGggZnJvbSB0aGUgc291cmNlIGludGVnZXIgdmVjdG9yIHkKKy8vLyAgICBpbnRvIHRoZSBsb3dlciA2NCBiaXRzIG9mIHRoZSBkZXN0aW5hdGlvbiBpbnRlZ2VyIHZlY3RvciB4IGF0IHRoZSBpbmRleAorLy8vICAgIGlkeCBhbmQgb2YgdGhlIGxlbmd0aCBsZW4uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBcY29kZQorLy8vIF9fbTEyOGkgX21tX2luc2VydGlfc2k2NChfX20xMjhpIHgsIF9fbTEyOGkgeSwgY29uc3QgaW50IGxlbiwKKy8vLyBjb25zdCBpbnQgaWR4KTsKKy8vLyBcZW5kY29kZQorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIElOU0VSVFEgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0geAorLy8vICAgIFRoZSBkZXN0aW5hdGlvbiBvcGVyYW5kIHdoZXJlIGJpdHMgd2lsbCBiZSBpbnNlcnRlZC4gVGhlIGluc2VydGVkIGJpdHMKKy8vLyAgICBhcmUgZGVmaW5lZCBieSB0aGUgbGVuZ3RoIGxlbiBhbmQgYnkgdGhlIGluZGV4IGlkeCBzcGVjaWZ5aW5nIHRoZSBsZWFzdAorLy8vICAgIHNpZ25pZmljYW50IGJpdC4KKy8vLyBccGFyYW0geQorLy8vICAgIFRoZSBzb3VyY2Ugb3BlcmFuZCBjb250YWluaW5nIHRoZSBiaXRzIHRvIGJlIGV4dHJhY3RlZC4gVGhlIGV4dHJhY3RlZAorLy8vICAgIGJpdHMgYXJlIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzIG9mIG9wZXJhbmQgeSBvZiBsZW5ndGggbGVuLgorLy8vIFxwYXJhbSBsZW4KKy8vLyAgICBCaXRzIFs1OjBdIHNwZWNpZnkgdGhlIGxlbmd0aDsgdGhlIG90aGVyIGJpdHMgYXJlIGlnbm9yZWQuIElmIGJpdHMgWzU6MF0KKy8vLyAgICBhcmUgemVybywgdGhlIGxlbmd0aCBpcyBpbnRlcnByZXRlZCBhcyA2NC4KKy8vLyBccGFyYW0gaWR4CisvLy8gICAgQml0cyBbNTowXSBzcGVjaWZ5IHRoZSBpbmRleCBvZiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0OyB0aGUgb3RoZXIKKy8vLyAgICBiaXRzIGFyZSBpZ25vcmVkLiBJZiB0aGUgc3VtIG9mIHRoZSBpbmRleCBhbmQgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiA2NCwKKy8vLyAgICB0aGUgcmVzdWx0IGlzIHVuZGVmaW5lZC4gSWYgdGhlIGxlbmd0aCBhbmQgaW5kZXggYXJlIGJvdGggemVybywgYml0cworLy8vICAgIFs2MzowXSBvZiBwYXJhbWV0ZXIgeSBhcmUgaW5zZXJ0ZWQgaW50byBwYXJhbWV0ZXIgeC4gSWYgdGhlIGxlbmd0aCBpcworLy8vICAgIHplcm8gYnV0IHRoZSBpbmRleCBpcyBub24temVybywgdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQuCisvLy8gXHJldHVybnMgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIG9yaWdpbmFsIGxvd2VyIDY0LWJpdHMgb2YKKy8vLyAgICBkZXN0aW5hdGlvbiBvcGVyYW5kIHggd2l0aCB0aGUgc3BlY2lmaWVkIGJpdGZpZWxkcyByZXBsYWNlZCBieSB0aGUgbG93ZXIKKy8vLyAgICBiaXRzIG9mIHNvdXJjZSBvcGVyYW5kIHkuIFRoZSB1cHBlciA2NCBiaXRzIG9mIHRoZSByZXR1cm4gdmFsdWUgYXJlCisvLy8gICAgdW5kZWZpbmVkLgorCisjZGVmaW5lIF9tbV9pbnNlcnRpX3NpNjQoeCwgeSwgbGVuLCBpZHgpIFwKKyAgKChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX2luc2VydHFpKChfX3YyZGkpKF9fbTEyOGkpKHgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRpKShfX20xMjhpKSh5KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIpKGxlbiksIChjaGFyKShpZHgpKSkKKworLy8vIFxicmllZiBJbnNlcnRzIGJpdHMgb2YgYSBzcGVjaWZpZWQgbGVuZ3RoIGZyb20gdGhlIHNvdXJjZSBpbnRlZ2VyIHZlY3RvcgorLy8vICAgIF9feSBpbnRvIHRoZSBsb3dlciA2NCBiaXRzIG9mIHRoZSBkZXN0aW5hdGlvbiBpbnRlZ2VyIHZlY3RvciBfX3ggYXQgdGhlCisvLy8gICAgaW5kZXggYW5kIG9mIHRoZSBsZW5ndGggc3BlY2lmaWVkIGJ5IF9feS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBJTlNFUlRRIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9feAorLy8vICAgIFRoZSBkZXN0aW5hdGlvbiBvcGVyYW5kIHdoZXJlIGJpdHMgd2lsbCBiZSBpbnNlcnRlZC4gVGhlIGluc2VydGVkIGJpdHMKKy8vLyAgICBhcmUgZGVmaW5lZCBieSB0aGUgbGVuZ3RoIGFuZCBieSB0aGUgaW5kZXggb2YgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdAorLy8vICAgIHNwZWNpZmllZCBieSBvcGVyYW5kIF9feS4KKy8vLyBccGFyYW0gX195CisvLy8gICAgVGhlIHNvdXJjZSBvcGVyYW5kIGNvbnRhaW5pbmcgdGhlIGJpdHMgdG8gYmUgZXh0cmFjdGVkLiBUaGUgZXh0cmFjdGVkCisvLy8gICAgYml0cyBhcmUgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgb2Ygb3BlcmFuZCBfX3kgd2l0aCBsZW5ndGggc3BlY2lmaWVkCisvLy8gICAgYnkgYml0cyBbNjk6NjRdLiBUaGVzZSBhcmUgaW5zZXJ0ZWQgaW50byB0aGUgZGVzdGluYXRpb24gYXQgdGhlIGluZGV4CisvLy8gICAgc3BlY2lmaWVkIGJ5IGJpdHMgWzc3OjcyXTsgYWxsIG90aGVyIGJpdHMgYXJlIGlnbm9yZWQuIElmIGJpdHMgWzY5OjY0XQorLy8vICAgIGFyZSB6ZXJvLCB0aGUgbGVuZ3RoIGlzIGludGVycHJldGVkIGFzIDY0LiBJZiB0aGUgc3VtIG9mIHRoZSBpbmRleCBhbmQKKy8vLyAgICBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIDY0LCB0aGUgcmVzdWx0IGlzIHVuZGVmaW5lZC4gSWYgdGhlIGxlbmd0aCBhbmQKKy8vLyAgICBpbmRleCBhcmUgYm90aCB6ZXJvLCBiaXRzIFs2MzowXSBvZiBwYXJhbWV0ZXIgX195IGFyZSBpbnNlcnRlZCBpbnRvCisvLy8gICAgcGFyYW1ldGVyIF9feC4gSWYgdGhlIGxlbmd0aCBpcyB6ZXJvIGJ1dCB0aGUgaW5kZXggaXMgbm9uLXplcm8sIHRoZQorLy8vICAgIHJlc3VsdCBpcyB1bmRlZmluZWQuCisvLy8gXHJldHVybnMgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIG9yaWdpbmFsIGxvd2VyIDY0LWJpdHMgb2YKKy8vLyAgICBkZXN0aW5hdGlvbiBvcGVyYW5kIF9feCB3aXRoIHRoZSBzcGVjaWZpZWQgYml0ZmllbGRzIHJlcGxhY2VkIGJ5IHRoZQorLy8vICAgIGxvd2VyIGJpdHMgb2Ygc291cmNlIG9wZXJhbmQgX195LiBUaGUgdXBwZXIgNjQgYml0cyBvZiB0aGUgcmV0dXJuIHZhbHVlCisvLy8gICAgYXJlIHVuZGVmaW5lZC4KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9pbnNlcnRfc2k2NChfX20xMjhpIF9feCwgX19tMTI4aSBfX3kpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9pbnNlcnRxKChfX3YyZGkpX194LCAoX192MmRpKV9feSk7Cit9CisKKy8vLyBcYnJpZWYgU3RvcmVzIGEgNjQtYml0IGRvdWJsZS1wcmVjaXNpb24gdmFsdWUgaW4gYSA2NC1iaXQgbWVtb3J5IGxvY2F0aW9uLgorLy8vICAgIFRvIG1pbmltaXplIGNhY2hpbmcsIHRoZSBkYXRhIGlzIGZsYWdnZWQgYXMgbm9uLXRlbXBvcmFsICh1bmxpa2VseSB0byBiZQorLy8vICAgIHVzZWQgYWdhaW4gc29vbikuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgTU9WTlRTRCBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX3AKKy8vLyAgICBUaGUgNjQtYml0IG1lbW9yeSBsb2NhdGlvbiB1c2VkIHRvIHN0b3JlIHRoZSByZWdpc3RlciB2YWx1ZS4KKy8vLyBccGFyYW0gX19hCisvLy8gICAgVGhlIDY0LWJpdCBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHJlZ2lzdGVyIHZhbHVlIHRvIGJlIHN0b3JlZC4KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc3RyZWFtX3NkKGRvdWJsZSAqX19wLCBfX20xMjhkIF9fYSkKK3sKKyAgX19idWlsdGluX2lhMzJfbW92bnRzZChfX3AsIChfX3YyZGYpX19hKTsKK30KKworLy8vIFxicmllZiBTdG9yZXMgYSAzMi1iaXQgc2luZ2xlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZSBpbiBhIDMyLWJpdAorLy8vICAgIG1lbW9yeSBsb2NhdGlvbi4gVG8gbWluaW1pemUgY2FjaGluZywgdGhlIGRhdGEgaXMgZmxhZ2dlZCBhcworLy8vICAgIG5vbi10ZW1wb3JhbCAodW5saWtlbHkgdG8gYmUgdXNlZCBhZ2FpbiBzb29uKS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBNT1ZOVFNTIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fcAorLy8vICAgIFRoZSAzMi1iaXQgbWVtb3J5IGxvY2F0aW9uIHVzZWQgdG8gc3RvcmUgdGhlIHJlZ2lzdGVyIHZhbHVlLgorLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBUaGUgMzItYml0IHNpbmdsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgcmVnaXN0ZXIgdmFsdWUgdG8gYmUgc3RvcmVkLgorc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zdHJlYW1fc3MoZmxvYXQgKl9fcCwgX19tMTI4IF9fYSkKK3sKKyAgX19idWlsdGluX2lhMzJfbW92bnRzcyhfX3AsIChfX3Y0c2YpX19hKTsKK30KKworI3VuZGVmIF9fREVGQVVMVF9GTl9BVFRSUworCisjZW5kaWYgLyogX19BTU1JTlRSSU5fSCAqLwpkaWZmIC0tZ2l0IGEvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvYXJtX2FjbGUuaCBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL2FybV9hY2xlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQyM2U2MgotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL2FybV9hY2xlLmgKQEAgLTAsMCArMSwzMTIgQEAKKy8qPT09LS0tLSBhcm1fYWNsZS5oIC0gQVJNIE5vbi1OZW9uIGludHJpbnNpY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKgorICo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICovCisKKyNpZm5kZWYgX19BUk1fQUNMRV9ICisjZGVmaW5lIF9fQVJNX0FDTEVfSAorCisjaWZuZGVmIF9fQVJNX0FDTEUKKyNlcnJvciAiQUNMRSBpbnRyaW5zaWNzIHN1cHBvcnQgbm90IGVuYWJsZWQuIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiA4IFNZTkNIUk9OSVpBVElPTiwgQkFSUklFUiBBTkQgSElOVCBJTlRSSU5TSUNTICovCisvKiA4LjMgTWVtb3J5IGJhcnJpZXJzICovCisjaWYgIWRlZmluZWQoX01TQ19WRVIpCisjZGVmaW5lIF9fZG1iKGkpIF9fYnVpbHRpbl9hcm1fZG1iKGkpCisjZGVmaW5lIF9fZHNiKGkpIF9fYnVpbHRpbl9hcm1fZHNiKGkpCisjZGVmaW5lIF9faXNiKGkpIF9fYnVpbHRpbl9hcm1faXNiKGkpCisjZW5kaWYKKworLyogOC40IEhpbnRzICovCisKKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fKSkgX193Zmkodm9pZCkgeworICBfX2J1aWx0aW5fYXJtX3dmaSgpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXykpIF9fd2ZlKHZvaWQpIHsKKyAgX19idWlsdGluX2FybV93ZmUoKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18pKSBfX3Nldih2b2lkKSB7CisgIF9fYnVpbHRpbl9hcm1fc2V2KCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fKSkgX19zZXZsKHZvaWQpIHsKKyAgX19idWlsdGluX2FybV9zZXZsKCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fKSkgX195aWVsZCh2b2lkKSB7CisgIF9fYnVpbHRpbl9hcm1feWllbGQoKTsKK30KKyNlbmRpZgorCisjaWYgX19BUk1fMzJCSVRfU1RBVEUKKyNkZWZpbmUgX19kYmcodCkgX19idWlsdGluX2FybV9kYmcodCkKKyNlbmRpZgorCisvKiA4LjUgU3dhcCAqLworc3RhdGljIF9faW5saW5lX18gdWludDMyX3QgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fKSkKK19fc3dwKHVpbnQzMl90IF9feCwgdm9sYXRpbGUgdWludDMyX3QgKl9fcCkgeworICB1aW50MzJfdCB2OworICBkbworICAgIHYgPSBfX2J1aWx0aW5fYXJtX2xkcmV4KF9fcCk7CisgIHdoaWxlIChfX2J1aWx0aW5fYXJtX3N0cmV4KF9feCwgX19wKSk7CisgIHJldHVybiB2OworfQorCisvKiA4LjYgTWVtb3J5IHByZWZldGNoIGludHJpbnNpY3MgKi8KKy8qIDguNi4xIERhdGEgcHJlZmV0Y2ggKi8KKyNkZWZpbmUgX19wbGQoYWRkcikgX19wbGR4KDAsIDAsIDAsIGFkZHIpCisKKyNpZiBfX0FSTV8zMkJJVF9TVEFURQorI2RlZmluZSBfX3BsZHgoYWNjZXNzX2tpbmQsIGNhY2hlX2xldmVsLCByZXRlbnRpb25fcG9saWN5LCBhZGRyKSBcCisgIF9fYnVpbHRpbl9hcm1fcHJlZmV0Y2goYWRkciwgYWNjZXNzX2tpbmQsIDEpCisjZWxzZQorI2RlZmluZSBfX3BsZHgoYWNjZXNzX2tpbmQsIGNhY2hlX2xldmVsLCByZXRlbnRpb25fcG9saWN5LCBhZGRyKSBcCisgIF9fYnVpbHRpbl9hcm1fcHJlZmV0Y2goYWRkciwgYWNjZXNzX2tpbmQsIGNhY2hlX2xldmVsLCByZXRlbnRpb25fcG9saWN5LCAxKQorI2VuZGlmCisKKy8qIDguNi4yIEluc3RydWN0aW9uIHByZWZldGNoICovCisjZGVmaW5lIF9fcGxpKGFkZHIpIF9fcGxpeCgwLCAwLCBhZGRyKQorCisjaWYgX19BUk1fMzJCSVRfU1RBVEUKKyNkZWZpbmUgX19wbGl4KGNhY2hlX2xldmVsLCByZXRlbnRpb25fcG9saWN5LCBhZGRyKSBcCisgIF9fYnVpbHRpbl9hcm1fcHJlZmV0Y2goYWRkciwgMCwgMCkKKyNlbHNlCisjZGVmaW5lIF9fcGxpeChjYWNoZV9sZXZlbCwgcmV0ZW50aW9uX3BvbGljeSwgYWRkcikgXAorICBfX2J1aWx0aW5fYXJtX3ByZWZldGNoKGFkZHIsIDAsIGNhY2hlX2xldmVsLCByZXRlbnRpb25fcG9saWN5LCAwKQorI2VuZGlmCisKKy8qIDguNyBOT1AgKi8KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fKSkgX19ub3Aodm9pZCkgeworICBfX2J1aWx0aW5fYXJtX25vcCgpOworfQorCisvKiA5IERBVEEtUFJPQ0VTU0lORyBJTlRSSU5TSUNTICovCisvKiA5LjIgTWlzY2VsbGFuZW91cyBkYXRhLXByb2Nlc3NpbmcgaW50cmluc2ljcyAqLworLyogUk9SICovCitzdGF0aWMgX19pbmxpbmVfXyB1aW50MzJfdCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18pKQorX19yb3IodWludDMyX3QgX194LCB1aW50MzJfdCBfX3kpIHsKKyAgX195ICU9IDMyOworICBpZiAoX195ID09IDApCisgICAgcmV0dXJuIF9feDsKKyAgcmV0dXJuIChfX3ggPj4gX195KSB8IChfX3ggPDwgKDMyIC0gX195KSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVpbnQ2NF90IF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXykpCitfX3JvcmxsKHVpbnQ2NF90IF9feCwgdWludDMyX3QgX195KSB7CisgIF9feSAlPSA2NDsKKyAgaWYgKF9feSA9PSAwKQorICAgIHJldHVybiBfX3g7CisgIHJldHVybiAoX194ID4+IF9feSkgfCAoX194IDw8ICg2NCAtIF9feSkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXykpCitfX3JvcmwodW5zaWduZWQgbG9uZyBfX3gsIHVpbnQzMl90IF9feSkgeworI2lmIF9fU0laRU9GX0xPTkdfXyA9PSA0CisgIHJldHVybiBfX3JvcihfX3gsIF9feSk7CisjZWxzZQorICByZXR1cm4gX19yb3JsbChfX3gsIF9feSk7CisjZW5kaWYKK30KKworCisvKiBDTFogKi8KK3N0YXRpYyBfX2lubGluZV9fIHVpbnQzMl90IF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXykpCitfX2Nseih1aW50MzJfdCBfX3QpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9jbHooX190KTsKK30KKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18pKQorX19jbHpsKHVuc2lnbmVkIGxvbmcgX190KSB7CisgIHJldHVybiBfX2J1aWx0aW5fY2x6bChfX3QpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB1aW50NjRfdCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18pKQorX19jbHpsbCh1aW50NjRfdCBfX3QpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9jbHpsbChfX3QpOworfQorCisvKiBSRVYgKi8KK3N0YXRpYyBfX2lubGluZV9fIHVpbnQzMl90IF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXykpCitfX3Jldih1aW50MzJfdCBfX3QpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9ic3dhcDMyKF9fdCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fKSkKK19fcmV2bCh1bnNpZ25lZCBsb25nIF9fdCkgeworI2lmIF9fU0laRU9GX0xPTkdfXyA9PSA0CisgIHJldHVybiBfX2J1aWx0aW5fYnN3YXAzMihfX3QpOworI2Vsc2UKKyAgcmV0dXJuIF9fYnVpbHRpbl9ic3dhcDY0KF9fdCk7CisjZW5kaWYKK30KKworc3RhdGljIF9faW5saW5lX18gdWludDY0X3QgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fKSkKK19fcmV2bGwodWludDY0X3QgX190KSB7CisgIHJldHVybiBfX2J1aWx0aW5fYnN3YXA2NChfX3QpOworfQorCisvKiBSRVYxNiAqLworc3RhdGljIF9faW5saW5lX18gdWludDMyX3QgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fKSkKK19fcmV2MTYodWludDMyX3QgX190KSB7CisgIHJldHVybiBfX3JvcihfX3JldihfX3QpLCAxNik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVpbnQ2NF90IF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXykpCitfX3JldjE2bGwodWludDY0X3QgX190KSB7CisgIHJldHVybiAoKCh1aW50NjRfdClfX3JldjE2KF9fdCA+PiAzMikpIDw8IDMyKSB8IF9fcmV2MTYoX190KTsKK30KKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18pKQorX19yZXYxNmwodW5zaWduZWQgbG9uZyBfX3QpIHsKKyNpZiBfX1NJWkVPRl9MT05HX18gPT0gNAorICAgIHJldHVybiBfX3JldjE2KF9fdCk7CisjZWxzZQorICAgIHJldHVybiBfX3JldjE2bGwoX190KTsKKyNlbmRpZgorfQorCisvKiBSRVZTSCAqLworc3RhdGljIF9faW5saW5lX18gaW50MTZfdCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18pKQorX19yZXZzaChpbnQxNl90IF9fdCkgeworICByZXR1cm4gX19idWlsdGluX2Jzd2FwMTYoX190KTsKK30KKworLyogUkJJVCAqLworc3RhdGljIF9faW5saW5lX18gdWludDMyX3QgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fKSkKK19fcmJpdCh1aW50MzJfdCBfX3QpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hcm1fcmJpdChfX3QpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB1aW50NjRfdCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18pKQorX19yYml0bGwodWludDY0X3QgX190KSB7CisjaWYgX19BUk1fMzJCSVRfU1RBVEUKKyAgcmV0dXJuICgoKHVpbnQ2NF90KV9fYnVpbHRpbl9hcm1fcmJpdChfX3QpKSA8PCAzMikgfAorICAgICAgICAgX19idWlsdGluX2FybV9yYml0KF9fdCA+PiAzMik7CisjZWxzZQorICByZXR1cm4gX19idWlsdGluX2FybV9yYml0NjQoX190KTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXykpCitfX3JiaXRsKHVuc2lnbmVkIGxvbmcgX190KSB7CisjaWYgX19TSVpFT0ZfTE9OR19fID09IDQKKyAgcmV0dXJuIF9fcmJpdChfX3QpOworI2Vsc2UKKyAgcmV0dXJuIF9fcmJpdGxsKF9fdCk7CisjZW5kaWYKK30KKworLyoKKyAqIDkuNCBTYXR1cmF0aW5nIGludHJpbnNpY3MKKyAqCisgKiBGSVhNRTogQ2hhbmdlIGd1YXJkIHRvIHRoZWlyIGNvcnJvc3BvbmRpbmcgX19BUk1fRkVBVFVSRSBmbGFnIHdoZW4gUSBmbGFnCisgKiBpbnRyaW5zaWNzIGFyZSBpbXBsZW1lbnRlZCBhbmQgdGhlIGZsYWcgaXMgZW5hYmxlZC4KKyAqLworLyogOS40LjEgV2lkdGgtc3BlY2lmaWVkIHNhdHVyYXRpb24gaW50cmluc2ljcyAqLworI2lmIF9fQVJNXzMyQklUX1NUQVRFCisjZGVmaW5lIF9fc3NhdCh4LCB5KSBfX2J1aWx0aW5fYXJtX3NzYXQoeCwgeSkKKyNkZWZpbmUgX191c2F0KHgsIHkpIF9fYnVpbHRpbl9hcm1fdXNhdCh4LCB5KQorI2VuZGlmCisKKy8qIDkuNC4yIFNhdHVyYXRpbmcgYWRkaXRpb24gYW5kIHN1YnRyYWN0aW9uIGludHJpbnNpY3MgKi8KKyNpZiBfX0FSTV8zMkJJVF9TVEFURQorc3RhdGljIF9faW5saW5lX18gaW50MzJfdCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18pKQorX19xYWRkKGludDMyX3QgX190LCBpbnQzMl90IF9fdikgeworICByZXR1cm4gX19idWlsdGluX2FybV9xYWRkKF9fdCwgX192KTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50MzJfdCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18pKQorX19xc3ViKGludDMyX3QgX190LCBpbnQzMl90IF9fdikgeworICByZXR1cm4gX19idWlsdGluX2FybV9xc3ViKF9fdCwgX192KTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50MzJfdCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18pKQorX19xZGJsKGludDMyX3QgX190KSB7CisgIHJldHVybiBfX2J1aWx0aW5fYXJtX3FhZGQoX190LCBfX3QpOworfQorI2VuZGlmCisKKy8qIDkuNyBDUkMzMiBpbnRyaW5zaWNzICovCisjaWYgX19BUk1fRkVBVFVSRV9DUkMzMgorc3RhdGljIF9faW5saW5lX18gdWludDMyX3QgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fKSkKK19fY3JjMzJiKHVpbnQzMl90IF9fYSwgdWludDhfdCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hcm1fY3JjMzJiKF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdWludDMyX3QgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fKSkKK19fY3JjMzJoKHVpbnQzMl90IF9fYSwgdWludDE2X3QgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYXJtX2NyYzMyaChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVpbnQzMl90IF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXykpCitfX2NyYzMydyh1aW50MzJfdCBfX2EsIHVpbnQzMl90IF9fYikgeworICByZXR1cm4gX19idWlsdGluX2FybV9jcmMzMncoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB1aW50MzJfdCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18pKQorX19jcmMzMmQodWludDMyX3QgX19hLCB1aW50NjRfdCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9hcm1fY3JjMzJkKF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdWludDMyX3QgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fKSkKK19fY3JjMzJjYih1aW50MzJfdCBfX2EsIHVpbnQ4X3QgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYXJtX2NyYzMyY2IoX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB1aW50MzJfdCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18pKQorX19jcmMzMmNoKHVpbnQzMl90IF9fYSwgdWludDE2X3QgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYXJtX2NyYzMyY2goX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB1aW50MzJfdCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18pKQorX19jcmMzMmN3KHVpbnQzMl90IF9fYSwgdWludDMyX3QgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYXJtX2NyYzMyY3coX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB1aW50MzJfdCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18pKQorX19jcmMzMmNkKHVpbnQzMl90IF9fYSwgdWludDY0X3QgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYXJtX2NyYzMyY2QoX19hLCBfX2IpOworfQorI2VuZGlmCisKKy8qIDEwLjEgU3BlY2lhbCByZWdpc3RlciBpbnRyaW5zaWNzICovCisjZGVmaW5lIF9fYXJtX3JzcihzeXNyZWcpIF9fYnVpbHRpbl9hcm1fcnNyKHN5c3JlZykKKyNkZWZpbmUgX19hcm1fcnNyNjQoc3lzcmVnKSBfX2J1aWx0aW5fYXJtX3JzcjY0KHN5c3JlZykKKyNkZWZpbmUgX19hcm1fcnNycChzeXNyZWcpIF9fYnVpbHRpbl9hcm1fcnNycChzeXNyZWcpCisjZGVmaW5lIF9fYXJtX3dzcihzeXNyZWcsIHYpIF9fYnVpbHRpbl9hcm1fd3NyKHN5c3JlZywgdikKKyNkZWZpbmUgX19hcm1fd3NyNjQoc3lzcmVnLCB2KSBfX2J1aWx0aW5fYXJtX3dzcjY0KHN5c3JlZywgdikKKyNkZWZpbmUgX19hcm1fd3NycChzeXNyZWcsIHYpIF9fYnVpbHRpbl9hcm1fd3NycChzeXNyZWcsIHYpCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0FSTV9BQ0xFX0ggKi8KZGlmZiAtLWdpdCBhL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL2F2eDJpbnRyaW4uaCBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL2F2eDJpbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2JjYmVmCi0tLSAvZGV2L251bGwKKysrIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvYXZ4MmludHJpbi5oCkBAIC0wLDAgKzEsMTI5OSBAQAorLyo9PT0tLS0tIGF2eDJpbnRyaW4uaCAtIEFWWDIgaW50cmluc2ljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqCisgKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisgKi8KKworI2lmbmRlZiBfX0lNTUlOVFJJTl9ICisjZXJyb3IgIk5ldmVyIHVzZSA8YXZ4MmludHJpbi5oPiBkaXJlY3RseTsgaW5jbHVkZSA8aW1taW50cmluLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpZm5kZWYgX19BVlgySU5UUklOX0gKKyNkZWZpbmUgX19BVlgySU5UUklOX0gKKworLyogRGVmaW5lIHRoZSBkZWZhdWx0IGF0dHJpYnV0ZXMgZm9yIHRoZSBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlLiAqLworI2RlZmluZSBfX0RFRkFVTFRfRk5fQVRUUlMgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fLCBfX3RhcmdldF9fKCJhdngyIikpKQorCisvKiBTU0U0IE11bHRpcGxlIFBhY2tlZCBTdW1zIG9mIEFic29sdXRlIERpZmZlcmVuY2UuICAqLworI2RlZmluZSBfbW0yNTZfbXBzYWRid19lcHU4KFgsIFksIE0pIFwKKyAgKF9fbTI1NmkpX19idWlsdGluX2lhMzJfbXBzYWRidzI1NigoX192MzJxaSkoX19tMjU2aSkoWCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MzJxaSkoX19tMjU2aSkoWSksIChpbnQpKE0pKQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2Fic19lcGk4KF9fbTI1NmkgX19hKQoreworICAgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wYWJzYjI1NigoX192MzJxaSlfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2Fic19lcGkxNihfX20yNTZpIF9fYSkKK3sKKyAgICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcGFic3cyNTYoKF9fdjE2aGkpX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9hYnNfZXBpMzIoX19tMjU2aSBfX2EpCit7CisgICAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BhYnNkMjU2KChfX3Y4c2kpX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9wYWNrc19lcGkxNihfX20yNTZpIF9fYSwgX19tMjU2aSBfX2IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wYWNrc3N3YjI1NigoX192MTZoaSlfX2EsIChfX3YxNmhpKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfcGFja3NfZXBpMzIoX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcGFja3NzZHcyNTYoKF9fdjhzaSlfX2EsIChfX3Y4c2kpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9wYWNrdXNfZXBpMTYoX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcGFja3Vzd2IyNTYoKF9fdjE2aGkpX19hLCAoX192MTZoaSlfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3BhY2t1c19lcGkzMihfX20yNTZpIF9fVjEsIF9fbTI1NmkgX19WMikKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wYWNrdXNkdzI1NigoX192OHNpKV9fVjEsIChfX3Y4c2kpX19WMik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfYWRkX2VwaTgoX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKQoreworICByZXR1cm4gKF9fbTI1NmkpKChfX3YzMnF1KV9fYSArIChfX3YzMnF1KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfYWRkX2VwaTE2KF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikKK3sKKyAgcmV0dXJuIChfX20yNTZpKSgoX192MTZodSlfX2EgKyAoX192MTZodSlfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2FkZF9lcGkzMihfX20yNTZpIF9fYSwgX19tMjU2aSBfX2IpCit7CisgIHJldHVybiAoX19tMjU2aSkoKF9fdjhzdSlfX2EgKyAoX192OHN1KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfYWRkX2VwaTY0KF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikKK3sKKyAgcmV0dXJuIChfX20yNTZpKSgoX192NGR1KV9fYSArIChfX3Y0ZHUpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9hZGRzX2VwaTgoX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcGFkZHNiMjU2KChfX3YzMnFpKV9fYSwgKF9fdjMycWkpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9hZGRzX2VwaTE2KF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BhZGRzdzI1NigoX192MTZoaSlfX2EsIChfX3YxNmhpKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfYWRkc19lcHU4KF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BhZGR1c2IyNTYoKF9fdjMycWkpX19hLCAoX192MzJxaSlfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2FkZHNfZXB1MTYoX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcGFkZHVzdzI1NigoX192MTZoaSlfX2EsIChfX3YxNmhpKV9fYik7Cit9CisKKyNkZWZpbmUgX21tMjU2X2FsaWducl9lcGk4KGEsIGIsIG4pIF9fZXh0ZW5zaW9uX18gKHsgICAgICAgIFwKKyAgKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcGFsaWducjI1NigoX192MzJxaSkoX19tMjU2aSkoYSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MzJxaSkoX19tMjU2aSkoYiksIChuKSk7IH0pCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfYW5kX3NpMjU2KF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikKK3sKKyAgcmV0dXJuIChfX20yNTZpKSgoX192NGR1KV9fYSAmIChfX3Y0ZHUpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9hbmRub3Rfc2kyNTYoX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKQoreworICByZXR1cm4gKF9fbTI1NmkpKH4oX192NGR1KV9fYSAmIChfX3Y0ZHUpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9hdmdfZXB1OChfX20yNTZpIF9fYSwgX19tMjU2aSBfX2IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wYXZnYjI1NigoX192MzJxaSlfX2EsIChfX3YzMnFpKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfYXZnX2VwdTE2KF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3Bhdmd3MjU2KChfX3YxNmhpKV9fYSwgKF9fdjE2aGkpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9ibGVuZHZfZXBpOChfX20yNTZpIF9fVjEsIF9fbTI1NmkgX19WMiwgX19tMjU2aSBfX00pCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wYmxlbmR2YjI1NigoX192MzJxaSlfX1YxLCAoX192MzJxaSlfX1YyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YzMnFpKV9fTSk7Cit9CisKKyNkZWZpbmUgX21tMjU2X2JsZW5kX2VwaTE2KFYxLCBWMiwgTSkgX19leHRlbnNpb25fXyAoeyAgICAgICBcCisgIChfX20yNTZpKV9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3YxNmhpKShfX20yNTZpKShWMSksICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZoaSkoX19tMjU2aSkoVjIpLCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoTSkgJiAweDAxKSA/IDE2IDogMCksICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKE0pICYgMHgwMikgPyAxNyA6IDEpLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChNKSAmIDB4MDQpID8gMTggOiAyKSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoTSkgJiAweDA4KSA/IDE5IDogMyksICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKE0pICYgMHgxMCkgPyAyMCA6IDQpLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChNKSAmIDB4MjApID8gMjEgOiA1KSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoTSkgJiAweDQwKSA/IDIyIDogNiksICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKE0pICYgMHg4MCkgPyAyMyA6IDcpLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChNKSAmIDB4MDEpID8gMjQgOiA4KSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoTSkgJiAweDAyKSA/IDI1IDogOSksICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKE0pICYgMHgwNCkgPyAyNiA6IDEwKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChNKSAmIDB4MDgpID8gMjcgOiAxMSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoTSkgJiAweDEwKSA/IDI4IDogMTIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKE0pICYgMHgyMCkgPyAyOSA6IDEzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChNKSAmIDB4NDApID8gMzAgOiAxNCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoTSkgJiAweDgwKSA/IDMxIDogMTUpKTsgfSkKKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9jbXBlcV9lcGk4KF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikKK3sKKyAgcmV0dXJuIChfX20yNTZpKSgoX192MzJxaSlfX2EgPT0gKF9fdjMycWkpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9jbXBlcV9lcGkxNihfX20yNTZpIF9fYSwgX19tMjU2aSBfX2IpCit7CisgIHJldHVybiAoX19tMjU2aSkoKF9fdjE2aGkpX19hID09IChfX3YxNmhpKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY21wZXFfZXBpMzIoX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKQoreworICByZXR1cm4gKF9fbTI1NmkpKChfX3Y4c2kpX19hID09IChfX3Y4c2kpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9jbXBlcV9lcGk2NChfX20yNTZpIF9fYSwgX19tMjU2aSBfX2IpCit7CisgIHJldHVybiAoX19tMjU2aSkoKF9fdjRkaSlfX2EgPT0gKF9fdjRkaSlfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2NtcGd0X2VwaTgoX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKQoreworICAvKiBUaGlzIGZ1bmN0aW9uIGFsd2F5cyBwZXJmb3JtcyBhIHNpZ25lZCBjb21wYXJpc29uLCBidXQgX192MzJxaSBpcyBhIGNoYXIKKyAgICAgd2hpY2ggbWF5IGJlIHNpZ25lZCBvciB1bnNpZ25lZCwgc28gdXNlIF9fdjMycXMuICovCisgIHJldHVybiAoX19tMjU2aSkoKF9fdjMycXMpX19hID4gKF9fdjMycXMpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9jbXBndF9lcGkxNihfX20yNTZpIF9fYSwgX19tMjU2aSBfX2IpCit7CisgIHJldHVybiAoX19tMjU2aSkoKF9fdjE2aGkpX19hID4gKF9fdjE2aGkpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9jbXBndF9lcGkzMihfX20yNTZpIF9fYSwgX19tMjU2aSBfX2IpCit7CisgIHJldHVybiAoX19tMjU2aSkoKF9fdjhzaSlfX2EgPiAoX192OHNpKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY21wZ3RfZXBpNjQoX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKQoreworICByZXR1cm4gKF9fbTI1NmkpKChfX3Y0ZGkpX19hID4gKF9fdjRkaSlfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2hhZGRfZXBpMTYoX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKQoreworICAgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9waGFkZHcyNTYoKF9fdjE2aGkpX19hLCAoX192MTZoaSlfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2hhZGRfZXBpMzIoX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKQoreworICAgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9waGFkZGQyNTYoKF9fdjhzaSlfX2EsIChfX3Y4c2kpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9oYWRkc19lcGkxNihfX20yNTZpIF9fYSwgX19tMjU2aSBfX2IpCit7CisgICAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BoYWRkc3cyNTYoKF9fdjE2aGkpX19hLCAoX192MTZoaSlfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2hzdWJfZXBpMTYoX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKQoreworICAgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9waHN1YncyNTYoKF9fdjE2aGkpX19hLCAoX192MTZoaSlfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2hzdWJfZXBpMzIoX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKQoreworICAgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9waHN1YmQyNTYoKF9fdjhzaSlfX2EsIChfX3Y4c2kpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9oc3Vic19lcGkxNihfX20yNTZpIF9fYSwgX19tMjU2aSBfX2IpCit7CisgICAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3Boc3Vic3cyNTYoKF9fdjE2aGkpX19hLCAoX192MTZoaSlfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hZGR1YnNfZXBpMTYoX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKQoreworICAgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wbWFkZHVic3cyNTYoKF9fdjMycWkpX19hLCAoX192MzJxaSlfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hZGRfZXBpMTYoX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcG1hZGR3ZDI1NigoX192MTZoaSlfX2EsIChfX3YxNmhpKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWF4X2VwaTgoX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcG1heHNiMjU2KChfX3YzMnFpKV9fYSwgKF9fdjMycWkpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXhfZXBpMTYoX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcG1heHN3MjU2KChfX3YxNmhpKV9fYSwgKF9fdjE2aGkpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXhfZXBpMzIoX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcG1heHNkMjU2KChfX3Y4c2kpX19hLCAoX192OHNpKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWF4X2VwdTgoX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcG1heHViMjU2KChfX3YzMnFpKV9fYSwgKF9fdjMycWkpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXhfZXB1MTYoX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcG1heHV3MjU2KChfX3YxNmhpKV9fYSwgKF9fdjE2aGkpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXhfZXB1MzIoX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcG1heHVkMjU2KChfX3Y4c2kpX19hLCAoX192OHNpKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWluX2VwaTgoX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcG1pbnNiMjU2KChfX3YzMnFpKV9fYSwgKF9fdjMycWkpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9taW5fZXBpMTYoX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcG1pbnN3MjU2KChfX3YxNmhpKV9fYSwgKF9fdjE2aGkpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9taW5fZXBpMzIoX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcG1pbnNkMjU2KChfX3Y4c2kpX19hLCAoX192OHNpKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWluX2VwdTgoX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcG1pbnViMjU2KChfX3YzMnFpKV9fYSwgKF9fdjMycWkpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9taW5fZXB1MTYoX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcG1pbnV3MjU2ICgoX192MTZoaSlfX2EsIChfX3YxNmhpKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWluX2VwdTMyKF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BtaW51ZDI1NigoX192OHNpKV9fYSwgKF9fdjhzaSlfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbW92ZW1hc2tfZXBpOChfX20yNTZpIF9fYSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3Btb3Ztc2tiMjU2KChfX3YzMnFpKV9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY3Z0ZXBpOF9lcGkxNihfX20xMjhpIF9fVikKK3sKKyAgLyogVGhpcyBmdW5jdGlvbiBhbHdheXMgcGVyZm9ybXMgYSBzaWduZWQgZXh0ZW5zaW9uLCBidXQgX192MTZxaSBpcyBhIGNoYXIKKyAgICAgd2hpY2ggbWF5IGJlIHNpZ25lZCBvciB1bnNpZ25lZCwgc28gdXNlIF9fdjE2cXMuICovCisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5fY29udmVydHZlY3RvcigoX192MTZxcylfX1YsIF9fdjE2aGkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2N2dGVwaThfZXBpMzIoX19tMTI4aSBfX1YpCit7CisgIC8qIFRoaXMgZnVuY3Rpb24gYWx3YXlzIHBlcmZvcm1zIGEgc2lnbmVkIGV4dGVuc2lvbiwgYnV0IF9fdjE2cWkgaXMgYSBjaGFyCisgICAgIHdoaWNoIG1heSBiZSBzaWduZWQgb3IgdW5zaWduZWQsIHNvIHVzZSBfX3YxNnFzLiAqLworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2NvbnZlcnR2ZWN0b3IoX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjE2cXMpX19WLCAoX192MTZxcylfX1YsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcpLCBfX3Y4c2kpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2N2dGVwaThfZXBpNjQoX19tMTI4aSBfX1YpCit7CisgIC8qIFRoaXMgZnVuY3Rpb24gYWx3YXlzIHBlcmZvcm1zIGEgc2lnbmVkIGV4dGVuc2lvbiwgYnV0IF9fdjE2cWkgaXMgYSBjaGFyCisgICAgIHdoaWNoIG1heSBiZSBzaWduZWQgb3IgdW5zaWduZWQsIHNvIHVzZSBfX3YxNnFzLiAqLworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2NvbnZlcnR2ZWN0b3IoX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjE2cXMpX19WLCAoX192MTZxcylfX1YsIDAsIDEsIDIsIDMpLCBfX3Y0ZGkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2N2dGVwaTE2X2VwaTMyKF9fbTEyOGkgX19WKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2NvbnZlcnR2ZWN0b3IoKF9fdjhoaSlfX1YsIF9fdjhzaSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY3Z0ZXBpMTZfZXBpNjQoX19tMTI4aSBfX1YpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5fY29udmVydHZlY3RvcihfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcigoX192OGhpKV9fViwgKF9fdjhoaSlfX1YsIDAsIDEsIDIsIDMpLCBfX3Y0ZGkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2N2dGVwaTMyX2VwaTY0KF9fbTEyOGkgX19WKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2NvbnZlcnR2ZWN0b3IoKF9fdjRzaSlfX1YsIF9fdjRkaSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY3Z0ZXB1OF9lcGkxNihfX20xMjhpIF9fVikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9jb252ZXJ0dmVjdG9yKChfX3YxNnF1KV9fViwgX192MTZoaSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY3Z0ZXB1OF9lcGkzMihfX20xMjhpIF9fVikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9jb252ZXJ0dmVjdG9yKF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3YxNnF1KV9fViwgKF9fdjE2cXUpX19WLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3KSwgX192OHNpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9jdnRlcHU4X2VwaTY0KF9fbTEyOGkgX19WKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2NvbnZlcnR2ZWN0b3IoX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjE2cXUpX19WLCAoX192MTZxdSlfX1YsIDAsIDEsIDIsIDMpLCBfX3Y0ZGkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2N2dGVwdTE2X2VwaTMyKF9fbTEyOGkgX19WKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2NvbnZlcnR2ZWN0b3IoKF9fdjhodSlfX1YsIF9fdjhzaSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY3Z0ZXB1MTZfZXBpNjQoX19tMTI4aSBfX1YpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5fY29udmVydHZlY3RvcihfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcigoX192OGh1KV9fViwgKF9fdjhodSlfX1YsIDAsIDEsIDIsIDMpLCBfX3Y0ZGkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2N2dGVwdTMyX2VwaTY0KF9fbTEyOGkgX19WKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2NvbnZlcnR2ZWN0b3IoKF9fdjRzdSlfX1YsIF9fdjRkaSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fICBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X211bF9lcGkzMihfX20yNTZpIF9fYSwgX19tMjU2aSBfX2IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wbXVsZHEyNTYoKF9fdjhzaSlfX2EsIChfX3Y4c2kpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tdWxocnNfZXBpMTYoX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcG11bGhyc3cyNTYoKF9fdjE2aGkpX19hLCAoX192MTZoaSlfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X211bGhpX2VwdTE2KF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BtdWxodXcyNTYoKF9fdjE2aGkpX19hLCAoX192MTZoaSlfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X211bGhpX2VwaTE2KF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BtdWxodzI1NigoX192MTZoaSlfX2EsIChfX3YxNmhpKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbXVsbG9fZXBpMTYoX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKQoreworICByZXR1cm4gKF9fbTI1NmkpKChfX3YxNmh1KV9fYSAqIChfX3YxNmh1KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fICBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X211bGxvX2VwaTMyIChfX20yNTZpIF9fYSwgX19tMjU2aSBfX2IpCit7CisgIHJldHVybiAoX19tMjU2aSkoKF9fdjhzdSlfX2EgKiAoX192OHN1KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbXVsX2VwdTMyKF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3BtdWx1ZHEyNTYoKF9fdjhzaSlfX2EsIChfX3Y4c2kpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9vcl9zaTI1NihfX20yNTZpIF9fYSwgX19tMjU2aSBfX2IpCit7CisgIHJldHVybiAoX19tMjU2aSkoKF9fdjRkdSlfX2EgfCAoX192NGR1KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfc2FkX2VwdTgoX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcHNhZGJ3MjU2KChfX3YzMnFpKV9fYSwgKF9fdjMycWkpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9zaHVmZmxlX2VwaTgoX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHNodWZiMjU2KChfX3YzMnFpKV9fYSwgKF9fdjMycWkpX19iKTsKK30KKworI2RlZmluZSBfbW0yNTZfc2h1ZmZsZV9lcGkzMihhLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2aSlfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcigoX192OHNpKShfX20yNTZpKShhKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNpKV9tbTI1Nl91bmRlZmluZWRfc2kyNTYoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICsgKCgoaW1tKSA+PiAwKSAmIDB4MyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCArICgoKGltbSkgPj4gMikgJiAweDMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgKyAoKChpbW0pID4+IDQpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICsgKCgoaW1tKSA+PiA2KSAmIDB4MyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCArICgoKGltbSkgPj4gMCkgJiAweDMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgKyAoKChpbW0pID4+IDIpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ICsgKCgoaW1tKSA+PiA0KSAmIDB4MyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCArICgoKGltbSkgPj4gNikgJiAweDMpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfc2h1ZmZsZWhpX2VwaTE2KGEsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTZpKV9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3YxNmhpKShfX20yNTZpKShhKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZoaSlfbW0yNTZfdW5kZWZpbmVkX3NpMjU2KCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgMiwgMywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ICArICgoKGltbSkgPj4gMCkgJiAweDMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgICsgKCgoaW1tKSA+PiAyKSAmIDB4MyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCAgKyAoKChpbW0pID4+IDQpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ICArICgoKGltbSkgPj4gNikgJiAweDMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsIDksIDEwLCAxMSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiArICgoKGltbSkgPj4gMCkgJiAweDMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyICsgKCgoaW1tKSA+PiAyKSAmIDB4MyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIgKyAoKChpbW0pID4+IDQpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiArICgoKGltbSkgPj4gNikgJiAweDMpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfc2h1ZmZsZWxvX2VwaTE2KGEsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTZpKV9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3YxNmhpKShfX20yNTZpKShhKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZoaSlfbW0yNTZfdW5kZWZpbmVkX3NpMjU2KCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCArICgoKGltbSkgPj4gMCkgJiAweDMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgKyAoKChpbW0pID4+IDIpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICsgKCgoaW1tKSA+PiA0KSAmIDB4MyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCArICgoKGltbSkgPj4gNikgJiAweDMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsIDUsIDYsIDcsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCArICgoKGltbSkgPj4gMCkgJiAweDMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDggKyAoKChpbW0pID4+IDIpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ICsgKCgoaW1tKSA+PiA0KSAmIDB4MyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCArICgoKGltbSkgPj4gNikgJiAweDMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyLCAxMywgMTQsIDE1KTsgfSkKKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9zaWduX2VwaTgoX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKQoreworICAgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wc2lnbmIyNTYoKF9fdjMycWkpX19hLCAoX192MzJxaSlfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3NpZ25fZXBpMTYoX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKQoreworICAgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wc2lnbncyNTYoKF9fdjE2aGkpX19hLCAoX192MTZoaSlfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3NpZ25fZXBpMzIoX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKQoreworICAgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wc2lnbmQyNTYoKF9fdjhzaSlfX2EsIChfX3Y4c2kpX19iKTsKK30KKworI2RlZmluZSBfbW0yNTZfc2xsaV9zaTI1NihhLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2aSlfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvciggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChfX3YzMnFpKV9tbTI1Nl9zZXR6ZXJvX3NpMjU2KCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKF9fdjMycWkpKF9fbTI1NmkpKGEpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAgMCA6ICgoY2hhcikoaW1tKT4weDAgPyAxNiA6IDMyKSAtIChjaGFyKShpbW0pLCBcCisgICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/ICAxIDogKChjaGFyKShpbW0pPjB4MSA/IDE3IDogMzMpIC0gKGNoYXIpKGltbSksIFwKKyAgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gIDIgOiAoKGNoYXIpKGltbSk+MHgyID8gMTggOiAzNCkgLSAoY2hhcikoaW1tKSwgXAorICAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAgMyA6ICgoY2hhcikoaW1tKT4weDMgPyAxOSA6IDM1KSAtIChjaGFyKShpbW0pLCBcCisgICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/ICA0IDogKChjaGFyKShpbW0pPjB4NCA/IDIwIDogMzYpIC0gKGNoYXIpKGltbSksIFwKKyAgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gIDUgOiAoKGNoYXIpKGltbSk+MHg1ID8gMjEgOiAzNykgLSAoY2hhcikoaW1tKSwgXAorICAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAgNiA6ICgoY2hhcikoaW1tKT4weDYgPyAyMiA6IDM4KSAtIChjaGFyKShpbW0pLCBcCisgICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/ICA3IDogKChjaGFyKShpbW0pPjB4NyA/IDIzIDogMzkpIC0gKGNoYXIpKGltbSksIFwKKyAgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gIDggOiAoKGNoYXIpKGltbSk+MHg4ID8gMjQgOiA0MCkgLSAoY2hhcikoaW1tKSwgXAorICAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAgOSA6ICgoY2hhcikoaW1tKT4weDkgPyAyNSA6IDQxKSAtIChjaGFyKShpbW0pLCBcCisgICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDEwIDogKChjaGFyKShpbW0pPjB4QSA/IDI2IDogNDIpIC0gKGNoYXIpKGltbSksIFwKKyAgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gMTEgOiAoKGNoYXIpKGltbSk+MHhCID8gMjcgOiA0MykgLSAoY2hhcikoaW1tKSwgXAorICAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAxMiA6ICgoY2hhcikoaW1tKT4weEMgPyAyOCA6IDQ0KSAtIChjaGFyKShpbW0pLCBcCisgICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDEzIDogKChjaGFyKShpbW0pPjB4RCA/IDI5IDogNDUpIC0gKGNoYXIpKGltbSksIFwKKyAgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gMTQgOiAoKGNoYXIpKGltbSk+MHhFID8gMzAgOiA0NikgLSAoY2hhcikoaW1tKSwgXAorICAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAxNSA6ICgoY2hhcikoaW1tKT4weEYgPyAzMSA6IDQ3KSAtIChjaGFyKShpbW0pLCBcCisgICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDE2IDogKChjaGFyKShpbW0pPjB4MCA/IDMyIDogNDgpIC0gKGNoYXIpKGltbSksIFwKKyAgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gMTcgOiAoKGNoYXIpKGltbSk+MHgxID8gMzMgOiA0OSkgLSAoY2hhcikoaW1tKSwgXAorICAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAxOCA6ICgoY2hhcikoaW1tKT4weDIgPyAzNCA6IDUwKSAtIChjaGFyKShpbW0pLCBcCisgICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDE5IDogKChjaGFyKShpbW0pPjB4MyA/IDM1IDogNTEpIC0gKGNoYXIpKGltbSksIFwKKyAgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gMjAgOiAoKGNoYXIpKGltbSk+MHg0ID8gMzYgOiA1MikgLSAoY2hhcikoaW1tKSwgXAorICAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAyMSA6ICgoY2hhcikoaW1tKT4weDUgPyAzNyA6IDUzKSAtIChjaGFyKShpbW0pLCBcCisgICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDIyIDogKChjaGFyKShpbW0pPjB4NiA/IDM4IDogNTQpIC0gKGNoYXIpKGltbSksIFwKKyAgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gMjMgOiAoKGNoYXIpKGltbSk+MHg3ID8gMzkgOiA1NSkgLSAoY2hhcikoaW1tKSwgXAorICAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAyNCA6ICgoY2hhcikoaW1tKT4weDggPyA0MCA6IDU2KSAtIChjaGFyKShpbW0pLCBcCisgICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDI1IDogKChjaGFyKShpbW0pPjB4OSA/IDQxIDogNTcpIC0gKGNoYXIpKGltbSksIFwKKyAgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gMjYgOiAoKGNoYXIpKGltbSk+MHhBID8gNDIgOiA1OCkgLSAoY2hhcikoaW1tKSwgXAorICAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAyNyA6ICgoY2hhcikoaW1tKT4weEIgPyA0MyA6IDU5KSAtIChjaGFyKShpbW0pLCBcCisgICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDI4IDogKChjaGFyKShpbW0pPjB4QyA/IDQ0IDogNjApIC0gKGNoYXIpKGltbSksIFwKKyAgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gMjkgOiAoKGNoYXIpKGltbSk+MHhEID8gNDUgOiA2MSkgLSAoY2hhcikoaW1tKSwgXAorICAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAzMCA6ICgoY2hhcikoaW1tKT4weEUgPyA0NiA6IDYyKSAtIChjaGFyKShpbW0pLCBcCisgICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDMxIDogKChjaGFyKShpbW0pPjB4RiA/IDQ3IDogNjMpIC0gKGNoYXIpKGltbSkpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9ic2xsaV9lcGkxMjgoYSwgY291bnQpIF9tbTI1Nl9zbGxpX3NpMjU2KChhKSwgKGNvdW50KSkKKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9zbGxpX2VwaTE2KF9fbTI1NmkgX19hLCBpbnQgX19jb3VudCkKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BzbGx3aTI1NigoX192MTZoaSlfX2EsIF9fY291bnQpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3NsbF9lcGkxNihfX20yNTZpIF9fYSwgX19tMTI4aSBfX2NvdW50KQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHNsbHcyNTYoKF9fdjE2aGkpX19hLCAoX192OGhpKV9fY291bnQpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3NsbGlfZXBpMzIoX19tMjU2aSBfX2EsIGludCBfX2NvdW50KQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHNsbGRpMjU2KChfX3Y4c2kpX19hLCBfX2NvdW50KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9zbGxfZXBpMzIoX19tMjU2aSBfX2EsIF9fbTEyOGkgX19jb3VudCkKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BzbGxkMjU2KChfX3Y4c2kpX19hLCAoX192NHNpKV9fY291bnQpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3NsbGlfZXBpNjQoX19tMjU2aSBfX2EsIGludCBfX2NvdW50KQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcHNsbHFpMjU2KChfX3Y0ZGkpX19hLCBfX2NvdW50KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9zbGxfZXBpNjQoX19tMjU2aSBfX2EsIF9fbTEyOGkgX19jb3VudCkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3BzbGxxMjU2KChfX3Y0ZGkpX19hLCBfX2NvdW50KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9zcmFpX2VwaTE2KF9fbTI1NmkgX19hLCBpbnQgX19jb3VudCkKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BzcmF3aTI1NigoX192MTZoaSlfX2EsIF9fY291bnQpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3NyYV9lcGkxNihfX20yNTZpIF9fYSwgX19tMTI4aSBfX2NvdW50KQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHNyYXcyNTYoKF9fdjE2aGkpX19hLCAoX192OGhpKV9fY291bnQpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3NyYWlfZXBpMzIoX19tMjU2aSBfX2EsIGludCBfX2NvdW50KQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHNyYWRpMjU2KChfX3Y4c2kpX19hLCBfX2NvdW50KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9zcmFfZXBpMzIoX19tMjU2aSBfX2EsIF9fbTEyOGkgX19jb3VudCkKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BzcmFkMjU2KChfX3Y4c2kpX19hLCAoX192NHNpKV9fY291bnQpOworfQorCisjZGVmaW5lIF9tbTI1Nl9zcmxpX3NpMjU2KGEsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTZpKV9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChfX3YzMnFpKShfX20yNTZpKShhKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKF9fdjMycWkpX21tMjU2X3NldHplcm9fc2kyNTYoKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAzMiA6IChjaGFyKShpbW0pICsgKChjaGFyKShpbW0pPjB4RiA/IDE2IDogMCksICBcCisgICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDMzIDogKGNoYXIpKGltbSkgKyAoKGNoYXIpKGltbSk+MHhFID8gMTcgOiAxKSwgIFwKKyAgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gMzQgOiAoY2hhcikoaW1tKSArICgoY2hhcikoaW1tKT4weEQgPyAxOCA6IDIpLCAgXAorICAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAzNSA6IChjaGFyKShpbW0pICsgKChjaGFyKShpbW0pPjB4QyA/IDE5IDogMyksICBcCisgICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDM2IDogKGNoYXIpKGltbSkgKyAoKGNoYXIpKGltbSk+MHhCID8gMjAgOiA0KSwgIFwKKyAgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gMzcgOiAoY2hhcikoaW1tKSArICgoY2hhcikoaW1tKT4weEEgPyAyMSA6IDUpLCAgXAorICAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAzOCA6IChjaGFyKShpbW0pICsgKChjaGFyKShpbW0pPjB4OSA/IDIyIDogNiksICBcCisgICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDM5IDogKGNoYXIpKGltbSkgKyAoKGNoYXIpKGltbSk+MHg4ID8gMjMgOiA3KSwgIFwKKyAgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gNDAgOiAoY2hhcikoaW1tKSArICgoY2hhcikoaW1tKT4weDcgPyAyNCA6IDgpLCAgXAorICAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyA0MSA6IChjaGFyKShpbW0pICsgKChjaGFyKShpbW0pPjB4NiA/IDI1IDogOSksICBcCisgICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDQyIDogKGNoYXIpKGltbSkgKyAoKGNoYXIpKGltbSk+MHg1ID8gMjYgOiAxMCksIFwKKyAgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gNDMgOiAoY2hhcikoaW1tKSArICgoY2hhcikoaW1tKT4weDQgPyAyNyA6IDExKSwgXAorICAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyA0NCA6IChjaGFyKShpbW0pICsgKChjaGFyKShpbW0pPjB4MyA/IDI4IDogMTIpLCBcCisgICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDQ1IDogKGNoYXIpKGltbSkgKyAoKGNoYXIpKGltbSk+MHgyID8gMjkgOiAxMyksIFwKKyAgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gNDYgOiAoY2hhcikoaW1tKSArICgoY2hhcikoaW1tKT4weDEgPyAzMCA6IDE0KSwgXAorICAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyA0NyA6IChjaGFyKShpbW0pICsgKChjaGFyKShpbW0pPjB4MCA/IDMxIDogMTUpLCBcCisgICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDQ4IDogKGNoYXIpKGltbSkgKyAoKGNoYXIpKGltbSk+MHhGID8gMzIgOiAxNiksIFwKKyAgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gNDkgOiAoY2hhcikoaW1tKSArICgoY2hhcikoaW1tKT4weEUgPyAzMyA6IDE3KSwgXAorICAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyA1MCA6IChjaGFyKShpbW0pICsgKChjaGFyKShpbW0pPjB4RCA/IDM0IDogMTgpLCBcCisgICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDUxIDogKGNoYXIpKGltbSkgKyAoKGNoYXIpKGltbSk+MHhDID8gMzUgOiAxOSksIFwKKyAgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gNTIgOiAoY2hhcikoaW1tKSArICgoY2hhcikoaW1tKT4weEIgPyAzNiA6IDIwKSwgXAorICAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyA1MyA6IChjaGFyKShpbW0pICsgKChjaGFyKShpbW0pPjB4QSA/IDM3IDogMjEpLCBcCisgICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDU0IDogKGNoYXIpKGltbSkgKyAoKGNoYXIpKGltbSk+MHg5ID8gMzggOiAyMiksIFwKKyAgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gNTUgOiAoY2hhcikoaW1tKSArICgoY2hhcikoaW1tKT4weDggPyAzOSA6IDIzKSwgXAorICAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyA1NiA6IChjaGFyKShpbW0pICsgKChjaGFyKShpbW0pPjB4NyA/IDQwIDogMjQpLCBcCisgICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDU3IDogKGNoYXIpKGltbSkgKyAoKGNoYXIpKGltbSk+MHg2ID8gNDEgOiAyNSksIFwKKyAgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gNTggOiAoY2hhcikoaW1tKSArICgoY2hhcikoaW1tKT4weDUgPyA0MiA6IDI2KSwgXAorICAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyA1OSA6IChjaGFyKShpbW0pICsgKChjaGFyKShpbW0pPjB4NCA/IDQzIDogMjcpLCBcCisgICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDYwIDogKGNoYXIpKGltbSkgKyAoKGNoYXIpKGltbSk+MHgzID8gNDQgOiAyOCksIFwKKyAgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gNjEgOiAoY2hhcikoaW1tKSArICgoY2hhcikoaW1tKT4weDIgPyA0NSA6IDI5KSwgXAorICAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyA2MiA6IChjaGFyKShpbW0pICsgKChjaGFyKShpbW0pPjB4MSA/IDQ2IDogMzApLCBcCisgICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDYzIDogKGNoYXIpKGltbSkgKyAoKGNoYXIpKGltbSk+MHgwID8gNDcgOiAzMSkpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9ic3JsaV9lcGkxMjgoYSwgY291bnQpIF9tbTI1Nl9zcmxpX3NpMjU2KChhKSwgKGNvdW50KSkKKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9zcmxpX2VwaTE2KF9fbTI1NmkgX19hLCBpbnQgX19jb3VudCkKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3Bzcmx3aTI1NigoX192MTZoaSlfX2EsIF9fY291bnQpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3NybF9lcGkxNihfX20yNTZpIF9fYSwgX19tMTI4aSBfX2NvdW50KQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHNybHcyNTYoKF9fdjE2aGkpX19hLCAoX192OGhpKV9fY291bnQpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3NybGlfZXBpMzIoX19tMjU2aSBfX2EsIGludCBfX2NvdW50KQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHNybGRpMjU2KChfX3Y4c2kpX19hLCBfX2NvdW50KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9zcmxfZXBpMzIoX19tMjU2aSBfX2EsIF9fbTEyOGkgX19jb3VudCkKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BzcmxkMjU2KChfX3Y4c2kpX19hLCAoX192NHNpKV9fY291bnQpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3NybGlfZXBpNjQoX19tMjU2aSBfX2EsIGludCBfX2NvdW50KQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcHNybHFpMjU2KChfX3Y0ZGkpX19hLCBfX2NvdW50KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9zcmxfZXBpNjQoX19tMjU2aSBfX2EsIF9fbTEyOGkgX19jb3VudCkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3BzcmxxMjU2KChfX3Y0ZGkpX19hLCBfX2NvdW50KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9zdWJfZXBpOChfX20yNTZpIF9fYSwgX19tMjU2aSBfX2IpCit7CisgIHJldHVybiAoX19tMjU2aSkoKF9fdjMycXUpX19hIC0gKF9fdjMycXUpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9zdWJfZXBpMTYoX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKQoreworICByZXR1cm4gKF9fbTI1NmkpKChfX3YxNmh1KV9fYSAtIChfX3YxNmh1KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfc3ViX2VwaTMyKF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikKK3sKKyAgcmV0dXJuIChfX20yNTZpKSgoX192OHN1KV9fYSAtIChfX3Y4c3UpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9zdWJfZXBpNjQoX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKQoreworICByZXR1cm4gKF9fbTI1NmkpKChfX3Y0ZHUpX19hIC0gKF9fdjRkdSlfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3N1YnNfZXBpOChfX20yNTZpIF9fYSwgX19tMjU2aSBfX2IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wc3Vic2IyNTYoKF9fdjMycWkpX19hLCAoX192MzJxaSlfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3N1YnNfZXBpMTYoX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHN1YnN3MjU2KChfX3YxNmhpKV9fYSwgKF9fdjE2aGkpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9zdWJzX2VwdTgoX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHN1YnVzYjI1NigoX192MzJxaSlfX2EsIChfX3YzMnFpKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfc3Vic19lcHUxNihfX20yNTZpIF9fYSwgX19tMjU2aSBfX2IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wc3VidXN3MjU2KChfX3YxNmhpKV9fYSwgKF9fdjE2aGkpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl91bnBhY2toaV9lcGk4KF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3YzMnFpKV9fYSwgKF9fdjMycWkpX19iLCA4LCAzMis4LCA5LCAzMis5LCAxMCwgMzIrMTAsIDExLCAzMisxMSwgMTIsIDMyKzEyLCAxMywgMzIrMTMsIDE0LCAzMisxNCwgMTUsIDMyKzE1LCAyNCwgMzIrMjQsIDI1LCAzMisyNSwgMjYsIDMyKzI2LCAyNywgMzIrMjcsIDI4LCAzMisyOCwgMjksIDMyKzI5LCAzMCwgMzIrMzAsIDMxLCAzMiszMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfdW5wYWNraGlfZXBpMTYoX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjE2aGkpX19hLCAoX192MTZoaSlfX2IsIDQsIDE2KzQsIDUsIDE2KzUsIDYsIDE2KzYsIDcsIDE2KzcsIDEyLCAxNisxMiwgMTMsIDE2KzEzLCAxNCwgMTYrMTQsIDE1LCAxNisxNSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfdW5wYWNraGlfZXBpMzIoX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjhzaSlfX2EsIChfX3Y4c2kpX19iLCAyLCA4KzIsIDMsIDgrMywgNiwgOCs2LCA3LCA4KzcpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3VucGFja2hpX2VwaTY0KF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3Y0ZGkpX19hLCAoX192NGRpKV9fYiwgMSwgNCsxLCAzLCA0KzMpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3VucGFja2xvX2VwaTgoX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjMycWkpX19hLCAoX192MzJxaSlfX2IsIDAsIDMyKzAsIDEsIDMyKzEsIDIsIDMyKzIsIDMsIDMyKzMsIDQsIDMyKzQsIDUsIDMyKzUsIDYsIDMyKzYsIDcsIDMyKzcsIDE2LCAzMisxNiwgMTcsIDMyKzE3LCAxOCwgMzIrMTgsIDE5LCAzMisxOSwgMjAsIDMyKzIwLCAyMSwgMzIrMjEsIDIyLCAzMisyMiwgMjMsIDMyKzIzKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl91bnBhY2tsb19lcGkxNihfX20yNTZpIF9fYSwgX19tMjU2aSBfX2IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcigoX192MTZoaSlfX2EsIChfX3YxNmhpKV9fYiwgMCwgMTYrMCwgMSwgMTYrMSwgMiwgMTYrMiwgMywgMTYrMywgOCwgMTYrOCwgOSwgMTYrOSwgMTAsIDE2KzEwLCAxMSwgMTYrMTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3VucGFja2xvX2VwaTMyKF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3Y4c2kpX19hLCAoX192OHNpKV9fYiwgMCwgOCswLCAxLCA4KzEsIDQsIDgrNCwgNSwgOCs1KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl91bnBhY2tsb19lcGk2NChfX20yNTZpIF9fYSwgX19tMjU2aSBfX2IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcigoX192NGRpKV9fYSwgKF9fdjRkaSlfX2IsIDAsIDQrMCwgMiwgNCsyKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl94b3Jfc2kyNTYoX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKQoreworICByZXR1cm4gKF9fbTI1NmkpKChfX3Y0ZHUpX19hIF4gKF9fdjRkdSlfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3N0cmVhbV9sb2FkX3NpMjU2KF9fbTI1NmkgY29uc3QgKl9fVikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX21vdm50ZHFhMjU2KChjb25zdCBfX3Y0ZGkgKilfX1YpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fYnJvYWRjYXN0c3NfcHMoX19tMTI4IF9fWCkKK3sKKyAgcmV0dXJuIChfX20xMjgpX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjRzZilfX1gsIChfX3Y0c2YpX19YLCAwLCAwLCAwLCAwKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9icm9hZGNhc3RzZF9wZChfX20xMjhkIF9fYSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3YyZGYpX19hLCAoX192MmRmKV9fYSwgMCwgMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9icm9hZGNhc3Rzc19wcyhfX20xMjggX19YKQoreworICByZXR1cm4gKF9fbTI1NilfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcigoX192NHNmKV9fWCwgKF9fdjRzZilfX1gsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2Jyb2FkY2FzdHNkX3BkKF9fbTEyOGQgX19YKQoreworICByZXR1cm4gKF9fbTI1NmQpX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjJkZilfX1gsIChfX3YyZGYpX19YLCAwLCAwLCAwLCAwKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9icm9hZGNhc3RzaTEyOF9zaTI1NihfX20xMjhpIF9fWCkKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3YyZGkpX19YLCAoX192MmRpKV9fWCwgMCwgMSwgMCwgMSk7Cit9CisKKyNkZWZpbmUgX21tX2JsZW5kX2VwaTMyKFYxLCBWMiwgTSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhpKV9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3Y0c2kpKF9fbTEyOGkpKFYxKSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzaSkoX19tMTI4aSkoVjIpLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChNKSAmIDB4MDEpID8gNCA6IDApLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKE0pICYgMHgwMikgPyA1IDogMSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoTSkgJiAweDA0KSA/IDYgOiAyKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChNKSAmIDB4MDgpID8gNyA6IDMpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfYmxlbmRfZXBpMzIoVjEsIFYyLCBNKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmkpX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjhzaSkoX19tMjU2aSkoVjEpLCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzaSkoX19tMjU2aSkoVjIpLCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoTSkgJiAweDAxKSA/ICA4IDogMCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoTSkgJiAweDAyKSA/ICA5IDogMSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoTSkgJiAweDA0KSA/IDEwIDogMiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoTSkgJiAweDA4KSA/IDExIDogMyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoTSkgJiAweDEwKSA/IDEyIDogNCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoTSkgJiAweDIwKSA/IDEzIDogNSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoTSkgJiAweDQwKSA/IDE0IDogNiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoTSkgJiAweDgwKSA/IDE1IDogNykpOyB9KQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2Jyb2FkY2FzdGJfZXBpOChfX20xMjhpIF9fWCkKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3YxNnFpKV9fWCwgKF9fdjE2cWkpX19YLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9icm9hZGNhc3R3X2VwaTE2KF9fbTEyOGkgX19YKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjhoaSlfX1gsIChfX3Y4aGkpX19YLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9icm9hZGNhc3RkX2VwaTMyKF9fbTEyOGkgX19YKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjRzaSlfX1gsIChfX3Y0c2kpX19YLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9icm9hZGNhc3RxX2VwaTY0KF9fbTEyOGkgX19YKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjJkaSlfX1gsIChfX3YyZGkpX19YLCAwLCAwLCAwLCAwKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9icm9hZGNhc3RiX2VwaTgoX19tMTI4aSBfX1gpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcigoX192MTZxaSlfX1gsIChfX3YxNnFpKV9fWCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fYnJvYWRjYXN0d19lcGkxNihfX20xMjhpIF9fWCkKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3Y4aGkpX19YLCAoX192OGhpKV9fWCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCk7Cit9CisKKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9icm9hZGNhc3RkX2VwaTMyKF9fbTEyOGkgX19YKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjRzaSlfX1gsIChfX3Y0c2kpX19YLCAwLCAwLCAwLCAwKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9icm9hZGNhc3RxX2VwaTY0KF9fbTEyOGkgX19YKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjJkaSlfX1gsIChfX3YyZGkpX19YLCAwLCAwKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9wZXJtdXRldmFyOHgzMl9lcGkzMihfX20yNTZpIF9fYSwgX19tMjU2aSBfX2IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wZXJtdmFyc2kyNTYoKF9fdjhzaSlfX2EsIChfX3Y4c2kpX19iKTsKK30KKworI2RlZmluZSBfbW0yNTZfcGVybXV0ZTR4NjRfcGQoViwgTSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTZkKV9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3Y0ZGYpKF9fbTI1NmQpKFYpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGYpX21tMjU2X3VuZGVmaW5lZF9wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTSkgPj4gMCkgJiAweDMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNKSA+PiAyKSAmIDB4MywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE0pID4+IDQpICYgMHgzLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTSkgPj4gNikgJiAweDMpOyB9KQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfcGVybXV0ZXZhcjh4MzJfcHMoX19tMjU2IF9fYSwgX19tMjU2aSBfX2IpCit7CisgIHJldHVybiAoX19tMjU2KV9fYnVpbHRpbl9pYTMyX3Blcm12YXJzZjI1NigoX192OHNmKV9fYSwgKF9fdjhzaSlfX2IpOworfQorCisjZGVmaW5lIF9tbTI1Nl9wZXJtdXRlNHg2NF9lcGk2NChWLCBNKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmkpX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjRkaSkoX19tMjU2aSkoViksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkaSlfbW0yNTZfdW5kZWZpbmVkX3NpMjU2KCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNKSA+PiAwKSAmIDB4MywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE0pID4+IDIpICYgMHgzLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTSkgPj4gNCkgJiAweDMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNKSA+PiA2KSAmIDB4Myk7IH0pCisKKyNkZWZpbmUgX21tMjU2X3Blcm11dGUyeDEyOF9zaTI1NihWMSwgVjIsIE0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wZXJtdGkyNTYoKF9fbTI1NmkpKFYxKSwgKF9fbTI1NmkpKFYyKSwgKE0pKTsgfSkKKworI2RlZmluZSBfbW0yNTZfZXh0cmFjdGkxMjhfc2kyNTYoViwgTSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhpKV9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3Y0ZGkpKF9fbTI1NmkpKFYpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGkpX21tMjU2X3VuZGVmaW5lZF9zaTI1NigpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKE0pICYgMSkgPyAyIDogMCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoTSkgJiAxKSA/IDMgOiAxKSApOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9pbnNlcnRpMTI4X3NpMjU2KFYxLCBWMiwgTSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTZpKV9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3Y0ZGkpKF9fbTI1NmkpKFYxKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRpKV9tbTI1Nl9jYXN0c2kxMjhfc2kyNTYoKF9fbTEyOGkpKFYyKSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoTSkgJiAxKSA/IDAgOiA0KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChNKSAmIDEpID8gMSA6IDUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKE0pICYgMSkgPyA0IDogMiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoTSkgJiAxKSA/IDUgOiAzKSApOyB9KQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tsb2FkX2VwaTMyKGludCBjb25zdCAqX19YLCBfX20yNTZpIF9fTSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX21hc2tsb2FkZDI1NigoY29uc3QgX192OHNpICopX19YLCAoX192OHNpKV9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza2xvYWRfZXBpNjQobG9uZyBsb25nIGNvbnN0ICpfX1gsIF9fbTI1NmkgX19NKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfbWFza2xvYWRxMjU2KChjb25zdCBfX3Y0ZGkgKilfX1gsIChfX3Y0ZGkpX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrbG9hZF9lcGkzMihpbnQgY29uc3QgKl9fWCwgX19tMTI4aSBfX00pCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9tYXNrbG9hZGQoKGNvbnN0IF9fdjRzaSAqKV9fWCwgKF9fdjRzaSlfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tsb2FkX2VwaTY0KGxvbmcgbG9uZyBjb25zdCAqX19YLCBfX20xMjhpIF9fTSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX21hc2tsb2FkcSgoY29uc3QgX192MmRpICopX19YLCAoX192MmRpKV9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3N0b3JlX2VwaTMyKGludCAqX19YLCBfX20yNTZpIF9fTSwgX19tMjU2aSBfX1kpCit7CisgIF9fYnVpbHRpbl9pYTMyX21hc2tzdG9yZWQyNTYoKF9fdjhzaSAqKV9fWCwgKF9fdjhzaSlfX00sIChfX3Y4c2kpX19ZKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrc3RvcmVfZXBpNjQobG9uZyBsb25nICpfX1gsIF9fbTI1NmkgX19NLCBfX20yNTZpIF9fWSkKK3sKKyAgX19idWlsdGluX2lhMzJfbWFza3N0b3JlcTI1NigoX192NGRpICopX19YLCAoX192NGRpKV9fTSwgKF9fdjRkaSlfX1kpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tzdG9yZV9lcGkzMihpbnQgKl9fWCwgX19tMTI4aSBfX00sIF9fbTEyOGkgX19ZKQoreworICBfX2J1aWx0aW5faWEzMl9tYXNrc3RvcmVkKChfX3Y0c2kgKilfX1gsIChfX3Y0c2kpX19NLCAoX192NHNpKV9fWSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3N0b3JlX2VwaTY0KGxvbmcgbG9uZyAqX19YLCBfX20xMjhpIF9fTSwgX19tMTI4aSBfX1kpCit7CisgIF9fYnVpbHRpbl9pYTMyX21hc2tzdG9yZXEoKCBfX3YyZGkgKilfX1gsIChfX3YyZGkpX19NLCAoX192MmRpKV9fWSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfc2xsdl9lcGkzMihfX20yNTZpIF9fWCwgX19tMjU2aSBfX1kpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wc2xsdjhzaSgoX192OHNpKV9fWCwgKF9fdjhzaSlfX1kpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3NsbHZfZXBpMzIoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHNsbHY0c2koKF9fdjRzaSlfX1gsIChfX3Y0c2kpX19ZKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9zbGx2X2VwaTY0KF9fbTI1NmkgX19YLCBfX20yNTZpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BzbGx2NGRpKChfX3Y0ZGkpX19YLCAoX192NGRpKV9fWSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc2xsdl9lcGk2NChfX20xMjhpIF9fWCwgX19tMTI4aSBfX1kpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc2xsdjJkaSgoX192MmRpKV9fWCwgKF9fdjJkaSlfX1kpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3NyYXZfZXBpMzIoX19tMjU2aSBfX1gsIF9fbTI1NmkgX19ZKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHNyYXY4c2koKF9fdjhzaSlfX1gsIChfX3Y4c2kpX19ZKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zcmF2X2VwaTMyKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BzcmF2NHNpKChfX3Y0c2kpX19YLCAoX192NHNpKV9fWSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfc3Jsdl9lcGkzMihfX20yNTZpIF9fWCwgX19tMjU2aSBfX1kpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wc3JsdjhzaSgoX192OHNpKV9fWCwgKF9fdjhzaSlfX1kpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3NybHZfZXBpMzIoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHNybHY0c2koKF9fdjRzaSlfX1gsIChfX3Y0c2kpX19ZKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9zcmx2X2VwaTY0KF9fbTI1NmkgX19YLCBfX20yNTZpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3Bzcmx2NGRpKChfX3Y0ZGkpX19YLCAoX192NGRpKV9fWSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc3Jsdl9lcGk2NChfX20xMjhpIF9fWCwgX19tMTI4aSBfX1kpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc3JsdjJkaSgoX192MmRpKV9fWCwgKF9fdjJkaSlfX1kpOworfQorCisjZGVmaW5lIF9tbV9tYXNrX2kzMmdhdGhlcl9wZChhLCBtLCBpLCBtYXNrLCBzKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGQpX19idWlsdGluX2lhMzJfZ2F0aGVyZF9wZCgoX192MmRmKShfX20xMjhpKShhKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkb3VibGUgY29uc3QgKikobSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNpKShfX20xMjhpKShpKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fbTEyOGQpKG1hc2spLCAocykpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9tYXNrX2kzMmdhdGhlcl9wZChhLCBtLCBpLCBtYXNrLCBzKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmQpX19idWlsdGluX2lhMzJfZ2F0aGVyZF9wZDI1NigoX192NGRmKShfX20yNTZkKShhKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkb3VibGUgY29uc3QgKikobSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNpKShfX20xMjhpKShpKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGYpKF9fbTI1NmQpKG1hc2spLCAocykpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrX2k2NGdhdGhlcl9wZChhLCBtLCBpLCBtYXNrLCBzKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGQpX19idWlsdGluX2lhMzJfZ2F0aGVycV9wZCgoX192MmRmKShfX20xMjhkKShhKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkb3VibGUgY29uc3QgKikobSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRpKShfX20xMjhpKShpKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fbTEyOGQpKG1hc2spLCAocykpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9tYXNrX2k2NGdhdGhlcl9wZChhLCBtLCBpLCBtYXNrLCBzKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmQpX19idWlsdGluX2lhMzJfZ2F0aGVycV9wZDI1NigoX192NGRmKShfX20yNTZkKShhKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkb3VibGUgY29uc3QgKikobSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRpKShfX20yNTZpKShpKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGYpKF9fbTI1NmQpKG1hc2spLCAocykpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrX2kzMmdhdGhlcl9wcyhhLCBtLCBpLCBtYXNrLCBzKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOClfX2J1aWx0aW5faWEzMl9nYXRoZXJkX3BzKChfX3Y0c2YpKF9fbTEyOCkoYSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCBjb25zdCAqKShtKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzaSkoX19tMTI4aSkoaSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpKF9fbTEyOCkobWFzayksIChzKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21hc2tfaTMyZ2F0aGVyX3BzKGEsIG0sIGksIG1hc2ssIHMpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2KV9fYnVpbHRpbl9pYTMyX2dhdGhlcmRfcHMyNTYoKF9fdjhzZikoX19tMjU2KShhKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0IGNvbnN0ICopKG0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNpKShfX20yNTZpKShpKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzZikoX19tMjU2KShtYXNrKSwgKHMpKTsgfSkKKworI2RlZmluZSBfbW1fbWFza19pNjRnYXRoZXJfcHMoYSwgbSwgaSwgbWFzaywgcykgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfZ2F0aGVycV9wcygoX192NHNmKShfX20xMjgpKGEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQgY29uc3QgKikobSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGkpKF9fbTEyOGkpKGkpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKShfX20xMjgpKG1hc2spLCAocykpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9tYXNrX2k2NGdhdGhlcl9wcyhhLCBtLCBpLCBtYXNrLCBzKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOClfX2J1aWx0aW5faWEzMl9nYXRoZXJxX3BzMjU2KChfX3Y0c2YpKF9fbTEyOCkoYSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCBjb25zdCAqKShtKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkaSkoX19tMjU2aSkoaSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpKF9fbTEyOCkobWFzayksIChzKSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2tfaTMyZ2F0aGVyX2VwaTMyKGEsIG0sIGksIG1hc2ssIHMpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9nYXRoZXJkX2QoKF9fdjRzaSkoX19tMTI4aSkoYSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQgY29uc3QgKikobSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2kpKF9fbTEyOGkpKGkpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNpKShfX20xMjhpKShtYXNrKSwgKHMpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfbWFza19pMzJnYXRoZXJfZXBpMzIoYSwgbSwgaSwgbWFzaywgcykgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX2dhdGhlcmRfZDI1NigoX192OHNpKShfX20yNTZpKShhKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCBjb25zdCAqKShtKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzaSkoX19tMjU2aSkoaSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2kpKF9fbTI1NmkpKG1hc2spLCAocykpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrX2k2NGdhdGhlcl9lcGkzMihhLCBtLCBpLCBtYXNrLCBzKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGkpX19idWlsdGluX2lhMzJfZ2F0aGVycV9kKChfX3Y0c2kpKF9fbTEyOGkpKGEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50IGNvbnN0ICopKG0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRpKShfX20xMjhpKShpKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzaSkoX19tMTI4aSkobWFzayksIChzKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21hc2tfaTY0Z2F0aGVyX2VwaTMyKGEsIG0sIGksIG1hc2ssIHMpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9nYXRoZXJxX2QyNTYoKF9fdjRzaSkoX19tMTI4aSkoYSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQgY29uc3QgKikobSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGkpKF9fbTI1NmkpKGkpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNpKShfX20xMjhpKShtYXNrKSwgKHMpKTsgfSkKKworI2RlZmluZSBfbW1fbWFza19pMzJnYXRoZXJfZXBpNjQoYSwgbSwgaSwgbWFzaywgcykgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX2dhdGhlcmRfcSgoX192MmRpKShfX20xMjhpKShhKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyBjb25zdCAqKShtKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzaSkoX19tMTI4aSkoaSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGkpKF9fbTEyOGkpKG1hc2spLCAocykpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9tYXNrX2kzMmdhdGhlcl9lcGk2NChhLCBtLCBpLCBtYXNrLCBzKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmkpX19idWlsdGluX2lhMzJfZ2F0aGVyZF9xMjU2KChfX3Y0ZGkpKF9fbTI1NmkpKGEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nIGNvbnN0ICopKG0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNpKShfX20xMjhpKShpKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkaSkoX19tMjU2aSkobWFzayksIChzKSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2tfaTY0Z2F0aGVyX2VwaTY0KGEsIG0sIGksIG1hc2ssIHMpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9nYXRoZXJxX3EoKF9fdjJkaSkoX19tMTI4aSkoYSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcgY29uc3QgKikobSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGkpKF9fbTEyOGkpKGkpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRpKShfX20xMjhpKShtYXNrKSwgKHMpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfbWFza19pNjRnYXRoZXJfZXBpNjQoYSwgbSwgaSwgbWFzaywgcykgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX2dhdGhlcnFfcTI1NigoX192NGRpKShfX20yNTZpKShhKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyBjb25zdCAqKShtKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkaSkoX19tMjU2aSkoaSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGkpKF9fbTI1NmkpKG1hc2spLCAocykpOyB9KQorCisjZGVmaW5lIF9tbV9pMzJnYXRoZXJfcGQobSwgaSwgcykgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2dhdGhlcmRfcGQoKF9fdjJkZilfbW1fdW5kZWZpbmVkX3BkKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlIGNvbnN0ICopKG0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzaSkoX19tMTI4aSkoaSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKV9tbV9jbXBlcV9wZChfbW1fc2V0emVyb19wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21tX3NldHplcm9fcGQoKSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocykpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9pMzJnYXRoZXJfcGQobSwgaSwgcykgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTZkKV9fYnVpbHRpbl9pYTMyX2dhdGhlcmRfcGQyNTYoKF9fdjRkZilfbW0yNTZfdW5kZWZpbmVkX3BkKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlIGNvbnN0ICopKG0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzaSkoX19tMTI4aSkoaSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRmKV9tbTI1Nl9jbXBfcGQoX21tMjU2X3NldHplcm9fcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DTVBfRVFfT1EpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMpKTsgfSkKKworI2RlZmluZSBfbW1faTY0Z2F0aGVyX3BkKG0sIGksIHMpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9nYXRoZXJxX3BkKChfX3YyZGYpX21tX3VuZGVmaW5lZF9wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSBjb25zdCAqKShtKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGkpKF9fbTEyOGkpKGkpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZilfbW1fY21wZXFfcGQoX21tX3NldHplcm9fcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3BkKCkpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfaTY0Z2F0aGVyX3BkKG0sIGksIHMpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2ZClfX2J1aWx0aW5faWEzMl9nYXRoZXJxX3BkMjU2KChfX3Y0ZGYpX21tMjU2X3VuZGVmaW5lZF9wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSBjb25zdCAqKShtKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGkpKF9fbTI1NmkpKGkpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkZilfbW0yNTZfY21wX3BkKF9tbTI1Nl9zZXR6ZXJvX3BkKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ01QX0VRX09RKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzKSk7IH0pCisKKyNkZWZpbmUgX21tX2kzMmdhdGhlcl9wcyhtLCBpLCBzKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOClfX2J1aWx0aW5faWEzMl9nYXRoZXJkX3BzKChfX3Y0c2YpX21tX3VuZGVmaW5lZF9wcygpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQgY29uc3QgKikobSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2kpKF9fbTEyOGkpKGkpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKV9tbV9jbXBlcV9wcyhfbW1fc2V0emVyb19wcygpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbW1fc2V0emVyb19wcygpKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfaTMyZ2F0aGVyX3BzKG0sIGksIHMpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2KV9fYnVpbHRpbl9pYTMyX2dhdGhlcmRfcHMyNTYoKF9fdjhzZilfbW0yNTZfdW5kZWZpbmVkX3BzKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCBjb25zdCAqKShtKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzaSkoX19tMjU2aSkoaSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2YpX21tMjU2X2NtcF9wcyhfbW0yNTZfc2V0emVyb19wcygpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fcHMoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DTVBfRVFfT1EpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocykpOyB9KQorCisjZGVmaW5lIF9tbV9pNjRnYXRoZXJfcHMobSwgaSwgcykgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfZ2F0aGVycV9wcygoX192NHNmKV9tbV91bmRlZmluZWRfcHMoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0IGNvbnN0ICopKG0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRpKShfX20xMjhpKShpKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZilfbW1fY21wZXFfcHMoX21tX3NldHplcm9fcHMoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21tX3NldHplcm9fcHMoKSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X2k2NGdhdGhlcl9wcyhtLCBpLCBzKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOClfX2J1aWx0aW5faWEzMl9nYXRoZXJxX3BzMjU2KChfX3Y0c2YpX21tX3VuZGVmaW5lZF9wcygpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQgY29uc3QgKikobSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGkpKF9fbTI1NmkpKGkpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKV9tbV9jbXBlcV9wcyhfbW1fc2V0emVyb19wcygpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbW1fc2V0emVyb19wcygpKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMpKTsgfSkKKworI2RlZmluZSBfbW1faTMyZ2F0aGVyX2VwaTMyKG0sIGksIHMpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9nYXRoZXJkX2QoKF9fdjRzaSlfbW1fdW5kZWZpbmVkX3NpMTI4KCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQgY29uc3QgKikobSksIChfX3Y0c2kpKF9fbTEyOGkpKGkpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNpKV9tbV9zZXQxX2VwaTMyKC0xKSwgKHMpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfaTMyZ2F0aGVyX2VwaTMyKG0sIGksIHMpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9nYXRoZXJkX2QyNTYoKF9fdjhzaSlfbW0yNTZfdW5kZWZpbmVkX3NpMjU2KCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQgY29uc3QgKikobSksIChfX3Y4c2kpKF9fbTI1NmkpKGkpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNpKV9tbTI1Nl9zZXQxX2VwaTMyKC0xKSwgKHMpKTsgfSkKKworI2RlZmluZSBfbW1faTY0Z2F0aGVyX2VwaTMyKG0sIGksIHMpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9nYXRoZXJxX2QoKF9fdjRzaSlfbW1fdW5kZWZpbmVkX3NpMTI4KCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQgY29uc3QgKikobSksIChfX3YyZGkpKF9fbTEyOGkpKGkpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNpKV9tbV9zZXQxX2VwaTMyKC0xKSwgKHMpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfaTY0Z2F0aGVyX2VwaTMyKG0sIGksIHMpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9nYXRoZXJxX2QyNTYoKF9fdjRzaSlfbW1fdW5kZWZpbmVkX3NpMTI4KCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQgY29uc3QgKikobSksIChfX3Y0ZGkpKF9fbTI1NmkpKGkpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNpKV9tbV9zZXQxX2VwaTMyKC0xKSwgKHMpKTsgfSkKKworI2RlZmluZSBfbW1faTMyZ2F0aGVyX2VwaTY0KG0sIGksIHMpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9nYXRoZXJkX3EoKF9fdjJkaSlfbW1fdW5kZWZpbmVkX3NpMTI4KCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcgY29uc3QgKikobSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2kpKF9fbTEyOGkpKGkpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRpKV9tbV9zZXQxX2VwaTY0eCgtMSksIChzKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X2kzMmdhdGhlcl9lcGk2NChtLCBpLCBzKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmkpX19idWlsdGluX2lhMzJfZ2F0aGVyZF9xMjU2KChfX3Y0ZGkpX21tMjU2X3VuZGVmaW5lZF9zaTI1NigpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nIGNvbnN0ICopKG0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNpKShfX20xMjhpKShpKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkaSlfbW0yNTZfc2V0MV9lcGk2NHgoLTEpLCAocykpOyB9KQorCisjZGVmaW5lIF9tbV9pNjRnYXRoZXJfZXBpNjQobSwgaSwgcykgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX2dhdGhlcnFfcSgoX192MmRpKV9tbV91bmRlZmluZWRfc2kxMjgoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyBjb25zdCAqKShtKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkaSkoX19tMTI4aSkoaSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGkpX21tX3NldDFfZXBpNjR4KC0xKSwgKHMpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfaTY0Z2F0aGVyX2VwaTY0KG0sIGksIHMpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9nYXRoZXJxX3EyNTYoKF9fdjRkaSlfbW0yNTZfdW5kZWZpbmVkX3NpMjU2KCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcgY29uc3QgKikobSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGkpKF9fbTI1NmkpKGkpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRpKV9tbTI1Nl9zZXQxX2VwaTY0eCgtMSksIChzKSk7IH0pCisKKyN1bmRlZiBfX0RFRkFVTFRfRk5fQVRUUlMKKworI2VuZGlmIC8qIF9fQVZYMklOVFJJTl9IICovCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9hdng1MTJid2ludHJpbi5oIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvYXZ4NTEyYndpbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2M1YTZjCi0tLSAvZGV2L251bGwKKysrIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvYXZ4NTEyYndpbnRyaW4uaApAQCAtMCwwICsxLDI0MTAgQEAKKy8qPT09LS0tLS0tLS0tLS0tLSBhdng1MTJid2ludHJpbi5oIC0gQVZYNTEyQlcgaW50cmluc2ljcyAtLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICoKKyAqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqLworI2lmbmRlZiBfX0lNTUlOVFJJTl9ICisjZXJyb3IgIk5ldmVyIHVzZSA8YXZ4NTEyYndpbnRyaW4uaD4gZGlyZWN0bHk7IGluY2x1ZGUgPGltbWludHJpbi5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9fQVZYNTEyQldJTlRSSU5fSAorI2RlZmluZSBfX0FWWDUxMkJXSU5UUklOX0gKKwordHlwZWRlZiB1bnNpZ25lZCBpbnQgX19tbWFzazMyOwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgX19tbWFzazY0OworCisvKiBEZWZpbmUgdGhlIGRlZmF1bHQgYXR0cmlidXRlcyBmb3IgdGhlIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUuICovCisjZGVmaW5lIF9fREVGQVVMVF9GTl9BVFRSUyBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18sIF9fdGFyZ2V0X18oImF2eDUxMmJ3IikpKQorCitzdGF0aWMgIF9faW5saW5lIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfc2V0emVyb19xaSh2b2lkKSB7CisgIHJldHVybiAoX19tNTEyaSkoX192NjRxaSl7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsKK30KKworc3RhdGljICBfX2lubGluZSBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX3NldHplcm9faGkodm9pZCkgeworICByZXR1cm4gKF9fbTUxMmkpKF9fdjMyaGkpeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH07Cit9CisKKy8qIEludGVnZXIgY29tcGFyZSAqLworCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfY21wZXFfZXBpOF9tYXNrKF9fbTUxMmkgX19hLCBfX201MTJpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s2NClfX2J1aWx0aW5faWEzMl9wY21wZXFiNTEyX21hc2soKF9fdjY0cWkpX19hLCAoX192NjRxaSlfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazY0KS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfY21wZXFfZXBpOF9tYXNrKF9fbW1hc2s2NCBfX3UsIF9fbTUxMmkgX19hLCBfX201MTJpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s2NClfX2J1aWx0aW5faWEzMl9wY21wZXFiNTEyX21hc2soKF9fdjY0cWkpX19hLCAoX192NjRxaSlfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfY21wZXFfZXB1OF9tYXNrKF9fbTUxMmkgX19hLCBfX201MTJpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s2NClfX2J1aWx0aW5faWEzMl91Y21wYjUxMl9tYXNrKChfX3Y2NHFpKV9fYSwgKF9fdjY0cWkpX19iLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrNjQpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19jbXBlcV9lcHU4X21hc2soX19tbWFzazY0IF9fdSwgX19tNTEyaSBfX2EsIF9fbTUxMmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazY0KV9fYnVpbHRpbl9pYTMyX3VjbXBiNTEyX21hc2soKF9fdjY0cWkpX19hLCAoX192NjRxaSlfX2IsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazMyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2NtcGVxX2VwaTE2X21hc2soX19tNTEyaSBfX2EsIF9fbTUxMmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazMyKV9fYnVpbHRpbl9pYTMyX3BjbXBlcXc1MTJfbWFzaygoX192MzJoaSlfX2EsIChfX3YzMmhpKV9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMzIpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMzIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19jbXBlcV9lcGkxNl9tYXNrKF9fbW1hc2szMiBfX3UsIF9fbTUxMmkgX19hLCBfX201MTJpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2szMilfX2J1aWx0aW5faWEzMl9wY21wZXF3NTEyX21hc2soKF9fdjMyaGkpX19hLCAoX192MzJoaSlfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMzIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfY21wZXFfZXB1MTZfbWFzayhfX201MTJpIF9fYSwgX19tNTEyaSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrMzIpX19idWlsdGluX2lhMzJfdWNtcHc1MTJfbWFzaygoX192MzJoaSlfX2EsIChfX3YzMmhpKV9fYiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazMyKS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazMyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfY21wZXFfZXB1MTZfbWFzayhfX21tYXNrMzIgX191LCBfX201MTJpIF9fYSwgX19tNTEyaSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrMzIpX19idWlsdGluX2lhMzJfdWNtcHc1MTJfbWFzaygoX192MzJoaSlfX2EsIChfX3YzMmhpKV9fYiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfY21wZ2VfZXBpOF9tYXNrKF9fbTUxMmkgX19hLCBfX201MTJpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s2NClfX2J1aWx0aW5faWEzMl9jbXBiNTEyX21hc2soKF9fdjY0cWkpX19hLCAoX192NjRxaSlfX2IsIDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazY0KS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfY21wZ2VfZXBpOF9tYXNrKF9fbW1hc2s2NCBfX3UsIF9fbTUxMmkgX19hLCBfX201MTJpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s2NClfX2J1aWx0aW5faWEzMl9jbXBiNTEyX21hc2soKF9fdjY0cWkpX19hLCAoX192NjRxaSlfX2IsIDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfY21wZ2VfZXB1OF9tYXNrKF9fbTUxMmkgX19hLCBfX201MTJpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s2NClfX2J1aWx0aW5faWEzMl91Y21wYjUxMl9tYXNrKChfX3Y2NHFpKV9fYSwgKF9fdjY0cWkpX19iLCA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrNjQpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19jbXBnZV9lcHU4X21hc2soX19tbWFzazY0IF9fdSwgX19tNTEyaSBfX2EsIF9fbTUxMmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazY0KV9fYnVpbHRpbl9pYTMyX3VjbXBiNTEyX21hc2soKF9fdjY0cWkpX19hLCAoX192NjRxaSlfX2IsIDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazMyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2NtcGdlX2VwaTE2X21hc2soX19tNTEyaSBfX2EsIF9fbTUxMmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazMyKV9fYnVpbHRpbl9pYTMyX2NtcHc1MTJfbWFzaygoX192MzJoaSlfX2EsIChfX3YzMmhpKV9fYiwgNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMzIpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMzIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19jbXBnZV9lcGkxNl9tYXNrKF9fbW1hc2szMiBfX3UsIF9fbTUxMmkgX19hLCBfX201MTJpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2szMilfX2J1aWx0aW5faWEzMl9jbXB3NTEyX21hc2soKF9fdjMyaGkpX19hLCAoX192MzJoaSlfX2IsIDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMzIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfY21wZ2VfZXB1MTZfbWFzayhfX201MTJpIF9fYSwgX19tNTEyaSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrMzIpX19idWlsdGluX2lhMzJfdWNtcHc1MTJfbWFzaygoX192MzJoaSlfX2EsIChfX3YzMmhpKV9fYiwgNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazMyKS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazMyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfY21wZ2VfZXB1MTZfbWFzayhfX21tYXNrMzIgX191LCBfX201MTJpIF9fYSwgX19tNTEyaSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrMzIpX19idWlsdGluX2lhMzJfdWNtcHc1MTJfbWFzaygoX192MzJoaSlfX2EsIChfX3YzMmhpKV9fYiwgNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfY21wZ3RfZXBpOF9tYXNrKF9fbTUxMmkgX19hLCBfX201MTJpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s2NClfX2J1aWx0aW5faWEzMl9wY21wZ3RiNTEyX21hc2soKF9fdjY0cWkpX19hLCAoX192NjRxaSlfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazY0KS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfY21wZ3RfZXBpOF9tYXNrKF9fbW1hc2s2NCBfX3UsIF9fbTUxMmkgX19hLCBfX201MTJpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s2NClfX2J1aWx0aW5faWEzMl9wY21wZ3RiNTEyX21hc2soKF9fdjY0cWkpX19hLCAoX192NjRxaSlfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfY21wZ3RfZXB1OF9tYXNrKF9fbTUxMmkgX19hLCBfX201MTJpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s2NClfX2J1aWx0aW5faWEzMl91Y21wYjUxMl9tYXNrKChfX3Y2NHFpKV9fYSwgKF9fdjY0cWkpX19iLCA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrNjQpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19jbXBndF9lcHU4X21hc2soX19tbWFzazY0IF9fdSwgX19tNTEyaSBfX2EsIF9fbTUxMmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazY0KV9fYnVpbHRpbl9pYTMyX3VjbXBiNTEyX21hc2soKF9fdjY0cWkpX19hLCAoX192NjRxaSlfX2IsIDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazMyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2NtcGd0X2VwaTE2X21hc2soX19tNTEyaSBfX2EsIF9fbTUxMmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazMyKV9fYnVpbHRpbl9pYTMyX3BjbXBndHc1MTJfbWFzaygoX192MzJoaSlfX2EsIChfX3YzMmhpKV9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMzIpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMzIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19jbXBndF9lcGkxNl9tYXNrKF9fbW1hc2szMiBfX3UsIF9fbTUxMmkgX19hLCBfX201MTJpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2szMilfX2J1aWx0aW5faWEzMl9wY21wZ3R3NTEyX21hc2soKF9fdjMyaGkpX19hLCAoX192MzJoaSlfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMzIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfY21wZ3RfZXB1MTZfbWFzayhfX201MTJpIF9fYSwgX19tNTEyaSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrMzIpX19idWlsdGluX2lhMzJfdWNtcHc1MTJfbWFzaygoX192MzJoaSlfX2EsIChfX3YzMmhpKV9fYiwgNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazMyKS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazMyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfY21wZ3RfZXB1MTZfbWFzayhfX21tYXNrMzIgX191LCBfX201MTJpIF9fYSwgX19tNTEyaSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrMzIpX19idWlsdGluX2lhMzJfdWNtcHc1MTJfbWFzaygoX192MzJoaSlfX2EsIChfX3YzMmhpKV9fYiwgNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfY21wbGVfZXBpOF9tYXNrKF9fbTUxMmkgX19hLCBfX201MTJpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s2NClfX2J1aWx0aW5faWEzMl9jbXBiNTEyX21hc2soKF9fdjY0cWkpX19hLCAoX192NjRxaSlfX2IsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazY0KS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfY21wbGVfZXBpOF9tYXNrKF9fbW1hc2s2NCBfX3UsIF9fbTUxMmkgX19hLCBfX201MTJpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s2NClfX2J1aWx0aW5faWEzMl9jbXBiNTEyX21hc2soKF9fdjY0cWkpX19hLCAoX192NjRxaSlfX2IsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfY21wbGVfZXB1OF9tYXNrKF9fbTUxMmkgX19hLCBfX201MTJpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s2NClfX2J1aWx0aW5faWEzMl91Y21wYjUxMl9tYXNrKChfX3Y2NHFpKV9fYSwgKF9fdjY0cWkpX19iLCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrNjQpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19jbXBsZV9lcHU4X21hc2soX19tbWFzazY0IF9fdSwgX19tNTEyaSBfX2EsIF9fbTUxMmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazY0KV9fYnVpbHRpbl9pYTMyX3VjbXBiNTEyX21hc2soKF9fdjY0cWkpX19hLCAoX192NjRxaSlfX2IsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazMyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2NtcGxlX2VwaTE2X21hc2soX19tNTEyaSBfX2EsIF9fbTUxMmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazMyKV9fYnVpbHRpbl9pYTMyX2NtcHc1MTJfbWFzaygoX192MzJoaSlfX2EsIChfX3YzMmhpKV9fYiwgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMzIpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMzIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19jbXBsZV9lcGkxNl9tYXNrKF9fbW1hc2szMiBfX3UsIF9fbTUxMmkgX19hLCBfX201MTJpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2szMilfX2J1aWx0aW5faWEzMl9jbXB3NTEyX21hc2soKF9fdjMyaGkpX19hLCAoX192MzJoaSlfX2IsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMzIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfY21wbGVfZXB1MTZfbWFzayhfX201MTJpIF9fYSwgX19tNTEyaSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrMzIpX19idWlsdGluX2lhMzJfdWNtcHc1MTJfbWFzaygoX192MzJoaSlfX2EsIChfX3YzMmhpKV9fYiwgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazMyKS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazMyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfY21wbGVfZXB1MTZfbWFzayhfX21tYXNrMzIgX191LCBfX201MTJpIF9fYSwgX19tNTEyaSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrMzIpX19idWlsdGluX2lhMzJfdWNtcHc1MTJfbWFzaygoX192MzJoaSlfX2EsIChfX3YzMmhpKV9fYiwgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfY21wbHRfZXBpOF9tYXNrKF9fbTUxMmkgX19hLCBfX201MTJpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s2NClfX2J1aWx0aW5faWEzMl9jbXBiNTEyX21hc2soKF9fdjY0cWkpX19hLCAoX192NjRxaSlfX2IsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazY0KS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfY21wbHRfZXBpOF9tYXNrKF9fbW1hc2s2NCBfX3UsIF9fbTUxMmkgX19hLCBfX201MTJpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s2NClfX2J1aWx0aW5faWEzMl9jbXBiNTEyX21hc2soKF9fdjY0cWkpX19hLCAoX192NjRxaSlfX2IsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfY21wbHRfZXB1OF9tYXNrKF9fbTUxMmkgX19hLCBfX201MTJpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s2NClfX2J1aWx0aW5faWEzMl91Y21wYjUxMl9tYXNrKChfX3Y2NHFpKV9fYSwgKF9fdjY0cWkpX19iLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrNjQpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19jbXBsdF9lcHU4X21hc2soX19tbWFzazY0IF9fdSwgX19tNTEyaSBfX2EsIF9fbTUxMmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazY0KV9fYnVpbHRpbl9pYTMyX3VjbXBiNTEyX21hc2soKF9fdjY0cWkpX19hLCAoX192NjRxaSlfX2IsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazMyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2NtcGx0X2VwaTE2X21hc2soX19tNTEyaSBfX2EsIF9fbTUxMmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazMyKV9fYnVpbHRpbl9pYTMyX2NtcHc1MTJfbWFzaygoX192MzJoaSlfX2EsIChfX3YzMmhpKV9fYiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMzIpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMzIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19jbXBsdF9lcGkxNl9tYXNrKF9fbW1hc2szMiBfX3UsIF9fbTUxMmkgX19hLCBfX201MTJpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2szMilfX2J1aWx0aW5faWEzMl9jbXB3NTEyX21hc2soKF9fdjMyaGkpX19hLCAoX192MzJoaSlfX2IsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMzIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfY21wbHRfZXB1MTZfbWFzayhfX201MTJpIF9fYSwgX19tNTEyaSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrMzIpX19idWlsdGluX2lhMzJfdWNtcHc1MTJfbWFzaygoX192MzJoaSlfX2EsIChfX3YzMmhpKV9fYiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazMyKS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazMyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfY21wbHRfZXB1MTZfbWFzayhfX21tYXNrMzIgX191LCBfX201MTJpIF9fYSwgX19tNTEyaSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrMzIpX19idWlsdGluX2lhMzJfdWNtcHc1MTJfbWFzaygoX192MzJoaSlfX2EsIChfX3YzMmhpKV9fYiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfY21wbmVxX2VwaThfbWFzayhfX201MTJpIF9fYSwgX19tNTEyaSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrNjQpX19idWlsdGluX2lhMzJfY21wYjUxMl9tYXNrKChfX3Y2NHFpKV9fYSwgKF9fdjY0cWkpX19iLCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s2NCktMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s2NCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2NtcG5lcV9lcGk4X21hc2soX19tbWFzazY0IF9fdSwgX19tNTEyaSBfX2EsIF9fbTUxMmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazY0KV9fYnVpbHRpbl9pYTMyX2NtcGI1MTJfbWFzaygoX192NjRxaSlfX2EsIChfX3Y2NHFpKV9fYiwgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s2NCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9jbXBuZXFfZXB1OF9tYXNrKF9fbTUxMmkgX19hLCBfX201MTJpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s2NClfX2J1aWx0aW5faWEzMl91Y21wYjUxMl9tYXNrKChfX3Y2NHFpKV9fYSwgKF9fdjY0cWkpX19iLCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrNjQpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19jbXBuZXFfZXB1OF9tYXNrKF9fbW1hc2s2NCBfX3UsIF9fbTUxMmkgX19hLCBfX201MTJpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s2NClfX2J1aWx0aW5faWEzMl91Y21wYjUxMl9tYXNrKChfX3Y2NHFpKV9fYSwgKF9fdjY0cWkpX19iLCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2szMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9jbXBuZXFfZXBpMTZfbWFzayhfX201MTJpIF9fYSwgX19tNTEyaSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrMzIpX19idWlsdGluX2lhMzJfY21wdzUxMl9tYXNrKChfX3YzMmhpKV9fYSwgKF9fdjMyaGkpX19iLCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2szMiktMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2szMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2NtcG5lcV9lcGkxNl9tYXNrKF9fbW1hc2szMiBfX3UsIF9fbTUxMmkgX19hLCBfX201MTJpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2szMilfX2J1aWx0aW5faWEzMl9jbXB3NTEyX21hc2soKF9fdjMyaGkpX19hLCAoX192MzJoaSlfX2IsIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMzIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfY21wbmVxX2VwdTE2X21hc2soX19tNTEyaSBfX2EsIF9fbTUxMmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazMyKV9fYnVpbHRpbl9pYTMyX3VjbXB3NTEyX21hc2soKF9fdjMyaGkpX19hLCAoX192MzJoaSlfX2IsIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2szMiktMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2szMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2NtcG5lcV9lcHUxNl9tYXNrKF9fbW1hc2szMiBfX3UsIF9fbTUxMmkgX19hLCBfX201MTJpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2szMilfX2J1aWx0aW5faWEzMl91Y21wdzUxMl9tYXNrKChfX3YzMmhpKV9fYSwgKF9fdjMyaGkpX19iLCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfYWRkX2VwaTggKF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikgeworICByZXR1cm4gKF9fbTUxMmkpICgoX192NjRxdSkgX19BICsgKF9fdjY0cXUpIF9fQik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19hZGRfZXBpOCAoX19tNTEyaSBfX1csIF9fbW1hc2s2NCBfX1UsIF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikgeworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BhZGRiNTEyX21hc2sgKChfX3Y2NHFpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjY0cWkpIF9fQiwKKyAgICAgICAgICAgICAoX192NjRxaSkgX19XLAorICAgICAgICAgICAgIChfX21tYXNrNjQpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfYWRkX2VwaTggKF9fbW1hc2s2NCBfX1UsIF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikgeworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BhZGRiNTEyX21hc2sgKChfX3Y2NHFpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjY0cWkpIF9fQiwKKyAgICAgICAgICAgICAoX192NjRxaSkgX21tNTEyX3NldHplcm9fcWkoKSwKKyAgICAgICAgICAgICAoX19tbWFzazY0KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX3N1Yl9lcGk4IChfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpIHsKKyAgcmV0dXJuIChfX201MTJpKSAoKF9fdjY0cXUpIF9fQSAtIChfX3Y2NHF1KSBfX0IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfc3ViX2VwaTggKF9fbTUxMmkgX19XLCBfX21tYXNrNjQgX19VLCBfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpIHsKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wc3ViYjUxMl9tYXNrICgoX192NjRxaSkgX19BLAorICAgICAgICAgICAgIChfX3Y2NHFpKSBfX0IsCisgICAgICAgICAgICAgKF9fdjY0cWkpIF9fVywKKyAgICAgICAgICAgICAoX19tbWFzazY0KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X3N1Yl9lcGk4IChfX21tYXNrNjQgX19VLCBfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpIHsKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wc3ViYjUxMl9tYXNrICgoX192NjRxaSkgX19BLAorICAgICAgICAgICAgIChfX3Y2NHFpKSBfX0IsCisgICAgICAgICAgICAgKF9fdjY0cWkpIF9tbTUxMl9zZXR6ZXJvX3FpKCksCisgICAgICAgICAgICAgKF9fbW1hc2s2NCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9hZGRfZXBpMTYgKF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikgeworICByZXR1cm4gKF9fbTUxMmkpICgoX192MzJodSkgX19BICsgKF9fdjMyaHUpIF9fQik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19hZGRfZXBpMTYgKF9fbTUxMmkgX19XLCBfX21tYXNrMzIgX19VLCBfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpIHsKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wYWRkdzUxMl9tYXNrICgoX192MzJoaSkgX19BLAorICAgICAgICAgICAgIChfX3YzMmhpKSBfX0IsCisgICAgICAgICAgICAgKF9fdjMyaGkpIF9fVywKKyAgICAgICAgICAgICAoX19tbWFzazMyKSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X2FkZF9lcGkxNiAoX19tbWFzazMyIF9fVSwgX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKSB7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcGFkZHc1MTJfbWFzayAoKF9fdjMyaGkpIF9fQSwKKyAgICAgICAgICAgICAoX192MzJoaSkgX19CLAorICAgICAgICAgICAgIChfX3YzMmhpKSBfbW01MTJfc2V0emVyb19oaSgpLAorICAgICAgICAgICAgIChfX21tYXNrMzIpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfc3ViX2VwaTE2IChfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpIHsKKyAgcmV0dXJuIChfX201MTJpKSAoKF9fdjMyaHUpIF9fQSAtIChfX3YzMmh1KSBfX0IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfc3ViX2VwaTE2IChfX201MTJpIF9fVywgX19tbWFzazMyIF9fVSwgX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKSB7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcHN1Ync1MTJfbWFzayAoKF9fdjMyaGkpIF9fQSwKKyAgICAgICAgICAgICAoX192MzJoaSkgX19CLAorICAgICAgICAgICAgIChfX3YzMmhpKSBfX1csCisgICAgICAgICAgICAgKF9fbW1hc2szMikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9zdWJfZXBpMTYgKF9fbW1hc2szMiBfX1UsIF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikgeworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BzdWJ3NTEyX21hc2sgKChfX3YzMmhpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjMyaGkpIF9fQiwKKyAgICAgICAgICAgICAoX192MzJoaSkgX21tNTEyX3NldHplcm9faGkoKSwKKyAgICAgICAgICAgICAoX19tbWFzazMyKSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX211bGxvX2VwaTE2IChfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpIHsKKyAgcmV0dXJuIChfX201MTJpKSAoKF9fdjMyaHUpIF9fQSAqIChfX3YzMmh1KSBfX0IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfbXVsbG9fZXBpMTYgKF9fbTUxMmkgX19XLCBfX21tYXNrMzIgX19VLCBfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpIHsKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbXVsbHc1MTJfbWFzayAoKF9fdjMyaGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjMyaGkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjMyaGkpIF9fVywKKyAgICAgICAgICAgICAgKF9fbW1hc2szMikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9tdWxsb19lcGkxNiAoX19tbWFzazMyIF9fVSwgX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKSB7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcG11bGx3NTEyX21hc2sgKChfX3YzMmhpKSBfX0EsCisgICAgICAgICAgICAgIChfX3YzMmhpKSBfX0IsCisgICAgICAgICAgICAgIChfX3YzMmhpKSBfbW01MTJfc2V0emVyb19oaSgpLAorICAgICAgICAgICAgICAoX19tbWFzazMyKSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfYmxlbmRfZXBpOCAoX19tbWFzazY0IF9fVSwgX19tNTEyaSBfX0EsIF9fbTUxMmkgX19XKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3NlbGVjdGJfNTEyICgoX19tbWFzazY0KSBfX1UsCisgICAgICAgICAgICAgIChfX3Y2NHFpKSBfX1csCisgICAgICAgICAgICAgIChfX3Y2NHFpKSBfX0EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfYmxlbmRfZXBpMTYgKF9fbW1hc2szMiBfX1UsIF9fbTUxMmkgX19BLCBfX201MTJpIF9fVykKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9zZWxlY3R3XzUxMiAoKF9fbW1hc2szMikgX19VLAorICAgICAgICAgICAgICAoX192MzJoaSkgX19XLAorICAgICAgICAgICAgICAoX192MzJoaSkgX19BKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9hYnNfZXBpOCAoX19tNTEyaSBfX0EpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcGFic2I1MTJfbWFzayAoKF9fdjY0cWkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjY0cWkpIF9tbTUxMl9zZXR6ZXJvX3FpKCksCisgICAgICAgICAgICAgIChfX21tYXNrNjQpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2Fic19lcGk4IChfX201MTJpIF9fVywgX19tbWFzazY0IF9fVSwgX19tNTEyaSBfX0EpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcGFic2I1MTJfbWFzayAoKF9fdjY0cWkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjY0cWkpIF9fVywKKyAgICAgICAgICAgICAgKF9fbW1hc2s2NCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9hYnNfZXBpOCAoX19tbWFzazY0IF9fVSwgX19tNTEyaSBfX0EpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcGFic2I1MTJfbWFzayAoKF9fdjY0cWkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjY0cWkpIF9tbTUxMl9zZXR6ZXJvX3FpKCksCisgICAgICAgICAgICAgIChfX21tYXNrNjQpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfYWJzX2VwaTE2IChfX201MTJpIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wYWJzdzUxMl9tYXNrICgoX192MzJoaSkgX19BLAorICAgICAgICAgICAgICAoX192MzJoaSkgX21tNTEyX3NldHplcm9faGkoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2szMikgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfYWJzX2VwaTE2IChfX201MTJpIF9fVywgX19tbWFzazMyIF9fVSwgX19tNTEyaSBfX0EpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcGFic3c1MTJfbWFzayAoKF9fdjMyaGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjMyaGkpIF9fVywKKyAgICAgICAgICAgICAgKF9fbW1hc2szMikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9hYnNfZXBpMTYgKF9fbW1hc2szMiBfX1UsIF9fbTUxMmkgX19BKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BhYnN3NTEyX21hc2sgKChfX3YzMmhpKSBfX0EsCisgICAgICAgICAgICAgIChfX3YzMmhpKSBfbW01MTJfc2V0emVyb19oaSgpLAorICAgICAgICAgICAgICAoX19tbWFzazMyKSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX3BhY2tzX2VwaTMyIChfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcGFja3NzZHc1MTJfbWFzayAoKF9fdjE2c2kpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjE2c2kpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjMyaGkpIF9tbTUxMl9zZXR6ZXJvX2hpKCksCisgICAgICAgICAgICAgIChfX21tYXNrMzIpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9wYWNrc19lcGkzMiAoX19tbWFzazMyIF9fTSwgX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BhY2tzc2R3NTEyX21hc2sgKChfX3YxNnNpKSBfX0EsCisgICAgICAgICAgICAgIChfX3YxNnNpKSBfX0IsCisgICAgICAgICAgICAgIChfX3YzMmhpKSBfbW01MTJfc2V0emVyb19oaSgpLAorICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfcGFja3NfZXBpMzIgKF9fbTUxMmkgX19XLCBfX21tYXNrMzIgX19NLCBfX201MTJpIF9fQSwKKyAgICAgICBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wYWNrc3NkdzUxMl9tYXNrICgoX192MTZzaSkgX19BLAorICAgICAgICAgICAgICAoX192MTZzaSkgX19CLAorICAgICAgICAgICAgICAoX192MzJoaSkgX19XLAorICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX3BhY2tzX2VwaTE2IChfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcGFja3Nzd2I1MTJfbWFzayAoKF9fdjMyaGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjMyaGkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjY0cWkpIF9tbTUxMl9zZXR6ZXJvX3FpKCksCisgICAgICAgICAgICAgIChfX21tYXNrNjQpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX3BhY2tzX2VwaTE2IChfX201MTJpIF9fVywgX19tbWFzazY0IF9fTSwgX19tNTEyaSBfX0EsCisgICAgICAgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcGFja3Nzd2I1MTJfbWFzayAoKF9fdjMyaGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjMyaGkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjY0cWkpIF9fVywKKyAgICAgICAgICAgICAgKF9fbW1hc2s2NCkgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9wYWNrc19lcGkxNiAoX19tbWFzazY0IF9fTSwgX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BhY2tzc3diNTEyX21hc2sgKChfX3YzMmhpKSBfX0EsCisgICAgICAgICAgICAgIChfX3YzMmhpKSBfX0IsCisgICAgICAgICAgICAgIChfX3Y2NHFpKSBfbW01MTJfc2V0emVyb19xaSgpLAorICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX3BhY2t1c19lcGkzMiAoX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BhY2t1c2R3NTEyX21hc2sgKChfX3YxNnNpKSBfX0EsCisgICAgICAgICAgICAgIChfX3YxNnNpKSBfX0IsCisgICAgICAgICAgICAgIChfX3YzMmhpKSBfbW01MTJfc2V0emVyb19oaSgpLAorICAgICAgICAgICAgICAoX19tbWFzazMyKSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfcGFja3VzX2VwaTMyIChfX21tYXNrMzIgX19NLCBfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcGFja3VzZHc1MTJfbWFzayAoKF9fdjE2c2kpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjE2c2kpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjMyaGkpIF9tbTUxMl9zZXR6ZXJvX2hpKCksCisgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19wYWNrdXNfZXBpMzIgKF9fbTUxMmkgX19XLCBfX21tYXNrMzIgX19NLCBfX201MTJpIF9fQSwKKyAgICAgICAgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcGFja3VzZHc1MTJfbWFzayAoKF9fdjE2c2kpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjE2c2kpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjMyaGkpIF9fVywKKyAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9wYWNrdXNfZXBpMTYgKF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wYWNrdXN3YjUxMl9tYXNrICgoX192MzJoaSkgX19BLAorICAgICAgICAgICAgICAoX192MzJoaSkgX19CLAorICAgICAgICAgICAgICAoX192NjRxaSkgX21tNTEyX3NldHplcm9fcWkoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2s2NCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfcGFja3VzX2VwaTE2IChfX201MTJpIF9fVywgX19tbWFzazY0IF9fTSwgX19tNTEyaSBfX0EsCisgICAgICAgIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BhY2t1c3diNTEyX21hc2sgKChfX3YzMmhpKSBfX0EsCisgICAgICAgICAgICAgIChfX3YzMmhpKSBfX0IsCisgICAgICAgICAgICAgIChfX3Y2NHFpKSBfX1csCisgICAgICAgICAgICAgIChfX21tYXNrNjQpIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfcGFja3VzX2VwaTE2IChfX21tYXNrNjQgX19NLCBfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcGFja3Vzd2I1MTJfbWFzayAoKF9fdjMyaGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjMyaGkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjY0cWkpIF9tbTUxMl9zZXR6ZXJvX3FpKCksCisgICAgICAgICAgICAgIChfX21tYXNrNjQpIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfYWRkc19lcGk4IChfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcGFkZHNiNTEyX21hc2sgKChfX3Y2NHFpKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y2NHFpKSBfX0IsCisgICAgICAgICAgICAgIChfX3Y2NHFpKSBfbW01MTJfc2V0emVyb19xaSgpLAorICAgICAgICAgICAgICAoX19tbWFzazY0KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19hZGRzX2VwaTggKF9fbTUxMmkgX19XLCBfX21tYXNrNjQgX19VLCBfX201MTJpIF9fQSwKKyAgICAgICAgICAgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcGFkZHNiNTEyX21hc2sgKChfX3Y2NHFpKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y2NHFpKSBfX0IsCisgICAgICAgICAgICAgIChfX3Y2NHFpKSBfX1csCisgICAgICAgICAgICAgIChfX21tYXNrNjQpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfYWRkc19lcGk4IChfX21tYXNrNjQgX19VLCBfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcGFkZHNiNTEyX21hc2sgKChfX3Y2NHFpKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y2NHFpKSBfX0IsCisgICAgICAgICAgICAgIChfX3Y2NHFpKSBfbW01MTJfc2V0emVyb19xaSgpLAorICAgICAgICAgICAgICAoX19tbWFzazY0KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2FkZHNfZXBpMTYgKF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wYWRkc3c1MTJfbWFzayAoKF9fdjMyaGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjMyaGkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjMyaGkpIF9tbTUxMl9zZXR6ZXJvX2hpKCksCisgICAgICAgICAgICAgIChfX21tYXNrMzIpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2FkZHNfZXBpMTYgKF9fbTUxMmkgX19XLCBfX21tYXNrMzIgX19VLCBfX201MTJpIF9fQSwKKyAgICAgIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BhZGRzdzUxMl9tYXNrICgoX192MzJoaSkgX19BLAorICAgICAgICAgICAgICAoX192MzJoaSkgX19CLAorICAgICAgICAgICAgICAoX192MzJoaSkgX19XLAorICAgICAgICAgICAgICAoX19tbWFzazMyKSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X2FkZHNfZXBpMTYgKF9fbW1hc2szMiBfX1UsIF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wYWRkc3c1MTJfbWFzayAoKF9fdjMyaGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjMyaGkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjMyaGkpIF9tbTUxMl9zZXR6ZXJvX2hpKCksCisgICAgICAgICAgICAgIChfX21tYXNrMzIpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfYWRkc19lcHU4IChfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcGFkZHVzYjUxMl9tYXNrICgoX192NjRxaSkgX19BLAorICAgICAgICAgICAgICAoX192NjRxaSkgX19CLAorICAgICAgICAgICAgICAoX192NjRxaSkgX21tNTEyX3NldHplcm9fcWkoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2s2NCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfYWRkc19lcHU4IChfX201MTJpIF9fVywgX19tbWFzazY0IF9fVSwgX19tNTEyaSBfX0EsCisgICAgICAgICAgIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BhZGR1c2I1MTJfbWFzayAoKF9fdjY0cWkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjY0cWkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjY0cWkpIF9fVywKKyAgICAgICAgICAgICAgKF9fbW1hc2s2NCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9hZGRzX2VwdTggKF9fbW1hc2s2NCBfX1UsIF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wYWRkdXNiNTEyX21hc2sgKChfX3Y2NHFpKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y2NHFpKSBfX0IsCisgICAgICAgICAgICAgIChfX3Y2NHFpKSBfbW01MTJfc2V0emVyb19xaSgpLAorICAgICAgICAgICAgICAoX19tbWFzazY0KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2FkZHNfZXB1MTYgKF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wYWRkdXN3NTEyX21hc2sgKChfX3YzMmhpKSBfX0EsCisgICAgICAgICAgICAgIChfX3YzMmhpKSBfX0IsCisgICAgICAgICAgICAgIChfX3YzMmhpKSBfbW01MTJfc2V0emVyb19oaSgpLAorICAgICAgICAgICAgICAoX19tbWFzazMyKSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19hZGRzX2VwdTE2IChfX201MTJpIF9fVywgX19tbWFzazMyIF9fVSwgX19tNTEyaSBfX0EsCisgICAgICBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wYWRkdXN3NTEyX21hc2sgKChfX3YzMmhpKSBfX0EsCisgICAgICAgICAgICAgIChfX3YzMmhpKSBfX0IsCisgICAgICAgICAgICAgIChfX3YzMmhpKSBfX1csCisgICAgICAgICAgICAgIChfX21tYXNrMzIpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfYWRkc19lcHUxNiAoX19tbWFzazMyIF9fVSwgX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BhZGR1c3c1MTJfbWFzayAoKF9fdjMyaGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjMyaGkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjMyaGkpIF9tbTUxMl9zZXR6ZXJvX2hpKCksCisgICAgICAgICAgICAgIChfX21tYXNrMzIpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfYXZnX2VwdTggKF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wYXZnYjUxMl9tYXNrICgoX192NjRxaSkgX19BLAorICAgICAgICAgICAgICAoX192NjRxaSkgX19CLAorICAgICAgICAgICAgICAoX192NjRxaSkgX21tNTEyX3NldHplcm9fcWkoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2s2NCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfYXZnX2VwdTggKF9fbTUxMmkgX19XLCBfX21tYXNrNjQgX19VLCBfX201MTJpIF9fQSwKKyAgICAgICAgICBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wYXZnYjUxMl9tYXNrICgoX192NjRxaSkgX19BLAorICAgICAgICAgICAgICAoX192NjRxaSkgX19CLAorICAgICAgICAgICAgICAoX192NjRxaSkgX19XLAorICAgICAgICAgICAgICAoX19tbWFzazY0KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X2F2Z19lcHU4IChfX21tYXNrNjQgX19VLCBfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcGF2Z2I1MTJfbWFzayAoKF9fdjY0cWkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjY0cWkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjY0cWkpIF9tbTUxMl9zZXR6ZXJvX3FpKCksCisgICAgICAgICAgICAgIChfX21tYXNrNjQpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfYXZnX2VwdTE2IChfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcGF2Z3c1MTJfbWFzayAoKF9fdjMyaGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjMyaGkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjMyaGkpIF9tbTUxMl9zZXR6ZXJvX2hpKCksCisgICAgICAgICAgICAgIChfX21tYXNrMzIpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2F2Z19lcHUxNiAoX19tNTEyaSBfX1csIF9fbW1hc2szMiBfX1UsIF9fbTUxMmkgX19BLAorICAgICAgICAgICBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wYXZndzUxMl9tYXNrICgoX192MzJoaSkgX19BLAorICAgICAgICAgICAgICAoX192MzJoaSkgX19CLAorICAgICAgICAgICAgICAoX192MzJoaSkgX19XLAorICAgICAgICAgICAgICAoX19tbWFzazMyKSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X2F2Z19lcHUxNiAoX19tbWFzazMyIF9fVSwgX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3Bhdmd3NTEyX21hc2sgKChfX3YzMmhpKSBfX0EsCisgICAgICAgICAgICAgIChfX3YzMmhpKSBfX0IsCisgICAgICAgICAgICAgIChfX3YzMmhpKSBfbW01MTJfc2V0emVyb19oaSgpLAorICAgICAgICAgICAgICAoX19tbWFzazMyKSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21heF9lcGk4IChfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcG1heHNiNTEyX21hc2sgKChfX3Y2NHFpKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y2NHFpKSBfX0IsCisgICAgICAgICAgICAgIChfX3Y2NHFpKSBfbW01MTJfc2V0emVyb19xaSgpLAorICAgICAgICAgICAgICAoX19tbWFzazY0KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfbWF4X2VwaTggKF9fbW1hc2s2NCBfX00sIF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbWF4c2I1MTJfbWFzayAoKF9fdjY0cWkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjY0cWkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjY0cWkpIF9tbTUxMl9zZXR6ZXJvX3FpKCksCisgICAgICAgICAgICAgIChfX21tYXNrNjQpIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19tYXhfZXBpOCAoX19tNTEyaSBfX1csIF9fbW1hc2s2NCBfX00sIF9fbTUxMmkgX19BLAorICAgICAgICAgIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BtYXhzYjUxMl9tYXNrICgoX192NjRxaSkgX19BLAorICAgICAgICAgICAgICAoX192NjRxaSkgX19CLAorICAgICAgICAgICAgICAoX192NjRxaSkgX19XLAorICAgICAgICAgICAgICAoX19tbWFzazY0KSBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21heF9lcGkxNiAoX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BtYXhzdzUxMl9tYXNrICgoX192MzJoaSkgX19BLAorICAgICAgICAgICAgICAoX192MzJoaSkgX19CLAorICAgICAgICAgICAgICAoX192MzJoaSkgX21tNTEyX3NldHplcm9faGkoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2szMikgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X21heF9lcGkxNiAoX19tbWFzazMyIF9fTSwgX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BtYXhzdzUxMl9tYXNrICgoX192MzJoaSkgX19BLAorICAgICAgICAgICAgICAoX192MzJoaSkgX19CLAorICAgICAgICAgICAgICAoX192MzJoaSkgX21tNTEyX3NldHplcm9faGkoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2szMikgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX21heF9lcGkxNiAoX19tNTEyaSBfX1csIF9fbW1hc2szMiBfX00sIF9fbTUxMmkgX19BLAorICAgICAgICAgICBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbWF4c3c1MTJfbWFzayAoKF9fdjMyaGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjMyaGkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjMyaGkpIF9fVywKKyAgICAgICAgICAgICAgKF9fbW1hc2szMikgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXhfZXB1OCAoX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BtYXh1YjUxMl9tYXNrICgoX192NjRxaSkgX19BLAorICAgICAgICAgICAgICAoX192NjRxaSkgX19CLAorICAgICAgICAgICAgICAoX192NjRxaSkgX21tNTEyX3NldHplcm9fcWkoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2s2NCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X21heF9lcHU4IChfX21tYXNrNjQgX19NLCBfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcG1heHViNTEyX21hc2sgKChfX3Y2NHFpKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y2NHFpKSBfX0IsCisgICAgICAgICAgICAgIChfX3Y2NHFpKSBfbW01MTJfc2V0emVyb19xaSgpLAorICAgICAgICAgICAgICAoX19tbWFzazY0KSBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfbWF4X2VwdTggKF9fbTUxMmkgX19XLCBfX21tYXNrNjQgX19NLCBfX201MTJpIF9fQSwKKyAgICAgICAgICBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbWF4dWI1MTJfbWFzayAoKF9fdjY0cWkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjY0cWkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjY0cWkpIF9fVywKKyAgICAgICAgICAgICAgKF9fbW1hc2s2NCkgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXhfZXB1MTYgKF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbWF4dXc1MTJfbWFzayAoKF9fdjMyaGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjMyaGkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjMyaGkpIF9tbTUxMl9zZXR6ZXJvX2hpKCksCisgICAgICAgICAgICAgIChfX21tYXNrMzIpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9tYXhfZXB1MTYgKF9fbW1hc2szMiBfX00sIF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbWF4dXc1MTJfbWFzayAoKF9fdjMyaGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjMyaGkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjMyaGkpIF9tbTUxMl9zZXR6ZXJvX2hpKCksCisgICAgICAgICAgICAgIChfX21tYXNrMzIpIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19tYXhfZXB1MTYgKF9fbTUxMmkgX19XLCBfX21tYXNrMzIgX19NLCBfX201MTJpIF9fQSwKKyAgICAgICAgICAgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcG1heHV3NTEyX21hc2sgKChfX3YzMmhpKSBfX0EsCisgICAgICAgICAgICAgIChfX3YzMmhpKSBfX0IsCisgICAgICAgICAgICAgIChfX3YzMmhpKSBfX1csCisgICAgICAgICAgICAgIChfX21tYXNrMzIpIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWluX2VwaTggKF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbWluc2I1MTJfbWFzayAoKF9fdjY0cWkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjY0cWkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjY0cWkpIF9tbTUxMl9zZXR6ZXJvX3FpKCksCisgICAgICAgICAgICAgIChfX21tYXNrNjQpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9taW5fZXBpOCAoX19tbWFzazY0IF9fTSwgX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BtaW5zYjUxMl9tYXNrICgoX192NjRxaSkgX19BLAorICAgICAgICAgICAgICAoX192NjRxaSkgX19CLAorICAgICAgICAgICAgICAoX192NjRxaSkgX21tNTEyX3NldHplcm9fcWkoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2s2NCkgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX21pbl9lcGk4IChfX201MTJpIF9fVywgX19tbWFzazY0IF9fTSwgX19tNTEyaSBfX0EsCisgICAgICAgICAgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcG1pbnNiNTEyX21hc2sgKChfX3Y2NHFpKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y2NHFpKSBfX0IsCisgICAgICAgICAgICAgIChfX3Y2NHFpKSBfX1csCisgICAgICAgICAgICAgIChfX21tYXNrNjQpIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWluX2VwaTE2IChfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcG1pbnN3NTEyX21hc2sgKChfX3YzMmhpKSBfX0EsCisgICAgICAgICAgICAgIChfX3YzMmhpKSBfX0IsCisgICAgICAgICAgICAgIChfX3YzMmhpKSBfbW01MTJfc2V0emVyb19oaSgpLAorICAgICAgICAgICAgICAoX19tbWFzazMyKSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfbWluX2VwaTE2IChfX21tYXNrMzIgX19NLCBfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcG1pbnN3NTEyX21hc2sgKChfX3YzMmhpKSBfX0EsCisgICAgICAgICAgICAgIChfX3YzMmhpKSBfX0IsCisgICAgICAgICAgICAgIChfX3YzMmhpKSBfbW01MTJfc2V0emVyb19oaSgpLAorICAgICAgICAgICAgICAoX19tbWFzazMyKSBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfbWluX2VwaTE2IChfX201MTJpIF9fVywgX19tbWFzazMyIF9fTSwgX19tNTEyaSBfX0EsCisgICAgICAgICAgIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BtaW5zdzUxMl9tYXNrICgoX192MzJoaSkgX19BLAorICAgICAgICAgICAgICAoX192MzJoaSkgX19CLAorICAgICAgICAgICAgICAoX192MzJoaSkgX19XLAorICAgICAgICAgICAgICAoX19tbWFzazMyKSBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21pbl9lcHU4IChfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcG1pbnViNTEyX21hc2sgKChfX3Y2NHFpKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y2NHFpKSBfX0IsCisgICAgICAgICAgICAgIChfX3Y2NHFpKSBfbW01MTJfc2V0emVyb19xaSgpLAorICAgICAgICAgICAgICAoX19tbWFzazY0KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfbWluX2VwdTggKF9fbW1hc2s2NCBfX00sIF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbWludWI1MTJfbWFzayAoKF9fdjY0cWkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjY0cWkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjY0cWkpIF9tbTUxMl9zZXR6ZXJvX3FpKCksCisgICAgICAgICAgICAgIChfX21tYXNrNjQpIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19taW5fZXB1OCAoX19tNTEyaSBfX1csIF9fbW1hc2s2NCBfX00sIF9fbTUxMmkgX19BLAorICAgICAgICAgIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BtaW51YjUxMl9tYXNrICgoX192NjRxaSkgX19BLAorICAgICAgICAgICAgICAoX192NjRxaSkgX19CLAorICAgICAgICAgICAgICAoX192NjRxaSkgX19XLAorICAgICAgICAgICAgICAoX19tbWFzazY0KSBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21pbl9lcHUxNiAoX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BtaW51dzUxMl9tYXNrICgoX192MzJoaSkgX19BLAorICAgICAgICAgICAgICAoX192MzJoaSkgX19CLAorICAgICAgICAgICAgICAoX192MzJoaSkgX21tNTEyX3NldHplcm9faGkoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2szMikgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X21pbl9lcHUxNiAoX19tbWFzazMyIF9fTSwgX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BtaW51dzUxMl9tYXNrICgoX192MzJoaSkgX19BLAorICAgICAgICAgICAgICAoX192MzJoaSkgX19CLAorICAgICAgICAgICAgICAoX192MzJoaSkgX21tNTEyX3NldHplcm9faGkoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2szMikgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX21pbl9lcHUxNiAoX19tNTEyaSBfX1csIF9fbW1hc2szMiBfX00sIF9fbTUxMmkgX19BLAorICAgICAgICAgICBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbWludXc1MTJfbWFzayAoKF9fdjMyaGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjMyaGkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjMyaGkpIF9fVywKKyAgICAgICAgICAgICAgKF9fbW1hc2szMikgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9zaHVmZmxlX2VwaTggKF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wc2h1ZmI1MTJfbWFzayAoKF9fdjY0cWkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjY0cWkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjY0cWkpIF9tbTUxMl9zZXR6ZXJvX3FpKCksCisgICAgICAgICAgICAgIChfX21tYXNrNjQpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX3NodWZmbGVfZXBpOCAoX19tNTEyaSBfX1csIF9fbW1hc2s2NCBfX1UsIF9fbTUxMmkgX19BLAorICAgICAgICBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wc2h1ZmI1MTJfbWFzayAoKF9fdjY0cWkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjY0cWkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjY0cWkpIF9fVywKKyAgICAgICAgICAgICAgKF9fbW1hc2s2NCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9zaHVmZmxlX2VwaTggKF9fbW1hc2s2NCBfX1UsIF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wc2h1ZmI1MTJfbWFzayAoKF9fdjY0cWkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjY0cWkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjY0cWkpIF9tbTUxMl9zZXR6ZXJvX3FpKCksCisgICAgICAgICAgICAgIChfX21tYXNrNjQpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfc3Vic19lcGk4IChfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcHN1YnNiNTEyX21hc2sgKChfX3Y2NHFpKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y2NHFpKSBfX0IsCisgICAgICAgICAgICAgIChfX3Y2NHFpKSBfbW01MTJfc2V0emVyb19xaSgpLAorICAgICAgICAgICAgICAoX19tbWFzazY0KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19zdWJzX2VwaTggKF9fbTUxMmkgX19XLCBfX21tYXNrNjQgX19VLCBfX201MTJpIF9fQSwKKyAgICAgICAgICAgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcHN1YnNiNTEyX21hc2sgKChfX3Y2NHFpKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y2NHFpKSBfX0IsCisgICAgICAgICAgICAgIChfX3Y2NHFpKSBfX1csCisgICAgICAgICAgICAgIChfX21tYXNrNjQpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfc3Vic19lcGk4IChfX21tYXNrNjQgX19VLCBfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcHN1YnNiNTEyX21hc2sgKChfX3Y2NHFpKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y2NHFpKSBfX0IsCisgICAgICAgICAgICAgIChfX3Y2NHFpKSBfbW01MTJfc2V0emVyb19xaSgpLAorICAgICAgICAgICAgICAoX19tbWFzazY0KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX3N1YnNfZXBpMTYgKF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wc3Vic3c1MTJfbWFzayAoKF9fdjMyaGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjMyaGkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjMyaGkpIF9tbTUxMl9zZXR6ZXJvX2hpKCksCisgICAgICAgICAgICAgIChfX21tYXNrMzIpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX3N1YnNfZXBpMTYgKF9fbTUxMmkgX19XLCBfX21tYXNrMzIgX19VLCBfX201MTJpIF9fQSwKKyAgICAgIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BzdWJzdzUxMl9tYXNrICgoX192MzJoaSkgX19BLAorICAgICAgICAgICAgICAoX192MzJoaSkgX19CLAorICAgICAgICAgICAgICAoX192MzJoaSkgX19XLAorICAgICAgICAgICAgICAoX19tbWFzazMyKSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X3N1YnNfZXBpMTYgKF9fbW1hc2szMiBfX1UsIF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wc3Vic3c1MTJfbWFzayAoKF9fdjMyaGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjMyaGkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjMyaGkpIF9tbTUxMl9zZXR6ZXJvX2hpKCksCisgICAgICAgICAgICAgIChfX21tYXNrMzIpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfc3Vic19lcHU4IChfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcHN1YnVzYjUxMl9tYXNrICgoX192NjRxaSkgX19BLAorICAgICAgICAgICAgICAoX192NjRxaSkgX19CLAorICAgICAgICAgICAgICAoX192NjRxaSkgX21tNTEyX3NldHplcm9fcWkoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2s2NCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfc3Vic19lcHU4IChfX201MTJpIF9fVywgX19tbWFzazY0IF9fVSwgX19tNTEyaSBfX0EsCisgICAgICAgICAgIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BzdWJ1c2I1MTJfbWFzayAoKF9fdjY0cWkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjY0cWkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjY0cWkpIF9fVywKKyAgICAgICAgICAgICAgKF9fbW1hc2s2NCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9zdWJzX2VwdTggKF9fbW1hc2s2NCBfX1UsIF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wc3VidXNiNTEyX21hc2sgKChfX3Y2NHFpKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y2NHFpKSBfX0IsCisgICAgICAgICAgICAgIChfX3Y2NHFpKSBfbW01MTJfc2V0emVyb19xaSgpLAorICAgICAgICAgICAgICAoX19tbWFzazY0KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX3N1YnNfZXB1MTYgKF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wc3VidXN3NTEyX21hc2sgKChfX3YzMmhpKSBfX0EsCisgICAgICAgICAgICAgIChfX3YzMmhpKSBfX0IsCisgICAgICAgICAgICAgIChfX3YzMmhpKSBfbW01MTJfc2V0emVyb19oaSgpLAorICAgICAgICAgICAgICAoX19tbWFzazMyKSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19zdWJzX2VwdTE2IChfX201MTJpIF9fVywgX19tbWFzazMyIF9fVSwgX19tNTEyaSBfX0EsCisgICAgICBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wc3VidXN3NTEyX21hc2sgKChfX3YzMmhpKSBfX0EsCisgICAgICAgICAgICAgIChfX3YzMmhpKSBfX0IsCisgICAgICAgICAgICAgIChfX3YzMmhpKSBfX1csCisgICAgICAgICAgICAgIChfX21tYXNrMzIpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfc3Vic19lcHUxNiAoX19tbWFzazMyIF9fVSwgX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BzdWJ1c3c1MTJfbWFzayAoKF9fdjMyaGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjMyaGkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjMyaGkpIF9tbTUxMl9zZXR6ZXJvX2hpKCksCisgICAgICAgICAgICAgIChfX21tYXNrMzIpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFzazJfcGVybXV0ZXgydmFyX2VwaTE2IChfX201MTJpIF9fQSwgX19tNTEyaSBfX0ksCisgICAgICAgICBfX21tYXNrMzIgX19VLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl92cGVybWkydmFyaGk1MTJfbWFzayAoKF9fdjMyaGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjMyaGkpIF9fSSAvKiBpZHggKi8gLAorICAgICAgICAgICAgICAoX192MzJoaSkgX19CLAorICAgICAgICAgICAgICAoX19tbWFzazMyKSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX3Blcm11dGV4MnZhcl9lcGkxNiAoX19tNTEyaSBfX0EsIF9fbTUxMmkgX19JLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl92cGVybXQydmFyaGk1MTJfbWFzayAoKF9fdjMyaGkpIF9fSSAvKiBpZHggKi8sCisgICAgICAgICAgICAgIChfX3YzMmhpKSBfX0EsCisgICAgICAgICAgICAgIChfX3YzMmhpKSBfX0IsCisgICAgICAgICAgICAgIChfX21tYXNrMzIpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX3Blcm11dGV4MnZhcl9lcGkxNiAoX19tNTEyaSBfX0EsIF9fbW1hc2szMiBfX1UsCisgICAgICAgIF9fbTUxMmkgX19JLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl92cGVybXQydmFyaGk1MTJfbWFzayAoKF9fdjMyaGkpIF9fSSAvKiBpZHggKi8sCisgICAgICAgICAgICAgIChfX3YzMmhpKSBfX0EsCisgICAgICAgICAgICAgIChfX3YzMmhpKSBfX0IsCisgICAgICAgICAgICAgIChfX21tYXNrMzIpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfcGVybXV0ZXgydmFyX2VwaTE2IChfX21tYXNrMzIgX19VLCBfX201MTJpIF9fQSwKKyAgICAgICAgIF9fbTUxMmkgX19JLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl92cGVybXQydmFyaGk1MTJfbWFza3ogKChfX3YzMmhpKSBfX0kKKyAgICAgICAgICAgICAgLyogaWR4ICovICwKKyAgICAgICAgICAgICAgKF9fdjMyaGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjMyaGkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fbW1hc2szMikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tdWxocnNfZXBpMTYgKF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbXVsaHJzdzUxMl9tYXNrICgoX192MzJoaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3YzMmhpKSBfX0IsCisgICAgICAgICAgICAgICAgKF9fdjMyaGkpIF9tbTUxMl9zZXR6ZXJvX2hpKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2szMikgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfbXVsaHJzX2VwaTE2IChfX201MTJpIF9fVywgX19tbWFzazMyIF9fVSwgX19tNTEyaSBfX0EsCisgICAgICAgIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BtdWxocnN3NTEyX21hc2sgKChfX3YzMmhpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjMyaGkpIF9fQiwKKyAgICAgICAgICAgICAgICAoX192MzJoaSkgX19XLAorICAgICAgICAgICAgICAgIChfX21tYXNrMzIpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfbXVsaHJzX2VwaTE2IChfX21tYXNrMzIgX19VLCBfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcG11bGhyc3c1MTJfbWFzayAoKF9fdjMyaGkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192MzJoaSkgX19CLAorICAgICAgICAgICAgICAgIChfX3YzMmhpKSBfbW01MTJfc2V0emVyb19oaSgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrMzIpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbXVsaGlfZXBpMTYgKF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbXVsaHc1MTJfbWFzayAoKF9fdjMyaGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjMyaGkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjMyaGkpIF9tbTUxMl9zZXR6ZXJvX2hpKCksCisgICAgICAgICAgICAgIChfX21tYXNrMzIpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX211bGhpX2VwaTE2IChfX201MTJpIF9fVywgX19tbWFzazMyIF9fVSwgX19tNTEyaSBfX0EsCisgICAgICAgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcG11bGh3NTEyX21hc2sgKChfX3YzMmhpKSBfX0EsCisgICAgICAgICAgICAgIChfX3YzMmhpKSBfX0IsCisgICAgICAgICAgICAgIChfX3YzMmhpKSBfX1csCisgICAgICAgICAgICAgIChfX21tYXNrMzIpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfbXVsaGlfZXBpMTYgKF9fbW1hc2szMiBfX1UsIF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbXVsaHc1MTJfbWFzayAoKF9fdjMyaGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjMyaGkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjMyaGkpIF9tbTUxMl9zZXR6ZXJvX2hpKCksCisgICAgICAgICAgICAgIChfX21tYXNrMzIpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbXVsaGlfZXB1MTYgKF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbXVsaHV3NTEyX21hc2sgKChfX3YzMmhpKSBfX0EsCisgICAgICAgICAgICAgICAoX192MzJoaSkgX19CLAorICAgICAgICAgICAgICAgKF9fdjMyaGkpIF9tbTUxMl9zZXR6ZXJvX2hpKCksCisgICAgICAgICAgICAgICAoX19tbWFzazMyKSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19tdWxoaV9lcHUxNiAoX19tNTEyaSBfX1csIF9fbW1hc2szMiBfX1UsIF9fbTUxMmkgX19BLAorICAgICAgIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BtdWxodXc1MTJfbWFzayAoKF9fdjMyaGkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3YzMmhpKSBfX0IsCisgICAgICAgICAgICAgICAoX192MzJoaSkgX19XLAorICAgICAgICAgICAgICAgKF9fbW1hc2szMikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9tdWxoaV9lcHUxNiAoX19tbWFzazMyIF9fVSwgX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BtdWxodXc1MTJfbWFzayAoKF9fdjMyaGkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3YzMmhpKSBfX0IsCisgICAgICAgICAgICAgICAoX192MzJoaSkgX21tNTEyX3NldHplcm9faGkoKSwKKyAgICAgICAgICAgICAgIChfX21tYXNrMzIpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFkZHVic19lcGkxNiAoX19tNTEyaSBfX1gsIF9fbTUxMmkgX19ZKSB7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcG1hZGR1YnN3NTEyX21hc2sgKChfX3Y2NHFpKSBfX1gsCisgICAgICAgICAgICAgICAgIChfX3Y2NHFpKSBfX1ksCisgICAgICAgICAgICAgICAgIChfX3YzMmhpKSBfbW01MTJfc2V0emVyb19oaSgpLAorICAgICAgICAgICAgICAgICAoX19tbWFzazMyKSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19tYWRkdWJzX2VwaTE2IChfX201MTJpIF9fVywgX19tbWFzazMyIF9fVSwgX19tNTEyaSBfX1gsCisgICAgICAgICBfX201MTJpIF9fWSkgeworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BtYWRkdWJzdzUxMl9tYXNrICgoX192NjRxaSkgX19YLAorICAgICAgICAgICAgICAgICAoX192NjRxaSkgX19ZLAorICAgICAgICAgICAgICAgICAoX192MzJoaSkgX19XLAorICAgICAgICAgICAgICAgICAoX19tbWFzazMyKSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X21hZGR1YnNfZXBpMTYgKF9fbW1hc2szMiBfX1UsIF9fbTUxMmkgX19YLCBfX201MTJpIF9fWSkgeworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BtYWRkdWJzdzUxMl9tYXNrICgoX192NjRxaSkgX19YLAorICAgICAgICAgICAgICAgICAoX192NjRxaSkgX19ZLAorICAgICAgICAgICAgICAgICAoX192MzJoaSkgX21tNTEyX3NldHplcm9faGkoKSwKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2szMikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYWRkX2VwaTE2IChfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpIHsKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbWFkZHdkNTEyX21hc2sgKChfX3YzMmhpKSBfX0EsCisgICAgICAgICAgICAgICAoX192MzJoaSkgX19CLAorICAgICAgICAgICAgICAgKF9fdjE2c2kpIF9tbTUxMl9zZXR6ZXJvX3NpNTEyKCksCisgICAgICAgICAgICAgICAoX19tbWFzazE2KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19tYWRkX2VwaTE2IChfX201MTJpIF9fVywgX19tbWFzazE2IF9fVSwgX19tNTEyaSBfX0EsCisgICAgICBfX201MTJpIF9fQikgeworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BtYWRkd2Q1MTJfbWFzayAoKF9fdjMyaGkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3YzMmhpKSBfX0IsCisgICAgICAgICAgICAgICAoX192MTZzaSkgX19XLAorICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9tYWRkX2VwaTE2IChfX21tYXNrMTYgX19VLCBfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpIHsKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbWFkZHdkNTEyX21hc2sgKChfX3YzMmhpKSBfX0EsCisgICAgICAgICAgICAgICAoX192MzJoaSkgX19CLAorICAgICAgICAgICAgICAgKF9fdjE2c2kpIF9tbTUxMl9zZXR6ZXJvX3NpNTEyKCksCisgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2N2dHNlcGkxNl9lcGk4IChfX201MTJpIF9fQSkgeworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3Btb3Zzd2I1MTJfbWFzayAoKF9fdjMyaGkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3YzMnFpKV9tbTI1Nl9zZXR6ZXJvX3NpMjU2KCksCisgICAgICAgICAgICAgICAoX19tbWFzazMyKSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19jdnRzZXBpMTZfZXBpOCAoX19tMjU2aSBfX08sIF9fbW1hc2szMiBfX00sIF9fbTUxMmkgX19BKSB7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG1vdnN3YjUxMl9tYXNrICgoX192MzJoaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjMycWkpX19PLAorICAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9jdnRzZXBpMTZfZXBpOCAoX19tbWFzazMyIF9fTSwgX19tNTEyaSBfX0EpIHsKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wbW92c3diNTEyX21hc2sgKChfX3YzMmhpKSBfX0EsCisgICAgICAgICAgICAgICAoX192MzJxaSkgX21tMjU2X3NldHplcm9fc2kyNTYoKSwKKyAgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfY3Z0dXNlcGkxNl9lcGk4IChfX201MTJpIF9fQSkgeworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3Btb3Z1c3diNTEyX21hc2sgKChfX3YzMmhpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjMycWkpIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2KCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2szMikgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfY3Z0dXNlcGkxNl9lcGk4IChfX20yNTZpIF9fTywgX19tbWFzazMyIF9fTSwgX19tNTEyaSBfX0EpIHsKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wbW92dXN3YjUxMl9tYXNrICgoX192MzJoaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3YzMnFpKSBfX08sCisgICAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9jdnR1c2VwaTE2X2VwaTggKF9fbW1hc2szMiBfX00sIF9fbTUxMmkgX19BKSB7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG1vdnVzd2I1MTJfbWFzayAoKF9fdjMyaGkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192MzJxaSkgX21tMjU2X3NldHplcm9fc2kyNTYoKSwKKyAgICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2N2dGVwaTE2X2VwaTggKF9fbTUxMmkgX19BKSB7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG1vdndiNTEyX21hc2sgKChfX3YzMmhpKSBfX0EsCisgICAgICAgICAgICAgIChfX3YzMnFpKSBfbW0yNTZfc2V0emVyb19zaTI1NigpLAorICAgICAgICAgICAgICAoX19tbWFzazMyKSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19jdnRlcGkxNl9lcGk4IChfX20yNTZpIF9fTywgX19tbWFzazMyIF9fTSwgX19tNTEyaSBfX0EpIHsKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wbW92d2I1MTJfbWFzayAoKF9fdjMyaGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjMycWkpIF9fTywKKyAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9jdnRlcGkxNl9lcGk4IChfX21tYXNrMzIgX19NLCBfX201MTJpIF9fQSkgeworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3Btb3Z3YjUxMl9tYXNrICgoX192MzJoaSkgX19BLAorICAgICAgICAgICAgICAoX192MzJxaSkgX21tMjU2X3NldHplcm9fc2kyNTYoKSwKKyAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2N2dGVwaTE2X3N0b3JldV9lcGk4ICh2b2lkICogX19QLCBfX21tYXNrMzIgX19NLCBfX201MTJpIF9fQSkKK3sKKyAgX19idWlsdGluX2lhMzJfcG1vdndiNTEybWVtX21hc2sgKChfX3YzMnFpICopIF9fUCwgKF9fdjMyaGkpIF9fQSwgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2N2dHNlcGkxNl9zdG9yZXVfZXBpOCAodm9pZCAqIF9fUCwgX19tbWFzazMyIF9fTSwgX19tNTEyaSBfX0EpCit7CisgIF9fYnVpbHRpbl9pYTMyX3Btb3Zzd2I1MTJtZW1fbWFzayAoKF9fdjMycWkgKikgX19QLCAoX192MzJoaSkgX19BLCBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfY3Z0dXNlcGkxNl9zdG9yZXVfZXBpOCAodm9pZCAqIF9fUCwgX19tbWFzazMyIF9fTSwgX19tNTEyaSBfX0EpCit7CisgIF9fYnVpbHRpbl9pYTMyX3Btb3Z1c3diNTEybWVtX21hc2sgKChfX3YzMnFpICopIF9fUCwgKF9fdjMyaGkpIF9fQSwgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl91bnBhY2toaV9lcGk4KF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikgeworICByZXR1cm4gKF9fbTUxMmkpX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjY0cWkpX19BLCAoX192NjRxaSlfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LCAgNjQrOCwgICA5LCA2NCs5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAsIDY0KzEwLCAxMSwgNjQrMTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiwgNjQrMTIsIDEzLCA2NCsxMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0LCA2NCsxNCwgMTUsIDY0KzE1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQsIDY0KzI0LCAyNSwgNjQrMjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNiwgNjQrMjYsIDI3LCA2NCsyNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4LCA2NCsyOCwgMjksIDY0KzI5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsIDY0KzMwLCAzMSwgNjQrMzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MCwgNjQrNDAsIDQxLCA2NCs0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQyLCA2NCs0MiwgNDMsIDY0KzQzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQsIDY0KzQ0LCA0NSwgNjQrNDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NiwgNjQrNDYsIDQ3LCA2NCs0NywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU2LCA2NCs1NiwgNTcsIDY0KzU3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTgsIDY0KzU4LCA1OSwgNjQrNTksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2MCwgNjQrNjAsIDYxLCA2NCs2MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYyLCA2NCs2MiwgNjMsIDY0KzYzKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX3VucGFja2hpX2VwaTgoX19tNTEyaSBfX1csIF9fbW1hc2s2NCBfX1UsIF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikgeworICByZXR1cm4gKF9fbTUxMmkpX19idWlsdGluX2lhMzJfc2VsZWN0Yl81MTIoKF9fbW1hc2s2NClfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjY0cWkpX21tNTEyX3VucGFja2hpX2VwaTgoX19BLCBfX0IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y2NHFpKV9fVyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfdW5wYWNraGlfZXBpOChfX21tYXNrNjQgX19VLCBfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpIHsKKyAgcmV0dXJuIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX3NlbGVjdGJfNTEyKChfX21tYXNrNjQpX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y2NHFpKV9tbTUxMl91bnBhY2toaV9lcGk4KF9fQSwgX19CKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NjRxaSlfbW01MTJfc2V0emVyb19xaSgpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl91bnBhY2toaV9lcGkxNihfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpIHsKKyAgcmV0dXJuIChfX201MTJpKV9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3YzMmhpKV9fQSwgKF9fdjMyaGkpX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwgIDMyKzQsICAgNSwgMzIrNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYsICAzMis2LCAgIDcsIDMyKzcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiwgMzIrMTIsIDEzLCAzMisxMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0LCAzMisxNCwgMTUsIDMyKzE1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAsIDMyKzIwLCAyMSwgMzIrMjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMiwgMzIrMjIsIDIzLCAzMisyMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4LCAzMisyOCwgMjksIDMyKzI5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsIDMyKzMwLCAzMSwgMzIrMzEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfdW5wYWNraGlfZXBpMTYoX19tNTEyaSBfX1csIF9fbW1hc2szMiBfX1UsIF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikgeworICByZXR1cm4gKF9fbTUxMmkpX19idWlsdGluX2lhMzJfc2VsZWN0d181MTIoKF9fbW1hc2szMilfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MzJoaSlfbW01MTJfdW5wYWNraGlfZXBpMTYoX19BLCBfX0IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjMyaGkpX19XKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel91bnBhY2toaV9lcGkxNihfX21tYXNrMzIgX19VLCBfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpIHsKKyAgcmV0dXJuIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX3NlbGVjdHdfNTEyKChfX21tYXNrMzIpX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjMyaGkpX21tNTEyX3VucGFja2hpX2VwaTE2KF9fQSwgX19CKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YzMmhpKV9tbTUxMl9zZXR6ZXJvX2hpKCkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX3VucGFja2xvX2VwaTgoX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKSB7CisgIHJldHVybiAoX19tNTEyaSlfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcigoX192NjRxaSlfX0EsIChfX3Y2NHFpKV9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICA2NCswLCAgIDEsIDY0KzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCAgNjQrMiwgICAzLCA2NCszLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwgIDY0KzQsICAgNSwgNjQrNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYsICA2NCs2LCAgIDcsIDY0KzcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiwgNjQrMTYsIDE3LCA2NCsxNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4LCA2NCsxOCwgMTksIDY0KzE5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAsIDY0KzIwLCAyMSwgNjQrMjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMiwgNjQrMjIsIDIzLCA2NCsyMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyLCA2NCszMiwgMzMsIDY0KzMzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzQsIDY0KzM0LCAzNSwgNjQrMzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNiwgNjQrMzYsIDM3LCA2NCszNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM4LCA2NCszOCwgMzksIDY0KzM5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgsIDY0KzQ4LCA0OSwgNjQrNDksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MCwgNjQrNTAsIDUxLCA2NCs1MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUyLCA2NCs1MiwgNTMsIDY0KzUzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTQsIDY0KzU0LCA1NSwgNjQrNTUpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfdW5wYWNrbG9fZXBpOChfX201MTJpIF9fVywgX19tbWFzazY0IF9fVSwgX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKSB7CisgIHJldHVybiAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9zZWxlY3RiXzUxMigoX19tbWFzazY0KV9fVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NjRxaSlfbW01MTJfdW5wYWNrbG9fZXBpOChfX0EsIF9fQiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjY0cWkpX19XKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel91bnBhY2tsb19lcGk4KF9fbW1hc2s2NCBfX1UsIF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikgeworICByZXR1cm4gKF9fbTUxMmkpX19idWlsdGluX2lhMzJfc2VsZWN0Yl81MTIoKF9fbW1hc2s2NClfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjY0cWkpX21tNTEyX3VucGFja2xvX2VwaTgoX19BLCBfX0IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y2NHFpKV9tbTUxMl9zZXR6ZXJvX3FpKCkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX3VucGFja2xvX2VwaTE2KF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikgeworICByZXR1cm4gKF9fbTUxMmkpX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjMyaGkpX19BLCAoX192MzJoaSlfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgMzIrMCwgICAxLCAzMisxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgIDMyKzIsICAgMywgMzIrMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsICAzMis4LCAgIDksIDMyKzksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCwgMzIrMTAsIDExLCAzMisxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2LCAzMisxNiwgMTcsIDMyKzE3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTgsIDMyKzE4LCAxOSwgMzIrMTksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNCwgMzIrMjQsIDI1LCAzMisyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2LCAzMisyNiwgMjcsIDMyKzI3KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX3VucGFja2xvX2VwaTE2KF9fbTUxMmkgX19XLCBfX21tYXNrMzIgX19VLCBfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpIHsKKyAgcmV0dXJuIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX3NlbGVjdHdfNTEyKChfX21tYXNrMzIpX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjMyaGkpX21tNTEyX3VucGFja2xvX2VwaTE2KF9fQSwgX19CKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YzMmhpKV9fVyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfdW5wYWNrbG9fZXBpMTYoX19tbWFzazMyIF9fVSwgX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKSB7CisgIHJldHVybiAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9zZWxlY3R3XzUxMigoX19tbWFzazMyKV9fVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YzMmhpKV9tbTUxMl91bnBhY2tsb19lcGkxNihfX0EsIF9fQiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MzJoaSlfbW01MTJfc2V0emVyb19oaSgpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9jdnRlcGk4X2VwaTE2IChfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbW92c3hidzUxMl9tYXNrICgoX192MzJxaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3YzMmhpKQorICAgICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX2hpICgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrMzIpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2N2dGVwaThfZXBpMTYgKF9fbTUxMmkgX19XLCBfX21tYXNrMzIgX19VLCBfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbW92c3hidzUxMl9tYXNrICgoX192MzJxaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3YzMmhpKSBfX1csCisgICAgICAgICAgICAgICAgKF9fbW1hc2szMikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9jdnRlcGk4X2VwaTE2IChfX21tYXNrMzIgX19VLCBfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbW92c3hidzUxMl9tYXNrICgoX192MzJxaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3YzMmhpKQorICAgICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX2hpKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2szMikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9jdnRlcHU4X2VwaTE2IChfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbW92enhidzUxMl9tYXNrICgoX192MzJxaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3YzMmhpKQorICAgICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX2hpICgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrMzIpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2N2dGVwdThfZXBpMTYgKF9fbTUxMmkgX19XLCBfX21tYXNrMzIgX19VLCBfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbW92enhidzUxMl9tYXNrICgoX192MzJxaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3YzMmhpKSBfX1csCisgICAgICAgICAgICAgICAgKF9fbW1hc2szMikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9jdnRlcHU4X2VwaTE2IChfX21tYXNrMzIgX19VLCBfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbW92enhidzUxMl9tYXNrICgoX192MzJxaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3YzMmhpKQorICAgICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX2hpKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2szMikgX19VKTsKK30KKworCisjZGVmaW5lIF9tbTUxMl9jbXBfZXBpOF9tYXNrKGEsIGIsIHApIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tbWFzazY0KV9fYnVpbHRpbl9pYTMyX2NtcGI1MTJfbWFzaygoX192NjRxaSkoX19tNTEyaSkoYSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjY0cWkpKF9fbTUxMmkpKGIpLCAoaW50KShwKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazY0KS0xKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza19jbXBfZXBpOF9tYXNrKG0sIGEsIGIsIHApIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tbWFzazY0KV9fYnVpbHRpbl9pYTMyX2NtcGI1MTJfbWFzaygoX192NjRxaSkoX19tNTEyaSkoYSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjY0cWkpKF9fbTUxMmkpKGIpLCAoaW50KShwKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazY0KShtKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX2NtcF9lcHU4X21hc2soYSwgYiwgcCkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX21tYXNrNjQpX19idWlsdGluX2lhMzJfdWNtcGI1MTJfbWFzaygoX192NjRxaSkoX19tNTEyaSkoYSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y2NHFpKShfX201MTJpKShiKSwgKGludCkocCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrNjQpLTEpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX2NtcF9lcHU4X21hc2sobSwgYSwgYiwgcCkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX21tYXNrNjQpX19idWlsdGluX2lhMzJfdWNtcGI1MTJfbWFzaygoX192NjRxaSkoX19tNTEyaSkoYSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y2NHFpKShfX201MTJpKShiKSwgKGludCkocCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrNjQpKG0pKTsgfSkKKworI2RlZmluZSBfbW01MTJfY21wX2VwaTE2X21hc2soYSwgYiwgcCkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX21tYXNrMzIpX19idWlsdGluX2lhMzJfY21wdzUxMl9tYXNrKChfX3YzMmhpKShfX201MTJpKShhKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MzJoaSkoX19tNTEyaSkoYiksIChpbnQpKHApLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMzIpLTEpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX2NtcF9lcGkxNl9tYXNrKG0sIGEsIGIsIHApIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tbWFzazMyKV9fYnVpbHRpbl9pYTMyX2NtcHc1MTJfbWFzaygoX192MzJoaSkoX19tNTEyaSkoYSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjMyaGkpKF9fbTUxMmkpKGIpLCAoaW50KShwKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazMyKShtKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX2NtcF9lcHUxNl9tYXNrKGEsIGIsIHApIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tbWFzazMyKV9fYnVpbHRpbl9pYTMyX3VjbXB3NTEyX21hc2soKF9fdjMyaGkpKF9fbTUxMmkpKGEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MzJoaSkoX19tNTEyaSkoYiksIChpbnQpKHApLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazMyKS0xKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza19jbXBfZXB1MTZfbWFzayhtLCBhLCBiLCBwKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbW1hc2szMilfX2J1aWx0aW5faWEzMl91Y21wdzUxMl9tYXNrKChfX3YzMmhpKShfX201MTJpKShhKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjMyaGkpKF9fbTUxMmkpKGIpLCAoaW50KShwKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2szMikobSkpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9zaHVmZmxlaGlfZXBpMTYoQSwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmkpX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjMyaGkpKF9fbTUxMmkpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YzMmhpKV9tbTUxMl91bmRlZmluZWRfZXBpMzIoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAxLCAyLCAzLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgICsgKCgoaW1tKSA+PiAwKSAmIDB4MyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCAgKyAoKChpbW0pID4+IDIpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ICArICgoKGltbSkgPj4gNCkgJiAweDMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgICsgKCgoaW1tKSA+PiA2KSAmIDB4MyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwgOSwgMTAsIDExLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyICsgKCgoaW1tKSA+PiAwKSAmIDB4MyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIgKyAoKChpbW0pID4+IDIpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiArICgoKGltbSkgPj4gNCkgJiAweDMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyICsgKCgoaW1tKSA+PiA2KSAmIDB4MyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYsIDE3LCAxOCwgMTksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAgKyAoKChpbW0pID4+IDApICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMCArICgoKGltbSkgPj4gMikgJiAweDMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwICsgKCgoaW1tKSA+PiA0KSAmIDB4MyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAgKyAoKChpbW0pID4+IDYpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNCwgMjUsIDI2LCAyNywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOCArICgoKGltbSkgPj4gMCkgJiAweDMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4ICsgKCgoaW1tKSA+PiAyKSAmIDB4MyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjggKyAoKChpbW0pID4+IDQpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOCArICgoKGltbSkgPj4gNikgJiAweDMpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza19zaHVmZmxlaGlfZXBpMTYoVywgVSwgQSwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmkpX19idWlsdGluX2lhMzJfc2VsZWN0d181MTIoKF9fbW1hc2szMikoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjMyaGkpX21tNTEyX3NodWZmbGVoaV9lcGkxNigoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW1tKSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjMyaGkpKF9fbTUxMmkpKFcpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza3pfc2h1ZmZsZWhpX2VwaTE2KFUsIEEsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX3NlbGVjdHdfNTEyKChfX21tYXNrMzIpKFUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YzMmhpKV9tbTUxMl9zaHVmZmxlaGlfZXBpMTYoKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGltbSkpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YzMmhpKV9tbTUxMl9zZXR6ZXJvX2hpKCkpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9zaHVmZmxlbG9fZXBpMTYoQSwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmkpX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjMyaGkpKF9fbTUxMmkpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YzMmhpKV9tbTUxMl91bmRlZmluZWRfZXBpMzIoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICsgKCgoaW1tKSA+PiAwKSAmIDB4MyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCArICgoKGltbSkgPj4gMikgJiAweDMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgKyAoKChpbW0pID4+IDQpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICsgKCgoaW1tKSA+PiA2KSAmIDB4MyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwgNSwgNiwgNywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ICsgKCgoaW1tKSA+PiAwKSAmIDB4MyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCArICgoKGltbSkgPj4gMikgJiAweDMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDggKyAoKChpbW0pID4+IDQpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ICsgKCgoaW1tKSA+PiA2KSAmIDB4MyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIsIDEzLCAxNCwgMTUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYgKyAoKChpbW0pID4+IDApICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiArICgoKGltbSkgPj4gMikgJiAweDMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2ICsgKCgoaW1tKSA+PiA0KSAmIDB4MyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYgKyAoKChpbW0pID4+IDYpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMCwgMjEsIDIyLCAyMywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNCArICgoKGltbSkgPj4gMCkgJiAweDMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0ICsgKCgoaW1tKSA+PiAyKSAmIDB4MyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQgKyAoKChpbW0pID4+IDQpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNCArICgoKGltbSkgPj4gNikgJiAweDMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4LCAyOSwgMzAsIDMxKTsgfSkKKworCisjZGVmaW5lIF9tbTUxMl9tYXNrX3NodWZmbGVsb19lcGkxNihXLCBVLCBBLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9zZWxlY3R3XzUxMigoX19tbWFzazMyKShVKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MzJoaSlfbW01MTJfc2h1ZmZsZWxvX2VwaTE2KChBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbW0pKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MzJoaSkoX19tNTEyaSkoVykpOyB9KQorCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X3NodWZmbGVsb19lcGkxNihVLCBBLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9zZWxlY3R3XzUxMigoX19tbWFzazMyKShVKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MzJoaSlfbW01MTJfc2h1ZmZsZWxvX2VwaTE2KChBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbW0pKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MzJoaSlfbW01MTJfc2V0emVyb19oaSgpKTsgfSkKKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9zbGx2X2VwaTE2IChfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcHNsbHYzMmhpX21hc2sgKChfX3YzMmhpKSBfX0EsCisgICAgICAgICAgICAgIChfX3YzMmhpKSBfX0IsCisgICAgICAgICAgICAgIChfX3YzMmhpKQorICAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19oaSAoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2szMikgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfc2xsdl9lcGkxNiAoX19tNTEyaSBfX1csIF9fbW1hc2szMiBfX1UsIF9fbTUxMmkgX19BLAorICAgICAgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcHNsbHYzMmhpX21hc2sgKChfX3YzMmhpKSBfX0EsCisgICAgICAgICAgICAgIChfX3YzMmhpKSBfX0IsCisgICAgICAgICAgICAgIChfX3YzMmhpKSBfX1csCisgICAgICAgICAgICAgIChfX21tYXNrMzIpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfc2xsdl9lcGkxNiAoX19tbWFzazMyIF9fVSwgX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BzbGx2MzJoaV9tYXNrICgoX192MzJoaSkgX19BLAorICAgICAgICAgICAgICAoX192MzJoaSkgX19CLAorICAgICAgICAgICAgICAoX192MzJoaSkKKyAgICAgICAgICAgICAgX21tNTEyX3NldHplcm9faGkgKCksCisgICAgICAgICAgICAgIChfX21tYXNrMzIpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfc2xsX2VwaTE2IChfX201MTJpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcHNsbHc1MTJfbWFzayAoKF9fdjMyaGkpIF9fQSwKKyAgICAgICAgICAgICAoX192OGhpKSBfX0IsCisgICAgICAgICAgICAgKF9fdjMyaGkpCisgICAgICAgICAgICAgX21tNTEyX3NldHplcm9faGkgKCksCisgICAgICAgICAgICAgKF9fbW1hc2szMikgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfc2xsX2VwaTE2IChfX201MTJpIF9fVywgX19tbWFzazMyIF9fVSwgX19tNTEyaSBfX0EsCisgICAgICAgICAgIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BzbGx3NTEyX21hc2sgKChfX3YzMmhpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjhoaSkgX19CLAorICAgICAgICAgICAgIChfX3YzMmhpKSBfX1csCisgICAgICAgICAgICAgKF9fbW1hc2szMikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9zbGxfZXBpMTYgKF9fbW1hc2szMiBfX1UsIF9fbTUxMmkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wc2xsdzUxMl9tYXNrICgoX192MzJoaSkgX19BLAorICAgICAgICAgICAgIChfX3Y4aGkpIF9fQiwKKyAgICAgICAgICAgICAoX192MzJoaSkKKyAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19oaSAoKSwKKyAgICAgICAgICAgICAoX19tbWFzazMyKSBfX1UpOworfQorCisjZGVmaW5lIF9tbTUxMl9zbGxpX2VwaTE2KEEsIEIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9wc2xsd2k1MTJfbWFzaygoX192MzJoaSkoX19tNTEyaSkoQSksIChpbnQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YzMmhpKV9tbTUxMl9zZXR6ZXJvX2hpKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2szMiktMSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2tfc2xsaV9lcGkxNihXLCBVLCBBLCBCKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmkpX19idWlsdGluX2lhMzJfcHNsbHdpNTEyX21hc2soKF9fdjMyaGkpKF9fbTUxMmkpKEEpLCAoaW50KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MzJoaSkoX19tNTEyaSkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2szMikoVSkpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrel9zbGxpX2VwaTE2KFUsIEEsIEIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9wc2xsd2k1MTJfbWFzaygoX192MzJoaSkoX19tNTEyaSkoQSksIChpbnQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YzMmhpKV9tbTUxMl9zZXR6ZXJvX2hpKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2szMikoVSkpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9ic2xsaV9lcGkxMjgoYSwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmkpX19idWlsdGluX3NodWZmbGV2ZWN0b3IoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIChfX3Y2NHFpKV9tbTUxMl9zZXR6ZXJvX3NpNTEyKCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgKF9fdjY0cWkpKF9fbTUxMmkpKGEpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAgMCA6ICgoY2hhcikoaW1tKT4weDAgPyAxNiA6ICA2NCkgLSAoY2hhcikoaW1tKSwgXAorICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/ICAxIDogKChjaGFyKShpbW0pPjB4MSA/IDE3IDogIDY1KSAtIChjaGFyKShpbW0pLCBcCisgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gIDIgOiAoKGNoYXIpKGltbSk+MHgyID8gMTggOiAgNjYpIC0gKGNoYXIpKGltbSksIFwKKyAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAgMyA6ICgoY2hhcikoaW1tKT4weDMgPyAxOSA6ICA2NykgLSAoY2hhcikoaW1tKSwgXAorICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/ICA0IDogKChjaGFyKShpbW0pPjB4NCA/IDIwIDogIDY4KSAtIChjaGFyKShpbW0pLCBcCisgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gIDUgOiAoKGNoYXIpKGltbSk+MHg1ID8gMjEgOiAgNjkpIC0gKGNoYXIpKGltbSksIFwKKyAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAgNiA6ICgoY2hhcikoaW1tKT4weDYgPyAyMiA6ICA3MCkgLSAoY2hhcikoaW1tKSwgXAorICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/ICA3IDogKChjaGFyKShpbW0pPjB4NyA/IDIzIDogIDcxKSAtIChjaGFyKShpbW0pLCBcCisgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gIDggOiAoKGNoYXIpKGltbSk+MHg4ID8gMjQgOiAgNzIpIC0gKGNoYXIpKGltbSksIFwKKyAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAgOSA6ICgoY2hhcikoaW1tKT4weDkgPyAyNSA6ICA3MykgLSAoY2hhcikoaW1tKSwgXAorICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDEwIDogKChjaGFyKShpbW0pPjB4QSA/IDI2IDogIDc0KSAtIChjaGFyKShpbW0pLCBcCisgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gMTEgOiAoKGNoYXIpKGltbSk+MHhCID8gMjcgOiAgNzUpIC0gKGNoYXIpKGltbSksIFwKKyAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAxMiA6ICgoY2hhcikoaW1tKT4weEMgPyAyOCA6ICA3NikgLSAoY2hhcikoaW1tKSwgXAorICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDEzIDogKChjaGFyKShpbW0pPjB4RCA/IDI5IDogIDc3KSAtIChjaGFyKShpbW0pLCBcCisgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gMTQgOiAoKGNoYXIpKGltbSk+MHhFID8gMzAgOiAgNzgpIC0gKGNoYXIpKGltbSksIFwKKyAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAxNSA6ICgoY2hhcikoaW1tKT4weEYgPyAzMSA6ICA3OSkgLSAoY2hhcikoaW1tKSwgXAorICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDE2IDogKChjaGFyKShpbW0pPjB4MCA/IDMyIDogIDgwKSAtIChjaGFyKShpbW0pLCBcCisgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gMTcgOiAoKGNoYXIpKGltbSk+MHgxID8gMzMgOiAgODEpIC0gKGNoYXIpKGltbSksIFwKKyAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAxOCA6ICgoY2hhcikoaW1tKT4weDIgPyAzNCA6ICA4MikgLSAoY2hhcikoaW1tKSwgXAorICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDE5IDogKChjaGFyKShpbW0pPjB4MyA/IDM1IDogIDgzKSAtIChjaGFyKShpbW0pLCBcCisgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gMjAgOiAoKGNoYXIpKGltbSk+MHg0ID8gMzYgOiAgODQpIC0gKGNoYXIpKGltbSksIFwKKyAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAyMSA6ICgoY2hhcikoaW1tKT4weDUgPyAzNyA6ICA4NSkgLSAoY2hhcikoaW1tKSwgXAorICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDIyIDogKChjaGFyKShpbW0pPjB4NiA/IDM4IDogIDg2KSAtIChjaGFyKShpbW0pLCBcCisgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gMjMgOiAoKGNoYXIpKGltbSk+MHg3ID8gMzkgOiAgODcpIC0gKGNoYXIpKGltbSksIFwKKyAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAyNCA6ICgoY2hhcikoaW1tKT4weDggPyA0MCA6ICA4OCkgLSAoY2hhcikoaW1tKSwgXAorICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDI1IDogKChjaGFyKShpbW0pPjB4OSA/IDQxIDogIDg5KSAtIChjaGFyKShpbW0pLCBcCisgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gMjYgOiAoKGNoYXIpKGltbSk+MHhBID8gNDIgOiAgOTApIC0gKGNoYXIpKGltbSksIFwKKyAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAyNyA6ICgoY2hhcikoaW1tKT4weEIgPyA0MyA6ICA5MSkgLSAoY2hhcikoaW1tKSwgXAorICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDI4IDogKChjaGFyKShpbW0pPjB4QyA/IDQ0IDogIDkyKSAtIChjaGFyKShpbW0pLCBcCisgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gMjkgOiAoKGNoYXIpKGltbSk+MHhEID8gNDUgOiAgOTMpIC0gKGNoYXIpKGltbSksIFwKKyAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAzMCA6ICgoY2hhcikoaW1tKT4weEUgPyA0NiA6ICA5NCkgLSAoY2hhcikoaW1tKSwgXAorICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDMxIDogKChjaGFyKShpbW0pPjB4RiA/IDQ3IDogIDk1KSAtIChjaGFyKShpbW0pLCBcCisgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gMzIgOiAoKGNoYXIpKGltbSk+MHgwID8gNDggOiAgOTYpIC0gKGNoYXIpKGltbSksIFwKKyAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAzMyA6ICgoY2hhcikoaW1tKT4weDEgPyA0OSA6ICA5NykgLSAoY2hhcikoaW1tKSwgXAorICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDM0IDogKChjaGFyKShpbW0pPjB4MiA/IDUwIDogIDk4KSAtIChjaGFyKShpbW0pLCBcCisgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gMzUgOiAoKGNoYXIpKGltbSk+MHgzID8gNTEgOiAgOTkpIC0gKGNoYXIpKGltbSksIFwKKyAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAzNiA6ICgoY2hhcikoaW1tKT4weDQgPyA1MiA6IDEwMCkgLSAoY2hhcikoaW1tKSwgXAorICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDM3IDogKChjaGFyKShpbW0pPjB4NSA/IDUzIDogMTAxKSAtIChjaGFyKShpbW0pLCBcCisgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gMzggOiAoKGNoYXIpKGltbSk+MHg2ID8gNTQgOiAxMDIpIC0gKGNoYXIpKGltbSksIFwKKyAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAzOSA6ICgoY2hhcikoaW1tKT4weDcgPyA1NSA6IDEwMykgLSAoY2hhcikoaW1tKSwgXAorICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDQwIDogKChjaGFyKShpbW0pPjB4OCA/IDU2IDogMTA0KSAtIChjaGFyKShpbW0pLCBcCisgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gNDEgOiAoKGNoYXIpKGltbSk+MHg5ID8gNTcgOiAxMDUpIC0gKGNoYXIpKGltbSksIFwKKyAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyA0MiA6ICgoY2hhcikoaW1tKT4weEEgPyA1OCA6IDEwNikgLSAoY2hhcikoaW1tKSwgXAorICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDQzIDogKChjaGFyKShpbW0pPjB4QiA/IDU5IDogMTA3KSAtIChjaGFyKShpbW0pLCBcCisgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gNDQgOiAoKGNoYXIpKGltbSk+MHhDID8gNjAgOiAxMDgpIC0gKGNoYXIpKGltbSksIFwKKyAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyA0NSA6ICgoY2hhcikoaW1tKT4weEQgPyA2MSA6IDEwOSkgLSAoY2hhcikoaW1tKSwgXAorICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDQ2IDogKChjaGFyKShpbW0pPjB4RSA/IDYyIDogMTEwKSAtIChjaGFyKShpbW0pLCBcCisgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gNDcgOiAoKGNoYXIpKGltbSk+MHhGID8gNjMgOiAxMTEpIC0gKGNoYXIpKGltbSksIFwKKyAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyA0OCA6ICgoY2hhcikoaW1tKT4weDAgPyA2NCA6IDExMikgLSAoY2hhcikoaW1tKSwgXAorICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDQ5IDogKChjaGFyKShpbW0pPjB4MSA/IDY1IDogMTEzKSAtIChjaGFyKShpbW0pLCBcCisgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gNTAgOiAoKGNoYXIpKGltbSk+MHgyID8gNjYgOiAxMTQpIC0gKGNoYXIpKGltbSksIFwKKyAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyA1MSA6ICgoY2hhcikoaW1tKT4weDMgPyA2NyA6IDExNSkgLSAoY2hhcikoaW1tKSwgXAorICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDUyIDogKChjaGFyKShpbW0pPjB4NCA/IDY4IDogMTE2KSAtIChjaGFyKShpbW0pLCBcCisgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gNTMgOiAoKGNoYXIpKGltbSk+MHg1ID8gNjkgOiAxMTcpIC0gKGNoYXIpKGltbSksIFwKKyAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyA1NCA6ICgoY2hhcikoaW1tKT4weDYgPyA3MCA6IDExOCkgLSAoY2hhcikoaW1tKSwgXAorICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDU1IDogKChjaGFyKShpbW0pPjB4NyA/IDcxIDogMTE5KSAtIChjaGFyKShpbW0pLCBcCisgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gNTYgOiAoKGNoYXIpKGltbSk+MHg4ID8gNzIgOiAxMjApIC0gKGNoYXIpKGltbSksIFwKKyAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyA1NyA6ICgoY2hhcikoaW1tKT4weDkgPyA3MyA6IDEyMSkgLSAoY2hhcikoaW1tKSwgXAorICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDU4IDogKChjaGFyKShpbW0pPjB4QSA/IDc0IDogMTIyKSAtIChjaGFyKShpbW0pLCBcCisgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gNTkgOiAoKGNoYXIpKGltbSk+MHhCID8gNzUgOiAxMjMpIC0gKGNoYXIpKGltbSksIFwKKyAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyA2MCA6ICgoY2hhcikoaW1tKT4weEMgPyA3NiA6IDEyNCkgLSAoY2hhcikoaW1tKSwgXAorICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDYxIDogKChjaGFyKShpbW0pPjB4RCA/IDc3IDogMTI1KSAtIChjaGFyKShpbW0pLCBcCisgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gNjIgOiAoKGNoYXIpKGltbSk+MHhFID8gNzggOiAxMjYpIC0gKGNoYXIpKGltbSksIFwKKyAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyA2MyA6ICgoY2hhcikoaW1tKT4weEYgPyA3OSA6IDEyNykgLSAoY2hhcikoaW1tKSk7IH0pCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfc3Jsdl9lcGkxNiAoX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3Bzcmx2MzJoaV9tYXNrICgoX192MzJoaSkgX19BLAorICAgICAgICAgICAgICAoX192MzJoaSkgX19CLAorICAgICAgICAgICAgICAoX192MzJoaSkKKyAgICAgICAgICAgICAgX21tNTEyX3NldHplcm9faGkgKCksCisgICAgICAgICAgICAgIChfX21tYXNrMzIpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX3NybHZfZXBpMTYgKF9fbTUxMmkgX19XLCBfX21tYXNrMzIgX19VLCBfX201MTJpIF9fQSwKKyAgICAgIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3Bzcmx2MzJoaV9tYXNrICgoX192MzJoaSkgX19BLAorICAgICAgICAgICAgICAoX192MzJoaSkgX19CLAorICAgICAgICAgICAgICAoX192MzJoaSkgX19XLAorICAgICAgICAgICAgICAoX19tbWFzazMyKSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X3NybHZfZXBpMTYgKF9fbW1hc2szMiBfX1UsIF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wc3JsdjMyaGlfbWFzayAoKF9fdjMyaGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjMyaGkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjMyaGkpCisgICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX2hpICgpLAorICAgICAgICAgICAgICAoX19tbWFzazMyKSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX3NyYXZfZXBpMTYgKF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wc3JhdjMyaGlfbWFzayAoKF9fdjMyaGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjMyaGkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjMyaGkpCisgICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX2hpICgpLAorICAgICAgICAgICAgICAoX19tbWFzazMyKSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19zcmF2X2VwaTE2IChfX201MTJpIF9fVywgX19tbWFzazMyIF9fVSwgX19tNTEyaSBfX0EsCisgICAgICBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wc3JhdjMyaGlfbWFzayAoKF9fdjMyaGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjMyaGkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjMyaGkpIF9fVywKKyAgICAgICAgICAgICAgKF9fbW1hc2szMikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9zcmF2X2VwaTE2IChfX21tYXNrMzIgX19VLCBfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcHNyYXYzMmhpX21hc2sgKChfX3YzMmhpKSBfX0EsCisgICAgICAgICAgICAgIChfX3YzMmhpKSBfX0IsCisgICAgICAgICAgICAgIChfX3YzMmhpKQorICAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19oaSAoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2szMikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9zcmFfZXBpMTYgKF9fbTUxMmkgX19BLCBfX20xMjhpIF9fQikKK3sKKyByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BzcmF3NTEyX21hc2sgKChfX3YzMmhpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjhoaSkgX19CLAorICAgICAgICAgICAgIChfX3YzMmhpKQorICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX2hpICgpLAorICAgICAgICAgICAgIChfX21tYXNrMzIpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX3NyYV9lcGkxNiAoX19tNTEyaSBfX1csIF9fbW1hc2szMiBfX1UsIF9fbTUxMmkgX19BLAorICAgICAgICAgICBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wc3JhdzUxMl9tYXNrICgoX192MzJoaSkgX19BLAorICAgICAgICAgICAgIChfX3Y4aGkpIF9fQiwKKyAgICAgICAgICAgICAoX192MzJoaSkgX19XLAorICAgICAgICAgICAgKF9fbW1hc2szMikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9zcmFfZXBpMTYgKF9fbW1hc2szMiBfX1UsIF9fbTUxMmkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wc3JhdzUxMl9tYXNrICgoX192MzJoaSkgX19BLAorICAgICAgICAgICAgIChfX3Y4aGkpIF9fQiwKKyAgICAgICAgICAgICAoX192MzJoaSkKKyAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19oaSAoKSwKKyAgICAgICAgICAgIChfX21tYXNrMzIpIF9fVSk7Cit9CisKKyNkZWZpbmUgX21tNTEyX3NyYWlfZXBpMTYoQSwgQikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX3BzcmF3aTUxMl9tYXNrKChfX3YzMmhpKShfX201MTJpKShBKSwgKGludCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjMyaGkpX21tNTEyX3NldHplcm9faGkoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazMyKS0xKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza19zcmFpX2VwaTE2KFcsIFUsIEEsIEIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9wc3Jhd2k1MTJfbWFzaygoX192MzJoaSkoX19tNTEyaSkoQSksIChpbnQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YzMmhpKShfX201MTJpKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazMyKShVKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X3NyYWlfZXBpMTYoVSwgQSwgQikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX3BzcmF3aTUxMl9tYXNrKChfX3YzMmhpKShfX201MTJpKShBKSwgKGludCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjMyaGkpX21tNTEyX3NldHplcm9faGkoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazMyKShVKSk7IH0pCisKKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9zcmxfZXBpMTYgKF9fbTUxMmkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wc3JsdzUxMl9tYXNrICgoX192MzJoaSkgX19BLAorICAgICAgICAgICAgIChfX3Y4aGkpIF9fQiwKKyAgICAgICAgICAgICAoX192MzJoaSkKKyAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19oaSAoKSwKKyAgICAgICAgICAgICAoX19tbWFzazMyKSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19zcmxfZXBpMTYgKF9fbTUxMmkgX19XLCBfX21tYXNrMzIgX19VLCBfX201MTJpIF9fQSwKKyAgICAgICAgICAgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcHNybHc1MTJfbWFzayAoKF9fdjMyaGkpIF9fQSwKKyAgICAgICAgICAgICAoX192OGhpKSBfX0IsCisgICAgICAgICAgICAgKF9fdjMyaGkpIF9fVywKKyAgICAgICAgICAgICAoX19tbWFzazMyKSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X3NybF9lcGkxNiAoX19tbWFzazMyIF9fVSwgX19tNTEyaSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3Bzcmx3NTEyX21hc2sgKChfX3YzMmhpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjhoaSkgX19CLAorICAgICAgICAgICAgIChfX3YzMmhpKQorICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX2hpICgpLAorICAgICAgICAgICAgIChfX21tYXNrMzIpIF9fVSk7Cit9CisKKyNkZWZpbmUgX21tNTEyX3NybGlfZXBpMTYoQSwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmkpX19idWlsdGluX2lhMzJfcHNybHdpNTEyX21hc2soKF9fdjMyaGkpKF9fbTUxMmkpKEEpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YzMmhpKV9tbTUxMl9zZXR6ZXJvX2hpKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2szMiktMSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2tfc3JsaV9lcGkxNihXLCBVLCBBLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9wc3Jsd2k1MTJfbWFzaygoX192MzJoaSkoX19tNTEyaSkoQSksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjMyaGkpKF9fbTUxMmkpKFcpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMzIpKFUpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza3pfc3JsaV9lcGkxNihVLCBBLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9wc3Jsd2k1MTJfbWFzaygoX192MzJoaSkoX19tNTEyaSkoQSksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjMyaGkpX21tNTEyX3NldHplcm9faGkoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazMyKShVKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX2JzcmxpX2VwaTEyOChhLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyaSlfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvciggICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoX192NjRxaSkoX19tNTEyaSkoYSksICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChfX3Y2NHFpKV9tbTUxMl9zZXR6ZXJvX3NpNTEyKCksICAgICAgICAgICAgXAorICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gIDY0IDogKGNoYXIpKGltbSkgKyAoKGNoYXIpKGltbSk+MHhGID8gIDQ4IDogMCksICBcCisgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAgNjUgOiAoY2hhcikoaW1tKSArICgoY2hhcikoaW1tKT4weEUgPyAgNDkgOiAxKSwgIFwKKyAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/ICA2NiA6IChjaGFyKShpbW0pICsgKChjaGFyKShpbW0pPjB4RCA/ICA1MCA6IDIpLCAgXAorICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gIDY3IDogKGNoYXIpKGltbSkgKyAoKGNoYXIpKGltbSk+MHhDID8gIDUxIDogMyksICBcCisgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAgNjggOiAoY2hhcikoaW1tKSArICgoY2hhcikoaW1tKT4weEIgPyAgNTIgOiA0KSwgIFwKKyAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/ICA2OSA6IChjaGFyKShpbW0pICsgKChjaGFyKShpbW0pPjB4QSA/ICA1MyA6IDUpLCAgXAorICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gIDcwIDogKGNoYXIpKGltbSkgKyAoKGNoYXIpKGltbSk+MHg5ID8gIDU0IDogNiksICBcCisgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAgNzEgOiAoY2hhcikoaW1tKSArICgoY2hhcikoaW1tKT4weDggPyAgNTUgOiA3KSwgIFwKKyAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/ICA3MiA6IChjaGFyKShpbW0pICsgKChjaGFyKShpbW0pPjB4NyA/ICA1NiA6IDgpLCAgXAorICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gIDczIDogKGNoYXIpKGltbSkgKyAoKGNoYXIpKGltbSk+MHg2ID8gIDU3IDogOSksICBcCisgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAgNzQgOiAoY2hhcikoaW1tKSArICgoY2hhcikoaW1tKT4weDUgPyAgNTggOiAxMCksIFwKKyAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/ICA3NSA6IChjaGFyKShpbW0pICsgKChjaGFyKShpbW0pPjB4NCA/ICA1OSA6IDExKSwgXAorICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gIDc2IDogKGNoYXIpKGltbSkgKyAoKGNoYXIpKGltbSk+MHgzID8gIDYwIDogMTIpLCBcCisgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAgNzcgOiAoY2hhcikoaW1tKSArICgoY2hhcikoaW1tKT4weDIgPyAgNjEgOiAxMyksIFwKKyAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/ICA3OCA6IChjaGFyKShpbW0pICsgKChjaGFyKShpbW0pPjB4MSA/ICA2MiA6IDE0KSwgXAorICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gIDc5IDogKGNoYXIpKGltbSkgKyAoKGNoYXIpKGltbSk+MHgwID8gIDYzIDogMTUpLCBcCisgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAgODAgOiAoY2hhcikoaW1tKSArICgoY2hhcikoaW1tKT4weEYgPyAgNjQgOiAxNiksIFwKKyAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/ICA4MSA6IChjaGFyKShpbW0pICsgKChjaGFyKShpbW0pPjB4RSA/ICA2NSA6IDE3KSwgXAorICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gIDgyIDogKGNoYXIpKGltbSkgKyAoKGNoYXIpKGltbSk+MHhEID8gIDY2IDogMTgpLCBcCisgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAgODMgOiAoY2hhcikoaW1tKSArICgoY2hhcikoaW1tKT4weEMgPyAgNjcgOiAxOSksIFwKKyAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/ICA4NCA6IChjaGFyKShpbW0pICsgKChjaGFyKShpbW0pPjB4QiA/ICA2OCA6IDIwKSwgXAorICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gIDg1IDogKGNoYXIpKGltbSkgKyAoKGNoYXIpKGltbSk+MHhBID8gIDY5IDogMjEpLCBcCisgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAgODYgOiAoY2hhcikoaW1tKSArICgoY2hhcikoaW1tKT4weDkgPyAgNzAgOiAyMiksIFwKKyAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/ICA4NyA6IChjaGFyKShpbW0pICsgKChjaGFyKShpbW0pPjB4OCA/ICA3MSA6IDIzKSwgXAorICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gIDg4IDogKGNoYXIpKGltbSkgKyAoKGNoYXIpKGltbSk+MHg3ID8gIDcyIDogMjQpLCBcCisgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAgODkgOiAoY2hhcikoaW1tKSArICgoY2hhcikoaW1tKT4weDYgPyAgNzMgOiAyNSksIFwKKyAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/ICA5MCA6IChjaGFyKShpbW0pICsgKChjaGFyKShpbW0pPjB4NSA/ICA3NCA6IDI2KSwgXAorICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gIDkxIDogKGNoYXIpKGltbSkgKyAoKGNoYXIpKGltbSk+MHg0ID8gIDc1IDogMjcpLCBcCisgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAgOTIgOiAoY2hhcikoaW1tKSArICgoY2hhcikoaW1tKT4weDMgPyAgNzYgOiAyOCksIFwKKyAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/ICA5MyA6IChjaGFyKShpbW0pICsgKChjaGFyKShpbW0pPjB4MiA/ICA3NyA6IDI5KSwgXAorICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gIDk0IDogKGNoYXIpKGltbSkgKyAoKGNoYXIpKGltbSk+MHgxID8gIDc4IDogMzApLCBcCisgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAgOTUgOiAoY2hhcikoaW1tKSArICgoY2hhcikoaW1tKT4weDAgPyAgNzkgOiAzMSksIFwKKyAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/ICA5NiA6IChjaGFyKShpbW0pICsgKChjaGFyKShpbW0pPjB4RiA/ICA4MCA6IDMyKSwgXAorICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gIDk3IDogKGNoYXIpKGltbSkgKyAoKGNoYXIpKGltbSk+MHhFID8gIDgxIDogMzMpLCBcCisgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAgOTggOiAoY2hhcikoaW1tKSArICgoY2hhcikoaW1tKT4weEQgPyAgODIgOiAzNCksIFwKKyAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/ICA5OSA6IChjaGFyKShpbW0pICsgKChjaGFyKShpbW0pPjB4QyA/ICA4MyA6IDM1KSwgXAorICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gMTAwIDogKGNoYXIpKGltbSkgKyAoKGNoYXIpKGltbSk+MHhCID8gIDg0IDogMzYpLCBcCisgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAxMDEgOiAoY2hhcikoaW1tKSArICgoY2hhcikoaW1tKT4weEEgPyAgODUgOiAzNyksIFwKKyAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDEwMiA6IChjaGFyKShpbW0pICsgKChjaGFyKShpbW0pPjB4OSA/ICA4NiA6IDM4KSwgXAorICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gMTAzIDogKGNoYXIpKGltbSkgKyAoKGNoYXIpKGltbSk+MHg4ID8gIDg3IDogMzkpLCBcCisgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAxMDQgOiAoY2hhcikoaW1tKSArICgoY2hhcikoaW1tKT4weDcgPyAgODggOiA0MCksIFwKKyAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDEwNSA6IChjaGFyKShpbW0pICsgKChjaGFyKShpbW0pPjB4NiA/ICA4OSA6IDQxKSwgXAorICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gMTA2IDogKGNoYXIpKGltbSkgKyAoKGNoYXIpKGltbSk+MHg1ID8gIDkwIDogNDIpLCBcCisgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAxMDcgOiAoY2hhcikoaW1tKSArICgoY2hhcikoaW1tKT4weDQgPyAgOTEgOiA0MyksIFwKKyAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDEwOCA6IChjaGFyKShpbW0pICsgKChjaGFyKShpbW0pPjB4MyA/ICA5MiA6IDQ0KSwgXAorICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gMTA5IDogKGNoYXIpKGltbSkgKyAoKGNoYXIpKGltbSk+MHgyID8gIDkzIDogNDUpLCBcCisgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAxMTAgOiAoY2hhcikoaW1tKSArICgoY2hhcikoaW1tKT4weDEgPyAgOTQgOiA0NiksIFwKKyAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDExMSA6IChjaGFyKShpbW0pICsgKChjaGFyKShpbW0pPjB4MCA/ICA5NSA6IDQ3KSwgXAorICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gMTEyIDogKGNoYXIpKGltbSkgKyAoKGNoYXIpKGltbSk+MHhGID8gIDk2IDogNDgpLCBcCisgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAxMTMgOiAoY2hhcikoaW1tKSArICgoY2hhcikoaW1tKT4weEUgPyAgOTcgOiA0OSksIFwKKyAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDExNCA6IChjaGFyKShpbW0pICsgKChjaGFyKShpbW0pPjB4RCA/ICA5OCA6IDUwKSwgXAorICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gMTE1IDogKGNoYXIpKGltbSkgKyAoKGNoYXIpKGltbSk+MHhDID8gIDk5IDogNTEpLCBcCisgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAxMTYgOiAoY2hhcikoaW1tKSArICgoY2hhcikoaW1tKT4weEIgPyAxMDAgOiA1MiksIFwKKyAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDExNyA6IChjaGFyKShpbW0pICsgKChjaGFyKShpbW0pPjB4QSA/IDEwMSA6IDUzKSwgXAorICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gMTE4IDogKGNoYXIpKGltbSkgKyAoKGNoYXIpKGltbSk+MHg5ID8gMTAyIDogNTQpLCBcCisgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAxMTkgOiAoY2hhcikoaW1tKSArICgoY2hhcikoaW1tKT4weDggPyAxMDMgOiA1NSksIFwKKyAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDEyMCA6IChjaGFyKShpbW0pICsgKChjaGFyKShpbW0pPjB4NyA/IDEwNCA6IDU2KSwgXAorICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gMTIxIDogKGNoYXIpKGltbSkgKyAoKGNoYXIpKGltbSk+MHg2ID8gMTA1IDogNTcpLCBcCisgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAxMjIgOiAoY2hhcikoaW1tKSArICgoY2hhcikoaW1tKT4weDUgPyAxMDYgOiA1OCksIFwKKyAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDEyMyA6IChjaGFyKShpbW0pICsgKChjaGFyKShpbW0pPjB4NCA/IDEwNyA6IDU5KSwgXAorICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gMTI0IDogKGNoYXIpKGltbSkgKyAoKGNoYXIpKGltbSk+MHgzID8gMTA4IDogNjApLCBcCisgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAxMjUgOiAoY2hhcikoaW1tKSArICgoY2hhcikoaW1tKT4weDIgPyAxMDkgOiA2MSksIFwKKyAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDEyNiA6IChjaGFyKShpbW0pICsgKChjaGFyKShpbW0pPjB4MSA/IDExMCA6IDYyKSwgXAorICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gMTI3IDogKGNoYXIpKGltbSkgKyAoKGNoYXIpKGltbSk+MHgwID8gMTExIDogNjMpKTsgfSkKKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX21vdl9lcGkxNiAoX19tNTEyaSBfX1csIF9fbW1hc2szMiBfX1UsIF9fbTUxMmkgX19BKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3NlbGVjdHdfNTEyICgoX19tbWFzazMyKSBfX1UsCisgICAgICAgICAgICAgICAgKF9fdjMyaGkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192MzJoaSkgX19XKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9tb3ZfZXBpMTYgKF9fbW1hc2szMiBfX1UsIF9fbTUxMmkgX19BKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3NlbGVjdHdfNTEyICgoX19tbWFzazMyKSBfX1UsCisgICAgICAgICAgICAgICAgKF9fdjMyaGkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192MzJoaSkgX21tNTEyX3NldHplcm9faGkgKCkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfbW92X2VwaTggKF9fbTUxMmkgX19XLCBfX21tYXNrNjQgX19VLCBfX201MTJpIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9zZWxlY3RiXzUxMiAoKF9fbW1hc2s2NCkgX19VLAorICAgICAgICAgICAgICAgIChfX3Y2NHFpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjY0cWkpIF9fVyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfbW92X2VwaTggKF9fbW1hc2s2NCBfX1UsIF9fbTUxMmkgX19BKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3NlbGVjdGJfNTEyICgoX19tbWFzazY0KSBfX1UsCisgICAgICAgICAgICAgICAgKF9fdjY0cWkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192NjRxaSkgX21tNTEyX3NldHplcm9faGkgKCkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfc2V0MV9lcGk4IChfX201MTJpIF9fTywgX19tbWFzazY0IF9fTSwgY2hhciBfX0EpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcGJyb2FkY2FzdGI1MTJfZ3ByX21hc2sgKF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjY0cWkpIF9fTywKKyAgICAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9zZXQxX2VwaTggKF9fbW1hc2s2NCBfX00sIGNoYXIgX19BKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3Bicm9hZGNhc3RiNTEyX2dwcl9tYXNrIChfX0EsCisgICAgICAgICAgICAgICAgIChfX3Y2NHFpKQorICAgICAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19xaSgpLAorICAgICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfa3VucGFja2QgKF9fbW1hc2s2NCBfX0EsIF9fbW1hc2s2NCBfX0IpCit7CisgIHJldHVybiAoX19tbWFzazY0KSBfX2J1aWx0aW5faWEzMl9rdW5wY2tkaSAoKF9fbW1hc2s2NCkgX19BLAorICAgICAgICAgICAgICAgIChfX21tYXNrNjQpIF9fQik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2szMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9rdW5wYWNrdyAoX19tbWFzazMyIF9fQSwgX19tbWFzazMyIF9fQikKK3sKKyAgcmV0dXJuIChfX21tYXNrMzIpIF9fYnVpbHRpbl9pYTMyX2t1bnBja3NpICgoX19tbWFzazMyKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fbW1hc2szMikgX19CKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2xvYWR1X2VwaTE2IChfX201MTJpIF9fVywgX19tbWFzazMyIF9fVSwgdm9pZCBjb25zdCAqX19QKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX2xvYWRkcXVoaTUxMl9tYXNrICgoX192MzJoaSAqKSBfX1AsCisgICAgICAgICAgICAgICAgIChfX3YzMmhpKSBfX1csCisgICAgICAgICAgICAgICAgIChfX21tYXNrMzIpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfbG9hZHVfZXBpMTYgKF9fbW1hc2szMiBfX1UsIHZvaWQgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9sb2FkZHF1aGk1MTJfbWFzayAoKF9fdjMyaGkgKikgX19QLAorICAgICAgICAgICAgICAgICAoX192MzJoaSkKKyAgICAgICAgICAgICAgICAgX21tNTEyX3NldHplcm9faGkgKCksCisgICAgICAgICAgICAgICAgIChfX21tYXNrMzIpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19sb2FkdV9lcGk4IChfX201MTJpIF9fVywgX19tbWFzazY0IF9fVSwgdm9pZCBjb25zdCAqX19QKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX2xvYWRkcXVxaTUxMl9tYXNrICgoX192NjRxaSAqKSBfX1AsCisgICAgICAgICAgICAgICAgIChfX3Y2NHFpKSBfX1csCisgICAgICAgICAgICAgICAgIChfX21tYXNrNjQpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfbG9hZHVfZXBpOCAoX19tbWFzazY0IF9fVSwgdm9pZCBjb25zdCAqX19QKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX2xvYWRkcXVxaTUxMl9tYXNrICgoX192NjRxaSAqKSBfX1AsCisgICAgICAgICAgICAgICAgIChfX3Y2NHFpKQorICAgICAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19oaSAoKSwKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2s2NCkgX19VKTsKK30KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19zdG9yZXVfZXBpMTYgKHZvaWQgKl9fUCwgX19tbWFzazMyIF9fVSwgX19tNTEyaSBfX0EpCit7CisgIF9fYnVpbHRpbl9pYTMyX3N0b3JlZHF1aGk1MTJfbWFzayAoKF9fdjMyaGkgKikgX19QLAorICAgICAgICAgICAgIChfX3YzMmhpKSBfX0EsCisgICAgICAgICAgICAgKF9fbW1hc2szMikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX3N0b3JldV9lcGk4ICh2b2lkICpfX1AsIF9fbW1hc2s2NCBfX1UsIF9fbTUxMmkgX19BKQoreworICBfX2J1aWx0aW5faWEzMl9zdG9yZWRxdXFpNTEyX21hc2sgKChfX3Y2NHFpICopIF9fUCwKKyAgICAgICAgICAgICAoX192NjRxaSkgX19BLAorICAgICAgICAgICAgIChfX21tYXNrNjQpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s2NCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl90ZXN0X2VwaThfbWFzayAoX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbW1hc2s2NCkgX19idWlsdGluX2lhMzJfcHRlc3RtYjUxMiAoKF9fdjY0cWkpIF9fQSwKKyAgICAgICAgICAgIChfX3Y2NHFpKSBfX0IsCisgICAgICAgICAgICAoX19tbWFzazY0KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s2NCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX3Rlc3RfZXBpOF9tYXNrIChfX21tYXNrNjQgX19VLCBfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tbWFzazY0KSBfX2J1aWx0aW5faWEzMl9wdGVzdG1iNTEyICgoX192NjRxaSkgX19BLAorICAgICAgICAgICAgKF9fdjY0cWkpIF9fQiwgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazMyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX3Rlc3RfZXBpMTZfbWFzayAoX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbW1hc2szMikgX19idWlsdGluX2lhMzJfcHRlc3RtdzUxMiAoKF9fdjMyaGkpIF9fQSwKKyAgICAgICAgICAgIChfX3YzMmhpKSBfX0IsCisgICAgICAgICAgICAoX19tbWFzazMyKSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2szMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX3Rlc3RfZXBpMTZfbWFzayAoX19tbWFzazMyIF9fVSwgX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbW1hc2szMikgX19idWlsdGluX2lhMzJfcHRlc3RtdzUxMiAoKF9fdjMyaGkpIF9fQSwKKyAgICAgICAgICAgIChfX3YzMmhpKSBfX0IsIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s2NCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl90ZXN0bl9lcGk4X21hc2sgKF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX21tYXNrNjQpIF9fYnVpbHRpbl9pYTMyX3B0ZXN0bm1iNTEyICgoX192NjRxaSkgX19BLAorICAgICAgICAgICAgIChfX3Y2NHFpKSBfX0IsCisgICAgICAgICAgICAgKF9fbW1hc2s2NCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza190ZXN0bl9lcGk4X21hc2sgKF9fbW1hc2s2NCBfX1UsIF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX21tYXNrNjQpIF9fYnVpbHRpbl9pYTMyX3B0ZXN0bm1iNTEyICgoX192NjRxaSkgX19BLAorICAgICAgICAgICAgIChfX3Y2NHFpKSBfX0IsIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2szMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl90ZXN0bl9lcGkxNl9tYXNrIChfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tbWFzazMyKSBfX2J1aWx0aW5faWEzMl9wdGVzdG5tdzUxMiAoKF9fdjMyaGkpIF9fQSwKKyAgICAgICAgICAgICAoX192MzJoaSkgX19CLAorICAgICAgICAgICAgIChfX21tYXNrMzIpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazMyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfdGVzdG5fZXBpMTZfbWFzayAoX19tbWFzazMyIF9fVSwgX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbW1hc2szMikgX19idWlsdGluX2lhMzJfcHRlc3RubXc1MTIgKChfX3YzMmhpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjMyaGkpIF9fQiwgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21vdmVwaThfbWFzayAoX19tNTEyaSBfX0EpCit7CisgIHJldHVybiAoX19tbWFzazY0KSBfX2J1aWx0aW5faWEzMl9jdnRiMm1hc2s1MTIgKChfX3Y2NHFpKSBfX0EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMzIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbW92ZXBpMTZfbWFzayAoX19tNTEyaSBfX0EpCit7CisgIHJldHVybiAoX19tbWFzazMyKSBfX2J1aWx0aW5faWEzMl9jdnR3Mm1hc2s1MTIgKChfX3YzMmhpKSBfX0EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21vdm1fZXBpOCAoX19tbWFzazY0IF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9jdnRtYXNrMmI1MTIgKF9fQSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbW92bV9lcGkxNiAoX19tbWFzazMyIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9jdnRtYXNrMnc1MTIgKF9fQSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfYnJvYWRjYXN0Yl9lcGk4IChfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKV9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3YxNnFpKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZxaSlfbW1fdW5kZWZpbmVkX3NpMTI4KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2Jyb2FkY2FzdGJfZXBpOCAoX19tNTEyaSBfX08sIF9fbW1hc2s2NCBfX00sIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTUxMmkpX19idWlsdGluX2lhMzJfc2VsZWN0Yl81MTIoX19NLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjY0cWkpIF9tbTUxMl9icm9hZGNhc3RiX2VwaTgoX19BKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y2NHFpKSBfX08pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X2Jyb2FkY2FzdGJfZXBpOCAoX19tbWFzazY0IF9fTSwgX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9zZWxlY3RiXzUxMihfX00sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NjRxaSkgX21tNTEyX2Jyb2FkY2FzdGJfZXBpOChfX0EpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjY0cWkpIF9tbTUxMl9zZXR6ZXJvX3NpNTEyKCkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfc2V0MV9lcGkxNiAoX19tNTEyaSBfX08sIF9fbW1hc2szMiBfX00sIHNob3J0IF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wYnJvYWRjYXN0dzUxMl9ncHJfbWFzayAoX19BLAorICAgICAgICAgICAgICAgICAoX192MzJoaSkgX19PLAorICAgICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X3NldDFfZXBpMTYgKF9fbW1hc2szMiBfX00sIHNob3J0IF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wYnJvYWRjYXN0dzUxMl9ncHJfbWFzayAoX19BLAorICAgICAgICAgICAgICAgICAoX192MzJoaSkgX21tNTEyX3NldHplcm9faGkoKSwKKyAgICAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9icm9hZGNhc3R3X2VwaTE2IChfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKV9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3Y4aGkpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4aGkpX21tX3VuZGVmaW5lZF9zaTEyOCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfYnJvYWRjYXN0d19lcGkxNiAoX19tNTEyaSBfX08sIF9fbW1hc2szMiBfX00sIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTUxMmkpX19idWlsdGluX2lhMzJfc2VsZWN0d181MTIoX19NLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjMyaGkpIF9tbTUxMl9icm9hZGNhc3R3X2VwaTE2KF9fQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MzJoaSkgX19PKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9icm9hZGNhc3R3X2VwaTE2IChfX21tYXNrMzIgX19NLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX3NlbGVjdHdfNTEyKF9fTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YzMmhpKSBfbW01MTJfYnJvYWRjYXN0d19lcGkxNihfX0EpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjMyaGkpIF9tbTUxMl9zZXR6ZXJvX3NpNTEyKCkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX3Blcm11dGV4dmFyX2VwaTE2IChfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcGVybXZhcmhpNTEyX21hc2sgKChfX3YzMmhpKSBfX0IsCisgICAgICAgICAgICAgICAgIChfX3YzMmhpKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3YzMmhpKSBfbW01MTJfdW5kZWZpbmVkX2VwaTMyICgpLAorICAgICAgICAgICAgICAgICAoX19tbWFzazMyKSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfcGVybXV0ZXh2YXJfZXBpMTYgKF9fbW1hc2szMiBfX00sIF9fbTUxMmkgX19BLAorICAgICAgICBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wZXJtdmFyaGk1MTJfbWFzayAoKF9fdjMyaGkpIF9fQiwKKyAgICAgICAgICAgICAgICAgKF9fdjMyaGkpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjMyaGkpIF9tbTUxMl9zZXR6ZXJvX2hpKCksCisgICAgICAgICAgICAgICAgIChfX21tYXNrMzIpIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19wZXJtdXRleHZhcl9lcGkxNiAoX19tNTEyaSBfX1csIF9fbW1hc2szMiBfX00sIF9fbTUxMmkgX19BLAorICAgICAgICAgICAgIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3Blcm12YXJoaTUxMl9tYXNrICgoX192MzJoaSkgX19CLAorICAgICAgICAgICAgICAgICAoX192MzJoaSkgX19BLAorICAgICAgICAgICAgICAgICAoX192MzJoaSkgX19XLAorICAgICAgICAgICAgICAgICAoX19tbWFzazMyKSBfX00pOworfQorCisjZGVmaW5lIF9tbTUxMl9hbGlnbnJfZXBpOChBLCBCLCBOKSBfX2V4dGVuc2lvbl9fICh7XAorICAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9wYWxpZ25yNTEyX21hc2soKF9fdjY0cWkpKF9fbTUxMmkpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NjRxaSkoX19tNTEyaSkoQiksIChpbnQpKE4pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NjRxaSlfbW01MTJfdW5kZWZpbmVkX3BkKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrNjQpLTEpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX2FsaWducl9lcGk4KFcsIFUsIEEsIEIsIE4pIF9fZXh0ZW5zaW9uX18oe1wKKyAgKF9fbTUxMmkpX19idWlsdGluX2lhMzJfcGFsaWducjUxMl9tYXNrKChfX3Y2NHFpKShfX201MTJpKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjY0cWkpKF9fbTUxMmkpKEIpLCAoaW50KShOKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjY0cWkpKF9fbTUxMmkpKFcpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazY0KShVKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X2FsaWducl9lcGk4KFUsIEEsIEIsIE4pIF9fZXh0ZW5zaW9uX18oe1wKKyAgKF9fbTUxMmkpX19idWlsdGluX2lhMzJfcGFsaWducjUxMl9tYXNrKChfX3Y2NHFpKShfX201MTJpKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjY0cWkpKF9fbTUxMmkpKEIpLCAoaW50KShOKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjY0cWkpX21tNTEyX3NldHplcm9fc2k1MTIoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s2NCkoVSkpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9kYnNhZF9lcHU4KEEsIEIsIGltbSkgX19leHRlbnNpb25fXyAoe1wKKyAgKF9fbTUxMmkpX19idWlsdGluX2lhMzJfZGJwc2FkYnc1MTJfbWFzaygoX192NjRxaSkoX19tNTEyaSkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NjRxaSkoX19tNTEyaSkoQiksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MzJoaSlfbW01MTJfdW5kZWZpbmVkX2VwaTMyKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazMyKS0xKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza19kYnNhZF9lcHU4KFcsIFUsIEEsIEIsIGltbSkgKHtcCisgIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX2RicHNhZGJ3NTEyX21hc2soKF9fdjY0cWkpKF9fbTUxMmkpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjY0cWkpKF9fbTUxMmkpKEIpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjMyaGkpKF9fbTUxMmkpKFcpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2szMikoVSkpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrel9kYnNhZF9lcHU4KFUsIEEsIEIsIGltbSkgKHtcCisgIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX2RicHNhZGJ3NTEyX21hc2soKF9fdjY0cWkpKF9fbTUxMmkpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjY0cWkpKF9fbTUxMmkpKEIpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjMyaGkpX21tNTEyX3NldHplcm9faGkoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMzIpKFUpKTsgfSkKKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9zYWRfZXB1OCAoX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcHNhZGJ3NTEyICgoX192NjRxaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjY0cWkpIF9fQik7Cit9CisKKworCisjdW5kZWYgX19ERUZBVUxUX0ZOX0FUVFJTCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvYXZ4NTEyY2RpbnRyaW4uaCBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL2F2eDUxMmNkaW50cmluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNjNDIzNQotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL2F2eDUxMmNkaW50cmluLmgKQEAgLTAsMCArMSwxNDQgQEAKKy8qPT09LS0tLS0tLS0tLS0tLSBhdng1MTJjZGludHJpbi5oIC0gQVZYNTEyQ0QgaW50cmluc2ljcyAtLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICoKKyAqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqLworI2lmbmRlZiBfX0lNTUlOVFJJTl9ICisjZXJyb3IgIk5ldmVyIHVzZSA8YXZ4NTEyY2RpbnRyaW4uaD4gZGlyZWN0bHk7IGluY2x1ZGUgPGltbWludHJpbi5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9fQVZYNTEyQ0RJTlRSSU5fSAorI2RlZmluZSBfX0FWWDUxMkNESU5UUklOX0gKKworLyogRGVmaW5lIHRoZSBkZWZhdWx0IGF0dHJpYnV0ZXMgZm9yIHRoZSBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlLiAqLworI2RlZmluZSBfX0RFRkFVTFRfRk5fQVRUUlMgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fLCBfX3RhcmdldF9fKCJhdng1MTJjZCIpKSkKKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9jb25mbGljdF9lcGk2NCAoX19tNTEyaSBfX0EpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfdnBjb25mbGljdGRpXzUxMl9tYXNrICgoX192OGRpKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3Y4ZGkpIF9tbTUxMl9zZXR6ZXJvX3NpNTEyICgpLAorICAgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2NvbmZsaWN0X2VwaTY0IChfX201MTJpIF9fVywgX19tbWFzazggX19VLCBfX201MTJpIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl92cGNvbmZsaWN0ZGlfNTEyX21hc2sgKChfX3Y4ZGkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3Y4ZGkpIF9fVywKKyAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9jb25mbGljdF9lcGk2NCAoX19tbWFzazggX19VLCBfX201MTJpIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl92cGNvbmZsaWN0ZGlfNTEyX21hc2sgKChfX3Y4ZGkpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjhkaSkgX21tNTEyX3NldHplcm9fc2k1MTIgKCksCisgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9jb25mbGljdF9lcGkzMiAoX19tNTEyaSBfX0EpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfdnBjb25mbGljdHNpXzUxMl9tYXNrICgoX192MTZzaSkgX19BLAorICAgICAgICAgICAgICAgICAoX192MTZzaSkgX21tNTEyX3NldHplcm9fc2k1MTIgKCksCisgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2NvbmZsaWN0X2VwaTMyIChfX201MTJpIF9fVywgX19tbWFzazE2IF9fVSwgX19tNTEyaSBfX0EpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfdnBjb25mbGljdHNpXzUxMl9tYXNrICgoX192MTZzaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjE2c2kpIF9fVywKKyAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfY29uZmxpY3RfZXBpMzIgKF9fbW1hc2sxNiBfX1UsIF9fbTUxMmkgX19BKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3ZwY29uZmxpY3RzaV81MTJfbWFzayAoKF9fdjE2c2kpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjE2c2kpIF9tbTUxMl9zZXR6ZXJvX3NpNTEyICgpLAorICAgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2x6Y250X2VwaTMyIChfX201MTJpIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl92cGx6Y250ZF81MTJfbWFzayAoKF9fdjE2c2kpIF9fQSwKKyAgICAgICAgICAgICAoX192MTZzaSkgX21tNTEyX3NldHplcm9fc2k1MTIgKCksCisgICAgICAgICAgICAgKF9fbW1hc2sxNikgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfbHpjbnRfZXBpMzIgKF9fbTUxMmkgX19XLCBfX21tYXNrMTYgX19VLCBfX201MTJpIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl92cGx6Y250ZF81MTJfbWFzayAoKF9fdjE2c2kpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjE2c2kpIF9fVywKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9semNudF9lcGkzMiAoX19tbWFzazE2IF9fVSwgX19tNTEyaSBfX0EpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfdnBsemNudGRfNTEyX21hc2sgKChfX3YxNnNpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjE2c2kpIF9tbTUxMl9zZXR6ZXJvX3NpNTEyICgpLAorICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbHpjbnRfZXBpNjQgKF9fbTUxMmkgX19BKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3ZwbHpjbnRxXzUxMl9tYXNrICgoX192OGRpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjhkaSkgX21tNTEyX3NldHplcm9fc2k1MTIgKCksCisgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19semNudF9lcGk2NCAoX19tNTEyaSBfX1csIF9fbW1hc2s4IF9fVSwgX19tNTEyaSBfX0EpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfdnBsemNudHFfNTEyX21hc2sgKChfX3Y4ZGkpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjhkaSkgX19XLAorICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfbHpjbnRfZXBpNjQgKF9fbW1hc2s4IF9fVSwgX19tNTEyaSBfX0EpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfdnBsemNudHFfNTEyX21hc2sgKChfX3Y4ZGkpIF9fQSwKKyAgICAgICAgICAgICAoX192OGRpKSBfbW01MTJfc2V0emVyb19zaTUxMiAoKSwKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfYnJvYWRjYXN0bWJfZXBpNjQgKF9fbW1hc2s4IF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9icm9hZGNhc3RtYjUxMiAoX19BKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9icm9hZGNhc3Rtd19lcGkzMiAoX19tbWFzazE2IF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9icm9hZGNhc3RtdzUxMiAoX19BKTsKK30KKworI3VuZGVmIF9fREVGQVVMVF9GTl9BVFRSUworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL2F2eDUxMmRxaW50cmluLmggYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9hdng1MTJkcWludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNjY1ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9hdng1MTJkcWludHJpbi5oCkBAIC0wLDAgKzEsMTMzMSBAQAorLyo9PT0tLS0tIGF2eDUxMmRxaW50cmluLmggLSBBVlg1MTJEUSBpbnRyaW5zaWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqCisgKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisgKi8KKworI2lmbmRlZiBfX0lNTUlOVFJJTl9ICisjZXJyb3IgIk5ldmVyIHVzZSA8YXZ4NTEyZHFpbnRyaW4uaD4gZGlyZWN0bHk7IGluY2x1ZGUgPGltbWludHJpbi5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9fQVZYNTEyRFFJTlRSSU5fSAorI2RlZmluZSBfX0FWWDUxMkRRSU5UUklOX0gKKworLyogRGVmaW5lIHRoZSBkZWZhdWx0IGF0dHJpYnV0ZXMgZm9yIHRoZSBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlLiAqLworI2RlZmluZSBfX0RFRkFVTFRfRk5fQVRUUlMgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fLCBfX3RhcmdldF9fKCJhdng1MTJkcSIpKSkKKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tdWxsb19lcGk2NCAoX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKSB7CisgIHJldHVybiAoX19tNTEyaSkgKChfX3Y4ZHUpIF9fQSAqIChfX3Y4ZHUpIF9fQik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19tdWxsb19lcGk2NCAoX19tNTEyaSBfX1csIF9fbW1hc2s4IF9fVSwgX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKSB7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcG11bGxxNTEyX21hc2sgKChfX3Y4ZGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjhkaSkgX19CLAorICAgICAgICAgICAgICAoX192OGRpKSBfX1csCisgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9tdWxsb19lcGk2NCAoX19tbWFzazggX19VLCBfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpIHsKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbXVsbHE1MTJfbWFzayAoKF9fdjhkaSkgX19BLAorICAgICAgICAgICAgICAoX192OGRpKSBfX0IsCisgICAgICAgICAgICAgIChfX3Y4ZGkpCisgICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3NpNTEyICgpLAorICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfeG9yX3BkIChfX201MTJkIF9fQSwgX19tNTEyZCBfX0IpIHsKKyAgcmV0dXJuIChfX201MTJkKSAoKF9fdjhkdSkgX19BIF4gKF9fdjhkdSkgX19CKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX3hvcl9wZCAoX19tNTEyZCBfX1csIF9fbW1hc2s4IF9fVSwgX19tNTEyZCBfX0EsIF9fbTUxMmQgX19CKSB7CisgIHJldHVybiAoX19tNTEyZCkgX19idWlsdGluX2lhMzJfeG9ycGQ1MTJfbWFzayAoKF9fdjhkZikgX19BLAorICAgICAgICAgICAgIChfX3Y4ZGYpIF9fQiwKKyAgICAgICAgICAgICAoX192OGRmKSBfX1csCisgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X3hvcl9wZCAoX19tbWFzazggX19VLCBfX201MTJkIF9fQSwgX19tNTEyZCBfX0IpIHsKKyAgcmV0dXJuIChfX201MTJkKSBfX2J1aWx0aW5faWEzMl94b3JwZDUxMl9tYXNrICgoX192OGRmKSBfX0EsCisgICAgICAgICAgICAgKF9fdjhkZikgX19CLAorICAgICAgICAgICAgIChfX3Y4ZGYpCisgICAgICAgICAgICAgX21tNTEyX3NldHplcm9fcGQgKCksCisgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfeG9yX3BzIChfX201MTIgX19BLCBfX201MTIgX19CKSB7CisgIHJldHVybiAoX19tNTEyKSAoKF9fdjE2c3UpIF9fQSBeIChfX3YxNnN1KSBfX0IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza194b3JfcHMgKF9fbTUxMiBfX1csIF9fbW1hc2sxNiBfX1UsIF9fbTUxMiBfX0EsIF9fbTUxMiBfX0IpIHsKKyAgcmV0dXJuIChfX201MTIpIF9fYnVpbHRpbl9pYTMyX3hvcnBzNTEyX21hc2sgKChfX3YxNnNmKSBfX0EsCisgICAgICAgICAgICAoX192MTZzZikgX19CLAorICAgICAgICAgICAgKF9fdjE2c2YpIF9fVywKKyAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel94b3JfcHMgKF9fbW1hc2sxNiBfX1UsIF9fbTUxMiBfX0EsIF9fbTUxMiBfX0IpIHsKKyAgcmV0dXJuIChfX201MTIpIF9fYnVpbHRpbl9pYTMyX3hvcnBzNTEyX21hc2sgKChfX3YxNnNmKSBfX0EsCisgICAgICAgICAgICAoX192MTZzZikgX19CLAorICAgICAgICAgICAgKF9fdjE2c2YpCisgICAgICAgICAgICBfbW01MTJfc2V0emVyb19wcyAoKSwKKyAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfb3JfcGQgKF9fbTUxMmQgX19BLCBfX201MTJkIF9fQikgeworICByZXR1cm4gKF9fbTUxMmQpICgoX192OGR1KSBfX0EgfCAoX192OGR1KSBfX0IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfb3JfcGQgKF9fbTUxMmQgX19XLCBfX21tYXNrOCBfX1UsIF9fbTUxMmQgX19BLCBfX201MTJkIF9fQikgeworICByZXR1cm4gKF9fbTUxMmQpIF9fYnVpbHRpbl9pYTMyX29ycGQ1MTJfbWFzayAoKF9fdjhkZikgX19BLAorICAgICAgICAgICAgKF9fdjhkZikgX19CLAorICAgICAgICAgICAgKF9fdjhkZikgX19XLAorICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X29yX3BkIChfX21tYXNrOCBfX1UsIF9fbTUxMmQgX19BLCBfX201MTJkIF9fQikgeworICByZXR1cm4gKF9fbTUxMmQpIF9fYnVpbHRpbl9pYTMyX29ycGQ1MTJfbWFzayAoKF9fdjhkZikgX19BLAorICAgICAgICAgICAgKF9fdjhkZikgX19CLAorICAgICAgICAgICAgKF9fdjhkZikKKyAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3BkICgpLAorICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfb3JfcHMgKF9fbTUxMiBfX0EsIF9fbTUxMiBfX0IpIHsKKyAgcmV0dXJuIChfX201MTIpICgoX192MTZzdSkgX19BIHwgKF9fdjE2c3UpIF9fQik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX29yX3BzIChfX201MTIgX19XLCBfX21tYXNrMTYgX19VLCBfX201MTIgX19BLCBfX201MTIgX19CKSB7CisgIHJldHVybiAoX19tNTEyKSBfX2J1aWx0aW5faWEzMl9vcnBzNTEyX21hc2sgKChfX3YxNnNmKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3YxNnNmKSBfX0IsCisgICAgICAgICAgICAgICAgIChfX3YxNnNmKSBfX1csCisgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9vcl9wcyAoX19tbWFzazE2IF9fVSwgX19tNTEyIF9fQSwgX19tNTEyIF9fQikgeworICByZXR1cm4gKF9fbTUxMikgX19idWlsdGluX2lhMzJfb3JwczUxMl9tYXNrICgoX192MTZzZikgX19BLAorICAgICAgICAgICAgICAgICAoX192MTZzZikgX19CLAorICAgICAgICAgICAgICAgICAoX192MTZzZikKKyAgICAgICAgICAgICAgICAgX21tNTEyX3NldHplcm9fcHMgKCksCisgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfYW5kX3BkIChfX201MTJkIF9fQSwgX19tNTEyZCBfX0IpIHsKKyAgcmV0dXJuIChfX201MTJkKSAoKF9fdjhkdSkgX19BICYgKF9fdjhkdSkgX19CKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2FuZF9wZCAoX19tNTEyZCBfX1csIF9fbW1hc2s4IF9fVSwgX19tNTEyZCBfX0EsIF9fbTUxMmQgX19CKSB7CisgIHJldHVybiAoX19tNTEyZCkgX19idWlsdGluX2lhMzJfYW5kcGQ1MTJfbWFzayAoKF9fdjhkZikgX19BLAorICAgICAgICAgICAgIChfX3Y4ZGYpIF9fQiwKKyAgICAgICAgICAgICAoX192OGRmKSBfX1csCisgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X2FuZF9wZCAoX19tbWFzazggX19VLCBfX201MTJkIF9fQSwgX19tNTEyZCBfX0IpIHsKKyAgcmV0dXJuIChfX201MTJkKSBfX2J1aWx0aW5faWEzMl9hbmRwZDUxMl9tYXNrICgoX192OGRmKSBfX0EsCisgICAgICAgICAgICAgKF9fdjhkZikgX19CLAorICAgICAgICAgICAgIChfX3Y4ZGYpCisgICAgICAgICAgICAgX21tNTEyX3NldHplcm9fcGQgKCksCisgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfYW5kX3BzIChfX201MTIgX19BLCBfX201MTIgX19CKSB7CisgIHJldHVybiAoX19tNTEyKSAoKF9fdjE2c3UpIF9fQSAmIChfX3YxNnN1KSBfX0IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19hbmRfcHMgKF9fbTUxMiBfX1csIF9fbW1hc2sxNiBfX1UsIF9fbTUxMiBfX0EsIF9fbTUxMiBfX0IpIHsKKyAgcmV0dXJuIChfX201MTIpIF9fYnVpbHRpbl9pYTMyX2FuZHBzNTEyX21hc2sgKChfX3YxNnNmKSBfX0EsCisgICAgICAgICAgICAoX192MTZzZikgX19CLAorICAgICAgICAgICAgKF9fdjE2c2YpIF9fVywKKyAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9hbmRfcHMgKF9fbW1hc2sxNiBfX1UsIF9fbTUxMiBfX0EsIF9fbTUxMiBfX0IpIHsKKyAgcmV0dXJuIChfX201MTIpIF9fYnVpbHRpbl9pYTMyX2FuZHBzNTEyX21hc2sgKChfX3YxNnNmKSBfX0EsCisgICAgICAgICAgICAoX192MTZzZikgX19CLAorICAgICAgICAgICAgKF9fdjE2c2YpCisgICAgICAgICAgICBfbW01MTJfc2V0emVyb19wcyAoKSwKKyAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfYW5kbm90X3BkIChfX201MTJkIF9fQSwgX19tNTEyZCBfX0IpIHsKKyAgcmV0dXJuIChfX201MTJkKSBfX2J1aWx0aW5faWEzMl9hbmRucGQ1MTJfbWFzayAoKF9fdjhkZikgX19BLAorICAgICAgICAgICAgICAoX192OGRmKSBfX0IsCisgICAgICAgICAgICAgIChfX3Y4ZGYpCisgICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3BkICgpLAorICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2FuZG5vdF9wZCAoX19tNTEyZCBfX1csIF9fbW1hc2s4IF9fVSwgX19tNTEyZCBfX0EsIF9fbTUxMmQgX19CKSB7CisgIHJldHVybiAoX19tNTEyZCkgX19idWlsdGluX2lhMzJfYW5kbnBkNTEyX21hc2sgKChfX3Y4ZGYpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjhkZikgX19CLAorICAgICAgICAgICAgICAoX192OGRmKSBfX1csCisgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9hbmRub3RfcGQgKF9fbW1hc2s4IF9fVSwgX19tNTEyZCBfX0EsIF9fbTUxMmQgX19CKSB7CisgIHJldHVybiAoX19tNTEyZCkgX19idWlsdGluX2lhMzJfYW5kbnBkNTEyX21hc2sgKChfX3Y4ZGYpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjhkZikgX19CLAorICAgICAgICAgICAgICAoX192OGRmKQorICAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19wZCAoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfYW5kbm90X3BzIChfX201MTIgX19BLCBfX201MTIgX19CKSB7CisgIHJldHVybiAoX19tNTEyKSBfX2J1aWx0aW5faWEzMl9hbmRucHM1MTJfbWFzayAoKF9fdjE2c2YpIF9fQSwKKyAgICAgICAgICAgICAoX192MTZzZikgX19CLAorICAgICAgICAgICAgIChfX3YxNnNmKQorICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3BzICgpLAorICAgICAgICAgICAgIChfX21tYXNrMTYpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfYW5kbm90X3BzIChfX201MTIgX19XLCBfX21tYXNrMTYgX19VLCBfX201MTIgX19BLCBfX201MTIgX19CKSB7CisgIHJldHVybiAoX19tNTEyKSBfX2J1aWx0aW5faWEzMl9hbmRucHM1MTJfbWFzayAoKF9fdjE2c2YpIF9fQSwKKyAgICAgICAgICAgICAoX192MTZzZikgX19CLAorICAgICAgICAgICAgIChfX3YxNnNmKSBfX1csCisgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X2FuZG5vdF9wcyAoX19tbWFzazE2IF9fVSwgX19tNTEyIF9fQSwgX19tNTEyIF9fQikgeworICByZXR1cm4gKF9fbTUxMikgX19idWlsdGluX2lhMzJfYW5kbnBzNTEyX21hc2sgKChfX3YxNnNmKSBfX0EsCisgICAgICAgICAgICAgKF9fdjE2c2YpIF9fQiwKKyAgICAgICAgICAgICAoX192MTZzZikKKyAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19wcyAoKSwKKyAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2N2dHBkX2VwaTY0IChfX201MTJkIF9fQSkgeworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX2N2dHBkMnFxNTEyX21hc2sgKChfX3Y4ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192OGRpKSBfbW01MTJfc2V0emVyb19zaTUxMigpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEsCisgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2N2dHBkX2VwaTY0IChfX201MTJpIF9fVywgX19tbWFzazggX19VLCBfX201MTJkIF9fQSkgeworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX2N2dHBkMnFxNTEyX21hc2sgKChfX3Y4ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192OGRpKSBfX1csCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9jdnRwZF9lcGk2NCAoX19tbWFzazggX19VLCBfX201MTJkIF9fQSkgeworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX2N2dHBkMnFxNTEyX21hc2sgKChfX3Y4ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192OGRpKSBfbW01MTJfc2V0emVyb19zaTUxMigpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKKyNkZWZpbmUgX21tNTEyX2N2dF9yb3VuZHBkX2VwaTY0KEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgICAgICAgICAgICAgIFwKKyAgKF9fbTUxMmkpX19idWlsdGluX2lhMzJfY3Z0cGQycXE1MTJfbWFzaygoX192OGRmKShfX201MTJkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGkpX21tNTEyX3NldHplcm9fc2k1MTIoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX2N2dF9yb3VuZHBkX2VwaTY0KFcsIFUsIEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9jdnRwZDJxcTUxMl9tYXNrKChfX3Y4ZGYpKF9fbTUxMmQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkaSkoX19tNTEyaSkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X2N2dF9yb3VuZHBkX2VwaTY0KFUsIEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgICBcCisgIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX2N2dHBkMnFxNTEyX21hc2soKF9fdjhkZikoX19tNTEyZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKV9tbTUxMl9zZXR6ZXJvX3NpNTEyKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShSKSk7IH0pCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfY3Z0cGRfZXB1NjQgKF9fbTUxMmQgX19BKSB7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfY3Z0cGQydXFxNTEyX21hc2sgKChfX3Y4ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjhkaSkgX21tNTEyX3NldHplcm9fc2k1MTIoKSwKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSwKKyAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2N2dHBkX2VwdTY0IChfX201MTJpIF9fVywgX19tbWFzazggX19VLCBfX201MTJkIF9fQSkgeworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX2N2dHBkMnVxcTUxMl9tYXNrICgoX192OGRmKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3Y4ZGkpIF9fVywKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfY3Z0cGRfZXB1NjQgKF9fbW1hc2s4IF9fVSwgX19tNTEyZCBfX0EpIHsKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9jdnRwZDJ1cXE1MTJfbWFzayAoKF9fdjhkZikgX19BLAorICAgICAgICAgICAgICAgICAoX192OGRpKSBfbW01MTJfc2V0emVyb19zaTUxMigpLAorICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworI2RlZmluZSBfbW01MTJfY3Z0X3JvdW5kcGRfZXB1NjQoQSwgUikgX19leHRlbnNpb25fXyAoeyAgICAgICAgICAgICAgIFwKKyAgKF9fbTUxMmkpX19idWlsdGluX2lhMzJfY3Z0cGQydXFxNTEyX21hc2soKF9fdjhkZikoX19tNTEyZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkaSlfbW01MTJfc2V0emVyb19zaTUxMigpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX2N2dF9yb3VuZHBkX2VwdTY0KFcsIFUsIEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9jdnRwZDJ1cXE1MTJfbWFzaygoX192OGRmKShfX201MTJkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKShfX201MTJpKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X2N2dF9yb3VuZHBkX2VwdTY0KFUsIEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgICAgIFwKKyAgKF9fbTUxMmkpX19idWlsdGluX2lhMzJfY3Z0cGQydXFxNTEyX21hc2soKF9fdjhkZikoX19tNTEyZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkaSlfbW01MTJfc2V0emVyb19zaTUxMigpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIChpbnQpKFIpKTsgfSkKKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9jdnRwc19lcGk2NCAoX19tMjU2IF9fQSkgeworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX2N2dHBzMnFxNTEyX21hc2sgKChfX3Y4c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192OGRpKSBfbW01MTJfc2V0emVyb19zaTUxMigpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEsCisgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2N2dHBzX2VwaTY0IChfX201MTJpIF9fVywgX19tbWFzazggX19VLCBfX20yNTYgX19BKSB7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfY3Z0cHMycXE1MTJfbWFzayAoKF9fdjhzZikgX19BLAorICAgICAgICAgICAgICAgIChfX3Y4ZGkpIF9fVywKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X2N2dHBzX2VwaTY0IChfX21tYXNrOCBfX1UsIF9fbTI1NiBfX0EpIHsKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9jdnRwczJxcTUxMl9tYXNrICgoX192OHNmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjhkaSkgX21tNTEyX3NldHplcm9fc2k1MTIoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCisjZGVmaW5lIF9tbTUxMl9jdnRfcm91bmRwc19lcGk2NChBLCBSKSBfX2V4dGVuc2lvbl9fICh7ICAgICAgICAgICAgIFwKKyAgKF9fbTUxMmkpX19idWlsdGluX2lhMzJfY3Z0cHMycXE1MTJfbWFzaygoX192OHNmKShfX20yNTYpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkaSlfbW01MTJfc2V0emVyb19zaTUxMigpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2tfY3Z0X3JvdW5kcHNfZXBpNjQoVywgVSwgQSwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX2N2dHBzMnFxNTEyX21hc2soKF9fdjhzZikoX19tMjU2KShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGkpKF9fbTUxMmkpKFcpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrel9jdnRfcm91bmRwc19lcGk2NChVLCBBLCBSKSBfX2V4dGVuc2lvbl9fICh7ICAgXAorICAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9jdnRwczJxcTUxMl9tYXNrKChfX3Y4c2YpKF9fbTI1NikoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKV9tbTUxMl9zZXR6ZXJvX3NpNTEyKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShSKSk7IH0pCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfY3Z0cHNfZXB1NjQgKF9fbTI1NiBfX0EpIHsKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9jdnRwczJ1cXE1MTJfbWFzayAoKF9fdjhzZikgX19BLAorICAgICAgICAgICAgICAgICAoX192OGRpKSBfbW01MTJfc2V0emVyb19zaTUxMigpLAorICAgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xLAorICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfY3Z0cHNfZXB1NjQgKF9fbTUxMmkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTI1NiBfX0EpIHsKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9jdnRwczJ1cXE1MTJfbWFzayAoKF9fdjhzZikgX19BLAorICAgICAgICAgICAgICAgICAoX192OGRpKSBfX1csCisgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X2N2dHBzX2VwdTY0IChfX21tYXNrOCBfX1UsIF9fbTI1NiBfX0EpIHsKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9jdnRwczJ1cXE1MTJfbWFzayAoKF9fdjhzZikgX19BLAorICAgICAgICAgICAgICAgICAoX192OGRpKSBfbW01MTJfc2V0emVyb19zaTUxMigpLAorICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworI2RlZmluZSBfbW01MTJfY3Z0X3JvdW5kcHNfZXB1NjQoQSwgUikgX19leHRlbnNpb25fXyAoeyAgICAgICAgICAgICAgXAorICAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9jdnRwczJ1cXE1MTJfbWFzaygoX192OHNmKShfX20yNTYpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGkpX21tNTEyX3NldHplcm9fc2k1MTIoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEsIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza19jdnRfcm91bmRwc19lcHU2NChXLCBVLCBBLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmkpX19idWlsdGluX2lhMzJfY3Z0cHMydXFxNTEyX21hc2soKF9fdjhzZikoX19tMjU2KShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKShfX201MTJpKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X2N2dF9yb3VuZHBzX2VwdTY0KFUsIEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgICBcCisgIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX2N2dHBzMnVxcTUxMl9tYXNrKChfX3Y4c2YpKF9fbTI1NikoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkaSlfbW01MTJfc2V0emVyb19zaTUxMigpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIChpbnQpKFIpKTsgfSkKKworCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2N2dGVwaTY0X3BkIChfX201MTJpIF9fQSkgeworICByZXR1cm4gKF9fbTUxMmQpIF9fYnVpbHRpbl9pYTMyX2N2dHFxMnBkNTEyX21hc2sgKChfX3Y4ZGkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192OGRmKSBfbW01MTJfc2V0emVyb19wZCgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEsCisgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2N2dGVwaTY0X3BkIChfX201MTJkIF9fVywgX19tbWFzazggX19VLCBfX201MTJpIF9fQSkgeworICByZXR1cm4gKF9fbTUxMmQpIF9fYnVpbHRpbl9pYTMyX2N2dHFxMnBkNTEyX21hc2sgKChfX3Y4ZGkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192OGRmKSBfX1csCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9jdnRlcGk2NF9wZCAoX19tbWFzazggX19VLCBfX201MTJpIF9fQSkgeworICByZXR1cm4gKF9fbTUxMmQpIF9fYnVpbHRpbl9pYTMyX2N2dHFxMnBkNTEyX21hc2sgKChfX3Y4ZGkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192OGRmKSBfbW01MTJfc2V0emVyb19wZCgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKKyNkZWZpbmUgX21tNTEyX2N2dF9yb3VuZGVwaTY0X3BkKEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgICAgICAgICAgXAorICAoX19tNTEyZClfX2J1aWx0aW5faWEzMl9jdnRxcTJwZDUxMl9tYXNrKChfX3Y4ZGkpKF9fbTUxMmkpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZilfbW01MTJfc2V0emVyb19wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2tfY3Z0X3JvdW5kZXBpNjRfcGQoVywgVSwgQSwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJkKV9fYnVpbHRpbl9pYTMyX2N2dHFxMnBkNTEyX21hc2soKF9fdjhkaSkoX19tNTEyaSkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKShfX201MTJkKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza3pfY3Z0X3JvdW5kZXBpNjRfcGQoVSwgQSwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJkKV9fYnVpbHRpbl9pYTMyX2N2dHFxMnBkNTEyX21hc2soKF9fdjhkaSkoX19tNTEyaSkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKV9tbTUxMl9zZXR6ZXJvX3BkKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShSKSk7IH0pCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9jdnRlcGk2NF9wcyAoX19tNTEyaSBfX0EpIHsKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX2N2dHFxMnBzNTEyX21hc2sgKChfX3Y4ZGkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3Y4c2YpIF9tbTI1Nl9zZXR6ZXJvX3BzKCksCisgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xLAorICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfY3Z0ZXBpNjRfcHMgKF9fbTI1NiBfX1csIF9fbW1hc2s4IF9fVSwgX19tNTEyaSBfX0EpIHsKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX2N2dHFxMnBzNTEyX21hc2sgKChfX3Y4ZGkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3Y4c2YpIF9fVywKKyAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X2N2dGVwaTY0X3BzIChfX21tYXNrOCBfX1UsIF9fbTUxMmkgX19BKSB7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9jdnRxcTJwczUxMl9tYXNrICgoX192OGRpKSBfX0EsCisgICAgICAgICAgICAgICAoX192OHNmKSBfbW0yNTZfc2V0emVyb19wcygpLAorICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCisjZGVmaW5lIF9tbTUxMl9jdnRfcm91bmRlcGk2NF9wcyhBLCBSKSBfX2V4dGVuc2lvbl9fICh7ICAgICAgICBcCisgIChfX20yNTYpX19idWlsdGluX2lhMzJfY3Z0cXEycHM1MTJfbWFzaygoX192OGRpKShfX201MTJpKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzZilfbW0yNTZfc2V0emVyb19wcygpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEsIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza19jdnRfcm91bmRlcGk2NF9wcyhXLCBVLCBBLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NilfX2J1aWx0aW5faWEzMl9jdnRxcTJwczUxMl9tYXNrKChfX3Y4ZGkpKF9fbTUxMmkpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNmKShfX20yNTYpKFcpLCAoX19tbWFzazgpKFUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X2N2dF9yb3VuZGVwaTY0X3BzKFUsIEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2KV9fYnVpbHRpbl9pYTMyX2N2dHFxMnBzNTEyX21hc2soKF9fdjhkaSkoX19tNTEyaSkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2YpX21tMjU2X3NldHplcm9fcHMoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSwgKGludCkoUikpOyB9KQorCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfY3Z0dHBkX2VwaTY0IChfX201MTJkIF9fQSkgeworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX2N2dHRwZDJxcTUxMl9tYXNrICgoX192OGRmKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3Y4ZGkpIF9tbTUxMl9zZXR6ZXJvX3NpNTEyKCksCisgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEsCisgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19jdnR0cGRfZXBpNjQgKF9fbTUxMmkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTUxMmQgX19BKSB7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfY3Z0dHBkMnFxNTEyX21hc2sgKChfX3Y4ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjhkaSkgX19XLAorICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9jdnR0cGRfZXBpNjQgKF9fbW1hc2s4IF9fVSwgX19tNTEyZCBfX0EpIHsKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9jdnR0cGQycXE1MTJfbWFzayAoKF9fdjhkZikgX19BLAorICAgICAgICAgICAgICAgICAoX192OGRpKSBfbW01MTJfc2V0emVyb19zaTUxMigpLAorICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworI2RlZmluZSBfbW01MTJfY3Z0dF9yb3VuZHBkX2VwaTY0KEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgICAgICAgICAgICAgXAorICAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9jdnR0cGQycXE1MTJfbWFzaygoX192OGRmKShfX201MTJkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKV9tbTUxMl9zZXR6ZXJvX3NpNTEyKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2tfY3Z0dF9yb3VuZHBkX2VwaTY0KFcsIFUsIEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9jdnR0cGQycXE1MTJfbWFzaygoX192OGRmKShfX201MTJkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKShfX201MTJpKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X2N2dHRfcm91bmRwZF9lcGk2NChVLCBBLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmkpX19idWlsdGluX2lhMzJfY3Z0dHBkMnFxNTEyX21hc2soKF9fdjhkZikoX19tNTEyZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkaSlfbW01MTJfc2V0emVyb19zaTUxMigpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIChpbnQpKFIpKTsgfSkKKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9jdnR0cGRfZXB1NjQgKF9fbTUxMmQgX19BKSB7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfY3Z0dHBkMnVxcTUxMl9tYXNrICgoX192OGRmKSBfX0EsCisgICAgICAgICAgICAgICAgICAoX192OGRpKSBfbW01MTJfc2V0emVyb19zaTUxMigpLAorICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSwKKyAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19jdnR0cGRfZXB1NjQgKF9fbTUxMmkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTUxMmQgX19BKSB7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfY3Z0dHBkMnVxcTUxMl9tYXNrICgoX192OGRmKSBfX0EsCisgICAgICAgICAgICAgICAgICAoX192OGRpKSBfX1csCisgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfY3Z0dHBkX2VwdTY0IChfX21tYXNrOCBfX1UsIF9fbTUxMmQgX19BKSB7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfY3Z0dHBkMnVxcTUxMl9tYXNrICgoX192OGRmKSBfX0EsCisgICAgICAgICAgICAgICAgICAoX192OGRpKSBfbW01MTJfc2V0emVyb19zaTUxMigpLAorICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCisjZGVmaW5lIF9tbTUxMl9jdnR0X3JvdW5kcGRfZXB1NjQoQSwgUikgX19leHRlbnNpb25fXyAoeyAgICAgICAgICAgICAgXAorICAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9jdnR0cGQydXFxNTEyX21hc2soKF9fdjhkZikoX19tNTEyZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGkpX21tNTEyX3NldHplcm9fc2k1MTIoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2tfY3Z0dF9yb3VuZHBkX2VwdTY0KFcsIFUsIEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9jdnR0cGQydXFxNTEyX21hc2soKF9fdjhkZikoX19tNTEyZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGkpKF9fbTUxMmkpKFcpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X2N2dHRfcm91bmRwZF9lcHU2NChVLCBBLCBSKSBfX2V4dGVuc2lvbl9fICh7ICAgXAorICAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9jdnR0cGQydXFxNTEyX21hc2soKF9fdjhkZikoX19tNTEyZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGkpX21tNTEyX3NldHplcm9fc2k1MTIoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSwgKGludCkoUikpOyB9KQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2N2dHRwc19lcGk2NCAoX19tMjU2IF9fQSkgeworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX2N2dHRwczJxcTUxMl9tYXNrICgoX192OHNmKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3Y4ZGkpIF9tbTUxMl9zZXR6ZXJvX3NpNTEyKCksCisgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEsCisgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19jdnR0cHNfZXBpNjQgKF9fbTUxMmkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTI1NiBfX0EpIHsKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9jdnR0cHMycXE1MTJfbWFzayAoKF9fdjhzZikgX19BLAorICAgICAgICAgICAgICAgICAoX192OGRpKSBfX1csCisgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X2N2dHRwc19lcGk2NCAoX19tbWFzazggX19VLCBfX20yNTYgX19BKSB7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfY3Z0dHBzMnFxNTEyX21hc2sgKChfX3Y4c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjhkaSkgX21tNTEyX3NldHplcm9fc2k1MTIoKSwKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKKyNkZWZpbmUgX21tNTEyX2N2dHRfcm91bmRwc19lcGk2NChBLCBSKSBfX2V4dGVuc2lvbl9fICh7ICAgICAgICAgICAgXAorICAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9jdnR0cHMycXE1MTJfbWFzaygoX192OHNmKShfX20yNTYpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGkpX21tNTEyX3NldHplcm9fc2k1MTIoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEsIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza19jdnR0X3JvdW5kcHNfZXBpNjQoVywgVSwgQSwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX2N2dHRwczJxcTUxMl9tYXNrKChfX3Y4c2YpKF9fbTI1NikoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkaSkoX19tNTEyaSkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrel9jdnR0X3JvdW5kcHNfZXBpNjQoVSwgQSwgUikgX19leHRlbnNpb25fXyAoeyAgXAorICAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9jdnR0cHMycXE1MTJfbWFzaygoX192OHNmKShfX20yNTYpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGkpX21tNTEyX3NldHplcm9fc2k1MTIoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShSKSk7IH0pCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfY3Z0dHBzX2VwdTY0IChfX20yNTYgX19BKSB7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfY3Z0dHBzMnVxcTUxMl9tYXNrICgoX192OHNmKSBfX0EsCisgICAgICAgICAgICAgICAgICAoX192OGRpKSBfbW01MTJfc2V0emVyb19zaTUxMigpLAorICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSwKKyAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19jdnR0cHNfZXB1NjQgKF9fbTUxMmkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTI1NiBfX0EpIHsKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9jdnR0cHMydXFxNTEyX21hc2sgKChfX3Y4c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAgIChfX3Y4ZGkpIF9fVywKKyAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9jdnR0cHNfZXB1NjQgKF9fbW1hc2s4IF9fVSwgX19tMjU2IF9fQSkgeworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX2N2dHRwczJ1cXE1MTJfbWFzayAoKF9fdjhzZikgX19BLAorICAgICAgICAgICAgICAgICAgKF9fdjhkaSkgX21tNTEyX3NldHplcm9fc2k1MTIoKSwKKyAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworI2RlZmluZSBfbW01MTJfY3Z0dF9yb3VuZHBzX2VwdTY0KEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgICAgICAgICAgICBcCisgIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX2N2dHRwczJ1cXE1MTJfbWFzaygoX192OHNmKShfX20yNTYpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKV9tbTUxMl9zZXR6ZXJvX3NpNTEyKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX2N2dHRfcm91bmRwc19lcHU2NChXLCBVLCBBLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmkpX19idWlsdGluX2lhMzJfY3Z0dHBzMnVxcTUxMl9tYXNrKChfX3Y4c2YpKF9fbTI1NikoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGkpKF9fbTUxMmkpKFcpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X2N2dHRfcm91bmRwc19lcHU2NChVLCBBLCBSKSBfX2V4dGVuc2lvbl9fICh7ICBcCisgIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX2N2dHRwczJ1cXE1MTJfbWFzaygoX192OHNmKShfX20yNTYpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKV9tbTUxMl9zZXR6ZXJvX3NpNTEyKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIChpbnQpKFIpKTsgfSkKKworc3RhdGljIF9faW5saW5lX18gX19tNTEyZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9jdnRlcHU2NF9wZCAoX19tNTEyaSBfX0EpIHsKKyAgcmV0dXJuIChfX201MTJkKSBfX2J1aWx0aW5faWEzMl9jdnR1cXEycGQ1MTJfbWFzayAoKF9fdjhkaSkgX19BLAorICAgICAgICAgICAgICAgICAoX192OGRmKSBfbW01MTJfc2V0emVyb19wZCgpLAorICAgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xLAorICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfY3Z0ZXB1NjRfcGQgKF9fbTUxMmQgX19XLCBfX21tYXNrOCBfX1UsIF9fbTUxMmkgX19BKSB7CisgIHJldHVybiAoX19tNTEyZCkgX19idWlsdGluX2lhMzJfY3Z0dXFxMnBkNTEyX21hc2sgKChfX3Y4ZGkpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjhkZikgX19XLAorICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9jdnRlcHU2NF9wZCAoX19tbWFzazggX19VLCBfX201MTJpIF9fQSkgeworICByZXR1cm4gKF9fbTUxMmQpIF9fYnVpbHRpbl9pYTMyX2N2dHVxcTJwZDUxMl9tYXNrICgoX192OGRpKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3Y4ZGYpIF9tbTUxMl9zZXR6ZXJvX3BkKCksCisgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCisjZGVmaW5lIF9tbTUxMl9jdnRfcm91bmRlcHU2NF9wZChBLCBSKSBfX2V4dGVuc2lvbl9fICh7ICAgICAgICAgIFwKKyAgKF9fbTUxMmQpX19idWlsdGluX2lhMzJfY3Z0dXFxMnBkNTEyX21hc2soKF9fdjhkaSkoX19tNTEyaSkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZilfbW01MTJfc2V0emVyb19wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX2N2dF9yb3VuZGVwdTY0X3BkKFcsIFUsIEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyZClfX2J1aWx0aW5faWEzMl9jdnR1cXEycGQ1MTJfbWFzaygoX192OGRpKShfX201MTJpKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKShfX201MTJkKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShSKSk7IH0pCisKKworI2RlZmluZSBfbW01MTJfbWFza3pfY3Z0X3JvdW5kZXB1NjRfcGQoVSwgQSwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJkKV9fYnVpbHRpbl9pYTMyX2N2dHVxcTJwZDUxMl9tYXNrKChfX3Y4ZGkpKF9fbTUxMmkpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpX21tNTEyX3NldHplcm9fcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShSKSk7IH0pCisKKworc3RhdGljIF9faW5saW5lX18gX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2N2dGVwdTY0X3BzIChfX201MTJpIF9fQSkgeworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfY3Z0dXFxMnBzNTEyX21hc2sgKChfX3Y4ZGkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192OHNmKSBfbW0yNTZfc2V0emVyb19wcygpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEsCisgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfY3Z0ZXB1NjRfcHMgKF9fbTI1NiBfX1csIF9fbW1hc2s4IF9fVSwgX19tNTEyaSBfX0EpIHsKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX2N2dHVxcTJwczUxMl9tYXNrICgoX192OGRpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjhzZikgX19XLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9jdnRlcHU2NF9wcyAoX19tbWFzazggX19VLCBfX201MTJpIF9fQSkgeworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfY3Z0dXFxMnBzNTEyX21hc2sgKChfX3Y4ZGkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192OHNmKSBfbW0yNTZfc2V0emVyb19wcygpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKKyNkZWZpbmUgX21tNTEyX2N2dF9yb3VuZGVwdTY0X3BzKEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgICAgICAgICBcCisgIChfX20yNTYpX19idWlsdGluX2lhMzJfY3Z0dXFxMnBzNTEyX21hc2soKF9fdjhkaSkoX19tNTEyaSkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNmKV9tbTI1Nl9zZXR6ZXJvX3BzKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEsIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza19jdnRfcm91bmRlcHU2NF9wcyhXLCBVLCBBLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NilfX2J1aWx0aW5faWEzMl9jdnR1cXEycHM1MTJfbWFzaygoX192OGRpKShfX201MTJpKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2YpKF9fbTI1NikoVyksIChfX21tYXNrOCkoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X2N2dF9yb3VuZGVwdTY0X3BzKFUsIEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2KV9fYnVpbHRpbl9pYTMyX2N2dHVxcTJwczUxMl9tYXNrKChfX3Y4ZGkpKF9fbTUxMmkpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzZilfbW0yNTZfc2V0emVyb19wcygpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9yYW5nZV9wZChBLCBCLCBDKSBfX2V4dGVuc2lvbl9fICh7ICAgICAgICAgICAgICAgICAgICAgXAorICAoX19tNTEyZClfX2J1aWx0aW5faWEzMl9yYW5nZXBkNTEyX21hc2soKF9fdjhkZikoX19tNTEyZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpKF9fbTUxMmQpKEIpLCAoaW50KShDKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZilfbW01MTJfc2V0emVyb19wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2tfcmFuZ2VfcGQoVywgVSwgQSwgQiwgQykgX19leHRlbnNpb25fXyAoeyAgICAgIFwKKyAgKF9fbTUxMmQpX19idWlsdGluX2lhMzJfcmFuZ2VwZDUxMl9tYXNrKChfX3Y4ZGYpKF9fbTUxMmQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKShfX201MTJkKShCKSwgKGludCkoQyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpKF9fbTUxMmQpKFcpLCAoX19tbWFzazgpKFUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrel9yYW5nZV9wZChVLCBBLCBCLCBDKSBfX2V4dGVuc2lvbl9fICh7ICAgICAgICAgICBcCisgIChfX201MTJkKV9fYnVpbHRpbl9pYTMyX3JhbmdlcGQ1MTJfbWFzaygoX192OGRmKShfX201MTJkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikoX19tNTEyZCkoQiksIChpbnQpKEMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKV9tbTUxMl9zZXR6ZXJvX3BkKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7IH0pCisKKyNkZWZpbmUgX21tNTEyX3JhbmdlX3JvdW5kX3BkKEEsIEIsIEMsIFIpIF9fZXh0ZW5zaW9uX18gKHsgICAgICAgICAgIFwKKyAgKF9fbTUxMmQpX19idWlsdGluX2lhMzJfcmFuZ2VwZDUxMl9tYXNrKChfX3Y4ZGYpKF9fbTUxMmQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKShfX201MTJkKShCKSwgKGludCkoQyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpX21tNTEyX3NldHplcm9fcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2tfcmFuZ2Vfcm91bmRfcGQoVywgVSwgQSwgQiwgQywgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJkKV9fYnVpbHRpbl9pYTMyX3JhbmdlcGQ1MTJfbWFzaygoX192OGRmKShfX201MTJkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikoX19tNTEyZCkoQiksIChpbnQpKEMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKShfX201MTJkKShXKSwgKF9fbW1hc2s4KShVKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrel9yYW5nZV9yb3VuZF9wZChVLCBBLCBCLCBDLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmQpX19idWlsdGluX2lhMzJfcmFuZ2VwZDUxMl9tYXNrKChfX3Y4ZGYpKF9fbTUxMmQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKShfX201MTJkKShCKSwgKGludCkoQyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpX21tNTEyX3NldHplcm9fcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9yYW5nZV9wcyhBLCBCLCBDKSBfX2V4dGVuc2lvbl9fICh7ICAgICAgICAgICAgICAgICAgICAgICBcCisgIChfX201MTIpX19idWlsdGluX2lhMzJfcmFuZ2VwczUxMl9tYXNrKChfX3YxNnNmKShfX201MTIpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKShfX201MTIpKEIpLCAoaW50KShDKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZilfbW01MTJfc2V0emVyb19wcygpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpLTEsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza19yYW5nZV9wcyhXLCBVLCBBLCBCLCBDKSBfX2V4dGVuc2lvbl9fICh7ICAgICAgICAgXAorICAoX19tNTEyKV9fYnVpbHRpbl9pYTMyX3JhbmdlcHM1MTJfbWFzaygoX192MTZzZikoX19tNTEyKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikoX19tNTEyKShCKSwgKGludCkoQyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpKF9fbTUxMikoVyksIChfX21tYXNrMTYpKFUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X3JhbmdlX3BzKFUsIEEsIEIsIEMpIF9fZXh0ZW5zaW9uX18gKHsgICAgICBcCisgIChfX201MTIpX19idWlsdGluX2lhMzJfcmFuZ2VwczUxMl9tYXNrKChfX3YxNnNmKShfX201MTIpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKShfX201MTIpKEIpLCAoaW50KShDKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZilfbW01MTJfc2V0emVyb19wcygpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpKFUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7IH0pCisKKyNkZWZpbmUgX21tNTEyX3JhbmdlX3JvdW5kX3BzKEEsIEIsIEMsIFIpIF9fZXh0ZW5zaW9uX18gKHsgICAgICAgICBcCisgIChfX201MTIpX19idWlsdGluX2lhMzJfcmFuZ2VwczUxMl9tYXNrKChfX3YxNnNmKShfX201MTIpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKShfX201MTIpKEIpLCAoaW50KShDKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZilfbW01MTJfc2V0emVyb19wcygpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpLTEsIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza19yYW5nZV9yb3VuZF9wcyhXLCBVLCBBLCBCLCBDLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMilfX2J1aWx0aW5faWEzMl9yYW5nZXBzNTEyX21hc2soKF9fdjE2c2YpKF9fbTUxMikoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpKF9fbTUxMikoQiksIChpbnQpKEMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKShfX201MTIpKFcpLCAoX19tbWFzazE2KShVKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X3JhbmdlX3JvdW5kX3BzKFUsIEEsIEIsIEMsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyKV9fYnVpbHRpbl9pYTMyX3JhbmdlcHM1MTJfbWFzaygoX192MTZzZikoX19tNTEyKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikoX19tNTEyKShCKSwgKGludCkoQyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpX21tNTEyX3NldHplcm9fcHMoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KShVKSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbV9yYW5nZV9yb3VuZF9zcyhBLCBCLCBDLCBSKSBfX2V4dGVuc2lvbl9fICh7ICAgICAgICAgICBcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfcmFuZ2VzczEyOF9yb3VuZF9tYXNrKChfX3Y0c2YpKF9fbTEyOCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKV9tbV9zZXR6ZXJvX3BzKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSwgKGludCkoQyksXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tX3JhbmdlX3NzKEEgLEIgLCBDKSBfbW1fcmFuZ2Vfcm91bmRfc3MoQSwgQiwgQyAsX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKQorCisjZGVmaW5lIF9tbV9tYXNrX3JhbmdlX3JvdW5kX3NzKFcsIFUsIEEsIEIsIEMsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX3Jhbmdlc3MxMjhfcm91bmRfbWFzaygoX192NHNmKShfX20xMjgpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpKF9fbTEyOCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShXKSxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIChpbnQpKEMpLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrX3JhbmdlX3NzKFcgLCBVLCBBLCBCLCBDKSBfbW1fbWFza19yYW5nZV9yb3VuZF9zcyhXLCBVLCBBLCBCLCBDICwgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKQorCisjZGVmaW5lIF9tbV9tYXNrel9yYW5nZV9yb3VuZF9zcyhVLCBBLCBCLCBDLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOClfX2J1aWx0aW5faWEzMl9yYW5nZXNzMTI4X3JvdW5kX21hc2soKF9fdjRzZikoX19tMTI4KShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKShfX20xMjgpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpX21tX3NldHplcm9fcHMoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShDKSxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW1fbWFza3pfcmFuZ2Vfc3MoVSwgQSAsQiAsIEMpIF9tbV9tYXNrel9yYW5nZV9yb3VuZF9zcyhVLCBBLCBCLCBDICxfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pCisKKyNkZWZpbmUgX21tX3JhbmdlX3JvdW5kX3NkKEEsIEIsIEMsIFIpIF9fZXh0ZW5zaW9uX18gKHsgICAgICAgICAgIFwKKyAgKF9fbTEyOGQpX19idWlsdGluX2lhMzJfcmFuZ2VzZDEyOF9yb3VuZF9tYXNrKChfX3YyZGYpKF9fbTEyOGQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZilfbW1fc2V0emVyb19wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xLCAoaW50KShDKSxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tX3JhbmdlX3NkKEEgLEIgLCBDKSBfbW1fcmFuZ2Vfcm91bmRfc2QoQSwgQiwgQyAsX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKQorCisjZGVmaW5lIF9tbV9tYXNrX3JhbmdlX3JvdW5kX3NkKFcsIFUsIEEsIEIsIEMsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9yYW5nZXNkMTI4X3JvdW5kX21hc2soKF9fdjJkZikoX19tMTI4ZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fbTEyOGQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShXKSxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShDKSxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2tfcmFuZ2Vfc2QoVywgVSwgQSwgQiwgQykgX21tX21hc2tfcmFuZ2Vfcm91bmRfc2QoVywgVSwgQSwgQiwgQyAsX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKQorCisjZGVmaW5lIF9tbV9tYXNrel9yYW5nZV9yb3VuZF9zZChVLCBBLCBCLCBDLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGQpX19idWlsdGluX2lhMzJfcmFuZ2VzZDEyOF9yb3VuZF9tYXNrKChfX3YyZGYpKF9fbTEyOGQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZilfbW1fc2V0emVyb19wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShDKSxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2t6X3JhbmdlX3NkKFUsIEEsIEIsIEMpIF9tbV9tYXNrel9yYW5nZV9yb3VuZF9zZChVLCBBLCBCLCBDICxfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pCisKKyNkZWZpbmUgX21tNTEyX3JlZHVjZV9wZChBLCBCKSBfX2V4dGVuc2lvbl9fICh7ICAgICAgICAgICAgIFwKKyAgKF9fbTUxMmQpX19idWlsdGluX2lhMzJfcmVkdWNlcGQ1MTJfbWFzaygoX192OGRmKShfX201MTJkKShBKSwgKGludCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKV9tbTUxMl9zZXR6ZXJvX3BkKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX3JlZHVjZV9wZChXLCBVLCBBLCBCKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmQpX19idWlsdGluX2lhMzJfcmVkdWNlcGQ1MTJfbWFzaygoX192OGRmKShfX201MTJkKShBKSwgKGludCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKShfX201MTJkKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrel9yZWR1Y2VfcGQoVSwgQSwgQikgX19leHRlbnNpb25fXyAoeyAgXAorICAoX19tNTEyZClfX2J1aWx0aW5faWEzMl9yZWR1Y2VwZDUxMl9tYXNrKChfX3Y4ZGYpKF9fbTUxMmQpKEEpLCAoaW50KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpX21tNTEyX3NldHplcm9fcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOyB9KQorCisjZGVmaW5lIF9tbTUxMl9yZWR1Y2VfcHMoQSwgQikgX19leHRlbnNpb25fXyAoeyAgICAgICAgICAgICAgXAorICAoX19tNTEyKV9fYnVpbHRpbl9pYTMyX3JlZHVjZXBzNTEyX21hc2soKF9fdjE2c2YpKF9fbTUxMikoQSksIChpbnQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZilfbW01MTJfc2V0emVyb19wcygpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KS0xLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX3JlZHVjZV9wcyhXLCBVLCBBLCBCKSBfX2V4dGVuc2lvbl9fICh7ICAgXAorICAoX19tNTEyKV9fYnVpbHRpbl9pYTMyX3JlZHVjZXBzNTEyX21hc2soKF9fdjE2c2YpKF9fbTUxMikoQSksIChpbnQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikoX19tNTEyKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X3JlZHVjZV9wcyhVLCBBLCBCKSBfX2V4dGVuc2lvbl9fICh7ICAgICAgIFwKKyAgKF9fbTUxMilfX2J1aWx0aW5faWEzMl9yZWR1Y2VwczUxMl9tYXNrKChfX3YxNnNmKShfX201MTIpKEEpLCAoaW50KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpX21tNTEyX3NldHplcm9fcHMoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7IH0pCisKKyNkZWZpbmUgX21tNTEyX3JlZHVjZV9yb3VuZF9wZChBLCBCLCBSKSBfX2V4dGVuc2lvbl9fICh7XAorICAoX19tNTEyZClfX2J1aWx0aW5faWEzMl9yZWR1Y2VwZDUxMl9tYXNrKChfX3Y4ZGYpKF9fbTUxMmQpKEEpLCAoaW50KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpX21tNTEyX3NldHplcm9fcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX3JlZHVjZV9yb3VuZF9wZChXLCBVLCBBLCBCLCBSKSBfX2V4dGVuc2lvbl9fICh7XAorICAoX19tNTEyZClfX2J1aWx0aW5faWEzMl9yZWR1Y2VwZDUxMl9tYXNrKChfX3Y4ZGYpKF9fbTUxMmQpKEEpLCAoaW50KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpKF9fbTUxMmQpKFcpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrel9yZWR1Y2Vfcm91bmRfcGQoVSwgQSwgQiwgUikgX19leHRlbnNpb25fXyAoe1wKKyAgKF9fbTUxMmQpX19idWlsdGluX2lhMzJfcmVkdWNlcGQ1MTJfbWFzaygoX192OGRmKShfX201MTJkKShBKSwgKGludCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKV9tbTUxMl9zZXR6ZXJvX3BkKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX3JlZHVjZV9yb3VuZF9wcyhBLCBCLCBSKSBfX2V4dGVuc2lvbl9fICh7XAorICAoX19tNTEyKV9fYnVpbHRpbl9pYTMyX3JlZHVjZXBzNTEyX21hc2soKF9fdjE2c2YpKF9fbTUxMikoQSksIChpbnQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZilfbW01MTJfc2V0emVyb19wcygpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KS0xLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2tfcmVkdWNlX3JvdW5kX3BzKFcsIFUsIEEsIEIsIFIpIF9fZXh0ZW5zaW9uX18gKHtcCisgIChfX201MTIpX19idWlsdGluX2lhMzJfcmVkdWNlcHM1MTJfbWFzaygoX192MTZzZikoX19tNTEyKShBKSwgKGludCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKShfX201MTIpKFcpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KShVKSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrel9yZWR1Y2Vfcm91bmRfcHMoVSwgQSwgQiwgUikgX19leHRlbnNpb25fXyAoe1wKKyAgKF9fbTUxMilfX2J1aWx0aW5faWEzMl9yZWR1Y2VwczUxMl9tYXNrKChfX3YxNnNmKShfX201MTIpKEEpLCAoaW50KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpX21tNTEyX3NldHplcm9fcHMoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikoVSksIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW1fcmVkdWNlX3NzKEEsIEIsIEMpIF9fZXh0ZW5zaW9uX18gKHsgICAgICAgICAgICAgIFwKKyAgKF9fbTEyOClfX2J1aWx0aW5faWEzMl9yZWR1Y2Vzc19tYXNrKChfX3Y0c2YpKF9fbTEyOCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpKF9fbTEyOCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpX21tX3NldHplcm9fcHMoKSwgKF9fbW1hc2s4KS0xLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShDKSwgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsgfSkKKworI2RlZmluZSBfbW1fbWFza19yZWR1Y2Vfc3MoVywgVSwgQSwgQiwgQykgX19leHRlbnNpb25fXyAoeyAgIFwKKyAgKF9fbTEyOClfX2J1aWx0aW5faWEzMl9yZWR1Y2Vzc19tYXNrKChfX3Y0c2YpKF9fbTEyOCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpKF9fbTEyOCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpKF9fbTEyOCkoVyksIChfX21tYXNrOCkoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKEMpLCBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrel9yZWR1Y2Vfc3MoVSwgQSwgQiwgQykgX19leHRlbnNpb25fXyAoeyAgICAgICBcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfcmVkdWNlc3NfbWFzaygoX192NHNmKShfX20xMjgpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKShfX20xMjgpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKV9tbV9zZXR6ZXJvX3BzKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIChpbnQpKEMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOyB9KQorCisjZGVmaW5lIF9tbV9yZWR1Y2Vfcm91bmRfc3MoQSwgQiwgQywgUikgX19leHRlbnNpb25fXyAoeyAgICAgICAgICAgICAgXAorICAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX3JlZHVjZXNzX21hc2soKF9fdjRzZikoX19tMTI4KShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZilfbW1fc2V0emVyb19wcygpLCAoX19tbWFzazgpLTEsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKEMpLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2tfcmVkdWNlX3JvdW5kX3NzKFcsIFUsIEEsIEIsIEMsIFIpIF9fZXh0ZW5zaW9uX18gKHsgICBcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfcmVkdWNlc3NfbWFzaygoX192NHNmKShfX20xMjgpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKShfX20xMjgpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKShfX20xMjgpKFcpLCAoX19tbWFzazgpKFUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShDKSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrel9yZWR1Y2Vfcm91bmRfc3MoVSwgQSwgQiwgQywgUikgX19leHRlbnNpb25fXyAoeyAgICAgICBcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfcmVkdWNlc3NfbWFzaygoX192NHNmKShfX20xMjgpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKShfX20xMjgpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKV9tbV9zZXR6ZXJvX3BzKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIChpbnQpKEMpLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tX3JlZHVjZV9zZChBLCBCLCBDKSBfX2V4dGVuc2lvbl9fICh7ICAgICAgICAgICAgICBcCisgIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX3JlZHVjZXNkX21hc2soKF9fdjJkZikoX19tMTI4ZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpX21tX3NldHplcm9fcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSwgKGludCkoQyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrX3JlZHVjZV9zZChXLCBVLCBBLCBCLCBDKSBfX2V4dGVuc2lvbl9fICh7ICAgXAorICAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9yZWR1Y2VzZF9tYXNrKChfX3YyZGYpKF9fbTEyOGQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZikoX19tMTI4ZCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShXKSwgKF9fbW1hc2s4KShVKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKEMpLCBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrel9yZWR1Y2Vfc2QoVSwgQSwgQiwgQykgX19leHRlbnNpb25fXyAoeyAgICAgICBcCisgIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX3JlZHVjZXNkX21hc2soKF9fdjJkZikoX19tMTI4ZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpX21tX3NldHplcm9fcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIChpbnQpKEMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsgfSkKKworI2RlZmluZSBfbW1fcmVkdWNlX3JvdW5kX3NkKEEsIEIsIEMsIFIpIF9fZXh0ZW5zaW9uX18gKHsgICAgICAgICAgICAgIFwKKyAgKF9fbTEyOGQpX19idWlsdGluX2lhMzJfcmVkdWNlc2RfbWFzaygoX192MmRmKShfX20xMjhkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fbTEyOGQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZilfbW1fc2V0emVyb19wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xLCAoaW50KShDKSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrX3JlZHVjZV9yb3VuZF9zZChXLCBVLCBBLCBCLCBDLCBSKSBfX2V4dGVuc2lvbl9fICh7ICAgXAorICAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9yZWR1Y2VzZF9tYXNrKChfX3YyZGYpKF9fbTEyOGQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZikoX19tMTI4ZCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShXKSwgKF9fbW1hc2s4KShVKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKEMpLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2t6X3JlZHVjZV9yb3VuZF9zZChVLCBBLCBCLCBDLCBSKSBfX2V4dGVuc2lvbl9fICh7ICAgICAgIFwKKyAgKF9fbTEyOGQpX19idWlsdGluX2lhMzJfcmVkdWNlc2RfbWFzaygoX192MmRmKShfX20xMjhkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fbTEyOGQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZilfbW1fc2V0emVyb19wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSwgKGludCkoQyksIChpbnQpKFIpKTsgfSkKKyAgICAgICAgICAgICAgICAgICAgIAorc3RhdGljIF9faW5saW5lX18gX19tbWFzazE2IF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21vdmVwaTMyX21hc2sgKF9fbTUxMmkgX19BKQoreworICByZXR1cm4gKF9fbW1hc2sxNikgX19idWlsdGluX2lhMzJfY3Z0ZDJtYXNrNTEyICgoX192MTZzaSkgX19BKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tb3ZtX2VwaTMyIChfX21tYXNrMTYgX19BKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX2N2dG1hc2syZDUxMiAoX19BKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tb3ZtX2VwaTY0IChfX21tYXNrOCBfX0EpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfY3Z0bWFzazJxNTEyIChfX0EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tb3ZlcGk2NF9tYXNrIChfX201MTJpIF9fQSkKK3sKKyAgcmV0dXJuIChfX21tYXNrOCkgX19idWlsdGluX2lhMzJfY3Z0cTJtYXNrNTEyICgoX192OGRpKSBfX0EpOworfQorCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9icm9hZGNhc3RfZjMyeDIgKF9fbTEyOCBfX0EpCit7CisgIHJldHVybiAoX19tNTEyKSBfX2J1aWx0aW5faWEzMl9icm9hZGNhc3RmMzJ4Ml81MTJfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgIChfX3YxNnNmKV9tbTUxMl91bmRlZmluZWRfcHMoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazE2KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2Jyb2FkY2FzdF9mMzJ4MiAoX19tNTEyIF9fTywgX19tbWFzazE2IF9fTSwgX19tMTI4IF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTIpIF9fYnVpbHRpbl9pYTMyX2Jyb2FkY2FzdGYzMngyXzUxMl9tYXNrICgoX192NHNmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjE2c2YpCisgICAgICAgICAgICAgICAgX19PLCBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfYnJvYWRjYXN0X2YzMngyIChfX21tYXNrMTYgX19NLCBfX20xMjggX19BKQoreworICByZXR1cm4gKF9fbTUxMikgX19idWlsdGluX2lhMzJfYnJvYWRjYXN0ZjMyeDJfNTEyX21hc2sgKChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192MTZzZilfbW01MTJfc2V0emVyb19wcyAoKSwKKyAgICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfYnJvYWRjYXN0X2YzMng4IChfX20yNTYgX19BKQoreworICByZXR1cm4gKF9fbTUxMikgX19idWlsdGluX2lhMzJfYnJvYWRjYXN0ZjMyeDhfNTEyX21hc2sgKChfX3Y4c2YpIF9fQSwKKyAgICAgICAgICAgICAgICBfbW01MTJfdW5kZWZpbmVkX3BzKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19icm9hZGNhc3RfZjMyeDggKF9fbTUxMiBfX08sIF9fbW1hc2sxNiBfX00sIF9fbTI1NiBfX0EpCit7CisgIHJldHVybiAoX19tNTEyKSBfX2J1aWx0aW5faWEzMl9icm9hZGNhc3RmMzJ4OF81MTJfbWFzayAoKF9fdjhzZikgX19BLAorICAgICAgICAgICAgICAgIChfX3YxNnNmKV9fTywKKyAgICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfYnJvYWRjYXN0X2YzMng4IChfX21tYXNrMTYgX19NLCBfX20yNTYgX19BKQoreworICByZXR1cm4gKF9fbTUxMikgX19idWlsdGluX2lhMzJfYnJvYWRjYXN0ZjMyeDhfNTEyX21hc2sgKChfX3Y4c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192MTZzZilfbW01MTJfc2V0emVyb19wcyAoKSwKKyAgICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2Jyb2FkY2FzdF9mNjR4MiAoX19tMTI4ZCBfX0EpCit7CisgIHJldHVybiAoX19tNTEyZCkgX19idWlsdGluX2lhMzJfYnJvYWRjYXN0ZjY0eDJfNTEyX21hc2sgKChfX3YyZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjhkZilfbW01MTJfdW5kZWZpbmVkX3BkKCksCisgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfYnJvYWRjYXN0X2Y2NHgyIChfX201MTJkIF9fTywgX19tbWFzazggX19NLCBfX20xMjhkIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJkKSBfX2J1aWx0aW5faWEzMl9icm9hZGNhc3RmNjR4Ml81MTJfbWFzayAoKF9fdjJkZikgX19BLAorICAgICAgICAgICAgICAgICAoX192OGRmKQorICAgICAgICAgICAgICAgICBfX08sIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfYnJvYWRjYXN0X2Y2NHgyIChfX21tYXNrOCBfX00sIF9fbTEyOGQgX19BKQoreworICByZXR1cm4gKF9fbTUxMmQpIF9fYnVpbHRpbl9pYTMyX2Jyb2FkY2FzdGY2NHgyXzUxMl9tYXNrICgoX192MmRmKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3Y4ZGYpX21tNTEyX3NldHplcm9fcHMgKCksCisgICAgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfYnJvYWRjYXN0X2kzMngyIChfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9icm9hZGNhc3RpMzJ4Ml81MTJfbWFzayAoKF9fdjRzaSkgX19BLAorICAgICAgICAgICAgICAgICAoX192MTZzaSlfbW01MTJfc2V0emVyb19zaTUxMigpLAorICAgICAgICAgICAgICAgICAoX19tbWFzazE2KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19icm9hZGNhc3RfaTMyeDIgKF9fbTUxMmkgX19PLCBfX21tYXNrMTYgX19NLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9icm9hZGNhc3RpMzJ4Ml81MTJfbWFzayAoKF9fdjRzaSkgX19BLAorICAgICAgICAgICAgICAgICAoX192MTZzaSkKKyAgICAgICAgICAgICAgICAgX19PLCBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X2Jyb2FkY2FzdF9pMzJ4MiAoX19tbWFzazE2IF9fTSwgX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfYnJvYWRjYXN0aTMyeDJfNTEyX21hc2sgKChfX3Y0c2kpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjE2c2kpX21tNTEyX3NldHplcm9fc2k1MTIgKCksCisgICAgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfYnJvYWRjYXN0X2kzMng4IChfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9icm9hZGNhc3RpMzJ4OF81MTJfbWFzayAoKF9fdjhzaSkgX19BLAorICAgICAgICAgICAgICAgICAoX192MTZzaSlfbW01MTJfc2V0emVyb19zaTUxMigpLAorICAgICAgICAgICAgICAgICAoX19tbWFzazE2KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19icm9hZGNhc3RfaTMyeDggKF9fbTUxMmkgX19PLCBfX21tYXNrMTYgX19NLCBfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9icm9hZGNhc3RpMzJ4OF81MTJfbWFzayAoKF9fdjhzaSkgX19BLAorICAgICAgICAgICAgICAgICAoX192MTZzaSlfX08sCisgICAgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfYnJvYWRjYXN0X2kzMng4IChfX21tYXNrMTYgX19NLCBfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9icm9hZGNhc3RpMzJ4OF81MTJfbWFzayAoKF9fdjhzaSkgX19BLAorICAgICAgICAgICAgICAgICAoX192MTZzaSkKKyAgICAgICAgICAgICAgICAgX21tNTEyX3NldHplcm9fc2k1MTIgKCksCisgICAgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfYnJvYWRjYXN0X2k2NHgyIChfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9icm9hZGNhc3RpNjR4Ml81MTJfbWFzayAoKF9fdjJkaSkgX19BLAorICAgICAgICAgICAgICAgICAoX192OGRpKV9tbTUxMl9zZXR6ZXJvX3NpNTEyKCksCisgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfYnJvYWRjYXN0X2k2NHgyIChfX201MTJpIF9fTywgX19tbWFzazggX19NLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9icm9hZGNhc3RpNjR4Ml81MTJfbWFzayAoKF9fdjJkaSkgX19BLAorICAgICAgICAgICAgICAgICAoX192OGRpKQorICAgICAgICAgICAgICAgICBfX08sIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfYnJvYWRjYXN0X2k2NHgyIChfX21tYXNrOCBfX00sIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX2Jyb2FkY2FzdGk2NHgyXzUxMl9tYXNrICgoX192MmRpKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3Y4ZGkpX21tNTEyX3NldHplcm9fc2k1MTIgKCksCisgICAgICAgICAgICAgICAgIF9fTSk7Cit9CisKKyNkZWZpbmUgX21tNTEyX2V4dHJhY3RmMzJ4OF9wcyhBLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2KV9fYnVpbHRpbl9pYTMyX2V4dHJhY3RmMzJ4OF9tYXNrKChfX3YxNnNmKShfX201MTIpKEEpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzZilfbW0yNTZfc2V0emVyb19wcygpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza19leHRyYWN0ZjMyeDhfcHMoVywgVSwgQSwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NilfX2J1aWx0aW5faWEzMl9leHRyYWN0ZjMyeDhfbWFzaygoX192MTZzZikoX19tNTEyKShBKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2YpKF9fbTI1NikoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza3pfZXh0cmFjdGYzMng4X3BzKFUsIEEsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTYpX19idWlsdGluX2lhMzJfZXh0cmFjdGYzMng4X21hc2soKF9fdjE2c2YpKF9fbTUxMikoQSksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNmKV9tbTI1Nl9zZXR6ZXJvX3BzKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW01MTJfZXh0cmFjdGY2NHgyX3BkKEEsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2V4dHJhY3RmNjR4Ml81MTJfbWFzaygoX192OGRmKShfX201MTJkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZilfbW1fc2V0emVyb19wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX2V4dHJhY3RmNjR4Ml9wZChXLCBVLCBBLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9leHRyYWN0ZjY0eDJfNTEyX21hc2soKF9fdjhkZikoX19tNTEyZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fbTEyOGQpKFcpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza3pfZXh0cmFjdGY2NHgyX3BkKFUsIEEsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2V4dHJhY3RmNjR4Ml81MTJfbWFzaygoX192OGRmKShfX201MTJkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZilfbW1fc2V0emVyb19wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW01MTJfZXh0cmFjdGkzMng4X2VwaTMyKEEsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX2V4dHJhY3RpMzJ4OF9tYXNrKChfX3YxNnNpKShfX201MTJpKShBKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNpKV9tbTI1Nl9zZXR6ZXJvX3NpMjU2KCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza19leHRyYWN0aTMyeDhfZXBpMzIoVywgVSwgQSwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmkpX19idWlsdGluX2lhMzJfZXh0cmFjdGkzMng4X21hc2soKF9fdjE2c2kpKF9fbTUxMmkpKEEpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2kpKF9fbTI1NmkpKFcpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSkpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrel9leHRyYWN0aTMyeDhfZXBpMzIoVSwgQSwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmkpX19idWlsdGluX2lhMzJfZXh0cmFjdGkzMng4X21hc2soKF9fdjE2c2kpKF9fbTUxMmkpKEEpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2kpX21tMjU2X3NldHplcm9fc2kyNTYoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW01MTJfZXh0cmFjdGk2NHgyX2VwaTY0KEEsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX2V4dHJhY3RpNjR4Ml81MTJfbWFzaygoX192OGRpKShfX201MTJpKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkaSlfbW1fc2V0emVyb19kaSgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX2V4dHJhY3RpNjR4Ml9lcGk2NChXLCBVLCBBLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9leHRyYWN0aTY0eDJfNTEyX21hc2soKF9fdjhkaSkoX19tNTEyaSkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGkpKF9fbTEyOGkpKFcpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza3pfZXh0cmFjdGk2NHgyX2VwaTY0KFUsIEEsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX2V4dHJhY3RpNjR4Ml81MTJfbWFzaygoX192OGRpKShfX201MTJpKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkaSlfbW1fc2V0emVyb19kaSgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW01MTJfaW5zZXJ0ZjMyeDgoQSwgQiwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMilfX2J1aWx0aW5faWEzMl9pbnNlcnRmMzJ4OF9tYXNrKChfX3YxNnNmKShfX201MTIpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNmKShfX20yNTYpKEIpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZilfbW01MTJfc2V0emVyb19wcygpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KS0xKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza19pbnNlcnRmMzJ4OChXLCBVLCBBLCBCLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyKV9fYnVpbHRpbl9pYTMyX2luc2VydGYzMng4X21hc2soKF9fdjE2c2YpKF9fbTUxMikoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2YpKF9fbTI1NikoQiksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKShfX201MTIpKFcpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KShVKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X2luc2VydGYzMng4KFUsIEEsIEIsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTIpX19idWlsdGluX2lhMzJfaW5zZXJ0ZjMyeDhfbWFzaygoX192MTZzZikoX19tNTEyKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzZikoX19tMjU2KShCKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpX21tNTEyX3NldHplcm9fcHMoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikoVSkpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9pbnNlcnRmNjR4MihBLCBCLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyZClfX2J1aWx0aW5faWEzMl9pbnNlcnRmNjR4Ml81MTJfbWFzaygoX192OGRmKShfX201MTJkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpX21tNTEyX3NldHplcm9fcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX2luc2VydGY2NHgyKFcsIFUsIEEsIEIsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJkKV9fYnVpbHRpbl9pYTMyX2luc2VydGY2NHgyXzUxMl9tYXNrKChfX3Y4ZGYpKF9fbTUxMmQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fbTEyOGQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikoX19tNTEyZCkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X2luc2VydGY2NHgyKFUsIEEsIEIsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJkKV9fYnVpbHRpbl9pYTMyX2luc2VydGY2NHgyXzUxMl9tYXNrKChfX3Y4ZGYpKF9fbTUxMmQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fbTEyOGQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZilfbW01MTJfc2V0emVyb19wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSkpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9pbnNlcnRpMzJ4OChBLCBCLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9pbnNlcnRpMzJ4OF9tYXNrKChfX3YxNnNpKShfX201MTJpKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2kpKF9fbTI1NmkpKEIpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpX21tNTEyX3NldHplcm9fc2k1MTIoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpLTEpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX2luc2VydGkzMng4KFcsIFUsIEEsIEIsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX2luc2VydGkzMng4X21hc2soKF9fdjE2c2kpKF9fbTUxMmkpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzaSkoX19tMjU2aSkoQiksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzaSkoX19tNTEyaSkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KShVKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X2luc2VydGkzMng4KFUsIEEsIEIsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX2luc2VydGkzMng4X21hc2soKF9fdjE2c2kpKF9fbTUxMmkpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzaSkoX19tMjU2aSkoQiksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzaSlfbW01MTJfc2V0emVyb19zaTUxMigpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikoVSkpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9pbnNlcnRpNjR4MihBLCBCLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9pbnNlcnRpNjR4Ml81MTJfbWFzaygoX192OGRpKShfX201MTJpKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRpKShfX20xMjhpKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGkpX21tNTEyX3NldHplcm9fc2k1MTIoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX2luc2VydGk2NHgyKFcsIFUsIEEsIEIsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX2luc2VydGk2NHgyXzUxMl9tYXNrKChfX3Y4ZGkpKF9fbTUxMmkpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGkpKF9fbTEyOGkpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkaSkoX19tNTEyaSkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X2luc2VydGk2NHgyKFUsIEEsIEIsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX2luc2VydGk2NHgyXzUxMl9tYXNrKChfX3Y4ZGkpKF9fbTUxMmkpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGkpKF9fbTEyOGkpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkaSlfbW01MTJfc2V0emVyb19zaTUxMigpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSkpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX2ZwY2xhc3NfcHNfbWFzayhVLCBBLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tbWFzazE2KV9fYnVpbHRpbl9pYTMyX2ZwY2xhc3NwczUxMl9tYXNrKChfX3YxNnNmKShfX201MTIpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoaW1tKSwgKF9fbW1hc2sxNikoVSkpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9mcGNsYXNzX3BzX21hc2soQSwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbW1hc2sxNilfX2J1aWx0aW5faWEzMl9mcGNsYXNzcHM1MTJfbWFzaygoX192MTZzZikoX19tNTEyKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGltbSksIChfX21tYXNrMTYpLTEpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX2ZwY2xhc3NfcGRfbWFzayhVLCBBLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tbWFzazgpX19idWlsdGluX2lhMzJfZnBjbGFzc3BkNTEyX21hc2soKF9fdjhkZikoX19tNTEyZCkoQSksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSkpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9mcGNsYXNzX3BkX21hc2soQSwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX2ZwY2xhc3NwZDUxMl9tYXNrKChfX3Y4ZGYpKF9fbTUxMmQpKEEpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOyB9KQorCisjZGVmaW5lIF9tbV9mcGNsYXNzX3NkX21hc2soQSwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX2ZwY2xhc3NzZF9tYXNrKChfX3YyZGYpKF9fbTEyOGQpKEEpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrX2ZwY2xhc3Nfc2RfbWFzayhVLCBBLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tbWFzazgpX19idWlsdGluX2lhMzJfZnBjbGFzc3NkX21hc2soKF9fdjJkZikoX19tMTI4ZCkoQSksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSkpOyB9KQorCisjZGVmaW5lIF9tbV9mcGNsYXNzX3NzX21hc2soQSwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX2ZwY2xhc3Nzc19tYXNrKChfX3Y0c2YpKF9fbTEyOCkoQSksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2tfZnBjbGFzc19zc19tYXNrKFUsIEEsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl9mcGNsYXNzc3NfbWFzaygoX192NHNmKShfX20xMjgpKEEpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI3VuZGVmIF9fREVGQVVMVF9GTl9BVFRSUworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL2F2eDUxMmVyaW50cmluLmggYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9hdng1MTJlcmludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZjIxMmMKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9hdng1MTJlcmludHJpbi5oCkBAIC0wLDAgKzEsMjg1IEBACisvKj09PS0tLS0gYXZ4NTEyZXJpbnRyaW4uaCAtIEFWWDUxMkVSIGludHJpbnNpY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICoKKyAqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqLworI2lmbmRlZiBfX0lNTUlOVFJJTl9ICisjZXJyb3IgIk5ldmVyIHVzZSA8YXZ4NTEyZXJpbnRyaW4uaD4gZGlyZWN0bHk7IGluY2x1ZGUgPGltbWludHJpbi5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9fQVZYNTEyRVJJTlRSSU5fSAorI2RlZmluZSBfX0FWWDUxMkVSSU5UUklOX0gKKworLy8gZXhwMmEyMworI2RlZmluZSBfbW01MTJfZXhwMmEyM19yb3VuZF9wZChBLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmQpX19idWlsdGluX2lhMzJfZXhwMnBkX21hc2soKF9fdjhkZikoX19tNTEyZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZilfbW01MTJfc2V0emVyb19wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX2V4cDJhMjNfcm91bmRfcGQoUywgTSwgQSwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJkKV9fYnVpbHRpbl9pYTMyX2V4cDJwZF9tYXNrKChfX3Y4ZGYpKF9fbTUxMmQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpKF9fbTUxMmQpKFMpLCAoX19tbWFzazgpKE0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza3pfZXhwMmEyM19yb3VuZF9wZChNLCBBLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmQpX19idWlsdGluX2lhMzJfZXhwMnBkX21hc2soKF9fdjhkZikoX19tNTEyZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZilfbW01MTJfc2V0emVyb19wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoTSksIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW01MTJfZXhwMmEyM19wZChBKSBcCisgIF9tbTUxMl9leHAyYTIzX3JvdW5kX3BkKChBKSwgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX2V4cDJhMjNfcGQoUywgTSwgQSkgXAorICBfbW01MTJfbWFza19leHAyYTIzX3JvdW5kX3BkKChTKSwgKE0pLCAoQSksIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTikKKworI2RlZmluZSBfbW01MTJfbWFza3pfZXhwMmEyM19wZChNLCBBKSBcCisgIF9tbTUxMl9tYXNrel9leHAyYTIzX3JvdW5kX3BkKChNKSwgKEEpLCBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pCisKKyNkZWZpbmUgX21tNTEyX2V4cDJhMjNfcm91bmRfcHMoQSwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTIpX19idWlsdGluX2lhMzJfZXhwMnBzX21hc2soKF9fdjE2c2YpKF9fbTUxMikoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZilfbW01MTJfc2V0emVyb19wcygpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNiktMSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX2V4cDJhMjNfcm91bmRfcHMoUywgTSwgQSwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTIpX19idWlsdGluX2lhMzJfZXhwMnBzX21hc2soKF9fdjE2c2YpKF9fbTUxMikoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikoX19tNTEyKShTKSwgKF9fbW1hc2sxNikoTSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X2V4cDJhMjNfcm91bmRfcHMoTSwgQSwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTIpX19idWlsdGluX2lhMzJfZXhwMnBzX21hc2soKF9fdjE2c2YpKF9fbTUxMikoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZilfbW01MTJfc2V0emVyb19wcygpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikoTSksIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW01MTJfZXhwMmEyM19wcyhBKSBcCisgIF9tbTUxMl9leHAyYTIzX3JvdW5kX3BzKChBKSwgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX2V4cDJhMjNfcHMoUywgTSwgQSkgXAorICBfbW01MTJfbWFza19leHAyYTIzX3JvdW5kX3BzKChTKSwgKE0pLCAoQSksIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTikKKworI2RlZmluZSBfbW01MTJfbWFza3pfZXhwMmEyM19wcyhNLCBBKSBcCisgIF9tbTUxMl9tYXNrel9leHAyYTIzX3JvdW5kX3BzKChNKSwgKEEpLCBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pCisKKy8vIHJzcXJ0MjgKKyNkZWZpbmUgX21tNTEyX3JzcXJ0Mjhfcm91bmRfcGQoQSwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJkKV9fYnVpbHRpbl9pYTMyX3JzcXJ0MjhwZF9tYXNrKChfX3Y4ZGYpKF9fbTUxMmQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpX21tNTEyX3NldHplcm9fcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEsIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza19yc3FydDI4X3JvdW5kX3BkKFMsIE0sIEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyZClfX2J1aWx0aW5faWEzMl9yc3FydDI4cGRfbWFzaygoX192OGRmKShfX201MTJkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKShfX201MTJkKShTKSwgKF9fbW1hc2s4KShNKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X3JzcXJ0Mjhfcm91bmRfcGQoTSwgQSwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJkKV9fYnVpbHRpbl9pYTMyX3JzcXJ0MjhwZF9tYXNrKChfX3Y4ZGYpKF9fbTUxMmQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpX21tNTEyX3NldHplcm9fcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKE0pLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX3JzcXJ0MjhfcGQoQSkgXAorICBfbW01MTJfcnNxcnQyOF9yb3VuZF9wZCgoQSksIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTikKKworI2RlZmluZSBfbW01MTJfbWFza19yc3FydDI4X3BkKFMsIE0sIEEpIFwKKyAgX21tNTEyX21hc2tfcnNxcnQyOF9yb3VuZF9wZCgoUyksIChNKSwgKEEpLCBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X3JzcXJ0MjhfcGQoTSwgQSkgXAorICBfbW01MTJfbWFza3pfcnNxcnQyOF9yb3VuZF9wZCgoTSksIChBKSwgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKQorCisjZGVmaW5lIF9tbTUxMl9yc3FydDI4X3JvdW5kX3BzKEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyKV9fYnVpbHRpbl9pYTMyX3JzcXJ0Mjhwc19tYXNrKChfX3YxNnNmKShfX201MTIpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpX21tNTEyX3NldHplcm9fcHMoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpLTEsIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza19yc3FydDI4X3JvdW5kX3BzKFMsIE0sIEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyKV9fYnVpbHRpbl9pYTMyX3JzcXJ0Mjhwc19tYXNrKChfX3YxNnNmKShfX201MTIpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpKF9fbTUxMikoUyksIChfX21tYXNrMTYpKE0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrel9yc3FydDI4X3JvdW5kX3BzKE0sIEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyKV9fYnVpbHRpbl9pYTMyX3JzcXJ0Mjhwc19tYXNrKChfX3YxNnNmKShfX201MTIpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpX21tNTEyX3NldHplcm9fcHMoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpKE0pLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX3JzcXJ0MjhfcHMoQSkgXAorICBfbW01MTJfcnNxcnQyOF9yb3VuZF9wcygoQSksIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTikKKworI2RlZmluZSBfbW01MTJfbWFza19yc3FydDI4X3BzKFMsIE0sIEEpIFwKKyAgX21tNTEyX21hc2tfcnNxcnQyOF9yb3VuZF9wcygoUyksIChNKSwgQSwgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKQorCisjZGVmaW5lIF9tbTUxMl9tYXNrel9yc3FydDI4X3BzKE0sIEEpIFwKKyAgX21tNTEyX21hc2t6X3JzcXJ0Mjhfcm91bmRfcHMoKE0pLCAoQSksIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTikKKworI2RlZmluZSBfbW1fcnNxcnQyOF9yb3VuZF9zcyhBLCBCLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOClfX2J1aWx0aW5faWEzMl9yc3FydDI4c3Nfcm91bmRfbWFzaygoX192NHNmKShfX20xMjgpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpX21tX3NldHplcm9fcHMoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrX3JzcXJ0Mjhfcm91bmRfc3MoUywgTSwgQSwgQiwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfcnNxcnQyOHNzX3JvdW5kX21hc2soKF9fdjRzZikoX19tMTI4KShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpKF9fbTEyOCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKShfX20xMjgpKFMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShNKSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrel9yc3FydDI4X3JvdW5kX3NzKE0sIEEsIEIsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX3JzcXJ0Mjhzc19yb3VuZF9tYXNrKChfX3Y0c2YpKF9fbTEyOCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKShfX20xMjgpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZilfbW1fc2V0emVyb19wcygpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShNKSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbV9yc3FydDI4X3NzKEEsIEIpIFwKKyAgX21tX3JzcXJ0Mjhfcm91bmRfc3MoKEEpLCAoQiksIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTikKKworI2RlZmluZSBfbW1fbWFza19yc3FydDI4X3NzKFMsIE0sIEEsIEIpIFwKKyAgX21tX21hc2tfcnNxcnQyOF9yb3VuZF9zcygoUyksIChNKSwgKEEpLCAoQiksIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTikKKworI2RlZmluZSBfbW1fbWFza3pfcnNxcnQyOF9zcyhNLCBBLCBCKSBcCisgIF9tbV9tYXNrel9yc3FydDI4X3JvdW5kX3NzKChNKSwgKEEpLCAoQiksIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTikKKworI2RlZmluZSBfbW1fcnNxcnQyOF9yb3VuZF9zZChBLCBCLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGQpX19idWlsdGluX2lhMzJfcnNxcnQyOHNkX3JvdW5kX21hc2soKF9fdjJkZikoX19tMTI4ZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZikoX19tMTI4ZCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZilfbW1fc2V0emVyb19wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrX3JzcXJ0Mjhfcm91bmRfc2QoUywgTSwgQSwgQiwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX3JzcXJ0MjhzZF9yb3VuZF9tYXNrKChfX3YyZGYpKF9fbTEyOGQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fbTEyOGQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fbTEyOGQpKFMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoTSksIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW1fbWFza3pfcnNxcnQyOF9yb3VuZF9zZChNLCBBLCBCLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGQpX19idWlsdGluX2lhMzJfcnNxcnQyOHNkX3JvdW5kX21hc2soKF9fdjJkZikoX19tMTI4ZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZikoX19tMTI4ZCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZilfbW1fc2V0emVyb19wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoTSksIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW1fcnNxcnQyOF9zZChBLCBCKSBcCisgIF9tbV9yc3FydDI4X3JvdW5kX3NkKChBKSwgKEIpLCBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pCisKKyNkZWZpbmUgX21tX21hc2tfcnNxcnQyOF9zZChTLCBNLCBBLCBCKSBcCisgIF9tbV9tYXNrX3JzcXJ0Mjhfcm91bmRfc2QoKFMpLCAoTSksIChBKSwgKEIpLCBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pCisKKyNkZWZpbmUgX21tX21hc2t6X3JzcXJ0Mjhfc2QoTSwgQSwgQikgXAorICBfbW1fbWFza3pfcnNxcnQyOF9yb3VuZF9zZCgoTSksIChBKSwgKEIpLCBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pCisKKy8vIHJjcDI4CisjZGVmaW5lIF9tbTUxMl9yY3AyOF9yb3VuZF9wZChBLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmQpX19idWlsdGluX2lhMzJfcmNwMjhwZF9tYXNrKChfX3Y4ZGYpKF9fbTUxMmQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKV9tbTUxMl9zZXR6ZXJvX3BkKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX3JjcDI4X3JvdW5kX3BkKFMsIE0sIEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyZClfX2J1aWx0aW5faWEzMl9yY3AyOHBkX21hc2soKF9fdjhkZikoX19tNTEyZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpKF9fbTUxMmQpKFMpLCAoX19tbWFzazgpKE0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X3JjcDI4X3JvdW5kX3BkKE0sIEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyZClfX2J1aWx0aW5faWEzMl9yY3AyOHBkX21hc2soKF9fdjhkZikoX19tNTEyZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpX21tNTEyX3NldHplcm9fcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShNKSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9yY3AyOF9wZChBKSBcCisgIF9tbTUxMl9yY3AyOF9yb3VuZF9wZCgoQSksIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTikKKworI2RlZmluZSBfbW01MTJfbWFza19yY3AyOF9wZChTLCBNLCBBKSBcCisgIF9tbTUxMl9tYXNrX3JjcDI4X3JvdW5kX3BkKChTKSwgKE0pLCAoQSksIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTikKKworI2RlZmluZSBfbW01MTJfbWFza3pfcmNwMjhfcGQoTSwgQSkgXAorICBfbW01MTJfbWFza3pfcmNwMjhfcm91bmRfcGQoKE0pLCAoQSksIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTikKKworI2RlZmluZSBfbW01MTJfcmNwMjhfcm91bmRfcHMoQSwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTIpX19idWlsdGluX2lhMzJfcmNwMjhwc19tYXNrKChfX3YxNnNmKShfX201MTIpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKV9tbTUxMl9zZXR6ZXJvX3BzKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNiktMSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX3JjcDI4X3JvdW5kX3BzKFMsIE0sIEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyKV9fYnVpbHRpbl9pYTMyX3JjcDI4cHNfbWFzaygoX192MTZzZikoX19tNTEyKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikoX19tNTEyKShTKSwgKF9fbW1hc2sxNikoTSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrel9yY3AyOF9yb3VuZF9wcyhNLCBBLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMilfX2J1aWx0aW5faWEzMl9yY3AyOHBzX21hc2soKF9fdjE2c2YpKF9fbTUxMikoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpX21tNTEyX3NldHplcm9fcHMoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KShNKSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9yY3AyOF9wcyhBKSBcCisgIF9tbTUxMl9yY3AyOF9yb3VuZF9wcygoQSksIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTikKKworI2RlZmluZSBfbW01MTJfbWFza19yY3AyOF9wcyhTLCBNLCBBKSBcCisgIF9tbTUxMl9tYXNrX3JjcDI4X3JvdW5kX3BzKChTKSwgKE0pLCAoQSksIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTikKKworI2RlZmluZSBfbW01MTJfbWFza3pfcmNwMjhfcHMoTSwgQSkgXAorICBfbW01MTJfbWFza3pfcmNwMjhfcm91bmRfcHMoKE0pLCAoQSksIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTikKKworI2RlZmluZSBfbW1fcmNwMjhfcm91bmRfc3MoQSwgQiwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfcmNwMjhzc19yb3VuZF9tYXNrKChfX3Y0c2YpKF9fbTEyOCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKV9tbV9zZXR6ZXJvX3BzKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2tfcmNwMjhfcm91bmRfc3MoUywgTSwgQSwgQiwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfcmNwMjhzc19yb3VuZF9tYXNrKChfX3Y0c2YpKF9fbTEyOCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKShfX20xMjgpKFMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoTSksIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW1fbWFza3pfcmNwMjhfcm91bmRfc3MoTSwgQSwgQiwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfcmNwMjhzc19yb3VuZF9tYXNrKChfX3Y0c2YpKF9fbTEyOCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKV9tbV9zZXR6ZXJvX3BzKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShNKSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbV9yY3AyOF9zcyhBLCBCKSBcCisgIF9tbV9yY3AyOF9yb3VuZF9zcygoQSksIChCKSwgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKQorCisjZGVmaW5lIF9tbV9tYXNrX3JjcDI4X3NzKFMsIE0sIEEsIEIpIFwKKyAgX21tX21hc2tfcmNwMjhfcm91bmRfc3MoKFMpLCAoTSksIChBKSwgKEIpLCBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pCisKKyNkZWZpbmUgX21tX21hc2t6X3JjcDI4X3NzKE0sIEEsIEIpIFwKKyAgX21tX21hc2t6X3JjcDI4X3JvdW5kX3NzKChNKSwgKEEpLCAoQiksIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTikKKworI2RlZmluZSBfbW1fcmNwMjhfcm91bmRfc2QoQSwgQiwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX3JjcDI4c2Rfcm91bmRfbWFzaygoX192MmRmKShfX20xMjhkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZikoX19tMTI4ZCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpX21tX3NldHplcm9fcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2tfcmNwMjhfcm91bmRfc2QoUywgTSwgQSwgQiwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX3JjcDI4c2Rfcm91bmRfbWFzaygoX192MmRmKShfX20xMjhkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZikoX19tMTI4ZCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fbTEyOGQpKFMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKE0pLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2t6X3JjcDI4X3JvdW5kX3NkKE0sIEEsIEIsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9yY3AyOHNkX3JvdW5kX21hc2soKF9fdjJkZikoX19tMTI4ZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fbTEyOGQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKV9tbV9zZXR6ZXJvX3BkKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoTSksIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW1fcmNwMjhfc2QoQSwgQikgXAorICBfbW1fcmNwMjhfcm91bmRfc2QoKEEpLCAoQiksIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTikKKworI2RlZmluZSBfbW1fbWFza19yY3AyOF9zZChTLCBNLCBBLCBCKSBcCisgIF9tbV9tYXNrX3JjcDI4X3JvdW5kX3NkKChTKSwgKE0pLCAoQSksIChCKSwgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKQorCisjZGVmaW5lIF9tbV9tYXNrel9yY3AyOF9zZChNLCBBLCBCKSBcCisgIF9tbV9tYXNrel9yY3AyOF9yb3VuZF9zZCgoTSksIChBKSwgKEIpLCBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pCisKKyNlbmRpZiAvLyBfX0FWWDUxMkVSSU5UUklOX0gKZGlmZiAtLWdpdCBhL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL2F2eDUxMmZpbnRyaW4uaCBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL2F2eDUxMmZpbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWRjNDM2Ci0tLSAvZGV2L251bGwKKysrIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvYXZ4NTEyZmludHJpbi5oCkBAIC0wLDAgKzEsOTU0MyBAQAorLyo9PT0tLS0tIGF2eDUxMmZpbnRyaW4uaCAtIEFWWDUxMkYgaW50cmluc2ljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqCisgKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisgKi8KKyNpZm5kZWYgX19JTU1JTlRSSU5fSAorI2Vycm9yICJOZXZlciB1c2UgPGF2eDUxMmZpbnRyaW4uaD4gZGlyZWN0bHk7IGluY2x1ZGUgPGltbWludHJpbi5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9fQVZYNTEyRklOVFJJTl9ICisjZGVmaW5lIF9fQVZYNTEyRklOVFJJTl9ICisKK3R5cGVkZWYgY2hhciBfX3Y2NHFpIF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXyg2NCkpKTsKK3R5cGVkZWYgc2hvcnQgX192MzJoaSBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oNjQpKSk7Cit0eXBlZGVmIGRvdWJsZSBfX3Y4ZGYgX19hdHRyaWJ1dGVfXygoX192ZWN0b3Jfc2l6ZV9fKDY0KSkpOwordHlwZWRlZiBmbG9hdCBfX3YxNnNmIF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXyg2NCkpKTsKK3R5cGVkZWYgbG9uZyBsb25nIF9fdjhkaSBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oNjQpKSk7Cit0eXBlZGVmIGludCBfX3YxNnNpIF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXyg2NCkpKTsKKworLyogVW5zaWduZWQgdHlwZXMgKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhciBfX3Y2NHF1IF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXyg2NCkpKTsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgX192MzJodSBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oNjQpKSk7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBfX3Y4ZHUgX19hdHRyaWJ1dGVfXygoX192ZWN0b3Jfc2l6ZV9fKDY0KSkpOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgX192MTZzdSBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oNjQpKSk7CisKK3R5cGVkZWYgZmxvYXQgX19tNTEyIF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXyg2NCkpKTsKK3R5cGVkZWYgZG91YmxlIF9fbTUxMmQgX19hdHRyaWJ1dGVfXygoX192ZWN0b3Jfc2l6ZV9fKDY0KSkpOwordHlwZWRlZiBsb25nIGxvbmcgX19tNTEyaSBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oNjQpKSk7CisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBfX21tYXNrODsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgX19tbWFzazE2OworCisvKiBSb3VuZGluZyBtb2RlIG1hY3Jvcy4gICovCisjZGVmaW5lIF9NTV9GUk9VTkRfVE9fTkVBUkVTVF9JTlQgICAweDAwCisjZGVmaW5lIF9NTV9GUk9VTkRfVE9fTkVHX0lORiAgICAgICAweDAxCisjZGVmaW5lIF9NTV9GUk9VTkRfVE9fUE9TX0lORiAgICAgICAweDAyCisjZGVmaW5lIF9NTV9GUk9VTkRfVE9fWkVSTyAgICAgICAgICAweDAzCisjZGVmaW5lIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTiAgICAweDA0CisKK3R5cGVkZWYgZW51bQoreworICBfTU1fUEVSTV9BQUFBID0gMHgwMCwgX01NX1BFUk1fQUFBQiA9IDB4MDEsIF9NTV9QRVJNX0FBQUMgPSAweDAyLAorICBfTU1fUEVSTV9BQUFEID0gMHgwMywgX01NX1BFUk1fQUFCQSA9IDB4MDQsIF9NTV9QRVJNX0FBQkIgPSAweDA1LAorICBfTU1fUEVSTV9BQUJDID0gMHgwNiwgX01NX1BFUk1fQUFCRCA9IDB4MDcsIF9NTV9QRVJNX0FBQ0EgPSAweDA4LAorICBfTU1fUEVSTV9BQUNCID0gMHgwOSwgX01NX1BFUk1fQUFDQyA9IDB4MEEsIF9NTV9QRVJNX0FBQ0QgPSAweDBCLAorICBfTU1fUEVSTV9BQURBID0gMHgwQywgX01NX1BFUk1fQUFEQiA9IDB4MEQsIF9NTV9QRVJNX0FBREMgPSAweDBFLAorICBfTU1fUEVSTV9BQUREID0gMHgwRiwgX01NX1BFUk1fQUJBQSA9IDB4MTAsIF9NTV9QRVJNX0FCQUIgPSAweDExLAorICBfTU1fUEVSTV9BQkFDID0gMHgxMiwgX01NX1BFUk1fQUJBRCA9IDB4MTMsIF9NTV9QRVJNX0FCQkEgPSAweDE0LAorICBfTU1fUEVSTV9BQkJCID0gMHgxNSwgX01NX1BFUk1fQUJCQyA9IDB4MTYsIF9NTV9QRVJNX0FCQkQgPSAweDE3LAorICBfTU1fUEVSTV9BQkNBID0gMHgxOCwgX01NX1BFUk1fQUJDQiA9IDB4MTksIF9NTV9QRVJNX0FCQ0MgPSAweDFBLAorICBfTU1fUEVSTV9BQkNEID0gMHgxQiwgX01NX1BFUk1fQUJEQSA9IDB4MUMsIF9NTV9QRVJNX0FCREIgPSAweDFELAorICBfTU1fUEVSTV9BQkRDID0gMHgxRSwgX01NX1BFUk1fQUJERCA9IDB4MUYsIF9NTV9QRVJNX0FDQUEgPSAweDIwLAorICBfTU1fUEVSTV9BQ0FCID0gMHgyMSwgX01NX1BFUk1fQUNBQyA9IDB4MjIsIF9NTV9QRVJNX0FDQUQgPSAweDIzLAorICBfTU1fUEVSTV9BQ0JBID0gMHgyNCwgX01NX1BFUk1fQUNCQiA9IDB4MjUsIF9NTV9QRVJNX0FDQkMgPSAweDI2LAorICBfTU1fUEVSTV9BQ0JEID0gMHgyNywgX01NX1BFUk1fQUNDQSA9IDB4MjgsIF9NTV9QRVJNX0FDQ0IgPSAweDI5LAorICBfTU1fUEVSTV9BQ0NDID0gMHgyQSwgX01NX1BFUk1fQUNDRCA9IDB4MkIsIF9NTV9QRVJNX0FDREEgPSAweDJDLAorICBfTU1fUEVSTV9BQ0RCID0gMHgyRCwgX01NX1BFUk1fQUNEQyA9IDB4MkUsIF9NTV9QRVJNX0FDREQgPSAweDJGLAorICBfTU1fUEVSTV9BREFBID0gMHgzMCwgX01NX1BFUk1fQURBQiA9IDB4MzEsIF9NTV9QRVJNX0FEQUMgPSAweDMyLAorICBfTU1fUEVSTV9BREFEID0gMHgzMywgX01NX1BFUk1fQURCQSA9IDB4MzQsIF9NTV9QRVJNX0FEQkIgPSAweDM1LAorICBfTU1fUEVSTV9BREJDID0gMHgzNiwgX01NX1BFUk1fQURCRCA9IDB4MzcsIF9NTV9QRVJNX0FEQ0EgPSAweDM4LAorICBfTU1fUEVSTV9BRENCID0gMHgzOSwgX01NX1BFUk1fQURDQyA9IDB4M0EsIF9NTV9QRVJNX0FEQ0QgPSAweDNCLAorICBfTU1fUEVSTV9BRERBID0gMHgzQywgX01NX1BFUk1fQUREQiA9IDB4M0QsIF9NTV9QRVJNX0FEREMgPSAweDNFLAorICBfTU1fUEVSTV9BREREID0gMHgzRiwgX01NX1BFUk1fQkFBQSA9IDB4NDAsIF9NTV9QRVJNX0JBQUIgPSAweDQxLAorICBfTU1fUEVSTV9CQUFDID0gMHg0MiwgX01NX1BFUk1fQkFBRCA9IDB4NDMsIF9NTV9QRVJNX0JBQkEgPSAweDQ0LAorICBfTU1fUEVSTV9CQUJCID0gMHg0NSwgX01NX1BFUk1fQkFCQyA9IDB4NDYsIF9NTV9QRVJNX0JBQkQgPSAweDQ3LAorICBfTU1fUEVSTV9CQUNBID0gMHg0OCwgX01NX1BFUk1fQkFDQiA9IDB4NDksIF9NTV9QRVJNX0JBQ0MgPSAweDRBLAorICBfTU1fUEVSTV9CQUNEID0gMHg0QiwgX01NX1BFUk1fQkFEQSA9IDB4NEMsIF9NTV9QRVJNX0JBREIgPSAweDRELAorICBfTU1fUEVSTV9CQURDID0gMHg0RSwgX01NX1BFUk1fQkFERCA9IDB4NEYsIF9NTV9QRVJNX0JCQUEgPSAweDUwLAorICBfTU1fUEVSTV9CQkFCID0gMHg1MSwgX01NX1BFUk1fQkJBQyA9IDB4NTIsIF9NTV9QRVJNX0JCQUQgPSAweDUzLAorICBfTU1fUEVSTV9CQkJBID0gMHg1NCwgX01NX1BFUk1fQkJCQiA9IDB4NTUsIF9NTV9QRVJNX0JCQkMgPSAweDU2LAorICBfTU1fUEVSTV9CQkJEID0gMHg1NywgX01NX1BFUk1fQkJDQSA9IDB4NTgsIF9NTV9QRVJNX0JCQ0IgPSAweDU5LAorICBfTU1fUEVSTV9CQkNDID0gMHg1QSwgX01NX1BFUk1fQkJDRCA9IDB4NUIsIF9NTV9QRVJNX0JCREEgPSAweDVDLAorICBfTU1fUEVSTV9CQkRCID0gMHg1RCwgX01NX1BFUk1fQkJEQyA9IDB4NUUsIF9NTV9QRVJNX0JCREQgPSAweDVGLAorICBfTU1fUEVSTV9CQ0FBID0gMHg2MCwgX01NX1BFUk1fQkNBQiA9IDB4NjEsIF9NTV9QRVJNX0JDQUMgPSAweDYyLAorICBfTU1fUEVSTV9CQ0FEID0gMHg2MywgX01NX1BFUk1fQkNCQSA9IDB4NjQsIF9NTV9QRVJNX0JDQkIgPSAweDY1LAorICBfTU1fUEVSTV9CQ0JDID0gMHg2NiwgX01NX1BFUk1fQkNCRCA9IDB4NjcsIF9NTV9QRVJNX0JDQ0EgPSAweDY4LAorICBfTU1fUEVSTV9CQ0NCID0gMHg2OSwgX01NX1BFUk1fQkNDQyA9IDB4NkEsIF9NTV9QRVJNX0JDQ0QgPSAweDZCLAorICBfTU1fUEVSTV9CQ0RBID0gMHg2QywgX01NX1BFUk1fQkNEQiA9IDB4NkQsIF9NTV9QRVJNX0JDREMgPSAweDZFLAorICBfTU1fUEVSTV9CQ0REID0gMHg2RiwgX01NX1BFUk1fQkRBQSA9IDB4NzAsIF9NTV9QRVJNX0JEQUIgPSAweDcxLAorICBfTU1fUEVSTV9CREFDID0gMHg3MiwgX01NX1BFUk1fQkRBRCA9IDB4NzMsIF9NTV9QRVJNX0JEQkEgPSAweDc0LAorICBfTU1fUEVSTV9CREJCID0gMHg3NSwgX01NX1BFUk1fQkRCQyA9IDB4NzYsIF9NTV9QRVJNX0JEQkQgPSAweDc3LAorICBfTU1fUEVSTV9CRENBID0gMHg3OCwgX01NX1BFUk1fQkRDQiA9IDB4NzksIF9NTV9QRVJNX0JEQ0MgPSAweDdBLAorICBfTU1fUEVSTV9CRENEID0gMHg3QiwgX01NX1BFUk1fQkREQSA9IDB4N0MsIF9NTV9QRVJNX0JEREIgPSAweDdELAorICBfTU1fUEVSTV9CRERDID0gMHg3RSwgX01NX1BFUk1fQkRERCA9IDB4N0YsIF9NTV9QRVJNX0NBQUEgPSAweDgwLAorICBfTU1fUEVSTV9DQUFCID0gMHg4MSwgX01NX1BFUk1fQ0FBQyA9IDB4ODIsIF9NTV9QRVJNX0NBQUQgPSAweDgzLAorICBfTU1fUEVSTV9DQUJBID0gMHg4NCwgX01NX1BFUk1fQ0FCQiA9IDB4ODUsIF9NTV9QRVJNX0NBQkMgPSAweDg2LAorICBfTU1fUEVSTV9DQUJEID0gMHg4NywgX01NX1BFUk1fQ0FDQSA9IDB4ODgsIF9NTV9QRVJNX0NBQ0IgPSAweDg5LAorICBfTU1fUEVSTV9DQUNDID0gMHg4QSwgX01NX1BFUk1fQ0FDRCA9IDB4OEIsIF9NTV9QRVJNX0NBREEgPSAweDhDLAorICBfTU1fUEVSTV9DQURCID0gMHg4RCwgX01NX1BFUk1fQ0FEQyA9IDB4OEUsIF9NTV9QRVJNX0NBREQgPSAweDhGLAorICBfTU1fUEVSTV9DQkFBID0gMHg5MCwgX01NX1BFUk1fQ0JBQiA9IDB4OTEsIF9NTV9QRVJNX0NCQUMgPSAweDkyLAorICBfTU1fUEVSTV9DQkFEID0gMHg5MywgX01NX1BFUk1fQ0JCQSA9IDB4OTQsIF9NTV9QRVJNX0NCQkIgPSAweDk1LAorICBfTU1fUEVSTV9DQkJDID0gMHg5NiwgX01NX1BFUk1fQ0JCRCA9IDB4OTcsIF9NTV9QRVJNX0NCQ0EgPSAweDk4LAorICBfTU1fUEVSTV9DQkNCID0gMHg5OSwgX01NX1BFUk1fQ0JDQyA9IDB4OUEsIF9NTV9QRVJNX0NCQ0QgPSAweDlCLAorICBfTU1fUEVSTV9DQkRBID0gMHg5QywgX01NX1BFUk1fQ0JEQiA9IDB4OUQsIF9NTV9QRVJNX0NCREMgPSAweDlFLAorICBfTU1fUEVSTV9DQkREID0gMHg5RiwgX01NX1BFUk1fQ0NBQSA9IDB4QTAsIF9NTV9QRVJNX0NDQUIgPSAweEExLAorICBfTU1fUEVSTV9DQ0FDID0gMHhBMiwgX01NX1BFUk1fQ0NBRCA9IDB4QTMsIF9NTV9QRVJNX0NDQkEgPSAweEE0LAorICBfTU1fUEVSTV9DQ0JCID0gMHhBNSwgX01NX1BFUk1fQ0NCQyA9IDB4QTYsIF9NTV9QRVJNX0NDQkQgPSAweEE3LAorICBfTU1fUEVSTV9DQ0NBID0gMHhBOCwgX01NX1BFUk1fQ0NDQiA9IDB4QTksIF9NTV9QRVJNX0NDQ0MgPSAweEFBLAorICBfTU1fUEVSTV9DQ0NEID0gMHhBQiwgX01NX1BFUk1fQ0NEQSA9IDB4QUMsIF9NTV9QRVJNX0NDREIgPSAweEFELAorICBfTU1fUEVSTV9DQ0RDID0gMHhBRSwgX01NX1BFUk1fQ0NERCA9IDB4QUYsIF9NTV9QRVJNX0NEQUEgPSAweEIwLAorICBfTU1fUEVSTV9DREFCID0gMHhCMSwgX01NX1BFUk1fQ0RBQyA9IDB4QjIsIF9NTV9QRVJNX0NEQUQgPSAweEIzLAorICBfTU1fUEVSTV9DREJBID0gMHhCNCwgX01NX1BFUk1fQ0RCQiA9IDB4QjUsIF9NTV9QRVJNX0NEQkMgPSAweEI2LAorICBfTU1fUEVSTV9DREJEID0gMHhCNywgX01NX1BFUk1fQ0RDQSA9IDB4QjgsIF9NTV9QRVJNX0NEQ0IgPSAweEI5LAorICBfTU1fUEVSTV9DRENDID0gMHhCQSwgX01NX1BFUk1fQ0RDRCA9IDB4QkIsIF9NTV9QRVJNX0NEREEgPSAweEJDLAorICBfTU1fUEVSTV9DRERCID0gMHhCRCwgX01NX1BFUk1fQ0REQyA9IDB4QkUsIF9NTV9QRVJNX0NEREQgPSAweEJGLAorICBfTU1fUEVSTV9EQUFBID0gMHhDMCwgX01NX1BFUk1fREFBQiA9IDB4QzEsIF9NTV9QRVJNX0RBQUMgPSAweEMyLAorICBfTU1fUEVSTV9EQUFEID0gMHhDMywgX01NX1BFUk1fREFCQSA9IDB4QzQsIF9NTV9QRVJNX0RBQkIgPSAweEM1LAorICBfTU1fUEVSTV9EQUJDID0gMHhDNiwgX01NX1BFUk1fREFCRCA9IDB4QzcsIF9NTV9QRVJNX0RBQ0EgPSAweEM4LAorICBfTU1fUEVSTV9EQUNCID0gMHhDOSwgX01NX1BFUk1fREFDQyA9IDB4Q0EsIF9NTV9QRVJNX0RBQ0QgPSAweENCLAorICBfTU1fUEVSTV9EQURBID0gMHhDQywgX01NX1BFUk1fREFEQiA9IDB4Q0QsIF9NTV9QRVJNX0RBREMgPSAweENFLAorICBfTU1fUEVSTV9EQUREID0gMHhDRiwgX01NX1BFUk1fREJBQSA9IDB4RDAsIF9NTV9QRVJNX0RCQUIgPSAweEQxLAorICBfTU1fUEVSTV9EQkFDID0gMHhEMiwgX01NX1BFUk1fREJBRCA9IDB4RDMsIF9NTV9QRVJNX0RCQkEgPSAweEQ0LAorICBfTU1fUEVSTV9EQkJCID0gMHhENSwgX01NX1BFUk1fREJCQyA9IDB4RDYsIF9NTV9QRVJNX0RCQkQgPSAweEQ3LAorICBfTU1fUEVSTV9EQkNBID0gMHhEOCwgX01NX1BFUk1fREJDQiA9IDB4RDksIF9NTV9QRVJNX0RCQ0MgPSAweERBLAorICBfTU1fUEVSTV9EQkNEID0gMHhEQiwgX01NX1BFUk1fREJEQSA9IDB4REMsIF9NTV9QRVJNX0RCREIgPSAweERELAorICBfTU1fUEVSTV9EQkRDID0gMHhERSwgX01NX1BFUk1fREJERCA9IDB4REYsIF9NTV9QRVJNX0RDQUEgPSAweEUwLAorICBfTU1fUEVSTV9EQ0FCID0gMHhFMSwgX01NX1BFUk1fRENBQyA9IDB4RTIsIF9NTV9QRVJNX0RDQUQgPSAweEUzLAorICBfTU1fUEVSTV9EQ0JBID0gMHhFNCwgX01NX1BFUk1fRENCQiA9IDB4RTUsIF9NTV9QRVJNX0RDQkMgPSAweEU2LAorICBfTU1fUEVSTV9EQ0JEID0gMHhFNywgX01NX1BFUk1fRENDQSA9IDB4RTgsIF9NTV9QRVJNX0RDQ0IgPSAweEU5LAorICBfTU1fUEVSTV9EQ0NDID0gMHhFQSwgX01NX1BFUk1fRENDRCA9IDB4RUIsIF9NTV9QRVJNX0RDREEgPSAweEVDLAorICBfTU1fUEVSTV9EQ0RCID0gMHhFRCwgX01NX1BFUk1fRENEQyA9IDB4RUUsIF9NTV9QRVJNX0RDREQgPSAweEVGLAorICBfTU1fUEVSTV9EREFBID0gMHhGMCwgX01NX1BFUk1fRERBQiA9IDB4RjEsIF9NTV9QRVJNX0REQUMgPSAweEYyLAorICBfTU1fUEVSTV9EREFEID0gMHhGMywgX01NX1BFUk1fRERCQSA9IDB4RjQsIF9NTV9QRVJNX0REQkIgPSAweEY1LAorICBfTU1fUEVSTV9EREJDID0gMHhGNiwgX01NX1BFUk1fRERCRCA9IDB4RjcsIF9NTV9QRVJNX0REQ0EgPSAweEY4LAorICBfTU1fUEVSTV9ERENCID0gMHhGOSwgX01NX1BFUk1fRERDQyA9IDB4RkEsIF9NTV9QRVJNX0REQ0QgPSAweEZCLAorICBfTU1fUEVSTV9ERERBID0gMHhGQywgX01NX1BFUk1fREREQiA9IDB4RkQsIF9NTV9QRVJNX0REREMgPSAweEZFLAorICBfTU1fUEVSTV9EREREID0gMHhGRgorfSBfTU1fUEVSTV9FTlVNOworCit0eXBlZGVmIGVudW0KK3sKKyAgX01NX01BTlRfTk9STV8xXzIsICAgIC8qIGludGVydmFsIFsxLCAyKSAgICAgICovCisgIF9NTV9NQU5UX05PUk1fcDVfMiwgICAvKiBpbnRlcnZhbCBbMC41LCAyKSAgICAqLworICBfTU1fTUFOVF9OT1JNX3A1XzEsICAgLyogaW50ZXJ2YWwgWzAuNSwgMSkgICAgKi8KKyAgX01NX01BTlRfTk9STV9wNzVfMXA1ICAgLyogaW50ZXJ2YWwgWzAuNzUsIDEuNSkgKi8KK30gX01NX01BTlRJU1NBX05PUk1fRU5VTTsKKwordHlwZWRlZiBlbnVtCit7CisgIF9NTV9NQU5UX1NJR05fc3JjLCAgICAvKiBzaWduID0gc2lnbihTUkMpICAgICAqLworICBfTU1fTUFOVF9TSUdOX3plcm8sICAgLyogc2lnbiA9IDAgICAgICAgICAgICAgKi8KKyAgX01NX01BTlRfU0lHTl9uYW4gICAvKiBERVNUID0gTmFOIGlmIHNpZ24oU1JDKSA9IDEgKi8KK30gX01NX01BTlRJU1NBX1NJR05fRU5VTTsKKworLyogRGVmaW5lIHRoZSBkZWZhdWx0IGF0dHJpYnV0ZXMgZm9yIHRoZSBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlLiAqLworI2RlZmluZSBfX0RFRkFVTFRfRk5fQVRUUlMgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fLCBfX3RhcmdldF9fKCJhdng1MTJmIikpKQorCisvKiBDcmVhdGUgdmVjdG9ycyB3aXRoIHJlcGVhdGVkIGVsZW1lbnRzICovCisKK3N0YXRpYyAgX19pbmxpbmUgX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9zZXR6ZXJvX3NpNTEyKHZvaWQpCit7CisgIHJldHVybiAoX19tNTEyaSkoX192OGRpKXsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OworfQorCisjZGVmaW5lIF9tbTUxMl9zZXR6ZXJvX2VwaTMyIF9tbTUxMl9zZXR6ZXJvX3NpNTEyCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfdW5kZWZpbmVkX3BkKHZvaWQpCit7CisgIHJldHVybiAoX19tNTEyZClfX2J1aWx0aW5faWEzMl91bmRlZjUxMigpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfdW5kZWZpbmVkKHZvaWQpCit7CisgIHJldHVybiAoX19tNTEyKV9fYnVpbHRpbl9pYTMyX3VuZGVmNTEyKCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl91bmRlZmluZWRfcHModm9pZCkKK3sKKyAgcmV0dXJuIChfX201MTIpX19idWlsdGluX2lhMzJfdW5kZWY1MTIoKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl91bmRlZmluZWRfZXBpMzIodm9pZCkKK3sKKyAgcmV0dXJuIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX3VuZGVmNTEyKCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfYnJvYWRjYXN0ZF9lcGkzMiAoX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tNTEyaSlfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcigoX192NHNpKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNpKV9tbV91bmRlZmluZWRfc2kxMjgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfYnJvYWRjYXN0ZF9lcGkzMiAoX19tNTEyaSBfX08sIF9fbW1hc2sxNiBfX00sIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTUxMmkpX19idWlsdGluX2lhMzJfc2VsZWN0ZF81MTIoX19NLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpIF9tbTUxMl9icm9hZGNhc3RkX2VwaTMyKF9fQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzaSkgX19PKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9icm9hZGNhc3RkX2VwaTMyIChfX21tYXNrMTYgX19NLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX3NlbGVjdGRfNTEyKF9fTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNpKSBfbW01MTJfYnJvYWRjYXN0ZF9lcGkzMihfX0EpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpIF9tbTUxMl9zZXR6ZXJvX3NpNTEyKCkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2Jyb2FkY2FzdHFfZXBpNjQgKF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTUxMmkpX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjJkaSkgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkaSkgX21tX3VuZGVmaW5lZF9zaTEyOCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19icm9hZGNhc3RxX2VwaTY0IChfX201MTJpIF9fTywgX19tbWFzazggX19NLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX3NlbGVjdHFfNTEyKF9fTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGkpIF9tbTUxMl9icm9hZGNhc3RxX2VwaTY0KF9fQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKSBfX08pOworCit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfYnJvYWRjYXN0cV9lcGk2NCAoX19tbWFzazggX19NLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX3NlbGVjdHFfNTEyKF9fTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGkpIF9tbTUxMl9icm9hZGNhc3RxX2VwaTY0KF9fQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKSBfbW01MTJfc2V0emVyb19zaTUxMigpKTsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfc2V0MV9lcGkzMihfX21tYXNrMTYgX19NLCBpbnQgX19BKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3Bicm9hZGNhc3RkNTEyX2dwcl9tYXNrIChfX0EsCisgICAgICAgICAgICAgICAgIChfX3YxNnNpKQorICAgICAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19zaTUxMiAoKSwKKyAgICAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfc2V0MV9lcGk2NChfX21tYXNrOCBfX00sIGxvbmcgbG9uZyBfX0EpCit7CisjaWZkZWYgX194ODZfNjRfXworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3Bicm9hZGNhc3RxNTEyX2dwcl9tYXNrIChfX0EsCisgICAgICAgICAgICAgICAgIChfX3Y4ZGkpCisgICAgICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3NpNTEyICgpLAorICAgICAgICAgICAgICAgICBfX00pOworI2Vsc2UKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wYnJvYWRjYXN0cTUxMl9tZW1fbWFzayAoX19BLAorICAgICAgICAgICAgICAgICAoX192OGRpKQorICAgICAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19zaTUxMiAoKSwKKyAgICAgICAgICAgICAgICAgX19NKTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmUgX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX3NldHplcm9fcHModm9pZCkKK3sKKyAgcmV0dXJuIChfX201MTIpeyAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwKKyAgICAgICAgICAgICAgICAgICAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCB9OworfQorCisjZGVmaW5lIF9tbTUxMl9zZXR6ZXJvIF9tbTUxMl9zZXR6ZXJvX3BzCisKK3N0YXRpYyAgX19pbmxpbmUgX19tNTEyZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9zZXR6ZXJvX3BkKHZvaWQpCit7CisgIHJldHVybiAoX19tNTEyZCl7IDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wIH07Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfc2V0MV9wcyhmbG9hdCBfX3cpCit7CisgIHJldHVybiAoX19tNTEyKXsgX193LCBfX3csIF9fdywgX193LCBfX3csIF9fdywgX193LCBfX3csCisgICAgICAgICAgICAgICAgICAgX193LCBfX3csIF9fdywgX193LCBfX3csIF9fdywgX193LCBfX3cgIH07Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX3NldDFfcGQoZG91YmxlIF9fdykKK3sKKyAgcmV0dXJuIChfX201MTJkKXsgX193LCBfX3csIF9fdywgX193LCBfX3csIF9fdywgX193LCBfX3cgfTsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfc2V0MV9lcGk4KGNoYXIgX193KQoreworICByZXR1cm4gKF9fbTUxMmkpKF9fdjY0cWkpeyBfX3csIF9fdywgX193LCBfX3csIF9fdywgX193LCBfX3csIF9fdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX193LCBfX3csIF9fdywgX193LCBfX3csIF9fdywgX193LCBfX3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdywgX193LCBfX3csIF9fdywgX193LCBfX3csIF9fdywgX193LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3csIF9fdywgX193LCBfX3csIF9fdywgX193LCBfX3csIF9fdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX193LCBfX3csIF9fdywgX193LCBfX3csIF9fdywgX193LCBfX3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdywgX193LCBfX3csIF9fdywgX193LCBfX3csIF9fdywgX193LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3csIF9fdywgX193LCBfX3csIF9fdywgX193LCBfX3csIF9fdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX193LCBfX3csIF9fdywgX193LCBfX3csIF9fdywgX193LCBfX3cgIH07Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX3NldDFfZXBpMTYoc2hvcnQgX193KQoreworICByZXR1cm4gKF9fbTUxMmkpKF9fdjMyaGkpeyBfX3csIF9fdywgX193LCBfX3csIF9fdywgX193LCBfX3csIF9fdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX193LCBfX3csIF9fdywgX193LCBfX3csIF9fdywgX193LCBfX3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdywgX193LCBfX3csIF9fdywgX193LCBfX3csIF9fdywgX193LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3csIF9fdywgX193LCBfX3csIF9fdywgX193LCBfX3csIF9fdyB9OworfQorCitzdGF0aWMgX19pbmxpbmUgX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9zZXQxX2VwaTMyKGludCBfX3MpCit7CisgIHJldHVybiAoX19tNTEyaSkoX192MTZzaSl7IF9fcywgX19zLCBfX3MsIF9fcywgX19zLCBfX3MsIF9fcywgX19zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3MsIF9fcywgX19zLCBfX3MsIF9fcywgX19zLCBfX3MsIF9fcyB9OworfQorCitzdGF0aWMgX19pbmxpbmUgX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9zZXQxX2VwaTY0KGxvbmcgbG9uZyBfX2QpCit7CisgIHJldHVybiAoX19tNTEyaSkoX192OGRpKXsgX19kLCBfX2QsIF9fZCwgX19kLCBfX2QsIF9fZCwgX19kLCBfX2QgfTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2Jyb2FkY2FzdHNzX3BzKF9fbTEyOCBfX0EpCit7CisgIHJldHVybiAoX19tNTEyKV9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZilfbW1fdW5kZWZpbmVkX3BzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApOworfQorCitzdGF0aWMgX19pbmxpbmUgX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9zZXQ0X2VwaTMyIChpbnQgX19BLCBpbnQgX19CLCBpbnQgX19DLCBpbnQgX19EKQoreworICByZXR1cm4gIChfX201MTJpKShfX3YxNnNpKQorICAgeyBfX0QsIF9fQywgX19CLCBfX0EsIF9fRCwgX19DLCBfX0IsIF9fQSwKKyAgICAgX19ELCBfX0MsIF9fQiwgX19BLCBfX0QsIF9fQywgX19CLCBfX0EgfTsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfc2V0NF9lcGk2NCAobG9uZyBsb25nIF9fQSwgbG9uZyBsb25nIF9fQiwgbG9uZyBsb25nIF9fQywKKyAgICAgICBsb25nIGxvbmcgX19EKQoreworICByZXR1cm4gIChfX201MTJpKSAoX192OGRpKQorICAgeyBfX0QsIF9fQywgX19CLCBfX0EsIF9fRCwgX19DLCBfX0IsIF9fQSB9OworfQorCitzdGF0aWMgX19pbmxpbmUgX19tNTEyZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9zZXQ0X3BkIChkb3VibGUgX19BLCBkb3VibGUgX19CLCBkb3VibGUgX19DLCBkb3VibGUgX19EKQoreworICByZXR1cm4gIChfX201MTJkKQorICAgeyBfX0QsIF9fQywgX19CLCBfX0EsIF9fRCwgX19DLCBfX0IsIF9fQSB9OworfQorCitzdGF0aWMgX19pbmxpbmUgX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX3NldDRfcHMgKGZsb2F0IF9fQSwgZmxvYXQgX19CLCBmbG9hdCBfX0MsIGZsb2F0IF9fRCkKK3sKKyAgcmV0dXJuICAoX19tNTEyKQorICAgeyBfX0QsIF9fQywgX19CLCBfX0EsIF9fRCwgX19DLCBfX0IsIF9fQSwKKyAgICAgX19ELCBfX0MsIF9fQiwgX19BLCBfX0QsIF9fQywgX19CLCBfX0EgfTsKK30KKworI2RlZmluZSBfbW01MTJfc2V0cjRfZXBpMzIoZTAsZTEsZTIsZTMpICAgICAgICAgICAgICAgXAorICBfbW01MTJfc2V0NF9lcGkzMigoZTMpLChlMiksKGUxKSwoZTApKQorCisjZGVmaW5lIF9tbTUxMl9zZXRyNF9lcGk2NChlMCxlMSxlMixlMykgICAgICAgICAgICAgICBcCisgIF9tbTUxMl9zZXQ0X2VwaTY0KChlMyksKGUyKSwoZTEpLChlMCkpCisKKyNkZWZpbmUgX21tNTEyX3NldHI0X3BkKGUwLGUxLGUyLGUzKSAgICAgICAgICAgICAgICBcCisgIF9tbTUxMl9zZXQ0X3BkKChlMyksKGUyKSwoZTEpLChlMCkpCisKKyNkZWZpbmUgX21tNTEyX3NldHI0X3BzKGUwLGUxLGUyLGUzKSAgICAgICAgICAgICAgICBcCisgIF9tbTUxMl9zZXQ0X3BzKChlMyksKGUyKSwoZTEpLChlMCkpCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfYnJvYWRjYXN0c2RfcGQoX19tMTI4ZCBfX0EpCit7CisgIHJldHVybiAoX19tNTEyZClfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcigoX192MmRmKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKSBfbW1fdW5kZWZpbmVkX3BkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwKTsKK30KKworLyogQ2FzdCBiZXR3ZWVuIHZlY3RvciB0eXBlcyAqLworCitzdGF0aWMgX19pbmxpbmUgX19tNTEyZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9jYXN0cGQyNTZfcGQ1MTIoX19tMjU2ZCBfX2EpCit7CisgIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYSwgMCwgMSwgMiwgMywgLTEsIC0xLCAtMSwgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmUgX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2Nhc3RwczI1Nl9wczUxMihfX20yNTYgX19hKQoreworICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfY2FzdHBkNTEyX3BkMTI4KF9fbTUxMmQgX19hKQoreworICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIDAsIDEpOworfQorCitzdGF0aWMgX19pbmxpbmUgX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9jYXN0cGQ1MTJfcGQyNTYgKF9fbTUxMmQgX19BKQoreworICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19BLCBfX0EsIDAsIDEsIDIsIDMpOworfQorCitzdGF0aWMgX19pbmxpbmUgX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2Nhc3RwczUxMl9wczEyOChfX201MTIgX19hKQoreworICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIDAsIDEsIDIsIDMpOworfQorCitzdGF0aWMgX19pbmxpbmUgX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2Nhc3RwczUxMl9wczI1NiAoX19tNTEyIF9fQSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fQSwgX19BLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3KTsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTUxMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9jYXN0cGRfcHMgKF9fbTUxMmQgX19BKQoreworICByZXR1cm4gKF9fbTUxMikgKF9fQSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2Nhc3RwZF9zaTUxMiAoX19tNTEyZCBfX0EpCit7CisgIHJldHVybiAoX19tNTEyaSkgKF9fQSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfY2FzdHBkMTI4X3BkNTEyIChfX20xMjhkIF9fQSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKCBfX0EsIF9fQSwgMCwgMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2Nhc3Rwc19wZCAoX19tNTEyIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJkKSAoX19BKTsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfY2FzdHBzX3NpNTEyIChfX201MTIgX19BKQoreworICByZXR1cm4gKF9fbTUxMmkpIChfX0EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfY2FzdHBzMTI4X3BzNTEyIChfX20xMjggX19BKQoreworICAgIHJldHVybiAgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoIF9fQSwgX19BLCAwLCAxLCAyLCAzLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9jYXN0c2kxMjhfc2k1MTIgKF9fbTEyOGkgX19BKQoreworICAgcmV0dXJuICBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvciggX19BLCBfX0EsIDAsIDEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2Nhc3RzaTI1Nl9zaTUxMiAoX19tMjU2aSBfX0EpCit7CisgICByZXR1cm4gIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKCBfX0EsIF9fQSwgMCwgMSwgMiwgMywgLTEsIC0xLCAtMSwgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmUgX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2Nhc3RzaTUxMl9wcyAoX19tNTEyaSBfX0EpCit7CisgIHJldHVybiAoX19tNTEyKSAoX19BKTsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTUxMmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfY2FzdHNpNTEyX3BkIChfX201MTJpIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJkKSAoX19BKTsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfY2FzdHNpNTEyX3NpMTI4IChfX201MTJpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fQSwgX19BICwgMCwgMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2Nhc3RzaTUxMl9zaTI1NiAoX19tNTEyaSBfX0EpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX0EsIF9fQSAsIDAsIDEsIDIsIDMpOworfQorCisvKiBCaXR3aXNlIG9wZXJhdG9ycyAqLworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9hbmRfZXBpMzIoX19tNTEyaSBfX2EsIF9fbTUxMmkgX19iKQoreworICByZXR1cm4gKF9fbTUxMmkpKChfX3YxNnN1KV9fYSAmIChfX3YxNnN1KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19hbmRfZXBpMzIoX19tNTEyaSBfX3NyYywgX19tbWFzazE2IF9faywgX19tNTEyaSBfX2EsIF9fbTUxMmkgX19iKQoreworICByZXR1cm4gKF9fbTUxMmkpX19idWlsdGluX2lhMzJfc2VsZWN0ZF81MTIoKF9fbW1hc2sxNilfX2ssCisgICAgICAgICAgICAgICAgKF9fdjE2c2kpIF9tbTUxMl9hbmRfZXBpMzIoX19hLCBfX2IpLAorICAgICAgICAgICAgICAgIChfX3YxNnNpKSBfX3NyYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfYW5kX2VwaTMyKF9fbW1hc2sxNiBfX2ssIF9fbTUxMmkgX19hLCBfX201MTJpIF9fYikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfbW01MTJfbWFza19hbmRfZXBpMzIoX21tNTEyX3NldHplcm9fc2k1MTIgKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faywgX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2FuZF9lcGk2NChfX201MTJpIF9fYSwgX19tNTEyaSBfX2IpCit7CisgIHJldHVybiAoX19tNTEyaSkoKF9fdjhkdSlfX2EgJiAoX192OGR1KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19hbmRfZXBpNjQoX19tNTEyaSBfX3NyYywgX19tbWFzazggX19rLCBfX201MTJpIF9fYSwgX19tNTEyaSBfX2IpCit7CisgICAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9zZWxlY3RxXzUxMiAoKF9fbW1hc2s4KSBfX2ssCisgICAgICAgICAgICAgICAgKF9fdjhkaSkgX21tNTEyX2FuZF9lcGk2NChfX2EsIF9fYiksCisgICAgICAgICAgICAgICAgKF9fdjhkaSkgX19zcmMpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X2FuZF9lcGk2NChfX21tYXNrOCBfX2ssIF9fbTUxMmkgX19hLCBfX201MTJpIF9fYikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfbW01MTJfbWFza19hbmRfZXBpNjQoX21tNTEyX3NldHplcm9fc2k1MTIgKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faywgX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2FuZG5vdF9zaTUxMiAoX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpKH4oX192OGR1KShfX0EpICYgKF9fdjhkdSlfX0IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2FuZG5vdF9lcGkzMiAoX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpKH4oX192MTZzdSkoX19BKSAmIChfX3YxNnN1KV9fQik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19hbmRub3RfZXBpMzIoX19tNTEyaSBfX1csIF9fbW1hc2sxNiBfX1UsIF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX3NlbGVjdGRfNTEyKChfX21tYXNrMTYpX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzaSlfbW01MTJfYW5kbm90X2VwaTMyKF9fQSwgX19CKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpX19XKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9hbmRub3RfZXBpMzIoX19tbWFzazE2IF9fVSwgX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpX21tNTEyX21hc2tfYW5kbm90X2VwaTMyKF9tbTUxMl9zZXR6ZXJvX3NpNTEyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19VLCBfX0EsIF9fQik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfYW5kbm90X2VwaTY0KF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSh+KF9fdjhkdSkoX19BKSAmIChfX3Y4ZHUpX19CKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2FuZG5vdF9lcGk2NChfX201MTJpIF9fVywgX19tbWFzazggX19VLCBfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9zZWxlY3RxXzUxMigoX19tbWFzazgpX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkaSlfbW01MTJfYW5kbm90X2VwaTY0KF9fQSwgX19CKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGkpX19XKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9hbmRub3RfZXBpNjQoX19tbWFzazggX19VLCBfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSlfbW01MTJfbWFza19hbmRub3RfZXBpNjQoX21tNTEyX3NldHplcm9fc2k1MTIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1UsIF9fQSwgX19CKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9vcl9lcGkzMihfX201MTJpIF9fYSwgX19tNTEyaSBfX2IpCit7CisgIHJldHVybiAoX19tNTEyaSkoKF9fdjE2c3UpX19hIHwgKF9fdjE2c3UpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX29yX2VwaTMyKF9fbTUxMmkgX19zcmMsIF9fbW1hc2sxNiBfX2ssIF9fbTUxMmkgX19hLCBfX201MTJpIF9fYikKK3sKKyAgcmV0dXJuIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX3NlbGVjdGRfNTEyKChfX21tYXNrMTYpX19rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpX21tNTEyX29yX2VwaTMyKF9fYSwgX19iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNpKV9fc3JjKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9vcl9lcGkzMihfX21tYXNrMTYgX19rLCBfX201MTJpIF9fYSwgX19tNTEyaSBfX2IpCit7CisgIHJldHVybiAoX19tNTEyaSlfbW01MTJfbWFza19vcl9lcGkzMihfbW01MTJfc2V0emVyb19zaTUxMigpLCBfX2ssIF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9vcl9lcGk2NChfX201MTJpIF9fYSwgX19tNTEyaSBfX2IpCit7CisgIHJldHVybiAoX19tNTEyaSkoKF9fdjhkdSlfX2EgfCAoX192OGR1KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19vcl9lcGk2NChfX201MTJpIF9fc3JjLCBfX21tYXNrOCBfX2ssIF9fbTUxMmkgX19hLCBfX201MTJpIF9fYikKK3sKKyAgcmV0dXJuIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX3NlbGVjdHFfNTEyKChfX21tYXNrOClfX2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKV9tbTUxMl9vcl9lcGk2NChfX2EsIF9fYiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKV9fc3JjKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9vcl9lcGk2NChfX21tYXNrOCBfX2ssIF9fbTUxMmkgX19hLCBfX201MTJpIF9fYikKK3sKKyAgcmV0dXJuIChfX201MTJpKV9tbTUxMl9tYXNrX29yX2VwaTY0KF9tbTUxMl9zZXR6ZXJvX3NpNTEyKCksIF9faywgX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX3hvcl9lcGkzMihfX201MTJpIF9fYSwgX19tNTEyaSBfX2IpCit7CisgIHJldHVybiAoX19tNTEyaSkoKF9fdjE2c3UpX19hIF4gKF9fdjE2c3UpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX3hvcl9lcGkzMihfX201MTJpIF9fc3JjLCBfX21tYXNrMTYgX19rLCBfX201MTJpIF9fYSwgX19tNTEyaSBfX2IpCit7CisgIHJldHVybiAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9zZWxlY3RkXzUxMigoX19tbWFzazE2KV9faywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpX21tNTEyX3hvcl9lcGkzMihfX2EsIF9fYiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNpKV9fc3JjKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel94b3JfZXBpMzIoX19tbWFzazE2IF9faywgX19tNTEyaSBfX2EsIF9fbTUxMmkgX19iKQoreworICByZXR1cm4gKF9fbTUxMmkpX21tNTEyX21hc2tfeG9yX2VwaTMyKF9tbTUxMl9zZXR6ZXJvX3NpNTEyKCksIF9faywgX19hLCBfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX3hvcl9lcGk2NChfX201MTJpIF9fYSwgX19tNTEyaSBfX2IpCit7CisgIHJldHVybiAoX19tNTEyaSkoKF9fdjhkdSlfX2EgXiAoX192OGR1KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza194b3JfZXBpNjQoX19tNTEyaSBfX3NyYywgX19tbWFzazggX19rLCBfX201MTJpIF9fYSwgX19tNTEyaSBfX2IpCit7CisgIHJldHVybiAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9zZWxlY3RxXzUxMigoX19tbWFzazgpX19rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkaSlfbW01MTJfeG9yX2VwaTY0KF9fYSwgX19iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGkpX19zcmMpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X3hvcl9lcGk2NChfX21tYXNrOCBfX2ssIF9fbTUxMmkgX19hLCBfX201MTJpIF9fYikKK3sKKyAgcmV0dXJuIChfX201MTJpKV9tbTUxMl9tYXNrX3hvcl9lcGk2NChfbW01MTJfc2V0emVyb19zaTUxMigpLCBfX2ssIF9fYSwgX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9hbmRfc2k1MTIoX19tNTEyaSBfX2EsIF9fbTUxMmkgX19iKQoreworICByZXR1cm4gKF9fbTUxMmkpKChfX3Y4ZHUpX19hICYgKF9fdjhkdSlfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX29yX3NpNTEyKF9fbTUxMmkgX19hLCBfX201MTJpIF9fYikKK3sKKyAgcmV0dXJuIChfX201MTJpKSgoX192OGR1KV9fYSB8IChfX3Y4ZHUpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl94b3Jfc2k1MTIoX19tNTEyaSBfX2EsIF9fbTUxMmkgX19iKQoreworICByZXR1cm4gKF9fbTUxMmkpKChfX3Y4ZHUpX19hIF4gKF9fdjhkdSlfX2IpOworfQorCisvKiBBcml0aG1ldGljICovCisKK3N0YXRpYyBfX2lubGluZSBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2FkZF9wZChfX201MTJkIF9fYSwgX19tNTEyZCBfX2IpCit7CisgIHJldHVybiAoX19tNTEyZCkoKF9fdjhkZilfX2EgKyAoX192OGRmKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfYWRkX3BzKF9fbTUxMiBfX2EsIF9fbTUxMiBfX2IpCit7CisgIHJldHVybiAoX19tNTEyKSgoX192MTZzZilfX2EgKyAoX192MTZzZilfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmUgX19tNTEyZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tdWxfcGQoX19tNTEyZCBfX2EsIF9fbTUxMmQgX19iKQoreworICByZXR1cm4gKF9fbTUxMmQpKChfX3Y4ZGYpX19hICogKF9fdjhkZilfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmUgX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX211bF9wcyhfX201MTIgX19hLCBfX201MTIgX19iKQoreworICByZXR1cm4gKF9fbTUxMikoKF9fdjE2c2YpX19hICogKF9fdjE2c2YpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTUxMmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfc3ViX3BkKF9fbTUxMmQgX19hLCBfX201MTJkIF9fYikKK3sKKyAgcmV0dXJuIChfX201MTJkKSgoX192OGRmKV9fYSAtIChfX3Y4ZGYpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTUxMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9zdWJfcHMoX19tNTEyIF9fYSwgX19tNTEyIF9fYikKK3sKKyAgcmV0dXJuIChfX201MTIpKChfX3YxNnNmKV9fYSAtIChfX3YxNnNmKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfYWRkX2VwaTY0IChfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgKChfX3Y4ZHUpIF9fQSArIChfX3Y4ZHUpIF9fQik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19hZGRfZXBpNjQgKF9fbTUxMmkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wYWRkcTUxMl9tYXNrICgoX192OGRpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjhkaSkgX19CLAorICAgICAgICAgICAgIChfX3Y4ZGkpIF9fVywKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfYWRkX2VwaTY0IChfX21tYXNrOCBfX1UsIF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wYWRkcTUxMl9tYXNrICgoX192OGRpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjhkaSkgX19CLAorICAgICAgICAgICAgIChfX3Y4ZGkpCisgICAgICAgICAgICAgX21tNTEyX3NldHplcm9fc2k1MTIgKCksCisgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX3N1Yl9lcGk2NCAoX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpICgoX192OGR1KSBfX0EgLSAoX192OGR1KSBfX0IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfc3ViX2VwaTY0IChfX201MTJpIF9fVywgX19tbWFzazggX19VLCBfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcHN1YnE1MTJfbWFzayAoKF9fdjhkaSkgX19BLAorICAgICAgICAgICAgIChfX3Y4ZGkpIF9fQiwKKyAgICAgICAgICAgICAoX192OGRpKSBfX1csCisgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X3N1Yl9lcGk2NCAoX19tbWFzazggX19VLCBfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcHN1YnE1MTJfbWFzayAoKF9fdjhkaSkgX19BLAorICAgICAgICAgICAgIChfX3Y4ZGkpIF9fQiwKKyAgICAgICAgICAgICAoX192OGRpKQorICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3NpNTEyICgpLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9hZGRfZXBpMzIgKF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSAoKF9fdjE2c3UpIF9fQSArIChfX3YxNnN1KSBfX0IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfYWRkX2VwaTMyIChfX201MTJpIF9fVywgX19tbWFzazE2IF9fVSwgX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BhZGRkNTEyX21hc2sgKChfX3YxNnNpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjE2c2kpIF9fQiwKKyAgICAgICAgICAgICAoX192MTZzaSkgX19XLAorICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfYWRkX2VwaTMyIChfX21tYXNrMTYgX19VLCBfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcGFkZGQ1MTJfbWFzayAoKF9fdjE2c2kpIF9fQSwKKyAgICAgICAgICAgICAoX192MTZzaSkgX19CLAorICAgICAgICAgICAgIChfX3YxNnNpKQorICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3NpNTEyICgpLAorICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfc3ViX2VwaTMyIChfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgKChfX3YxNnN1KSBfX0EgLSAoX192MTZzdSkgX19CKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX3N1Yl9lcGkzMiAoX19tNTEyaSBfX1csIF9fbW1hc2sxNiBfX1UsIF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wc3ViZDUxMl9tYXNrICgoX192MTZzaSkgX19BLAorICAgICAgICAgICAgIChfX3YxNnNpKSBfX0IsCisgICAgICAgICAgICAgKF9fdjE2c2kpIF9fVywKKyAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X3N1Yl9lcGkzMiAoX19tbWFzazE2IF9fVSwgX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BzdWJkNTEyX21hc2sgKChfX3YxNnNpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjE2c2kpIF9fQiwKKyAgICAgICAgICAgICAoX192MTZzaSkKKyAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19zaTUxMiAoKSwKKyAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX21heF9yb3VuZF9wZChXLCBVLCBBLCBCLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmQpX19idWlsdGluX2lhMzJfbWF4cGQ1MTJfbWFzaygoX192OGRmKShfX201MTJkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpKF9fbTUxMmQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikoX19tNTEyZCkoVyksIChfX21tYXNrOCkoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X21heF9yb3VuZF9wZChVLCBBLCBCLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmQpX19idWlsdGluX2lhMzJfbWF4cGQ1MTJfbWFzaygoX192OGRmKShfX201MTJkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpKF9fbTUxMmQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZilfbW01MTJfc2V0emVyb19wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXhfcm91bmRfcGQoQSwgQiwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJkKV9fYnVpbHRpbl9pYTMyX21heHBkNTEyX21hc2soKF9fdjhkZikoX19tNTEyZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKShfX201MTJkKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpX21tNTEyX3VuZGVmaW5lZF9wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xLCAoaW50KShSKSk7IH0pCisKK3N0YXRpYyAgX19pbmxpbmVfXyBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21heF9wZChfX201MTJkIF9fQSwgX19tNTEyZCBfX0IpCit7CisgIHJldHVybiAoX19tNTEyZCkgX19idWlsdGluX2lhMzJfbWF4cGQ1MTJfbWFzayAoKF9fdjhkZikgX19BLAorICAgICAgICAgICAgIChfX3Y4ZGYpIF9fQiwKKyAgICAgICAgICAgICAoX192OGRmKQorICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3BkICgpLAorICAgICAgICAgICAgIChfX21tYXNrOCkgLTEsCisgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX21heF9wZCAoX19tNTEyZCBfX1csIF9fbW1hc2s4IF9fVSwgX19tNTEyZCBfX0EsIF9fbTUxMmQgX19CKQoreworICByZXR1cm4gKF9fbTUxMmQpIF9fYnVpbHRpbl9pYTMyX21heHBkNTEyX21hc2sgKChfX3Y4ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpIF9fQiwKKyAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpIF9fVywKKyAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9tYXhfcGQgKF9fbW1hc2s4IF9fVSwgX19tNTEyZCBfX0EsIF9fbTUxMmQgX19CKQoreworICByZXR1cm4gKF9fbTUxMmQpIF9fYnVpbHRpbl9pYTMyX21heHBkNTEyX21hc2sgKChfX3Y4ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpIF9fQiwKKyAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpCisgICAgICAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19wZCAoKSwKKyAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworI2RlZmluZSBfbW01MTJfbWFza19tYXhfcm91bmRfcHMoVywgVSwgQSwgQiwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTIpX19idWlsdGluX2lhMzJfbWF4cHM1MTJfbWFzaygoX192MTZzZikoX19tNTEyKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpKF9fbTUxMikoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKShfX201MTIpKFcpLCAoX19tbWFzazE2KShVKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrel9tYXhfcm91bmRfcHMoVSwgQSwgQiwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTIpX19idWlsdGluX2lhMzJfbWF4cHM1MTJfbWFzaygoX192MTZzZikoX19tNTEyKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpKF9fbTUxMikoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKV9tbTUxMl9zZXR6ZXJvX3BzKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpKFUpLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21heF9yb3VuZF9wcyhBLCBCLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMilfX2J1aWx0aW5faWEzMl9tYXhwczUxMl9tYXNrKChfX3YxNnNmKShfX201MTIpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikoX19tNTEyKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpX21tNTEyX3VuZGVmaW5lZF9wcygpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KS0xLCAoaW50KShSKSk7IH0pCisKK3N0YXRpYyAgX19pbmxpbmVfXyBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWF4X3BzKF9fbTUxMiBfX0EsIF9fbTUxMiBfX0IpCit7CisgIHJldHVybiAoX19tNTEyKSBfX2J1aWx0aW5faWEzMl9tYXhwczUxMl9tYXNrICgoX192MTZzZikgX19BLAorICAgICAgICAgICAgKF9fdjE2c2YpIF9fQiwKKyAgICAgICAgICAgIChfX3YxNnNmKQorICAgICAgICAgICAgX21tNTEyX3NldHplcm9fcHMgKCksCisgICAgICAgICAgICAoX19tbWFzazE2KSAtMSwKKyAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX21heF9wcyAoX19tNTEyIF9fVywgX19tbWFzazE2IF9fVSwgX19tNTEyIF9fQSwgX19tNTEyIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTIpIF9fYnVpbHRpbl9pYTMyX21heHBzNTEyX21hc2sgKChfX3YxNnNmKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3YxNnNmKSBfX0IsCisgICAgICAgICAgICAgICAgIChfX3YxNnNmKSBfX1csCisgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSwKKyAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X21heF9wcyAoX19tbWFzazE2IF9fVSwgX19tNTEyIF9fQSwgX19tNTEyIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTIpIF9fYnVpbHRpbl9pYTMyX21heHBzNTEyX21hc2sgKChfX3YxNnNmKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3YxNnNmKSBfX0IsCisgICAgICAgICAgICAgICAgIChfX3YxNnNmKQorICAgICAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19wcyAoKSwKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VLAorICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19tYXhfc3MoX19tMTI4IF9fVywgX19tbWFzazggX19VLF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX21heHNzX3JvdW5kX21hc2sgKChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192NHNmKSBfX0IsCisgICAgICAgICAgICAgICAgKF9fdjRzZikgX19XLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9tYXhfc3MoX19tbWFzazggX19VLF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX21heHNzX3JvdW5kX21hc2sgKChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192NHNmKSBfX0IsCisgICAgICAgICAgICAgICAgKF9fdjRzZikgIF9tbV9zZXR6ZXJvX3BzICgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKKyNkZWZpbmUgX21tX21heF9yb3VuZF9zcyhBLCBCLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOClfX2J1aWx0aW5faWEzMl9tYXhzc19yb3VuZF9tYXNrKChfX3Y0c2YpKF9fbTEyOCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpKF9fbTEyOCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpX21tX3NldHplcm9fcHMoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2tfbWF4X3JvdW5kX3NzKFcsIFUsIEEsIEIsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX21heHNzX3JvdW5kX21hc2soKF9fdjRzZikoX19tMTI4KShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShXKSwgKF9fbW1hc2s4KShVKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrel9tYXhfcm91bmRfc3MoVSwgQSwgQiwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfbWF4c3Nfcm91bmRfbWFzaygoX192NHNmKShfX20xMjgpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKShfX20xMjgpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKV9tbV9zZXR6ZXJvX3BzKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIChpbnQpKFIpKTsgfSkKKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX21heF9zZChfX20xMjhkIF9fVywgX19tbWFzazggX19VLF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikgeworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX21heHNkX3JvdW5kX21hc2sgKChfX3YyZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192MmRmKSBfX0IsCisgICAgICAgICAgICAgICAgKF9fdjJkZikgX19XLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfbWF4X3NkKF9fbW1hc2s4IF9fVSxfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9tYXhzZF9yb3VuZF9tYXNrICgoX192MmRmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjJkZikgX19CLAorICAgICAgICAgICAgICAgIChfX3YyZGYpICBfbW1fc2V0emVyb19wZCAoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCisjZGVmaW5lIF9tbV9tYXhfcm91bmRfc2QoQSwgQiwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX21heHNkX3JvdW5kX21hc2soKF9fdjJkZikoX19tMTI4ZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpX21tX3NldHplcm9fcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrX21heF9yb3VuZF9zZChXLCBVLCBBLCBCLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGQpX19idWlsdGluX2lhMzJfbWF4c2Rfcm91bmRfbWFzaygoX192MmRmKShfX20xMjhkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fbTEyOGQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZikoX19tMTI4ZCkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2t6X21heF9yb3VuZF9zZChVLCBBLCBCLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGQpX19idWlsdGluX2lhMzJfbWF4c2Rfcm91bmRfbWFzaygoX192MmRmKShfX20xMjhkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fbTEyOGQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZilfbW1fc2V0emVyb19wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSwgKGludCkoUikpOyB9KQorCitzdGF0aWMgX19pbmxpbmUgX19tNTEyaQorX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWF4X2VwaTMyKF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbWF4c2Q1MTJfbWFzayAoKF9fdjE2c2kpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjE2c2kpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjE2c2kpCisgICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3NpNTEyICgpLAorICAgICAgICAgICAgICAoX19tbWFzazE2KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19tYXhfZXBpMzIgKF9fbTUxMmkgX19XLCBfX21tYXNrMTYgX19NLCBfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcG1heHNkNTEyX21hc2sgKChfX3YxNnNpKSBfX0EsCisgICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAoX192MTZzaSkgX19XLCBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X21heF9lcGkzMiAoX19tbWFzazE2IF9fTSwgX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BtYXhzZDUxMl9tYXNrICgoX192MTZzaSkgX19BLAorICAgICAgICAgICAgICAgICAgIChfX3YxNnNpKSBfX0IsCisgICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpCisgICAgICAgICAgICAgICAgICAgX21tNTEyX3NldHplcm9fc2k1MTIgKCksCisgICAgICAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWF4X2VwdTMyKF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbWF4dWQ1MTJfbWFzayAoKF9fdjE2c2kpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjE2c2kpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjE2c2kpCisgICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3NpNTEyICgpLAorICAgICAgICAgICAgICAoX19tbWFzazE2KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19tYXhfZXB1MzIgKF9fbTUxMmkgX19XLCBfX21tYXNrMTYgX19NLCBfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcG1heHVkNTEyX21hc2sgKChfX3YxNnNpKSBfX0EsCisgICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAoX192MTZzaSkgX19XLCBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X21heF9lcHUzMiAoX19tbWFzazE2IF9fTSwgX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BtYXh1ZDUxMl9tYXNrICgoX192MTZzaSkgX19BLAorICAgICAgICAgICAgICAgICAgIChfX3YxNnNpKSBfX0IsCisgICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpCisgICAgICAgICAgICAgICAgICAgX21tNTEyX3NldHplcm9fc2k1MTIgKCksCisgICAgICAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWF4X2VwaTY0KF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbWF4c3E1MTJfbWFzayAoKF9fdjhkaSkgX19BLAorICAgICAgICAgICAgICAoX192OGRpKSBfX0IsCisgICAgICAgICAgICAgIChfX3Y4ZGkpCisgICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3NpNTEyICgpLAorICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX21heF9lcGk2NCAoX19tNTEyaSBfX1csIF9fbW1hc2s4IF9fTSwgX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BtYXhzcTUxMl9tYXNrICgoX192OGRpKSBfX0EsCisgICAgICAgICAgICAgICAgICAgKF9fdjhkaSkgX19CLAorICAgICAgICAgICAgICAgICAgIChfX3Y4ZGkpIF9fVywgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9tYXhfZXBpNjQgKF9fbW1hc2s4IF9fTSwgX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BtYXhzcTUxMl9tYXNrICgoX192OGRpKSBfX0EsCisgICAgICAgICAgICAgICAgICAgKF9fdjhkaSkgX19CLAorICAgICAgICAgICAgICAgICAgIChfX3Y4ZGkpCisgICAgICAgICAgICAgICAgICAgX21tNTEyX3NldHplcm9fc2k1MTIgKCksCisgICAgICAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWF4X2VwdTY0KF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbWF4dXE1MTJfbWFzayAoKF9fdjhkaSkgX19BLAorICAgICAgICAgICAgICAoX192OGRpKSBfX0IsCisgICAgICAgICAgICAgIChfX3Y4ZGkpCisgICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3NpNTEyICgpLAorICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX21heF9lcHU2NCAoX19tNTEyaSBfX1csIF9fbW1hc2s4IF9fTSwgX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BtYXh1cTUxMl9tYXNrICgoX192OGRpKSBfX0EsCisgICAgICAgICAgICAgICAgICAgKF9fdjhkaSkgX19CLAorICAgICAgICAgICAgICAgICAgIChfX3Y4ZGkpIF9fVywgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9tYXhfZXB1NjQgKF9fbW1hc2s4IF9fTSwgX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BtYXh1cTUxMl9tYXNrICgoX192OGRpKSBfX0EsCisgICAgICAgICAgICAgICAgICAgKF9fdjhkaSkgX19CLAorICAgICAgICAgICAgICAgICAgIChfX3Y4ZGkpCisgICAgICAgICAgICAgICAgICAgX21tNTEyX3NldHplcm9fc2k1MTIgKCksCisgICAgICAgICAgICAgICAgICAgX19NKTsKK30KKworI2RlZmluZSBfbW01MTJfbWFza19taW5fcm91bmRfcGQoVywgVSwgQSwgQiwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJkKV9fYnVpbHRpbl9pYTMyX21pbnBkNTEyX21hc2soKF9fdjhkZikoX19tNTEyZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKShfX201MTJkKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpKF9fbTUxMmQpKFcpLCAoX19tbWFzazgpKFUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrel9taW5fcm91bmRfcGQoVSwgQSwgQiwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJkKV9fYnVpbHRpbl9pYTMyX21pbnBkNTEyX21hc2soKF9fdjhkZikoX19tNTEyZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKShfX201MTJkKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpX21tNTEyX3NldHplcm9fcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWluX3JvdW5kX3BkKEEsIEIsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyZClfX2J1aWx0aW5faWEzMl9taW5wZDUxMl9tYXNrKChfX3Y4ZGYpKF9fbTUxMmQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikoX19tNTEyZCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKV9tbTUxMl91bmRlZmluZWRfcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSwgKGludCkoUikpOyB9KQorCitzdGF0aWMgIF9faW5saW5lX18gX19tNTEyZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9taW5fcGQoX19tNTEyZCBfX0EsIF9fbTUxMmQgX19CKQoreworICByZXR1cm4gKF9fbTUxMmQpIF9fYnVpbHRpbl9pYTMyX21pbnBkNTEyX21hc2sgKChfX3Y4ZGYpIF9fQSwKKyAgICAgICAgICAgICAoX192OGRmKSBfX0IsCisgICAgICAgICAgICAgKF9fdjhkZikKKyAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19wZCAoKSwKKyAgICAgICAgICAgICAoX19tbWFzazgpIC0xLAorICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19taW5fcGQgKF9fbTUxMmQgX19XLCBfX21tYXNrOCBfX1UsIF9fbTUxMmQgX19BLCBfX201MTJkIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJkKSBfX2J1aWx0aW5faWEzMl9taW5wZDUxMl9tYXNrICgoX192OGRmKSBfX0EsCisgICAgICAgICAgICAgICAgICAoX192OGRmKSBfX0IsCisgICAgICAgICAgICAgICAgICAoX192OGRmKSBfX1csCisgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKKyNkZWZpbmUgX21tNTEyX21hc2tfbWluX3JvdW5kX3BzKFcsIFUsIEEsIEIsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyKV9fYnVpbHRpbl9pYTMyX21pbnBzNTEyX21hc2soKF9fdjE2c2YpKF9fbTUxMikoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKShfX201MTIpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikoX19tNTEyKShXKSwgKF9fbW1hc2sxNikoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza3pfbWluX3JvdW5kX3BzKFUsIEEsIEIsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyKV9fYnVpbHRpbl9pYTMyX21pbnBzNTEyX21hc2soKF9fdjE2c2YpKF9fbTUxMikoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKShfX201MTIpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZilfbW01MTJfc2V0emVyb19wcygpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KShVKSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9taW5fcm91bmRfcHMoQSwgQiwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTIpX19idWlsdGluX2lhMzJfbWlucHM1MTJfbWFzaygoX192MTZzZikoX19tNTEyKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpKF9fbTUxMikoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKV9tbTUxMl91bmRlZmluZWRfcHMoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNiktMSwgKGludCkoUikpOyB9KQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X21pbl9wZCAoX19tbWFzazggX19VLCBfX201MTJkIF9fQSwgX19tNTEyZCBfX0IpCit7CisgIHJldHVybiAoX19tNTEyZCkgX19idWlsdGluX2lhMzJfbWlucGQ1MTJfbWFzayAoKF9fdjhkZikgX19BLAorICAgICAgICAgICAgICAgICAgKF9fdjhkZikgX19CLAorICAgICAgICAgICAgICAgICAgKF9fdjhkZikKKyAgICAgICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3BkICgpLAorICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCitzdGF0aWMgIF9faW5saW5lX18gX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21pbl9wcyhfX201MTIgX19BLCBfX201MTIgX19CKQoreworICByZXR1cm4gKF9fbTUxMikgX19idWlsdGluX2lhMzJfbWlucHM1MTJfbWFzayAoKF9fdjE2c2YpIF9fQSwKKyAgICAgICAgICAgIChfX3YxNnNmKSBfX0IsCisgICAgICAgICAgICAoX192MTZzZikKKyAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3BzICgpLAorICAgICAgICAgICAgKF9fbW1hc2sxNikgLTEsCisgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19taW5fcHMgKF9fbTUxMiBfX1csIF9fbW1hc2sxNiBfX1UsIF9fbTUxMiBfX0EsIF9fbTUxMiBfX0IpCit7CisgIHJldHVybiAoX19tNTEyKSBfX2J1aWx0aW5faWEzMl9taW5wczUxMl9tYXNrICgoX192MTZzZikgX19BLAorICAgICAgICAgICAgICAgICAoX192MTZzZikgX19CLAorICAgICAgICAgICAgICAgICAoX192MTZzZikgX19XLAorICAgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UsCisgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9taW5fcHMgKF9fbW1hc2sxNiBfX1UsIF9fbTUxMiBfX0EsIF9fbTUxMiBfX0IpCit7CisgIHJldHVybiAoX19tNTEyKSBfX2J1aWx0aW5faWEzMl9taW5wczUxMl9tYXNrICgoX192MTZzZikgX19BLAorICAgICAgICAgICAgICAgICAoX192MTZzZikgX19CLAorICAgICAgICAgICAgICAgICAoX192MTZzZikKKyAgICAgICAgICAgICAgICAgX21tNTEyX3NldHplcm9fcHMgKCksCisgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSwKKyAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfbWluX3NzKF9fbTEyOCBfX1csIF9fbW1hc2s4IF9fVSxfX20xMjggX19BLCBfX20xMjggX19CKSB7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9taW5zc19yb3VuZF9tYXNrICgoX192NHNmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjRzZikgX19CLAorICAgICAgICAgICAgICAgIChfX3Y0c2YpIF9fVywKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfbWluX3NzKF9fbW1hc2s4IF9fVSxfX20xMjggX19BLCBfX20xMjggX19CKSB7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9taW5zc19yb3VuZF9tYXNrICgoX192NHNmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjRzZikgX19CLAorICAgICAgICAgICAgICAgIChfX3Y0c2YpICBfbW1fc2V0emVyb19wcyAoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCisjZGVmaW5lIF9tbV9taW5fcm91bmRfc3MoQSwgQiwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfbWluc3Nfcm91bmRfbWFzaygoX192NHNmKShfX20xMjgpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKShfX20xMjgpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKV9tbV9zZXR6ZXJvX3BzKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrX21pbl9yb3VuZF9zcyhXLCBVLCBBLCBCLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOClfX2J1aWx0aW5faWEzMl9taW5zc19yb3VuZF9tYXNrKChfX3Y0c2YpKF9fbTEyOCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpKF9fbTEyOCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpKF9fbTEyOCkoVyksIChfX21tYXNrOCkoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW1fbWFza3pfbWluX3JvdW5kX3NzKFUsIEEsIEIsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX21pbnNzX3JvdW5kX21hc2soKF9fdjRzZikoX19tMTI4KShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZilfbW1fc2V0emVyb19wcygpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShSKSk7IH0pCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19taW5fc2QoX19tMTI4ZCBfX1csIF9fbW1hc2s4IF9fVSxfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9taW5zZF9yb3VuZF9tYXNrICgoX192MmRmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjJkZikgX19CLAorICAgICAgICAgICAgICAgIChfX3YyZGYpIF9fVywKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X21pbl9zZChfX21tYXNrOCBfX1UsX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKSB7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfbWluc2Rfcm91bmRfbWFzayAoKF9fdjJkZikgX19BLAorICAgICAgICAgICAgICAgIChfX3YyZGYpIF9fQiwKKyAgICAgICAgICAgICAgICAoX192MmRmKSAgX21tX3NldHplcm9fcGQgKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworI2RlZmluZSBfbW1fbWluX3JvdW5kX3NkKEEsIEIsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9taW5zZF9yb3VuZF9tYXNrKChfX3YyZGYpKF9fbTEyOGQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZikoX19tMTI4ZCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKV9tbV9zZXR6ZXJvX3BkKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEsIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW1fbWFza19taW5fcm91bmRfc2QoVywgVSwgQSwgQiwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX21pbnNkX3JvdW5kX21hc2soKF9fdjJkZikoX19tMTI4ZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fbTEyOGQpKFcpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrel9taW5fcm91bmRfc2QoVSwgQSwgQiwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX21pbnNkX3JvdW5kX21hc2soKF9fdjJkZikoX19tMTI4ZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpX21tX3NldHplcm9fcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIChpbnQpKFIpKTsgfSkKKworc3RhdGljIF9faW5saW5lIF9fbTUxMmkKK19fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21pbl9lcGkzMihfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcG1pbnNkNTEyX21hc2sgKChfX3YxNnNpKSBfX0EsCisgICAgICAgICAgICAgIChfX3YxNnNpKSBfX0IsCisgICAgICAgICAgICAgIChfX3YxNnNpKQorICAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19zaTUxMiAoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2sxNikgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfbWluX2VwaTMyIChfX201MTJpIF9fVywgX19tbWFzazE2IF9fTSwgX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BtaW5zZDUxMl9tYXNrICgoX192MTZzaSkgX19BLAorICAgICAgICAgICAgICAgICAgIChfX3YxNnNpKSBfX0IsCisgICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpIF9fVywgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9taW5fZXBpMzIgKF9fbW1hc2sxNiBfX00sIF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbWluc2Q1MTJfbWFzayAoKF9fdjE2c2kpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAoX192MTZzaSkgX19CLAorICAgICAgICAgICAgICAgICAgIChfX3YxNnNpKQorICAgICAgICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3NpNTEyICgpLAorICAgICAgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21pbl9lcHUzMihfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcG1pbnVkNTEyX21hc2sgKChfX3YxNnNpKSBfX0EsCisgICAgICAgICAgICAgIChfX3YxNnNpKSBfX0IsCisgICAgICAgICAgICAgIChfX3YxNnNpKQorICAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19zaTUxMiAoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2sxNikgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfbWluX2VwdTMyIChfX201MTJpIF9fVywgX19tbWFzazE2IF9fTSwgX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BtaW51ZDUxMl9tYXNrICgoX192MTZzaSkgX19BLAorICAgICAgICAgICAgICAgICAgIChfX3YxNnNpKSBfX0IsCisgICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpIF9fVywgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9taW5fZXB1MzIgKF9fbW1hc2sxNiBfX00sIF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbWludWQ1MTJfbWFzayAoKF9fdjE2c2kpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAoX192MTZzaSkgX19CLAorICAgICAgICAgICAgICAgICAgIChfX3YxNnNpKQorICAgICAgICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3NpNTEyICgpLAorICAgICAgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21pbl9lcGk2NChfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcG1pbnNxNTEyX21hc2sgKChfX3Y4ZGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjhkaSkgX19CLAorICAgICAgICAgICAgICAoX192OGRpKQorICAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19zaTUxMiAoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19taW5fZXBpNjQgKF9fbTUxMmkgX19XLCBfX21tYXNrOCBfX00sIF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbWluc3E1MTJfbWFzayAoKF9fdjhkaSkgX19BLAorICAgICAgICAgICAgICAgICAgIChfX3Y4ZGkpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAoX192OGRpKSBfX1csIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfbWluX2VwaTY0IChfX21tYXNrOCBfX00sIF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbWluc3E1MTJfbWFzayAoKF9fdjhkaSkgX19BLAorICAgICAgICAgICAgICAgICAgIChfX3Y4ZGkpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAoX192OGRpKQorICAgICAgICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3NpNTEyICgpLAorICAgICAgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21pbl9lcHU2NChfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcG1pbnVxNTEyX21hc2sgKChfX3Y4ZGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjhkaSkgX19CLAorICAgICAgICAgICAgICAoX192OGRpKQorICAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19zaTUxMiAoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19taW5fZXB1NjQgKF9fbTUxMmkgX19XLCBfX21tYXNrOCBfX00sIF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbWludXE1MTJfbWFzayAoKF9fdjhkaSkgX19BLAorICAgICAgICAgICAgICAgICAgIChfX3Y4ZGkpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAoX192OGRpKSBfX1csIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfbWluX2VwdTY0IChfX21tYXNrOCBfX00sIF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbWludXE1MTJfbWFzayAoKF9fdjhkaSkgX19BLAorICAgICAgICAgICAgICAgICAgIChfX3Y4ZGkpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAoX192OGRpKQorICAgICAgICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3NpNTEyICgpLAorICAgICAgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX211bF9lcGkzMihfX201MTJpIF9fWCwgX19tNTEyaSBfX1kpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcG11bGRxNTEyX21hc2sgKChfX3YxNnNpKSBfX1gsCisgICAgICAgICAgICAgIChfX3YxNnNpKSBfX1ksCisgICAgICAgICAgICAgIChfX3Y4ZGkpCisgICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3NpNTEyICgpLAorICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19tdWxfZXBpMzIgKF9fbTUxMmkgX19XLCBfX21tYXNrOCBfX00sIF9fbTUxMmkgX19YLCBfX201MTJpIF9fWSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbXVsZHE1MTJfbWFzayAoKF9fdjE2c2kpIF9fWCwKKyAgICAgICAgICAgICAgKF9fdjE2c2kpIF9fWSwKKyAgICAgICAgICAgICAgKF9fdjhkaSkgX19XLCBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmUgX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9tdWxfZXBpMzIgKF9fbW1hc2s4IF9fTSwgX19tNTEyaSBfX1gsIF9fbTUxMmkgX19ZKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BtdWxkcTUxMl9tYXNrICgoX192MTZzaSkgX19YLAorICAgICAgICAgICAgICAoX192MTZzaSkgX19ZLAorICAgICAgICAgICAgICAoX192OGRpKQorICAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19zaTUxMiAoKSwKKyAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbXVsX2VwdTMyKF9fbTUxMmkgX19YLCBfX201MTJpIF9fWSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbXVsdWRxNTEyX21hc2sgKChfX3YxNnNpKSBfX1gsCisgICAgICAgICAgICAgICAoX192MTZzaSkgX19ZLAorICAgICAgICAgICAgICAgKF9fdjhkaSkKKyAgICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3NpNTEyICgpLAorICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfbXVsX2VwdTMyIChfX201MTJpIF9fVywgX19tbWFzazggX19NLCBfX201MTJpIF9fWCwgX19tNTEyaSBfX1kpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcG11bHVkcTUxMl9tYXNrICgoX192MTZzaSkgX19YLAorICAgICAgICAgICAgICAgKF9fdjE2c2kpIF9fWSwKKyAgICAgICAgICAgICAgIChfX3Y4ZGkpIF9fVywgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfbXVsX2VwdTMyIChfX21tYXNrOCBfX00sIF9fbTUxMmkgX19YLCBfX201MTJpIF9fWSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbXVsdWRxNTEyX21hc2sgKChfX3YxNnNpKSBfX1gsCisgICAgICAgICAgICAgICAoX192MTZzaSkgX19ZLAorICAgICAgICAgICAgICAgKF9fdjhkaSkKKyAgICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3NpNTEyICgpLAorICAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbXVsbG9fZXBpMzIgKF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSAoKF9fdjE2c3UpIF9fQSAqIChfX3YxNnN1KSBfX0IpOworfQorCitzdGF0aWMgX19pbmxpbmUgX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9tdWxsb19lcGkzMiAoX19tbWFzazE2IF9fTSwgX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BtdWxsZDUxMl9tYXNrICgoX192MTZzaSkgX19BLAorICAgICAgICAgICAgICAoX192MTZzaSkgX19CLAorICAgICAgICAgICAgICAoX192MTZzaSkKKyAgICAgICAgICAgICAgX21tNTEyX3NldHplcm9fc2k1MTIgKCksCisgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfbXVsbG9fZXBpMzIgKF9fbTUxMmkgX19XLCBfX21tYXNrMTYgX19NLCBfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcG11bGxkNTEyX21hc2sgKChfX3YxNnNpKSBfX0EsCisgICAgICAgICAgICAgIChfX3YxNnNpKSBfX0IsCisgICAgICAgICAgICAgIChfX3YxNnNpKSBfX1csIF9fTSk7Cit9CisKKyNkZWZpbmUgX21tNTEyX21hc2tfc3FydF9yb3VuZF9wZChXLCBVLCBBLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmQpX19idWlsdGluX2lhMzJfc3FydHBkNTEyX21hc2soKF9fdjhkZikoX19tNTEyZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikoX19tNTEyZCkoVyksIChfX21tYXNrOCkoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrel9zcXJ0X3JvdW5kX3BkKFUsIEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyZClfX2J1aWx0aW5faWEzMl9zcXJ0cGQ1MTJfbWFzaygoX192OGRmKShfX201MTJkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKV9tbTUxMl9zZXR6ZXJvX3BkKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9zcXJ0X3JvdW5kX3BkKEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyZClfX2J1aWx0aW5faWEzMl9zcXJ0cGQ1MTJfbWFzaygoX192OGRmKShfX201MTJkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKV9tbTUxMl91bmRlZmluZWRfcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEsIChpbnQpKFIpKTsgfSkKKworc3RhdGljICBfX2lubGluZV9fIF9fbTUxMmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfc3FydF9wZChfX201MTJkIF9fYSkKK3sKKyAgcmV0dXJuIChfX201MTJkKV9fYnVpbHRpbl9pYTMyX3NxcnRwZDUxMl9tYXNrKChfX3Y4ZGYpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikgX21tNTEyX3NldHplcm9fcGQgKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX3NxcnRfcGQgKF9fbTUxMmQgX19XLCBfX21tYXNrOCBfX1UsIF9fbTUxMmQgX19BKQoreworICByZXR1cm4gKF9fbTUxMmQpIF9fYnVpbHRpbl9pYTMyX3NxcnRwZDUxMl9tYXNrICgoX192OGRmKSBfX0EsCisgICAgICAgICAgICAgICAgICAgKF9fdjhkZikgX19XLAorICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfc3FydF9wZCAoX19tbWFzazggX19VLCBfX201MTJkIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJkKSBfX2J1aWx0aW5faWEzMl9zcXJ0cGQ1MTJfbWFzayAoKF9fdjhkZikgX19BLAorICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpCisgICAgICAgICAgICAgICAgICAgX21tNTEyX3NldHplcm9fcGQgKCksCisgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworI2RlZmluZSBfbW01MTJfbWFza19zcXJ0X3JvdW5kX3BzKFcsIFUsIEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyKV9fYnVpbHRpbl9pYTMyX3NxcnRwczUxMl9tYXNrKChfX3YxNnNmKShfX201MTIpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpKF9fbTUxMikoVyksIChfX21tYXNrMTYpKFUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrel9zcXJ0X3JvdW5kX3BzKFUsIEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyKV9fYnVpbHRpbl9pYTMyX3NxcnRwczUxMl9tYXNrKChfX3YxNnNmKShfX201MTIpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpX21tNTEyX3NldHplcm9fcHMoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpKFUpLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX3NxcnRfcm91bmRfcHMoQSwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTIpX19idWlsdGluX2lhMzJfc3FydHBzNTEyX21hc2soKF9fdjE2c2YpKF9fbTUxMikoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZilfbW01MTJfdW5kZWZpbmVkX3BzKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KS0xLCAoaW50KShSKSk7IH0pCisKK3N0YXRpYyAgX19pbmxpbmVfXyBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfc3FydF9wcyhfX201MTIgX19hKQoreworICByZXR1cm4gKF9fbTUxMilfX2J1aWx0aW5faWEzMl9zcXJ0cHM1MTJfbWFzaygoX192MTZzZilfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKSBfbW01MTJfc2V0emVyb19wcyAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyAgX19pbmxpbmVfXyBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19zcXJ0X3BzKF9fbTUxMiBfX1csIF9fbW1hc2sxNiBfX1UsIF9fbTUxMiBfX0EpCit7CisgIHJldHVybiAoX19tNTEyKV9fYnVpbHRpbl9pYTMyX3NxcnRwczUxMl9tYXNrKChfX3YxNnNmKV9fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpIF9fVywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCitzdGF0aWMgIF9faW5saW5lX18gX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X3NxcnRfcHMoIF9fbW1hc2sxNiBfX1UsIF9fbTUxMiBfX0EpCit7CisgIHJldHVybiAoX19tNTEyKV9fYnVpbHRpbl9pYTMyX3NxcnRwczUxMl9tYXNrKChfX3YxNnNmKV9fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpIF9tbTUxMl9zZXR6ZXJvX3BzICgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyAgX19pbmxpbmVfXyBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX3JzcXJ0MTRfcGQoX19tNTEyZCBfX0EpCit7CisgIHJldHVybiAoX19tNTEyZCkgX19idWlsdGluX2lhMzJfcnNxcnQxNHBkNTEyX21hc2sgKChfX3Y4ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjhkZikKKyAgICAgICAgICAgICAgICAgX21tNTEyX3NldHplcm9fcGQgKCksCisgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpO30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX3JzcXJ0MTRfcGQgKF9fbTUxMmQgX19XLCBfX21tYXNrOCBfX1UsIF9fbTUxMmQgX19BKQoreworICByZXR1cm4gKF9fbTUxMmQpIF9fYnVpbHRpbl9pYTMyX3JzcXJ0MTRwZDUxMl9tYXNrICgoX192OGRmKSBfX0EsCisgICAgICAgICAgICAgICAgICAoX192OGRmKSBfX1csCisgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfcnNxcnQxNF9wZCAoX19tbWFzazggX19VLCBfX201MTJkIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJkKSBfX2J1aWx0aW5faWEzMl9yc3FydDE0cGQ1MTJfbWFzayAoKF9fdjhkZikgX19BLAorICAgICAgICAgICAgICAgICAgKF9fdjhkZikKKyAgICAgICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3BkICgpLAorICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgIF9faW5saW5lX18gX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX3JzcXJ0MTRfcHMoX19tNTEyIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTIpIF9fYnVpbHRpbl9pYTMyX3JzcXJ0MTRwczUxMl9tYXNrICgoX192MTZzZikgX19BLAorICAgICAgICAgICAgICAgIChfX3YxNnNmKQorICAgICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3BzICgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrMTYpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfcnNxcnQxNF9wcyAoX19tNTEyIF9fVywgX19tbWFzazE2IF9fVSwgX19tNTEyIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTIpIF9fYnVpbHRpbl9pYTMyX3JzcXJ0MTRwczUxMl9tYXNrICgoX192MTZzZikgX19BLAorICAgICAgICAgICAgICAgICAoX192MTZzZikgX19XLAorICAgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfcnNxcnQxNF9wcyAoX19tbWFzazE2IF9fVSwgX19tNTEyIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTIpIF9fYnVpbHRpbl9pYTMyX3JzcXJ0MTRwczUxMl9tYXNrICgoX192MTZzZikgX19BLAorICAgICAgICAgICAgICAgICAoX192MTZzZikKKyAgICAgICAgICAgICAgICAgX21tNTEyX3NldHplcm9fcHMgKCksCisgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyAgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fcnNxcnQxNF9zcyhfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfcnNxcnQxNHNzX21hc2sgKChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAgICAoX192NHNmKSBfX0IsCisgICAgICAgICAgICAgKF9fdjRzZikKKyAgICAgICAgICAgICBfbW1fc2V0emVyb19wcyAoKSwKKyAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfcnNxcnQxNF9zcyAoX19tMTI4IF9fVywgX19tbWFzazggX19VLCBfX20xMjggX19BLCBfX20xMjggX19CKQoreworIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9yc3FydDE0c3NfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgIChfX3Y0c2YpIF9fQiwKKyAgICAgICAgICAoX192NHNmKSBfX1csCisgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfcnNxcnQxNF9zcyAoX19tbWFzazggX19VLCBfX20xMjggX19BLCBfX20xMjggX19CKQoreworIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9yc3FydDE0c3NfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgIChfX3Y0c2YpIF9fQiwKKyAgICAgICAgICAoX192NHNmKSBfbW1fc2V0emVyb19wcyAoKSwKKyAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyAgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3JzcXJ0MTRfc2QoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3JzcXJ0MTRzZF9tYXNrICgoX192MmRmKSBfX0EsCisgICAgICAgICAgICAgIChfX3YyZGYpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjJkZikKKyAgICAgICAgICAgICAgX21tX3NldHplcm9fcGQgKCksCisgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfcnNxcnQxNF9zZCAoX19tMTI4ZCBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfcnNxcnQxNHNkX21hc2sgKCAoX192MmRmKSBfX0EsCisgICAgICAgICAgKF9fdjJkZikgX19CLAorICAgICAgICAgIChfX3YyZGYpIF9fVywKKyAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfcnNxcnQxNF9zZCAoX19tbWFzazggX19VLCBfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9yc3FydDE0c2RfbWFzayAoIChfX3YyZGYpIF9fQSwKKyAgICAgICAgICAoX192MmRmKSBfX0IsCisgICAgICAgICAgKF9fdjJkZikgX21tX3NldHplcm9fcGQgKCksCisgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgIF9faW5saW5lX18gX19tNTEyZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9yY3AxNF9wZChfX201MTJkIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJkKSBfX2J1aWx0aW5faWEzMl9yY3AxNHBkNTEyX21hc2sgKChfX3Y4ZGYpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3Y4ZGYpCisgICAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19wZCAoKSwKKyAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfcmNwMTRfcGQgKF9fbTUxMmQgX19XLCBfX21tYXNrOCBfX1UsIF9fbTUxMmQgX19BKQoreworICByZXR1cm4gKF9fbTUxMmQpIF9fYnVpbHRpbl9pYTMyX3JjcDE0cGQ1MTJfbWFzayAoKF9fdjhkZikgX19BLAorICAgICAgICAgICAgICAgIChfX3Y4ZGYpIF9fVywKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfcmNwMTRfcGQgKF9fbW1hc2s4IF9fVSwgX19tNTEyZCBfX0EpCit7CisgIHJldHVybiAoX19tNTEyZCkgX19idWlsdGluX2lhMzJfcmNwMTRwZDUxMl9tYXNrICgoX192OGRmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjhkZikKKyAgICAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19wZCAoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyAgX19pbmxpbmVfXyBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfcmNwMTRfcHMoX19tNTEyIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTIpIF9fYnVpbHRpbl9pYTMyX3JjcDE0cHM1MTJfbWFzayAoKF9fdjE2c2YpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjE2c2YpCisgICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3BzICgpLAorICAgICAgICAgICAgICAoX19tbWFzazE2KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX3JjcDE0X3BzIChfX201MTIgX19XLCBfX21tYXNrMTYgX19VLCBfX201MTIgX19BKQoreworICByZXR1cm4gKF9fbTUxMikgX19idWlsdGluX2lhMzJfcmNwMTRwczUxMl9tYXNrICgoX192MTZzZikgX19BLAorICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKSBfX1csCisgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X3JjcDE0X3BzIChfX21tYXNrMTYgX19VLCBfX201MTIgX19BKQoreworICByZXR1cm4gKF9fbTUxMikgX19idWlsdGluX2lhMzJfcmNwMTRwczUxMl9tYXNrICgoX192MTZzZikgX19BLAorICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKQorICAgICAgICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3BzICgpLAorICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyAgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fcmNwMTRfc3MoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3JjcDE0c3NfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgICAoX192NHNmKSBfX0IsCisgICAgICAgICAgICAgICAgIChfX3Y0c2YpCisgICAgICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3BzICgpLAorICAgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfcmNwMTRfc3MgKF9fbTEyOCBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfcmNwMTRzc19tYXNrICgoX192NHNmKSBfX0EsCisgICAgICAgICAgKF9fdjRzZikgX19CLAorICAgICAgICAgIChfX3Y0c2YpIF9fVywKKyAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9yY3AxNF9zcyAoX19tbWFzazggX19VLCBfX20xMjggX19BLCBfX20xMjggX19CKQoreworIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9yY3AxNHNzX21hc2sgKChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAoX192NHNmKSBfX0IsCisgICAgICAgICAgKF9fdjRzZikgX21tX3NldHplcm9fcHMgKCksCisgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9yY3AxNF9zZChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfcmNwMTRzZF9tYXNrICgoX192MmRmKSBfX0EsCisgICAgICAgICAgICAoX192MmRmKSBfX0IsCisgICAgICAgICAgICAoX192MmRmKQorICAgICAgICAgICAgX21tX3NldHplcm9fcGQgKCksCisgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX3JjcDE0X3NkIChfX20xMjhkIF9fVywgX19tbWFzazggX19VLCBfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9yY3AxNHNkX21hc2sgKCAoX192MmRmKSBfX0EsCisgICAgICAgICAgKF9fdjJkZikgX19CLAorICAgICAgICAgIChfX3YyZGYpIF9fVywKKyAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfcmNwMTRfc2QgKF9fbW1hc2s4IF9fVSwgX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfcmNwMTRzZF9tYXNrICggKF9fdjJkZikgX19BLAorICAgICAgICAgIChfX3YyZGYpIF9fQiwKKyAgICAgICAgICAoX192MmRmKSBfbW1fc2V0emVyb19wZCAoKSwKKyAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfZmxvb3JfcHMoX19tNTEyIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTIpIF9fYnVpbHRpbl9pYTMyX3JuZHNjYWxlcHNfbWFzayAoKF9fdjE2c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9GTE9PUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpIF9fQSwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2Zsb29yX3BzIChfX201MTIgX19XLCBfX21tYXNrMTYgX19VLCBfX201MTIgX19BKQoreworICByZXR1cm4gKF9fbTUxMikgX19idWlsdGluX2lhMzJfcm5kc2NhbGVwc19tYXNrICgoX192MTZzZikgX19BLAorICAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfRkxPT1IsCisgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpIF9fVywgX19VLAorICAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2Zsb29yX3BkKF9fbTUxMmQgX19BKQoreworICByZXR1cm4gKF9fbTUxMmQpIF9fYnVpbHRpbl9pYTMyX3JuZHNjYWxlcGRfbWFzayAoKF9fdjhkZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9GTE9PUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpIF9fQSwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfZmxvb3JfcGQgKF9fbTUxMmQgX19XLCBfX21tYXNrOCBfX1UsIF9fbTUxMmQgX19BKQoreworICByZXR1cm4gKF9fbTUxMmQpIF9fYnVpbHRpbl9pYTMyX3JuZHNjYWxlcGRfbWFzayAoKF9fdjhkZikgX19BLAorICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfRkxPT1IsCisgICAgICAgICAgICAgICAgKF9fdjhkZikgX19XLCBfX1UsCisgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfY2VpbF9wcyAoX19tNTEyIF9fVywgX19tbWFzazE2IF9fVSwgX19tNTEyIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTIpIF9fYnVpbHRpbl9pYTMyX3JuZHNjYWxlcHNfbWFzayAoKF9fdjE2c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NFSUwsCisgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpIF9fVywgX19VLAorICAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfY2VpbF9wcyhfX201MTIgX19BKQoreworICByZXR1cm4gKF9fbTUxMikgX19idWlsdGluX2lhMzJfcm5kc2NhbGVwc19tYXNrICgoX192MTZzZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NFSUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKSBfX0EsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCitzdGF0aWMgX19pbmxpbmUgX19tNTEyZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9jZWlsX3BkKF9fbTUxMmQgX19BKQoreworICByZXR1cm4gKF9fbTUxMmQpIF9fYnVpbHRpbl9pYTMyX3JuZHNjYWxlcGRfbWFzayAoKF9fdjhkZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DRUlMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikgX19BLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19jZWlsX3BkIChfX201MTJkIF9fVywgX19tbWFzazggX19VLCBfX201MTJkIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJkKSBfX2J1aWx0aW5faWEzMl9ybmRzY2FsZXBkX21hc2sgKChfX3Y4ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NFSUwsCisgICAgICAgICAgICAgICAgKF9fdjhkZikgX19XLCBfX1UsCisgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfYWJzX2VwaTY0KF9fbTUxMmkgX19BKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BhYnNxNTEyX21hc2sgKChfX3Y4ZGkpIF9fQSwKKyAgICAgICAgICAgICAoX192OGRpKQorICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3NpNTEyICgpLAorICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfYWJzX2VwaTY0IChfX201MTJpIF9fVywgX19tbWFzazggX19VLCBfX201MTJpIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wYWJzcTUxMl9tYXNrICgoX192OGRpKSBfX0EsCisgICAgICAgICAgICAgICAgICAoX192OGRpKSBfX1csCisgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfYWJzX2VwaTY0IChfX21tYXNrOCBfX1UsIF9fbTUxMmkgX19BKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BhYnNxNTEyX21hc2sgKChfX3Y4ZGkpIF9fQSwKKyAgICAgICAgICAgICAgICAgIChfX3Y4ZGkpCisgICAgICAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19zaTUxMiAoKSwKKyAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfYWJzX2VwaTMyKF9fbTUxMmkgX19BKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BhYnNkNTEyX21hc2sgKChfX3YxNnNpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjE2c2kpCisgICAgICAgICAgICAgX21tNTEyX3NldHplcm9fc2k1MTIgKCksCisgICAgICAgICAgICAgKF9fbW1hc2sxNikgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfYWJzX2VwaTMyIChfX201MTJpIF9fVywgX19tbWFzazE2IF9fVSwgX19tNTEyaSBfX0EpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcGFic2Q1MTJfbWFzayAoKF9fdjE2c2kpIF9fQSwKKyAgICAgICAgICAgICAgICAgIChfX3YxNnNpKSBfX1csCisgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X2Fic19lcGkzMiAoX19tbWFzazE2IF9fVSwgX19tNTEyaSBfX0EpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcGFic2Q1MTJfbWFzayAoKF9fdjE2c2kpIF9fQSwKKyAgICAgICAgICAgICAgICAgIChfX3YxNnNpKQorICAgICAgICAgICAgICAgICAgX21tNTEyX3NldHplcm9fc2k1MTIgKCksCisgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19hZGRfc3MoX19tMTI4IF9fVywgX19tbWFzazggX19VLF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2FkZHNzX3JvdW5kX21hc2sgKChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192NHNmKSBfX0IsCisgICAgICAgICAgICAgICAgKF9fdjRzZikgX19XLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9hZGRfc3MoX19tbWFzazggX19VLF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2FkZHNzX3JvdW5kX21hc2sgKChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192NHNmKSBfX0IsCisgICAgICAgICAgICAgICAgKF9fdjRzZikgIF9tbV9zZXR6ZXJvX3BzICgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKKyNkZWZpbmUgX21tX2FkZF9yb3VuZF9zcyhBLCBCLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOClfX2J1aWx0aW5faWEzMl9hZGRzc19yb3VuZF9tYXNrKChfX3Y0c2YpKF9fbTEyOCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpKF9fbTEyOCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpX21tX3NldHplcm9fcHMoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2tfYWRkX3JvdW5kX3NzKFcsIFUsIEEsIEIsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX2FkZHNzX3JvdW5kX21hc2soKF9fdjRzZikoX19tMTI4KShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShXKSwgKF9fbW1hc2s4KShVKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrel9hZGRfcm91bmRfc3MoVSwgQSwgQiwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfYWRkc3Nfcm91bmRfbWFzaygoX192NHNmKShfX20xMjgpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKShfX20xMjgpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKV9tbV9zZXR6ZXJvX3BzKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIChpbnQpKFIpKTsgfSkKKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2FkZF9zZChfX20xMjhkIF9fVywgX19tbWFzazggX19VLF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikgeworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX2FkZHNkX3JvdW5kX21hc2sgKChfX3YyZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192MmRmKSBfX0IsCisgICAgICAgICAgICAgICAgKF9fdjJkZikgX19XLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfYWRkX3NkKF9fbW1hc2s4IF9fVSxfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9hZGRzZF9yb3VuZF9tYXNrICgoX192MmRmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjJkZikgX19CLAorICAgICAgICAgICAgICAgIChfX3YyZGYpICBfbW1fc2V0emVyb19wZCAoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorI2RlZmluZSBfbW1fYWRkX3JvdW5kX3NkKEEsIEIsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9hZGRzZF9yb3VuZF9tYXNrKChfX3YyZGYpKF9fbTEyOGQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZikoX19tMTI4ZCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKV9tbV9zZXR6ZXJvX3BkKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEsIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW1fbWFza19hZGRfcm91bmRfc2QoVywgVSwgQSwgQiwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2FkZHNkX3JvdW5kX21hc2soKF9fdjJkZikoX19tMTI4ZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fbTEyOGQpKFcpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrel9hZGRfcm91bmRfc2QoVSwgQSwgQiwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2FkZHNkX3JvdW5kX21hc2soKF9fdjJkZikoX19tMTI4ZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpX21tX3NldHplcm9fcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIChpbnQpKFIpKTsgfSkKKworc3RhdGljIF9faW5saW5lX18gX19tNTEyZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2FkZF9wZChfX201MTJkIF9fVywgX19tbWFzazggX19VLCBfX201MTJkIF9fQSwgX19tNTEyZCBfX0IpIHsKKyAgcmV0dXJuIChfX201MTJkKSBfX2J1aWx0aW5faWEzMl9hZGRwZDUxMl9tYXNrICgoX192OGRmKSBfX0EsCisgICAgICAgICAgICAgKF9fdjhkZikgX19CLAorICAgICAgICAgICAgIChfX3Y4ZGYpIF9fVywKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X2FkZF9wZChfX21tYXNrOCBfX1UsIF9fbTUxMmQgX19BLCBfX201MTJkIF9fQikgeworICByZXR1cm4gKF9fbTUxMmQpIF9fYnVpbHRpbl9pYTMyX2FkZHBkNTEyX21hc2sgKChfX3Y4ZGYpIF9fQSwKKyAgICAgICAgICAgICAoX192OGRmKSBfX0IsCisgICAgICAgICAgICAgKF9fdjhkZikgX21tNTEyX3NldHplcm9fcGQgKCksCisgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfYWRkX3BzKF9fbTUxMiBfX1csIF9fbW1hc2sxNiBfX1UsIF9fbTUxMiBfX0EsIF9fbTUxMiBfX0IpIHsKKyAgcmV0dXJuIChfX201MTIpIF9fYnVpbHRpbl9pYTMyX2FkZHBzNTEyX21hc2sgKChfX3YxNnNmKSBfX0EsCisgICAgICAgICAgICAoX192MTZzZikgX19CLAorICAgICAgICAgICAgKF9fdjE2c2YpIF9fVywKKyAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSwKKyAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9hZGRfcHMoX19tbWFzazE2IF9fVSwgX19tNTEyIF9fQSwgX19tNTEyIF9fQikgeworICByZXR1cm4gKF9fbTUxMikgX19idWlsdGluX2lhMzJfYWRkcHM1MTJfbWFzayAoKF9fdjE2c2YpIF9fQSwKKyAgICAgICAgICAgIChfX3YxNnNmKSBfX0IsCisgICAgICAgICAgICAoX192MTZzZikgX21tNTEyX3NldHplcm9fcHMgKCksCisgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UsCisgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCisjZGVmaW5lIF9tbTUxMl9hZGRfcm91bmRfcGQoQSwgQiwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJkKV9fYnVpbHRpbl9pYTMyX2FkZHBkNTEyX21hc2soKF9fdjhkZikoX19tNTEyZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKShfX201MTJkKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpX21tNTEyX3NldHplcm9fcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX2FkZF9yb3VuZF9wZChXLCBVLCBBLCBCLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmQpX19idWlsdGluX2lhMzJfYWRkcGQ1MTJfbWFzaygoX192OGRmKShfX201MTJkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpKF9fbTUxMmQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikoX19tNTEyZCkoVyksIChfX21tYXNrOCkoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X2FkZF9yb3VuZF9wZChVLCBBLCBCLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmQpX19idWlsdGluX2lhMzJfYWRkcGQ1MTJfbWFzaygoX192OGRmKShfX201MTJkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpKF9fbTUxMmQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZilfbW01MTJfc2V0emVyb19wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9hZGRfcm91bmRfcHMoQSwgQiwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTIpX19idWlsdGluX2lhMzJfYWRkcHM1MTJfbWFzaygoX192MTZzZikoX19tNTEyKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpKF9fbTUxMikoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKV9tbTUxMl9zZXR6ZXJvX3BzKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpLTEsIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza19hZGRfcm91bmRfcHMoVywgVSwgQSwgQiwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTIpX19idWlsdGluX2lhMzJfYWRkcHM1MTJfbWFzaygoX192MTZzZikoX19tNTEyKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpKF9fbTUxMikoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKShfX201MTIpKFcpLCAoX19tbWFzazE2KShVKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrel9hZGRfcm91bmRfcHMoVSwgQSwgQiwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTIpX19idWlsdGluX2lhMzJfYWRkcHM1MTJfbWFzaygoX192MTZzZikoX19tNTEyKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpKF9fbTUxMikoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKV9tbTUxMl9zZXR6ZXJvX3BzKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpKFUpLCAoaW50KShSKSk7IH0pCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX3N1Yl9zcyhfX20xMjggX19XLCBfX21tYXNrOCBfX1UsX19tMTI4IF9fQSwgX19tMTI4IF9fQikgeworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfc3Vic3Nfcm91bmRfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgIChfX3Y0c2YpIF9fQiwKKyAgICAgICAgICAgICAgICAoX192NHNmKSBfX1csCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X3N1Yl9zcyhfX21tYXNrOCBfX1UsX19tMTI4IF9fQSwgX19tMTI4IF9fQikgeworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfc3Vic3Nfcm91bmRfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgIChfX3Y0c2YpIF9fQiwKKyAgICAgICAgICAgICAgICAoX192NHNmKSAgX21tX3NldHplcm9fcHMgKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKyNkZWZpbmUgX21tX3N1Yl9yb3VuZF9zcyhBLCBCLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOClfX2J1aWx0aW5faWEzMl9zdWJzc19yb3VuZF9tYXNrKChfX3Y0c2YpKF9fbTEyOCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpKF9fbTEyOCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpX21tX3NldHplcm9fcHMoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2tfc3ViX3JvdW5kX3NzKFcsIFUsIEEsIEIsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX3N1YnNzX3JvdW5kX21hc2soKF9fdjRzZikoX19tMTI4KShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShXKSwgKF9fbW1hc2s4KShVKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrel9zdWJfcm91bmRfc3MoVSwgQSwgQiwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfc3Vic3Nfcm91bmRfbWFzaygoX192NHNmKShfX20xMjgpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKShfX20xMjgpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKV9tbV9zZXR6ZXJvX3BzKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIChpbnQpKFIpKTsgfSkKKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX3N1Yl9zZChfX20xMjhkIF9fVywgX19tbWFzazggX19VLF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikgeworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3N1YnNkX3JvdW5kX21hc2sgKChfX3YyZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192MmRmKSBfX0IsCisgICAgICAgICAgICAgICAgKF9fdjJkZikgX19XLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfc3ViX3NkKF9fbW1hc2s4IF9fVSxfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9zdWJzZF9yb3VuZF9tYXNrICgoX192MmRmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjJkZikgX19CLAorICAgICAgICAgICAgICAgIChfX3YyZGYpICBfbW1fc2V0emVyb19wZCAoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCisjZGVmaW5lIF9tbV9zdWJfcm91bmRfc2QoQSwgQiwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX3N1YnNkX3JvdW5kX21hc2soKF9fdjJkZikoX19tMTI4ZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpX21tX3NldHplcm9fcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrX3N1Yl9yb3VuZF9zZChXLCBVLCBBLCBCLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGQpX19idWlsdGluX2lhMzJfc3Vic2Rfcm91bmRfbWFzaygoX192MmRmKShfX20xMjhkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fbTEyOGQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZikoX19tMTI4ZCkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2t6X3N1Yl9yb3VuZF9zZChVLCBBLCBCLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGQpX19idWlsdGluX2lhMzJfc3Vic2Rfcm91bmRfbWFzaygoX192MmRmKShfX20xMjhkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fbTEyOGQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZilfbW1fc2V0emVyb19wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSwgKGludCkoUikpOyB9KQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfc3ViX3BkKF9fbTUxMmQgX19XLCBfX21tYXNrOCBfX1UsIF9fbTUxMmQgX19BLCBfX201MTJkIF9fQikgeworICByZXR1cm4gKF9fbTUxMmQpIF9fYnVpbHRpbl9pYTMyX3N1YnBkNTEyX21hc2sgKChfX3Y4ZGYpIF9fQSwKKyAgICAgICAgICAgICAoX192OGRmKSBfX0IsCisgICAgICAgICAgICAgKF9fdjhkZikgX19XLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfc3ViX3BkKF9fbW1hc2s4IF9fVSwgX19tNTEyZCBfX0EsIF9fbTUxMmQgX19CKSB7CisgIHJldHVybiAoX19tNTEyZCkgX19idWlsdGluX2lhMzJfc3VicGQ1MTJfbWFzayAoKF9fdjhkZikgX19BLAorICAgICAgICAgICAgIChfX3Y4ZGYpIF9fQiwKKyAgICAgICAgICAgICAoX192OGRmKQorICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3BkICgpLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX3N1Yl9wcyhfX201MTIgX19XLCBfX21tYXNrMTYgX19VLCBfX201MTIgX19BLCBfX201MTIgX19CKSB7CisgIHJldHVybiAoX19tNTEyKSBfX2J1aWx0aW5faWEzMl9zdWJwczUxMl9tYXNrICgoX192MTZzZikgX19BLAorICAgICAgICAgICAgKF9fdjE2c2YpIF9fQiwKKyAgICAgICAgICAgIChfX3YxNnNmKSBfX1csCisgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UsCisgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfc3ViX3BzKF9fbW1hc2sxNiBfX1UsIF9fbTUxMiBfX0EsIF9fbTUxMiBfX0IpIHsKKyAgcmV0dXJuIChfX201MTIpIF9fYnVpbHRpbl9pYTMyX3N1YnBzNTEyX21hc2sgKChfX3YxNnNmKSBfX0EsCisgICAgICAgICAgICAoX192MTZzZikgX19CLAorICAgICAgICAgICAgKF9fdjE2c2YpCisgICAgICAgICAgICBfbW01MTJfc2V0emVyb19wcyAoKSwKKyAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSwKKyAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKKyNkZWZpbmUgX21tNTEyX3N1Yl9yb3VuZF9wZChBLCBCLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmQpX19idWlsdGluX2lhMzJfc3VicGQ1MTJfbWFzaygoX192OGRmKShfX201MTJkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpKF9fbTUxMmQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZilfbW01MTJfc2V0emVyb19wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2tfc3ViX3JvdW5kX3BkKFcsIFUsIEEsIEIsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyZClfX2J1aWx0aW5faWEzMl9zdWJwZDUxMl9tYXNrKChfX3Y4ZGYpKF9fbTUxMmQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikoX19tNTEyZCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKShfX201MTJkKShXKSwgKF9fbW1hc2s4KShVKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza3pfc3ViX3JvdW5kX3BkKFUsIEEsIEIsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyZClfX2J1aWx0aW5faWEzMl9zdWJwZDUxMl9tYXNrKChfX3Y4ZGYpKF9fbTUxMmQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikoX19tNTEyZCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKV9tbTUxMl9zZXR6ZXJvX3BkKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX3N1Yl9yb3VuZF9wcyhBLCBCLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMilfX2J1aWx0aW5faWEzMl9zdWJwczUxMl9tYXNrKChfX3YxNnNmKShfX201MTIpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikoX19tNTEyKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpX21tNTEyX3NldHplcm9fcHMoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNiktMSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX3N1Yl9yb3VuZF9wcyhXLCBVLCBBLCBCLCBSKSAgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTIpX19idWlsdGluX2lhMzJfc3VicHM1MTJfbWFzaygoX192MTZzZikoX19tNTEyKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpKF9fbTUxMikoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKShfX201MTIpKFcpLCAoX19tbWFzazE2KShVKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoUikpOyB9KTsKKworI2RlZmluZSBfbW01MTJfbWFza3pfc3ViX3JvdW5kX3BzKFUsIEEsIEIsIFIpICBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMilfX2J1aWx0aW5faWEzMl9zdWJwczUxMl9tYXNrKChfX3YxNnNmKShfX201MTIpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikoX19tNTEyKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpX21tNTEyX3NldHplcm9fcHMoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikoVSksIChpbnQpKFIpKTsgfSk7CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX211bF9zcyhfX20xMjggX19XLCBfX21tYXNrOCBfX1UsX19tMTI4IF9fQSwgX19tMTI4IF9fQikgeworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfbXVsc3Nfcm91bmRfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgIChfX3Y0c2YpIF9fQiwKKyAgICAgICAgICAgICAgICAoX192NHNmKSBfX1csCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X211bF9zcyhfX21tYXNrOCBfX1UsX19tMTI4IF9fQSwgX19tMTI4IF9fQikgeworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfbXVsc3Nfcm91bmRfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgIChfX3Y0c2YpIF9fQiwKKyAgICAgICAgICAgICAgICAoX192NHNmKSAgX21tX3NldHplcm9fcHMgKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKyNkZWZpbmUgX21tX211bF9yb3VuZF9zcyhBLCBCLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOClfX2J1aWx0aW5faWEzMl9tdWxzc19yb3VuZF9tYXNrKChfX3Y0c2YpKF9fbTEyOCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpKF9fbTEyOCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpX21tX3NldHplcm9fcHMoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2tfbXVsX3JvdW5kX3NzKFcsIFUsIEEsIEIsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX211bHNzX3JvdW5kX21hc2soKF9fdjRzZikoX19tMTI4KShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShXKSwgKF9fbW1hc2s4KShVKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrel9tdWxfcm91bmRfc3MoVSwgQSwgQiwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfbXVsc3Nfcm91bmRfbWFzaygoX192NHNmKShfX20xMjgpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKShfX20xMjgpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKV9tbV9zZXR6ZXJvX3BzKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIChpbnQpKFIpKTsgfSkKKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX211bF9zZChfX20xMjhkIF9fVywgX19tbWFzazggX19VLF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikgeworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX211bHNkX3JvdW5kX21hc2sgKChfX3YyZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192MmRmKSBfX0IsCisgICAgICAgICAgICAgICAgKF9fdjJkZikgX19XLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfbXVsX3NkKF9fbW1hc2s4IF9fVSxfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9tdWxzZF9yb3VuZF9tYXNrICgoX192MmRmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjJkZikgX19CLAorICAgICAgICAgICAgICAgIChfX3YyZGYpICBfbW1fc2V0emVyb19wZCAoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCisjZGVmaW5lIF9tbV9tdWxfcm91bmRfc2QoQSwgQiwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX211bHNkX3JvdW5kX21hc2soKF9fdjJkZikoX19tMTI4ZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpX21tX3NldHplcm9fcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrX211bF9yb3VuZF9zZChXLCBVLCBBLCBCLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGQpX19idWlsdGluX2lhMzJfbXVsc2Rfcm91bmRfbWFzaygoX192MmRmKShfX20xMjhkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fbTEyOGQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZikoX19tMTI4ZCkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2t6X211bF9yb3VuZF9zZChVLCBBLCBCLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGQpX19idWlsdGluX2lhMzJfbXVsc2Rfcm91bmRfbWFzaygoX192MmRmKShfX20xMjhkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fbTEyOGQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZilfbW1fc2V0emVyb19wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSwgKGludCkoUikpOyB9KQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfbXVsX3BkKF9fbTUxMmQgX19XLCBfX21tYXNrOCBfX1UsIF9fbTUxMmQgX19BLCBfX201MTJkIF9fQikgeworICByZXR1cm4gKF9fbTUxMmQpIF9fYnVpbHRpbl9pYTMyX211bHBkNTEyX21hc2sgKChfX3Y4ZGYpIF9fQSwKKyAgICAgICAgICAgICAoX192OGRmKSBfX0IsCisgICAgICAgICAgICAgKF9fdjhkZikgX19XLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfbXVsX3BkKF9fbW1hc2s4IF9fVSwgX19tNTEyZCBfX0EsIF9fbTUxMmQgX19CKSB7CisgIHJldHVybiAoX19tNTEyZCkgX19idWlsdGluX2lhMzJfbXVscGQ1MTJfbWFzayAoKF9fdjhkZikgX19BLAorICAgICAgICAgICAgIChfX3Y4ZGYpIF9fQiwKKyAgICAgICAgICAgICAoX192OGRmKQorICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3BkICgpLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX211bF9wcyhfX201MTIgX19XLCBfX21tYXNrMTYgX19VLCBfX201MTIgX19BLCBfX201MTIgX19CKSB7CisgIHJldHVybiAoX19tNTEyKSBfX2J1aWx0aW5faWEzMl9tdWxwczUxMl9tYXNrICgoX192MTZzZikgX19BLAorICAgICAgICAgICAgKF9fdjE2c2YpIF9fQiwKKyAgICAgICAgICAgIChfX3YxNnNmKSBfX1csCisgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UsCisgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfbXVsX3BzKF9fbW1hc2sxNiBfX1UsIF9fbTUxMiBfX0EsIF9fbTUxMiBfX0IpIHsKKyAgcmV0dXJuIChfX201MTIpIF9fYnVpbHRpbl9pYTMyX211bHBzNTEyX21hc2sgKChfX3YxNnNmKSBfX0EsCisgICAgICAgICAgICAoX192MTZzZikgX19CLAorICAgICAgICAgICAgKF9fdjE2c2YpCisgICAgICAgICAgICBfbW01MTJfc2V0emVyb19wcyAoKSwKKyAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSwKKyAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKKyNkZWZpbmUgX21tNTEyX211bF9yb3VuZF9wZChBLCBCLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmQpX19idWlsdGluX2lhMzJfbXVscGQ1MTJfbWFzaygoX192OGRmKShfX201MTJkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpKF9fbTUxMmQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZilfbW01MTJfc2V0emVyb19wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2tfbXVsX3JvdW5kX3BkKFcsIFUsIEEsIEIsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyZClfX2J1aWx0aW5faWEzMl9tdWxwZDUxMl9tYXNrKChfX3Y4ZGYpKF9fbTUxMmQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikoX19tNTEyZCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKShfX201MTJkKShXKSwgKF9fbW1hc2s4KShVKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza3pfbXVsX3JvdW5kX3BkKFUsIEEsIEIsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyZClfX2J1aWx0aW5faWEzMl9tdWxwZDUxMl9tYXNrKChfX3Y4ZGYpKF9fbTUxMmQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikoX19tNTEyZCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKV9tbTUxMl9zZXR6ZXJvX3BkKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX211bF9yb3VuZF9wcyhBLCBCLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMilfX2J1aWx0aW5faWEzMl9tdWxwczUxMl9tYXNrKChfX3YxNnNmKShfX201MTIpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikoX19tNTEyKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpX21tNTEyX3NldHplcm9fcHMoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNiktMSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX211bF9yb3VuZF9wcyhXLCBVLCBBLCBCLCBSKSAgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTIpX19idWlsdGluX2lhMzJfbXVscHM1MTJfbWFzaygoX192MTZzZikoX19tNTEyKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpKF9fbTUxMikoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKShfX201MTIpKFcpLCAoX19tbWFzazE2KShVKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoUikpOyB9KTsKKworI2RlZmluZSBfbW01MTJfbWFza3pfbXVsX3JvdW5kX3BzKFUsIEEsIEIsIFIpICBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMilfX2J1aWx0aW5faWEzMl9tdWxwczUxMl9tYXNrKChfX3YxNnNmKShfX201MTIpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikoX19tNTEyKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpX21tNTEyX3NldHplcm9fcHMoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikoVSksIChpbnQpKFIpKTsgfSk7CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2Rpdl9zcyhfX20xMjggX19XLCBfX21tYXNrOCBfX1UsX19tMTI4IF9fQSwgX19tMTI4IF9fQikgeworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfZGl2c3Nfcm91bmRfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgIChfX3Y0c2YpIF9fQiwKKyAgICAgICAgICAgICAgICAoX192NHNmKSBfX1csCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2Rpdl9zcyhfX21tYXNrOCBfX1UsX19tMTI4IF9fQSwgX19tMTI4IF9fQikgeworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfZGl2c3Nfcm91bmRfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgIChfX3Y0c2YpIF9fQiwKKyAgICAgICAgICAgICAgICAoX192NHNmKSAgX21tX3NldHplcm9fcHMgKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworI2RlZmluZSBfbW1fZGl2X3JvdW5kX3NzKEEsIEIsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX2RpdnNzX3JvdW5kX21hc2soKF9fdjRzZikoX19tMTI4KShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZilfbW1fc2V0emVyb19wcygpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEsIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW1fbWFza19kaXZfcm91bmRfc3MoVywgVSwgQSwgQiwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfZGl2c3Nfcm91bmRfbWFzaygoX192NHNmKShfX20xMjgpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKShfX20xMjgpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKShfX20xMjgpKFcpLCAoX19tbWFzazgpKFUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2t6X2Rpdl9yb3VuZF9zcyhVLCBBLCBCLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOClfX2J1aWx0aW5faWEzMl9kaXZzc19yb3VuZF9tYXNrKChfX3Y0c2YpKF9fbTEyOCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpKF9fbTEyOCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpX21tX3NldHplcm9fcHMoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSwgKGludCkoUikpOyB9KQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfZGl2X3NkKF9fbTEyOGQgX19XLCBfX21tYXNrOCBfX1UsX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKSB7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfZGl2c2Rfcm91bmRfbWFzayAoKF9fdjJkZikgX19BLAorICAgICAgICAgICAgICAgIChfX3YyZGYpIF9fQiwKKyAgICAgICAgICAgICAgICAoX192MmRmKSBfX1csCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9kaXZfc2QoX19tbWFzazggX19VLF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikgeworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX2RpdnNkX3JvdW5kX21hc2sgKChfX3YyZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192MmRmKSBfX0IsCisgICAgICAgICAgICAgICAgKF9fdjJkZikgIF9tbV9zZXR6ZXJvX3BkICgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKKyNkZWZpbmUgX21tX2Rpdl9yb3VuZF9zZChBLCBCLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGQpX19idWlsdGluX2lhMzJfZGl2c2Rfcm91bmRfbWFzaygoX192MmRmKShfX20xMjhkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fbTEyOGQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZilfbW1fc2V0emVyb19wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2tfZGl2X3JvdW5kX3NkKFcsIFUsIEEsIEIsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9kaXZzZF9yb3VuZF9tYXNrKChfX3YyZGYpKF9fbTEyOGQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZikoX19tMTI4ZCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW1fbWFza3pfZGl2X3JvdW5kX3NkKFUsIEEsIEIsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9kaXZzZF9yb3VuZF9tYXNrKChfX3YyZGYpKF9fbTEyOGQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZikoX19tMTI4ZCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKV9tbV9zZXR6ZXJvX3BkKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShSKSk7IH0pCisKK3N0YXRpYyBfX2lubGluZSBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2Rpdl9wZChfX201MTJkIF9fYSwgX19tNTEyZCBfX2IpCit7CisgIHJldHVybiAoX19tNTEyZCkoKF9fdjhkZilfX2EvKF9fdjhkZilfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfZGl2X3BkKF9fbTUxMmQgX19XLCBfX21tYXNrOCBfX1UsIF9fbTUxMmQgX19BLCBfX201MTJkIF9fQikgeworICByZXR1cm4gKF9fbTUxMmQpIF9fYnVpbHRpbl9pYTMyX2RpdnBkNTEyX21hc2sgKChfX3Y4ZGYpIF9fQSwKKyAgICAgICAgICAgICAoX192OGRmKSBfX0IsCisgICAgICAgICAgICAgKF9fdjhkZikgX19XLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfZGl2X3BkKF9fbW1hc2s4IF9fVSwgX19tNTEyZCBfX0EsIF9fbTUxMmQgX19CKSB7CisgIHJldHVybiAoX19tNTEyZCkgX19idWlsdGluX2lhMzJfZGl2cGQ1MTJfbWFzayAoKF9fdjhkZikgX19BLAorICAgICAgICAgICAgIChfX3Y4ZGYpIF9fQiwKKyAgICAgICAgICAgICAoX192OGRmKQorICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3BkICgpLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfZGl2X3BzKF9fbTUxMiBfX2EsIF9fbTUxMiBfX2IpCit7CisgIHJldHVybiAoX19tNTEyKSgoX192MTZzZilfX2EvKF9fdjE2c2YpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfZGl2X3BzKF9fbTUxMiBfX1csIF9fbW1hc2sxNiBfX1UsIF9fbTUxMiBfX0EsIF9fbTUxMiBfX0IpIHsKKyAgcmV0dXJuIChfX201MTIpIF9fYnVpbHRpbl9pYTMyX2RpdnBzNTEyX21hc2sgKChfX3YxNnNmKSBfX0EsCisgICAgICAgICAgICAoX192MTZzZikgX19CLAorICAgICAgICAgICAgKF9fdjE2c2YpIF9fVywKKyAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSwKKyAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9kaXZfcHMoX19tbWFzazE2IF9fVSwgX19tNTEyIF9fQSwgX19tNTEyIF9fQikgeworICByZXR1cm4gKF9fbTUxMikgX19idWlsdGluX2lhMzJfZGl2cHM1MTJfbWFzayAoKF9fdjE2c2YpIF9fQSwKKyAgICAgICAgICAgIChfX3YxNnNmKSBfX0IsCisgICAgICAgICAgICAoX192MTZzZikKKyAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3BzICgpLAorICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VLAorICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworI2RlZmluZSBfbW01MTJfZGl2X3JvdW5kX3BkKEEsIEIsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyZClfX2J1aWx0aW5faWEzMl9kaXZwZDUxMl9tYXNrKChfX3Y4ZGYpKF9fbTUxMmQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikoX19tNTEyZCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKV9tbTUxMl9zZXR6ZXJvX3BkKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEsIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza19kaXZfcm91bmRfcGQoVywgVSwgQSwgQiwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJkKV9fYnVpbHRpbl9pYTMyX2RpdnBkNTEyX21hc2soKF9fdjhkZikoX19tNTEyZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKShfX201MTJkKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpKF9fbTUxMmQpKFcpLCAoX19tbWFzazgpKFUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrel9kaXZfcm91bmRfcGQoVSwgQSwgQiwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJkKV9fYnVpbHRpbl9pYTMyX2RpdnBkNTEyX21hc2soKF9fdjhkZikoX19tNTEyZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKShfX201MTJkKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpX21tNTEyX3NldHplcm9fcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW01MTJfZGl2X3JvdW5kX3BzKEEsIEIsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyKV9fYnVpbHRpbl9pYTMyX2RpdnBzNTEyX21hc2soKF9fdjE2c2YpKF9fbTUxMikoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKShfX201MTIpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZilfbW01MTJfc2V0emVyb19wcygpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KS0xLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2tfZGl2X3JvdW5kX3BzKFcsIFUsIEEsIEIsIFIpICBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMilfX2J1aWx0aW5faWEzMl9kaXZwczUxMl9tYXNrKChfX3YxNnNmKShfX201MTIpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikoX19tNTEyKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpKF9fbTUxMikoVyksIChfX21tYXNrMTYpKFUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShSKSk7IH0pOworCisjZGVmaW5lIF9tbTUxMl9tYXNrel9kaXZfcm91bmRfcHMoVSwgQSwgQiwgUikgIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyKV9fYnVpbHRpbl9pYTMyX2RpdnBzNTEyX21hc2soKF9fdjE2c2YpKF9fbTUxMikoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKShfX201MTIpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZilfbW01MTJfc2V0emVyb19wcygpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KShVKSwgKGludCkoUikpOyB9KTsKKworI2RlZmluZSBfbW01MTJfcm91bmRzY2FsZV9wcyhBLCBCKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMilfX2J1aWx0aW5faWEzMl9ybmRzY2FsZXBzX21hc2soKF9fdjE2c2YpKF9fbTUxMikoQSksIChpbnQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKShfX201MTIpKEEpLCAoX19tbWFzazE2KS0xLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2tfcm91bmRzY2FsZV9wcyhBLCBCLCBDLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHtcCisgIChfX201MTIpX19idWlsdGluX2lhMzJfcm5kc2NhbGVwc19tYXNrKChfX3YxNnNmKShfX201MTIpKEMpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKShfX201MTIpKEEpLCAoX19tbWFzazE2KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrel9yb3VuZHNjYWxlX3BzKEEsIEIsIGltbSkgX19leHRlbnNpb25fXyAoe1wKKyAgKF9fbTUxMilfX2J1aWx0aW5faWEzMl9ybmRzY2FsZXBzX21hc2soKF9fdjE2c2YpKF9fbTUxMikoQiksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpX21tNTEyX3NldHplcm9fcHMoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX3JvdW5kc2NhbGVfcm91bmRfcHMoQSwgQiwgQywgaW1tLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMilfX2J1aWx0aW5faWEzMl9ybmRzY2FsZXBzX21hc2soKF9fdjE2c2YpKF9fbTUxMikoQyksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpKF9fbTUxMikoQSksIChfX21tYXNrMTYpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza3pfcm91bmRzY2FsZV9yb3VuZF9wcyhBLCBCLCBpbW0sIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyKV9fYnVpbHRpbl9pYTMyX3JuZHNjYWxlcHNfbWFzaygoX192MTZzZikoX19tNTEyKShCKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZilfbW01MTJfc2V0emVyb19wcygpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpKEEpLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX3JvdW5kc2NhbGVfcm91bmRfcHMoQSwgaW1tLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMilfX2J1aWx0aW5faWEzMl9ybmRzY2FsZXBzX21hc2soKF9fdjE2c2YpKF9fbTUxMikoQSksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpX21tNTEyX3VuZGVmaW5lZF9wcygpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpLTEsIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW01MTJfcm91bmRzY2FsZV9wZChBLCBCKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmQpX19idWlsdGluX2lhMzJfcm5kc2NhbGVwZF9tYXNrKChfX3Y4ZGYpKF9fbTUxMmQpKEEpLCAoaW50KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikoX19tNTEyZCkoQSksIChfX21tYXNrOCktMSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza19yb3VuZHNjYWxlX3BkKEEsIEIsIEMsIGltbSkgX19leHRlbnNpb25fXyAoe1wKKyAgKF9fbTUxMmQpX19idWlsdGluX2lhMzJfcm5kc2NhbGVwZF9tYXNrKChfX3Y4ZGYpKF9fbTUxMmQpKEMpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKShfX201MTJkKShBKSwgKF9fbW1hc2s4KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza3pfcm91bmRzY2FsZV9wZChBLCBCLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHtcCisgIChfX201MTJkKV9fYnVpbHRpbl9pYTMyX3JuZHNjYWxlcGRfbWFzaygoX192OGRmKShfX201MTJkKShCKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZilfbW01MTJfc2V0emVyb19wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX3JvdW5kc2NhbGVfcm91bmRfcGQoQSwgQiwgQywgaW1tLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmQpX19idWlsdGluX2lhMzJfcm5kc2NhbGVwZF9tYXNrKChfX3Y4ZGYpKF9fbTUxMmQpKEMpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKShfX201MTJkKShBKSwgKF9fbW1hc2s4KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrel9yb3VuZHNjYWxlX3JvdW5kX3BkKEEsIEIsIGltbSwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJkKV9fYnVpbHRpbl9pYTMyX3JuZHNjYWxlcGRfbWFzaygoX192OGRmKShfX201MTJkKShCKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZilfbW01MTJfc2V0emVyb19wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKEEpLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX3JvdW5kc2NhbGVfcm91bmRfcGQoQSwgaW1tLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmQpX19idWlsdGluX2lhMzJfcm5kc2NhbGVwZF9tYXNrKChfX3Y4ZGYpKF9fbTUxMmQpKEEpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKV9tbTUxMl91bmRlZmluZWRfcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX2ZtYWRkX3JvdW5kX3BkKEEsIEIsIEMsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyZClfX2J1aWx0aW5faWEzMl92Zm1hZGRwZDUxMl9tYXNrKChfX3Y4ZGYpKF9fbTUxMmQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikoX19tNTEyZCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKShfX201MTJkKShDKSwgKF9fbW1hc2s4KS0xLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoUikpOyB9KQorCisKKyNkZWZpbmUgX21tNTEyX21hc2tfZm1hZGRfcm91bmRfcGQoQSwgVSwgQiwgQywgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJkKV9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBkNTEyX21hc2soKF9fdjhkZikoX19tNTEyZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKShfX201MTJkKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpKF9fbTUxMmQpKEMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSwgKGludCkoUikpOyB9KQorCisKKyNkZWZpbmUgX21tNTEyX21hc2szX2ZtYWRkX3JvdW5kX3BkKEEsIEIsIEMsIFUsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyZClfX2J1aWx0aW5faWEzMl92Zm1hZGRwZDUxMl9tYXNrMygoX192OGRmKShfX201MTJkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKShfX201MTJkKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKShfX201MTJkKShDKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShSKSk7IH0pCisKKworI2RlZmluZSBfbW01MTJfbWFza3pfZm1hZGRfcm91bmRfcGQoVSwgQSwgQiwgQywgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJkKV9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBkNTEyX21hc2t6KChfX3Y4ZGYpKF9fbTUxMmQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpKF9fbTUxMmQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpKF9fbTUxMmQpKEMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIChpbnQpKFIpKTsgfSkKKworCisjZGVmaW5lIF9tbTUxMl9mbXN1Yl9yb3VuZF9wZChBLCBCLCBDLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmQpX19idWlsdGluX2lhMzJfdmZtYWRkcGQ1MTJfbWFzaygoX192OGRmKShfX201MTJkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpKF9fbTUxMmQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShfX3Y4ZGYpKF9fbTUxMmQpKEMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xLCAoaW50KShSKSk7IH0pCisKKworI2RlZmluZSBfbW01MTJfbWFza19mbXN1Yl9yb3VuZF9wZChBLCBVLCBCLCBDLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmQpX19idWlsdGluX2lhMzJfdmZtYWRkcGQ1MTJfbWFzaygoX192OGRmKShfX201MTJkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpKF9fbTUxMmQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShfX3Y4ZGYpKF9fbTUxMmQpKEMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSwgKGludCkoUikpOyB9KQorCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X2Ztc3ViX3JvdW5kX3BkKFUsIEEsIEIsIEMsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyZClfX2J1aWx0aW5faWEzMl92Zm1hZGRwZDUxMl9tYXNreigoX192OGRmKShfX201MTJkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKShfX201MTJkKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKF9fdjhkZikoX19tNTEyZCkoQyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSwgKGludCkoUikpOyB9KQorCisKKyNkZWZpbmUgX21tNTEyX2ZubWFkZF9yb3VuZF9wZChBLCBCLCBDLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmQpX19idWlsdGluX2lhMzJfdmZtYWRkcGQ1MTJfbWFzaygtKF9fdjhkZikoX19tNTEyZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKShfX201MTJkKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpKF9fbTUxMmQpKEMpLCAoX19tbWFzazgpLTEsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShSKSk7IH0pCisKKworI2RlZmluZSBfbW01MTJfbWFzazNfZm5tYWRkX3JvdW5kX3BkKEEsIEIsIEMsIFUsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyZClfX2J1aWx0aW5faWEzMl92Zm1hZGRwZDUxMl9tYXNrMygtKF9fdjhkZikoX19tNTEyZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikoX19tNTEyZCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikoX19tNTEyZCkoQyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSwgKGludCkoUikpOyB9KQorCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X2ZubWFkZF9yb3VuZF9wZChVLCBBLCBCLCBDLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmQpX19idWlsdGluX2lhMzJfdmZtYWRkcGQ1MTJfbWFza3ooLShfX3Y4ZGYpKF9fbTUxMmQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpKF9fbTUxMmQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpKF9fbTUxMmQpKEMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIChpbnQpKFIpKTsgfSkKKworCisjZGVmaW5lIF9tbTUxMl9mbm1zdWJfcm91bmRfcGQoQSwgQiwgQywgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJkKV9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBkNTEyX21hc2soLShfX3Y4ZGYpKF9fbTUxMmQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikoX19tNTEyZCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKF9fdjhkZikoX19tNTEyZCkoQyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEsIChpbnQpKFIpKTsgfSkKKworCisjZGVmaW5lIF9tbTUxMl9tYXNrel9mbm1zdWJfcm91bmRfcGQoVSwgQSwgQiwgQywgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJkKV9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBkNTEyX21hc2t6KC0oX192OGRmKShfX201MTJkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKShfX201MTJkKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKF9fdjhkZikoX19tNTEyZCkoQyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSwgKGludCkoUikpOyB9KQorCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfZm1hZGRfcGQoX19tNTEyZCBfX0EsIF9fbTUxMmQgX19CLCBfX201MTJkIF9fQykKK3sKKyAgcmV0dXJuIChfX201MTJkKSBfX2J1aWx0aW5faWEzMl92Zm1hZGRwZDUxMl9tYXNrICgoX192OGRmKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikgX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpIF9fQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19mbWFkZF9wZChfX201MTJkIF9fQSwgX19tbWFzazggX19VLCBfX201MTJkIF9fQiwgX19tNTEyZCBfX0MpCit7CisgIHJldHVybiAoX19tNTEyZCkgX19idWlsdGluX2lhMzJfdmZtYWRkcGQ1MTJfbWFzayAoKF9fdjhkZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKSBfX0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrM19mbWFkZF9wZChfX201MTJkIF9fQSwgX19tNTEyZCBfX0IsIF9fbTUxMmQgX19DLCBfX21tYXNrOCBfX1UpCit7CisgIHJldHVybiAoX19tNTEyZCkgX19idWlsdGluX2lhMzJfdmZtYWRkcGQ1MTJfbWFzazMgKChfX3Y4ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikgX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKSBfX0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X2ZtYWRkX3BkKF9fbW1hc2s4IF9fVSwgX19tNTEyZCBfX0EsIF9fbTUxMmQgX19CLCBfX201MTJkIF9fQykKK3sKKyAgcmV0dXJuIChfX201MTJkKSBfX2J1aWx0aW5faWEzMl92Zm1hZGRwZDUxMl9tYXNreiAoKF9fdjhkZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKSBfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpIF9fQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfZm1zdWJfcGQoX19tNTEyZCBfX0EsIF9fbTUxMmQgX19CLCBfX201MTJkIF9fQykKK3sKKyAgcmV0dXJuIChfX201MTJkKSBfX2J1aWx0aW5faWEzMl92Zm1hZGRwZDUxMl9tYXNrICgoX192OGRmKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikgX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oX192OGRmKSBfX0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfZm1zdWJfcGQoX19tNTEyZCBfX0EsIF9fbW1hc2s4IF9fVSwgX19tNTEyZCBfX0IsIF9fbTUxMmQgX19DKQoreworICByZXR1cm4gKF9fbTUxMmQpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBkNTEyX21hc2sgKChfX3Y4ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKSBfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShfX3Y4ZGYpIF9fQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X2Ztc3ViX3BkKF9fbW1hc2s4IF9fVSwgX19tNTEyZCBfX0EsIF9fbTUxMmQgX19CLCBfX201MTJkIF9fQykKK3sKKyAgcmV0dXJuIChfX201MTJkKSBfX2J1aWx0aW5faWEzMl92Zm1hZGRwZDUxMl9tYXNreiAoKF9fdjhkZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKSBfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oX192OGRmKSBfX0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2ZubWFkZF9wZChfX201MTJkIF9fQSwgX19tNTEyZCBfX0IsIF9fbTUxMmQgX19DKQoreworICByZXR1cm4gKF9fbTUxMmQpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBkNTEyX21hc2sgKC0oX192OGRmKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikgX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpIF9fQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFzazNfZm5tYWRkX3BkKF9fbTUxMmQgX19BLCBfX201MTJkIF9fQiwgX19tNTEyZCBfX0MsIF9fbW1hc2s4IF9fVSkKK3sKKyAgcmV0dXJuIChfX201MTJkKSBfX2J1aWx0aW5faWEzMl92Zm1hZGRwZDUxMl9tYXNrMyAoLShfX3Y4ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikgX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKSBfX0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X2ZubWFkZF9wZChfX21tYXNrOCBfX1UsIF9fbTUxMmQgX19BLCBfX201MTJkIF9fQiwgX19tNTEyZCBfX0MpCit7CisgIHJldHVybiAoX19tNTEyZCkgX19idWlsdGluX2lhMzJfdmZtYWRkcGQ1MTJfbWFza3ogKC0oX192OGRmKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikgX19DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9mbm1zdWJfcGQoX19tNTEyZCBfX0EsIF9fbTUxMmQgX19CLCBfX201MTJkIF9fQykKK3sKKyAgcmV0dXJuIChfX201MTJkKSBfX2J1aWx0aW5faWEzMl92Zm1hZGRwZDUxMl9tYXNrICgtKF9fdjhkZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKF9fdjhkZikgX19DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9mbm1zdWJfcGQoX19tbWFzazggX19VLCBfX201MTJkIF9fQSwgX19tNTEyZCBfX0IsIF9fbTUxMmQgX19DKQoreworICByZXR1cm4gKF9fbTUxMmQpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBkNTEyX21hc2t6ICgtKF9fdjhkZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKSBfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oX192OGRmKSBfX0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCisjZGVmaW5lIF9tbTUxMl9mbWFkZF9yb3VuZF9wcyhBLCBCLCBDLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMilfX2J1aWx0aW5faWEzMl92Zm1hZGRwczUxMl9tYXNrKChfX3YxNnNmKShfX201MTIpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikoX19tNTEyKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpKF9fbTUxMikoQyksIChfX21tYXNrMTYpLTEsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKFIpKTsgfSkKKworCisjZGVmaW5lIF9tbTUxMl9tYXNrX2ZtYWRkX3JvdW5kX3BzKEEsIFUsIEIsIEMsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyKV9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBzNTEyX21hc2soKF9fdjE2c2YpKF9fbTUxMikoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKShfX201MTIpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikoX19tNTEyKShDKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikoVSksIChpbnQpKFIpKTsgfSkKKworCisjZGVmaW5lIF9tbTUxMl9tYXNrM19mbWFkZF9yb3VuZF9wcyhBLCBCLCBDLCBVLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMilfX2J1aWx0aW5faWEzMl92Zm1hZGRwczUxMl9tYXNrMygoX192MTZzZikoX19tNTEyKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKShfX201MTIpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpKF9fbTUxMikoQyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KShVKSwgKGludCkoUikpOyB9KQorCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X2ZtYWRkX3JvdW5kX3BzKFUsIEEsIEIsIEMsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyKV9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBzNTEyX21hc2t6KChfX3YxNnNmKShfX201MTIpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpKF9fbTUxMikoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikoX19tNTEyKShDKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpKFUpLCAoaW50KShSKSk7IH0pCisKKworI2RlZmluZSBfbW01MTJfZm1zdWJfcm91bmRfcHMoQSwgQiwgQywgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTIpX19idWlsdGluX2lhMzJfdmZtYWRkcHM1MTJfbWFzaygoX192MTZzZikoX19tNTEyKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpKF9fbTUxMikoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oX192MTZzZikoX19tNTEyKShDKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNiktMSwgKGludCkoUikpOyB9KQorCisKKyNkZWZpbmUgX21tNTEyX21hc2tfZm1zdWJfcm91bmRfcHMoQSwgVSwgQiwgQywgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTIpX19idWlsdGluX2lhMzJfdmZtYWRkcHM1MTJfbWFzaygoX192MTZzZikoX19tNTEyKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpKF9fbTUxMikoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oX192MTZzZikoX19tNTEyKShDKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikoVSksIChpbnQpKFIpKTsgfSkKKworCisjZGVmaW5lIF9tbTUxMl9tYXNrel9mbXN1Yl9yb3VuZF9wcyhVLCBBLCBCLCBDLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMilfX2J1aWx0aW5faWEzMl92Zm1hZGRwczUxMl9tYXNreigoX192MTZzZikoX19tNTEyKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKShfX201MTIpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShfX3YxNnNmKShfX201MTIpKEMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikoVSksIChpbnQpKFIpKTsgfSkKKworCisjZGVmaW5lIF9tbTUxMl9mbm1hZGRfcm91bmRfcHMoQSwgQiwgQywgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTIpX19idWlsdGluX2lhMzJfdmZtYWRkcHM1MTJfbWFzaygtKF9fdjE2c2YpKF9fbTUxMikoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKShfX201MTIpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikoX19tNTEyKShDKSwgKF9fbW1hc2sxNiktMSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoUikpOyB9KQorCisKKyNkZWZpbmUgX21tNTEyX21hc2szX2ZubWFkZF9yb3VuZF9wcyhBLCBCLCBDLCBVLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMilfX2J1aWx0aW5faWEzMl92Zm1hZGRwczUxMl9tYXNrMygtKF9fdjE2c2YpKF9fbTUxMikoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikoX19tNTEyKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKShfX201MTIpKEMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikoVSksIChpbnQpKFIpKTsgfSkKKworCisjZGVmaW5lIF9tbTUxMl9tYXNrel9mbm1hZGRfcm91bmRfcHMoVSwgQSwgQiwgQywgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTIpX19idWlsdGluX2lhMzJfdmZtYWRkcHM1MTJfbWFza3ooLShfX3YxNnNmKShfX201MTIpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpKF9fbTUxMikoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikoX19tNTEyKShDKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpKFUpLCAoaW50KShSKSk7IH0pCisKKworI2RlZmluZSBfbW01MTJfZm5tc3ViX3JvdW5kX3BzKEEsIEIsIEMsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyKV9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBzNTEyX21hc2soLShfX3YxNnNmKShfX201MTIpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikoX19tNTEyKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShfX3YxNnNmKShfX201MTIpKEMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KS0xLCAoaW50KShSKSk7IH0pCisKKworI2RlZmluZSBfbW01MTJfbWFza3pfZm5tc3ViX3JvdW5kX3BzKFUsIEEsIEIsIEMsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyKV9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBzNTEyX21hc2t6KC0oX192MTZzZikoX19tNTEyKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKShfX201MTIpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShfX3YxNnNmKShfX201MTIpKEMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikoVSksIChpbnQpKFIpKTsgfSkKKworCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfZm1hZGRfcHMoX19tNTEyIF9fQSwgX19tNTEyIF9fQiwgX19tNTEyIF9fQykKK3sKKyAgcmV0dXJuIChfX201MTIpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBzNTEyX21hc2sgKChfX3YxNnNmKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikgX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpIF9fQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfZm1hZGRfcHMoX19tNTEyIF9fQSwgX19tbWFzazE2IF9fVSwgX19tNTEyIF9fQiwgX19tNTEyIF9fQykKK3sKKyAgcmV0dXJuIChfX201MTIpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBzNTEyX21hc2sgKChfX3YxNnNmKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikgX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpIF9fQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrM19mbWFkZF9wcyhfX201MTIgX19BLCBfX201MTIgX19CLCBfX201MTIgX19DLCBfX21tYXNrMTYgX19VKQoreworICByZXR1cm4gKF9fbTUxMikgX19idWlsdGluX2lhMzJfdmZtYWRkcHM1MTJfbWFzazMgKChfX3YxNnNmKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikgX19DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfZm1hZGRfcHMoX19tbWFzazE2IF9fVSwgX19tNTEyIF9fQSwgX19tNTEyIF9fQiwgX19tNTEyIF9fQykKK3sKKyAgcmV0dXJuIChfX201MTIpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBzNTEyX21hc2t6ICgoX192MTZzZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKSBfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpIF9fQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2Ztc3ViX3BzKF9fbTUxMiBfX0EsIF9fbTUxMiBfX0IsIF9fbTUxMiBfX0MpCit7CisgIHJldHVybiAoX19tNTEyKSBfX2J1aWx0aW5faWEzMl92Zm1hZGRwczUxMl9tYXNrICgoX192MTZzZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oX192MTZzZikgX19DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19mbXN1Yl9wcyhfX201MTIgX19BLCBfX21tYXNrMTYgX19VLCBfX201MTIgX19CLCBfX201MTIgX19DKQoreworICByZXR1cm4gKF9fbTUxMikgX19idWlsdGluX2lhMzJfdmZtYWRkcHM1MTJfbWFzayAoKF9fdjE2c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKSBfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKF9fdjE2c2YpIF9fQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9mbXN1Yl9wcyhfX21tYXNrMTYgX19VLCBfX201MTIgX19BLCBfX201MTIgX19CLCBfX201MTIgX19DKQoreworICByZXR1cm4gKF9fbTUxMikgX19idWlsdGluX2lhMzJfdmZtYWRkcHM1MTJfbWFza3ogKChfX3YxNnNmKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKF9fdjE2c2YpIF9fQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2ZubWFkZF9wcyhfX201MTIgX19BLCBfX201MTIgX19CLCBfX201MTIgX19DKQoreworICByZXR1cm4gKF9fbTUxMikgX19idWlsdGluX2lhMzJfdmZtYWRkcHM1MTJfbWFzayAoLShfX3YxNnNmKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikgX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpIF9fQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2szX2ZubWFkZF9wcyhfX201MTIgX19BLCBfX201MTIgX19CLCBfX201MTIgX19DLCBfX21tYXNrMTYgX19VKQoreworICByZXR1cm4gKF9fbTUxMikgX19idWlsdGluX2lhMzJfdmZtYWRkcHM1MTJfbWFzazMgKC0oX192MTZzZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKSBfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpIF9fQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X2ZubWFkZF9wcyhfX21tYXNrMTYgX19VLCBfX201MTIgX19BLCBfX201MTIgX19CLCBfX201MTIgX19DKQoreworICByZXR1cm4gKF9fbTUxMikgX19idWlsdGluX2lhMzJfdmZtYWRkcHM1MTJfbWFza3ogKC0oX192MTZzZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKSBfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpIF9fQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2ZubXN1Yl9wcyhfX201MTIgX19BLCBfX201MTIgX19CLCBfX201MTIgX19DKQoreworICByZXR1cm4gKF9fbTUxMikgX19idWlsdGluX2lhMzJfdmZtYWRkcHM1MTJfbWFzayAoLShfX3YxNnNmKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikgX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShfX3YxNnNmKSBfX0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KSAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9mbm1zdWJfcHMoX19tbWFzazE2IF9fVSwgX19tNTEyIF9fQSwgX19tNTEyIF9fQiwgX19tNTEyIF9fQykKK3sKKyAgcmV0dXJuIChfX201MTIpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBzNTEyX21hc2t6ICgtKF9fdjE2c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikgX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oX192MTZzZikgX19DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCisjZGVmaW5lIF9tbTUxMl9mbWFkZHN1Yl9yb3VuZF9wZChBLCBCLCBDLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmQpX19idWlsdGluX2lhMzJfdmZtYWRkc3VicGQ1MTJfbWFzaygoX192OGRmKShfX201MTJkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpKF9fbTUxMmQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikoX19tNTEyZCkoQyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEsIChpbnQpKFIpKTsgfSkKKworCisjZGVmaW5lIF9tbTUxMl9tYXNrX2ZtYWRkc3ViX3JvdW5kX3BkKEEsIFUsIEIsIEMsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyZClfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwZDUxMl9tYXNrKChfX3Y4ZGYpKF9fbTUxMmQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikoX19tNTEyZCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKShfX201MTJkKShDKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIChpbnQpKFIpKTsgfSkKKworCisjZGVmaW5lIF9tbTUxMl9tYXNrM19mbWFkZHN1Yl9yb3VuZF9wZChBLCBCLCBDLCBVLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmQpX19idWlsdGluX2lhMzJfdmZtYWRkc3VicGQ1MTJfbWFzazMoKF9fdjhkZikoX19tNTEyZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikoX19tNTEyZCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikoX19tNTEyZCkoQyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSwgKGludCkoUikpOyB9KQorCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X2ZtYWRkc3ViX3JvdW5kX3BkKFUsIEEsIEIsIEMsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyZClfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwZDUxMl9tYXNreigoX192OGRmKShfX201MTJkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKShfX201MTJkKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKShfX201MTJkKShDKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShSKSk7IH0pCisKKworI2RlZmluZSBfbW01MTJfZm1zdWJhZGRfcm91bmRfcGQoQSwgQiwgQywgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJkKV9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBkNTEyX21hc2soKF9fdjhkZikoX19tNTEyZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKShfX201MTJkKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oX192OGRmKShfX201MTJkKShDKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSwgKGludCkoUikpOyB9KQorCisKKyNkZWZpbmUgX21tNTEyX21hc2tfZm1zdWJhZGRfcm91bmRfcGQoQSwgVSwgQiwgQywgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJkKV9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBkNTEyX21hc2soKF9fdjhkZikoX19tNTEyZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKShfX201MTJkKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oX192OGRmKShfX201MTJkKShDKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIChpbnQpKFIpKTsgfSkKKworCisjZGVmaW5lIF9tbTUxMl9tYXNrel9mbXN1YmFkZF9yb3VuZF9wZChVLCBBLCBCLCBDLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmQpX19idWlsdGluX2lhMzJfdmZtYWRkc3VicGQ1MTJfbWFza3ooKF9fdjhkZikoX19tNTEyZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikoX19tNTEyZCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShfX3Y4ZGYpKF9fbTUxMmQpKEMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIChpbnQpKFIpKTsgfSkKKworCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2ZtYWRkc3ViX3BkKF9fbTUxMmQgX19BLCBfX201MTJkIF9fQiwgX19tNTEyZCBfX0MpCit7CisgIHJldHVybiAoX19tNTEyZCkgX19idWlsdGluX2lhMzJfdmZtYWRkc3VicGQ1MTJfbWFzayAoKF9fdjhkZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKSBfX0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfZm1hZGRzdWJfcGQoX19tNTEyZCBfX0EsIF9fbW1hc2s4IF9fVSwgX19tNTEyZCBfX0IsIF9fbTUxMmQgX19DKQoreworICByZXR1cm4gKF9fbTUxMmQpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBkNTEyX21hc2sgKChfX3Y4ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKSBfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikgX19DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFzazNfZm1hZGRzdWJfcGQoX19tNTEyZCBfX0EsIF9fbTUxMmQgX19CLCBfX201MTJkIF9fQywgX19tbWFzazggX19VKQoreworICByZXR1cm4gKF9fbTUxMmQpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBkNTEyX21hc2szICgoX192OGRmKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikgX19DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9mbWFkZHN1Yl9wZChfX21tYXNrOCBfX1UsIF9fbTUxMmQgX19BLCBfX201MTJkIF9fQiwgX19tNTEyZCBfX0MpCit7CisgIHJldHVybiAoX19tNTEyZCkgX19idWlsdGluX2lhMzJfdmZtYWRkc3VicGQ1MTJfbWFza3ogKChfX3Y4ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikgX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKSBfX0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2Ztc3ViYWRkX3BkKF9fbTUxMmQgX19BLCBfX201MTJkIF9fQiwgX19tNTEyZCBfX0MpCit7CisgIHJldHVybiAoX19tNTEyZCkgX19idWlsdGluX2lhMzJfdmZtYWRkc3VicGQ1MTJfbWFzayAoKF9fdjhkZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKF9fdjhkZikgX19DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2Ztc3ViYWRkX3BkKF9fbTUxMmQgX19BLCBfX21tYXNrOCBfX1UsIF9fbTUxMmQgX19CLCBfX201MTJkIF9fQykKK3sKKyAgcmV0dXJuIChfX201MTJkKSBfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwZDUxMl9tYXNrICgoX192OGRmKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikgX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oX192OGRmKSBfX0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9mbXN1YmFkZF9wZChfX21tYXNrOCBfX1UsIF9fbTUxMmQgX19BLCBfX201MTJkIF9fQiwgX19tNTEyZCBfX0MpCit7CisgIHJldHVybiAoX19tNTEyZCkgX19idWlsdGluX2lhMzJfdmZtYWRkc3VicGQ1MTJfbWFza3ogKChfX3Y4ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikgX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKF9fdjhkZikgX19DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworI2RlZmluZSBfbW01MTJfZm1hZGRzdWJfcm91bmRfcHMoQSwgQiwgQywgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTIpX19idWlsdGluX2lhMzJfdmZtYWRkc3VicHM1MTJfbWFzaygoX192MTZzZikoX19tNTEyKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpKF9fbTUxMikoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKShfX201MTIpKEMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KS0xLCAoaW50KShSKSk7IH0pCisKKworI2RlZmluZSBfbW01MTJfbWFza19mbWFkZHN1Yl9yb3VuZF9wcyhBLCBVLCBCLCBDLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMilfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwczUxMl9tYXNrKChfX3YxNnNmKShfX201MTIpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikoX19tNTEyKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpKF9fbTUxMikoQyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpKFUpLCAoaW50KShSKSk7IH0pCisKKworI2RlZmluZSBfbW01MTJfbWFzazNfZm1hZGRzdWJfcm91bmRfcHMoQSwgQiwgQywgVSwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTIpX19idWlsdGluX2lhMzJfdmZtYWRkc3VicHM1MTJfbWFzazMoKF9fdjE2c2YpKF9fbTUxMikoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikoX19tNTEyKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKShfX201MTIpKEMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikoVSksIChpbnQpKFIpKTsgfSkKKworCisjZGVmaW5lIF9tbTUxMl9tYXNrel9mbWFkZHN1Yl9yb3VuZF9wcyhVLCBBLCBCLCBDLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMilfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwczUxMl9tYXNreigoX192MTZzZikoX19tNTEyKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKShfX201MTIpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpKF9fbTUxMikoQyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KShVKSwgKGludCkoUikpOyB9KQorCisKKyNkZWZpbmUgX21tNTEyX2Ztc3ViYWRkX3JvdW5kX3BzKEEsIEIsIEMsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyKV9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBzNTEyX21hc2soKF9fdjE2c2YpKF9fbTUxMikoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKShfX201MTIpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKF9fdjE2c2YpKF9fbTUxMikoQyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpLTEsIChpbnQpKFIpKTsgfSkKKworCisjZGVmaW5lIF9tbTUxMl9tYXNrX2Ztc3ViYWRkX3JvdW5kX3BzKEEsIFUsIEIsIEMsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyKV9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBzNTEyX21hc2soKF9fdjE2c2YpKF9fbTUxMikoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKShfX201MTIpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKF9fdjE2c2YpKF9fbTUxMikoQyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpKFUpLCAoaW50KShSKSk7IH0pCisKKworI2RlZmluZSBfbW01MTJfbWFza3pfZm1zdWJhZGRfcm91bmRfcHMoVSwgQSwgQiwgQywgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTIpX19idWlsdGluX2lhMzJfdmZtYWRkc3VicHM1MTJfbWFza3ooKF9fdjE2c2YpKF9fbTUxMikoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikoX19tNTEyKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oX192MTZzZikoX19tNTEyKShDKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpKFUpLCAoaW50KShSKSk7IH0pCisKKworc3RhdGljIF9faW5saW5lX18gX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2ZtYWRkc3ViX3BzKF9fbTUxMiBfX0EsIF9fbTUxMiBfX0IsIF9fbTUxMiBfX0MpCit7CisgIHJldHVybiAoX19tNTEyKSBfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwczUxMl9tYXNrICgoX192MTZzZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKSBfX0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KSAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2ZtYWRkc3ViX3BzKF9fbTUxMiBfX0EsIF9fbW1hc2sxNiBfX1UsIF9fbTUxMiBfX0IsIF9fbTUxMiBfX0MpCit7CisgIHJldHVybiAoX19tNTEyKSBfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwczUxMl9tYXNrICgoX192MTZzZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKSBfX0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFzazNfZm1hZGRzdWJfcHMoX19tNTEyIF9fQSwgX19tNTEyIF9fQiwgX19tNTEyIF9fQywgX19tbWFzazE2IF9fVSkKK3sKKyAgcmV0dXJuIChfX201MTIpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBzNTEyX21hc2szICgoX192MTZzZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKSBfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpIF9fQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X2ZtYWRkc3ViX3BzKF9fbW1hc2sxNiBfX1UsIF9fbTUxMiBfX0EsIF9fbTUxMiBfX0IsIF9fbTUxMiBfX0MpCit7CisgIHJldHVybiAoX19tNTEyKSBfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwczUxMl9tYXNreiAoKF9fdjE2c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikgX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKSBfX0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9mbXN1YmFkZF9wcyhfX201MTIgX19BLCBfX201MTIgX19CLCBfX201MTIgX19DKQoreworICByZXR1cm4gKF9fbTUxMikgX19idWlsdGluX2lhMzJfdmZtYWRkc3VicHM1MTJfbWFzayAoKF9fdjE2c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKSBfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKF9fdjE2c2YpIF9fQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfZm1zdWJhZGRfcHMoX19tNTEyIF9fQSwgX19tbWFzazE2IF9fVSwgX19tNTEyIF9fQiwgX19tNTEyIF9fQykKK3sKKyAgcmV0dXJuIChfX201MTIpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBzNTEyX21hc2sgKChfX3YxNnNmKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikgX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShfX3YxNnNmKSBfX0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfZm1zdWJhZGRfcHMoX19tbWFzazE2IF9fVSwgX19tNTEyIF9fQSwgX19tNTEyIF9fQiwgX19tNTEyIF9fQykKK3sKKyAgcmV0dXJuIChfX201MTIpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBzNTEyX21hc2t6ICgoX192MTZzZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKSBfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShfX3YxNnNmKSBfX0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKKyNkZWZpbmUgX21tNTEyX21hc2szX2Ztc3ViX3JvdW5kX3BkKEEsIEIsIEMsIFUsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyZClfX2J1aWx0aW5faWEzMl92Zm1zdWJwZDUxMl9tYXNrMygoX192OGRmKShfX201MTJkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKShfX201MTJkKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKShfX201MTJkKShDKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShSKSk7IH0pCisKKworc3RhdGljIF9faW5saW5lX18gX19tNTEyZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrM19mbXN1Yl9wZChfX201MTJkIF9fQSwgX19tNTEyZCBfX0IsIF9fbTUxMmQgX19DLCBfX21tYXNrOCBfX1UpCit7CisgIHJldHVybiAoX19tNTEyZCkgX19idWlsdGluX2lhMzJfdmZtc3VicGQ1MTJfbWFzazMgKChfX3Y4ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikgX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKSBfX0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCisjZGVmaW5lIF9tbTUxMl9tYXNrM19mbXN1Yl9yb3VuZF9wcyhBLCBCLCBDLCBVLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMilfX2J1aWx0aW5faWEzMl92Zm1zdWJwczUxMl9tYXNrMygoX192MTZzZikoX19tNTEyKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKShfX201MTIpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpKF9fbTUxMikoQyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KShVKSwgKGludCkoUikpOyB9KQorCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrM19mbXN1Yl9wcyhfX201MTIgX19BLCBfX201MTIgX19CLCBfX201MTIgX19DLCBfX21tYXNrMTYgX19VKQoreworICByZXR1cm4gKF9fbTUxMikgX19idWlsdGluX2lhMzJfdmZtc3VicHM1MTJfbWFzazMgKChfX3YxNnNmKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikgX19DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCisjZGVmaW5lIF9tbTUxMl9tYXNrM19mbXN1YmFkZF9yb3VuZF9wZChBLCBCLCBDLCBVLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmQpX19idWlsdGluX2lhMzJfdmZtc3ViYWRkcGQ1MTJfbWFzazMoKF9fdjhkZikoX19tNTEyZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikoX19tNTEyZCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikoX19tNTEyZCkoQyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSwgKGludCkoUikpOyB9KQorCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFzazNfZm1zdWJhZGRfcGQoX19tNTEyZCBfX0EsIF9fbTUxMmQgX19CLCBfX201MTJkIF9fQywgX19tbWFzazggX19VKQoreworICByZXR1cm4gKF9fbTUxMmQpIF9fYnVpbHRpbl9pYTMyX3ZmbXN1YmFkZHBkNTEyX21hc2szICgoX192OGRmKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikgX19DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworI2RlZmluZSBfbW01MTJfbWFzazNfZm1zdWJhZGRfcm91bmRfcHMoQSwgQiwgQywgVSwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTIpX19idWlsdGluX2lhMzJfdmZtc3ViYWRkcHM1MTJfbWFzazMoKF9fdjE2c2YpKF9fbTUxMikoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikoX19tNTEyKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKShfX201MTIpKEMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikoVSksIChpbnQpKFIpKTsgfSkKKworCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFzazNfZm1zdWJhZGRfcHMoX19tNTEyIF9fQSwgX19tNTEyIF9fQiwgX19tNTEyIF9fQywgX19tbWFzazE2IF9fVSkKK3sKKyAgcmV0dXJuIChfX201MTIpIF9fYnVpbHRpbl9pYTMyX3ZmbXN1YmFkZHBzNTEyX21hc2szICgoX192MTZzZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKSBfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpIF9fQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworI2RlZmluZSBfbW01MTJfbWFza19mbm1hZGRfcm91bmRfcGQoQSwgVSwgQiwgQywgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJkKV9fYnVpbHRpbl9pYTMyX3Zmbm1hZGRwZDUxMl9tYXNrKChfX3Y4ZGYpKF9fbTUxMmQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpKF9fbTUxMmQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpKF9fbTUxMmQpKEMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIChpbnQpKFIpKTsgfSkKKworCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfZm5tYWRkX3BkKF9fbTUxMmQgX19BLCBfX21tYXNrOCBfX1UsIF9fbTUxMmQgX19CLCBfX201MTJkIF9fQykKK3sKKyAgcmV0dXJuIChfX201MTJkKSBfX2J1aWx0aW5faWEzMl92Zm5tYWRkcGQ1MTJfbWFzayAoKF9fdjhkZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKSBfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpIF9fQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKKyNkZWZpbmUgX21tNTEyX21hc2tfZm5tYWRkX3JvdW5kX3BzKEEsIFUsIEIsIEMsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyKV9fYnVpbHRpbl9pYTMyX3Zmbm1hZGRwczUxMl9tYXNrKChfX3YxNnNmKShfX201MTIpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpKF9fbTUxMikoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikoX19tNTEyKShDKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpKFUpLCAoaW50KShSKSk7IH0pCisKKworc3RhdGljIF9faW5saW5lX18gX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfZm5tYWRkX3BzKF9fbTUxMiBfX0EsIF9fbW1hc2sxNiBfX1UsIF9fbTUxMiBfX0IsIF9fbTUxMiBfX0MpCit7CisgIHJldHVybiAoX19tNTEyKSBfX2J1aWx0aW5faWEzMl92Zm5tYWRkcHM1MTJfbWFzayAoKF9fdjE2c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikgX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKSBfX0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKKyNkZWZpbmUgX21tNTEyX21hc2tfZm5tc3ViX3JvdW5kX3BkKEEsIFUsIEIsIEMsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyZClfX2J1aWx0aW5faWEzMl92Zm5tc3VicGQ1MTJfbWFzaygoX192OGRmKShfX201MTJkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKShfX201MTJkKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKShfX201MTJkKShDKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShSKSk7IH0pCisKKworI2RlZmluZSBfbW01MTJfbWFzazNfZm5tc3ViX3JvdW5kX3BkKEEsIEIsIEMsIFUsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyZClfX2J1aWx0aW5faWEzMl92Zm5tc3VicGQ1MTJfbWFzazMoKF9fdjhkZikoX19tNTEyZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpKF9fbTUxMmQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKShfX201MTJkKShDKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSwgKGludCkoUikpOyB9KQorCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19mbm1zdWJfcGQoX19tNTEyZCBfX0EsIF9fbW1hc2s4IF9fVSwgX19tNTEyZCBfX0IsIF9fbTUxMmQgX19DKQoreworICByZXR1cm4gKF9fbTUxMmQpIF9fYnVpbHRpbl9pYTMyX3Zmbm1zdWJwZDUxMl9tYXNrICgoX192OGRmKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikgX19DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrM19mbm1zdWJfcGQoX19tNTEyZCBfX0EsIF9fbTUxMmQgX19CLCBfX201MTJkIF9fQywgX19tbWFzazggX19VKQoreworICByZXR1cm4gKF9fbTUxMmQpIF9fYnVpbHRpbl9pYTMyX3Zmbm1zdWJwZDUxMl9tYXNrMyAoKF9fdjhkZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikgX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikgX19DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX2ZubXN1Yl9yb3VuZF9wcyhBLCBVLCBCLCBDLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMilfX2J1aWx0aW5faWEzMl92Zm5tc3VicHM1MTJfbWFzaygoX192MTZzZikoX19tNTEyKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKShfX201MTIpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpKF9fbTUxMikoQyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KShVKSwgKGludCkoUikpOyB9KQorCisKKyNkZWZpbmUgX21tNTEyX21hc2szX2ZubXN1Yl9yb3VuZF9wcyhBLCBCLCBDLCBVLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMilfX2J1aWx0aW5faWEzMl92Zm5tc3VicHM1MTJfbWFzazMoKF9fdjE2c2YpKF9fbTUxMikoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpKF9fbTUxMikoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpKF9fbTUxMikoQyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikoVSksIChpbnQpKFIpKTsgfSkKKworCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19mbm1zdWJfcHMoX19tNTEyIF9fQSwgX19tbWFzazE2IF9fVSwgX19tNTEyIF9fQiwgX19tNTEyIF9fQykKK3sKKyAgcmV0dXJuIChfX201MTIpIF9fYnVpbHRpbl9pYTMyX3Zmbm1zdWJwczUxMl9tYXNrICgoX192MTZzZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKSBfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpIF9fQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2szX2ZubXN1Yl9wcyhfX201MTIgX19BLCBfX201MTIgX19CLCBfX201MTIgX19DLCBfX21tYXNrMTYgX19VKQoreworICByZXR1cm4gKF9fbTUxMikgX19idWlsdGluX2lhMzJfdmZubXN1YnBzNTEyX21hc2szICgoX192MTZzZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikgX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikgX19DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKKworCisvKiBWZWN0b3IgcGVybXV0YXRpb25zICovCisKK3N0YXRpYyBfX2lubGluZSBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX3Blcm11dGV4MnZhcl9lcGkzMihfX201MTJpIF9fQSwgX19tNTEyaSBfX0ksIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJkNTEyX21hc2sgKChfX3YxNnNpKSBfX0kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZHggKi8gLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNpKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19wZXJtdXRleDJ2YXJfZXBpMzIgKF9fbTUxMmkgX19BLCBfX21tYXNrMTYgX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX201MTJpIF9fSSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfdnBlcm10MnZhcmQ1MTJfbWFzayAoKF9fdjE2c2kpIF9fSQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZHggKi8gLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzaSkgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzaSkgX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X3Blcm11dGV4MnZhcl9lcGkzMiAoX19tbWFzazE2IF9fVSwgX19tNTEyaSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX201MTJpIF9fSSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfdnBlcm10MnZhcmQ1MTJfbWFza3ogKChfX3YxNnNpKSBfX0kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWR4ICovICwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfcGVybXV0ZXgydmFyX2VwaTY0KF9fbTUxMmkgX19BLCBfX201MTJpIF9fSSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnE1MTJfbWFzayAoKF9fdjhkaSkgX19JCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWR4ICovICwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkaSkgX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfcGVybXV0ZXgydmFyX2VwaTY0IChfX201MTJpIF9fQSwgX19tbWFzazggX19VLCBfX201MTJpIF9fSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnE1MTJfbWFzayAoKF9fdjhkaSkgX19JCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWR4ICovICwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkaSkgX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X3Blcm11dGV4MnZhcl9lcGk2NCAoX19tbWFzazggX19VLCBfX201MTJpIF9fQSwKKyAgICAgICAgIF9fbTUxMmkgX19JLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl92cGVybXQydmFycTUxMl9tYXNreiAoKF9fdjhkaSkgX19JCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlkeCAqLyAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGkpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkaSkgX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKKyNkZWZpbmUgX21tNTEyX2FsaWducl9lcGk2NChBLCBCLCBJKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmkpX19idWlsdGluX2lhMzJfYWxpZ25xNTEyX21hc2soKF9fdjhkaSkoX19tNTEyaSkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkaSkoX19tNTEyaSkoQiksIChpbnQpKEkpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGkpX21tNTEyX3NldHplcm9fc2k1MTIoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX2FsaWducl9lcGk2NChXLCBVLCBBLCBCLCBpbW0pIF9fZXh0ZW5zaW9uX18oe1wKKyAgKF9fbTUxMmkpX19idWlsdGluX2lhMzJfYWxpZ25xNTEyX21hc2soKF9fdjhkaSkoX19tNTEyaSkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkaSkoX19tNTEyaSkoQiksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkaSkoX19tNTEyaSkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X2FsaWducl9lcGk2NChVLCBBLCBCLCBpbW0pIF9fZXh0ZW5zaW9uX18oe1wKKyAgKF9fbTUxMmkpX19idWlsdGluX2lhMzJfYWxpZ25xNTEyX21hc2soKF9fdjhkaSkoX19tNTEyaSkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkaSkoX19tNTEyaSkoQiksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkaSlfbW01MTJfc2V0emVyb19zaTUxMigpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSkpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9hbGlnbnJfZXBpMzIoQSwgQiwgSSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX2FsaWduZDUxMl9tYXNrKChfX3YxNnNpKShfX201MTJpKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzaSkoX19tNTEyaSkoQiksIChpbnQpKEkpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNpKV9tbTUxMl9zZXR6ZXJvX3NpNTEyKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNiktMSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2tfYWxpZ25yX2VwaTMyKFcsIFUsIEEsIEIsIGltbSkgX19leHRlbnNpb25fXyAoe1wKKyAgKF9fbTUxMmkpX19idWlsdGluX2lhMzJfYWxpZ25kNTEyX21hc2soKF9fdjE2c2kpKF9fbTUxMmkpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNpKShfX201MTJpKShCKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzaSkoX19tNTEyaSkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikoVSkpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrel9hbGlnbnJfZXBpMzIoVSwgQSwgQiwgaW1tKSBfX2V4dGVuc2lvbl9fKHtcCisgIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX2FsaWduZDUxMl9tYXNrKChfX3YxNnNpKShfX201MTJpKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzaSkoX19tNTEyaSkoQiksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpX21tNTEyX3NldHplcm9fc2k1MTIoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KShVKSk7IH0pCisvKiBWZWN0b3IgRXh0cmFjdCAqLworCisjZGVmaW5lIF9tbTUxMl9leHRyYWN0ZjY0eDRfcGQoQSwgSSkgX19leHRlbnNpb25fXyAoeyAgICAgICAgICAgICAgICAgICAgXAorICAoX19tMjU2ZClfX2J1aWx0aW5faWEzMl9leHRyYWN0ZjY0eDRfbWFzaygoX192OGRmKShfX201MTJkKShBKSwgKGludCkoSSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkZilfbW0yNTZfc2V0emVyb19zaTI1NigpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2tfZXh0cmFjdGY2NHg0X3BkKFcsIFUsIEEsIGltbSkgX19leHRlbnNpb25fXyAoe1wKKyAgKF9fbTI1NmQpX19idWlsdGluX2lhMzJfZXh0cmFjdGY2NHg0X21hc2soKF9fdjhkZikoX19tNTEyZCkoQSksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkZikoX19tMjU2ZCkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X2V4dHJhY3RmNjR4NF9wZChVLCBBLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHtcCisgIChfX20yNTZkKV9fYnVpbHRpbl9pYTMyX2V4dHJhY3RmNjR4NF9tYXNrKChfX3Y4ZGYpKF9fbTUxMmQpKEEpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGYpX21tMjU2X3NldHplcm9fcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW01MTJfZXh0cmFjdGYzMng0X3BzKEEsIEkpIF9fZXh0ZW5zaW9uX18gKHsgICAgICAgICAgICAgICAgICAgIFwKKyAgKF9fbTEyOClfX2J1aWx0aW5faWEzMl9leHRyYWN0ZjMyeDRfbWFzaygoX192MTZzZikoX19tNTEyKShBKSwgKGludCkoSSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKV9tbV9zZXR6ZXJvX3BzKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX2V4dHJhY3RmMzJ4NF9wcyhXLCBVLCBBLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHtcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfZXh0cmFjdGYzMng0X21hc2soKF9fdjE2c2YpKF9fbTUxMikoQSksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKShfX20xMjgpKFcpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X2V4dHJhY3RmMzJ4NF9wcyhVLCBBLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHtcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfZXh0cmFjdGYzMng0X21hc2soKF9fdjE2c2YpKF9fbTUxMikoQSksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKV9tbV9zZXR6ZXJvX3BzKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKy8qIFZlY3RvciBCbGVuZCAqLworCitzdGF0aWMgX19pbmxpbmUgX19tNTEyZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2JsZW5kX3BkKF9fbW1hc2s4IF9fVSwgX19tNTEyZCBfX0EsIF9fbTUxMmQgX19XKQoreworICByZXR1cm4gKF9fbTUxMmQpIF9fYnVpbHRpbl9pYTMyX3NlbGVjdHBkXzUxMiAoKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgICAgICAgIChfX3Y4ZGYpIF9fVywKKyAgICAgICAgICAgICAgICAgKF9fdjhkZikgX19BKTsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTUxMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2JsZW5kX3BzKF9fbW1hc2sxNiBfX1UsIF9fbTUxMiBfX0EsIF9fbTUxMiBfX1cpCit7CisgIHJldHVybiAoX19tNTEyKSBfX2J1aWx0aW5faWEzMl9zZWxlY3Rwc181MTIgKChfX21tYXNrMTYpIF9fVSwKKyAgICAgICAgICAgICAgICAoX192MTZzZikgX19XLAorICAgICAgICAgICAgICAgIChfX3YxNnNmKSBfX0EpOworfQorCitzdGF0aWMgX19pbmxpbmUgX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2JsZW5kX2VwaTY0KF9fbW1hc2s4IF9fVSwgX19tNTEyaSBfX0EsIF9fbTUxMmkgX19XKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3NlbGVjdHFfNTEyICgoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICAgICAgICAoX192OGRpKSBfX1csCisgICAgICAgICAgICAgICAgKF9fdjhkaSkgX19BKTsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19ibGVuZF9lcGkzMihfX21tYXNrMTYgX19VLCBfX201MTJpIF9fQSwgX19tNTEyaSBfX1cpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfc2VsZWN0ZF81MTIgKChfX21tYXNrMTYpIF9fVSwKKyAgICAgICAgICAgICAgICAoX192MTZzaSkgX19XLAorICAgICAgICAgICAgICAgIChfX3YxNnNpKSBfX0EpOworfQorCisvKiBDb21wYXJlICovCisKKyNkZWZpbmUgX21tNTEyX2NtcF9yb3VuZF9wc19tYXNrKEEsIEIsIFAsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tbWFzazE2KV9fYnVpbHRpbl9pYTMyX2NtcHBzNTEyX21hc2soKF9fdjE2c2YpKF9fbTUxMikoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKShfX201MTIpKEIpLCAoaW50KShQKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNiktMSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX2NtcF9yb3VuZF9wc19tYXNrKFUsIEEsIEIsIFAsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tbWFzazE2KV9fYnVpbHRpbl9pYTMyX2NtcHBzNTEyX21hc2soKF9fdjE2c2YpKF9fbTUxMikoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKShfX201MTIpKEIpLCAoaW50KShQKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikoVSksIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW01MTJfY21wX3BzX21hc2soQSwgQiwgUCkgXAorICBfbW01MTJfY21wX3JvdW5kX3BzX21hc2soKEEpLCAoQiksIChQKSwgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX2NtcF9wc19tYXNrKFUsIEEsIEIsIFApIFwKKyAgX21tNTEyX21hc2tfY21wX3JvdW5kX3BzX21hc2soKFUpLCAoQSksIChCKSwgKFApLCBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pCisKKyNkZWZpbmUgX21tNTEyX2NtcF9yb3VuZF9wZF9tYXNrKEEsIEIsIFAsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tbWFzazgpX19idWlsdGluX2lhMzJfY21wcGQ1MTJfbWFzaygoX192OGRmKShfX201MTJkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKShfX201MTJkKShCKSwgKGludCkoUCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2tfY21wX3JvdW5kX3BkX21hc2soVSwgQSwgQiwgUCwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl9jbXBwZDUxMl9tYXNrKChfX3Y4ZGYpKF9fbTUxMmQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpKF9fbTUxMmQpKEIpLCAoaW50KShQKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX2NtcF9wZF9tYXNrKEEsIEIsIFApIFwKKyAgX21tNTEyX2NtcF9yb3VuZF9wZF9tYXNrKChBKSwgKEIpLCAoUCksIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTikKKworI2RlZmluZSBfbW01MTJfbWFza19jbXBfcGRfbWFzayhVLCBBLCBCLCBQKSBcCisgIF9tbTUxMl9tYXNrX2NtcF9yb3VuZF9wZF9tYXNrKChVKSwgKEEpLCAoQiksIChQKSwgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKQorCisvKiBDb252ZXJzaW9uICovCisKKyNkZWZpbmUgX21tNTEyX2N2dHRfcm91bmRwc19lcHUzMihBLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmkpX19idWlsdGluX2lhMzJfY3Z0dHBzMnVkcTUxMl9tYXNrKChfX3YxNnNmKShfX201MTIpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzaSlfbW01MTJfdW5kZWZpbmVkX2VwaTMyKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpLTEsIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza19jdnR0X3JvdW5kcHNfZXB1MzIoVywgVSwgQSwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX2N2dHRwczJ1ZHE1MTJfbWFzaygoX192MTZzZikoX19tNTEyKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpKF9fbTUxMmkpKFcpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KShVKSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrel9jdnR0X3JvdW5kcHNfZXB1MzIoVSwgQSwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX2N2dHRwczJ1ZHE1MTJfbWFzaygoX192MTZzZikoX19tNTEyKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpX21tNTEyX3NldHplcm9fc2k1MTIoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikoVSksIChpbnQpKFIpKTsgfSkKKworCitzdGF0aWMgX19pbmxpbmUgX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9jdnR0cHNfZXB1MzIoX19tNTEyIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9jdnR0cHMydWRxNTEyX21hc2sgKChfX3YxNnNmKSBfX0EsCisgICAgICAgICAgICAgICAgICAoX192MTZzaSkKKyAgICAgICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3NpNTEyICgpLAorICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgLTEsCisgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfY3Z0dHBzX2VwdTMyIChfX201MTJpIF9fVywgX19tbWFzazE2IF9fVSwgX19tNTEyIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9jdnR0cHMydWRxNTEyX21hc2sgKChfX3YxNnNmKSBfX0EsCisgICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpIF9fVywKKyAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UsCisgICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9jdnR0cHNfZXB1MzIgKF9fbW1hc2sxNiBfX1UsIF9fbTUxMiBfX0EpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfY3Z0dHBzMnVkcTUxMl9tYXNrICgoX192MTZzZikgX19BLAorICAgICAgICAgICAgICAgICAgIChfX3YxNnNpKSBfbW01MTJfc2V0emVyb19zaTUxMiAoKSwKKyAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UsCisgICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworI2RlZmluZSBfbW01MTJfY3Z0X3JvdW5kZXBpMzJfcHMoQSwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTIpX19idWlsdGluX2lhMzJfY3Z0ZHEycHM1MTJfbWFzaygoX192MTZzaSkoX19tNTEyaSkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKV9tbTUxMl9zZXR6ZXJvX3BzKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpLTEsIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza19jdnRfcm91bmRlcGkzMl9wcyhXLCBVLCBBLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMilfX2J1aWx0aW5faWEzMl9jdnRkcTJwczUxMl9tYXNrKChfX3YxNnNpKShfX201MTJpKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpKF9fbTUxMikoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpKFUpLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X2N2dF9yb3VuZGVwaTMyX3BzKFUsIEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyKV9fYnVpbHRpbl9pYTMyX2N2dGRxMnBzNTEyX21hc2soKF9fdjE2c2kpKF9fbTUxMmkpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZilfbW01MTJfc2V0emVyb19wcygpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KShVKSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9jdnRfcm91bmRlcHUzMl9wcyhBLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMilfX2J1aWx0aW5faWEzMl9jdnR1ZHEycHM1MTJfbWFzaygoX192MTZzaSkoX19tNTEyaSkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZilfbW01MTJfc2V0emVyb19wcygpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNiktMSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX2N2dF9yb3VuZGVwdTMyX3BzKFcsIFUsIEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyKV9fYnVpbHRpbl9pYTMyX2N2dHVkcTJwczUxMl9tYXNrKChfX3YxNnNpKShfX201MTJpKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKShfX201MTIpKFcpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikoVSksIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza3pfY3Z0X3JvdW5kZXB1MzJfcHMoVSwgQSwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTIpX19idWlsdGluX2lhMzJfY3Z0dWRxMnBzNTEyX21hc2soKF9fdjE2c2kpKF9fbTUxMmkpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpX21tNTEyX3NldHplcm9fcHMoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpKFUpLCAoaW50KShSKSk7IH0pCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9jdnRlcHUzMl9wcyAoX19tNTEyaSBfX0EpCit7CisgIHJldHVybiAoX19tNTEyKSBfX2J1aWx0aW5faWEzMl9jdnR1ZHEycHM1MTJfbWFzayAoKF9fdjE2c2kpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjE2c2YpIF9tbTUxMl91bmRlZmluZWRfcHMgKCksCisgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpIC0xLAorICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19jdnRlcHUzMl9wcyAoX19tNTEyIF9fVywgX19tbWFzazE2IF9fVSwgX19tNTEyaSBfX0EpCit7CisgIHJldHVybiAoX19tNTEyKSBfX2J1aWx0aW5faWEzMl9jdnR1ZHEycHM1MTJfbWFzayAoKF9fdjE2c2kpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjE2c2YpIF9fVywKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VLAorICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfY3Z0ZXB1MzJfcHMgKF9fbW1hc2sxNiBfX1UsIF9fbTUxMmkgX19BKQoreworICByZXR1cm4gKF9fbTUxMikgX19idWlsdGluX2lhMzJfY3Z0dWRxMnBzNTEyX21hc2sgKChfX3YxNnNpKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3YxNnNmKSBfbW01MTJfc2V0emVyb19wcyAoKSwKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VLAorICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCitzdGF0aWMgX19pbmxpbmUgX19tNTEyZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9jdnRlcGkzMl9wZChfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJkKSBfX2J1aWx0aW5faWEzMl9jdnRkcTJwZDUxMl9tYXNrICgoX192OHNpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjhkZikKKyAgICAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19wZCAoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2N2dGVwaTMyX3BkIChfX201MTJkIF9fVywgX19tbWFzazggX19VLCBfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJkKSBfX2J1aWx0aW5faWEzMl9jdnRkcTJwZDUxMl9tYXNrICgoX192OHNpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjhkZikgX19XLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9jdnRlcGkzMl9wZCAoX19tbWFzazggX19VLCBfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJkKSBfX2J1aWx0aW5faWEzMl9jdnRkcTJwZDUxMl9tYXNrICgoX192OHNpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjhkZikgX21tNTEyX3NldHplcm9fcGQgKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfY3Z0ZXBpMzJfcHMgKF9fbTUxMmkgX19BKQoreworICByZXR1cm4gKF9fbTUxMikgX19idWlsdGluX2lhMzJfY3Z0ZHEycHM1MTJfbWFzayAoKF9fdjE2c2kpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192MTZzZikgX21tNTEyX3VuZGVmaW5lZF9wcyAoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazE2KSAtMSwKKyAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19jdnRlcGkzMl9wcyAoX19tNTEyIF9fVywgX19tbWFzazE2IF9fVSwgX19tNTEyaSBfX0EpCit7CisgIHJldHVybiAoX19tNTEyKSBfX2J1aWx0aW5faWEzMl9jdnRkcTJwczUxMl9tYXNrICgoX192MTZzaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3YxNnNmKSBfX1csCisgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VLAorICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9jdnRlcGkzMl9wcyAoX19tbWFzazE2IF9fVSwgX19tNTEyaSBfX0EpCit7CisgIHJldHVybiAoX19tNTEyKSBfX2J1aWx0aW5faWEzMl9jdnRkcTJwczUxMl9tYXNrICgoX192MTZzaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3YxNnNmKSBfbW01MTJfc2V0emVyb19wcyAoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UsCisgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTUxMmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfY3Z0ZXB1MzJfcGQoX19tMjU2aSBfX0EpCit7CisgIHJldHVybiAoX19tNTEyZCkgX19idWlsdGluX2lhMzJfY3Z0dWRxMnBkNTEyX21hc2sgKChfX3Y4c2kpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192OGRmKQorICAgICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3BkICgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfY3Z0ZXB1MzJfcGQgKF9fbTUxMmQgX19XLCBfX21tYXNrOCBfX1UsIF9fbTI1NmkgX19BKQoreworICByZXR1cm4gKF9fbTUxMmQpIF9fYnVpbHRpbl9pYTMyX2N2dHVkcTJwZDUxMl9tYXNrICgoX192OHNpKSBfX0EsCisgICAgICAgICAgICAgICAgICAoX192OGRmKSBfX1csCisgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfY3Z0ZXB1MzJfcGQgKF9fbW1hc2s4IF9fVSwgX19tMjU2aSBfX0EpCit7CisgIHJldHVybiAoX19tNTEyZCkgX19idWlsdGluX2lhMzJfY3Z0dWRxMnBkNTEyX21hc2sgKChfX3Y4c2kpIF9fQSwKKyAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpIF9tbTUxMl9zZXR6ZXJvX3BkICgpLAorICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCisjZGVmaW5lIF9tbTUxMl9jdnRfcm91bmRwZF9wcyhBLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NilfX2J1aWx0aW5faWEzMl9jdnRwZDJwczUxMl9tYXNrKChfX3Y4ZGYpKF9fbTUxMmQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNmKV9tbTI1Nl9zZXR6ZXJvX3BzKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX2N2dF9yb3VuZHBkX3BzKFcsIFUsIEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2KV9fYnVpbHRpbl9pYTMyX2N2dHBkMnBzNTEyX21hc2soKF9fdjhkZikoX19tNTEyZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2YpKF9fbTI1NikoVyksIChfX21tYXNrOCkoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza3pfY3Z0X3JvdW5kcGRfcHMoVSwgQSwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTYpX19idWlsdGluX2lhMzJfY3Z0cGQycHM1MTJfbWFzaygoX192OGRmKShfX201MTJkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzZilfbW0yNTZfc2V0emVyb19wcygpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShSKSk7IH0pCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9jdnRwZF9wcyAoX19tNTEyZCBfX0EpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9jdnRwZDJwczUxMl9tYXNrICgoX192OGRmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjhzZikgX21tMjU2X3VuZGVmaW5lZF9wcyAoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xLAorICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2N2dHBkX3BzIChfX20yNTYgX19XLCBfX21tYXNrOCBfX1UsIF9fbTUxMmQgX19BKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfY3Z0cGQycHM1MTJfbWFzayAoKF9fdjhkZikgX19BLAorICAgICAgICAgICAgICAgIChfX3Y4c2YpIF9fVywKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfY3Z0cGRfcHMgKF9fbW1hc2s4IF9fVSwgX19tNTEyZCBfX0EpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9jdnRwZDJwczUxMl9tYXNrICgoX192OGRmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjhzZikgX21tMjU2X3NldHplcm9fcHMgKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworI2RlZmluZSBfbW01MTJfY3Z0X3JvdW5kcHNfcGgoQSwgSSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3ZjdnRwczJwaDUxMl9tYXNrKChfX3YxNnNmKShfX201MTIpKEEpLCAoaW50KShJKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZoaSlfbW0yNTZfdW5kZWZpbmVkX3NpMjU2KCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNiktMSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2tfY3Z0X3JvdW5kcHNfcGgoVSwgVywgQSwgSSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3ZjdnRwczJwaDUxMl9tYXNrKChfX3YxNnNmKShfX201MTIpKEEpLCAoaW50KShJKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZoaSkoX19tMjU2aSkoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikoVykpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrel9jdnRfcm91bmRwc19waChXLCBBLCBJKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmkpX19idWlsdGluX2lhMzJfdmN2dHBzMnBoNTEyX21hc2soKF9fdjE2c2YpKF9fbTUxMikoQSksIChpbnQpKEkpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNmhpKV9tbTI1Nl9zZXR6ZXJvX3NpMjU2KCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikoVykpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9jdnRwc19waChBLCBJKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmkpX19idWlsdGluX2lhMzJfdmN2dHBzMnBoNTEyX21hc2soKF9fdjE2c2YpKF9fbTUxMikoQSksIChpbnQpKEkpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNmhpKV9tbTI1Nl9zZXR6ZXJvX3NpMjU2KCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNiktMSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2tfY3Z0cHNfcGgoVSwgVywgQSwgSSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3ZjdnRwczJwaDUxMl9tYXNrKChfX3YxNnNmKShfX201MTIpKEEpLCAoaW50KShJKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZoaSkoX19tMjU2aSkoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikoVykpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrel9jdnRwc19waChXLCBBLCBJKSBfX2V4dGVuc2lvbl9fICh7XAorICAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl92Y3Z0cHMycGg1MTJfbWFzaygoX192MTZzZikoX19tNTEyKShBKSwgKGludCkoSSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2aGkpX21tMjU2X3NldHplcm9fc2kyNTYoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KShXKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX2N2dF9yb3VuZHBoX3BzKEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyKV9fYnVpbHRpbl9pYTMyX3ZjdnRwaDJwczUxMl9tYXNrKChfX3YxNmhpKShfX20yNTZpKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKV9tbTUxMl91bmRlZmluZWRfcHMoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpLTEsIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza19jdnRfcm91bmRwaF9wcyhXLCBVLCBBLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMilfX2J1aWx0aW5faWEzMl92Y3Z0cGgycHM1MTJfbWFzaygoX192MTZoaSkoX19tMjU2aSkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikoX19tNTEyKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpKFUpLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X2N2dF9yb3VuZHBoX3BzKFUsIEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyKV9fYnVpbHRpbl9pYTMyX3ZjdnRwaDJwczUxMl9tYXNrKChfX3YxNmhpKShfX20yNTZpKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKV9tbTUxMl9zZXR6ZXJvX3BzKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KShVKSwgKGludCkoUikpOyB9KQorCisKK3N0YXRpYyAgX19pbmxpbmUgX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2N2dHBoX3BzKF9fbTI1NmkgX19BKQoreworICByZXR1cm4gKF9fbTUxMikgX19idWlsdGluX2lhMzJfdmN2dHBoMnBzNTEyX21hc2sgKChfX3YxNmhpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjE2c2YpCisgICAgICAgICAgICAgICAgX21tNTEyX3NldHplcm9fcHMgKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgLTEsCisgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfY3Z0cGhfcHMgKF9fbTUxMiBfX1csIF9fbW1hc2sxNiBfX1UsIF9fbTI1NmkgX19BKQoreworICByZXR1cm4gKF9fbTUxMikgX19idWlsdGluX2lhMzJfdmN2dHBoMnBzNTEyX21hc2sgKChfX3YxNmhpKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3YxNnNmKSBfX1csCisgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSwKKyAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X2N2dHBoX3BzIChfX21tYXNrMTYgX19VLCBfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTIpIF9fYnVpbHRpbl9pYTMyX3ZjdnRwaDJwczUxMl9tYXNrICgoX192MTZoaSkgX19BLAorICAgICAgICAgICAgICAgICAoX192MTZzZikgX21tNTEyX3NldHplcm9fcHMgKCksCisgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSwKKyAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworI2RlZmluZSBfbW01MTJfY3Z0dF9yb3VuZHBkX2VwaTMyKEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9jdnR0cGQyZHE1MTJfbWFzaygoX192OGRmKShfX201MTJkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNpKV9tbTI1Nl9zZXR6ZXJvX3NpMjU2KCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2tfY3Z0dF9yb3VuZHBkX2VwaTMyKFcsIFUsIEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9jdnR0cGQyZHE1MTJfbWFzaygoX192OGRmKShfX201MTJkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNpKShfX20yNTZpKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X2N2dHRfcm91bmRwZF9lcGkzMihVLCBBLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmkpX19idWlsdGluX2lhMzJfY3Z0dHBkMmRxNTEyX21hc2soKF9fdjhkZikoX19tNTEyZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzaSlfbW0yNTZfc2V0emVyb19zaTI1NigpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIChpbnQpKFIpKTsgfSkKKworc3RhdGljIF9faW5saW5lIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfY3Z0dHBkX2VwaTMyKF9fbTUxMmQgX19hKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfY3Z0dHBkMmRxNTEyX21hc2soKF9fdjhkZikgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzaSlfbW0yNTZfc2V0emVyb19zaTI1NigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfY3Z0dHBkX2VwaTMyIChfX20yNTZpIF9fVywgX19tbWFzazggX19VLCBfX201MTJkIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9jdnR0cGQyZHE1MTJfbWFzayAoKF9fdjhkZikgX19BLAorICAgICAgICAgICAgICAgICAgKF9fdjhzaSkgX19XLAorICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X2N2dHRwZF9lcGkzMiAoX19tbWFzazggX19VLCBfX201MTJkIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9jdnR0cGQyZHE1MTJfbWFzayAoKF9fdjhkZikgX19BLAorICAgICAgICAgICAgICAgICAgKF9fdjhzaSkgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKKyNkZWZpbmUgX21tNTEyX2N2dHRfcm91bmRwc19lcGkzMihBLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmkpX19idWlsdGluX2lhMzJfY3Z0dHBzMmRxNTEyX21hc2soKF9fdjE2c2YpKF9fbTUxMikoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpX21tNTEyX3NldHplcm9fc2k1MTIoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KS0xLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2tfY3Z0dF9yb3VuZHBzX2VwaTMyKFcsIFUsIEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9jdnR0cHMyZHE1MTJfbWFzaygoX192MTZzZikoX19tNTEyKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzaSkoX19tNTEyaSkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikoVSksIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza3pfY3Z0dF9yb3VuZHBzX2VwaTMyKFUsIEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9jdnR0cHMyZHE1MTJfbWFzaygoX192MTZzZikoX19tNTEyKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzaSlfbW01MTJfc2V0emVyb19zaTUxMigpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpKFUpLCAoaW50KShSKSk7IH0pCisKK3N0YXRpYyBfX2lubGluZSBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2N2dHRwc19lcGkzMihfX201MTIgX19hKQoreworICByZXR1cm4gKF9fbTUxMmkpCisgICAgX19idWlsdGluX2lhMzJfY3Z0dHBzMmRxNTEyX21hc2soKF9fdjE2c2YpIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzaSkgX21tNTEyX3NldHplcm9fc2k1MTIgKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgLTEsIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19jdnR0cHNfZXBpMzIgKF9fbTUxMmkgX19XLCBfX21tYXNrMTYgX19VLCBfX201MTIgX19BKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX2N2dHRwczJkcTUxMl9tYXNrICgoX192MTZzZikgX19BLAorICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpIF9fVywKKyAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSwKKyAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfY3Z0dHBzX2VwaTMyIChfX21tYXNrMTYgX19VLCBfX201MTIgX19BKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX2N2dHRwczJkcTUxMl9tYXNrICgoX192MTZzZikgX19BLAorICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpIF9tbTUxMl9zZXR6ZXJvX3NpNTEyICgpLAorICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VLAorICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworI2RlZmluZSBfbW01MTJfY3Z0X3JvdW5kcHNfZXBpMzIoQSwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX2N2dHBzMmRxNTEyX21hc2soKF9fdjE2c2YpKF9fbTUxMikoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzaSlfbW01MTJfc2V0emVyb19zaTUxMigpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNiktMSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX2N2dF9yb3VuZHBzX2VwaTMyKFcsIFUsIEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9jdnRwczJkcTUxMl9tYXNrKChfX3YxNnNmKShfX201MTIpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpKF9fbTUxMmkpKFcpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikoVSksIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza3pfY3Z0X3JvdW5kcHNfZXBpMzIoVSwgQSwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX2N2dHBzMmRxNTEyX21hc2soKF9fdjE2c2YpKF9fbTUxMikoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzaSlfbW01MTJfc2V0emVyb19zaTUxMigpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikoVSksIChpbnQpKFIpKTsgfSkKKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9jdnRwc19lcGkzMiAoX19tNTEyIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9jdnRwczJkcTUxMl9tYXNrICgoX192MTZzZikgX19BLAorICAgICAgICAgICAgICAgICAoX192MTZzaSkgX21tNTEyX3VuZGVmaW5lZF9lcGkzMiAoKSwKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgLTEsCisgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19jdnRwc19lcGkzMiAoX19tNTEyaSBfX1csIF9fbW1hc2sxNiBfX1UsIF9fbTUxMiBfX0EpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfY3Z0cHMyZHE1MTJfbWFzayAoKF9fdjE2c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjE2c2kpIF9fVywKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VLAorICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X2N2dHBzX2VwaTMyIChfX21tYXNrMTYgX19VLCBfX201MTIgX19BKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX2N2dHBzMmRxNTEyX21hc2sgKChfX3YxNnNmKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3YxNnNpKQorICAgICAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19zaTUxMiAoKSwKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VLAorICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCisjZGVmaW5lIF9tbTUxMl9jdnRfcm91bmRwZF9lcGkzMihBLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmkpX19idWlsdGluX2lhMzJfY3Z0cGQyZHE1MTJfbWFzaygoX192OGRmKShfX201MTJkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2kpX21tMjU2X3NldHplcm9fc2kyNTYoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX2N2dF9yb3VuZHBkX2VwaTMyKFcsIFUsIEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9jdnRwZDJkcTUxMl9tYXNrKChfX3Y4ZGYpKF9fbTUxMmQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzaSkoX19tMjU2aSkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X2N2dF9yb3VuZHBkX2VwaTMyKFUsIEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9jdnRwZDJkcTUxMl9tYXNrKChfX3Y4ZGYpKF9fbTUxMmQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzaSlfbW0yNTZfc2V0emVyb19zaTI1NigpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSwgKGludCkoUikpOyB9KQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2N2dHBkX2VwaTMyIChfX201MTJkIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9jdnRwZDJkcTUxMl9tYXNrICgoX192OGRmKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3Y4c2kpCisgICAgICAgICAgICAgICAgIF9tbTI1Nl91bmRlZmluZWRfc2kyNTYgKCksCisgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEsCisgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19jdnRwZF9lcGkzMiAoX19tMjU2aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tNTEyZCBfX0EpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfY3Z0cGQyZHE1MTJfbWFzayAoKF9fdjhkZikgX19BLAorICAgICAgICAgICAgICAgICAoX192OHNpKSBfX1csCisgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X2N2dHBkX2VwaTMyIChfX21tYXNrOCBfX1UsIF9fbTUxMmQgX19BKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX2N2dHBkMmRxNTEyX21hc2sgKChfX3Y4ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjhzaSkKKyAgICAgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCisjZGVmaW5lIF9tbTUxMl9jdnRfcm91bmRwc19lcHUzMihBLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmkpX19idWlsdGluX2lhMzJfY3Z0cHMydWRxNTEyX21hc2soKF9fdjE2c2YpKF9fbTUxMikoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpX21tNTEyX3NldHplcm9fc2k1MTIoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KS0xLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2tfY3Z0X3JvdW5kcHNfZXB1MzIoVywgVSwgQSwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX2N2dHBzMnVkcTUxMl9tYXNrKChfX3YxNnNmKShfX201MTIpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNpKShfX201MTJpKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KShVKSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrel9jdnRfcm91bmRwc19lcHUzMihVLCBBLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmkpX19idWlsdGluX2lhMzJfY3Z0cHMydWRxNTEyX21hc2soKF9fdjE2c2YpKF9fbTUxMikoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpX21tNTEyX3NldHplcm9fc2k1MTIoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KShVKSwgKGludCkoUikpOyB9KQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2N2dHBzX2VwdTMyICggX19tNTEyIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9jdnRwczJ1ZHE1MTJfbWFzayAoKF9fdjE2c2YpIF9fQSxcCisgICAgICAgICAgICAgICAgICAoX192MTZzaSlcCisgICAgICAgICAgICAgICAgICBfbW01MTJfdW5kZWZpbmVkX2VwaTMyICgpLFwKKyAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpIC0xLFwKKyAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7XAorfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfY3Z0cHNfZXB1MzIgKF9fbTUxMmkgX19XLCBfX21tYXNrMTYgX19VLCBfX201MTIgX19BKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX2N2dHBzMnVkcTUxMl9tYXNrICgoX192MTZzZikgX19BLAorICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpIF9fVywKKyAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSwKKyAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfY3Z0cHNfZXB1MzIgKCBfX21tYXNrMTYgX19VLCBfX201MTIgX19BKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX2N2dHBzMnVkcTUxMl9tYXNrICgoX192MTZzZikgX19BLAorICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpIAorICAgICAgICAgICAgICAgICAgX21tNTEyX3NldHplcm9fc2k1MTIgKCksCisgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UgLAorICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworI2RlZmluZSBfbW01MTJfY3Z0X3JvdW5kcGRfZXB1MzIoQSwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX2N2dHBkMnVkcTUxMl9tYXNrKChfX3Y4ZGYpKF9fbTUxMmQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2kpX21tMjU2X3NldHplcm9fc2kyNTYoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEsIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza19jdnRfcm91bmRwZF9lcHUzMihXLCBVLCBBLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmkpX19idWlsdGluX2lhMzJfY3Z0cGQydWRxNTEyX21hc2soKF9fdjhkZikoX19tNTEyZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzaSkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrel9jdnRfcm91bmRwZF9lcHUzMihVLCBBLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmkpX19idWlsdGluX2lhMzJfY3Z0cGQydWRxNTEyX21hc2soKF9fdjhkZikoX19tNTEyZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzaSlfbW0yNTZfc2V0emVyb19zaTI1NigpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIChpbnQpKFIpKTsgfSkKKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9jdnRwZF9lcHUzMiAoX19tNTEyZCBfX0EpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfY3Z0cGQydWRxNTEyX21hc2sgKChfX3Y4ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAgIChfX3Y4c2kpCisgICAgICAgICAgICAgICAgICBfbW0yNTZfdW5kZWZpbmVkX3NpMjU2ICgpLAorICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSwKKyAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19jdnRwZF9lcHUzMiAoX19tMjU2aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tNTEyZCBfX0EpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfY3Z0cGQydWRxNTEyX21hc2sgKChfX3Y4ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAgIChfX3Y4c2kpIF9fVywKKyAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9jdnRwZF9lcHUzMiAoX19tbWFzazggX19VLCBfX201MTJkIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9jdnRwZDJ1ZHE1MTJfbWFzayAoKF9fdjhkZikgX19BLAorICAgICAgICAgICAgICAgICAgKF9fdjhzaSkKKyAgICAgICAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2ICgpLAorICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCisvKiBVbnBhY2sgYW5kIEludGVybGVhdmUgKi8KKworc3RhdGljIF9faW5saW5lIF9fbTUxMmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfdW5wYWNraGlfcGQoX19tNTEyZCBfX2EsIF9fbTUxMmQgX19iKQoreworICByZXR1cm4gKF9fbTUxMmQpX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjhkZilfX2EsIChfX3Y4ZGYpX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgOSwgMSsyLCA5KzIsIDErNCwgOSs0LCAxKzYsIDkrNik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza191bnBhY2toaV9wZChfX201MTJkIF9fVywgX19tbWFzazggX19VLCBfX201MTJkIF9fQSwgX19tNTEyZCBfX0IpCit7CisgIHJldHVybiAoX19tNTEyZClfX2J1aWx0aW5faWEzMl9zZWxlY3RwZF81MTIoKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZilfbW01MTJfdW5wYWNraGlfcGQoX19BLCBfX0IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpX19XKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel91bnBhY2toaV9wZChfX21tYXNrOCBfX1UsIF9fbTUxMmQgX19BLCBfX201MTJkIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJkKV9fYnVpbHRpbl9pYTMyX3NlbGVjdHBkXzUxMigoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKV9tbTUxMl91bnBhY2toaV9wZChfX0EsIF9fQiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZilfbW01MTJfc2V0emVyb19wZCgpKTsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTUxMmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfdW5wYWNrbG9fcGQoX19tNTEyZCBfX2EsIF9fbTUxMmQgX19iKQoreworICByZXR1cm4gKF9fbTUxMmQpX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjhkZilfX2EsIChfX3Y4ZGYpX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgOCwgMCsyLCA4KzIsIDArNCwgOCs0LCAwKzYsIDgrNik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza191bnBhY2tsb19wZChfX201MTJkIF9fVywgX19tbWFzazggX19VLCBfX201MTJkIF9fQSwgX19tNTEyZCBfX0IpCit7CisgIHJldHVybiAoX19tNTEyZClfX2J1aWx0aW5faWEzMl9zZWxlY3RwZF81MTIoKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZilfbW01MTJfdW5wYWNrbG9fcGQoX19BLCBfX0IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpX19XKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel91bnBhY2tsb19wZCAoX19tbWFzazggX19VLCBfX201MTJkIF9fQSwgX19tNTEyZCBfX0IpCit7CisgIHJldHVybiAoX19tNTEyZClfX2J1aWx0aW5faWEzMl9zZWxlY3RwZF81MTIoKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZilfbW01MTJfdW5wYWNrbG9fcGQoX19BLCBfX0IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpX21tNTEyX3NldHplcm9fcGQoKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfdW5wYWNraGlfcHMoX19tNTEyIF9fYSwgX19tNTEyIF9fYikKK3sKKyAgcmV0dXJuIChfX201MTIpX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjE2c2YpX19hLCAoX192MTZzZilfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsICAgIDE4LCAgICAzLCAgICAxOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMis0LCAgMTgrNCwgIDMrNCwgIDE5KzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIrOCwgIDE4KzgsICAzKzgsICAxOSs4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKzEyLCAxOCsxMiwgMysxMiwgMTkrMTIpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza191bnBhY2toaV9wcyhfX201MTIgX19XLCBfX21tYXNrMTYgX19VLCBfX201MTIgX19BLCBfX201MTIgX19CKQoreworICByZXR1cm4gKF9fbTUxMilfX2J1aWx0aW5faWEzMl9zZWxlY3Rwc181MTIoKF9fbW1hc2sxNikgX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpX21tNTEyX3VucGFja2hpX3BzKF9fQSwgX19CKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKV9fVyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel91bnBhY2toaV9wcyAoX19tbWFzazE2IF9fVSwgX19tNTEyIF9fQSwgX19tNTEyIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTIpX19idWlsdGluX2lhMzJfc2VsZWN0cHNfNTEyKChfX21tYXNrMTYpIF9fVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKV9tbTUxMl91bnBhY2toaV9wcyhfX0EsIF9fQiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZilfbW01MTJfc2V0emVyb19wcygpKTsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTUxMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl91bnBhY2tsb19wcyhfX201MTIgX19hLCBfX201MTIgX19iKQoreworICByZXR1cm4gKF9fbTUxMilfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcigoX192MTZzZilfX2EsIChfX3YxNnNmKV9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgMTYsICAgIDEsICAgIDE3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKzQsICAxNis0LCAgMSs0LCAgMTcrNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCs4LCAgMTYrOCwgIDErOCwgIDE3KzgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDArMTIsIDE2KzEyLCAxKzEyLCAxNysxMik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX3VucGFja2xvX3BzKF9fbTUxMiBfX1csIF9fbW1hc2sxNiBfX1UsIF9fbTUxMiBfX0EsIF9fbTUxMiBfX0IpCit7CisgIHJldHVybiAoX19tNTEyKV9fYnVpbHRpbl9pYTMyX3NlbGVjdHBzXzUxMigoX19tbWFzazE2KSBfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZilfbW01MTJfdW5wYWNrbG9fcHMoX19BLCBfX0IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpX19XKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X3VucGFja2xvX3BzIChfX21tYXNrMTYgX19VLCBfX201MTIgX19BLCBfX201MTIgX19CKQoreworICByZXR1cm4gKF9fbTUxMilfX2J1aWx0aW5faWEzMl9zZWxlY3Rwc181MTIoKF9fbW1hc2sxNikgX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpX21tNTEyX3VucGFja2xvX3BzKF9fQSwgX19CKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKV9tbTUxMl9zZXR6ZXJvX3BzKCkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX3VucGFja2hpX2VwaTMyKF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKV9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3YxNnNpKV9fQSwgKF9fdjE2c2kpX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgICAgMTgsICAgIDMsICAgIDE5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMis0LCAgMTgrNCwgIDMrNCwgIDE5KzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKzgsICAxOCs4LCAgMys4LCAgMTkrOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIrMTIsIDE4KzEyLCAzKzEyLCAxOSsxMik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza191bnBhY2toaV9lcGkzMihfX201MTJpIF9fVywgX19tbWFzazE2IF9fVSwgX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpX19idWlsdGluX2lhMzJfc2VsZWN0ZF81MTIoKF9fbW1hc2sxNikgX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpX21tNTEyX3VucGFja2hpX2VwaTMyKF9fQSwgX19CKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNpKV9fVyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfdW5wYWNraGlfZXBpMzIoX19tbWFzazE2IF9fVSwgX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpX19idWlsdGluX2lhMzJfc2VsZWN0ZF81MTIoKF9fbW1hc2sxNikgX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpX21tNTEyX3VucGFja2hpX2VwaTMyKF9fQSwgX19CKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNpKV9tbTUxMl9zZXR6ZXJvX3NpNTEyKCkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX3VucGFja2xvX2VwaTMyKF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKV9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3YxNnNpKV9fQSwgKF9fdjE2c2kpX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgMTYsICAgIDEsICAgIDE3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCs0LCAgMTYrNCwgIDErNCwgIDE3KzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKzgsICAxNis4LCAgMSs4LCAgMTcrOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDArMTIsIDE2KzEyLCAxKzEyLCAxNysxMik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza191bnBhY2tsb19lcGkzMihfX201MTJpIF9fVywgX19tbWFzazE2IF9fVSwgX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpX19idWlsdGluX2lhMzJfc2VsZWN0ZF81MTIoKF9fbW1hc2sxNikgX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpX21tNTEyX3VucGFja2xvX2VwaTMyKF9fQSwgX19CKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNpKV9fVyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfdW5wYWNrbG9fZXBpMzIoX19tbWFzazE2IF9fVSwgX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpX19idWlsdGluX2lhMzJfc2VsZWN0ZF81MTIoKF9fbW1hc2sxNikgX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpX21tNTEyX3VucGFja2xvX2VwaTMyKF9fQSwgX19CKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNpKV9tbTUxMl9zZXR6ZXJvX3NpNTEyKCkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX3VucGFja2hpX2VwaTY0KF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKV9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3Y4ZGkpX19BLCAoX192OGRpKV9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDksIDErMiwgOSsyLCAxKzQsIDkrNCwgMSs2LCA5KzYpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfdW5wYWNraGlfZXBpNjQoX19tNTEyaSBfX1csIF9fbW1hc2s4IF9fVSwgX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpX19idWlsdGluX2lhMzJfc2VsZWN0cV81MTIoKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkaSlfbW01MTJfdW5wYWNraGlfZXBpNjQoX19BLCBfX0IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGkpX19XKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel91bnBhY2toaV9lcGk2NChfX21tYXNrOCBfX1UsIF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX3NlbGVjdHFfNTEyKChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGkpX21tNTEyX3VucGFja2hpX2VwaTY0KF9fQSwgX19CKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKV9tbTUxMl9zZXR6ZXJvX3NpNTEyKCkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX3VucGFja2xvX2VwaTY0IChfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSlfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcigoX192OGRpKV9fQSwgKF9fdjhkaSlfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCA4LCAwKzIsIDgrMiwgMCs0LCA4KzQsIDArNiwgOCs2KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX3VucGFja2xvX2VwaTY0IChfX201MTJpIF9fVywgX19tbWFzazggX19VLCBfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9zZWxlY3RxXzUxMigoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKV9tbTUxMl91bnBhY2tsb19lcGk2NChfX0EsIF9fQiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkaSlfX1cpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X3VucGFja2xvX2VwaTY0IChfX21tYXNrOCBfX1UsIF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX3NlbGVjdHFfNTEyKChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGkpX21tNTEyX3VucGFja2xvX2VwaTY0KF9fQSwgX19CKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKV9tbTUxMl9zZXR6ZXJvX3NpNTEyKCkpOworfQorCisvKiBCaXQgVGVzdCAqLworCitzdGF0aWMgX19pbmxpbmUgX19tbWFzazE2IF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX3Rlc3RfZXBpMzJfbWFzayhfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tbWFzazE2KSBfX2J1aWx0aW5faWEzMl9wdGVzdG1kNTEyICgoX192MTZzaSkgX19BLAorICAgICAgICAgICAgKF9fdjE2c2kpIF9fQiwKKyAgICAgICAgICAgIChfX21tYXNrMTYpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazE2IF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfdGVzdF9lcGkzMl9tYXNrIChfX21tYXNrMTYgX19VLCBfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tbWFzazE2KSBfX2J1aWx0aW5faWEzMl9wdGVzdG1kNTEyICgoX192MTZzaSkgX19BLAorICAgICAgICAgICAgICAgICAoX192MTZzaSkgX19CLCBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmUgX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfdGVzdF9lcGk2NF9tYXNrKF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX21tYXNrOCkgX19idWlsdGluX2lhMzJfcHRlc3RtcTUxMiAoKF9fdjhkaSkgX19BLAorICAgICAgICAgICAgICAgICAoX192OGRpKSBfX0IsCisgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX3Rlc3RfZXBpNjRfbWFzayAoX19tbWFzazggX19VLCBfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tbWFzazgpIF9fYnVpbHRpbl9pYTMyX3B0ZXN0bXE1MTIgKChfX3Y4ZGkpIF9fQSwgKF9fdjhkaSkgX19CLCBfX1UpOworfQorCisKKy8qIFNJTUQgbG9hZCBvcHMgKi8KKworc3RhdGljIF9faW5saW5lIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbG9hZHVfc2k1MTIgKHZvaWQgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9sb2FkZHF1c2k1MTJfbWFzayAoKGNvbnN0IGludCAqKSBfX1AsCisgICAgICAgICAgICAgICAgICAoX192MTZzaSkKKyAgICAgICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3NpNTEyICgpLAorICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmUgX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2xvYWR1X2VwaTMyIChfX201MTJpIF9fVywgX19tbWFzazE2IF9fVSwgdm9pZCBjb25zdCAqX19QKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX2xvYWRkcXVzaTUxMl9tYXNrICgoY29uc3QgaW50ICopIF9fUCwKKyAgICAgICAgICAgICAgICAgIChfX3YxNnNpKSBfX1csCisgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCisKK3N0YXRpYyBfX2lubGluZSBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X2xvYWR1X2VwaTMyKF9fbW1hc2sxNiBfX1UsIHZvaWQgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9sb2FkZHF1c2k1MTJfbWFzayAoKGNvbnN0IGludCAqKV9fUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3NpNTEyICgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmUgX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2xvYWR1X2VwaTY0IChfX201MTJpIF9fVywgX19tbWFzazggX19VLCB2b2lkIGNvbnN0ICpfX1ApCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfbG9hZGRxdWRpNTEyX21hc2sgKChjb25zdCBsb25nIGxvbmcgKikgX19QLAorICAgICAgICAgICAgICAgICAgKF9fdjhkaSkgX19XLAorICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmUgX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9sb2FkdV9lcGk2NChfX21tYXNrOCBfX1UsIHZvaWQgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9sb2FkZHF1ZGk1MTJfbWFzayAoKGNvbnN0IGxvbmcgbG9uZyAqKV9fUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkaSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21tNTEyX3NldHplcm9fc2k1MTIgKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTUxMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2xvYWR1X3BzIChfX201MTIgX19XLCBfX21tYXNrMTYgX19VLCB2b2lkIGNvbnN0ICpfX1ApCit7CisgIHJldHVybiAoX19tNTEyKSBfX2J1aWx0aW5faWEzMl9sb2FkdXBzNTEyX21hc2sgKChjb25zdCBmbG9hdCAqKSBfX1AsCisgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpIF9fVywKKyAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmUgX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X2xvYWR1X3BzKF9fbW1hc2sxNiBfX1UsIHZvaWQgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuIChfX201MTIpIF9fYnVpbHRpbl9pYTMyX2xvYWR1cHM1MTJfbWFzayAoKGNvbnN0IGZsb2F0ICopX19QLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21tNTEyX3NldHplcm9fcHMgKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfbG9hZHVfcGQgKF9fbTUxMmQgX19XLCBfX21tYXNrOCBfX1UsIHZvaWQgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuIChfX201MTJkKSBfX2J1aWx0aW5faWEzMl9sb2FkdXBkNTEyX21hc2sgKChjb25zdCBkb3VibGUgKikgX19QLAorICAgICAgICAgICAgICAgIChfX3Y4ZGYpIF9fVywKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X2xvYWR1X3BkKF9fbW1hc2s4IF9fVSwgdm9pZCBjb25zdCAqX19QKQoreworICByZXR1cm4gKF9fbTUxMmQpIF9fYnVpbHRpbl9pYTMyX2xvYWR1cGQ1MTJfbWFzayAoKGNvbnN0IGRvdWJsZSAqKV9fUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19wZCAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTUxMmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbG9hZHVfcGQoZG91YmxlIGNvbnN0ICpfX3ApCit7CisgIHN0cnVjdCBfX2xvYWR1X3BkIHsKKyAgICBfX201MTJkIF9fdjsKKyAgfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fLCBfX21heV9hbGlhc19fKSk7CisgIHJldHVybiAoKHN0cnVjdCBfX2xvYWR1X3BkKilfX3ApLT5fX3Y7Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbG9hZHVfcHMoZmxvYXQgY29uc3QgKl9fcCkKK3sKKyAgc3RydWN0IF9fbG9hZHVfcHMgeworICAgIF9fbTUxMiBfX3Y7CisgIH0gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXywgX19tYXlfYWxpYXNfXykpOworICByZXR1cm4gKChzdHJ1Y3QgX19sb2FkdV9wcyopX19wKS0+X192OworfQorCitzdGF0aWMgX19pbmxpbmUgX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2xvYWRfcHMoZmxvYXQgY29uc3QgKl9fcCkKK3sKKyAgcmV0dXJuIChfX201MTIpIF9fYnVpbHRpbl9pYTMyX2xvYWRhcHM1MTJfbWFzayAoKGNvbnN0IF9fdjE2c2YgKilfX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19wcyAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmUgX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfbG9hZF9wcyAoX19tNTEyIF9fVywgX19tbWFzazE2IF9fVSwgdm9pZCBjb25zdCAqX19QKQoreworICByZXR1cm4gKF9fbTUxMikgX19idWlsdGluX2lhMzJfbG9hZGFwczUxMl9tYXNrICgoY29uc3QgX192MTZzZiAqKSBfX1AsCisgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpIF9fVywKKyAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmUgX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X2xvYWRfcHMoX19tbWFzazE2IF9fVSwgdm9pZCBjb25zdCAqX19QKQoreworICByZXR1cm4gKF9fbTUxMikgX19idWlsdGluX2lhMzJfbG9hZGFwczUxMl9tYXNrICgoY29uc3QgX192MTZzZiAqKV9fUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3BzICgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmUgX19tNTEyZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9sb2FkX3BkKGRvdWJsZSBjb25zdCAqX19wKQoreworICByZXR1cm4gKF9fbTUxMmQpIF9fYnVpbHRpbl9pYTMyX2xvYWRhcGQ1MTJfbWFzayAoKGNvbnN0IF9fdjhkZiAqKV9fcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19wZCAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmUgX19tNTEyZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2xvYWRfcGQgKF9fbTUxMmQgX19XLCBfX21tYXNrOCBfX1UsIHZvaWQgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuIChfX201MTJkKSBfX2J1aWx0aW5faWEzMl9sb2FkYXBkNTEyX21hc2sgKChjb25zdCBfX3Y4ZGYgKikgX19QLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKSBfX1csCisgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTUxMmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfbG9hZF9wZChfX21tYXNrOCBfX1UsIHZvaWQgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuIChfX201MTJkKSBfX2J1aWx0aW5faWEzMl9sb2FkYXBkNTEyX21hc2sgKChjb25zdCBfX3Y4ZGYgKilfX1AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21tNTEyX3NldHplcm9fcGQgKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2xvYWRfc2k1MTIgKHZvaWQgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuICooX19tNTEyaSAqKSBfX1A7Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2xvYWRfZXBpMzIgKHZvaWQgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuICooX19tNTEyaSAqKSBfX1A7Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2xvYWRfZXBpNjQgKHZvaWQgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuICooX19tNTEyaSAqKSBfX1A7Cit9CisKKy8qIFNJTUQgc3RvcmUgb3BzICovCisKK3N0YXRpYyBfX2lubGluZSB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfc3RvcmV1X2VwaTY0KHZvaWQgKl9fUCwgX19tbWFzazggX19VLCBfX201MTJpIF9fQSkKK3sKKyAgX19idWlsdGluX2lhMzJfc3RvcmVkcXVkaTUxMl9tYXNrICgobG9uZyBsb25nICopX19QLCAoX192OGRpKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9zdG9yZXVfc2k1MTIgKHZvaWQgKl9fUCwgX19tNTEyaSBfX0EpCit7CisgIF9fYnVpbHRpbl9pYTMyX3N0b3JlZHF1c2k1MTJfbWFzayAoKGludCAqKSBfX1AsIChfX3YxNnNpKSBfX0EsCisgICAgICAgICAgICAoX19tbWFzazE2KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfc3RvcmV1X2VwaTMyKHZvaWQgKl9fUCwgX19tbWFzazE2IF9fVSwgX19tNTEyaSBfX0EpCit7CisgIF9fYnVpbHRpbl9pYTMyX3N0b3JlZHF1c2k1MTJfbWFzayAoKGludCAqKV9fUCwgKF9fdjE2c2kpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX3N0b3JldV9wZCh2b2lkICpfX1AsIF9fbW1hc2s4IF9fVSwgX19tNTEyZCBfX0EpCit7CisgIF9fYnVpbHRpbl9pYTMyX3N0b3JldXBkNTEyX21hc2sgKChkb3VibGUgKilfX1AsIChfX3Y4ZGYpIF9fQSwgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9zdG9yZXVfcGQodm9pZCAqX19QLCBfX201MTJkIF9fQSkKK3sKKyAgX19idWlsdGluX2lhMzJfc3RvcmV1cGQ1MTJfbWFzaygoZG91YmxlICopX19QLCAoX192OGRmKV9fQSwgKF9fbW1hc2s4KS0xKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19zdG9yZXVfcHModm9pZCAqX19QLCBfX21tYXNrMTYgX19VLCBfX201MTIgX19BKQoreworICBfX2J1aWx0aW5faWEzMl9zdG9yZXVwczUxMl9tYXNrICgoZmxvYXQgKilfX1AsIChfX3YxNnNmKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX3N0b3JldV9wcyh2b2lkICpfX1AsIF9fbTUxMiBfX0EpCit7CisgIF9fYnVpbHRpbl9pYTMyX3N0b3JldXBzNTEyX21hc2soKGZsb2F0ICopX19QLCAoX192MTZzZilfX0EsIChfX21tYXNrMTYpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX3N0b3JlX3BkKHZvaWQgKl9fUCwgX19tbWFzazggX19VLCBfX201MTJkIF9fQSkKK3sKKyAgX19idWlsdGluX2lhMzJfc3RvcmVhcGQ1MTJfbWFzayAoKF9fdjhkZiAqKV9fUCwgKF9fdjhkZikgX19BLCAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX3N0b3JlX3BkKHZvaWQgKl9fUCwgX19tNTEyZCBfX0EpCit7CisgICooX19tNTEyZCopX19QID0gX19BOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX3N0b3JlX3BzKHZvaWQgKl9fUCwgX19tbWFzazE2IF9fVSwgX19tNTEyIF9fQSkKK3sKKyAgX19idWlsdGluX2lhMzJfc3RvcmVhcHM1MTJfbWFzayAoKF9fdjE2c2YgKilfX1AsIChfX3YxNnNmKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX3N0b3JlX3BzKHZvaWQgKl9fUCwgX19tNTEyIF9fQSkKK3sKKyAgKihfX201MTIqKV9fUCA9IF9fQTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfc3RvcmVfc2k1MTIgKHZvaWQgKl9fUCwgX19tNTEyaSBfX0EpCit7CisgICooX19tNTEyaSAqKSBfX1AgPSBfX0E7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX3N0b3JlX2VwaTMyICh2b2lkICpfX1AsIF9fbTUxMmkgX19BKQoreworICAqKF9fbTUxMmkgKikgX19QID0gX19BOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9zdG9yZV9lcGk2NCAodm9pZCAqX19QLCBfX201MTJpIF9fQSkKK3sKKyAgKihfX201MTJpICopIF9fUCA9IF9fQTsKK30KKworLyogTWFzayBvcHMgKi8KKworc3RhdGljIF9faW5saW5lIF9fbW1hc2sxNiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9rbm90KF9fbW1hc2sxNiBfX00pCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9rbm90aGkoX19NKTsKK30KKworLyogSW50ZWdlciBjb21wYXJlICovCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2sxNiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9jbXBlcV9lcGkzMl9tYXNrKF9fbTUxMmkgX19hLCBfX201MTJpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2sxNilfX2J1aWx0aW5faWEzMl9wY21wZXFkNTEyX21hc2soKF9fdjE2c2kpX19hLCAoX192MTZzaSlfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazE2IF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfY21wZXFfZXBpMzJfbWFzayhfX21tYXNrMTYgX191LCBfX201MTJpIF9fYSwgX19tNTEyaSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrMTYpX19idWlsdGluX2lhMzJfcGNtcGVxZDUxMl9tYXNrKChfX3YxNnNpKV9fYSwgKF9fdjE2c2kpX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazE2IF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2NtcGVxX2VwdTMyX21hc2soX19tNTEyaSBfX2EsIF9fbTUxMmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazE2KV9fYnVpbHRpbl9pYTMyX3VjbXBkNTEyX21hc2soKF9fdjE2c2kpX19hLCAoX192MTZzaSlfX2IsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNiktMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2sxNiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2NtcGVxX2VwdTMyX21hc2soX19tbWFzazE2IF9fdSwgX19tNTEyaSBfX2EsIF9fbTUxMmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazE2KV9fYnVpbHRpbl9pYTMyX3VjbXBkNTEyX21hc2soKF9fdjE2c2kpX19hLCAoX192MTZzaSlfX2IsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19jbXBlcV9lcGk2NF9tYXNrKF9fbW1hc2s4IF9fdSwgX19tNTEyaSBfX2EsIF9fbTUxMmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfcGNtcGVxcTUxMl9tYXNrKChfX3Y4ZGkpX19hLCAoX192OGRpKV9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfY21wZXFfZXBpNjRfbWFzayhfX201MTJpIF9fYSwgX19tNTEyaSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl9wY21wZXFxNTEyX21hc2soKF9fdjhkaSlfX2EsIChfX3Y4ZGkpX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9jbXBlcV9lcHU2NF9tYXNrKF9fbTUxMmkgX19hLCBfX201MTJpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX3VjbXBxNTEyX21hc2soKF9fdjhkaSlfX2EsIChfX3Y4ZGkpX19iLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19jbXBlcV9lcHU2NF9tYXNrKF9fbW1hc2s4IF9fdSwgX19tNTEyaSBfX2EsIF9fbTUxMmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfdWNtcHE1MTJfbWFzaygoX192OGRpKV9fYSwgKF9fdjhkaSlfX2IsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfY21wZ2VfZXBpMzJfbWFzayhfX201MTJpIF9fYSwgX19tNTEyaSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrMTYpX19idWlsdGluX2lhMzJfY21wZDUxMl9tYXNrKChfX3YxNnNpKV9fYSwgKF9fdjE2c2kpX19iLCA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNiktMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2sxNiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2NtcGdlX2VwaTMyX21hc2soX19tbWFzazE2IF9fdSwgX19tNTEyaSBfX2EsIF9fbTUxMmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazE2KV9fYnVpbHRpbl9pYTMyX2NtcGQ1MTJfbWFzaygoX192MTZzaSlfX2EsIChfX3YxNnNpKV9fYiwgNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2sxNiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9jbXBnZV9lcHUzMl9tYXNrKF9fbTUxMmkgX19hLCBfX201MTJpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2sxNilfX2J1aWx0aW5faWEzMl91Y21wZDUxMl9tYXNrKChfX3YxNnNpKV9fYSwgKF9fdjE2c2kpX19iLCA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19jbXBnZV9lcHUzMl9tYXNrKF9fbW1hc2sxNiBfX3UsIF9fbTUxMmkgX19hLCBfX201MTJpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2sxNilfX2J1aWx0aW5faWEzMl91Y21wZDUxMl9tYXNrKChfX3YxNnNpKV9fYSwgKF9fdjE2c2kpX19iLCA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2NtcGdlX2VwaTY0X21hc2soX19tNTEyaSBfX2EsIF9fbTUxMmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfY21wcTUxMl9tYXNrKChfX3Y4ZGkpX19hLCAoX192OGRpKV9fYiwgNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19jbXBnZV9lcGk2NF9tYXNrKF9fbW1hc2s4IF9fdSwgX19tNTEyaSBfX2EsIF9fbTUxMmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfY21wcTUxMl9tYXNrKChfX3Y4ZGkpX19hLCAoX192OGRpKV9fYiwgNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfY21wZ2VfZXB1NjRfbWFzayhfX201MTJpIF9fYSwgX19tNTEyaSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl91Y21wcTUxMl9tYXNrKChfX3Y4ZGkpX19hLCAoX192OGRpKV9fYiwgNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfY21wZ2VfZXB1NjRfbWFzayhfX21tYXNrOCBfX3UsIF9fbTUxMmkgX19hLCBfX201MTJpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX3VjbXBxNTEyX21hc2soKF9fdjhkaSlfX2EsIChfX3Y4ZGkpX19iLCA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazE2IF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2NtcGd0X2VwaTMyX21hc2soX19tNTEyaSBfX2EsIF9fbTUxMmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazE2KV9fYnVpbHRpbl9pYTMyX3BjbXBndGQ1MTJfbWFzaygoX192MTZzaSlfX2EsIChfX3YxNnNpKV9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19jbXBndF9lcGkzMl9tYXNrKF9fbW1hc2sxNiBfX3UsIF9fbTUxMmkgX19hLCBfX201MTJpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2sxNilfX2J1aWx0aW5faWEzMl9wY21wZ3RkNTEyX21hc2soKF9fdjE2c2kpX19hLCAoX192MTZzaSlfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfY21wZ3RfZXB1MzJfbWFzayhfX201MTJpIF9fYSwgX19tNTEyaSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrMTYpX19idWlsdGluX2lhMzJfdWNtcGQ1MTJfbWFzaygoX192MTZzaSlfX2EsIChfX3YxNnNpKV9fYiwgNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazE2IF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfY21wZ3RfZXB1MzJfbWFzayhfX21tYXNrMTYgX191LCBfX201MTJpIF9fYSwgX19tNTEyaSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrMTYpX19idWlsdGluX2lhMzJfdWNtcGQ1MTJfbWFzaygoX192MTZzaSlfX2EsIChfX3YxNnNpKV9fYiwgNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2NtcGd0X2VwaTY0X21hc2soX19tbWFzazggX191LCBfX201MTJpIF9fYSwgX19tNTEyaSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl9wY21wZ3RxNTEyX21hc2soKF9fdjhkaSlfX2EsIChfX3Y4ZGkpX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9jbXBndF9lcGk2NF9tYXNrKF9fbTUxMmkgX19hLCBfX201MTJpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX3BjbXBndHE1MTJfbWFzaygoX192OGRpKV9fYSwgKF9fdjhkaSlfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2NtcGd0X2VwdTY0X21hc2soX19tNTEyaSBfX2EsIF9fbTUxMmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfdWNtcHE1MTJfbWFzaygoX192OGRpKV9fYSwgKF9fdjhkaSlfX2IsIDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2NtcGd0X2VwdTY0X21hc2soX19tbWFzazggX191LCBfX201MTJpIF9fYSwgX19tNTEyaSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl91Y21wcTUxMl9tYXNrKChfX3Y4ZGkpX19hLCAoX192OGRpKV9fYiwgNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2sxNiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9jbXBsZV9lcGkzMl9tYXNrKF9fbTUxMmkgX19hLCBfX201MTJpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2sxNilfX2J1aWx0aW5faWEzMl9jbXBkNTEyX21hc2soKF9fdjE2c2kpX19hLCAoX192MTZzaSlfX2IsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazE2IF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfY21wbGVfZXBpMzJfbWFzayhfX21tYXNrMTYgX191LCBfX201MTJpIF9fYSwgX19tNTEyaSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrMTYpX19idWlsdGluX2lhMzJfY21wZDUxMl9tYXNrKChfX3YxNnNpKV9fYSwgKF9fdjE2c2kpX19iLCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazE2IF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2NtcGxlX2VwdTMyX21hc2soX19tNTEyaSBfX2EsIF9fbTUxMmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazE2KV9fYnVpbHRpbl9pYTMyX3VjbXBkNTEyX21hc2soKF9fdjE2c2kpX19hLCAoX192MTZzaSlfX2IsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNiktMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2sxNiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2NtcGxlX2VwdTMyX21hc2soX19tbWFzazE2IF9fdSwgX19tNTEyaSBfX2EsIF9fbTUxMmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazE2KV9fYnVpbHRpbl9pYTMyX3VjbXBkNTEyX21hc2soKF9fdjE2c2kpX19hLCAoX192MTZzaSlfX2IsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfY21wbGVfZXBpNjRfbWFzayhfX201MTJpIF9fYSwgX19tNTEyaSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl9jbXBxNTEyX21hc2soKF9fdjhkaSlfX2EsIChfX3Y4ZGkpX19iLCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2NtcGxlX2VwaTY0X21hc2soX19tbWFzazggX191LCBfX201MTJpIF9fYSwgX19tNTEyaSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl9jbXBxNTEyX21hc2soKF9fdjhkaSlfX2EsIChfX3Y4ZGkpX19iLCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9jbXBsZV9lcHU2NF9tYXNrKF9fbTUxMmkgX19hLCBfX201MTJpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX3VjbXBxNTEyX21hc2soKF9fdjhkaSlfX2EsIChfX3Y4ZGkpX19iLCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19jbXBsZV9lcHU2NF9tYXNrKF9fbW1hc2s4IF9fdSwgX19tNTEyaSBfX2EsIF9fbTUxMmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfdWNtcHE1MTJfbWFzaygoX192OGRpKV9fYSwgKF9fdjhkaSlfX2IsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfY21wbHRfZXBpMzJfbWFzayhfX201MTJpIF9fYSwgX19tNTEyaSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrMTYpX19idWlsdGluX2lhMzJfY21wZDUxMl9tYXNrKChfX3YxNnNpKV9fYSwgKF9fdjE2c2kpX19iLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNiktMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2sxNiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2NtcGx0X2VwaTMyX21hc2soX19tbWFzazE2IF9fdSwgX19tNTEyaSBfX2EsIF9fbTUxMmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazE2KV9fYnVpbHRpbl9pYTMyX2NtcGQ1MTJfbWFzaygoX192MTZzaSlfX2EsIChfX3YxNnNpKV9fYiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2sxNiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9jbXBsdF9lcHUzMl9tYXNrKF9fbTUxMmkgX19hLCBfX201MTJpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2sxNilfX2J1aWx0aW5faWEzMl91Y21wZDUxMl9tYXNrKChfX3YxNnNpKV9fYSwgKF9fdjE2c2kpX19iLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19jbXBsdF9lcHUzMl9tYXNrKF9fbW1hc2sxNiBfX3UsIF9fbTUxMmkgX19hLCBfX201MTJpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2sxNilfX2J1aWx0aW5faWEzMl91Y21wZDUxMl9tYXNrKChfX3YxNnNpKV9fYSwgKF9fdjE2c2kpX19iLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2NtcGx0X2VwaTY0X21hc2soX19tNTEyaSBfX2EsIF9fbTUxMmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfY21wcTUxMl9tYXNrKChfX3Y4ZGkpX19hLCAoX192OGRpKV9fYiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19jbXBsdF9lcGk2NF9tYXNrKF9fbW1hc2s4IF9fdSwgX19tNTEyaSBfX2EsIF9fbTUxMmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfY21wcTUxMl9tYXNrKChfX3Y4ZGkpX19hLCAoX192OGRpKV9fYiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfY21wbHRfZXB1NjRfbWFzayhfX201MTJpIF9fYSwgX19tNTEyaSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl91Y21wcTUxMl9tYXNrKChfX3Y4ZGkpX19hLCAoX192OGRpKV9fYiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfY21wbHRfZXB1NjRfbWFzayhfX21tYXNrOCBfX3UsIF9fbTUxMmkgX19hLCBfX201MTJpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX3VjbXBxNTEyX21hc2soKF9fdjhkaSlfX2EsIChfX3Y4ZGkpX19iLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazE2IF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2NtcG5lcV9lcGkzMl9tYXNrKF9fbTUxMmkgX19hLCBfX201MTJpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2sxNilfX2J1aWx0aW5faWEzMl9jbXBkNTEyX21hc2soKF9fdjE2c2kpX19hLCAoX192MTZzaSlfX2IsIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazE2IF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfY21wbmVxX2VwaTMyX21hc2soX19tbWFzazE2IF9fdSwgX19tNTEyaSBfX2EsIF9fbTUxMmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazE2KV9fYnVpbHRpbl9pYTMyX2NtcGQ1MTJfbWFzaygoX192MTZzaSlfX2EsIChfX3YxNnNpKV9fYiwgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2sxNiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9jbXBuZXFfZXB1MzJfbWFzayhfX201MTJpIF9fYSwgX19tNTEyaSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrMTYpX19idWlsdGluX2lhMzJfdWNtcGQ1MTJfbWFzaygoX192MTZzaSlfX2EsIChfX3YxNnNpKV9fYiwgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazE2IF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfY21wbmVxX2VwdTMyX21hc2soX19tbWFzazE2IF9fdSwgX19tNTEyaSBfX2EsIF9fbTUxMmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazE2KV9fYnVpbHRpbl9pYTMyX3VjbXBkNTEyX21hc2soKF9fdjE2c2kpX19hLCAoX192MTZzaSlfX2IsIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfY21wbmVxX2VwaTY0X21hc2soX19tNTEyaSBfX2EsIF9fbTUxMmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfY21wcTUxMl9tYXNrKChfX3Y4ZGkpX19hLCAoX192OGRpKV9fYiwgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19jbXBuZXFfZXBpNjRfbWFzayhfX21tYXNrOCBfX3UsIF9fbTUxMmkgX19hLCBfX201MTJpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX2NtcHE1MTJfbWFzaygoX192OGRpKV9fYSwgKF9fdjhkaSlfX2IsIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2NtcG5lcV9lcHU2NF9tYXNrKF9fbTUxMmkgX19hLCBfX201MTJpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX3VjbXBxNTEyX21hc2soKF9fdjhkaSlfX2EsIChfX3Y4ZGkpX19iLCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19jbXBuZXFfZXB1NjRfbWFzayhfX21tYXNrOCBfX3UsIF9fbTUxMmkgX19hLCBfX201MTJpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX3VjbXBxNTEyX21hc2soKF9fdjhkaSlfX2EsIChfX3Y4ZGkpX19iLCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9jdnRlcGk4X2VwaTMyIChfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbW92c3hiZDUxMl9tYXNrICgoX192MTZxaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3YxNnNpKQorICAgICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3NpNTEyICgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrMTYpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2N2dGVwaThfZXBpMzIgKF9fbTUxMmkgX19XLCBfX21tYXNrMTYgX19VLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbW92c3hiZDUxMl9tYXNrICgoX192MTZxaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3YxNnNpKSBfX1csCisgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9jdnRlcGk4X2VwaTMyIChfX21tYXNrMTYgX19VLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbW92c3hiZDUxMl9tYXNrICgoX192MTZxaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3YxNnNpKQorICAgICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3NpNTEyICgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfY3Z0ZXBpOF9lcGk2NCAoX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcG1vdnN4YnE1MTJfbWFzayAoKF9fdjE2cWkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192OGRpKQorICAgICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3NpNTEyICgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfY3Z0ZXBpOF9lcGk2NCAoX19tNTEyaSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcG1vdnN4YnE1MTJfbWFzayAoKF9fdjE2cWkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192OGRpKSBfX1csCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X2N2dGVwaThfZXBpNjQgKF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcG1vdnN4YnE1MTJfbWFzayAoKF9fdjE2cWkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192OGRpKQorICAgICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3NpNTEyICgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9jdnRlcGkzMl9lcGk2NCAoX19tMjU2aSBfX1gpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcG1vdnN4ZHE1MTJfbWFzayAoKF9fdjhzaSkgX19YLAorICAgICAgICAgICAgICAgIChfX3Y4ZGkpCisgICAgICAgICAgICAgICAgX21tNTEyX3NldHplcm9fc2k1MTIgKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19jdnRlcGkzMl9lcGk2NCAoX19tNTEyaSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMjU2aSBfX1gpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcG1vdnN4ZHE1MTJfbWFzayAoKF9fdjhzaSkgX19YLAorICAgICAgICAgICAgICAgIChfX3Y4ZGkpIF9fVywKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfY3Z0ZXBpMzJfZXBpNjQgKF9fbW1hc2s4IF9fVSwgX19tMjU2aSBfX1gpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcG1vdnN4ZHE1MTJfbWFzayAoKF9fdjhzaSkgX19YLAorICAgICAgICAgICAgICAgIChfX3Y4ZGkpCisgICAgICAgICAgICAgICAgX21tNTEyX3NldHplcm9fc2k1MTIgKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2N2dGVwaTE2X2VwaTMyIChfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbW92c3h3ZDUxMl9tYXNrICgoX192MTZoaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3YxNnNpKQorICAgICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3NpNTEyICgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrMTYpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2N2dGVwaTE2X2VwaTMyIChfX201MTJpIF9fVywgX19tbWFzazE2IF9fVSwgX19tMjU2aSBfX0EpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcG1vdnN4d2Q1MTJfbWFzayAoKF9fdjE2aGkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192MTZzaSkgX19XLAorICAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfY3Z0ZXBpMTZfZXBpMzIgKF9fbW1hc2sxNiBfX1UsIF9fbTI1NmkgX19BKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3Btb3ZzeHdkNTEyX21hc2sgKChfX3YxNmhpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjE2c2kpCisgICAgICAgICAgICAgICAgX21tNTEyX3NldHplcm9fc2k1MTIgKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9jdnRlcGkxNl9lcGk2NCAoX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcG1vdnN4d3E1MTJfbWFzayAoKF9fdjhoaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3Y4ZGkpCisgICAgICAgICAgICAgICAgX21tNTEyX3NldHplcm9fc2k1MTIgKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19jdnRlcGkxNl9lcGk2NCAoX19tNTEyaSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcG1vdnN4d3E1MTJfbWFzayAoKF9fdjhoaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3Y4ZGkpIF9fVywKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfY3Z0ZXBpMTZfZXBpNjQgKF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcG1vdnN4d3E1MTJfbWFzayAoKF9fdjhoaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3Y4ZGkpCisgICAgICAgICAgICAgICAgX21tNTEyX3NldHplcm9fc2k1MTIgKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2N2dGVwdThfZXBpMzIgKF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3Btb3Z6eGJkNTEyX21hc2sgKChfX3YxNnFpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjE2c2kpCisgICAgICAgICAgICAgICAgX21tNTEyX3NldHplcm9fc2k1MTIgKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfY3Z0ZXB1OF9lcGkzMiAoX19tNTEyaSBfX1csIF9fbW1hc2sxNiBfX1UsIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3Btb3Z6eGJkNTEyX21hc2sgKChfX3YxNnFpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjE2c2kpIF9fVywKKyAgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X2N2dGVwdThfZXBpMzIgKF9fbW1hc2sxNiBfX1UsIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3Btb3Z6eGJkNTEyX21hc2sgKChfX3YxNnFpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjE2c2kpCisgICAgICAgICAgICAgICAgX21tNTEyX3NldHplcm9fc2k1MTIgKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9jdnRlcHU4X2VwaTY0IChfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbW92enhicTUxMl9tYXNrICgoX192MTZxaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3Y4ZGkpCisgICAgICAgICAgICAgICAgX21tNTEyX3NldHplcm9fc2k1MTIgKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19jdnRlcHU4X2VwaTY0IChfX201MTJpIF9fVywgX19tbWFzazggX19VLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbW92enhicTUxMl9tYXNrICgoX192MTZxaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3Y4ZGkpIF9fVywKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfY3Z0ZXB1OF9lcGk2NCAoX19tbWFzazggX19VLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbW92enhicTUxMl9tYXNrICgoX192MTZxaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3Y4ZGkpCisgICAgICAgICAgICAgICAgX21tNTEyX3NldHplcm9fc2k1MTIgKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2N2dGVwdTMyX2VwaTY0IChfX20yNTZpIF9fWCkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbW92enhkcTUxMl9tYXNrICgoX192OHNpKSBfX1gsCisgICAgICAgICAgICAgICAgKF9fdjhkaSkKKyAgICAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19zaTUxMiAoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2N2dGVwdTMyX2VwaTY0IChfX201MTJpIF9fVywgX19tbWFzazggX19VLCBfX20yNTZpIF9fWCkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbW92enhkcTUxMl9tYXNrICgoX192OHNpKSBfX1gsCisgICAgICAgICAgICAgICAgKF9fdjhkaSkgX19XLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9jdnRlcHUzMl9lcGk2NCAoX19tbWFzazggX19VLCBfX20yNTZpIF9fWCkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbW92enhkcTUxMl9tYXNrICgoX192OHNpKSBfX1gsCisgICAgICAgICAgICAgICAgKF9fdjhkaSkKKyAgICAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19zaTUxMiAoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfY3Z0ZXB1MTZfZXBpMzIgKF9fbTI1NmkgX19BKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3Btb3Z6eHdkNTEyX21hc2sgKChfX3YxNmhpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjE2c2kpCisgICAgICAgICAgICAgICAgX21tNTEyX3NldHplcm9fc2k1MTIgKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfY3Z0ZXB1MTZfZXBpMzIgKF9fbTUxMmkgX19XLCBfX21tYXNrMTYgX19VLCBfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbW92enh3ZDUxMl9tYXNrICgoX192MTZoaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3YxNnNpKSBfX1csCisgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9jdnRlcHUxNl9lcGkzMiAoX19tbWFzazE2IF9fVSwgX19tMjU2aSBfX0EpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcG1vdnp4d2Q1MTJfbWFzayAoKF9fdjE2aGkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192MTZzaSkKKyAgICAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19zaTUxMiAoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2N2dGVwdTE2X2VwaTY0IChfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbW92enh3cTUxMl9tYXNrICgoX192OGhpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjhkaSkKKyAgICAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19zaTUxMiAoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2N2dGVwdTE2X2VwaTY0IChfX201MTJpIF9fVywgX19tbWFzazggX19VLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbW92enh3cTUxMl9tYXNrICgoX192OGhpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjhkaSkgX19XLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9jdnRlcHUxNl9lcGk2NCAoX19tbWFzazggX19VLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wbW92enh3cTUxMl9tYXNrICgoX192OGhpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjhkaSkKKyAgICAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19zaTUxMiAoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfcm9ydl9lcGkzMiAoX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3Byb3J2ZDUxMl9tYXNrICgoX192MTZzaSkgX19BLAorICAgICAgICAgICAgICAoX192MTZzaSkgX19CLAorICAgICAgICAgICAgICAoX192MTZzaSkKKyAgICAgICAgICAgICAgX21tNTEyX3NldHplcm9fc2k1MTIgKCksCisgICAgICAgICAgICAgIChfX21tYXNrMTYpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX3JvcnZfZXBpMzIgKF9fbTUxMmkgX19XLCBfX21tYXNrMTYgX19VLCBfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcHJvcnZkNTEyX21hc2sgKChfX3YxNnNpKSBfX0EsCisgICAgICAgICAgICAgIChfX3YxNnNpKSBfX0IsCisgICAgICAgICAgICAgIChfX3YxNnNpKSBfX1csCisgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfcm9ydl9lcGkzMiAoX19tbWFzazE2IF9fVSwgX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3Byb3J2ZDUxMl9tYXNrICgoX192MTZzaSkgX19BLAorICAgICAgICAgICAgICAoX192MTZzaSkgX19CLAorICAgICAgICAgICAgICAoX192MTZzaSkKKyAgICAgICAgICAgICAgX21tNTEyX3NldHplcm9fc2k1MTIgKCksCisgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfcm9ydl9lcGk2NCAoX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3Byb3J2cTUxMl9tYXNrICgoX192OGRpKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y4ZGkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjhkaSkKKyAgICAgICAgICAgICAgX21tNTEyX3NldHplcm9fc2k1MTIgKCksCisgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfcm9ydl9lcGk2NCAoX19tNTEyaSBfX1csIF9fbW1hc2s4IF9fVSwgX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3Byb3J2cTUxMl9tYXNrICgoX192OGRpKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y4ZGkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjhkaSkgX19XLAorICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfcm9ydl9lcGk2NCAoX19tbWFzazggX19VLCBfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcHJvcnZxNTEyX21hc2sgKChfX3Y4ZGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjhkaSkgX19CLAorICAgICAgICAgICAgICAoX192OGRpKQorICAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19zaTUxMiAoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCisKKworI2RlZmluZSBfbW01MTJfY21wX2VwaTMyX21hc2soYSwgYiwgcCkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX21tYXNrMTYpX19idWlsdGluX2lhMzJfY21wZDUxMl9tYXNrKChfX3YxNnNpKShfX201MTJpKShhKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzaSkoX19tNTEyaSkoYiksIChpbnQpKHApLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpLTEpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9jbXBfZXB1MzJfbWFzayhhLCBiLCBwKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbW1hc2sxNilfX2J1aWx0aW5faWEzMl91Y21wZDUxMl9tYXNrKChfX3YxNnNpKShfX201MTJpKShhKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpKF9fbTUxMmkpKGIpLCAoaW50KShwKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNiktMSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX2NtcF9lcGk2NF9tYXNrKGEsIGIsIHApIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tbWFzazgpX19idWlsdGluX2lhMzJfY21wcTUxMl9tYXNrKChfX3Y4ZGkpKF9fbTUxMmkpKGEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkaSkoX19tNTEyaSkoYiksIChpbnQpKHApLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsgfSkKKworI2RlZmluZSBfbW01MTJfY21wX2VwdTY0X21hc2soYSwgYiwgcCkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl91Y21wcTUxMl9tYXNrKChfX3Y4ZGkpKF9fbTUxMmkpKGEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGkpKF9fbTUxMmkpKGIpLCAoaW50KShwKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX2NtcF9lcGkzMl9tYXNrKG0sIGEsIGIsIHApIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tbWFzazE2KV9fYnVpbHRpbl9pYTMyX2NtcGQ1MTJfbWFzaygoX192MTZzaSkoX19tNTEyaSkoYSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpKF9fbTUxMmkpKGIpLCAoaW50KShwKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KShtKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2tfY21wX2VwdTMyX21hc2sobSwgYSwgYiwgcCkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX21tYXNrMTYpX19idWlsdGluX2lhMzJfdWNtcGQ1MTJfbWFzaygoX192MTZzaSkoX19tNTEyaSkoYSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNpKShfX201MTJpKShiKSwgKGludCkocCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpKG0pKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza19jbXBfZXBpNjRfbWFzayhtLCBhLCBiLCBwKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX2NtcHE1MTJfbWFzaygoX192OGRpKShfX201MTJpKShhKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGkpKF9fbTUxMmkpKGIpLCAoaW50KShwKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkobSkpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX2NtcF9lcHU2NF9tYXNrKG0sIGEsIGIsIHApIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tbWFzazgpX19idWlsdGluX2lhMzJfdWNtcHE1MTJfbWFzaygoX192OGRpKShfX201MTJpKShhKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKShfX201MTJpKShiKSwgKGludCkocCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShtKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX3JvbF9lcGkzMihhLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmkpX19idWlsdGluX2lhMzJfcHJvbGQ1MTJfbWFzaygoX192MTZzaSkoX19tNTEyaSkoYSksIChpbnQpKGIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpX21tNTEyX3NldHplcm9fc2k1MTIoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpLTEpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX3JvbF9lcGkzMihXLCBVLCBhLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmkpX19idWlsdGluX2lhMzJfcHJvbGQ1MTJfbWFzaygoX192MTZzaSkoX19tNTEyaSkoYSksIChpbnQpKGIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpKF9fbTUxMmkpKFcpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikoVSkpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrel9yb2xfZXBpMzIoVSwgYSwgYikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX3Byb2xkNTEyX21hc2soKF9fdjE2c2kpKF9fbTUxMmkpKGEpLCAoaW50KShiKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNpKV9tbTUxMl9zZXR6ZXJvX3NpNTEyKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KShVKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX3JvbF9lcGk2NChhLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmkpX19idWlsdGluX2lhMzJfcHJvbHE1MTJfbWFzaygoX192OGRpKShfX201MTJpKShhKSwgKGludCkoYiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKV9tbTUxMl9zZXR6ZXJvX3NpNTEyKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX3JvbF9lcGk2NChXLCBVLCBhLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmkpX19idWlsdGluX2lhMzJfcHJvbHE1MTJfbWFzaygoX192OGRpKShfX201MTJpKShhKSwgKGludCkoYiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKShfX201MTJpKShXKSwgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X3JvbF9lcGk2NChVLCBhLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmkpX19idWlsdGluX2lhMzJfcHJvbHE1MTJfbWFzaygoX192OGRpKShfX201MTJpKShhKSwgKGludCkoYiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKV9tbTUxMl9zZXR6ZXJvX3NpNTEyKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfcm9sdl9lcGkzMiAoX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3Byb2x2ZDUxMl9tYXNrICgoX192MTZzaSkgX19BLAorICAgICAgICAgICAgICAoX192MTZzaSkgX19CLAorICAgICAgICAgICAgICAoX192MTZzaSkKKyAgICAgICAgICAgICAgX21tNTEyX3NldHplcm9fc2k1MTIgKCksCisgICAgICAgICAgICAgIChfX21tYXNrMTYpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX3JvbHZfZXBpMzIgKF9fbTUxMmkgX19XLCBfX21tYXNrMTYgX19VLCBfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcHJvbHZkNTEyX21hc2sgKChfX3YxNnNpKSBfX0EsCisgICAgICAgICAgICAgIChfX3YxNnNpKSBfX0IsCisgICAgICAgICAgICAgIChfX3YxNnNpKSBfX1csCisgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfcm9sdl9lcGkzMiAoX19tbWFzazE2IF9fVSwgX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3Byb2x2ZDUxMl9tYXNrICgoX192MTZzaSkgX19BLAorICAgICAgICAgICAgICAoX192MTZzaSkgX19CLAorICAgICAgICAgICAgICAoX192MTZzaSkKKyAgICAgICAgICAgICAgX21tNTEyX3NldHplcm9fc2k1MTIgKCksCisgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfcm9sdl9lcGk2NCAoX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3Byb2x2cTUxMl9tYXNrICgoX192OGRpKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y4ZGkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjhkaSkKKyAgICAgICAgICAgICAgX21tNTEyX3NldHplcm9fc2k1MTIgKCksCisgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfcm9sdl9lcGk2NCAoX19tNTEyaSBfX1csIF9fbW1hc2s4IF9fVSwgX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3Byb2x2cTUxMl9tYXNrICgoX192OGRpKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y4ZGkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjhkaSkgX19XLAorICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfcm9sdl9lcGk2NCAoX19tbWFzazggX19VLCBfX201MTJpIF9fQSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcHJvbHZxNTEyX21hc2sgKChfX3Y4ZGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjhkaSkgX19CLAorICAgICAgICAgICAgICAoX192OGRpKQorICAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19zaTUxMiAoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCisjZGVmaW5lIF9tbTUxMl9yb3JfZXBpMzIoQSwgQikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX3Byb3JkNTEyX21hc2soKF9fdjE2c2kpKF9fbTUxMmkpKEEpLCAoaW50KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNpKV9tbTUxMl9zZXR6ZXJvX3NpNTEyKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KS0xKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza19yb3JfZXBpMzIoVywgVSwgQSwgQikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX3Byb3JkNTEyX21hc2soKF9fdjE2c2kpKF9fbTUxMmkpKEEpLCAoaW50KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNpKShfX201MTJpKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpKFUpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza3pfcm9yX2VwaTMyKFUsIEEsIEIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9wcm9yZDUxMl9tYXNrKChfX3YxNnNpKShfX201MTJpKShBKSwgKGludCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzaSlfbW01MTJfc2V0emVyb19zaTUxMigpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikoVSkpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9yb3JfZXBpNjQoQSwgQikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX3Byb3JxNTEyX21hc2soKF9fdjhkaSkoX19tNTEyaSkoQSksIChpbnQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkaSlfbW01MTJfc2V0emVyb19zaTUxMigpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza19yb3JfZXBpNjQoVywgVSwgQSwgQikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX3Byb3JxNTEyX21hc2soKF9fdjhkaSkoX19tNTEyaSkoQSksIChpbnQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkaSkoX19tNTEyaSkoVyksIChfX21tYXNrOCkoVSkpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrel9yb3JfZXBpNjQoVSwgQSwgQikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX3Byb3JxNTEyX21hc2soKF9fdjhkaSkoX19tNTEyaSkoQSksIChpbnQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkaSlfbW01MTJfc2V0emVyb19zaTUxMigpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX3NsbGlfZXBpMzIoQSwgQikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX3BzbGxkaTUxMl9tYXNrKChfX3YxNnNpKShfX201MTJpKShBKSwgKGludCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpX21tNTEyX3NldHplcm9fc2k1MTIoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KS0xKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza19zbGxpX2VwaTMyKFcsIFUsIEEsIEIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9wc2xsZGk1MTJfbWFzaygoX192MTZzaSkoX19tNTEyaSkoQSksIChpbnQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNpKShfX201MTJpKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KShVKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X3NsbGlfZXBpMzIoVSwgQSwgQikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX3BzbGxkaTUxMl9tYXNrKChfX3YxNnNpKShfX201MTJpKShBKSwgKGludCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpX21tNTEyX3NldHplcm9fc2k1MTIoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KShVKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX3NsbGlfZXBpNjQoQSwgQikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX3BzbGxxaTUxMl9tYXNrKChfX3Y4ZGkpKF9fbTUxMmkpKEEpLCAoaW50KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKV9tbTUxMl9zZXR6ZXJvX3NpNTEyKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza19zbGxpX2VwaTY0KFcsIFUsIEEsIEIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9wc2xscWk1MTJfbWFzaygoX192OGRpKShfX201MTJpKShBKSwgKGludCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkaSkoX19tNTEyaSkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X3NsbGlfZXBpNjQoVSwgQSwgQikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX3BzbGxxaTUxMl9tYXNrKChfX3Y4ZGkpKF9fbTUxMmkpKEEpLCAoaW50KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKV9tbTUxMl9zZXR6ZXJvX3NpNTEyKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKworCisjZGVmaW5lIF9tbTUxMl9zcmxpX2VwaTMyKEEsIEIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9wc3JsZGk1MTJfbWFzaygoX192MTZzaSkoX19tNTEyaSkoQSksIChpbnQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNpKV9tbTUxMl9zZXR6ZXJvX3NpNTEyKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNiktMSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2tfc3JsaV9lcGkzMihXLCBVLCBBLCBCKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmkpX19idWlsdGluX2lhMzJfcHNybGRpNTEyX21hc2soKF9fdjE2c2kpKF9fbTUxMmkpKEEpLCAoaW50KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzaSkoX19tNTEyaSkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikoVSkpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrel9zcmxpX2VwaTMyKFUsIEEsIEIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9wc3JsZGk1MTJfbWFzaygoX192MTZzaSkoX19tNTEyaSkoQSksIChpbnQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNpKV9tbTUxMl9zZXR6ZXJvX3NpNTEyKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikoVSkpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9zcmxpX2VwaTY0KEEsIEIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9wc3JscWk1MTJfbWFzaygoX192OGRpKShfX201MTJpKShBKSwgKGludCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkaSlfbW01MTJfc2V0emVyb19zaTUxMigpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2tfc3JsaV9lcGk2NChXLCBVLCBBLCBCKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmkpX19idWlsdGluX2lhMzJfcHNybHFpNTEyX21hc2soKF9fdjhkaSkoX19tNTEyaSkoQSksIChpbnQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGkpKF9fbTUxMmkpKFcpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSkpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrel9zcmxpX2VwaTY0KFUsIEEsIEIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9wc3JscWk1MTJfbWFzaygoX192OGRpKShfX201MTJpKShBKSwgKGludCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkaSlfbW01MTJfc2V0emVyb19zaTUxMigpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSkpOyB9KQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfbG9hZF9lcGkzMiAoX19tNTEyaSBfX1csIF9fbW1hc2sxNiBfX1UsIHZvaWQgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9tb3ZkcWEzMmxvYWQ1MTJfbWFzayAoKGNvbnN0IF9fdjE2c2kgKikgX19QLAorICAgICAgICAgICAgICAoX192MTZzaSkgX19XLAorICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X2xvYWRfZXBpMzIgKF9fbW1hc2sxNiBfX1UsIHZvaWQgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9tb3ZkcWEzMmxvYWQ1MTJfbWFzayAoKGNvbnN0IF9fdjE2c2kgKikgX19QLAorICAgICAgICAgICAgICAoX192MTZzaSkKKyAgICAgICAgICAgICAgX21tNTEyX3NldHplcm9fc2k1MTIgKCksCisgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19zdG9yZV9lcGkzMiAodm9pZCAqX19QLCBfX21tYXNrMTYgX19VLCBfX201MTJpIF9fQSkKK3sKKyAgX19idWlsdGluX2lhMzJfbW92ZHFhMzJzdG9yZTUxMl9tYXNrICgoX192MTZzaSAqKSBfX1AsIChfX3YxNnNpKSBfX0EsCisgICAgICAgICAgKF9fbW1hc2sxNikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX21vdl9lcGkzMiAoX19tNTEyaSBfX1csIF9fbW1hc2sxNiBfX1UsIF9fbTUxMmkgX19BKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3NlbGVjdGRfNTEyICgoX19tbWFzazE2KSBfX1UsCisgICAgICAgICAgICAgICAgIChfX3YxNnNpKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3YxNnNpKSBfX1cpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X21vdl9lcGkzMiAoX19tbWFzazE2IF9fVSwgX19tNTEyaSBfX0EpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfc2VsZWN0ZF81MTIgKChfX21tYXNrMTYpIF9fVSwKKyAgICAgICAgICAgICAgICAgKF9fdjE2c2kpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjE2c2kpIF9tbTUxMl9zZXR6ZXJvX3NpNTEyICgpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX21vdl9lcGk2NCAoX19tNTEyaSBfX1csIF9fbW1hc2s4IF9fVSwgX19tNTEyaSBfX0EpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfc2VsZWN0cV81MTIgKChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAgICAoX192OGRpKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3Y4ZGkpIF9fVyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfbW92X2VwaTY0IChfX21tYXNrOCBfX1UsIF9fbTUxMmkgX19BKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3NlbGVjdHFfNTEyICgoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICAgICAgICAgKF9fdjhkaSkgX19BLAorICAgICAgICAgICAgICAgICAoX192OGRpKSBfbW01MTJfc2V0emVyb19zaTUxMiAoKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19sb2FkX2VwaTY0IChfX201MTJpIF9fVywgX19tbWFzazggX19VLCB2b2lkIGNvbnN0ICpfX1ApCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfbW92ZHFhNjRsb2FkNTEyX21hc2sgKChjb25zdCBfX3Y4ZGkgKikgX19QLAorICAgICAgICAgICAgICAoX192OGRpKSBfX1csCisgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9sb2FkX2VwaTY0IChfX21tYXNrOCBfX1UsIHZvaWQgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9tb3ZkcWE2NGxvYWQ1MTJfbWFzayAoKGNvbnN0IF9fdjhkaSAqKSBfX1AsCisgICAgICAgICAgICAgIChfX3Y4ZGkpCisgICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3NpNTEyICgpLAorICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19zdG9yZV9lcGk2NCAodm9pZCAqX19QLCBfX21tYXNrOCBfX1UsIF9fbTUxMmkgX19BKQoreworICBfX2J1aWx0aW5faWEzMl9tb3ZkcWE2NHN0b3JlNTEyX21hc2sgKChfX3Y4ZGkgKikgX19QLCAoX192OGRpKSBfX0EsCisgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21vdmVkdXBfcGQgKF9fbTUxMmQgX19BKQoreworICByZXR1cm4gKF9fbTUxMmQpX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjhkZilfX0EsIChfX3Y4ZGYpX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMiwgMiwgNCwgNCwgNiwgNik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19tb3ZlZHVwX3BkIChfX201MTJkIF9fVywgX19tbWFzazggX19VLCBfX201MTJkIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJkKV9fYnVpbHRpbl9pYTMyX3NlbGVjdHBkXzUxMigoX19tbWFzazgpX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpX21tNTEyX21vdmVkdXBfcGQoX19BKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKV9fVyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfbW92ZWR1cF9wZCAoX19tbWFzazggX19VLCBfX201MTJkIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJkKV9fYnVpbHRpbl9pYTMyX3NlbGVjdHBkXzUxMigoX19tbWFzazgpX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpX21tNTEyX21vdmVkdXBfcGQoX19BKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKV9tbTUxMl9zZXR6ZXJvX3BkKCkpOworfQorCisjZGVmaW5lIF9tbTUxMl9maXh1cGltbV9yb3VuZF9wZChBLCBCLCBDLCBpbW0sIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyZClfX2J1aWx0aW5faWEzMl9maXh1cGltbXBkNTEyX21hc2soKF9fdjhkZikoX19tNTEyZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpKF9fbTUxMmQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKShfX201MTJpKShDKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2tfZml4dXBpbW1fcm91bmRfcGQoQSwgVSwgQiwgQywgaW1tLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmQpX19idWlsdGluX2lhMzJfZml4dXBpbW1wZDUxMl9tYXNrKChfX3Y4ZGYpKF9fbTUxMmQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKShfX201MTJkKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkaSkoX19tNTEyaSkoQyksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW01MTJfZml4dXBpbW1fcGQoQSwgQiwgQywgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmQpX19idWlsdGluX2lhMzJfZml4dXBpbW1wZDUxMl9tYXNrKChfX3Y4ZGYpKF9fbTUxMmQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKShfX201MTJkKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkaSkoX19tNTEyaSkoQyksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza19maXh1cGltbV9wZChBLCBVLCBCLCBDLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyZClfX2J1aWx0aW5faWEzMl9maXh1cGltbXBkNTEyX21hc2soKF9fdjhkZikoX19tNTEyZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpKF9fbTUxMmQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKShfX201MTJpKShDKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza3pfZml4dXBpbW1fcm91bmRfcGQoVSwgQSwgQiwgQywgaW1tLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmQpX19idWlsdGluX2lhMzJfZml4dXBpbW1wZDUxMl9tYXNreigoX192OGRmKShfX201MTJkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpKF9fbTUxMmQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkaSkoX19tNTEyaSkoQyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShpbW0pLCAoX19tbWFzazgpKFUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrel9maXh1cGltbV9wZChVLCBBLCBCLCBDLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyZClfX2J1aWx0aW5faWEzMl9maXh1cGltbXBkNTEyX21hc2t6KChfX3Y4ZGYpKF9fbTUxMmQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikoX19tNTEyZCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKShfX201MTJpKShDKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGltbSksIChfX21tYXNrOCkoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOyB9KQorCisjZGVmaW5lIF9tbTUxMl9maXh1cGltbV9yb3VuZF9wcyhBLCBCLCBDLCBpbW0sIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyKV9fYnVpbHRpbl9pYTMyX2ZpeHVwaW1tcHM1MTJfbWFzaygoX192MTZzZikoX19tNTEyKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikoX19tNTEyKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzaSkoX19tNTEyaSkoQyksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNiktMSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX2ZpeHVwaW1tX3JvdW5kX3BzKEEsIFUsIEIsIEMsIGltbSwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTIpX19idWlsdGluX2lhMzJfZml4dXBpbW1wczUxMl9tYXNrKChfX3YxNnNmKShfX201MTIpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKShfX201MTIpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNpKShfX201MTJpKShDKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KShVKSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9maXh1cGltbV9wcyhBLCBCLCBDLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyKV9fYnVpbHRpbl9pYTMyX2ZpeHVwaW1tcHM1MTJfbWFzaygoX192MTZzZikoX19tNTEyKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikoX19tNTEyKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzaSkoX19tNTEyaSkoQyksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNiktMSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX2ZpeHVwaW1tX3BzKEEsIFUsIEIsIEMsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTIpX19idWlsdGluX2lhMzJfZml4dXBpbW1wczUxMl9tYXNrKChfX3YxNnNmKShfX201MTIpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKShfX201MTIpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNpKShfX201MTJpKShDKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KShVKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrel9maXh1cGltbV9yb3VuZF9wcyhVLCBBLCBCLCBDLCBpbW0sIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyKV9fYnVpbHRpbl9pYTMyX2ZpeHVwaW1tcHM1MTJfbWFza3ooKF9fdjE2c2YpKF9fbTUxMikoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKShfX201MTIpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzaSkoX19tNTEyaSkoQyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGltbSksIChfX21tYXNrMTYpKFUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X2ZpeHVwaW1tX3BzKFUsIEEsIEIsIEMsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTIpX19idWlsdGluX2lhMzJfZml4dXBpbW1wczUxMl9tYXNreigoX192MTZzZikoX19tNTEyKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpKF9fbTUxMikoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNpKShfX201MTJpKShDKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoaW1tKSwgKF9fbW1hc2sxNikoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7IH0pCisKKyNkZWZpbmUgX21tX2ZpeHVwaW1tX3JvdW5kX3NkKEEsIEIsIEMsIGltbSwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2ZpeHVwaW1tc2RfbWFzaygoX192MmRmKShfX20xMjhkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZikoX19tMTI4ZCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGkpKF9fbTEyOGkpKEMpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEsIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW1fbWFza19maXh1cGltbV9yb3VuZF9zZChBLCBVLCBCLCBDLCBpbW0sIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9maXh1cGltbXNkX21hc2soKF9fdjJkZikoX19tMTI4ZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fbTEyOGQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRpKShfX20xMjhpKShDKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbV9maXh1cGltbV9zZChBLCBCLCBDLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9maXh1cGltbXNkX21hc2soKF9fdjJkZikoX19tMTI4ZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fbTEyOGQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRpKShfX20xMjhpKShDKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrX2ZpeHVwaW1tX3NkKEEsIFUsIEIsIEMsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2ZpeHVwaW1tc2RfbWFzaygoX192MmRmKShfX20xMjhkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZikoX19tMTI4ZCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGkpKF9fbTEyOGkpKEMpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrel9maXh1cGltbV9yb3VuZF9zZChVLCBBLCBCLCBDLCBpbW0sIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9maXh1cGltbXNkX21hc2t6KChfX3YyZGYpKF9fbTEyOGQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZikoX19tMTI4ZCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRpKShfX20xMjhpKShDKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW1fbWFza3pfZml4dXBpbW1fc2QoVSwgQSwgQiwgQywgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGQpX19idWlsdGluX2lhMzJfZml4dXBpbW1zZF9tYXNreigoX192MmRmKShfX20xMjhkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fbTEyOGQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkaSkoX19tMTI4aSkoQyksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsgfSkKKworI2RlZmluZSBfbW1fZml4dXBpbW1fcm91bmRfc3MoQSwgQiwgQywgaW1tLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOClfX2J1aWx0aW5faWEzMl9maXh1cGltbXNzX21hc2soKF9fdjRzZikoX19tMTI4KShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKShfX20xMjgpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2kpKF9fbTEyOGkpKEMpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrX2ZpeHVwaW1tX3JvdW5kX3NzKEEsIFUsIEIsIEMsIGltbSwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfZml4dXBpbW1zc19tYXNrKChfX3Y0c2YpKF9fbTEyOCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNpKShfX20xMjhpKShDKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tX2ZpeHVwaW1tX3NzKEEsIEIsIEMsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfZml4dXBpbW1zc19tYXNrKChfX3Y0c2YpKF9fbTEyOCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNpKShfX20xMjhpKShDKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsgfSkKKworI2RlZmluZSBfbW1fbWFza19maXh1cGltbV9zcyhBLCBVLCBCLCBDLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX2ZpeHVwaW1tc3NfbWFzaygoX192NHNmKShfX20xMjgpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpKF9fbTEyOCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzaSkoX19tMTI4aSkoQyksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrel9maXh1cGltbV9yb3VuZF9zcyhVLCBBLCBCLCBDLCBpbW0sIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX2ZpeHVwaW1tc3NfbWFza3ooKF9fdjRzZikoX19tMTI4KShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzaSkoX19tMTI4aSkoQyksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW1fbWFza3pfZml4dXBpbW1fc3MoVSwgQSwgQiwgQywgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOClfX2J1aWx0aW5faWEzMl9maXh1cGltbXNzX21hc2t6KChfX3Y0c2YpKF9fbTEyOCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpKF9fbTEyOCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2kpKF9fbTEyOGkpKEMpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOyB9KQorCisjZGVmaW5lIF9tbV9nZXRleHBfcm91bmRfc2QoQSwgQiwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2dldGV4cHNkMTI4X3JvdW5kX21hc2soKF9fdjJkZikoX19tMTI4ZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpX21tX3NldHplcm9fcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSwgKGludCkoUikpOyB9KQorCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fZ2V0ZXhwX3NkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfZ2V0ZXhwc2QxMjhfcm91bmRfbWFzayAoKF9fdjJkZikgX19BLAorICAgICAgICAgICAgICAgICAoX192MmRmKSBfX0IsIChfX3YyZGYpIF9tbV9zZXR6ZXJvX3BkKCksIChfX21tYXNrOCkgLTEsIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19nZXRleHBfc2QgKF9fbTEyOGQgX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX2dldGV4cHNkMTI4X3JvdW5kX21hc2sgKCAoX192MmRmKSBfX0EsCisgICAgICAgICAgKF9fdjJkZikgX19CLAorICAgICAgICAgIChfX3YyZGYpIF9fVywKKyAgICAgICAgICAoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCisjZGVmaW5lIF9tbV9tYXNrX2dldGV4cF9yb3VuZF9zZChXLCBVLCBBLCBCLCBSKSBfX2V4dGVuc2lvbl9fICh7XAorICAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9nZXRleHBzZDEyOF9yb3VuZF9tYXNrKChfX3YyZGYpKF9fbTEyOGQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZikoX19tMTI4ZCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIChpbnQpKFIpKTsgfSkKKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9nZXRleHBfc2QgKF9fbW1hc2s4IF9fVSwgX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfZ2V0ZXhwc2QxMjhfcm91bmRfbWFzayAoIChfX3YyZGYpIF9fQSwKKyAgICAgICAgICAoX192MmRmKSBfX0IsCisgICAgICAgICAgKF9fdjJkZikgX21tX3NldHplcm9fcGQgKCksCisgICAgICAgICAgKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworI2RlZmluZSBfbW1fbWFza3pfZ2V0ZXhwX3JvdW5kX3NkKFUsIEEsIEIsIFIpIF9fZXh0ZW5zaW9uX18gKHtcCisgIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2dldGV4cHNkMTI4X3JvdW5kX21hc2soKF9fdjJkZikoX19tMTI4ZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpX21tX3NldHplcm9fcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW1fZ2V0ZXhwX3JvdW5kX3NzKEEsIEIsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX2dldGV4cHNzMTI4X3JvdW5kX21hc2soKF9fdjRzZikoX19tMTI4KShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZilfbW1fc2V0emVyb19wcygpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEsIChpbnQpKFIpKTsgfSkKKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2dldGV4cF9zcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2dldGV4cHNzMTI4X3JvdW5kX21hc2sgKChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192NHNmKSBfX0IsIChfX3Y0c2YpICBfbW1fc2V0emVyb19wcygpLCAoX19tbWFzazgpIC0xLCBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19nZXRleHBfc3MgKF9fbTEyOCBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfZ2V0ZXhwc3MxMjhfcm91bmRfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgIChfX3Y0c2YpIF9fQiwKKyAgICAgICAgICAoX192NHNmKSBfX1csCisgICAgICAgICAgKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworI2RlZmluZSBfbW1fbWFza19nZXRleHBfcm91bmRfc3MoVywgVSwgQSwgQiwgUikgX19leHRlbnNpb25fXyAoe1wKKyAgKF9fbTEyOClfX2J1aWx0aW5faWEzMl9nZXRleHBzczEyOF9yb3VuZF9tYXNrKChfX3Y0c2YpKF9fbTEyOCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpKF9fbTEyOCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpKF9fbTEyOCkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIChpbnQpKFIpKTsgfSkKKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2dldGV4cF9zcyAoX19tbWFzazggX19VLCBfX20xMjggX19BLCBfX20xMjggX19CKQoreworIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9nZXRleHBzczEyOF9yb3VuZF9tYXNrICgoX192NHNmKSBfX0EsCisgICAgICAgICAgKF9fdjRzZikgX19CLAorICAgICAgICAgIChfX3Y0c2YpIF9tbV9zZXR6ZXJvX3BkICgpLAorICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKKyNkZWZpbmUgX21tX21hc2t6X2dldGV4cF9yb3VuZF9zcyhVLCBBLCBCLCBSKSBfX2V4dGVuc2lvbl9fICh7XAorICAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX2dldGV4cHNzMTI4X3JvdW5kX21hc2soKF9fdjRzZikoX19tMTI4KShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZilfbW1fc2V0emVyb19wcygpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tX2dldG1hbnRfcm91bmRfc2QoQSwgQiwgQywgRCwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2dldG1hbnRzZF9yb3VuZF9tYXNrKChfX3YyZGYpKF9fbTEyOGQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fbTEyOGQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKCgoRCk8PDIpIHwgKEMpKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKV9tbV9zZXR6ZXJvX3BkKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tX2dldG1hbnRfc2QoQSwgQiwgQywgRCkgIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9nZXRtYW50c2Rfcm91bmRfbWFzaygoX192MmRmKShfX20xMjhkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSgoKEQpPDwyKSB8IChDKSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZilfbW1fc2V0emVyb19wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrX2dldG1hbnRfc2QoVywgVSwgQSwgQiwgQywgRCkgX19leHRlbnNpb25fXyAoe1wKKyAgKF9fbTEyOGQpX19idWlsdGluX2lhMzJfZ2V0bWFudHNkX3JvdW5kX21hc2soKF9fdjJkZikoX19tMTI4ZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZikoX19tMTI4ZCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoKChEKTw8MikgfCAoQykpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fbTEyOGQpKFcpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsgfSkKKworI2RlZmluZSBfbW1fbWFza19nZXRtYW50X3JvdW5kX3NkKFcsIFUsIEEsIEIsIEMsIEQsIFIpKHtcCisgIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2dldG1hbnRzZF9yb3VuZF9tYXNrKChfX3YyZGYpKF9fbTEyOGQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fbTEyOGQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKCgoRCk8PDIpIHwgKEMpKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2t6X2dldG1hbnRfc2QoVSwgQSwgQiwgQywgRCkgX19leHRlbnNpb25fXyAoe1wKKyAgKF9fbTEyOGQpX19idWlsdGluX2lhMzJfZ2V0bWFudHNkX3JvdW5kX21hc2soKF9fdjJkZikoX19tMTI4ZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZikoX19tMTI4ZCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoKChEKTw8MikgfCAoQykpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpX21tX3NldHplcm9fcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7IH0pCisKKyNkZWZpbmUgX21tX21hc2t6X2dldG1hbnRfcm91bmRfc2QoVSwgQSwgQiwgQywgRCwgUikgX19leHRlbnNpb25fXyAoe1wKKyAgKF9fbTEyOGQpX19idWlsdGluX2lhMzJfZ2V0bWFudHNkX3JvdW5kX21hc2soKF9fdjJkZikoX19tMTI4ZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZikoX19tMTI4ZCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoKChEKTw8MikgfCAoQykpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpX21tX3NldHplcm9fcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tX2dldG1hbnRfcm91bmRfc3MoQSwgQiwgQywgRCwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfZ2V0bWFudHNzX3JvdW5kX21hc2soKF9fdjRzZikoX19tMTI4KShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpKF9fbTEyOCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSgoKEQpPDwyKSB8IChDKSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKV9tbV9zZXR6ZXJvX3BzKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEsIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW1fZ2V0bWFudF9zcyhBLCBCLCBDLCBEKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOClfX2J1aWx0aW5faWEzMl9nZXRtYW50c3Nfcm91bmRfbWFzaygoX192NHNmKShfX20xMjgpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKCgoRCk8PDIpIHwgKEMpKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpX21tX3NldHplcm9fcHMoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7IH0pCisKKyNkZWZpbmUgX21tX21hc2tfZ2V0bWFudF9zcyhXLCBVLCBBLCBCLCBDLCBEKSBfX2V4dGVuc2lvbl9fICh7XAorICAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX2dldG1hbnRzc19yb3VuZF9tYXNrKChfX3Y0c2YpKF9fbTEyOCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKShfX20xMjgpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoKChEKTw8MikgfCAoQykpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrX2dldG1hbnRfcm91bmRfc3MoVywgVSwgQSwgQiwgQywgRCwgUikoe1wKKyAgKF9fbTEyOClfX2J1aWx0aW5faWEzMl9nZXRtYW50c3Nfcm91bmRfbWFzaygoX192NHNmKShfX20xMjgpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKCgoRCk8PDIpIHwgKEMpKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpKF9fbTEyOCkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2t6X2dldG1hbnRfc3MoVSwgQSwgQiwgQywgRCkgX19leHRlbnNpb25fXyAoe1wKKyAgKF9fbTEyOClfX2J1aWx0aW5faWEzMl9nZXRtYW50c3Nfcm91bmRfbWFzaygoX192NHNmKShfX20xMjgpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKCgoRCk8PDIpIHwgKEMpKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpX21tX3NldHplcm9fcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrel9nZXRtYW50X3JvdW5kX3NzKFUsIEEsIEIsIEMsIEQsIFIpIF9fZXh0ZW5zaW9uX18gKHtcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfZ2V0bWFudHNzX3JvdW5kX21hc2soKF9fdjRzZikoX19tMTI4KShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpKF9fbTEyOCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSgoKEQpPDwyKSB8IChDKSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKV9tbV9zZXR6ZXJvX3BzKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShSKSk7IH0pCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2sxNiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9rbW92IChfX21tYXNrMTYgX19BKQoreworICByZXR1cm4gIF9fQTsKK30KKworI2RlZmluZSBfbW1fY29taV9yb3VuZF9zZChBLCBCLCBQLCBSKSBfX2V4dGVuc2lvbl9fICh7XAorICAoaW50KV9fYnVpbHRpbl9pYTMyX3Zjb21pc2QoKF9fdjJkZikoX19tMTI4ZCkoQSksIChfX3YyZGYpKF9fbTEyOGQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShQKSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbV9jb21pX3JvdW5kX3NzKEEsIEIsIFAsIFIpIF9fZXh0ZW5zaW9uX18gKHtcCisgIChpbnQpX19idWlsdGluX2lhMzJfdmNvbWlzcygoX192NHNmKShfX20xMjgpKEEpLCAoX192NHNmKShfX20xMjgpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShQKSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbV9jdnRfcm91bmRzZF9zaTY0KEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAobG9uZyBsb25nKV9fYnVpbHRpbl9pYTMyX3ZjdnRzZDJzaTY0KChfX3YyZGYpKF9fbTEyOGQpKEEpLCAoaW50KShSKSk7IH0pCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFzazJfcGVybXV0ZXgydmFyX2VwaTMyIChfX201MTJpIF9fQSwgX19tNTEyaSBfX0ksCisgICAgICAgICBfX21tYXNrMTYgX19VLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl92cGVybWkydmFyZDUxMl9tYXNrICgoX192MTZzaSkgX19BLAorICAgICAgICAgICAgICAgICAgIChfX3YxNnNpKSBfX0kKKyAgICAgICAgICAgICAgICAgICAvKiBpZHggKi8gLAorICAgICAgICAgICAgICAgICAgIChfX3YxNnNpKSBfX0IsCisgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9zbGxfZXBpMzIgKF9fbTUxMmkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wc2xsZDUxMl9tYXNrICgoX192MTZzaSkgX19BLAorICAgICAgICAgICAgIChfX3Y0c2kpIF9fQiwKKyAgICAgICAgICAgICAoX192MTZzaSkKKyAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19zaTUxMiAoKSwKKyAgICAgICAgICAgICAoX19tbWFzazE2KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19zbGxfZXBpMzIgKF9fbTUxMmkgX19XLCBfX21tYXNrMTYgX19VLCBfX201MTJpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcHNsbGQ1MTJfbWFzayAoKF9fdjE2c2kpIF9fQSwKKyAgICAgICAgICAgICAoX192NHNpKSBfX0IsCisgICAgICAgICAgICAgKF9fdjE2c2kpIF9fVywKKyAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X3NsbF9lcGkzMiAoX19tbWFzazE2IF9fVSwgX19tNTEyaSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BzbGxkNTEyX21hc2sgKChfX3YxNnNpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjRzaSkgX19CLAorICAgICAgICAgICAgIChfX3YxNnNpKQorICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3NpNTEyICgpLAorICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfc2xsX2VwaTY0IChfX201MTJpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcHNsbHE1MTJfbWFzayAoKF9fdjhkaSkgX19BLAorICAgICAgICAgICAgIChfX3YyZGkpIF9fQiwKKyAgICAgICAgICAgICAoX192OGRpKQorICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3NpNTEyICgpLAorICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfc2xsX2VwaTY0IChfX201MTJpIF9fVywgX19tbWFzazggX19VLCBfX201MTJpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcHNsbHE1MTJfbWFzayAoKF9fdjhkaSkgX19BLAorICAgICAgICAgICAgIChfX3YyZGkpIF9fQiwKKyAgICAgICAgICAgICAoX192OGRpKSBfX1csCisgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X3NsbF9lcGk2NCAoX19tbWFzazggX19VLCBfX201MTJpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcHNsbHE1MTJfbWFzayAoKF9fdjhkaSkgX19BLAorICAgICAgICAgICAgIChfX3YyZGkpIF9fQiwKKyAgICAgICAgICAgICAoX192OGRpKQorICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3NpNTEyICgpLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9zbGx2X2VwaTMyIChfX201MTJpIF9fWCwgX19tNTEyaSBfX1kpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcHNsbHYxNnNpX21hc2sgKChfX3YxNnNpKSBfX1gsCisgICAgICAgICAgICAgIChfX3YxNnNpKSBfX1ksCisgICAgICAgICAgICAgIChfX3YxNnNpKQorICAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19zaTUxMiAoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2sxNikgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfc2xsdl9lcGkzMiAoX19tNTEyaSBfX1csIF9fbW1hc2sxNiBfX1UsIF9fbTUxMmkgX19YLCBfX201MTJpIF9fWSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wc2xsdjE2c2lfbWFzayAoKF9fdjE2c2kpIF9fWCwKKyAgICAgICAgICAgICAgKF9fdjE2c2kpIF9fWSwKKyAgICAgICAgICAgICAgKF9fdjE2c2kpIF9fVywKKyAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9zbGx2X2VwaTMyIChfX21tYXNrMTYgX19VLCBfX201MTJpIF9fWCwgX19tNTEyaSBfX1kpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcHNsbHYxNnNpX21hc2sgKChfX3YxNnNpKSBfX1gsCisgICAgICAgICAgICAgIChfX3YxNnNpKSBfX1ksCisgICAgICAgICAgICAgIChfX3YxNnNpKQorICAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19zaTUxMiAoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9zbGx2X2VwaTY0IChfX201MTJpIF9fWCwgX19tNTEyaSBfX1kpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcHNsbHY4ZGlfbWFzayAoKF9fdjhkaSkgX19YLAorICAgICAgICAgICAgIChfX3Y4ZGkpIF9fWSwKKyAgICAgICAgICAgICAoX192OGRpKQorICAgICAgICAgICAgIF9tbTUxMl91bmRlZmluZWRfcGQgKCksCisgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19zbGx2X2VwaTY0IChfX201MTJpIF9fVywgX19tbWFzazggX19VLCBfX201MTJpIF9fWCwgX19tNTEyaSBfX1kpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcHNsbHY4ZGlfbWFzayAoKF9fdjhkaSkgX19YLAorICAgICAgICAgICAgIChfX3Y4ZGkpIF9fWSwKKyAgICAgICAgICAgICAoX192OGRpKSBfX1csCisgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X3NsbHZfZXBpNjQgKF9fbW1hc2s4IF9fVSwgX19tNTEyaSBfX1gsIF9fbTUxMmkgX19ZKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BzbGx2OGRpX21hc2sgKChfX3Y4ZGkpIF9fWCwKKyAgICAgICAgICAgICAoX192OGRpKSBfX1ksCisgICAgICAgICAgICAgKF9fdjhkaSkKKyAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19zaTUxMiAoKSwKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfc3JhX2VwaTMyIChfX201MTJpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcHNyYWQ1MTJfbWFzayAoKF9fdjE2c2kpIF9fQSwKKyAgICAgICAgICAgICAoX192NHNpKSBfX0IsCisgICAgICAgICAgICAgKF9fdjE2c2kpCisgICAgICAgICAgICAgX21tNTEyX3NldHplcm9fc2k1MTIgKCksCisgICAgICAgICAgICAgKF9fbW1hc2sxNikgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfc3JhX2VwaTMyIChfX201MTJpIF9fVywgX19tbWFzazE2IF9fVSwgX19tNTEyaSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BzcmFkNTEyX21hc2sgKChfX3YxNnNpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjRzaSkgX19CLAorICAgICAgICAgICAgIChfX3YxNnNpKSBfX1csCisgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9zcmFfZXBpMzIgKF9fbW1hc2sxNiBfX1UsIF9fbTUxMmkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wc3JhZDUxMl9tYXNrICgoX192MTZzaSkgX19BLAorICAgICAgICAgICAgIChfX3Y0c2kpIF9fQiwKKyAgICAgICAgICAgICAoX192MTZzaSkKKyAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19zaTUxMiAoKSwKKyAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX3NyYV9lcGk2NCAoX19tNTEyaSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BzcmFxNTEyX21hc2sgKChfX3Y4ZGkpIF9fQSwKKyAgICAgICAgICAgICAoX192MmRpKSBfX0IsCisgICAgICAgICAgICAgKF9fdjhkaSkKKyAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19zaTUxMiAoKSwKKyAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX3NyYV9lcGk2NCAoX19tNTEyaSBfX1csIF9fbW1hc2s4IF9fVSwgX19tNTEyaSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BzcmFxNTEyX21hc2sgKChfX3Y4ZGkpIF9fQSwKKyAgICAgICAgICAgICAoX192MmRpKSBfX0IsCisgICAgICAgICAgICAgKF9fdjhkaSkgX19XLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9zcmFfZXBpNjQgKF9fbW1hc2s4IF9fVSwgX19tNTEyaSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BzcmFxNTEyX21hc2sgKChfX3Y4ZGkpIF9fQSwKKyAgICAgICAgICAgICAoX192MmRpKSBfX0IsCisgICAgICAgICAgICAgKF9fdjhkaSkKKyAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19zaTUxMiAoKSwKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfc3Jhdl9lcGkzMiAoX19tNTEyaSBfX1gsIF9fbTUxMmkgX19ZKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BzcmF2MTZzaV9tYXNrICgoX192MTZzaSkgX19YLAorICAgICAgICAgICAgICAoX192MTZzaSkgX19ZLAorICAgICAgICAgICAgICAoX192MTZzaSkKKyAgICAgICAgICAgICAgX21tNTEyX3NldHplcm9fc2k1MTIgKCksCisgICAgICAgICAgICAgIChfX21tYXNrMTYpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX3NyYXZfZXBpMzIgKF9fbTUxMmkgX19XLCBfX21tYXNrMTYgX19VLCBfX201MTJpIF9fWCwgX19tNTEyaSBfX1kpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcHNyYXYxNnNpX21hc2sgKChfX3YxNnNpKSBfX1gsCisgICAgICAgICAgICAgIChfX3YxNnNpKSBfX1ksCisgICAgICAgICAgICAgIChfX3YxNnNpKSBfX1csCisgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfc3Jhdl9lcGkzMiAoX19tbWFzazE2IF9fVSwgX19tNTEyaSBfX1gsIF9fbTUxMmkgX19ZKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BzcmF2MTZzaV9tYXNrICgoX192MTZzaSkgX19YLAorICAgICAgICAgICAgICAoX192MTZzaSkgX19ZLAorICAgICAgICAgICAgICAoX192MTZzaSkKKyAgICAgICAgICAgICAgX21tNTEyX3NldHplcm9fc2k1MTIgKCksCisgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfc3Jhdl9lcGk2NCAoX19tNTEyaSBfX1gsIF9fbTUxMmkgX19ZKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BzcmF2OGRpX21hc2sgKChfX3Y4ZGkpIF9fWCwKKyAgICAgICAgICAgICAoX192OGRpKSBfX1ksCisgICAgICAgICAgICAgKF9fdjhkaSkKKyAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19zaTUxMiAoKSwKKyAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX3NyYXZfZXBpNjQgKF9fbTUxMmkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTUxMmkgX19YLCBfX201MTJpIF9fWSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wc3JhdjhkaV9tYXNrICgoX192OGRpKSBfX1gsCisgICAgICAgICAgICAgKF9fdjhkaSkgX19ZLAorICAgICAgICAgICAgIChfX3Y4ZGkpIF9fVywKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfc3Jhdl9lcGk2NCAoX19tbWFzazggX19VLCBfX201MTJpIF9fWCwgX19tNTEyaSBfX1kpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcHNyYXY4ZGlfbWFzayAoKF9fdjhkaSkgX19YLAorICAgICAgICAgICAgIChfX3Y4ZGkpIF9fWSwKKyAgICAgICAgICAgICAoX192OGRpKQorICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3NpNTEyICgpLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9zcmxfZXBpMzIgKF9fbTUxMmkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wc3JsZDUxMl9tYXNrICgoX192MTZzaSkgX19BLAorICAgICAgICAgICAgIChfX3Y0c2kpIF9fQiwKKyAgICAgICAgICAgICAoX192MTZzaSkKKyAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19zaTUxMiAoKSwKKyAgICAgICAgICAgICAoX19tbWFzazE2KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19zcmxfZXBpMzIgKF9fbTUxMmkgX19XLCBfX21tYXNrMTYgX19VLCBfX201MTJpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcHNybGQ1MTJfbWFzayAoKF9fdjE2c2kpIF9fQSwKKyAgICAgICAgICAgICAoX192NHNpKSBfX0IsCisgICAgICAgICAgICAgKF9fdjE2c2kpIF9fVywKKyAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X3NybF9lcGkzMiAoX19tbWFzazE2IF9fVSwgX19tNTEyaSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3BzcmxkNTEyX21hc2sgKChfX3YxNnNpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjRzaSkgX19CLAorICAgICAgICAgICAgIChfX3YxNnNpKQorICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3NpNTEyICgpLAorICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfc3JsX2VwaTY0IChfX201MTJpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcHNybHE1MTJfbWFzayAoKF9fdjhkaSkgX19BLAorICAgICAgICAgICAgIChfX3YyZGkpIF9fQiwKKyAgICAgICAgICAgICAoX192OGRpKQorICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3NpNTEyICgpLAorICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfc3JsX2VwaTY0IChfX201MTJpIF9fVywgX19tbWFzazggX19VLCBfX201MTJpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcHNybHE1MTJfbWFzayAoKF9fdjhkaSkgX19BLAorICAgICAgICAgICAgIChfX3YyZGkpIF9fQiwKKyAgICAgICAgICAgICAoX192OGRpKSBfX1csCisgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X3NybF9lcGk2NCAoX19tbWFzazggX19VLCBfX201MTJpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcHNybHE1MTJfbWFzayAoKF9fdjhkaSkgX19BLAorICAgICAgICAgICAgIChfX3YyZGkpIF9fQiwKKyAgICAgICAgICAgICAoX192OGRpKQorICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3NpNTEyICgpLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9zcmx2X2VwaTMyIChfX201MTJpIF9fWCwgX19tNTEyaSBfX1kpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcHNybHYxNnNpX21hc2sgKChfX3YxNnNpKSBfX1gsCisgICAgICAgICAgICAgIChfX3YxNnNpKSBfX1ksCisgICAgICAgICAgICAgIChfX3YxNnNpKQorICAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19zaTUxMiAoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2sxNikgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfc3Jsdl9lcGkzMiAoX19tNTEyaSBfX1csIF9fbW1hc2sxNiBfX1UsIF9fbTUxMmkgX19YLCBfX201MTJpIF9fWSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wc3JsdjE2c2lfbWFzayAoKF9fdjE2c2kpIF9fWCwKKyAgICAgICAgICAgICAgKF9fdjE2c2kpIF9fWSwKKyAgICAgICAgICAgICAgKF9fdjE2c2kpIF9fVywKKyAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9zcmx2X2VwaTMyIChfX21tYXNrMTYgX19VLCBfX201MTJpIF9fWCwgX19tNTEyaSBfX1kpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcHNybHYxNnNpX21hc2sgKChfX3YxNnNpKSBfX1gsCisgICAgICAgICAgICAgIChfX3YxNnNpKSBfX1ksCisgICAgICAgICAgICAgIChfX3YxNnNpKQorICAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19zaTUxMiAoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9zcmx2X2VwaTY0IChfX201MTJpIF9fWCwgX19tNTEyaSBfX1kpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcHNybHY4ZGlfbWFzayAoKF9fdjhkaSkgX19YLAorICAgICAgICAgICAgIChfX3Y4ZGkpIF9fWSwKKyAgICAgICAgICAgICAoX192OGRpKQorICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3NpNTEyICgpLAorICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfc3Jsdl9lcGk2NCAoX19tNTEyaSBfX1csIF9fbW1hc2s4IF9fVSwgX19tNTEyaSBfX1gsIF9fbTUxMmkgX19ZKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3Bzcmx2OGRpX21hc2sgKChfX3Y4ZGkpIF9fWCwKKyAgICAgICAgICAgICAoX192OGRpKSBfX1ksCisgICAgICAgICAgICAgKF9fdjhkaSkgX19XLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9zcmx2X2VwaTY0IChfX21tYXNrOCBfX1UsIF9fbTUxMmkgX19YLCBfX201MTJpIF9fWSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wc3JsdjhkaV9tYXNrICgoX192OGRpKSBfX1gsCisgICAgICAgICAgICAgKF9fdjhkaSkgX19ZLAorICAgICAgICAgICAgIChfX3Y4ZGkpCisgICAgICAgICAgICAgX21tNTEyX3NldHplcm9fc2k1MTIgKCksCisgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCisjZGVmaW5lIF9tbTUxMl90ZXJuYXJ5bG9naWNfZXBpMzIoQSwgQiwgQywgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmkpX19idWlsdGluX2lhMzJfcHRlcm5sb2dkNTEyX21hc2soKF9fdjE2c2kpKF9fbTUxMmkpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNpKShfX201MTJpKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzaSkoX19tNTEyaSkoQyksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNiktMSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2tfdGVybmFyeWxvZ2ljX2VwaTMyKEEsIFUsIEIsIEMsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX3B0ZXJubG9nZDUxMl9tYXNrKChfX3YxNnNpKShfX201MTJpKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzaSkoX19tNTEyaSkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpKF9fbTUxMmkpKEMpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpKFUpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza3pfdGVybmFyeWxvZ2ljX2VwaTMyKFUsIEEsIEIsIEMsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX3B0ZXJubG9nZDUxMl9tYXNreigoX192MTZzaSkoX19tNTEyaSkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNpKShfX201MTJpKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpKF9fbTUxMmkpKEMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShpbW0pLCAoX19tbWFzazE2KShVKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX3Rlcm5hcnlsb2dpY19lcGk2NChBLCBCLCBDLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9wdGVybmxvZ3E1MTJfbWFzaygoX192OGRpKShfX201MTJpKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKShfX201MTJpKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKShfX201MTJpKShDKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX3Rlcm5hcnlsb2dpY19lcGk2NChBLCBVLCBCLCBDLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9wdGVybmxvZ3E1MTJfbWFzaygoX192OGRpKShfX201MTJpKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKShfX201MTJpKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKShfX201MTJpKShDKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza3pfdGVybmFyeWxvZ2ljX2VwaTY0KFUsIEEsIEIsIEMsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX3B0ZXJubG9ncTUxMl9tYXNreigoX192OGRpKShfX201MTJpKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkaSkoX19tNTEyaSkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGkpKF9fbTUxMmkpKEMpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW1fY3Z0X3JvdW5kc2RfaTY0KEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAobG9uZyBsb25nKV9fYnVpbHRpbl9pYTMyX3ZjdnRzZDJzaTY0KChfX3YyZGYpKF9fbTEyOGQpKEEpLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tX2N2dF9yb3VuZHNkX3NpMzIoQSwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChpbnQpX19idWlsdGluX2lhMzJfdmN2dHNkMnNpMzIoKF9fdjJkZikoX19tMTI4ZCkoQSksIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW1fY3Z0X3JvdW5kc2RfaTMyKEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoaW50KV9fYnVpbHRpbl9pYTMyX3ZjdnRzZDJzaTMyKChfX3YyZGYpKF9fbTEyOGQpKEEpLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tX2N2dF9yb3VuZHNkX3UzMihBLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKHVuc2lnbmVkIGludClfX2J1aWx0aW5faWEzMl92Y3Z0c2QydXNpMzIoKF9fdjJkZikoX19tMTI4ZCkoQSksIChpbnQpKFIpKTsgfSkKKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY3Z0c2RfdTMyIChfX20xMjhkIF9fQSkKK3sKKyAgcmV0dXJuICh1bnNpZ25lZCkgX19idWlsdGluX2lhMzJfdmN2dHNkMnVzaTMyICgoX192MmRmKSBfX0EsCisgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworI2RlZmluZSBfbW1fY3Z0X3JvdW5kc2RfdTY0KEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAodW5zaWduZWQgbG9uZyBsb25nKV9fYnVpbHRpbl9pYTMyX3ZjdnRzZDJ1c2k2NCgoX192MmRmKShfX20xMjhkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShSKSk7IH0pCisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcgbG9uZyBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jdnRzZF91NjQgKF9fbTEyOGQgX19BKQoreworICByZXR1cm4gKHVuc2lnbmVkIGxvbmcgbG9uZykgX19idWlsdGluX2lhMzJfdmN2dHNkMnVzaTY0ICgoX192MmRmKQorICAgICAgICAgICAgICAgICBfX0EsCisgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKKyNkZWZpbmUgX21tX2N2dF9yb3VuZHNzX3NpMzIoQSwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChpbnQpX19idWlsdGluX2lhMzJfdmN2dHNzMnNpMzIoKF9fdjRzZikoX19tMTI4KShBKSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbV9jdnRfcm91bmRzc19pMzIoQSwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChpbnQpX19idWlsdGluX2lhMzJfdmN2dHNzMnNpMzIoKF9fdjRzZikoX19tMTI4KShBKSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbV9jdnRfcm91bmRzc19zaTY0KEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAobG9uZyBsb25nKV9fYnVpbHRpbl9pYTMyX3ZjdnRzczJzaTY0KChfX3Y0c2YpKF9fbTEyOCkoQSksIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW1fY3Z0X3JvdW5kc3NfaTY0KEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAobG9uZyBsb25nKV9fYnVpbHRpbl9pYTMyX3ZjdnRzczJzaTY0KChfX3Y0c2YpKF9fbTEyOCkoQSksIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW1fY3Z0X3JvdW5kc3NfdTMyKEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAodW5zaWduZWQgaW50KV9fYnVpbHRpbl9pYTMyX3ZjdnRzczJ1c2kzMigoX192NHNmKShfX20xMjgpKEEpLCAoaW50KShSKSk7IH0pCisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2N2dHNzX3UzMiAoX19tMTI4IF9fQSkKK3sKKyAgcmV0dXJuICh1bnNpZ25lZCkgX19idWlsdGluX2lhMzJfdmN2dHNzMnVzaTMyICgoX192NHNmKSBfX0EsCisgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworI2RlZmluZSBfbW1fY3Z0X3JvdW5kc3NfdTY0KEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAodW5zaWduZWQgbG9uZyBsb25nKV9fYnVpbHRpbl9pYTMyX3ZjdnRzczJ1c2k2NCgoX192NHNmKShfX20xMjgpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKFIpKTsgfSkKKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZyBsb25nIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2N2dHNzX3U2NCAoX19tMTI4IF9fQSkKK3sKKyAgcmV0dXJuICh1bnNpZ25lZCBsb25nIGxvbmcpIF9fYnVpbHRpbl9pYTMyX3ZjdnRzczJ1c2k2NCAoKF9fdjRzZikKKyAgICAgICAgICAgICAgICAgX19BLAorICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCisjZGVmaW5lIF9tbV9jdnR0X3JvdW5kc2RfaTMyKEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoaW50KV9fYnVpbHRpbl9pYTMyX3ZjdnR0c2Qyc2kzMigoX192MmRmKShfX20xMjhkKShBKSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbV9jdnR0X3JvdW5kc2Rfc2kzMihBLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKGludClfX2J1aWx0aW5faWEzMl92Y3Z0dHNkMnNpMzIoKF9fdjJkZikoX19tMTI4ZCkoQSksIChpbnQpKFIpKTsgfSkKKworc3RhdGljIF9faW5saW5lX18gaW50IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2N2dHRzZF9pMzIgKF9fbTEyOGQgX19BKQoreworICByZXR1cm4gKGludCkgX19idWlsdGluX2lhMzJfdmN2dHRzZDJzaTMyICgoX192MmRmKSBfX0EsCisgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKKyNkZWZpbmUgX21tX2N2dHRfcm91bmRzZF9zaTY0KEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAobG9uZyBsb25nKV9fYnVpbHRpbl9pYTMyX3ZjdnR0c2Qyc2k2NCgoX192MmRmKShfX20xMjhkKShBKSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbV9jdnR0X3JvdW5kc2RfaTY0KEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAobG9uZyBsb25nKV9fYnVpbHRpbl9pYTMyX3ZjdnR0c2Qyc2k2NCgoX192MmRmKShfX20xMjhkKShBKSwgKGludCkoUikpOyB9KQorCitzdGF0aWMgX19pbmxpbmVfXyBsb25nIGxvbmcgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY3Z0dHNkX2k2NCAoX19tMTI4ZCBfX0EpCit7CisgIHJldHVybiAobG9uZyBsb25nKSBfX2J1aWx0aW5faWEzMl92Y3Z0dHNkMnNpNjQgKChfX3YyZGYpIF9fQSwKKyAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworI2RlZmluZSBfbW1fY3Z0dF9yb3VuZHNkX3UzMihBLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKHVuc2lnbmVkIGludClfX2J1aWx0aW5faWEzMl92Y3Z0dHNkMnVzaTMyKChfX3YyZGYpKF9fbTEyOGQpKEEpLCAoaW50KShSKSk7IH0pCisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2N2dHRzZF91MzIgKF9fbTEyOGQgX19BKQoreworICByZXR1cm4gKHVuc2lnbmVkKSBfX2J1aWx0aW5faWEzMl92Y3Z0dHNkMnVzaTMyICgoX192MmRmKSBfX0EsCisgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKKyNkZWZpbmUgX21tX2N2dHRfcm91bmRzZF91NjQoQSwgUikgX19leHRlbnNpb25fXyAoeyBcCisgICh1bnNpZ25lZCBsb25nIGxvbmcpX19idWlsdGluX2lhMzJfdmN2dHRzZDJ1c2k2NCgoX192MmRmKShfX20xMjhkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoUikpOyB9KQorCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nIGxvbmcgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY3Z0dHNkX3U2NCAoX19tMTI4ZCBfX0EpCit7CisgIHJldHVybiAodW5zaWduZWQgbG9uZyBsb25nKSBfX2J1aWx0aW5faWEzMl92Y3Z0dHNkMnVzaTY0ICgoX192MmRmKQorICAgICAgICAgICAgICAgICAgX19BLAorICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworI2RlZmluZSBfbW1fY3Z0dF9yb3VuZHNzX2kzMihBLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKGludClfX2J1aWx0aW5faWEzMl92Y3Z0dHNzMnNpMzIoKF9fdjRzZikoX19tMTI4KShBKSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbV9jdnR0X3JvdW5kc3Nfc2kzMihBLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKGludClfX2J1aWx0aW5faWEzMl92Y3Z0dHNzMnNpMzIoKF9fdjRzZikoX19tMTI4KShBKSwgKGludCkoUikpOyB9KQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY3Z0dHNzX2kzMiAoX19tMTI4IF9fQSkKK3sKKyAgcmV0dXJuIChpbnQpIF9fYnVpbHRpbl9pYTMyX3ZjdnR0c3Myc2kzMiAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCisjZGVmaW5lIF9tbV9jdnR0X3JvdW5kc3NfaTY0KEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAobG9uZyBsb25nKV9fYnVpbHRpbl9pYTMyX3ZjdnR0c3Myc2k2NCgoX192NHNmKShfX20xMjgpKEEpLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tX2N2dHRfcm91bmRzc19zaTY0KEEsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAobG9uZyBsb25nKV9fYnVpbHRpbl9pYTMyX3ZjdnR0c3Myc2k2NCgoX192NHNmKShfX20xMjgpKEEpLCAoaW50KShSKSk7IH0pCisKK3N0YXRpYyBfX2lubGluZV9fIGxvbmcgbG9uZyBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jdnR0c3NfaTY0IChfX20xMjggX19BKQoreworICByZXR1cm4gKGxvbmcgbG9uZykgX19idWlsdGluX2lhMzJfdmN2dHRzczJzaTY0ICgoX192NHNmKSBfX0EsCisgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKKyNkZWZpbmUgX21tX2N2dHRfcm91bmRzc191MzIoQSwgUikgX19leHRlbnNpb25fXyAoeyBcCisgICh1bnNpZ25lZCBpbnQpX19idWlsdGluX2lhMzJfdmN2dHRzczJ1c2kzMigoX192NHNmKShfX20xMjgpKEEpLCAoaW50KShSKSk7IH0pCisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2N2dHRzc191MzIgKF9fbTEyOCBfX0EpCit7CisgIHJldHVybiAodW5zaWduZWQpIF9fYnVpbHRpbl9pYTMyX3ZjdnR0c3MydXNpMzIgKChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworI2RlZmluZSBfbW1fY3Z0dF9yb3VuZHNzX3U2NChBLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKHVuc2lnbmVkIGxvbmcgbG9uZylfX2J1aWx0aW5faWEzMl92Y3Z0dHNzMnVzaTY0KChfX3Y0c2YpKF9fbTEyOCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKFIpKTsgfSkKKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZyBsb25nIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2N2dHRzc191NjQgKF9fbTEyOCBfX0EpCit7CisgIHJldHVybiAodW5zaWduZWQgbG9uZyBsb25nKSBfX2J1aWx0aW5faWEzMl92Y3Z0dHNzMnVzaTY0ICgoX192NHNmKQorICAgICAgICAgICAgICAgICAgX19BLAorICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrMl9wZXJtdXRleDJ2YXJfcGQgKF9fbTUxMmQgX19BLCBfX201MTJpIF9fSSwgX19tbWFzazggX19VLAorICAgICAgICAgICAgX19tNTEyZCBfX0IpCit7CisgIHJldHVybiAoX19tNTEyZCkgX19idWlsdGluX2lhMzJfdnBlcm1pMnZhcnBkNTEyX21hc2sgKChfX3Y4ZGYpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjhkaSkgX19JCisgICAgICAgICAgICAgIC8qIGlkeCAqLyAsCisgICAgICAgICAgICAgIChfX3Y4ZGYpIF9fQiwKKyAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFzazJfcGVybXV0ZXgydmFyX3BzIChfX201MTIgX19BLCBfX201MTJpIF9fSSwgX19tbWFzazE2IF9fVSwKKyAgICAgICAgICAgIF9fbTUxMiBfX0IpCit7CisgIHJldHVybiAoX19tNTEyKSBfX2J1aWx0aW5faWEzMl92cGVybWkydmFycHM1MTJfbWFzayAoKF9fdjE2c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAoX192MTZzaSkgX19JCisgICAgICAgICAgICAgICAgICAgLyogaWR4ICovICwKKyAgICAgICAgICAgICAgICAgICAoX192MTZzZikgX19CLAorICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFzazJfcGVybXV0ZXgydmFyX2VwaTY0IChfX201MTJpIF9fQSwgX19tNTEyaSBfX0ksCisgICAgICAgICBfX21tYXNrOCBfX1UsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaTJ2YXJxNTEyX21hc2sgKChfX3Y4ZGkpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAoX192OGRpKSBfX0kKKyAgICAgICAgICAgICAgICAgICAvKiBpZHggKi8gLAorICAgICAgICAgICAgICAgICAgIChfX3Y4ZGkpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKKyNkZWZpbmUgX21tNTEyX3Blcm11dGVfcGQoWCwgQykgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJkKV9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3Y4ZGYpKF9fbTUxMmQpKFgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpX21tNTEyX3VuZGVmaW5lZF9wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgKyAoKChDKSA+PiAwKSAmIDB4MSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCArICgoKEMpID4+IDEpICYgMHgxKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICsgKCgoQykgPj4gMikgJiAweDEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgKyAoKChDKSA+PiAzKSAmIDB4MSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCArICgoKEMpID4+IDQpICYgMHgxKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ICsgKCgoQykgPj4gNSkgJiAweDEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYgKyAoKChDKSA+PiA2KSAmIDB4MSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiArICgoKEMpID4+IDcpICYgMHgxKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2tfcGVybXV0ZV9wZChXLCBVLCBYLCBDKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmQpX19idWlsdGluX2lhMzJfc2VsZWN0cGRfNTEyKChfX21tYXNrOCkoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpX21tNTEyX3Blcm11dGVfcGQoKFgpLCAoQykpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKShfX201MTJkKShXKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X3Blcm11dGVfcGQoVSwgWCwgQykgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJkKV9fYnVpbHRpbl9pYTMyX3NlbGVjdHBkXzUxMigoX19tbWFzazgpKFUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKV9tbTUxMl9wZXJtdXRlX3BkKChYKSwgKEMpKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZilfbW01MTJfc2V0emVyb19wZCgpKTsgfSkKKworI2RlZmluZSBfbW01MTJfcGVybXV0ZV9wcyhYLCBDKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMilfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcigoX192MTZzZikoX19tNTEyKShYKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKV9tbTUxMl91bmRlZmluZWRfcHMoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICArICgoKEMpID4+IDApICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICArICgoKEMpID4+IDIpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICArICgoKEMpID4+IDQpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICArICgoKEMpID4+IDYpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ICArICgoKEMpID4+IDApICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ICArICgoKEMpID4+IDIpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ICArICgoKEMpID4+IDQpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ICArICgoKEMpID4+IDYpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ICArICgoKEMpID4+IDApICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ICArICgoKEMpID4+IDIpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ICArICgoKEMpID4+IDQpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ICArICgoKEMpID4+IDYpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiArICgoKEMpID4+IDApICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiArICgoKEMpID4+IDIpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiArICgoKEMpID4+IDQpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiArICgoKEMpID4+IDYpICYgMHgzKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2tfcGVybXV0ZV9wcyhXLCBVLCBYLCBDKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMilfX2J1aWx0aW5faWEzMl9zZWxlY3Rwc181MTIoKF9fbW1hc2sxNikoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpX21tNTEyX3Blcm11dGVfcHMoKFgpLCAoQykpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKShfX201MTIpKFcpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza3pfcGVybXV0ZV9wcyhVLCBYLCBDKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMilfX2J1aWx0aW5faWEzMl9zZWxlY3Rwc181MTIoKF9fbW1hc2sxNikoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpX21tNTEyX3Blcm11dGVfcHMoKFgpLCAoQykpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKV9tbTUxMl9zZXR6ZXJvX3BzKCkpOyB9KQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX3Blcm11dGV2YXJfcGQgKF9fbTUxMmQgX19BLCBfX201MTJpIF9fQykKK3sKKyAgcmV0dXJuIChfX201MTJkKSBfX2J1aWx0aW5faWEzMl92cGVybWlsdmFycGQ1MTJfbWFzayAoKF9fdjhkZikgX19BLAorICAgICAgICAgICAgICAoX192OGRpKSBfX0MsCisgICAgICAgICAgICAgIChfX3Y4ZGYpCisgICAgICAgICAgICAgIF9tbTUxMl91bmRlZmluZWRfcGQgKCksCisgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfcGVybXV0ZXZhcl9wZCAoX19tNTEyZCBfX1csIF9fbW1hc2s4IF9fVSwgX19tNTEyZCBfX0EsIF9fbTUxMmkgX19DKQoreworICByZXR1cm4gKF9fbTUxMmQpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaWx2YXJwZDUxMl9tYXNrICgoX192OGRmKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y4ZGkpIF9fQywKKyAgICAgICAgICAgICAgKF9fdjhkZikgX19XLAorICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfcGVybXV0ZXZhcl9wZCAoX19tbWFzazggX19VLCBfX201MTJkIF9fQSwgX19tNTEyaSBfX0MpCit7CisgIHJldHVybiAoX19tNTEyZCkgX19idWlsdGluX2lhMzJfdnBlcm1pbHZhcnBkNTEyX21hc2sgKChfX3Y4ZGYpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjhkaSkgX19DLAorICAgICAgICAgICAgICAoX192OGRmKQorICAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19wZCAoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfcGVybXV0ZXZhcl9wcyAoX19tNTEyIF9fQSwgX19tNTEyaSBfX0MpCit7CisgIHJldHVybiAoX19tNTEyKSBfX2J1aWx0aW5faWEzMl92cGVybWlsdmFycHM1MTJfbWFzayAoKF9fdjE2c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAoX192MTZzaSkgX19DLAorICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKQorICAgICAgICAgICAgICAgICAgIF9tbTUxMl91bmRlZmluZWRfcHMgKCksCisgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19wZXJtdXRldmFyX3BzIChfX201MTIgX19XLCBfX21tYXNrMTYgX19VLCBfX201MTIgX19BLCBfX201MTJpIF9fQykKK3sKKyAgcmV0dXJuIChfX201MTIpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaWx2YXJwczUxMl9tYXNrICgoX192MTZzZikgX19BLAorICAgICAgICAgICAgICAgICAgIChfX3YxNnNpKSBfX0MsCisgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpIF9fVywKKyAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfcGVybXV0ZXZhcl9wcyAoX19tbWFzazE2IF9fVSwgX19tNTEyIF9fQSwgX19tNTEyaSBfX0MpCit7CisgIHJldHVybiAoX19tNTEyKSBfX2J1aWx0aW5faWEzMl92cGVybWlsdmFycHM1MTJfbWFzayAoKF9fdjE2c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAoX192MTZzaSkgX19DLAorICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKQorICAgICAgICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3BzICgpLAorICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX3Blcm11dGV4MnZhcl9wZChfX201MTJkIF9fQSwgX19tNTEyaSBfX0ksIF9fbTUxMmQgX19CKQoreworICByZXR1cm4gKF9fbTUxMmQpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJwZDUxMl9tYXNrICgoX192OGRpKSBfX0kKKyAgICAgICAgICAgICAgICAgICAgLyogaWR4ICovICwKKyAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikgX19BLAorICAgICAgICAgICAgICAgICAgICAoX192OGRmKSBfX0IsCisgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfcGVybXV0ZXgydmFyX3BkIChfX201MTJkIF9fQSwgX19tbWFzazggX19VLCBfX201MTJpIF9fSSwgX19tNTEyZCBfX0IpCit7CisgIHJldHVybiAoX19tNTEyZCkgX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnBkNTEyX21hc2sgKChfX3Y4ZGkpIF9fSQorICAgICAgICAgICAgICAgICAgICAvKiBpZHggKi8gLAorICAgICAgICAgICAgICAgICAgICAoX192OGRmKSBfX0EsCisgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X3Blcm11dGV4MnZhcl9wZCAoX19tbWFzazggX19VLCBfX201MTJkIF9fQSwgX19tNTEyaSBfX0ksCisgICAgICAgICAgICBfX201MTJkIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJkKSBfX2J1aWx0aW5faWEzMl92cGVybXQydmFycGQ1MTJfbWFza3ogKChfX3Y4ZGkpIF9fSQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWR4ICovICwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTUxMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9wZXJtdXRleDJ2YXJfcHMoX19tNTEyIF9fQSwgX19tNTEyaSBfX0ksIF9fbTUxMiBfX0IpCit7CisgIHJldHVybiAoX19tNTEyKSBfX2J1aWx0aW5faWEzMl92cGVybXQydmFycHM1MTJfbWFzayAoKF9fdjE2c2kpIF9fSQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWR4ICovICwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikgX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19wZXJtdXRleDJ2YXJfcHMgKF9fbTUxMiBfX0EsIF9fbW1hc2sxNiBfX1UsIF9fbTUxMmkgX19JLCBfX201MTIgX19CKQoreworICByZXR1cm4gKF9fbTUxMikgX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnBzNTEyX21hc2sgKChfX3YxNnNpKSBfX0kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlkeCAqLyAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9wZXJtdXRleDJ2YXJfcHMgKF9fbW1hc2sxNiBfX1UsIF9fbTUxMiBfX0EsIF9fbTUxMmkgX19JLAorICAgICAgICAgICAgX19tNTEyIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTIpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJwczUxMl9tYXNreiAoKF9fdjE2c2kpIF9fSQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZHggKi8gLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikgX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfdGVzdG5fZXBpMzJfbWFzayAoX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbW1hc2sxNikgX19idWlsdGluX2lhMzJfcHRlc3RubWQ1MTIgKChfX3YxNnNpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjE2c2kpIF9fQiwKKyAgICAgICAgICAgICAoX19tbWFzazE2KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2sxNiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX3Rlc3RuX2VwaTMyX21hc2sgKF9fbW1hc2sxNiBfX1UsIF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX21tYXNrMTYpIF9fYnVpbHRpbl9pYTMyX3B0ZXN0bm1kNTEyICgoX192MTZzaSkgX19BLAorICAgICAgICAgICAgIChfX3YxNnNpKSBfX0IsIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX3Rlc3RuX2VwaTY0X21hc2sgKF9fbTUxMmkgX19BLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX21tYXNrOCkgX19idWlsdGluX2lhMzJfcHRlc3RubXE1MTIgKChfX3Y4ZGkpIF9fQSwKKyAgICAgICAgICAgIChfX3Y4ZGkpIF9fQiwKKyAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX3Rlc3RuX2VwaTY0X21hc2sgKF9fbW1hc2s4IF9fVSwgX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbW1hc2s4KSBfX2J1aWx0aW5faWEzMl9wdGVzdG5tcTUxMiAoKF9fdjhkaSkgX19BLAorICAgICAgICAgICAgKF9fdjhkaSkgX19CLCBfX1UpOworfQorCisjZGVmaW5lIF9tbTUxMl9jdnR0X3JvdW5kcGRfZXB1MzIoQSwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX2N2dHRwZDJ1ZHE1MTJfbWFzaygoX192OGRmKShfX201MTJkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzaSlfbW0yNTZfdW5kZWZpbmVkX3NpMjU2KCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX2N2dHRfcm91bmRwZF9lcHUzMihXLCBVLCBBLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmkpX19idWlsdGluX2lhMzJfY3Z0dHBkMnVkcTUxMl9tYXNrKChfX3Y4ZGYpKF9fbTUxMmQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNpKShfX20yNTZpKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrel9jdnR0X3JvdW5kcGRfZXB1MzIoVSwgQSwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX2N2dHRwZDJ1ZHE1MTJfbWFzaygoX192OGRmKShfX201MTJkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzaSlfbW0yNTZfc2V0emVyb19zaTI1NigpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShSKSk7IH0pCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfY3Z0dHBkX2VwdTMyIChfX201MTJkIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9jdnR0cGQydWRxNTEyX21hc2sgKChfX3Y4ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAgIChfX3Y4c2kpCisgICAgICAgICAgICAgICAgICBfbW0yNTZfdW5kZWZpbmVkX3NpMjU2ICgpLAorICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSwKKyAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19jdnR0cGRfZXB1MzIgKF9fbTI1NmkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTUxMmQgX19BKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX2N2dHRwZDJ1ZHE1MTJfbWFzayAoKF9fdjhkZikgX19BLAorICAgICAgICAgICAgICAgICAgKF9fdjhzaSkgX19XLAorICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X2N2dHRwZF9lcHUzMiAoX19tbWFzazggX19VLCBfX201MTJkIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9jdnR0cGQydWRxNTEyX21hc2sgKChfX3Y4ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAgIChfX3Y4c2kpCisgICAgICAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworI2RlZmluZSBfbW1fcm91bmRzY2FsZV9yb3VuZF9zZChBLCBCLCBpbW0sIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9ybmRzY2FsZXNkX3JvdW5kX21hc2soKF9fdjJkZikoX19tMTI4ZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fbTEyOGQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKV9tbV9zZXR6ZXJvX3BkKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbV9yb3VuZHNjYWxlX3NkKEEsIEIsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX3JuZHNjYWxlc2Rfcm91bmRfbWFzaygoX192MmRmKShfX20xMjhkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZikoX19tMTI4ZCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpX21tX3NldHplcm9fcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrX3JvdW5kc2NhbGVfc2QoVywgVSwgQSwgQiwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGQpX19idWlsdGluX2lhMzJfcm5kc2NhbGVzZF9yb3VuZF9tYXNrKChfX3YyZGYpKF9fbTEyOGQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZikoX19tMTI4ZCkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7IH0pCisKKyNkZWZpbmUgX21tX21hc2tfcm91bmRzY2FsZV9yb3VuZF9zZChXLCBVLCBBLCBCLCBJLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGQpX19idWlsdGluX2lhMzJfcm5kc2NhbGVzZF9yb3VuZF9tYXNrKChfX3YyZGYpKF9fbTEyOGQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZikoX19tMTI4ZCkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIChpbnQpKEkpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2t6X3JvdW5kc2NhbGVfc2QoVSwgQSwgQiwgSSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX3JuZHNjYWxlc2Rfcm91bmRfbWFzaygoX192MmRmKShfX20xMjhkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZikoX19tMTI4ZCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpX21tX3NldHplcm9fcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSwgKGludCkoSSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7IH0pCisKKyNkZWZpbmUgX21tX21hc2t6X3JvdW5kc2NhbGVfcm91bmRfc2QoVSwgQSwgQiwgSSwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX3JuZHNjYWxlc2Rfcm91bmRfbWFzaygoX192MmRmKShfX20xMjhkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZikoX19tMTI4ZCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpX21tX3NldHplcm9fcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSwgKGludCkoSSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW1fcm91bmRzY2FsZV9yb3VuZF9zcyhBLCBCLCBpbW0sIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX3JuZHNjYWxlc3Nfcm91bmRfbWFzaygoX192NHNmKShfX20xMjgpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpKF9fbTEyOCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZilfbW1fc2V0emVyb19wcygpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tX3JvdW5kc2NhbGVfc3MoQSwgQiwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOClfX2J1aWx0aW5faWEzMl9ybmRzY2FsZXNzX3JvdW5kX21hc2soKF9fdjRzZikoX19tMTI4KShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKShfX20xMjgpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpX21tX3NldHplcm9fcHMoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEsIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsgfSkKKworI2RlZmluZSBfbW1fbWFza19yb3VuZHNjYWxlX3NzKFcsIFUsIEEsIEIsIEkpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX3JuZHNjYWxlc3Nfcm91bmRfbWFzaygoX192NHNmKShfX20xMjgpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpKF9fbTEyOCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShJKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrX3JvdW5kc2NhbGVfcm91bmRfc3MoVywgVSwgQSwgQiwgSSwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfcm5kc2NhbGVzc19yb3VuZF9tYXNrKChfX3Y0c2YpKF9fbTEyOCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKShfX20xMjgpKFcpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIChpbnQpKEkpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW1fbWFza3pfcm91bmRzY2FsZV9zcyhVLCBBLCBCLCBJKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOClfX2J1aWx0aW5faWEzMl9ybmRzY2FsZXNzX3JvdW5kX21hc2soKF9fdjRzZikoX19tMTI4KShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKShfX20xMjgpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpX21tX3NldHplcm9fcHMoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShJKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrel9yb3VuZHNjYWxlX3JvdW5kX3NzKFUsIEEsIEIsIEksIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX3JuZHNjYWxlc3Nfcm91bmRfbWFzaygoX192NHNmKShfX20xMjgpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpKF9fbTEyOCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZilfbW1fc2V0emVyb19wcygpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIChpbnQpKEkpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW01MTJfc2NhbGVmX3JvdW5kX3BkKEEsIEIsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyZClfX2J1aWx0aW5faWEzMl9zY2FsZWZwZDUxMl9tYXNrKChfX3Y4ZGYpKF9fbTUxMmQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikoX19tNTEyZCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKV9tbTUxMl91bmRlZmluZWRfcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX3NjYWxlZl9yb3VuZF9wZChXLCBVLCBBLCBCLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmQpX19idWlsdGluX2lhMzJfc2NhbGVmcGQ1MTJfbWFzaygoX192OGRmKShfX201MTJkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpKF9fbTUxMmQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikoX19tNTEyZCkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X3NjYWxlZl9yb3VuZF9wZChVLCBBLCBCLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmQpX19idWlsdGluX2lhMzJfc2NhbGVmcGQ1MTJfbWFzaygoX192OGRmKShfX201MTJkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpKF9fbTUxMmQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZilfbW01MTJfc2V0emVyb19wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSwgKGludCkoUikpOyB9KQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX3NjYWxlZl9wZCAoX19tNTEyZCBfX0EsIF9fbTUxMmQgX19CKQoreworICByZXR1cm4gKF9fbTUxMmQpIF9fYnVpbHRpbl9pYTMyX3NjYWxlZnBkNTEyX21hc2sgKChfX3Y4ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192OGRmKSBfX0IsCisgICAgICAgICAgICAgICAgKF9fdjhkZikKKyAgICAgICAgICAgICAgICBfbW01MTJfdW5kZWZpbmVkX3BkICgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEsCisgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX3NjYWxlZl9wZCAoX19tNTEyZCBfX1csIF9fbW1hc2s4IF9fVSwgX19tNTEyZCBfX0EsIF9fbTUxMmQgX19CKQoreworICByZXR1cm4gKF9fbTUxMmQpIF9fYnVpbHRpbl9pYTMyX3NjYWxlZnBkNTEyX21hc2sgKChfX3Y4ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192OGRmKSBfX0IsCisgICAgICAgICAgICAgICAgKF9fdjhkZikgX19XLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfc2NhbGVmX3BkIChfX21tYXNrOCBfX1UsIF9fbTUxMmQgX19BLCBfX201MTJkIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJkKSBfX2J1aWx0aW5faWEzMl9zY2FsZWZwZDUxMl9tYXNrICgoX192OGRmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjhkZikgX19CLAorICAgICAgICAgICAgICAgIChfX3Y4ZGYpCisgICAgICAgICAgICAgICAgX21tNTEyX3NldHplcm9fcGQgKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworI2RlZmluZSBfbW01MTJfc2NhbGVmX3JvdW5kX3BzKEEsIEIsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyKV9fYnVpbHRpbl9pYTMyX3NjYWxlZnBzNTEyX21hc2soKF9fdjE2c2YpKF9fbTUxMikoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKShfX201MTIpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZilfbW01MTJfdW5kZWZpbmVkX3BzKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpLTEsIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza19zY2FsZWZfcm91bmRfcHMoVywgVSwgQSwgQiwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTIpX19idWlsdGluX2lhMzJfc2NhbGVmcHM1MTJfbWFzaygoX192MTZzZikoX19tNTEyKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpKF9fbTUxMikoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKShfX201MTIpKFcpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KShVKSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrel9zY2FsZWZfcm91bmRfcHMoVSwgQSwgQiwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTIpX19idWlsdGluX2lhMzJfc2NhbGVmcHM1MTJfbWFzaygoX192MTZzZikoX19tNTEyKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpKF9fbTUxMikoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKV9tbTUxMl9zZXR6ZXJvX3BzKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpKFUpLCAoaW50KShSKSk7IH0pCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9zY2FsZWZfcHMgKF9fbTUxMiBfX0EsIF9fbTUxMiBfX0IpCit7CisgIHJldHVybiAoX19tNTEyKSBfX2J1aWx0aW5faWEzMl9zY2FsZWZwczUxMl9tYXNrICgoX192MTZzZikgX19BLAorICAgICAgICAgICAgICAgKF9fdjE2c2YpIF9fQiwKKyAgICAgICAgICAgICAgIChfX3YxNnNmKQorICAgICAgICAgICAgICAgX21tNTEyX3VuZGVmaW5lZF9wcyAoKSwKKyAgICAgICAgICAgICAgIChfX21tYXNrMTYpIC0xLAorICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfc2NhbGVmX3BzIChfX201MTIgX19XLCBfX21tYXNrMTYgX19VLCBfX201MTIgX19BLCBfX201MTIgX19CKQoreworICByZXR1cm4gKF9fbTUxMikgX19idWlsdGluX2lhMzJfc2NhbGVmcHM1MTJfbWFzayAoKF9fdjE2c2YpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3YxNnNmKSBfX0IsCisgICAgICAgICAgICAgICAoX192MTZzZikgX19XLAorICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VLAorICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X3NjYWxlZl9wcyAoX19tbWFzazE2IF9fVSwgX19tNTEyIF9fQSwgX19tNTEyIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTIpIF9fYnVpbHRpbl9pYTMyX3NjYWxlZnBzNTEyX21hc2sgKChfX3YxNnNmKSBfX0EsCisgICAgICAgICAgICAgICAoX192MTZzZikgX19CLAorICAgICAgICAgICAgICAgKF9fdjE2c2YpCisgICAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19wcyAoKSwKKyAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSwKKyAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKKyNkZWZpbmUgX21tX3NjYWxlZl9yb3VuZF9zZChBLCBCLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGQpX19idWlsdGluX2lhMzJfc2NhbGVmc2Rfcm91bmRfbWFzaygoX192MmRmKShfX20xMjhkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fbTEyOGQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZilfbW1fc2V0emVyb19wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xLCAoaW50KShSKSk7IH0pCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc2NhbGVmX3NkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfc2NhbGVmc2Rfcm91bmRfbWFzayAoKF9fdjJkZikgX19BLAorICAgICAgICAgICAgICAoX192MmRmKSggX19CKSwgKF9fdjJkZikgX21tX3NldHplcm9fcGQoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSwKKyAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX3NjYWxlZl9zZCAoX19tMTI4ZCBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfc2NhbGVmc2Rfcm91bmRfbWFzayAoIChfX3YyZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjJkZikgX19CLAorICAgICAgICAgICAgICAgIChfX3YyZGYpIF9fVywKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCisjZGVmaW5lIF9tbV9tYXNrX3NjYWxlZl9yb3VuZF9zZChXLCBVLCBBLCBCLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGQpX19idWlsdGluX2lhMzJfc2NhbGVmc2Rfcm91bmRfbWFzaygoX192MmRmKShfX20xMjhkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fbTEyOGQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZikoX19tMTI4ZCkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShSKSk7IH0pCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfc2NhbGVmX3NkIChfX21tYXNrOCBfX1UsIF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3NjYWxlZnNkX3JvdW5kX21hc2sgKCAoX192MmRmKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3YyZGYpIF9fQiwKKyAgICAgICAgICAgICAgICAoX192MmRmKSBfbW1fc2V0emVyb19wZCAoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCisjZGVmaW5lIF9tbV9tYXNrel9zY2FsZWZfcm91bmRfc2QoVSwgQSwgQiwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX3NjYWxlZnNkX3JvdW5kX21hc2soKF9fdjJkZikoX19tMTI4ZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpX21tX3NldHplcm9fcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW1fc2NhbGVmX3JvdW5kX3NzKEEsIEIsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX3NjYWxlZnNzX3JvdW5kX21hc2soKF9fdjRzZikoX19tMTI4KShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZilfbW1fc2V0emVyb19wcygpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEsIChpbnQpKFIpKTsgfSkKKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX3NjYWxlZl9zcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3NjYWxlZnNzX3JvdW5kX21hc2sgKChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAgICAoX192NHNmKSggX19CKSwgKF9fdjRzZikgX21tX3NldHplcm9fcHMoKSwKKyAgICAgICAgICAgICAoX19tbWFzazgpIC0xLAorICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX3NjYWxlZl9zcyAoX19tMTI4IF9fVywgX19tbWFzazggX19VLCBfX20xMjggX19BLCBfX20xMjggX19CKQoreworIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9zY2FsZWZzc19yb3VuZF9tYXNrICggKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgIChfX3Y0c2YpIF9fQiwKKyAgICAgICAgICAgICAgICAoX192NHNmKSBfX1csCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworI2RlZmluZSBfbW1fbWFza19zY2FsZWZfcm91bmRfc3MoVywgVSwgQSwgQiwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfc2NhbGVmc3Nfcm91bmRfbWFzaygoX192NHNmKShfX20xMjgpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKShfX20xMjgpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKShfX20xMjgpKFcpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShSKSk7IH0pCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9zY2FsZWZfc3MgKF9fbW1hc2s4IF9fVSwgX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfc2NhbGVmc3Nfcm91bmRfbWFzayAoIChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjRzZikgX19CLAorICAgICAgICAgICAgICAgIChfX3Y0c2YpIF9tbV9zZXR6ZXJvX3BzICgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKKyNkZWZpbmUgX21tX21hc2t6X3NjYWxlZl9yb3VuZF9zcyhVLCBBLCBCLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOClfX2J1aWx0aW5faWEzMl9zY2FsZWZzc19yb3VuZF9tYXNrKChfX3Y0c2YpKF9fbTEyOCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpKF9fbTEyOCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpX21tX3NldHplcm9fcHMoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsgfSkKKworI2RlZmluZSBfbW01MTJfc3JhaV9lcGkzMihBLCBCKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmkpX19idWlsdGluX2lhMzJfcHNyYWRpNTEyX21hc2soKF9fdjE2c2kpKF9fbTUxMmkpKEEpLCAoaW50KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzaSlfbW01MTJfc2V0emVyb19zaTUxMigpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpLTEpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX3NyYWlfZXBpMzIoVywgVSwgQSwgQikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX3BzcmFkaTUxMl9tYXNrKChfX3YxNnNpKShfX201MTJpKShBKSwgKGludCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpKF9fbTUxMmkpKFcpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpKFUpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza3pfc3JhaV9lcGkzMihVLCBBLCBCKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmkpX19idWlsdGluX2lhMzJfcHNyYWRpNTEyX21hc2soKF9fdjE2c2kpKF9fbTUxMmkpKEEpLCAoaW50KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzaSlfbW01MTJfc2V0emVyb19zaTUxMigpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpKFUpKTsgfSkKKworI2RlZmluZSBfbW01MTJfc3JhaV9lcGk2NChBLCBCKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmkpX19idWlsdGluX2lhMzJfcHNyYXFpNTEyX21hc2soKF9fdjhkaSkoX19tNTEyaSkoQSksIChpbnQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGkpX21tNTEyX3NldHplcm9fc2k1MTIoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX3NyYWlfZXBpNjQoVywgVSwgQSwgQikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX3BzcmFxaTUxMl9tYXNrKChfX3Y4ZGkpKF9fbTUxMmkpKEEpLCAoaW50KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKShfX201MTJpKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza3pfc3JhaV9lcGk2NChVLCBBLCBCKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmkpX19idWlsdGluX2lhMzJfcHNyYXFpNTEyX21hc2soKF9fdjhkaSkoX19tNTEyaSkoQSksIChpbnQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGkpX21tNTEyX3NldHplcm9fc2k1MTIoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW01MTJfc2h1ZmZsZV9mMzJ4NChBLCBCLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyKV9fYnVpbHRpbl9pYTMyX3NodWZfZjMyeDRfbWFzaygoX192MTZzZikoX19tNTEyKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikoX19tNTEyKShCKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZilfbW01MTJfdW5kZWZpbmVkX3BzKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNiktMSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2tfc2h1ZmZsZV9mMzJ4NChXLCBVLCBBLCBCLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyKV9fYnVpbHRpbl9pYTMyX3NodWZfZjMyeDRfbWFzaygoX192MTZzZikoX19tNTEyKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikoX19tNTEyKShCKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikoX19tNTEyKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KShVKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X3NodWZmbGVfZjMyeDQoVSwgQSwgQiwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMilfX2J1aWx0aW5faWEzMl9zaHVmX2YzMng0X21hc2soKF9fdjE2c2YpKF9fbTUxMikoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpKF9fbTUxMikoQiksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpX21tNTEyX3NldHplcm9fcHMoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KShVKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX3NodWZmbGVfZjY0eDIoQSwgQiwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmQpX19idWlsdGluX2lhMzJfc2h1Zl9mNjR4Ml9tYXNrKChfX3Y4ZGYpKF9fbTUxMmQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKShfX201MTJkKShCKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZilfbW01MTJfdW5kZWZpbmVkX3BkKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2tfc2h1ZmZsZV9mNjR4MihXLCBVLCBBLCBCLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyZClfX2J1aWx0aW5faWEzMl9zaHVmX2Y2NHgyX21hc2soKF9fdjhkZikoX19tNTEyZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpKF9fbTUxMmQpKEIpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKShfX201MTJkKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X3NodWZmbGVfZjY0eDIoVSwgQSwgQiwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmQpX19idWlsdGluX2lhMzJfc2h1Zl9mNjR4Ml9tYXNrKChfX3Y4ZGYpKF9fbTUxMmQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKShfX201MTJkKShCKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZilfbW01MTJfc2V0emVyb19wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW01MTJfc2h1ZmZsZV9pMzJ4NChBLCBCLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9zaHVmX2kzMng0X21hc2soKF9fdjE2c2kpKF9fbTUxMmkpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzaSkoX19tNTEyaSkoQiksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNpKV9tbTUxMl9zZXR6ZXJvX3NpNTEyKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpLTEpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX3NodWZmbGVfaTMyeDQoVywgVSwgQSwgQiwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmkpX19idWlsdGluX2lhMzJfc2h1Zl9pMzJ4NF9tYXNrKChfX3YxNnNpKShfX201MTJpKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpKF9fbTUxMmkpKEIpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzaSkoX19tNTEyaSkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpKFUpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza3pfc2h1ZmZsZV9pMzJ4NChVLCBBLCBCLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9zaHVmX2kzMng0X21hc2soKF9fdjE2c2kpKF9fbTUxMmkpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzaSkoX19tNTEyaSkoQiksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNpKV9tbTUxMl9zZXR6ZXJvX3NpNTEyKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpKFUpKTsgfSkKKworI2RlZmluZSBfbW01MTJfc2h1ZmZsZV9pNjR4MihBLCBCLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9zaHVmX2k2NHgyX21hc2soKF9fdjhkaSkoX19tNTEyaSkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGkpKF9fbTUxMmkpKEIpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKV9tbTUxMl9zZXR6ZXJvX3NpNTEyKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2tfc2h1ZmZsZV9pNjR4MihXLCBVLCBBLCBCLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9zaHVmX2k2NHgyX21hc2soKF9fdjhkaSkoX19tNTEyaSkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGkpKF9fbTUxMmkpKEIpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKShfX201MTJpKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X3NodWZmbGVfaTY0eDIoVSwgQSwgQiwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmkpX19idWlsdGluX2lhMzJfc2h1Zl9pNjR4Ml9tYXNrKChfX3Y4ZGkpKF9fbTUxMmkpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKShfX201MTJpKShCKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkaSlfbW01MTJfc2V0emVyb19zaTUxMigpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW01MTJfc2h1ZmZsZV9wZChBLCBCLCBNKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmQpX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjhkZikoX19tNTEyZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikoX19tNTEyZCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgKyAoKChNKSA+PiAwKSAmIDB4MSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCAgKyAoKChNKSA+PiAxKSAmIDB4MSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgKyAoKChNKSA+PiAyKSAmIDB4MSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAgKyAoKChNKSA+PiAzKSAmIDB4MSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCAgKyAoKChNKSA+PiA0KSAmIDB4MSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIgKyAoKChNKSA+PiA1KSAmIDB4MSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiAgKyAoKChNKSA+PiA2KSAmIDB4MSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQgKyAoKChNKSA+PiA3KSAmIDB4MSkpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX3NodWZmbGVfcGQoVywgVSwgQSwgQiwgTSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJkKV9fYnVpbHRpbl9pYTMyX3NlbGVjdHBkXzUxMigoX19tbWFzazgpKFUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKV9tbTUxMl9zaHVmZmxlX3BkKChBKSwgKEIpLCAoTSkpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKShfX201MTJkKShXKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X3NodWZmbGVfcGQoVSwgQSwgQiwgTSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJkKV9fYnVpbHRpbl9pYTMyX3NlbGVjdHBkXzUxMigoX19tbWFzazgpKFUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKV9tbTUxMl9zaHVmZmxlX3BkKChBKSwgKEIpLCAoTSkpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKV9tbTUxMl9zZXR6ZXJvX3BkKCkpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9zaHVmZmxlX3BzKEEsIEIsIE0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyZClfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcigoX192MTZzZikoX19tNTEyKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikoX19tNTEyKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICArICgoKE0pID4+IDApICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICArICgoKE0pID4+IDIpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiArICgoKE0pID4+IDQpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiArICgoKE0pID4+IDYpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ICArICgoKE0pID4+IDApICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ICArICgoKE0pID4+IDIpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMCArICgoKE0pID4+IDQpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMCArICgoKE0pID4+IDYpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ICArICgoKE0pID4+IDApICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ICArICgoKE0pID4+IDIpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNCArICgoKE0pID4+IDQpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNCArICgoKE0pID4+IDYpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiArICgoKE0pID4+IDApICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiArICgoKE0pID4+IDIpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOCArICgoKE0pID4+IDQpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOCArICgoKE0pID4+IDYpICYgMHgzKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2tfc2h1ZmZsZV9wcyhXLCBVLCBBLCBCLCBNKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMilfX2J1aWx0aW5faWEzMl9zZWxlY3Rwc181MTIoKF9fbW1hc2sxNikoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpX21tNTEyX3NodWZmbGVfcHMoKEEpLCAoQiksIChNKSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpKF9fbTUxMikoVykpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrel9zaHVmZmxlX3BzKFUsIEEsIEIsIE0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyKV9fYnVpbHRpbl9pYTMyX3NlbGVjdHBzXzUxMigoX19tbWFzazE2KShVKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZilfbW01MTJfc2h1ZmZsZV9wcygoQSksIChCKSwgKE0pKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZilfbW01MTJfc2V0emVyb19wcygpKTsgfSkKKworI2RlZmluZSBfbW1fc3FydF9yb3VuZF9zZChBLCBCLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGQpX19idWlsdGluX2lhMzJfc3FydHNkX3JvdW5kX21hc2soKF9fdjJkZikoX19tMTI4ZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZikoX19tMTI4ZCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZilfbW1fc2V0emVyb19wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSwgKGludCkoUikpOyB9KQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfc3FydF9zZCAoX19tMTI4ZCBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfc3FydHNkX3JvdW5kX21hc2sgKCAoX192MmRmKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3YyZGYpIF9fQiwKKyAgICAgICAgICAgICAgICAoX192MmRmKSBfX1csCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworI2RlZmluZSBfbW1fbWFza19zcXJ0X3JvdW5kX3NkKFcsIFUsIEEsIEIsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9zcXJ0c2Rfcm91bmRfbWFzaygoX192MmRmKShfX20xMjhkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShSKSk7IH0pCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfc3FydF9zZCAoX19tbWFzazggX19VLCBfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9zcXJ0c2Rfcm91bmRfbWFzayAoIChfX3YyZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjJkZikgX19CLAorICAgICAgICAgICAgICAgIChfX3YyZGYpIF9tbV9zZXR6ZXJvX3BkICgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKKyNkZWZpbmUgX21tX21hc2t6X3NxcnRfcm91bmRfc2QoVSwgQSwgQiwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX3NxcnRzZF9yb3VuZF9tYXNrKChfX3YyZGYpKF9fbTEyOGQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fbTEyOGQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpX21tX3NldHplcm9fcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tX3NxcnRfcm91bmRfc3MoQSwgQiwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfc3FydHNzX3JvdW5kX21hc2soKF9fdjRzZikoX19tMTI4KShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpKF9fbTEyOCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKV9tbV9zZXR6ZXJvX3BzKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEsIChpbnQpKFIpKTsgfSkKKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfc3FydF9zcyAoX19tMTI4IF9fVywgX19tbWFzazggX19VLCBfX20xMjggX19BLCBfX20xMjggX19CKQoreworIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9zcXJ0c3Nfcm91bmRfbWFzayAoIChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjRzZikgX19CLAorICAgICAgICAgICAgICAgIChfX3Y0c2YpIF9fVywKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCisjZGVmaW5lIF9tbV9tYXNrX3NxcnRfcm91bmRfc3MoVywgVSwgQSwgQiwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfc3FydHNzX3JvdW5kX21hc2soKF9fdjRzZikoX19tMTI4KShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpKF9fbTEyOCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKShfX20xMjgpKFcpLCAoX19tbWFzazgpKFUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoUikpOyB9KQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfc3FydF9zcyAoX19tbWFzazggX19VLCBfX20xMjggX19BLCBfX20xMjggX19CKQoreworIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9zcXJ0c3Nfcm91bmRfbWFzayAoIChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjRzZikgX19CLAorICAgICAgICAgICAgICAgIChfX3Y0c2YpIF9tbV9zZXR6ZXJvX3BzICgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKKyNkZWZpbmUgX21tX21hc2t6X3NxcnRfcm91bmRfc3MoVSwgQSwgQiwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfc3FydHNzX3JvdW5kX21hc2soKF9fdjRzZikoX19tMTI4KShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpKF9fbTEyOCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKV9tbV9zZXR6ZXJvX3BzKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShSKSk7IH0pCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9icm9hZGNhc3RfZjMyeDQgKF9fbTEyOCBfX0EpCit7CisgIHJldHVybiAoX19tNTEyKSBfX2J1aWx0aW5faWEzMl9icm9hZGNhc3RmMzJ4NF81MTIgKChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjE2c2YpCisgICAgICAgICAgICAgICAgIF9tbTUxMl91bmRlZmluZWRfcHMgKCksCisgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfYnJvYWRjYXN0X2YzMng0IChfX201MTIgX19PLCBfX21tYXNrMTYgX19NLCBfX20xMjggX19BKQoreworICByZXR1cm4gKF9fbTUxMikgX19idWlsdGluX2lhMzJfYnJvYWRjYXN0ZjMyeDRfNTEyICgoX192NHNmKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3YxNnNmKSBfX08sCisgICAgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9icm9hZGNhc3RfZjMyeDQgKF9fbW1hc2sxNiBfX00sIF9fbTEyOCBfX0EpCit7CisgIHJldHVybiAoX19tNTEyKSBfX2J1aWx0aW5faWEzMl9icm9hZGNhc3RmMzJ4NF81MTIgKChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjE2c2YpCisgICAgICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3BzICgpLAorICAgICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2Jyb2FkY2FzdF9mNjR4NCAoX19tMjU2ZCBfX0EpCit7CisgIHJldHVybiAoX19tNTEyZCkgX19idWlsdGluX2lhMzJfYnJvYWRjYXN0ZjY0eDRfNTEyICgoX192NGRmKSBfX0EsCisgICAgICAgICAgICAgICAgICAoX192OGRmKQorICAgICAgICAgICAgICAgICAgX21tNTEyX3VuZGVmaW5lZF9wZCAoKSwKKyAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfYnJvYWRjYXN0X2Y2NHg0IChfX201MTJkIF9fTywgX19tbWFzazggX19NLCBfX20yNTZkIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJkKSBfX2J1aWx0aW5faWEzMl9icm9hZGNhc3RmNjR4NF81MTIgKChfX3Y0ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpIF9fTywKKyAgICAgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfYnJvYWRjYXN0X2Y2NHg0IChfX21tYXNrOCBfX00sIF9fbTI1NmQgX19BKQoreworICByZXR1cm4gKF9fbTUxMmQpIF9fYnVpbHRpbl9pYTMyX2Jyb2FkY2FzdGY2NHg0XzUxMiAoKF9fdjRkZikgX19BLAorICAgICAgICAgICAgICAgICAgKF9fdjhkZikKKyAgICAgICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3BkICgpLAorICAgICAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9icm9hZGNhc3RfaTMyeDQgKF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX2Jyb2FkY2FzdGkzMng0XzUxMiAoKF9fdjRzaSkgX19BLAorICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpCisgICAgICAgICAgICAgICAgICBfbW01MTJfdW5kZWZpbmVkX2VwaTMyICgpLAorICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfYnJvYWRjYXN0X2kzMng0IChfX201MTJpIF9fTywgX19tbWFzazE2IF9fTSwgX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfYnJvYWRjYXN0aTMyeDRfNTEyICgoX192NHNpKSBfX0EsCisgICAgICAgICAgICAgICAgICAoX192MTZzaSkgX19PLAorICAgICAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9icm9hZGNhc3RfaTMyeDQgKF9fbW1hc2sxNiBfX00sIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX2Jyb2FkY2FzdGkzMng0XzUxMiAoKF9fdjRzaSkgX19BLAorICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpCisgICAgICAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19zaTUxMiAoKSwKKyAgICAgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfYnJvYWRjYXN0X2k2NHg0IChfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9icm9hZGNhc3RpNjR4NF81MTIgKChfX3Y0ZGkpIF9fQSwKKyAgICAgICAgICAgICAgICAgIChfX3Y4ZGkpCisgICAgICAgICAgICAgICAgICBfbW01MTJfdW5kZWZpbmVkX2VwaTMyICgpLAorICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19icm9hZGNhc3RfaTY0eDQgKF9fbTUxMmkgX19PLCBfX21tYXNrOCBfX00sIF9fbTI1NmkgX19BKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX2Jyb2FkY2FzdGk2NHg0XzUxMiAoKF9fdjRkaSkgX19BLAorICAgICAgICAgICAgICAgICAgKF9fdjhkaSkgX19PLAorICAgICAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9icm9hZGNhc3RfaTY0eDQgKF9fbW1hc2s4IF9fTSwgX19tMjU2aSBfX0EpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfYnJvYWRjYXN0aTY0eDRfNTEyICgoX192NGRpKSBfX0EsCisgICAgICAgICAgICAgICAgICAoX192OGRpKQorICAgICAgICAgICAgICAgICAgX21tNTEyX3NldHplcm9fc2k1MTIgKCksCisgICAgICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfYnJvYWRjYXN0c2RfcGQgKF9fbTUxMmQgX19PLCBfX21tYXNrOCBfX00sIF9fbTEyOGQgX19BKQoreworICByZXR1cm4gKF9fbTUxMmQpX19idWlsdGluX2lhMzJfc2VsZWN0cGRfNTEyKF9fTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKSBfbW01MTJfYnJvYWRjYXN0c2RfcGQoX19BKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKSBfX08pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X2Jyb2FkY2FzdHNkX3BkIChfX21tYXNrOCBfX00sIF9fbTEyOGQgX19BKQoreworICByZXR1cm4gKF9fbTUxMmQpX19idWlsdGluX2lhMzJfc2VsZWN0cGRfNTEyKF9fTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKSBfbW01MTJfYnJvYWRjYXN0c2RfcGQoX19BKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKSBfbW01MTJfc2V0emVyb19wZCgpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfYnJvYWRjYXN0c3NfcHMgKF9fbTUxMiBfX08sIF9fbW1hc2sxNiBfX00sIF9fbTEyOCBfX0EpCit7CisgIHJldHVybiAoX19tNTEyKV9fYnVpbHRpbl9pYTMyX3NlbGVjdHBzXzUxMihfX00sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikgX21tNTEyX2Jyb2FkY2FzdHNzX3BzKF9fQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikgX19PKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X2Jyb2FkY2FzdHNzX3BzIChfX21tYXNrMTYgX19NLCBfX20xMjggX19BKQoreworICByZXR1cm4gKF9fbTUxMilfX2J1aWx0aW5faWEzMl9zZWxlY3Rwc181MTIoX19NLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpIF9tbTUxMl9icm9hZGNhc3Rzc19wcyhfX0EpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpIF9tbTUxMl9zZXR6ZXJvX3BzKCkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2N2dHNlcGkzMl9lcGk4IChfX201MTJpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92c2RiNTEyX21hc2sgKChfX3YxNnNpKSBfX0EsCisgICAgICAgICAgICAgICAoX192MTZxaSkgX21tX3VuZGVmaW5lZF9zaTEyOCAoKSwKKyAgICAgICAgICAgICAgIChfX21tYXNrMTYpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2N2dHNlcGkzMl9lcGk4IChfX20xMjhpIF9fTywgX19tbWFzazE2IF9fTSwgX19tNTEyaSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnNkYjUxMl9tYXNrICgoX192MTZzaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjE2cWkpIF9fTywgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9jdnRzZXBpMzJfZXBpOCAoX19tbWFzazE2IF9fTSwgX19tNTEyaSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnNkYjUxMl9tYXNrICgoX192MTZzaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjE2cWkpIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2N2dHNlcGkzMl9zdG9yZXVfZXBpOCAodm9pZCAqIF9fUCwgX19tbWFzazE2IF9fTSwgX19tNTEyaSBfX0EpCit7CisgIF9fYnVpbHRpbl9pYTMyX3Btb3ZzZGI1MTJtZW1fbWFzayAoKF9fdjE2cWkgKikgX19QLCAoX192MTZzaSkgX19BLCBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2N2dHNlcGkzMl9lcGkxNiAoX19tNTEyaSBfX0EpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG1vdnNkdzUxMl9tYXNrICgoX192MTZzaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjE2aGkpIF9tbTI1Nl91bmRlZmluZWRfc2kyNTYgKCksCisgICAgICAgICAgICAgICAoX19tbWFzazE2KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19jdnRzZXBpMzJfZXBpMTYgKF9fbTI1NmkgX19PLCBfX21tYXNrMTYgX19NLCBfX201MTJpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wbW92c2R3NTEyX21hc2sgKChfX3YxNnNpKSBfX0EsCisgICAgICAgICAgICAgICAoX192MTZoaSkgX19PLCBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X2N2dHNlcGkzMl9lcGkxNiAoX19tbWFzazE2IF9fTSwgX19tNTEyaSBfX0EpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG1vdnNkdzUxMl9tYXNrICgoX192MTZzaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjE2aGkpIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2ICgpLAorICAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2N2dHNlcGkzMl9zdG9yZXVfZXBpMTYgKHZvaWQgKl9fUCwgX19tbWFzazE2IF9fTSwgX19tNTEyaSBfX0EpCit7CisgIF9fYnVpbHRpbl9pYTMyX3Btb3ZzZHc1MTJtZW1fbWFzayAoKF9fdjE2aGkqKSBfX1AsIChfX3YxNnNpKSBfX0EsIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfY3Z0c2VwaTY0X2VwaTggKF9fbTUxMmkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3ZzcWI1MTJfbWFzayAoKF9fdjhkaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjE2cWkpIF9tbV91bmRlZmluZWRfc2kxMjggKCksCisgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2N2dHNlcGk2NF9lcGk4IChfX20xMjhpIF9fTywgX19tbWFzazggX19NLCBfX201MTJpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92c3FiNTEyX21hc2sgKChfX3Y4ZGkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3YxNnFpKSBfX08sIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfY3Z0c2VwaTY0X2VwaTggKF9fbW1hc2s4IF9fTSwgX19tNTEyaSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnNxYjUxMl9tYXNrICgoX192OGRpKSBfX0EsCisgICAgICAgICAgICAgICAoX192MTZxaSkgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfY3Z0c2VwaTY0X3N0b3JldV9lcGk4ICh2b2lkICogX19QLCBfX21tYXNrOCBfX00sIF9fbTUxMmkgX19BKQoreworICBfX2J1aWx0aW5faWEzMl9wbW92c3FiNTEybWVtX21hc2sgKChfX3YxNnFpICopIF9fUCwgKF9fdjhkaSkgX19BLCBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2N2dHNlcGk2NF9lcGkzMiAoX19tNTEyaSBfX0EpCit7CisgIF9fdjhzaSBfX087CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG1vdnNxZDUxMl9tYXNrICgoX192OGRpKSBfX0EsCisgICAgICAgICAgICAgICAoX192OHNpKSBfbW0yNTZfdW5kZWZpbmVkX3NpMjU2ICgpLAorICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19jdnRzZXBpNjRfZXBpMzIgKF9fbTI1NmkgX19PLCBfX21tYXNrOCBfX00sIF9fbTUxMmkgX19BKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3Btb3ZzcWQ1MTJfbWFzayAoKF9fdjhkaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjhzaSkgX19PLCBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X2N2dHNlcGk2NF9lcGkzMiAoX19tbWFzazggX19NLCBfX201MTJpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wbW92c3FkNTEyX21hc2sgKChfX3Y4ZGkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3Y4c2kpIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2ICgpLAorICAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2N2dHNlcGk2NF9zdG9yZXVfZXBpMzIgKHZvaWQgKl9fUCwgX19tbWFzazggX19NLCBfX201MTJpIF9fQSkKK3sKKyAgX19idWlsdGluX2lhMzJfcG1vdnNxZDUxMm1lbV9tYXNrICgoX192OHNpICopIF9fUCwgKF9fdjhkaSkgX19BLCBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2N2dHNlcGk2NF9lcGkxNiAoX19tNTEyaSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnNxdzUxMl9tYXNrICgoX192OGRpKSBfX0EsCisgICAgICAgICAgICAgICAoX192OGhpKSBfbW1fdW5kZWZpbmVkX3NpMTI4ICgpLAorICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19jdnRzZXBpNjRfZXBpMTYgKF9fbTEyOGkgX19PLCBfX21tYXNrOCBfX00sIF9fbTUxMmkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3ZzcXc1MTJfbWFzayAoKF9fdjhkaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjhoaSkgX19PLCBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X2N2dHNlcGk2NF9lcGkxNiAoX19tbWFzazggX19NLCBfX201MTJpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92c3F3NTEyX21hc2sgKChfX3Y4ZGkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3Y4aGkpIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2N2dHNlcGk2NF9zdG9yZXVfZXBpMTYgKHZvaWQgKiBfX1AsIF9fbW1hc2s4IF9fTSwgX19tNTEyaSBfX0EpCit7CisgIF9fYnVpbHRpbl9pYTMyX3Btb3ZzcXc1MTJtZW1fbWFzayAoKF9fdjhoaSAqKSBfX1AsIChfX3Y4ZGkpIF9fQSwgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9jdnR1c2VwaTMyX2VwaTggKF9fbTUxMmkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3Z1c2RiNTEyX21hc2sgKChfX3YxNnNpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjE2cWkpIF9tbV91bmRlZmluZWRfc2kxMjggKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfY3Z0dXNlcGkzMl9lcGk4IChfX20xMjhpIF9fTywgX19tbWFzazE2IF9fTSwgX19tNTEyaSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnVzZGI1MTJfbWFzayAoKF9fdjE2c2kpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192MTZxaSkgX19PLAorICAgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfY3Z0dXNlcGkzMl9lcGk4IChfX21tYXNrMTYgX19NLCBfX201MTJpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92dXNkYjUxMl9tYXNrICgoX192MTZzaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3YxNnFpKSBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfY3Z0dXNlcGkzMl9zdG9yZXVfZXBpOCAodm9pZCAqIF9fUCwgX19tbWFzazE2IF9fTSwgX19tNTEyaSBfX0EpCit7CisgIF9fYnVpbHRpbl9pYTMyX3Btb3Z1c2RiNTEybWVtX21hc2sgKChfX3YxNnFpICopIF9fUCwgKF9fdjE2c2kpIF9fQSwgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9jdnR1c2VwaTMyX2VwaTE2IChfX201MTJpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wbW92dXNkdzUxMl9tYXNrICgoX192MTZzaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3YxNmhpKSBfbW0yNTZfdW5kZWZpbmVkX3NpMjU2ICgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrMTYpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2N2dHVzZXBpMzJfZXBpMTYgKF9fbTI1NmkgX19PLCBfX21tYXNrMTYgX19NLCBfX201MTJpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wbW92dXNkdzUxMl9tYXNrICgoX192MTZzaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3YxNmhpKSBfX08sCisgICAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9jdnR1c2VwaTMyX2VwaTE2IChfX21tYXNrMTYgX19NLCBfX201MTJpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wbW92dXNkdzUxMl9tYXNrICgoX192MTZzaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3YxNmhpKSBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfY3Z0dXNlcGkzMl9zdG9yZXVfZXBpMTYgKHZvaWQgKl9fUCwgX19tbWFzazE2IF9fTSwgX19tNTEyaSBfX0EpCit7CisgIF9fYnVpbHRpbl9pYTMyX3Btb3Z1c2R3NTEybWVtX21hc2sgKChfX3YxNmhpKikgX19QLCAoX192MTZzaSkgX19BLCBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2N2dHVzZXBpNjRfZXBpOCAoX19tNTEyaSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnVzcWI1MTJfbWFzayAoKF9fdjhkaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3YxNnFpKSBfbW1fdW5kZWZpbmVkX3NpMTI4ICgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfY3Z0dXNlcGk2NF9lcGk4IChfX20xMjhpIF9fTywgX19tbWFzazggX19NLCBfX201MTJpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92dXNxYjUxMl9tYXNrICgoX192OGRpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjE2cWkpIF9fTywKKyAgICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X2N2dHVzZXBpNjRfZXBpOCAoX19tbWFzazggX19NLCBfX201MTJpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92dXNxYjUxMl9tYXNrICgoX192OGRpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjE2cWkpIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19jdnR1c2VwaTY0X3N0b3JldV9lcGk4ICh2b2lkICogX19QLCBfX21tYXNrOCBfX00sIF9fbTUxMmkgX19BKQoreworICBfX2J1aWx0aW5faWEzMl9wbW92dXNxYjUxMm1lbV9tYXNrICgoX192MTZxaSAqKSBfX1AsIChfX3Y4ZGkpIF9fQSwgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9jdnR1c2VwaTY0X2VwaTMyIChfX201MTJpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wbW92dXNxZDUxMl9tYXNrICgoX192OGRpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjhzaSkgX21tMjU2X3VuZGVmaW5lZF9zaTI1NiAoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2N2dHVzZXBpNjRfZXBpMzIgKF9fbTI1NmkgX19PLCBfX21tYXNrOCBfX00sIF9fbTUxMmkgX19BKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3Btb3Z1c3FkNTEyX21hc2sgKChfX3Y4ZGkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192OHNpKSBfX08sIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfY3Z0dXNlcGk2NF9lcGkzMiAoX19tbWFzazggX19NLCBfX201MTJpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wbW92dXNxZDUxMl9tYXNrICgoX192OGRpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjhzaSkgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2N2dHVzZXBpNjRfc3RvcmV1X2VwaTMyICh2b2lkKiBfX1AsIF9fbW1hc2s4IF9fTSwgX19tNTEyaSBfX0EpCit7CisgIF9fYnVpbHRpbl9pYTMyX3Btb3Z1c3FkNTEybWVtX21hc2sgKChfX3Y4c2kqKSBfX1AsIChfX3Y4ZGkpIF9fQSwgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9jdnR1c2VwaTY0X2VwaTE2IChfX201MTJpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92dXNxdzUxMl9tYXNrICgoX192OGRpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjhoaSkgX21tX3VuZGVmaW5lZF9zaTEyOCAoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2N2dHVzZXBpNjRfZXBpMTYgKF9fbTEyOGkgX19PLCBfX21tYXNrOCBfX00sIF9fbTUxMmkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3Z1c3F3NTEyX21hc2sgKChfX3Y4ZGkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192OGhpKSBfX08sIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfY3Z0dXNlcGk2NF9lcGkxNiAoX19tbWFzazggX19NLCBfX201MTJpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92dXNxdzUxMl9tYXNrICgoX192OGRpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjhoaSkgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2N2dHVzZXBpNjRfc3RvcmV1X2VwaTE2ICh2b2lkICpfX1AsIF9fbW1hc2s4IF9fTSwgX19tNTEyaSBfX0EpCit7CisgIF9fYnVpbHRpbl9pYTMyX3Btb3Z1c3F3NTEybWVtX21hc2sgKChfX3Y4aGkqKSBfX1AsIChfX3Y4ZGkpIF9fQSwgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9jdnRlcGkzMl9lcGk4IChfX201MTJpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92ZGI1MTJfbWFzayAoKF9fdjE2c2kpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjE2cWkpIF9tbV91bmRlZmluZWRfc2kxMjggKCksCisgICAgICAgICAgICAgIChfX21tYXNrMTYpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2N2dGVwaTMyX2VwaTggKF9fbTEyOGkgX19PLCBfX21tYXNrMTYgX19NLCBfX201MTJpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92ZGI1MTJfbWFzayAoKF9fdjE2c2kpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjE2cWkpIF9fTywgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9jdnRlcGkzMl9lcGk4IChfX21tYXNrMTYgX19NLCBfX201MTJpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92ZGI1MTJfbWFzayAoKF9fdjE2c2kpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjE2cWkpIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfY3Z0ZXBpMzJfc3RvcmV1X2VwaTggKHZvaWQgKiBfX1AsIF9fbW1hc2sxNiBfX00sIF9fbTUxMmkgX19BKQoreworICBfX2J1aWx0aW5faWEzMl9wbW92ZGI1MTJtZW1fbWFzayAoKF9fdjE2cWkgKikgX19QLCAoX192MTZzaSkgX19BLCBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2N2dGVwaTMyX2VwaTE2IChfX201MTJpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wbW92ZHc1MTJfbWFzayAoKF9fdjE2c2kpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjE2aGkpIF9tbTI1Nl91bmRlZmluZWRfc2kyNTYgKCksCisgICAgICAgICAgICAgIChfX21tYXNrMTYpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2N2dGVwaTMyX2VwaTE2IChfX20yNTZpIF9fTywgX19tbWFzazE2IF9fTSwgX19tNTEyaSBfX0EpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG1vdmR3NTEyX21hc2sgKChfX3YxNnNpKSBfX0EsCisgICAgICAgICAgICAgIChfX3YxNmhpKSBfX08sIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfY3Z0ZXBpMzJfZXBpMTYgKF9fbW1hc2sxNiBfX00sIF9fbTUxMmkgX19BKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3Btb3ZkdzUxMl9tYXNrICgoX192MTZzaSkgX19BLAorICAgICAgICAgICAgICAoX192MTZoaSkgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19jdnRlcGkzMl9zdG9yZXVfZXBpMTYgKHZvaWQgKiBfX1AsIF9fbW1hc2sxNiBfX00sIF9fbTUxMmkgX19BKQoreworICBfX2J1aWx0aW5faWEzMl9wbW92ZHc1MTJtZW1fbWFzayAoKF9fdjE2aGkgKikgX19QLCAoX192MTZzaSkgX19BLCBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2N2dGVwaTY0X2VwaTggKF9fbTUxMmkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3ZxYjUxMl9tYXNrICgoX192OGRpKSBfX0EsCisgICAgICAgICAgICAgIChfX3YxNnFpKSBfbW1fdW5kZWZpbmVkX3NpMTI4ICgpLAorICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2N2dGVwaTY0X2VwaTggKF9fbTEyOGkgX19PLCBfX21tYXNrOCBfX00sIF9fbTUxMmkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3ZxYjUxMl9tYXNrICgoX192OGRpKSBfX0EsCisgICAgICAgICAgICAgIChfX3YxNnFpKSBfX08sIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfY3Z0ZXBpNjRfZXBpOCAoX19tbWFzazggX19NLCBfX201MTJpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92cWI1MTJfbWFzayAoKF9fdjhkaSkgX19BLAorICAgICAgICAgICAgICAoX192MTZxaSkgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19jdnRlcGk2NF9zdG9yZXVfZXBpOCAodm9pZCAqIF9fUCwgX19tbWFzazggX19NLCBfX201MTJpIF9fQSkKK3sKKyAgX19idWlsdGluX2lhMzJfcG1vdnFiNTEybWVtX21hc2sgKChfX3YxNnFpICopIF9fUCwgKF9fdjhkaSkgX19BLCBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2N2dGVwaTY0X2VwaTMyIChfX201MTJpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wbW92cWQ1MTJfbWFzayAoKF9fdjhkaSkgX19BLAorICAgICAgICAgICAgICAoX192OHNpKSBfbW0yNTZfdW5kZWZpbmVkX3NpMjU2ICgpLAorICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2N2dGVwaTY0X2VwaTMyIChfX20yNTZpIF9fTywgX19tbWFzazggX19NLCBfX201MTJpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wbW92cWQ1MTJfbWFzayAoKF9fdjhkaSkgX19BLAorICAgICAgICAgICAgICAoX192OHNpKSBfX08sIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfY3Z0ZXBpNjRfZXBpMzIgKF9fbW1hc2s4IF9fTSwgX19tNTEyaSBfX0EpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG1vdnFkNTEyX21hc2sgKChfX3Y4ZGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjhzaSkgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19jdnRlcGk2NF9zdG9yZXVfZXBpMzIgKHZvaWQqIF9fUCwgX19tbWFzazggX19NLCBfX201MTJpIF9fQSkKK3sKKyAgX19idWlsdGluX2lhMzJfcG1vdnFkNTEybWVtX21hc2sgKChfX3Y4c2kgKikgX19QLCAoX192OGRpKSBfX0EsIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfY3Z0ZXBpNjRfZXBpMTYgKF9fbTUxMmkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3ZxdzUxMl9tYXNrICgoX192OGRpKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y4aGkpIF9tbV91bmRlZmluZWRfc2kxMjggKCksCisgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfY3Z0ZXBpNjRfZXBpMTYgKF9fbTEyOGkgX19PLCBfX21tYXNrOCBfX00sIF9fbTUxMmkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3ZxdzUxMl9tYXNrICgoX192OGRpKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y4aGkpIF9fTywgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9jdnRlcGk2NF9lcGkxNiAoX19tbWFzazggX19NLCBfX201MTJpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92cXc1MTJfbWFzayAoKF9fdjhkaSkgX19BLAorICAgICAgICAgICAgICAoX192OGhpKSBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2N2dGVwaTY0X3N0b3JldV9lcGkxNiAodm9pZCAqX19QLCBfX21tYXNrOCBfX00sIF9fbTUxMmkgX19BKQoreworICBfX2J1aWx0aW5faWEzMl9wbW92cXc1MTJtZW1fbWFzayAoKF9fdjhoaSAqKSBfX1AsIChfX3Y4ZGkpIF9fQSwgX19NKTsKK30KKworI2RlZmluZSBfbW01MTJfZXh0cmFjdGkzMng0X2VwaTMyKEEsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX2V4dHJhY3RpMzJ4NF9tYXNrKChfX3YxNnNpKShfX201MTJpKShBKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNpKV9tbV91bmRlZmluZWRfc2kxMjgoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX2V4dHJhY3RpMzJ4NF9lcGkzMihXLCBVLCBBLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9leHRyYWN0aTMyeDRfbWFzaygoX192MTZzaSkoX19tNTEyaSkoQSksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzaSkoX19tMTI4aSkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X2V4dHJhY3RpMzJ4NF9lcGkzMihVLCBBLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9leHRyYWN0aTMyeDRfbWFzaygoX192MTZzaSkoX19tNTEyaSkoQSksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzaSlfbW1fc2V0emVyb19zaTEyOCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSkpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9leHRyYWN0aTY0eDRfZXBpNjQoQSwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmkpX19idWlsdGluX2lhMzJfZXh0cmFjdGk2NHg0X21hc2soKF9fdjhkaSkoX19tNTEyaSkoQSksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkaSlfbW0yNTZfdW5kZWZpbmVkX3NpMjU2KCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza19leHRyYWN0aTY0eDRfZXBpNjQoVywgVSwgQSwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmkpX19idWlsdGluX2lhMzJfZXh0cmFjdGk2NHg0X21hc2soKF9fdjhkaSkoX19tNTEyaSkoQSksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkaSkoX19tMjU2aSkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X2V4dHJhY3RpNjR4NF9lcGk2NChVLCBBLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9leHRyYWN0aTY0eDRfbWFzaygoX192OGRpKShfX201MTJpKShBKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRpKV9tbTI1Nl9zZXR6ZXJvX3NpMjU2KCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX2luc2VydGY2NHg0KEEsIEIsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJkKV9fYnVpbHRpbl9pYTMyX2luc2VydGY2NHg0X21hc2soKF9fdjhkZikoX19tNTEyZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRmKShfX20yNTZkKShCKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpX21tNTEyX3VuZGVmaW5lZF9wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza19pbnNlcnRmNjR4NChXLCBVLCBBLCBCLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyZClfX2J1aWx0aW5faWEzMl9pbnNlcnRmNjR4NF9tYXNrKChfX3Y4ZGYpKF9fbTUxMmQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkZikoX19tMjU2ZCkoQiksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKShfX201MTJkKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSkpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrel9pbnNlcnRmNjR4NChVLCBBLCBCLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyZClfX2J1aWx0aW5faWEzMl9pbnNlcnRmNjR4NF9tYXNrKChfX3Y4ZGYpKF9fbTUxMmQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkZikoX19tMjU2ZCkoQiksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKV9tbTUxMl9zZXR6ZXJvX3BkKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW01MTJfaW5zZXJ0aTY0eDQoQSwgQiwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmkpX19idWlsdGluX2lhMzJfaW5zZXJ0aTY0eDRfbWFzaygoX192OGRpKShfX201MTJpKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGkpKF9fbTI1NmkpKEIpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkaSlfbW01MTJfc2V0emVyb19zaTUxMigpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza19pbnNlcnRpNjR4NChXLCBVLCBBLCBCLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9pbnNlcnRpNjR4NF9tYXNrKChfX3Y4ZGkpKF9fbTUxMmkpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkaSkoX19tMjU2aSkoQiksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKShfX201MTJpKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSkpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrel9pbnNlcnRpNjR4NChVLCBBLCBCLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9pbnNlcnRpNjR4NF9tYXNrKChfX3Y4ZGkpKF9fbTUxMmkpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkaSkoX19tMjU2aSkoQiksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKV9tbTUxMl9zZXR6ZXJvX3NpNTEyKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW01MTJfaW5zZXJ0ZjMyeDQoQSwgQiwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMilfX2J1aWx0aW5faWEzMl9pbnNlcnRmMzJ4NF9tYXNrKChfX3YxNnNmKShfX201MTIpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKShfX20xMjgpKEIpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZilfbW01MTJfdW5kZWZpbmVkX3BzKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpLTEpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX2luc2VydGYzMng0KFcsIFUsIEEsIEIsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTIpX19idWlsdGluX2lhMzJfaW5zZXJ0ZjMyeDRfbWFzaygoX192MTZzZikoX19tNTEyKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShCKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpKF9fbTUxMikoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpKFUpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza3pfaW5zZXJ0ZjMyeDQoVSwgQSwgQiwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMilfX2J1aWx0aW5faWEzMl9pbnNlcnRmMzJ4NF9tYXNrKChfX3YxNnNmKShfX201MTIpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKShfX20xMjgpKEIpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZilfbW01MTJfc2V0emVyb19wcygpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KShVKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX2luc2VydGkzMng0KEEsIEIsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX2luc2VydGkzMng0X21hc2soKF9fdjE2c2kpKF9fbTUxMmkpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzaSkoX19tMTI4aSkoQiksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzaSlfbW01MTJfc2V0emVyb19zaTUxMigpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNiktMSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2tfaW5zZXJ0aTMyeDQoVywgVSwgQSwgQiwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmkpX19idWlsdGluX2lhMzJfaW5zZXJ0aTMyeDRfbWFzaygoX192MTZzaSkoX19tNTEyaSkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNpKShfX20xMjhpKShCKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNpKShfX201MTJpKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpKFUpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza3pfaW5zZXJ0aTMyeDQoVSwgQSwgQiwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmkpX19idWlsdGluX2lhMzJfaW5zZXJ0aTMyeDRfbWFzaygoX192MTZzaSkoX19tNTEyaSkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNpKShfX20xMjhpKShCKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNpKV9tbTUxMl9zZXR6ZXJvX3NpNTEyKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KShVKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX2dldG1hbnRfcm91bmRfcGQoQSwgQiwgQywgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJkKV9fYnVpbHRpbl9pYTMyX2dldG1hbnRwZDUxMl9tYXNrKChfX3Y4ZGYpKF9fbTUxMmQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKCgoQyk8PDIpIHwgKEIpKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKV9tbTUxMl91bmRlZmluZWRfcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEsIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza19nZXRtYW50X3JvdW5kX3BkKFcsIFUsIEEsIEIsIEMsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyZClfX2J1aWx0aW5faWEzMl9nZXRtYW50cGQ1MTJfbWFzaygoX192OGRmKShfX201MTJkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSgoKEMpPDwyKSB8IChCKSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikoX19tNTEyZCkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrel9nZXRtYW50X3JvdW5kX3BkKFUsIEEsIEIsIEMsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyZClfX2J1aWx0aW5faWEzMl9nZXRtYW50cGQ1MTJfbWFzaygoX192OGRmKShfX201MTJkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSgoKEMpPDwyKSB8IChCKSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZilfbW01MTJfc2V0emVyb19wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW01MTJfZ2V0bWFudF9wZChBLCBCLCBDKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmQpX19idWlsdGluX2lhMzJfZ2V0bWFudHBkNTEyX21hc2soKF9fdjhkZikoX19tNTEyZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoKChDKTw8MikgfCAoQikpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpX21tNTEyX3NldHplcm9fcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza19nZXRtYW50X3BkKFcsIFUsIEEsIEIsIEMpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyZClfX2J1aWx0aW5faWEzMl9nZXRtYW50cGQ1MTJfbWFzaygoX192OGRmKShfX201MTJkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSgoKEMpPDwyKSB8IChCKSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikoX19tNTEyZCkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrel9nZXRtYW50X3BkKFUsIEEsIEIsIEMpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyZClfX2J1aWx0aW5faWEzMl9nZXRtYW50cGQ1MTJfbWFzaygoX192OGRmKShfX201MTJkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSgoKEMpPDwyKSB8IChCKSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZilfbW01MTJfc2V0emVyb19wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsgfSkKKworI2RlZmluZSBfbW01MTJfZ2V0bWFudF9yb3VuZF9wcyhBLCBCLCBDLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMilfX2J1aWx0aW5faWEzMl9nZXRtYW50cHM1MTJfbWFzaygoX192MTZzZikoX19tNTEyKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKCgoQyk8PDIpIHwgKEIpKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKV9tbTUxMl91bmRlZmluZWRfcHMoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpLTEsIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza19nZXRtYW50X3JvdW5kX3BzKFcsIFUsIEEsIEIsIEMsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyKV9fYnVpbHRpbl9pYTMyX2dldG1hbnRwczUxMl9tYXNrKChfX3YxNnNmKShfX201MTIpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoKChDKTw8MikgfCAoQikpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpKF9fbTUxMikoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KShVKSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrel9nZXRtYW50X3JvdW5kX3BzKFUsIEEsIEIsIEMsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyKV9fYnVpbHRpbl9pYTMyX2dldG1hbnRwczUxMl9tYXNrKChfX3YxNnNmKShfX201MTIpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoKChDKTw8MikgfCAoQikpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpX21tNTEyX3NldHplcm9fcHMoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpKFUpLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX2dldG1hbnRfcHMoQSwgQiwgQykgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTIpX19idWlsdGluX2lhMzJfZ2V0bWFudHBzNTEyX21hc2soKF9fdjE2c2YpKF9fbTUxMikoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSgoKEMpPDwyKXwoQikpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpX21tNTEyX3VuZGVmaW5lZF9wcygpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNiktMSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2tfZ2V0bWFudF9wcyhXLCBVLCBBLCBCLCBDKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMilfX2J1aWx0aW5faWEzMl9nZXRtYW50cHM1MTJfbWFzaygoX192MTZzZikoX19tNTEyKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKCgoQyk8PDIpfChCKSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikoX19tNTEyKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpKFUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza3pfZ2V0bWFudF9wcyhVLCBBLCBCLCBDKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMilfX2J1aWx0aW5faWEzMl9nZXRtYW50cHM1MTJfbWFzaygoX192MTZzZikoX19tNTEyKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKCgoQyk8PDIpfChCKSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZilfbW01MTJfc2V0emVyb19wcygpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOyB9KQorCisjZGVmaW5lIF9tbTUxMl9nZXRleHBfcm91bmRfcGQoQSwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJkKV9fYnVpbHRpbl9pYTMyX2dldGV4cHBkNTEyX21hc2soKF9fdjhkZikoX19tNTEyZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKV9tbTUxMl91bmRlZmluZWRfcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX2dldGV4cF9yb3VuZF9wZChXLCBVLCBBLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmQpX19idWlsdGluX2lhMzJfZ2V0ZXhwcGQ1MTJfbWFzaygoX192OGRmKShfX201MTJkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpKF9fbTUxMmQpKFcpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrel9nZXRleHBfcm91bmRfcGQoVSwgQSwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJkKV9fYnVpbHRpbl9pYTMyX2dldGV4cHBkNTEyX21hc2soKF9fdjhkZikoX19tNTEyZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKV9tbTUxMl9zZXR6ZXJvX3BkKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShSKSk7IH0pCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfZ2V0ZXhwX3BkIChfX201MTJkIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJkKSBfX2J1aWx0aW5faWEzMl9nZXRleHBwZDUxMl9tYXNrICgoX192OGRmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjhkZikgX21tNTEyX3VuZGVmaW5lZF9wZCAoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xLAorICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19nZXRleHBfcGQgKF9fbTUxMmQgX19XLCBfX21tYXNrOCBfX1UsIF9fbTUxMmQgX19BKQoreworICByZXR1cm4gKF9fbTUxMmQpIF9fYnVpbHRpbl9pYTMyX2dldGV4cHBkNTEyX21hc2sgKChfX3Y4ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192OGRmKSBfX1csCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9nZXRleHBfcGQgKF9fbW1hc2s4IF9fVSwgX19tNTEyZCBfX0EpCit7CisgIHJldHVybiAoX19tNTEyZCkgX19idWlsdGluX2lhMzJfZ2V0ZXhwcGQ1MTJfbWFzayAoKF9fdjhkZikgX19BLAorICAgICAgICAgICAgICAgIChfX3Y4ZGYpIF9tbTUxMl9zZXR6ZXJvX3BkICgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKKyNkZWZpbmUgX21tNTEyX2dldGV4cF9yb3VuZF9wcyhBLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMilfX2J1aWx0aW5faWEzMl9nZXRleHBwczUxMl9tYXNrKChfX3YxNnNmKShfX201MTIpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZilfbW01MTJfdW5kZWZpbmVkX3BzKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpLTEsIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza19nZXRleHBfcm91bmRfcHMoVywgVSwgQSwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTIpX19idWlsdGluX2lhMzJfZ2V0ZXhwcHM1MTJfbWFzaygoX192MTZzZikoX19tNTEyKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpKF9fbTUxMikoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpKFUpLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X2dldGV4cF9yb3VuZF9wcyhVLCBBLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMilfX2J1aWx0aW5faWEzMl9nZXRleHBwczUxMl9tYXNrKChfX3YxNnNmKShfX201MTIpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZilfbW01MTJfc2V0emVyb19wcygpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KShVKSwgKGludCkoUikpOyB9KQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfZ2V0ZXhwX3BzIChfX201MTIgX19BKQoreworICByZXR1cm4gKF9fbTUxMikgX19idWlsdGluX2lhMzJfZ2V0ZXhwcHM1MTJfbWFzayAoKF9fdjE2c2YpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3YxNnNmKSBfbW01MTJfdW5kZWZpbmVkX3BzICgpLAorICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgLTEsCisgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19nZXRleHBfcHMgKF9fbTUxMiBfX1csIF9fbW1hc2sxNiBfX1UsIF9fbTUxMiBfX0EpCit7CisgIHJldHVybiAoX19tNTEyKSBfX2J1aWx0aW5faWEzMl9nZXRleHBwczUxMl9tYXNrICgoX192MTZzZikgX19BLAorICAgICAgICAgICAgICAgKF9fdjE2c2YpIF9fVywKKyAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSwKKyAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9nZXRleHBfcHMgKF9fbW1hc2sxNiBfX1UsIF9fbTUxMiBfX0EpCit7CisgIHJldHVybiAoX19tNTEyKSBfX2J1aWx0aW5faWEzMl9nZXRleHBwczUxMl9tYXNrICgoX192MTZzZikgX19BLAorICAgICAgICAgICAgICAgKF9fdjE2c2YpIF9tbTUxMl9zZXR6ZXJvX3BzICgpLAorICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VLAorICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworI2RlZmluZSBfbW01MTJfaTY0Z2F0aGVyX3BzKGluZGV4LCBhZGRyLCBzY2FsZSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTYpX19idWlsdGluX2lhMzJfZ2F0aGVyZGl2MTZzZigoX192OHNmKV9tbTI1Nl91bmRlZmluZWRfcHMoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0IGNvbnN0ICopKGFkZHIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKShfX201MTJpKShpbmRleCksIChfX21tYXNrOCktMSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoc2NhbGUpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza19pNjRnYXRoZXJfcHMoIF9fdjFfb2xkLCBfX21hc2ssIF9faW5kZXgsXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYWRkciwgX19zY2FsZSkgX19leHRlbnNpb25fXyh7XAorX19idWlsdGluX2lhMzJfZ2F0aGVyZGl2MTZzZiAoKF9fdjhzZikgX192MV9vbGQsXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19hZGRyLChfX3Y4ZGkpIF9faW5kZXgsIF9fbWFzaywgX19zY2FsZSk7XAorfSkKKworI2RlZmluZSBfbW01MTJfaTY0Z2F0aGVyX2VwaTMyKGluZGV4LCBhZGRyLCBzY2FsZSkgX19leHRlbnNpb25fXyAoe1wKKyAgKF9fbTI1NmkpX19idWlsdGluX2lhMzJfZ2F0aGVyZGl2MTZzaSgoX192OHNpKV9tbTI1Nl91bmRlZmluZWRfcHMoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQgY29uc3QgKikoYWRkciksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKShfX201MTJpKShpbmRleCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEsIChpbnQpKHNjYWxlKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2tfaTY0Z2F0aGVyX2VwaTMyKHYxX29sZCwgbWFzaywgaW5kZXgsIGFkZHIsIHNjYWxlKSBfX2V4dGVuc2lvbl9fICh7XAorICAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9nYXRoZXJkaXYxNnNpKChfX3Y4c2kpKF9fbTI1NmkpKHYxX29sZCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50IGNvbnN0ICopKGFkZHIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkaSkoX19tNTEyaSkoaW5kZXgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShtYXNrKSwgKGludCkoc2NhbGUpKTsgfSkKKworI2RlZmluZSBfbW01MTJfaTY0Z2F0aGVyX3BkKGluZGV4LCBhZGRyLCBzY2FsZSkgX19leHRlbnNpb25fXyAoe1wKKyAgKF9fbTUxMmQpX19idWlsdGluX2lhMzJfZ2F0aGVyZGl2OGRmKChfX3Y4ZGYpX21tNTEyX3VuZGVmaW5lZF9wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlIGNvbnN0ICopKGFkZHIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKShfX201MTJpKShpbmRleCksIChfX21tYXNrOCktMSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoc2NhbGUpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza19pNjRnYXRoZXJfcGQodjFfb2xkLCBtYXNrLCBpbmRleCwgYWRkciwgc2NhbGUpIF9fZXh0ZW5zaW9uX18gKHtcCisgIChfX201MTJkKV9fYnVpbHRpbl9pYTMyX2dhdGhlcmRpdjhkZigoX192OGRmKShfX201MTJkKSh2MV9vbGQpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlIGNvbnN0ICopKGFkZHIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKShfX201MTJpKShpbmRleCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkobWFzayksIChpbnQpKHNjYWxlKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX2k2NGdhdGhlcl9lcGk2NChpbmRleCwgYWRkciwgc2NhbGUpIF9fZXh0ZW5zaW9uX18gKHtcCisgIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX2dhdGhlcmRpdjhkaSgoX192OGRpKV9tbTUxMl91bmRlZmluZWRfcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyBjb25zdCAqKShhZGRyKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkaSkoX19tNTEyaSkoaW5kZXgpLCAoX19tbWFzazgpLTEsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKHNjYWxlKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2tfaTY0Z2F0aGVyX2VwaTY0KHYxX29sZCwgbWFzaywgaW5kZXgsIGFkZHIsIHNjYWxlKSBfX2V4dGVuc2lvbl9fICh7XAorICAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9nYXRoZXJkaXY4ZGkoKF9fdjhkaSkoX19tNTEyaSkodjFfb2xkKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyBjb25zdCAqKShhZGRyKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkaSkoX19tNTEyaSkoaW5kZXgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKG1hc2spLCAoaW50KShzY2FsZSkpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9pMzJnYXRoZXJfcHMoaW5kZXgsIGFkZHIsIHNjYWxlKSBfX2V4dGVuc2lvbl9fICh7XAorICAoX19tNTEyKV9fYnVpbHRpbl9pYTMyX2dhdGhlcnNpdjE2c2YoKF9fdjE2c2YpX21tNTEyX3VuZGVmaW5lZF9wcygpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQgY29uc3QgKikoYWRkciksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKShfX201MTIpKGluZGV4KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNiktMSwgKGludCkoc2NhbGUpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza19pMzJnYXRoZXJfcHModjFfb2xkLCBtYXNrLCBpbmRleCwgYWRkciwgc2NhbGUpIF9fZXh0ZW5zaW9uX18gKHtcCisgIChfX201MTIpX19idWlsdGluX2lhMzJfZ2F0aGVyc2l2MTZzZigoX192MTZzZikoX19tNTEyKSh2MV9vbGQpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQgY29uc3QgKikoYWRkciksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKShfX201MTIpKGluZGV4KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikobWFzayksIChpbnQpKHNjYWxlKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX2kzMmdhdGhlcl9lcGkzMihpbmRleCwgYWRkciwgc2NhbGUpIF9fZXh0ZW5zaW9uX18gKHtcCisgIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX2dhdGhlcnNpdjE2c2koKF9fdjE2c2kpX21tNTEyX3VuZGVmaW5lZF9lcGkzMigpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCBjb25zdCAqKShhZGRyKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNpKShfX201MTJpKShpbmRleCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KS0xLCAoaW50KShzY2FsZSkpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX2kzMmdhdGhlcl9lcGkzMih2MV9vbGQsIG1hc2ssIGluZGV4LCBhZGRyLCBzY2FsZSkgX19leHRlbnNpb25fXyAoe1wKKyAgKF9fbTUxMmkpX19idWlsdGluX2lhMzJfZ2F0aGVyc2l2MTZzaSgoX192MTZzaSkoX19tNTEyaSkodjFfb2xkKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQgY29uc3QgKikoYWRkciksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzaSkoX19tNTEyaSkoaW5kZXgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikobWFzayksIChpbnQpKHNjYWxlKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX2kzMmdhdGhlcl9wZChpbmRleCwgYWRkciwgc2NhbGUpIF9fZXh0ZW5zaW9uX18gKHtcCisgIChfX201MTJkKV9fYnVpbHRpbl9pYTMyX2dhdGhlcnNpdjhkZigoX192OGRmKV9tbTUxMl91bmRlZmluZWRfcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSBjb25zdCAqKShhZGRyKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzaSkoX19tMjU2aSkoaW5kZXgpLCAoX19tbWFzazgpLTEsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKHNjYWxlKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2tfaTMyZ2F0aGVyX3BkKHYxX29sZCwgbWFzaywgaW5kZXgsIGFkZHIsIHNjYWxlKSBfX2V4dGVuc2lvbl9fICh7XAorICAoX19tNTEyZClfX2J1aWx0aW5faWEzMl9nYXRoZXJzaXY4ZGYoKF9fdjhkZikoX19tNTEyZCkodjFfb2xkKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSBjb25zdCAqKShhZGRyKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzaSkoX19tMjU2aSkoaW5kZXgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKG1hc2spLCAoaW50KShzY2FsZSkpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9pMzJnYXRoZXJfZXBpNjQoaW5kZXgsIGFkZHIsIHNjYWxlKSBfX2V4dGVuc2lvbl9fICh7XAorICAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9nYXRoZXJzaXY4ZGkoKF9fdjhkaSlfbW01MTJfdW5kZWZpbmVkX2VwaTMyKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcgY29uc3QgKikoYWRkciksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2kpKF9fbTI1NmkpKGluZGV4KSwgKF9fbW1hc2s4KS0xLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShzY2FsZSkpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX2kzMmdhdGhlcl9lcGk2NCh2MV9vbGQsIG1hc2ssIGluZGV4LCBhZGRyLCBzY2FsZSkgX19leHRlbnNpb25fXyAoe1wKKyAgKF9fbTUxMmkpX19idWlsdGluX2lhMzJfZ2F0aGVyc2l2OGRpKChfX3Y4ZGkpKF9fbTUxMmkpKHYxX29sZCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcgY29uc3QgKikoYWRkciksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2kpKF9fbTI1NmkpKGluZGV4KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShtYXNrKSwgKGludCkoc2NhbGUpKTsgfSkKKworI2RlZmluZSBfbW01MTJfaTY0c2NhdHRlcl9wcyhhZGRyLCBpbmRleCwgdjEsIHNjYWxlKSBfX2V4dGVuc2lvbl9fICh7XAorICBfX2J1aWx0aW5faWEzMl9zY2F0dGVyZGl2MTZzZigoZmxvYXQgKikoYWRkciksIChfX21tYXNrOCktMSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKShfX201MTJpKShpbmRleCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzZikoX19tMjU2KSh2MSksIChpbnQpKHNjYWxlKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2tfaTY0c2NhdHRlcl9wcyhhZGRyLCBtYXNrLCBpbmRleCwgdjEsIHNjYWxlKSBfX2V4dGVuc2lvbl9fICh7XAorICBfX2J1aWx0aW5faWEzMl9zY2F0dGVyZGl2MTZzZigoZmxvYXQgKikoYWRkciksIChfX21tYXNrOCkobWFzayksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkaSkoX19tNTEyaSkoaW5kZXgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2YpKF9fbTI1NikodjEpLCAoaW50KShzY2FsZSkpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9pNjRzY2F0dGVyX2VwaTMyKGFkZHIsIGluZGV4LCB2MSwgc2NhbGUpIF9fZXh0ZW5zaW9uX18gKHtcCisgIF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJkaXYxNnNpKChpbnQgKikoYWRkciksIChfX21tYXNrOCktMSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKShfX201MTJpKShpbmRleCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzaSkoX19tMjU2aSkodjEpLCAoaW50KShzY2FsZSkpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX2k2NHNjYXR0ZXJfZXBpMzIoYWRkciwgbWFzaywgaW5kZXgsIHYxLCBzY2FsZSkgX19leHRlbnNpb25fXyAoe1wKKyAgX19idWlsdGluX2lhMzJfc2NhdHRlcmRpdjE2c2koKGludCAqKShhZGRyKSwgKF9fbW1hc2s4KShtYXNrKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKShfX201MTJpKShpbmRleCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzaSkoX19tMjU2aSkodjEpLCAoaW50KShzY2FsZSkpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9pNjRzY2F0dGVyX3BkKGFkZHIsIGluZGV4LCB2MSwgc2NhbGUpIF9fZXh0ZW5zaW9uX18gKHtcCisgIF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJkaXY4ZGYoKGRvdWJsZSAqKShhZGRyKSwgKF9fbW1hc2s4KS0xLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkaSkoX19tNTEyaSkoaW5kZXgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikoX19tNTEyZCkodjEpLCAoaW50KShzY2FsZSkpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX2k2NHNjYXR0ZXJfcGQoYWRkciwgbWFzaywgaW5kZXgsIHYxLCBzY2FsZSkgX19leHRlbnNpb25fXyAoe1wKKyAgX19idWlsdGluX2lhMzJfc2NhdHRlcmRpdjhkZigoZG91YmxlICopKGFkZHIpLCAoX19tbWFzazgpKG1hc2spLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkaSkoX19tNTEyaSkoaW5kZXgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZikoX19tNTEyZCkodjEpLCAoaW50KShzY2FsZSkpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9pNjRzY2F0dGVyX2VwaTY0KGFkZHIsIGluZGV4LCB2MSwgc2NhbGUpIF9fZXh0ZW5zaW9uX18gKHtcCisgIF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJkaXY4ZGkoKGxvbmcgbG9uZyAqKShhZGRyKSwgKF9fbW1hc2s4KS0xLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkaSkoX19tNTEyaSkoaW5kZXgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkaSkoX19tNTEyaSkodjEpLCAoaW50KShzY2FsZSkpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX2k2NHNjYXR0ZXJfZXBpNjQoYWRkciwgbWFzaywgaW5kZXgsIHYxLCBzY2FsZSkgX19leHRlbnNpb25fXyAoe1wKKyAgX19idWlsdGluX2lhMzJfc2NhdHRlcmRpdjhkaSgobG9uZyBsb25nICopKGFkZHIpLCAoX19tbWFzazgpKG1hc2spLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkaSkoX19tNTEyaSkoaW5kZXgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkaSkoX19tNTEyaSkodjEpLCAoaW50KShzY2FsZSkpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9pMzJzY2F0dGVyX3BzKGFkZHIsIGluZGV4LCB2MSwgc2NhbGUpIF9fZXh0ZW5zaW9uX18gKHtcCisgIF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJzaXYxNnNmKChmbG9hdCAqKShhZGRyKSwgKF9fbW1hc2sxNiktMSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzaSkoX19tNTEyaSkoaW5kZXgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKShfX201MTIpKHYxKSwgKGludCkoc2NhbGUpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza19pMzJzY2F0dGVyX3BzKGFkZHIsIG1hc2ssIGluZGV4LCB2MSwgc2NhbGUpIF9fZXh0ZW5zaW9uX18gKHtcCisgIF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJzaXYxNnNmKChmbG9hdCAqKShhZGRyKSwgKF9fbW1hc2sxNikobWFzayksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpKF9fbTUxMmkpKGluZGV4KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZikoX19tNTEyKSh2MSksIChpbnQpKHNjYWxlKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX2kzMnNjYXR0ZXJfZXBpMzIoYWRkciwgaW5kZXgsIHYxLCBzY2FsZSkgX19leHRlbnNpb25fXyAoe1wKKyAgX19idWlsdGluX2lhMzJfc2NhdHRlcnNpdjE2c2koKGludCAqKShhZGRyKSwgKF9fbW1hc2sxNiktMSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzaSkoX19tNTEyaSkoaW5kZXgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNpKShfX201MTJpKSh2MSksIChpbnQpKHNjYWxlKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2tfaTMyc2NhdHRlcl9lcGkzMihhZGRyLCBtYXNrLCBpbmRleCwgdjEsIHNjYWxlKSBfX2V4dGVuc2lvbl9fICh7XAorICBfX2J1aWx0aW5faWEzMl9zY2F0dGVyc2l2MTZzaSgoaW50ICopKGFkZHIpLCAoX19tbWFzazE2KShtYXNrKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzaSkoX19tNTEyaSkoaW5kZXgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNpKShfX201MTJpKSh2MSksIChpbnQpKHNjYWxlKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX2kzMnNjYXR0ZXJfcGQoYWRkciwgaW5kZXgsIHYxLCBzY2FsZSkgX19leHRlbnNpb25fXyAoe1wKKyAgX19idWlsdGluX2lhMzJfc2NhdHRlcnNpdjhkZigoZG91YmxlICopKGFkZHIpLCAoX19tbWFzazgpLTEsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNpKShfX20yNTZpKShpbmRleCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKShfX201MTJkKSh2MSksIChpbnQpKHNjYWxlKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2tfaTMyc2NhdHRlcl9wZChhZGRyLCBtYXNrLCBpbmRleCwgdjEsIHNjYWxlKSBfX2V4dGVuc2lvbl9fICh7XAorICBfX2J1aWx0aW5faWEzMl9zY2F0dGVyc2l2OGRmKChkb3VibGUgKikoYWRkciksIChfX21tYXNrOCkobWFzayksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNpKShfX20yNTZpKShpbmRleCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKShfX201MTJkKSh2MSksIChpbnQpKHNjYWxlKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX2kzMnNjYXR0ZXJfZXBpNjQoYWRkciwgaW5kZXgsIHYxLCBzY2FsZSkgX19leHRlbnNpb25fXyAoe1wKKyAgX19idWlsdGluX2lhMzJfc2NhdHRlcnNpdjhkaSgobG9uZyBsb25nICopKGFkZHIpLCAoX19tbWFzazgpLTEsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNpKShfX20yNTZpKShpbmRleCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKShfX201MTJpKSh2MSksIChpbnQpKHNjYWxlKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2tfaTMyc2NhdHRlcl9lcGk2NChhZGRyLCBtYXNrLCBpbmRleCwgdjEsIHNjYWxlKSBfX2V4dGVuc2lvbl9fICh7XAorICBfX2J1aWx0aW5faWEzMl9zY2F0dGVyc2l2OGRpKChsb25nIGxvbmcgKikoYWRkciksIChfX21tYXNrOCkobWFzayksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNpKShfX20yNTZpKShpbmRleCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKShfX201MTJpKSh2MSksIChpbnQpKHNjYWxlKSk7IH0pCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2ZtYWRkX3NzIChfX20xMjggX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNzM19tYXNrICgoX192NHNmKSBfX0EsCisgICAgICAgICAgKF9fdjRzZikgX19CLAorICAgICAgICAgIChfX3Y0c2YpIF9fVywKKyAgICAgICAgICAoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCisjZGVmaW5lIF9tbV9tYXNrX2ZtYWRkX3JvdW5kX3NzKFcsIFUsIEEsIEIsIFIpIF9fZXh0ZW5zaW9uX18oe1wKKyAgKF9fbTEyOClfX2J1aWx0aW5faWEzMl92Zm1hZGRzczNfbWFzaygoX192NHNmKShfX20xMjgpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpKF9fbTEyOCkoVyksIChfX21tYXNrOCkoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShSKSk7IH0pCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9mbWFkZF9zcyAoX19tbWFzazggX19VLCBfX20xMjggX19BLCBfX20xMjggX19CLCBfX20xMjggX19DKQoreworIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl92Zm1hZGRzczNfbWFza3ogKChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAoX192NHNmKSBfX0IsCisgICAgICAgICAgKF9fdjRzZikgX19DLAorICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKKyNkZWZpbmUgX21tX21hc2t6X2ZtYWRkX3JvdW5kX3NzKFUsIEEsIEIsIEMsIFIpIF9fZXh0ZW5zaW9uX18gKHtcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfdmZtYWRkc3MzX21hc2t6KChfX3Y0c2YpKF9fbTEyOCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKShfX20xMjgpKEMpLCAoX19tbWFzazgpKFUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7IH0pCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrM19mbWFkZF9zcyAoX19tMTI4IF9fVywgX19tMTI4IF9fWCwgX19tMTI4IF9fWSwgX19tbWFzazggX19VKQoreworIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl92Zm1hZGRzczNfbWFzazMgKChfX3Y0c2YpIF9fVywKKyAgICAgICAgICAoX192NHNmKSBfX1gsCisgICAgICAgICAgKF9fdjRzZikgX19ZLAorICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKKyNkZWZpbmUgX21tX21hc2szX2ZtYWRkX3JvdW5kX3NzKFcsIFgsIFksIFUsIFIpIF9fZXh0ZW5zaW9uX18gKHtcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfdmZtYWRkc3MzX21hc2szKChfX3Y0c2YpKF9fbTEyOCkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShYKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKShfX20xMjgpKFkpLCAoX19tbWFzazgpKFUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKFIpKTsgfSkKKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfZm1zdWJfc3MgKF9fbTEyOCBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfdmZtYWRkc3MzX21hc2sgKChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAtKF9fdjRzZikgX19CLAorICAgICAgICAgIChfX3Y0c2YpIF9fVywKKyAgICAgICAgICAoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCisjZGVmaW5lIF9tbV9tYXNrX2Ztc3ViX3JvdW5kX3NzKFcsIFUsIEEsIEIsIFIpIF9fZXh0ZW5zaW9uX18gKHtcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfdmZtYWRkc3MzX21hc2soKF9fdjRzZikoX19tMTI4KShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oX192NHNmKShfX20xMjgpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShXKSwgKF9fbW1hc2s4KShVKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKFIpKTsgfSkKKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2Ztc3ViX3NzIChfX21tYXNrOCBfX1UsIF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IsIF9fbTEyOCBfX0MpCit7CisgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNzM19tYXNreiAoKF9fdjRzZikgX19BLAorICAgICAgICAgIChfX3Y0c2YpIF9fQiwKKyAgICAgICAgICAtKF9fdjRzZikgX19DLAorICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKKyNkZWZpbmUgX21tX21hc2t6X2Ztc3ViX3JvdW5kX3NzKFUsIEEsIEIsIEMsIFIpIF9fZXh0ZW5zaW9uX18gKHtcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfdmZtYWRkc3MzX21hc2t6KChfX3Y0c2YpKF9fbTEyOCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKF9fdjRzZikoX19tMTI4KShDKSwgKF9fbW1hc2s4KShVKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShSKSk7IH0pCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrM19mbXN1Yl9zcyAoX19tMTI4IF9fVywgX19tMTI4IF9fWCwgX19tMTI4IF9fWSwgX19tbWFzazggX19VKQoreworIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl92Zm1hZGRzczNfbWFzazMgKChfX3Y0c2YpIF9fVywKKyAgICAgICAgICAoX192NHNmKSBfX1gsCisgICAgICAgICAgLShfX3Y0c2YpIF9fWSwKKyAgICAgICAgICAoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCisjZGVmaW5lIF9tbV9tYXNrM19mbXN1Yl9yb3VuZF9zcyhXLCBYLCBZLCBVLCBSKSBfX2V4dGVuc2lvbl9fICh7XAorICAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNzM19tYXNrMygoX192NHNmKShfX20xMjgpKFcpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpKF9fbTEyOCkoWCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShfX3Y0c2YpKF9fbTEyOCkoWSksIChfX21tYXNrOCkoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoUikpOyB9KQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19mbm1hZGRfc3MgKF9fbTEyOCBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfdmZtYWRkc3MzX21hc2sgKC0oX192NHNmKSBfX0EsCisgICAgICAgICAgKF9fdjRzZikgX19CLAorICAgICAgICAgIChfX3Y0c2YpIF9fVywKKyAgICAgICAgICAoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCisjZGVmaW5lIF9tbV9tYXNrX2ZubWFkZF9yb3VuZF9zcyhXLCBVLCBBLCBCLCBSKSBfX2V4dGVuc2lvbl9fICh7XAorICAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNzM19tYXNrKC0oX192NHNmKShfX20xMjgpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpKF9fbTEyOCkoVyksIChfX21tYXNrOCkoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShSKSk7IH0pCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9mbm1hZGRfc3MgKF9fbW1hc2s4IF9fVSwgX19tMTI4IF9fQSwgX19tMTI4IF9fQiwgX19tMTI4IF9fQykKK3sKKyByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfdmZtYWRkc3MzX21hc2t6ICgtKF9fdjRzZikgX19BLAorICAgICAgICAgIChfX3Y0c2YpIF9fQiwKKyAgICAgICAgICAoX192NHNmKSBfX0MsCisgICAgICAgICAgKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworI2RlZmluZSBfbW1fbWFza3pfZm5tYWRkX3JvdW5kX3NzKFUsIEEsIEIsIEMsIFIpIF9fZXh0ZW5zaW9uX18gKHtcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfdmZtYWRkc3MzX21hc2t6KC0oX192NHNmKShfX20xMjgpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpKF9fbTEyOCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShDKSwgKF9fbW1hc2s4KShVKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShSKSk7IH0pCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrM19mbm1hZGRfc3MgKF9fbTEyOCBfX1csIF9fbTEyOCBfX1gsIF9fbTEyOCBfX1ksIF9fbW1hc2s4IF9fVSkKK3sKKyByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfdmZtYWRkc3MzX21hc2szICgtKF9fdjRzZikgX19XLAorICAgICAgICAgIChfX3Y0c2YpIF9fWCwKKyAgICAgICAgICAoX192NHNmKSBfX1ksCisgICAgICAgICAgKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworI2RlZmluZSBfbW1fbWFzazNfZm5tYWRkX3JvdW5kX3NzKFcsIFgsIFksIFUsIFIpIF9fZXh0ZW5zaW9uX18oe1wKKyAgKF9fbTEyOClfX2J1aWx0aW5faWEzMl92Zm1hZGRzczNfbWFzazMoLShfX3Y0c2YpKF9fbTEyOCkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShYKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKShfX20xMjgpKFkpLCAoX19tbWFzazgpKFUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKFIpKTsgfSkKKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfZm5tc3ViX3NzIChfX20xMjggX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNzM19tYXNrICgtKF9fdjRzZikgX19BLAorICAgICAgICAgIC0oX192NHNmKSBfX0IsCisgICAgICAgICAgKF9fdjRzZikgX19XLAorICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKKyNkZWZpbmUgX21tX21hc2tfZm5tc3ViX3JvdW5kX3NzKFcsIFUsIEEsIEIsIFIpIF9fZXh0ZW5zaW9uX18gKHtcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfdmZtYWRkc3MzX21hc2soLShfX3Y0c2YpKF9fbTEyOCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKF9fdjRzZikoX19tMTI4KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpKF9fbTEyOCkoVyksIChfX21tYXNrOCkoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShSKSk7IH0pCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9mbm1zdWJfc3MgKF9fbW1hc2s4IF9fVSwgX19tMTI4IF9fQSwgX19tMTI4IF9fQiwgX19tMTI4IF9fQykKK3sKKyByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfdmZtYWRkc3MzX21hc2t6ICgtKF9fdjRzZikgX19BLAorICAgICAgICAgIChfX3Y0c2YpIF9fQiwKKyAgICAgICAgICAtKF9fdjRzZikgX19DLAorICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKKyNkZWZpbmUgX21tX21hc2t6X2ZubXN1Yl9yb3VuZF9zcyhVLCBBLCBCLCBDLCBSKSBfX2V4dGVuc2lvbl9fICh7XAorICAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNzM19tYXNreigtKF9fdjRzZikoX19tMTI4KShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKShfX20xMjgpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oX192NHNmKShfX20xMjgpKEMpLCAoX19tbWFzazgpKFUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7IH0pCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrM19mbm1zdWJfc3MgKF9fbTEyOCBfX1csIF9fbTEyOCBfX1gsIF9fbTEyOCBfX1ksIF9fbW1hc2s4IF9fVSkKK3sKKyByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfdmZtYWRkc3MzX21hc2szICgtKF9fdjRzZikgX19XLAorICAgICAgICAgIChfX3Y0c2YpIF9fWCwKKyAgICAgICAgICAtKF9fdjRzZikgX19ZLAorICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKKyNkZWZpbmUgX21tX21hc2szX2ZubXN1Yl9yb3VuZF9zcyhXLCBYLCBZLCBVLCBSKSBfX2V4dGVuc2lvbl9fKHtcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfdmZtYWRkc3MzX21hc2szKC0oX192NHNmKShfX20xMjgpKFcpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpKF9fbTEyOCkoWCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShfX3Y0c2YpKF9fbTEyOCkoWSksIChfX21tYXNrOCkoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoUikpOyB9KQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfZm1hZGRfc2QgKF9fbTEyOGQgX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNkM19tYXNrICggKF9fdjJkZikgX19BLAorICAgICAgICAgIChfX3YyZGYpIF9fQiwKKyAgICAgICAgICAoX192MmRmKSBfX1csCisgICAgICAgICAgKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworI2RlZmluZSBfbW1fbWFza19mbWFkZF9yb3VuZF9zZChXLCBVLCBBLCBCLCBSKSBfX2V4dGVuc2lvbl9fKHtcCisgIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNkM19tYXNrKChfX3YyZGYpKF9fbTEyOGQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fbTEyOGQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fbTEyOGQpKFcpLCAoX19tbWFzazgpKFUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKFIpKTsgfSkKKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9mbWFkZF9zZCAoX19tbWFzazggX19VLCBfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IsIF9fbTEyOGQgX19DKQoreworIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfdmZtYWRkc2QzX21hc2t6ICggKF9fdjJkZikgX19BLAorICAgICAgICAgIChfX3YyZGYpIF9fQiwKKyAgICAgICAgICAoX192MmRmKSBfX0MsCisgICAgICAgICAgKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworI2RlZmluZSBfbW1fbWFza3pfZm1hZGRfcm91bmRfc2QoVSwgQSwgQiwgQywgUikgX19leHRlbnNpb25fXyAoe1wKKyAgKF9fbTEyOGQpX19idWlsdGluX2lhMzJfdmZtYWRkc2QzX21hc2t6KChfX3YyZGYpKF9fbTEyOGQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZikoX19tMTI4ZCkoQyksIChfX21tYXNrOCkoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7IH0pCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFzazNfZm1hZGRfc2QgKF9fbTEyOGQgX19XLCBfX20xMjhkIF9fWCwgX19tMTI4ZCBfX1ksIF9fbW1hc2s4IF9fVSkKK3sKKyByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNkM19tYXNrMyAoKF9fdjJkZikgX19XLAorICAgICAgICAgIChfX3YyZGYpIF9fWCwKKyAgICAgICAgICAoX192MmRmKSBfX1ksCisgICAgICAgICAgKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworI2RlZmluZSBfbW1fbWFzazNfZm1hZGRfcm91bmRfc2QoVywgWCwgWSwgVSwgUikgX19leHRlbnNpb25fXyAoe1wKKyAgKF9fbTEyOGQpX19idWlsdGluX2lhMzJfdmZtYWRkc2QzX21hc2szKChfX3YyZGYpKF9fbTEyOGQpKFcpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShYKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZikoX19tMTI4ZCkoWSksIChfX21tYXNrOCkoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKFIpKTsgfSkKKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2Ztc3ViX3NkIChfX20xMjhkIF9fVywgX19tbWFzazggX19VLCBfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl92Zm1hZGRzZDNfbWFzayAoIChfX3YyZGYpIF9fQSwKKyAgICAgICAgICAtKF9fdjJkZikgX19CLAorICAgICAgICAgIChfX3YyZGYpIF9fVywKKyAgICAgICAgICAoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCisjZGVmaW5lIF9tbV9tYXNrX2Ztc3ViX3JvdW5kX3NkKFcsIFUsIEEsIEIsIFIpIF9fZXh0ZW5zaW9uX18gKHtcCisgIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNkM19tYXNrKChfX3YyZGYpKF9fbTEyOGQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oX192MmRmKShfX20xMjhkKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShXKSwgKF9fbW1hc2s4KShVKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShSKSk7IH0pCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfZm1zdWJfc2QgKF9fbW1hc2s4IF9fVSwgX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CLCBfX20xMjhkIF9fQykKK3sKKyByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNkM19tYXNreiAoIChfX3YyZGYpIF9fQSwKKyAgICAgICAgICAoX192MmRmKSBfX0IsCisgICAgICAgICAgLShfX3YyZGYpIF9fQywKKyAgICAgICAgICAoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCisjZGVmaW5lIF9tbV9tYXNrel9mbXN1Yl9yb3VuZF9zZChVLCBBLCBCLCBDLCBSKSBfX2V4dGVuc2lvbl9fICh7XAorICAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl92Zm1hZGRzZDNfbWFza3ooKF9fdjJkZikoX19tMTI4ZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fbTEyOGQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKF9fdjJkZikoX19tMTI4ZCkoQyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIChpbnQpKFIpKTsgfSkKKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrM19mbXN1Yl9zZCAoX19tMTI4ZCBfX1csIF9fbTEyOGQgX19YLCBfX20xMjhkIF9fWSwgX19tbWFzazggX19VKQoreworIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfdmZtYWRkc2QzX21hc2szICgoX192MmRmKSBfX1csCisgICAgICAgICAgKF9fdjJkZikgX19YLAorICAgICAgICAgIC0oX192MmRmKSBfX1ksCisgICAgICAgICAgKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworI2RlZmluZSBfbW1fbWFzazNfZm1zdWJfcm91bmRfc2QoVywgWCwgWSwgVSwgUikgX19leHRlbnNpb25fXyAoe1wKKyAgKF9fbTEyOGQpX19idWlsdGluX2lhMzJfdmZtYWRkc2QzX21hc2szKChfX3YyZGYpKF9fbTEyOGQpKFcpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShYKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShfX3YyZGYpKF9fbTEyOGQpKFkpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShSKSk7IH0pCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19mbm1hZGRfc2QgKF9fbTEyOGQgX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNkM19tYXNrICggLShfX3YyZGYpIF9fQSwKKyAgICAgICAgICAoX192MmRmKSBfX0IsCisgICAgICAgICAgKF9fdjJkZikgX19XLAorICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKKyNkZWZpbmUgX21tX21hc2tfZm5tYWRkX3JvdW5kX3NkKFcsIFUsIEEsIEIsIFIpIF9fZXh0ZW5zaW9uX18gKHtcCisgIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNkM19tYXNrKC0oX192MmRmKShfX20xMjhkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShXKSwgKF9fbW1hc2s4KShVKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShSKSk7IH0pCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfZm5tYWRkX3NkIChfX21tYXNrOCBfX1UsIF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQiwgX19tMTI4ZCBfX0MpCit7CisgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl92Zm1hZGRzZDNfbWFza3ogKCAtKF9fdjJkZikgX19BLAorICAgICAgICAgIChfX3YyZGYpIF9fQiwKKyAgICAgICAgICAoX192MmRmKSBfX0MsCisgICAgICAgICAgKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworI2RlZmluZSBfbW1fbWFza3pfZm5tYWRkX3JvdW5kX3NkKFUsIEEsIEIsIEMsIFIpIF9fZXh0ZW5zaW9uX18gKHtcCisgIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNkM19tYXNreigtKF9fdjJkZikoX19tMTI4ZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fbTEyOGQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShDKSwgKF9fbW1hc2s4KShVKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoUikpOyB9KQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2szX2ZubWFkZF9zZCAoX19tMTI4ZCBfX1csIF9fbTEyOGQgX19YLCBfX20xMjhkIF9fWSwgX19tbWFzazggX19VKQoreworIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfdmZtYWRkc2QzX21hc2szICgtKF9fdjJkZikgX19XLAorICAgICAgICAgIChfX3YyZGYpIF9fWCwKKyAgICAgICAgICAoX192MmRmKSBfX1ksCisgICAgICAgICAgKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworI2RlZmluZSBfbW1fbWFzazNfZm5tYWRkX3JvdW5kX3NkKFcsIFgsIFksIFUsIFIpIF9fZXh0ZW5zaW9uX18oe1wKKyAgKF9fbTEyOGQpX19idWlsdGluX2lhMzJfdmZtYWRkc2QzX21hc2szKC0oX192MmRmKShfX20xMjhkKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZikoX19tMTI4ZCkoWCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fbTEyOGQpKFkpLCAoX19tbWFzazgpKFUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShSKSk7IH0pCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19mbm1zdWJfc2QgKF9fbTEyOGQgX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNkM19tYXNrICggLShfX3YyZGYpIF9fQSwKKyAgICAgICAgICAtKF9fdjJkZikgX19CLAorICAgICAgICAgIChfX3YyZGYpIF9fVywKKyAgICAgICAgICAoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCisjZGVmaW5lIF9tbV9tYXNrX2ZubXN1Yl9yb3VuZF9zZChXLCBVLCBBLCBCLCBSKSBfX2V4dGVuc2lvbl9fICh7XAorICAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl92Zm1hZGRzZDNfbWFzaygtKF9fdjJkZikoX19tMTI4ZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShfX3YyZGYpKF9fbTEyOGQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fbTEyOGQpKFcpLCAoX19tbWFzazgpKFUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKFIpKTsgfSkKKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9mbm1zdWJfc2QgKF9fbW1hc2s4IF9fVSwgX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CLCBfX20xMjhkIF9fQykKK3sKKyByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNkM19tYXNreiAoIC0oX192MmRmKSBfX0EsCisgICAgICAgICAgKF9fdjJkZikgX19CLAorICAgICAgICAgIC0oX192MmRmKSBfX0MsCisgICAgICAgICAgKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworI2RlZmluZSBfbW1fbWFza3pfZm5tc3ViX3JvdW5kX3NkKFUsIEEsIEIsIEMsIFIpIF9fZXh0ZW5zaW9uX18gKHtcCisgIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNkM19tYXNreigtKF9fdjJkZikoX19tMTI4ZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fbTEyOGQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKF9fdjJkZikoX19tMTI4ZCkoQyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7IH0pCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFzazNfZm5tc3ViX3NkIChfX20xMjhkIF9fVywgX19tMTI4ZCBfX1gsIF9fbTEyOGQgX19ZLCBfX21tYXNrOCBfX1UpCit7CisgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl92Zm1hZGRzZDNfbWFzazMgKC0oX192MmRmKSAoX19XKSwKKyAgICAgICAgICAoX192MmRmKSBfX1gsCisgICAgICAgICAgLShfX3YyZGYpIChfX1kpLAorICAgICAgICAgIChfX21tYXNrOCkgX19VLAorICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKKyNkZWZpbmUgX21tX21hc2szX2ZubXN1Yl9yb3VuZF9zZChXLCBYLCBZLCBVLCBSKSBfX2V4dGVuc2lvbl9fKHtcCisgIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNkM19tYXNrMygtKF9fdjJkZikoX19tMTI4ZCkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fbTEyOGQpKFgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKF9fdjJkZikoX19tMTI4ZCkoWSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW01MTJfcGVybXV0ZXhfcGQoWCwgQykgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJkKV9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3Y4ZGYpKF9fbTUxMmQpKFgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpX21tNTEyX3VuZGVmaW5lZF9wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgKyAoKChDKSA+PiAwKSAmIDB4MyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCArICgoKEMpID4+IDIpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICsgKCgoQykgPj4gNCkgJiAweDMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgKyAoKChDKSA+PiA2KSAmIDB4MyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCArICgoKEMpID4+IDApICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ICsgKCgoQykgPj4gMikgJiAweDMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgKyAoKChDKSA+PiA0KSAmIDB4MyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCArICgoKEMpID4+IDYpICYgMHgzKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2tfcGVybXV0ZXhfcGQoVywgVSwgWCwgQykgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJkKV9fYnVpbHRpbl9pYTMyX3NlbGVjdHBkXzUxMigoX19tbWFzazgpKFUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKV9tbTUxMl9wZXJtdXRleF9wZCgoWCksIChDKSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpKF9fbTUxMmQpKFcpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza3pfcGVybXV0ZXhfcGQoVSwgWCwgQykgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJkKV9fYnVpbHRpbl9pYTMyX3NlbGVjdHBkXzUxMigoX19tbWFzazgpKFUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRmKV9tbTUxMl9wZXJtdXRleF9wZCgoWCksIChDKSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpX21tNTEyX3NldHplcm9fcGQoKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX3Blcm11dGV4X2VwaTY0KFgsIEMpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyaSlfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcigoX192OGRpKShfX201MTJpKShYKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKV9tbTUxMl91bmRlZmluZWRfZXBpMzIoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICsgKCgoQykgPj4gMCkgJiAweDMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgKyAoKChDKSA+PiAyKSAmIDB4MyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCArICgoKEMpID4+IDQpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICsgKCgoQykgPj4gNikgJiAweDMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgKyAoKChDKSA+PiAwKSAmIDB4MyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCArICgoKEMpID4+IDIpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ICsgKCgoQykgPj4gNCkgJiAweDMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgKyAoKChDKSA+PiA2KSAmIDB4MykpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX3Blcm11dGV4X2VwaTY0KFcsIFUsIFgsIEMpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9zZWxlY3RxXzUxMigoX19tbWFzazgpKFUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGkpX21tNTEyX3Blcm11dGV4X2VwaTY0KChYKSwgKEMpKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKShfX201MTJpKShXKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X3Blcm11dGV4X2VwaTY0KFUsIFgsIEMpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNTEyaSlfX2J1aWx0aW5faWEzMl9zZWxlY3RxXzUxMigoX19tbWFzazgpKFUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGkpX21tNTEyX3Blcm11dGV4X2VwaTY0KChYKSwgKEMpKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGRpKV9tbTUxMl9zZXR6ZXJvX3NpNTEyKCkpOyB9KQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX3Blcm11dGV4dmFyX3BkIChfX201MTJpIF9fWCwgX19tNTEyZCBfX1kpCit7CisgIHJldHVybiAoX19tNTEyZCkgX19idWlsdGluX2lhMzJfcGVybXZhcmRmNTEyX21hc2sgKChfX3Y4ZGYpIF9fWSwKKyAgICAgICAgICAgICAgICAgKF9fdjhkaSkgX19YLAorICAgICAgICAgICAgICAgICAoX192OGRmKSBfbW01MTJfdW5kZWZpbmVkX3BkICgpLAorICAgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX3Blcm11dGV4dmFyX3BkIChfX201MTJkIF9fVywgX19tbWFzazggX19VLCBfX201MTJpIF9fWCwgX19tNTEyZCBfX1kpCit7CisgIHJldHVybiAoX19tNTEyZCkgX19idWlsdGluX2lhMzJfcGVybXZhcmRmNTEyX21hc2sgKChfX3Y4ZGYpIF9fWSwKKyAgICAgICAgICAgICAgICAgKF9fdjhkaSkgX19YLAorICAgICAgICAgICAgICAgICAoX192OGRmKSBfX1csCisgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9wZXJtdXRleHZhcl9wZCAoX19tbWFzazggX19VLCBfX201MTJpIF9fWCwgX19tNTEyZCBfX1kpCit7CisgIHJldHVybiAoX19tNTEyZCkgX19idWlsdGluX2lhMzJfcGVybXZhcmRmNTEyX21hc2sgKChfX3Y4ZGYpIF9fWSwKKyAgICAgICAgICAgICAgICAgKF9fdjhkaSkgX19YLAorICAgICAgICAgICAgICAgICAoX192OGRmKSBfbW01MTJfc2V0emVyb19wZCAoKSwKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X3Blcm11dGV4dmFyX2VwaTY0IChfX21tYXNrOCBfX00sIF9fbTUxMmkgX19YLCBfX201MTJpIF9fWSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wZXJtdmFyZGk1MTJfbWFzayAoKF9fdjhkaSkgX19ZLAorICAgICAgICAgICAgICAgICAoX192OGRpKSBfX1gsCisgICAgICAgICAgICAgICAgIChfX3Y4ZGkpIF9tbTUxMl9zZXR6ZXJvX3NpNTEyICgpLAorICAgICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX3Blcm11dGV4dmFyX2VwaTY0IChfX201MTJpIF9fWCwgX19tNTEyaSBfX1kpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcGVybXZhcmRpNTEyX21hc2sgKChfX3Y4ZGkpIF9fWSwKKyAgICAgICAgICAgICAgICAgKF9fdjhkaSkgX19YLAorICAgICAgICAgICAgICAgICAoX192OGRpKSBfbW01MTJfdW5kZWZpbmVkX2VwaTMyICgpLAorICAgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX3Blcm11dGV4dmFyX2VwaTY0IChfX201MTJpIF9fVywgX19tbWFzazggX19NLCBfX201MTJpIF9fWCwKKyAgICAgICAgICAgICBfX201MTJpIF9fWSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wZXJtdmFyZGk1MTJfbWFzayAoKF9fdjhkaSkgX19ZLAorICAgICAgICAgICAgICAgICAoX192OGRpKSBfX1gsCisgICAgICAgICAgICAgICAgIChfX3Y4ZGkpIF9fVywKKyAgICAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX3Blcm11dGV4dmFyX3BzIChfX201MTJpIF9fWCwgX19tNTEyIF9fWSkKK3sKKyAgcmV0dXJuIChfX201MTIpIF9fYnVpbHRpbl9pYTMyX3Blcm12YXJzZjUxMl9tYXNrICgoX192MTZzZikgX19ZLAorICAgICAgICAgICAgICAgIChfX3YxNnNpKSBfX1gsCisgICAgICAgICAgICAgICAgKF9fdjE2c2YpIF9tbTUxMl91bmRlZmluZWRfcHMgKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19wZXJtdXRleHZhcl9wcyAoX19tNTEyIF9fVywgX19tbWFzazE2IF9fVSwgX19tNTEyaSBfX1gsIF9fbTUxMiBfX1kpCit7CisgIHJldHVybiAoX19tNTEyKSBfX2J1aWx0aW5faWEzMl9wZXJtdmFyc2Y1MTJfbWFzayAoKF9fdjE2c2YpIF9fWSwKKyAgICAgICAgICAgICAgICAoX192MTZzaSkgX19YLAorICAgICAgICAgICAgICAgIChfX3YxNnNmKSBfX1csCisgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X3Blcm11dGV4dmFyX3BzIChfX21tYXNrMTYgX19VLCBfX201MTJpIF9fWCwgX19tNTEyIF9fWSkKK3sKKyAgcmV0dXJuIChfX201MTIpIF9fYnVpbHRpbl9pYTMyX3Blcm12YXJzZjUxMl9tYXNrICgoX192MTZzZikgX19ZLAorICAgICAgICAgICAgICAgIChfX3YxNnNpKSBfX1gsCisgICAgICAgICAgICAgICAgKF9fdjE2c2YpIF9tbTUxMl9zZXR6ZXJvX3BzICgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfcGVybXV0ZXh2YXJfZXBpMzIgKF9fbW1hc2sxNiBfX00sIF9fbTUxMmkgX19YLCBfX201MTJpIF9fWSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wZXJtdmFyc2k1MTJfbWFzayAoKF9fdjE2c2kpIF9fWSwKKyAgICAgICAgICAgICAgICAgKF9fdjE2c2kpIF9fWCwKKyAgICAgICAgICAgICAgICAgKF9fdjE2c2kpIF9tbTUxMl9zZXR6ZXJvX3NpNTEyICgpLAorICAgICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX3Blcm11dGV4dmFyX2VwaTMyIChfX201MTJpIF9fWCwgX19tNTEyaSBfX1kpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcGVybXZhcnNpNTEyX21hc2sgKChfX3YxNnNpKSBfX1ksCisgICAgICAgICAgICAgICAgIChfX3YxNnNpKSBfX1gsCisgICAgICAgICAgICAgICAgIChfX3YxNnNpKSBfbW01MTJfdW5kZWZpbmVkX2VwaTMyICgpLAorICAgICAgICAgICAgICAgICAoX19tbWFzazE2KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19wZXJtdXRleHZhcl9lcGkzMiAoX19tNTEyaSBfX1csIF9fbW1hc2sxNiBfX00sIF9fbTUxMmkgX19YLAorICAgICAgICAgICAgIF9fbTUxMmkgX19ZKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3Blcm12YXJzaTUxMl9tYXNrICgoX192MTZzaSkgX19ZLAorICAgICAgICAgICAgICAgICAoX192MTZzaSkgX19YLAorICAgICAgICAgICAgICAgICAoX192MTZzaSkgX19XLAorICAgICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfa2FuZCAoX19tbWFzazE2IF9fQSwgX19tbWFzazE2IF9fQikKK3sKKyAgcmV0dXJuIChfX21tYXNrMTYpIF9fYnVpbHRpbl9pYTMyX2thbmRoaSAoKF9fbW1hc2sxNikgX19BLCAoX19tbWFzazE2KSBfX0IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfa2FuZG4gKF9fbW1hc2sxNiBfX0EsIF9fbW1hc2sxNiBfX0IpCit7CisgIHJldHVybiAoX19tbWFzazE2KSBfX2J1aWx0aW5faWEzMl9rYW5kbmhpICgoX19tbWFzazE2KSBfX0EsIChfX21tYXNrMTYpIF9fQik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2sxNiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9rb3IgKF9fbW1hc2sxNiBfX0EsIF9fbW1hc2sxNiBfX0IpCit7CisgIHJldHVybiAoX19tbWFzazE2KSBfX2J1aWx0aW5faWEzMl9rb3JoaSAoKF9fbW1hc2sxNikgX19BLCAoX19tbWFzazE2KSBfX0IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfa29ydGVzdGMgKF9fbW1hc2sxNiBfX0EsIF9fbW1hc2sxNiBfX0IpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9rb3J0ZXN0Y2hpICgoX19tbWFzazE2KSBfX0EsIChfX21tYXNrMTYpIF9fQik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9rb3J0ZXN0eiAoX19tbWFzazE2IF9fQSwgX19tbWFzazE2IF9fQikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2tvcnRlc3R6aGkgKChfX21tYXNrMTYpIF9fQSwgKF9fbW1hc2sxNikgX19CKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazE2IF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2t1bnBhY2tiIChfX21tYXNrMTYgX19BLCBfX21tYXNrMTYgX19CKQoreworICByZXR1cm4gKF9fbW1hc2sxNikgX19idWlsdGluX2lhMzJfa3VucGNraGkgKChfX21tYXNrMTYpIF9fQSwgKF9fbW1hc2sxNikgX19CKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazE2IF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2t4bm9yIChfX21tYXNrMTYgX19BLCBfX21tYXNrMTYgX19CKQoreworICByZXR1cm4gKF9fbW1hc2sxNikgX19idWlsdGluX2lhMzJfa3hub3JoaSAoKF9fbW1hc2sxNikgX19BLCAoX19tbWFzazE2KSBfX0IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfa3hvciAoX19tbWFzazE2IF9fQSwgX19tbWFzazE2IF9fQikKK3sKKyAgcmV0dXJuIChfX21tYXNrMTYpIF9fYnVpbHRpbl9pYTMyX2t4b3JoaSAoKF9fbW1hc2sxNikgX19BLCAoX19tbWFzazE2KSBfX0IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX3N0cmVhbV9zaTUxMiAoX19tNTEyaSAqIF9fUCwgX19tNTEyaSBfX0EpCit7CisgIF9fYnVpbHRpbl9ub250ZW1wb3JhbF9zdG9yZSgoX192OGRpKV9fQSwgKF9fdjhkaSopX19QKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9zdHJlYW1fbG9hZF9zaTUxMiAodm9pZCAqX19QKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfbW92bnRkcWE1MTIgKChfX3Y4ZGkgKilfX1ApOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX3N0cmVhbV9wZCAoZG91YmxlICpfX1AsIF9fbTUxMmQgX19BKQoreworICBfX2J1aWx0aW5fbm9udGVtcG9yYWxfc3RvcmUoKF9fdjhkZilfX0EsIChfX3Y4ZGYqKV9fUCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfc3RyZWFtX3BzIChmbG9hdCAqX19QLCBfX201MTIgX19BKQoreworICBfX2J1aWx0aW5fbm9udGVtcG9yYWxfc3RvcmUoKF9fdjE2c2YpX19BLCAoX192MTZzZiopX19QKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2NvbXByZXNzX3BkIChfX201MTJkIF9fVywgX19tbWFzazggX19VLCBfX201MTJkIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJkKSBfX2J1aWx0aW5faWEzMl9jb21wcmVzc2RmNTEyX21hc2sgKChfX3Y4ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpIF9fVywKKyAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9jb21wcmVzc19wZCAoX19tbWFzazggX19VLCBfX201MTJkIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJkKSBfX2J1aWx0aW5faWEzMl9jb21wcmVzc2RmNTEyX21hc2sgKChfX3Y4ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpCisgICAgICAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19wZCAoKSwKKyAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2NvbXByZXNzX2VwaTY0IChfX201MTJpIF9fVywgX19tbWFzazggX19VLCBfX201MTJpIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9jb21wcmVzc2RpNTEyX21hc2sgKChfX3Y4ZGkpIF9fQSwKKyAgICAgICAgICAgICAgICAgIChfX3Y4ZGkpIF9fVywKKyAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9jb21wcmVzc19lcGk2NCAoX19tbWFzazggX19VLCBfX201MTJpIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9jb21wcmVzc2RpNTEyX21hc2sgKChfX3Y4ZGkpIF9fQSwKKyAgICAgICAgICAgICAgICAgIChfX3Y4ZGkpCisgICAgICAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19zaTUxMiAoKSwKKyAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfY29tcHJlc3NfcHMgKF9fbTUxMiBfX1csIF9fbW1hc2sxNiBfX1UsIF9fbTUxMiBfX0EpCit7CisgIHJldHVybiAoX19tNTEyKSBfX2J1aWx0aW5faWEzMl9jb21wcmVzc3NmNTEyX21hc2sgKChfX3YxNnNmKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3YxNnNmKSBfX1csCisgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9jb21wcmVzc19wcyAoX19tbWFzazE2IF9fVSwgX19tNTEyIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTIpIF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc2Y1MTJfbWFzayAoKF9fdjE2c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjE2c2YpCisgICAgICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3BzICgpLAorICAgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfY29tcHJlc3NfZXBpMzIgKF9fbTUxMmkgX19XLCBfX21tYXNrMTYgX19VLCBfX201MTJpIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9jb21wcmVzc3NpNTEyX21hc2sgKChfX3YxNnNpKSBfX0EsCisgICAgICAgICAgICAgICAgICAoX192MTZzaSkgX19XLAorICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9jb21wcmVzc19lcGkzMiAoX19tbWFzazE2IF9fVSwgX19tNTEyaSBfX0EpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfY29tcHJlc3NzaTUxMl9tYXNrICgoX192MTZzaSkgX19BLAorICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpCisgICAgICAgICAgICAgICAgICBfbW01MTJfc2V0emVyb19zaTUxMiAoKSwKKyAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKKyNkZWZpbmUgX21tX2NtcF9yb3VuZF9zc19tYXNrKFgsIFksIFAsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tbWFzazgpX19idWlsdGluX2lhMzJfY21wc3NfbWFzaygoX192NHNmKShfX20xMjgpKFgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpKF9fbTEyOCkoWSksIChpbnQpKFApLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrX2NtcF9yb3VuZF9zc19tYXNrKE0sIFgsIFksIFAsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tbWFzazgpX19idWlsdGluX2lhMzJfY21wc3NfbWFzaygoX192NHNmKShfX20xMjgpKFgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpKF9fbTEyOCkoWSksIChpbnQpKFApLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoTSksIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW1fY21wX3NzX21hc2soWCwgWSwgUCkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl9jbXBzc19tYXNrKChfX3Y0c2YpKF9fbTEyOCkoWCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShZKSwgKGludCkoUCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7IH0pCisKKyNkZWZpbmUgX21tX21hc2tfY21wX3NzX21hc2soTSwgWCwgWSwgUCkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl9jbXBzc19tYXNrKChfX3Y0c2YpKF9fbTEyOCkoWCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShZKSwgKGludCkoUCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShNKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOyB9KQorCisjZGVmaW5lIF9tbV9jbXBfcm91bmRfc2RfbWFzayhYLCBZLCBQLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX2NtcHNkX21hc2soKF9fdjJkZikoX19tMTI4ZCkoWCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZikoX19tMTI4ZCkoWSksIChpbnQpKFApLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrX2NtcF9yb3VuZF9zZF9tYXNrKE0sIFgsIFksIFAsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tbWFzazgpX19idWlsdGluX2lhMzJfY21wc2RfbWFzaygoX192MmRmKShfX20xMjhkKShYKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShZKSwgKGludCkoUCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShNKSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbV9jbXBfc2RfbWFzayhYLCBZLCBQKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX2NtcHNkX21hc2soKF9fdjJkZikoX19tMTI4ZCkoWCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZikoX19tMTI4ZCkoWSksIChpbnQpKFApLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrX2NtcF9zZF9tYXNrKE0sIFgsIFksIFApIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tbWFzazgpX19idWlsdGluX2lhMzJfY21wc2RfbWFzaygoX192MmRmKShfX20xMjhkKShYKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShZKSwgKGludCkoUCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShNKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOyB9KQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbW92ZWhkdXBfcHMgKF9fbTUxMiBfX0EpCit7CisgIHJldHVybiAoX19tNTEyKV9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3YxNnNmKV9fQSwgKF9fdjE2c2YpX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDEsIDMsIDMsIDUsIDUsIDcsIDcsIDksIDksIDExLCAxMSwgMTMsIDEzLCAxNSwgMTUpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19tb3ZlaGR1cF9wcyAoX19tNTEyIF9fVywgX19tbWFzazE2IF9fVSwgX19tNTEyIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTIpX19idWlsdGluX2lhMzJfc2VsZWN0cHNfNTEyKChfX21tYXNrMTYpX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpX21tNTEyX21vdmVoZHVwX3BzKF9fQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZilfX1cpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfbW92ZWhkdXBfcHMgKF9fbW1hc2sxNiBfX1UsIF9fbTUxMiBfX0EpCit7CisgIHJldHVybiAoX19tNTEyKV9fYnVpbHRpbl9pYTMyX3NlbGVjdHBzXzUxMigoX19tbWFzazE2KV9fVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKV9tbTUxMl9tb3ZlaGR1cF9wcyhfX0EpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpX21tNTEyX3NldHplcm9fcHMoKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tb3ZlbGR1cF9wcyAoX19tNTEyIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTIpX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjE2c2YpX19BLCAoX192MTZzZilfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMiwgMiwgNCwgNCwgNiwgNiwgOCwgOCwgMTAsIDEwLCAxMiwgMTIsIDE0LCAxNCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX21vdmVsZHVwX3BzIChfX201MTIgX19XLCBfX21tYXNrMTYgX19VLCBfX201MTIgX19BKQoreworICByZXR1cm4gKF9fbTUxMilfX2J1aWx0aW5faWEzMl9zZWxlY3Rwc181MTIoKF9fbW1hc2sxNilfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZilfbW01MTJfbW92ZWxkdXBfcHMoX19BKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKV9fVyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9tb3ZlbGR1cF9wcyAoX19tbWFzazE2IF9fVSwgX19tNTEyIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTIpX19idWlsdGluX2lhMzJfc2VsZWN0cHNfNTEyKChfX21tYXNrMTYpX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2YpX21tNTEyX21vdmVsZHVwX3BzKF9fQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzZilfbW01MTJfc2V0emVyb19wcygpKTsKK30KKworI2RlZmluZSBfbW01MTJfc2h1ZmZsZV9lcGkzMihBLCBJKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmkpX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjE2c2kpKF9fbTUxMmkpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNpKV9tbTUxMl91bmRlZmluZWRfZXBpMzIoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICArICgoKEkpID4+IDApICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICArICgoKEkpID4+IDIpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICArICgoKEkpID4+IDQpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICArICgoKEkpID4+IDYpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ICArICgoKEkpID4+IDApICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ICArICgoKEkpID4+IDIpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ICArICgoKEkpID4+IDQpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ICArICgoKEkpID4+IDYpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ICArICgoKEkpID4+IDApICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ICArICgoKEkpID4+IDIpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ICArICgoKEkpID4+IDQpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ICArICgoKEkpID4+IDYpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiArICgoKEkpID4+IDApICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiArICgoKEkpID4+IDIpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiArICgoKEkpID4+IDQpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiArICgoKEkpID4+IDYpICYgMHgzKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2tfc2h1ZmZsZV9lcGkzMihXLCBVLCBBLCBJKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmkpX19idWlsdGluX2lhMzJfc2VsZWN0ZF81MTIoKF9fbW1hc2sxNikoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpX21tNTEyX3NodWZmbGVfZXBpMzIoKEEpLCAoSSkpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNpKShfX201MTJpKShXKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2t6X3NodWZmbGVfZXBpMzIoVSwgQSwgSSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJpKV9fYnVpbHRpbl9pYTMyX3NlbGVjdGRfNTEyKChfX21tYXNrMTYpKFUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNpKV9tbTUxMl9zaHVmZmxlX2VwaTMyKChBKSwgKEkpKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZzaSlfbW01MTJfc2V0emVyb19zaTUxMigpKTsgfSkKKworc3RhdGljIF9faW5saW5lX18gX19tNTEyZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2V4cGFuZF9wZCAoX19tNTEyZCBfX1csIF9fbW1hc2s4IF9fVSwgX19tNTEyZCBfX0EpCit7CisgIHJldHVybiAoX19tNTEyZCkgX19idWlsdGluX2lhMzJfZXhwYW5kZGY1MTJfbWFzayAoKF9fdjhkZikgX19BLAorICAgICAgICAgICAgICAgIChfX3Y4ZGYpIF9fVywKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfZXhwYW5kX3BkIChfX21tYXNrOCBfX1UsIF9fbTUxMmQgX19BKQoreworICByZXR1cm4gKF9fbTUxMmQpIF9fYnVpbHRpbl9pYTMyX2V4cGFuZGRmNTEyX21hc2sgKChfX3Y4ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192OGRmKSBfbW01MTJfc2V0emVyb19wZCAoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19leHBhbmRfZXBpNjQgKF9fbTUxMmkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTUxMmkgX19BKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX2V4cGFuZGRpNTEyX21hc2sgKChfX3Y4ZGkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192OGRpKSBfX1csCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X2V4cGFuZF9lcGk2NCAoIF9fbW1hc2s4IF9fVSwgX19tNTEyaSBfX0EpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfZXhwYW5kZGk1MTJfbWFzayAoKF9fdjhkaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3Y4ZGkpIF9tbTUxMl9zZXR6ZXJvX3BkICgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2V4cGFuZGxvYWR1X3BkKF9fbTUxMmQgX19XLCBfX21tYXNrOCBfX1UsIHZvaWQgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuIChfX201MTJkKSBfX2J1aWx0aW5faWEzMl9leHBhbmRsb2FkZGY1MTJfbWFzayAoKGNvbnN0IF9fdjhkZiAqKV9fUCwKKyAgICAgICAgICAgICAgKF9fdjhkZikgX19XLAorICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfZXhwYW5kbG9hZHVfcGQoX19tbWFzazggX19VLCB2b2lkIGNvbnN0ICpfX1ApCit7CisgIHJldHVybiAoX19tNTEyZCkgX19idWlsdGluX2lhMzJfZXhwYW5kbG9hZGRmNTEyX21hc2sgKChjb25zdCBfX3Y4ZGYgKilfX1AsCisgICAgICAgICAgICAgIChfX3Y4ZGYpIF9tbTUxMl9zZXR6ZXJvX3BkKCksCisgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2V4cGFuZGxvYWR1X2VwaTY0KF9fbTUxMmkgX19XLCBfX21tYXNrOCBfX1UsIHZvaWQgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9leHBhbmRsb2FkZGk1MTJfbWFzayAoKGNvbnN0IF9fdjhkaSAqKV9fUCwKKyAgICAgICAgICAgICAgKF9fdjhkaSkgX19XLAorICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfZXhwYW5kbG9hZHVfZXBpNjQoX19tbWFzazggX19VLCB2b2lkIGNvbnN0ICpfX1ApCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfZXhwYW5kbG9hZGRpNTEyX21hc2sgKChjb25zdCBfX3Y4ZGkgKilfX1AsCisgICAgICAgICAgICAgIChfX3Y4ZGkpIF9tbTUxMl9zZXR6ZXJvX3BkKCksCisgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfZXhwYW5kbG9hZHVfcHMoX19tNTEyIF9fVywgX19tbWFzazE2IF9fVSwgdm9pZCBjb25zdCAqX19QKQoreworICByZXR1cm4gKF9fbTUxMikgX19idWlsdGluX2lhMzJfZXhwYW5kbG9hZHNmNTEyX21hc2sgKChjb25zdCBfX3YxNnNmICopX19QLAorICAgICAgICAgICAgICAgICAgIChfX3YxNnNmKSBfX1csCisgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X2V4cGFuZGxvYWR1X3BzKF9fbW1hc2sxNiBfX1UsIHZvaWQgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuIChfX201MTIpIF9fYnVpbHRpbl9pYTMyX2V4cGFuZGxvYWRzZjUxMl9tYXNrICgoY29uc3QgX192MTZzZiAqKV9fUCwKKyAgICAgICAgICAgICAgICAgICAoX192MTZzZikgX21tNTEyX3NldHplcm9fcHMoKSwKKyAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfZXhwYW5kbG9hZHVfZXBpMzIoX19tNTEyaSBfX1csIF9fbW1hc2sxNiBfX1UsIHZvaWQgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9leHBhbmRsb2Fkc2k1MTJfbWFzayAoKGNvbnN0IF9fdjE2c2kgKilfX1AsCisgICAgICAgICAgICAgIChfX3YxNnNpKSBfX1csCisgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfZXhwYW5kbG9hZHVfZXBpMzIoX19tbWFzazE2IF9fVSwgdm9pZCBjb25zdCAqX19QKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX2V4cGFuZGxvYWRzaTUxMl9tYXNrICgoY29uc3QgX192MTZzaSAqKV9fUCwKKyAgICAgICAgICAgICAgKF9fdjE2c2kpIF9tbTUxMl9zZXR6ZXJvX3BzKCksCisgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2V4cGFuZF9wcyAoX19tNTEyIF9fVywgX19tbWFzazE2IF9fVSwgX19tNTEyIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTIpIF9fYnVpbHRpbl9pYTMyX2V4cGFuZHNmNTEyX21hc2sgKChfX3YxNnNmKSBfX0EsCisgICAgICAgICAgICAgICAoX192MTZzZikgX19XLAorICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X2V4cGFuZF9wcyAoX19tbWFzazE2IF9fVSwgX19tNTEyIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTIpIF9fYnVpbHRpbl9pYTMyX2V4cGFuZHNmNTEyX21hc2sgKChfX3YxNnNmKSBfX0EsCisgICAgICAgICAgICAgICAoX192MTZzZikgX21tNTEyX3NldHplcm9fcHMoKSwKKyAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19leHBhbmRfZXBpMzIgKF9fbTUxMmkgX19XLCBfX21tYXNrMTYgX19VLCBfX201MTJpIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9leHBhbmRzaTUxMl9tYXNrICgoX192MTZzaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3YxNnNpKSBfX1csCisgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9leHBhbmRfZXBpMzIgKF9fbW1hc2sxNiBfX1UsIF9fbTUxMmkgX19BKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX2V4cGFuZHNpNTEyX21hc2sgKChfX3YxNnNpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjE2c2kpIF9tbTUxMl9zZXR6ZXJvX3BzKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VKTsKK30KKworI2RlZmluZSBfbW01MTJfY3Z0X3JvdW5kcHNfcGQoQSwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJkKV9fYnVpbHRpbl9pYTMyX2N2dHBzMnBkNTEyX21hc2soKF9fdjhzZikoX19tMjU2KShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpX21tNTEyX3VuZGVmaW5lZF9wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2tfY3Z0X3JvdW5kcHNfcGQoVywgVSwgQSwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX201MTJkKV9fYnVpbHRpbl9pYTMyX2N2dHBzMnBkNTEyX21hc2soKF9fdjhzZikoX19tMjU2KShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4ZGYpKF9fbTUxMmQpKFcpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrel9jdnRfcm91bmRwc19wZChVLCBBLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTUxMmQpX19idWlsdGluX2lhMzJfY3Z0cHMycGQ1MTJfbWFzaygoX192OHNmKShfX20yNTYpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhkZilfbW01MTJfc2V0emVyb19wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSwgKGludCkoUikpOyB9KQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX2N2dHBzX3BkIChfX20yNTYgX19BKQoreworICByZXR1cm4gKF9fbTUxMmQpIF9fYnVpbHRpbl9pYTMyX2N2dHBzMnBkNTEyX21hc2sgKChfX3Y4c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192OGRmKQorICAgICAgICAgICAgICAgIF9tbTUxMl91bmRlZmluZWRfcGQgKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSwKKyAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfY3Z0cHNfcGQgKF9fbTUxMmQgX19XLCBfX21tYXNrOCBfX1UsIF9fbTI1NiBfX0EpCit7CisgIHJldHVybiAoX19tNTEyZCkgX19idWlsdGluX2lhMzJfY3Z0cHMycGQ1MTJfbWFzayAoKF9fdjhzZikgX19BLAorICAgICAgICAgICAgICAgIChfX3Y4ZGYpIF9fVywKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICAgICAgICBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X2N2dHBzX3BkIChfX21tYXNrOCBfX1UsIF9fbTI1NiBfX0EpCit7CisgIHJldHVybiAoX19tNTEyZCkgX19idWlsdGluX2lhMzJfY3Z0cHMycGQ1MTJfbWFzayAoKF9fdjhzZikgX19BLAorICAgICAgICAgICAgICAgIChfX3Y4ZGYpCisgICAgICAgICAgICAgICAgX21tNTEyX3NldHplcm9fcGQgKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX21vdl9wZCAoX19tNTEyZCBfX1csIF9fbW1hc2s4IF9fVSwgX19tNTEyZCBfX0EpCit7CisgIHJldHVybiAoX19tNTEyZCkgX19idWlsdGluX2lhMzJfc2VsZWN0cGRfNTEyICgoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICAgICAgKF9fdjhkZikgX19BLAorICAgICAgICAgICAgICAoX192OGRmKSBfX1cpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X21vdl9wZCAoX19tbWFzazggX19VLCBfX201MTJkIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJkKSBfX2J1aWx0aW5faWEzMl9zZWxlY3RwZF81MTIgKChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAoX192OGRmKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y4ZGYpIF9tbTUxMl9zZXR6ZXJvX3BkICgpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfbW92X3BzIChfX201MTIgX19XLCBfX21tYXNrMTYgX19VLCBfX201MTIgX19BKQoreworICByZXR1cm4gKF9fbTUxMikgX19idWlsdGluX2lhMzJfc2VsZWN0cHNfNTEyICgoX19tbWFzazE2KSBfX1UsCisgICAgICAgICAgICAgKF9fdjE2c2YpIF9fQSwKKyAgICAgICAgICAgICAoX192MTZzZikgX19XKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X21vdl9wcyAoX19tbWFzazE2IF9fVSwgX19tNTEyIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTIpIF9fYnVpbHRpbl9pYTMyX3NlbGVjdHBzXzUxMiAoKF9fbW1hc2sxNikgX19VLAorICAgICAgICAgICAgIChfX3YxNnNmKSBfX0EsCisgICAgICAgICAgICAgKF9fdjE2c2YpIF9tbTUxMl9zZXR6ZXJvX3BzICgpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2NvbXByZXNzc3RvcmV1X3BkICh2b2lkICpfX1AsIF9fbW1hc2s4IF9fVSwgX19tNTEyZCBfX0EpCit7CisgIF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc3RvcmVkZjUxMl9tYXNrICgoX192OGRmICopIF9fUCwgKF9fdjhkZikgX19BLAorICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfY29tcHJlc3NzdG9yZXVfZXBpNjQgKHZvaWQgKl9fUCwgX19tbWFzazggX19VLCBfX201MTJpIF9fQSkKK3sKKyAgX19idWlsdGluX2lhMzJfY29tcHJlc3NzdG9yZWRpNTEyX21hc2sgKChfX3Y4ZGkgKikgX19QLCAoX192OGRpKSBfX0EsCisgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19jb21wcmVzc3N0b3JldV9wcyAodm9pZCAqX19QLCBfX21tYXNrMTYgX19VLCBfX201MTIgX19BKQoreworICBfX2J1aWx0aW5faWEzMl9jb21wcmVzc3N0b3Jlc2Y1MTJfbWFzayAoKF9fdjE2c2YgKikgX19QLCAoX192MTZzZikgX19BLAorICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2NvbXByZXNzc3RvcmV1X2VwaTMyICh2b2lkICpfX1AsIF9fbW1hc2sxNiBfX1UsIF9fbTUxMmkgX19BKQoreworICBfX2J1aWx0aW5faWEzMl9jb21wcmVzc3N0b3Jlc2k1MTJfbWFzayAoKF9fdjE2c2kgKikgX19QLCAoX192MTZzaSkgX19BLAorICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VKTsKK30KKworI2RlZmluZSBfbW1fY3Z0X3JvdW5kc2Rfc3MoQSwgQiwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfY3Z0c2Qyc3Nfcm91bmRfbWFzaygoX192NHNmKShfX20xMjgpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZilfbW1fdW5kZWZpbmVkX3BzKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrX2N2dF9yb3VuZHNkX3NzKFcsIFUsIEEsIEIsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX2N2dHNkMnNzX3JvdW5kX21hc2soKF9fdjRzZikoX19tMTI4KShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZikoX19tMTI4ZCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpKF9fbTEyOCkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSksIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW1fbWFza3pfY3Z0X3JvdW5kc2Rfc3MoVSwgQSwgQiwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfY3Z0c2Qyc3Nfcm91bmRfbWFzaygoX192NHNmKShfX20xMjgpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZilfbW1fc2V0emVyb19wcygpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShSKSk7IH0pCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2N2dHNkX3NzIChfX20xMjggX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfY3Z0c2Qyc3Nfcm91bmRfbWFzayAoKF9fdjRzZikoX19BKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fQiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKShfX1cpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoX19VKSwgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2N2dHNkX3NzIChfX21tYXNrOCBfX1UsIF9fbTEyOCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfY3Z0c2Qyc3Nfcm91bmRfbWFzayAoKF9fdjRzZikoX19BKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fQiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKV9tbV9zZXR6ZXJvX3BzKCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShfX1UpLCBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOworfQorCisjZGVmaW5lIF9tbV9jdnRzc19pMzIgX21tX2N2dHNzX3NpMzIKKyNkZWZpbmUgX21tX2N2dHNzX2k2NCBfbW1fY3Z0c3Nfc2k2NAorI2RlZmluZSBfbW1fY3Z0c2RfaTMyIF9tbV9jdnRzZF9zaTMyCisjZGVmaW5lIF9tbV9jdnRzZF9pNjQgX21tX2N2dHNkX3NpNjQKKyNkZWZpbmUgX21tX2N2dGkzMl9zZCBfbW1fY3Z0c2kzMl9zZAorI2RlZmluZSBfbW1fY3Z0aTY0X3NkIF9tbV9jdnRzaTY0X3NkCisjZGVmaW5lIF9tbV9jdnRpMzJfc3MgX21tX2N2dHNpMzJfc3MKKyNkZWZpbmUgX21tX2N2dGk2NF9zcyBfbW1fY3Z0c2k2NF9zcworCisjZGVmaW5lIF9tbV9jdnRfcm91bmRpNjRfc2QoQSwgQiwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2N2dHNpMnNkNjQoKF9fdjJkZikoX19tMTI4ZCkoQSksIChsb25nIGxvbmcpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbV9jdnRfcm91bmRzaTY0X3NkKEEsIEIsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9jdnRzaTJzZDY0KChfX3YyZGYpKF9fbTEyOGQpKEEpLCAobG9uZyBsb25nKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKFIpKTsgfSkKKworI2RlZmluZSBfbW1fY3Z0X3JvdW5kc2kzMl9zcyhBLCBCLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOClfX2J1aWx0aW5faWEzMl9jdnRzaTJzczMyKChfX3Y0c2YpKF9fbTEyOCkoQSksIChpbnQpKEIpLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tX2N2dF9yb3VuZGkzMl9zcyhBLCBCLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOClfX2J1aWx0aW5faWEzMl9jdnRzaTJzczMyKChfX3Y0c2YpKF9fbTEyOCkoQSksIChpbnQpKEIpLCAoaW50KShSKSk7IH0pCisKKyNkZWZpbmUgX21tX2N2dF9yb3VuZHNpNjRfc3MoQSwgQiwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfY3Z0c2kyc3M2NCgoX192NHNmKShfX20xMjgpKEEpLCAobG9uZyBsb25nKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbV9jdnRfcm91bmRpNjRfc3MoQSwgQiwgUikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfY3Z0c2kyc3M2NCgoX192NHNmKShfX20xMjgpKEEpLCAobG9uZyBsb25nKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbV9jdnRfcm91bmRzc19zZChBLCBCLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGQpX19idWlsdGluX2lhMzJfY3Z0c3Myc2Rfcm91bmRfbWFzaygoX192MmRmKShfX20xMjhkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpKF9fbTEyOCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKV9tbV91bmRlZmluZWRfcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrX2N2dF9yb3VuZHNzX3NkKFcsIFUsIEEsIEIsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9jdnRzczJzZF9yb3VuZF9tYXNrKChfX3YyZGYpKF9fbTEyOGQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fbTEyOGQpKFcpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSwgKGludCkoUikpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrel9jdnRfcm91bmRzc19zZChVLCBBLCBCLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGQpX19idWlsdGluX2lhMzJfY3Z0c3Myc2Rfcm91bmRfbWFzaygoX192MmRmKShfX20xMjhkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpKF9fbTEyOCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKV9tbV9zZXR6ZXJvX3BkKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpLCAoaW50KShSKSk7IH0pCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jdnRzc19zZCAoX19tMTI4ZCBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4ZCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9jdnRzczJzZF9yb3VuZF9tYXNrKChfX3YyZGYpKF9fQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19CKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX1cpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoX19VKSwgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsgCit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfY3Z0c3Nfc2QgKF9fbW1hc2s4IF9fVSwgX19tMTI4ZCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9jdnRzczJzZF9yb3VuZF9tYXNrKChfX3YyZGYpKF9fQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19CKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKV9tbV9zZXR6ZXJvX3BkKCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoX19VKSwgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsgCit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY3Z0dTMyX3NkIChfX20xMjhkIF9fQSwgdW5zaWduZWQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX2N2dHVzaTJzZDMyICgoX192MmRmKSBfX0EsIF9fQik7Cit9CisKKyNkZWZpbmUgX21tX2N2dF9yb3VuZHU2NF9zZChBLCBCLCBSKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGQpX19idWlsdGluX2lhMzJfY3Z0dXNpMnNkNjQoKF9fdjJkZikoX19tMTI4ZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykoQiksIChpbnQpKFIpKTsgfSkKKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jdnR1NjRfc2QgKF9fbTEyOGQgX19BLCB1bnNpZ25lZCBsb25nIGxvbmcgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX2N2dHVzaTJzZDY0ICgoX192MmRmKSBfX0EsIF9fQiwKKyAgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworI2RlZmluZSBfbW1fY3Z0X3JvdW5kdTMyX3NzKEEsIEIsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX2N2dHVzaTJzczMyKChfX3Y0c2YpKF9fbTEyOCkoQSksICh1bnNpZ25lZCBpbnQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoUikpOyB9KQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY3Z0dTMyX3NzIChfX20xMjggX19BLCB1bnNpZ25lZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9jdnR1c2kyc3MzMiAoKF9fdjRzZikgX19BLCBfX0IsCisgICAgICAgICAgICAgICAgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsKK30KKworI2RlZmluZSBfbW1fY3Z0X3JvdW5kdTY0X3NzKEEsIEIsIFIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX2N2dHVzaTJzczY0KChfX3Y0c2YpKF9fbTEyOCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKShCKSwgKGludCkoUikpOyB9KQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY3Z0dTY0X3NzIChfX20xMjggX19BLCB1bnNpZ25lZCBsb25nIGxvbmcgX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY3Z0dXNpMnNzNjQgKChfX3Y0c2YpIF9fQSwgX19CLAorICAgICAgICAgICAgICAgIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19zZXQxX2VwaTMyIChfX201MTJpIF9fTywgX19tbWFzazE2IF9fTSwgaW50IF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wYnJvYWRjYXN0ZDUxMl9ncHJfbWFzayAoX19BLCAoX192MTZzaSkgX19PLAorICAgICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfc2V0MV9lcGk2NCAoX19tNTEyaSBfX08sIF9fbW1hc2s4IF9fTSwgbG9uZyBsb25nIF9fQSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wYnJvYWRjYXN0cTUxMl9ncHJfbWFzayAoX19BLCAoX192OGRpKSBfX08sCisgICAgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX3NldF9lcGkzMiAoaW50IF9fQSwgaW50IF9fQiwgaW50IF9fQywgaW50IF9fRCwKKyAgICAgaW50IF9fRSwgaW50IF9fRiwgaW50IF9fRywgaW50IF9fSCwKKyAgICAgaW50IF9fSSwgaW50IF9fSiwgaW50IF9fSywgaW50IF9fTCwKKyAgICAgaW50IF9fTSwgaW50IF9fTiwgaW50IF9fTywgaW50IF9fUCkKK3sKKyAgcmV0dXJuIF9fZXh0ZW5zaW9uX18gKF9fbTUxMmkpKF9fdjE2c2kpCisgIHsgX19QLCBfX08sIF9fTiwgX19NLCBfX0wsIF9fSywgX19KLCBfX0ksCisgICAgX19ILCBfX0csIF9fRiwgX19FLCBfX0QsIF9fQywgX19CLCBfX0EgfTsKK30KKworI2RlZmluZSBfbW01MTJfc2V0cl9lcGkzMihlMCxlMSxlMixlMyxlNCxlNSxlNixlNywgICAgICAgICAgIFwKKyAgICAgICBlOCxlOSxlMTAsZTExLGUxMixlMTMsZTE0LGUxNSkgICAgICAgICAgXAorICBfbW01MTJfc2V0X2VwaTMyKChlMTUpLChlMTQpLChlMTMpLChlMTIpLChlMTEpLChlMTApLChlOSksKGU4KSwoZTcpLChlNiksIFwKKyAgICAgICAgICAgICAgICAgICAoZTUpLChlNCksKGUzKSwoZTIpLChlMSksKGUwKSkKKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9zZXRfZXBpNjQgKGxvbmcgbG9uZyBfX0EsIGxvbmcgbG9uZyBfX0IsIGxvbmcgbG9uZyBfX0MsCisgICAgIGxvbmcgbG9uZyBfX0QsIGxvbmcgbG9uZyBfX0UsIGxvbmcgbG9uZyBfX0YsCisgICAgIGxvbmcgbG9uZyBfX0csIGxvbmcgbG9uZyBfX0gpCit7CisgIHJldHVybiBfX2V4dGVuc2lvbl9fIChfX201MTJpKSAoX192OGRpKQorICB7IF9fSCwgX19HLCBfX0YsIF9fRSwgX19ELCBfX0MsIF9fQiwgX19BIH07Cit9CisKKyNkZWZpbmUgX21tNTEyX3NldHJfZXBpNjQoZTAsZTEsZTIsZTMsZTQsZTUsZTYsZTcpICAgICAgICAgICBcCisgIF9tbTUxMl9zZXRfZXBpNjQoKGU3KSwoZTYpLChlNSksKGU0KSwoZTMpLChlMiksKGUxKSwoZTApKQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJkIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX3NldF9wZCAoZG91YmxlIF9fQSwgZG91YmxlIF9fQiwgZG91YmxlIF9fQywgZG91YmxlIF9fRCwKKyAgICAgICAgZG91YmxlIF9fRSwgZG91YmxlIF9fRiwgZG91YmxlIF9fRywgZG91YmxlIF9fSCkKK3sKKyAgcmV0dXJuIF9fZXh0ZW5zaW9uX18gKF9fbTUxMmQpCisgIHsgX19ILCBfX0csIF9fRiwgX19FLCBfX0QsIF9fQywgX19CLCBfX0EgfTsKK30KKworI2RlZmluZSBfbW01MTJfc2V0cl9wZChlMCxlMSxlMixlMyxlNCxlNSxlNixlNykgICAgICAgICAgICAgIFwKKyAgX21tNTEyX3NldF9wZCgoZTcpLChlNiksKGU1KSwoZTQpLChlMyksKGUyKSwoZTEpLChlMCkpCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9zZXRfcHMgKGZsb2F0IF9fQSwgZmxvYXQgX19CLCBmbG9hdCBfX0MsIGZsb2F0IF9fRCwKKyAgICAgICAgZmxvYXQgX19FLCBmbG9hdCBfX0YsIGZsb2F0IF9fRywgZmxvYXQgX19ILAorICAgICAgICBmbG9hdCBfX0ksIGZsb2F0IF9fSiwgZmxvYXQgX19LLCBmbG9hdCBfX0wsCisgICAgICAgIGZsb2F0IF9fTSwgZmxvYXQgX19OLCBmbG9hdCBfX08sIGZsb2F0IF9fUCkKK3sKKyAgcmV0dXJuIF9fZXh0ZW5zaW9uX18gKF9fbTUxMikKKyAgeyBfX1AsIF9fTywgX19OLCBfX00sIF9fTCwgX19LLCBfX0osIF9fSSwKKyAgICBfX0gsIF9fRywgX19GLCBfX0UsIF9fRCwgX19DLCBfX0IsIF9fQSB9OworfQorCisjZGVmaW5lIF9tbTUxMl9zZXRyX3BzKGUwLGUxLGUyLGUzLGU0LGU1LGU2LGU3LGU4LGU5LGUxMCxlMTEsZTEyLGUxMyxlMTQsZTE1KSBcCisgIF9tbTUxMl9zZXRfcHMoKGUxNSksKGUxNCksKGUxMyksKGUxMiksKGUxMSksKGUxMCksKGU5KSwoZTgpLChlNyksKGU2KSwoZTUpLCBcCisgICAgICAgICAgICAgICAgKGU0KSwoZTMpLChlMiksKGUxKSwoZTApKQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfYWJzX3BzKF9fbTUxMiBBKQoreworICByZXR1cm4gKF9fbTUxMilfbW01MTJfYW5kX2VwaTMyKF9tbTUxMl9zZXQxX2VwaTMyKDB4N0ZGRkZGRkYpLChfX201MTJpKUEpIDsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfYWJzX3BzKF9fbTUxMiBXLCBfX21tYXNrMTYgSywgX19tNTEyIEEpCit7CisgIHJldHVybiAoX19tNTEyKV9tbTUxMl9tYXNrX2FuZF9lcGkzMigoX19tNTEyaSlXLCBLLCBfbW01MTJfc2V0MV9lcGkzMigweDdGRkZGRkZGKSwoX19tNTEyaSlBKSA7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfYWJzX3BkKF9fbTUxMmQgQSkKK3sKKyAgcmV0dXJuIChfX201MTJkKV9tbTUxMl9hbmRfZXBpNjQoX21tNTEyX3NldDFfZXBpNjQoMHg3RkZGRkZGRkZGRkZGRkZGKSwoX192OGRpKUEpIDsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX2Fic19wZChfX201MTJkIFcsIF9fbW1hc2s4IEssIF9fbTUxMmQgQSkKK3sKKyAgcmV0dXJuIChfX201MTJkKV9tbTUxMl9tYXNrX2FuZF9lcGk2NCgoX192OGRpKVcsIEssIF9tbTUxMl9zZXQxX2VwaTY0KDB4N0ZGRkZGRkZGRkZGRkZGRiksKF9fdjhkaSlBKTsKK30KKworI3VuZGVmIF9fREVGQVVMVF9GTl9BVFRSUworCisjZW5kaWYgLy8gX19BVlg1MTJGSU5UUklOX0gKZGlmZiAtLWdpdCBhL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL2F2eDUxMmlmbWFpbnRyaW4uaCBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL2F2eDUxMmlmbWFpbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGVmYmFlCi0tLSAvZGV2L251bGwKKysrIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvYXZ4NTEyaWZtYWludHJpbi5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qPT09LS0tLS0tLS0tLS0tLSBhdng1MTJpZm1haW50cmluLmggLSBJRk1BIGludHJpbnNpY3MgLS0tLS0tLS0tLS0tLS0tLS0tPT09CisgKgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqCisgKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisgKi8KKyNpZm5kZWYgX19JTU1JTlRSSU5fSAorI2Vycm9yICJOZXZlciB1c2UgPGF2eDUxMmlmbWFpbnRyaW4uaD4gZGlyZWN0bHk7IGluY2x1ZGUgPGltbWludHJpbi5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9fSUZNQUlOVFJJTl9ICisjZGVmaW5lIF9fSUZNQUlOVFJJTl9ICisKKy8qIERlZmluZSB0aGUgZGVmYXVsdCBhdHRyaWJ1dGVzIGZvciB0aGUgZnVuY3Rpb25zIGluIHRoaXMgZmlsZS4gKi8KKyNkZWZpbmUgX19ERUZBVUxUX0ZOX0FUVFJTIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXywgX190YXJnZXRfXygiYXZ4NTEyaWZtYSIpKSkKKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYWRkNTJoaV9lcHU2NCAoX19tNTEyaSBfX1gsIF9fbTUxMmkgX19ZLCBfX201MTJpIF9fWikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl92cG1hZGQ1Mmh1cTUxMl9tYXNrICgoX192OGRpKSBfX1gsCisgICAgICAgICAgICAgICAgICAgKF9fdjhkaSkgX19ZLAorICAgICAgICAgICAgICAgICAgIChfX3Y4ZGkpIF9fWiwKKyAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrX21hZGQ1MmhpX2VwdTY0IChfX201MTJpIF9fVywgX19tbWFzazggX19NLCBfX201MTJpIF9fWCwKKyAgICAgICAgICBfX201MTJpIF9fWSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl92cG1hZGQ1Mmh1cTUxMl9tYXNrICgoX192OGRpKSBfX1csCisgICAgICAgICAgICAgICAgICAgKF9fdjhkaSkgX19YLAorICAgICAgICAgICAgICAgICAgIChfX3Y4ZGkpIF9fWSwKKyAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza3pfbWFkZDUyaGlfZXB1NjQgKF9fbW1hc2s4IF9fTSwgX19tNTEyaSBfX1gsIF9fbTUxMmkgX19ZLCBfX201MTJpIF9fWikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl92cG1hZGQ1Mmh1cTUxMl9tYXNreiAoKF9fdjhkaSkgX19YLAorICAgICAgICAgICAgICAoX192OGRpKSBfX1ksCisgICAgICAgICAgICAgIChfX3Y4ZGkpIF9fWiwKKyAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hZGQ1MmxvX2VwdTY0IChfX201MTJpIF9fWCwgX19tNTEyaSBfX1ksIF9fbTUxMmkgX19aKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3ZwbWFkZDUybHVxNTEyX21hc2sgKChfX3Y4ZGkpIF9fWCwKKyAgICAgICAgICAgICAgICAgICAoX192OGRpKSBfX1ksCisgICAgICAgICAgICAgICAgICAgKF9fdjhkaSkgX19aLAorICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2tfbWFkZDUybG9fZXB1NjQgKF9fbTUxMmkgX19XLCBfX21tYXNrOCBfX00sIF9fbTUxMmkgX19YLAorICAgICAgICAgIF9fbTUxMmkgX19ZKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3ZwbWFkZDUybHVxNTEyX21hc2sgKChfX3Y4ZGkpIF9fVywKKyAgICAgICAgICAgICAgICAgICAoX192OGRpKSBfX1gsCisgICAgICAgICAgICAgICAgICAgKF9fdjhkaSkgX19ZLAorICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9tYWRkNTJsb19lcHU2NCAoX19tbWFzazggX19NLCBfX201MTJpIF9fWCwgX19tNTEyaSBfX1ksIF9fbTUxMmkgX19aKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3ZwbWFkZDUybHVxNTEyX21hc2t6ICgoX192OGRpKSBfX1gsCisgICAgICAgICAgICAgIChfX3Y4ZGkpIF9fWSwKKyAgICAgICAgICAgICAgKF9fdjhkaSkgX19aLAorICAgICAgICAgICAgICAoX19tbWFzazgpIF9fTSk7Cit9CisKKyN1bmRlZiBfX0RFRkFVTFRfRk5fQVRUUlMKKworI2VuZGlmCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9hdng1MTJpZm1hdmxpbnRyaW4uaCBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL2F2eDUxMmlmbWF2bGludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMWVlNWMKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9hdng1MTJpZm1hdmxpbnRyaW4uaApAQCAtMCwwICsxLDE0OSBAQAorLyo9PT0tLS0tLS0tLS0tLS0tIGF2eDUxMmlmbWF2bGludHJpbi5oIC0gSUZNQSBpbnRyaW5zaWNzIC0tLS0tLS0tLS0tLS0tLS0tLT09PQorICoKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKgorICo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICovCisjaWZuZGVmIF9fSU1NSU5UUklOX0gKKyNlcnJvciAiTmV2ZXIgdXNlIDxhdng1MTJpZm1hdmxpbnRyaW4uaD4gZGlyZWN0bHk7IGluY2x1ZGUgPGltbWludHJpbi5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9fSUZNQVZMSU5UUklOX0gKKyNkZWZpbmUgX19JRk1BVkxJTlRSSU5fSAorCisvKiBEZWZpbmUgdGhlIGRlZmF1bHQgYXR0cmlidXRlcyBmb3IgdGhlIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUuICovCisjZGVmaW5lIF9fREVGQVVMVF9GTl9BVFRSUyBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18sIF9fdGFyZ2V0X18oImF2eDUxMmlmbWEsYXZ4NTEydmwiKSkpCisKKworCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hZGQ1MmhpX2VwdTY0IChfX20xMjhpIF9fWCwgX19tMTI4aSBfX1ksIF9fbTEyOGkgX19aKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwbWFkZDUyaHVxMTI4X21hc2sgKChfX3YyZGkpIF9fWCwKKyAgICAgICAgICAgICAgICAgICAoX192MmRpKSBfX1ksCisgICAgICAgICAgICAgICAgICAgKF9fdjJkaSkgX19aLAorICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfbWFkZDUyaGlfZXB1NjQgKF9fbTEyOGkgX19XLCBfX21tYXNrOCBfX00sIF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cG1hZGQ1Mmh1cTEyOF9tYXNrICgoX192MmRpKSBfX1csCisgICAgICAgICAgICAgICAgICAgKF9fdjJkaSkgX19YLAorICAgICAgICAgICAgICAgICAgIChfX3YyZGkpIF9fWSwKKyAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfbWFkZDUyaGlfZXB1NjQgKF9fbW1hc2s4IF9fTSwgX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZLCBfX20xMjhpIF9fWikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cG1hZGQ1Mmh1cTEyOF9tYXNreiAoKF9fdjJkaSkgX19YLAorICAgICAgICAgICAgICAoX192MmRpKSBfX1ksCisgICAgICAgICAgICAgIChfX3YyZGkpIF9fWiwKKyAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hZGQ1MmhpX2VwdTY0IChfX20yNTZpIF9fWCwgX19tMjU2aSBfX1ksIF9fbTI1NmkgX19aKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3ZwbWFkZDUyaHVxMjU2X21hc2sgKChfX3Y0ZGkpIF9fWCwKKyAgICAgICAgICAgICAgICAgICAoX192NGRpKSBfX1ksCisgICAgICAgICAgICAgICAgICAgKF9fdjRkaSkgX19aLAorICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfbWFkZDUyaGlfZXB1NjQgKF9fbTI1NmkgX19XLCBfX21tYXNrOCBfX00sIF9fbTI1NmkgX19YLAorICAgICAgICAgIF9fbTI1NmkgX19ZKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3ZwbWFkZDUyaHVxMjU2X21hc2sgKChfX3Y0ZGkpIF9fVywKKyAgICAgICAgICAgICAgICAgICAoX192NGRpKSBfX1gsCisgICAgICAgICAgICAgICAgICAgKF9fdjRkaSkgX19ZLAorICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9tYWRkNTJoaV9lcHU2NCAoX19tbWFzazggX19NLCBfX20yNTZpIF9fWCwgX19tMjU2aSBfX1ksIF9fbTI1NmkgX19aKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3ZwbWFkZDUyaHVxMjU2X21hc2t6ICgoX192NGRpKSBfX1gsCisgICAgICAgICAgICAgIChfX3Y0ZGkpIF9fWSwKKyAgICAgICAgICAgICAgKF9fdjRkaSkgX19aLAorICAgICAgICAgICAgICAoX19tbWFzazgpIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFkZDUybG9fZXB1NjQgKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSwgX19tMTI4aSBfX1opCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBtYWRkNTJsdXExMjhfbWFzayAoKF9fdjJkaSkgX19YLAorICAgICAgICAgICAgICAgICAgIChfX3YyZGkpIF9fWSwKKyAgICAgICAgICAgICAgICAgICAoX192MmRpKSBfX1osCisgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19tYWRkNTJsb19lcHU2NCAoX19tMTI4aSBfX1csIF9fbW1hc2s4IF9fTSwgX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwbWFkZDUybHVxMTI4X21hc2sgKChfX3YyZGkpIF9fVywKKyAgICAgICAgICAgICAgICAgICAoX192MmRpKSBfX1gsCisgICAgICAgICAgICAgICAgICAgKF9fdjJkaSkgX19ZLAorICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9tYWRkNTJsb19lcHU2NCAoX19tbWFzazggX19NLCBfX20xMjhpIF9fWCwgX19tMTI4aSBfX1ksIF9fbTEyOGkgX19aKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwbWFkZDUybHVxMTI4X21hc2t6ICgoX192MmRpKSBfX1gsCisgICAgICAgICAgICAgIChfX3YyZGkpIF9fWSwKKyAgICAgICAgICAgICAgKF9fdjJkaSkgX19aLAorICAgICAgICAgICAgICAoX19tbWFzazgpIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFkZDUybG9fZXB1NjQgKF9fbTI1NmkgX19YLCBfX20yNTZpIF9fWSwgX19tMjU2aSBfX1opCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfdnBtYWRkNTJsdXEyNTZfbWFzayAoKF9fdjRkaSkgX19YLAorICAgICAgICAgICAgICAgICAgIChfX3Y0ZGkpIF9fWSwKKyAgICAgICAgICAgICAgICAgICAoX192NGRpKSBfX1osCisgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19tYWRkNTJsb19lcHU2NCAoX19tMjU2aSBfX1csIF9fbW1hc2s4IF9fTSwgX19tMjU2aSBfX1gsCisgICAgICAgICAgX19tMjU2aSBfX1kpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfdnBtYWRkNTJsdXEyNTZfbWFzayAoKF9fdjRkaSkgX19XLAorICAgICAgICAgICAgICAgICAgIChfX3Y0ZGkpIF9fWCwKKyAgICAgICAgICAgICAgICAgICAoX192NGRpKSBfX1ksCisgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X21hZGQ1MmxvX2VwdTY0IChfX21tYXNrOCBfX00sIF9fbTI1NmkgX19YLCBfX20yNTZpIF9fWSwgX19tMjU2aSBfX1opCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfdnBtYWRkNTJsdXEyNTZfbWFza3ogKChfX3Y0ZGkpIF9fWCwKKyAgICAgICAgICAgICAgKF9fdjRkaSkgX19ZLAorICAgICAgICAgICAgICAoX192NGRpKSBfX1osCisgICAgICAgICAgICAgIChfX21tYXNrOCkgX19NKTsKK30KKworCisjdW5kZWYgX19ERUZBVUxUX0ZOX0FUVFJTCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvYXZ4NTEycGZpbnRyaW4uaCBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL2F2eDUxMnBmaW50cmluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdmYTNjZgotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL2F2eDUxMnBmaW50cmluLmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qPT09LS0tLS0tLS0tLS0tLSBhdng1MTJwZmludHJpbi5oIC0gUEYgaW50cmluc2ljcyAtLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICoKKyAqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqLworI2lmbmRlZiBfX0lNTUlOVFJJTl9ICisjZXJyb3IgIk5ldmVyIHVzZSA8YXZ4NTEycGZpbnRyaW4uaD4gZGlyZWN0bHk7IGluY2x1ZGUgPGltbWludHJpbi5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9fQVZYNTEyUEZJTlRSSU5fSAorI2RlZmluZSBfX0FWWDUxMlBGSU5UUklOX0gKKworLyogRGVmaW5lIHRoZSBkZWZhdWx0IGF0dHJpYnV0ZXMgZm9yIHRoZSBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlLiAqLworI2RlZmluZSBfX0RFRkFVTFRfRk5fQVRUUlMgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fLCBfX3RhcmdldF9fKCJhdng1MTJwZiIpKSkKKworI2RlZmluZSBfbW01MTJfbWFza19wcmVmZXRjaF9pMzJnYXRoZXJfcGQoaW5kZXgsIG1hc2ssIGFkZHIsIHNjYWxlLCBoaW50KSBfX2V4dGVuc2lvbl9fICh7XAorICBfX2J1aWx0aW5faWEzMl9nYXRoZXJwZmRwZCgoX19tbWFzazgpKG1hc2spLCAoX192OHNpKShfX20yNTZpKShpbmRleCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyBjb25zdCAqKShhZGRyKSwgKGludCkoc2NhbGUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGhpbnQpKTsgfSkKKyAgICAgICAgICAgICAgCisjZGVmaW5lIF9tbTUxMl9wcmVmZXRjaF9pMzJnYXRoZXJfcGQoaW5kZXgsIGFkZHIsIHNjYWxlLCBoaW50KSBfX2V4dGVuc2lvbl9fICh7XAorICBfX2J1aWx0aW5faWEzMl9nYXRoZXJwZmRwZCgoX19tbWFzazgpIC0xLCAoX192OHNpKShfX20yNTZpKShpbmRleCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyBjb25zdCAqKShhZGRyKSwgKGludCkoc2NhbGUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGhpbnQpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza19wcmVmZXRjaF9pMzJnYXRoZXJfcHMoaW5kZXgsIG1hc2ssIGFkZHIsIHNjYWxlLCBoaW50KSAoe1wKKyAgX19idWlsdGluX2lhMzJfZ2F0aGVycGZkcHMoKF9fbW1hc2sxNikobWFzayksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2c2kpKF9fbTUxMmkpKGluZGV4KSwgKGludCBjb25zdCAqKShhZGRyKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShzY2FsZSksIChpbnQpKGhpbnQpKTsgfSkKKworI2RlZmluZSBfbW01MTJfcHJlZmV0Y2hfaTMyZ2F0aGVyX3BzKGluZGV4LCBhZGRyLCBzY2FsZSwgaGludCkgKHtcCisgIF9fYnVpbHRpbl9pYTMyX2dhdGhlcnBmZHBzKChfX21tYXNrMTYpIC0xLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNpKShfX201MTJpKShpbmRleCksIChpbnQgY29uc3QgKikoYWRkciksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoc2NhbGUpLCAoaW50KShoaW50KSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2tfcHJlZmV0Y2hfaTY0Z2F0aGVyX3BkKGluZGV4LCBtYXNrLCBhZGRyLCBzY2FsZSwgaGludCkgX19leHRlbnNpb25fXyAoe1wKKyAgX19idWlsdGluX2lhMzJfZ2F0aGVycGZxcGQoKF9fbW1hc2s4KShtYXNrKSwgKF9fdjhkaSkoX19tNTEyaSkoaW5kZXgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcgY29uc3QgKikoYWRkciksIChpbnQpKHNjYWxlKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShoaW50KSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX3ByZWZldGNoX2k2NGdhdGhlcl9wZChpbmRleCwgYWRkciwgc2NhbGUsIGhpbnQpIF9fZXh0ZW5zaW9uX18gKHtcCisgIF9fYnVpbHRpbl9pYTMyX2dhdGhlcnBmcXBkKChfX21tYXNrOCkgLTEsIChfX3Y4ZGkpKF9fbTUxMmkpKGluZGV4KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nIGNvbnN0ICopKGFkZHIpLCAoaW50KShzY2FsZSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoaGludCkpOyB9KQorICAgICAgICAgICAgICAKKyNkZWZpbmUgX21tNTEyX21hc2tfcHJlZmV0Y2hfaTY0Z2F0aGVyX3BzKGluZGV4LCBtYXNrLCBhZGRyLCBzY2FsZSwgaGludCkgKHtcCisgIF9fYnVpbHRpbl9pYTMyX2dhdGhlcnBmcXBzKChfX21tYXNrOCkobWFzayksIChfX3Y4ZGkpKF9fbTUxMmkpKGluZGV4KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50IGNvbnN0ICopKGFkZHIpLCAoaW50KShzY2FsZSksIChpbnQpKGhpbnQpKTsgfSkKKworI2RlZmluZSBfbW01MTJfcHJlZmV0Y2hfaTY0Z2F0aGVyX3BzKGluZGV4LCBhZGRyLCBzY2FsZSwgaGludCkgKHtcCisgIF9fYnVpbHRpbl9pYTMyX2dhdGhlcnBmcXBzKChfX21tYXNrOCkgLTEsIChfX3Y4ZGkpKF9fbTUxMmkpKGluZGV4KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50IGNvbnN0ICopKGFkZHIpLCAoaW50KShzY2FsZSksIChpbnQpKGhpbnQpKTsgfSkKKworI2RlZmluZSBfbW01MTJfcHJlZmV0Y2hfaTMyc2NhdHRlcl9wZChhZGRyLCBpbmRleCwgc2NhbGUsIGhpbnQpIF9fZXh0ZW5zaW9uX18gKHtcCisgIF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJwZmRwZCgoX19tbWFzazgpLTEsIChfX3Y4c2kpKF9fbTI1NmkpKGluZGV4KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyAqKShhZGRyKSwgKGludCkoc2NhbGUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShoaW50KSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX21hc2tfcHJlZmV0Y2hfaTMyc2NhdHRlcl9wZChhZGRyLCBtYXNrLCBpbmRleCwgc2NhbGUsIGhpbnQpIF9fZXh0ZW5zaW9uX18gKHtcCisgIF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJwZmRwZCgoX19tbWFzazgpKG1hc2spLCAoX192OHNpKShfX20yNTZpKShpbmRleCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcgKikoYWRkciksIChpbnQpKHNjYWxlKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoaGludCkpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9wcmVmZXRjaF9pMzJzY2F0dGVyX3BzKGFkZHIsIGluZGV4LCBzY2FsZSwgaGludCkgX19leHRlbnNpb25fXyAoe1wKKyAgX19idWlsdGluX2lhMzJfc2NhdHRlcnBmZHBzKChfX21tYXNrMTYpLTEsIChfX3YxNnNpKShfX201MTJpKShpbmRleCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQgKikoYWRkciksIChpbnQpKHNjYWxlKSwgKGludCkoaGludCkpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX3ByZWZldGNoX2kzMnNjYXR0ZXJfcHMoYWRkciwgbWFzaywgaW5kZXgsIHNjYWxlLCBoaW50KSBfX2V4dGVuc2lvbl9fICh7XAorICBfX2J1aWx0aW5faWEzMl9zY2F0dGVycGZkcHMoKF9fbW1hc2sxNikobWFzayksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnNpKShfX201MTJpKShpbmRleCksIChpbnQgKikoYWRkciksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKHNjYWxlKSwgKGludCkoaGludCkpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9wcmVmZXRjaF9pNjRzY2F0dGVyX3BkKGFkZHIsIGluZGV4LCBzY2FsZSwgaGludCkgX19leHRlbnNpb25fXyAoe1wKKyAgX19idWlsdGluX2lhMzJfc2NhdHRlcnBmcXBkKChfX21tYXNrOCktMSwgKF9fdjhkaSkoX19tNTEyaSkoaW5kZXgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nICopKGFkZHIpLCAoaW50KShzY2FsZSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGhpbnQpKTsgfSkKKworI2RlZmluZSBfbW01MTJfbWFza19wcmVmZXRjaF9pNjRzY2F0dGVyX3BkKGFkZHIsIG1hc2ssIGluZGV4LCBzY2FsZSwgaGludCkgX19leHRlbnNpb25fXyAoe1wKKyAgX19idWlsdGluX2lhMzJfc2NhdHRlcnBmcXBkKChfX21tYXNrOCkobWFzayksIChfX3Y4ZGkpKF9fbTUxMmkpKGluZGV4KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyAqKShhZGRyKSwgKGludCkoc2NhbGUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShoaW50KSk7IH0pCisKKyNkZWZpbmUgX21tNTEyX3ByZWZldGNoX2k2NHNjYXR0ZXJfcHMoYWRkciwgaW5kZXgsIHNjYWxlLCBoaW50KSBfX2V4dGVuc2lvbl9fICh7XAorICBfX2J1aWx0aW5faWEzMl9zY2F0dGVycGZxcHMoKF9fbW1hc2s4KS0xLCAoX192OGRpKShfX201MTJpKShpbmRleCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQgKikoYWRkciksIChpbnQpKHNjYWxlKSwgKGludCkoaGludCkpOyB9KQorCisjZGVmaW5lIF9tbTUxMl9tYXNrX3ByZWZldGNoX2k2NHNjYXR0ZXJfcHMoYWRkciwgbWFzaywgaW5kZXgsIHNjYWxlLCBoaW50KSBfX2V4dGVuc2lvbl9fICh7XAorICBfX2J1aWx0aW5faWEzMl9zY2F0dGVycGZxcHMoKF9fbW1hc2s4KShtYXNrKSwgKF9fdjhkaSkoX19tNTEyaSkoaW5kZXgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50ICopKGFkZHIpLCAoaW50KShzY2FsZSksIChpbnQpKGhpbnQpKTsgfSkKKworI3VuZGVmIF9fREVGQVVMVF9GTl9BVFRSUworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL2F2eDUxMnZibWlpbnRyaW4uaCBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL2F2eDUxMnZibWlpbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzcyMzhlCi0tLSAvZGV2L251bGwKKysrIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvYXZ4NTEydmJtaWludHJpbi5oCkBAIC0wLDAgKzEsMTM3IEBACisvKj09PS0tLS0tLS0tLS0tLS0gYXZ4NTEydmJtaWludHJpbi5oIC0gVkJNSSBpbnRyaW5zaWNzIC0tLS0tLS0tLS0tLS0tLS0tLT09PQorICoKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKgorICo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICovCisjaWZuZGVmIF9fSU1NSU5UUklOX0gKKyNlcnJvciAiTmV2ZXIgdXNlIDxhdng1MTJ2Ym1paW50cmluLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxpbW1pbnRyaW4uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmbmRlZiBfX1ZCTUlJTlRSSU5fSAorI2RlZmluZSBfX1ZCTUlJTlRSSU5fSAorCisvKiBEZWZpbmUgdGhlIGRlZmF1bHQgYXR0cmlidXRlcyBmb3IgdGhlIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUuICovCisjZGVmaW5lIF9fREVGQVVMVF9GTl9BVFRSUyBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18sIF9fdGFyZ2V0X18oImF2eDUxMnZibWkiKSkpCisKKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrMl9wZXJtdXRleDJ2YXJfZXBpOCAoX19tNTEyaSBfX0EsIF9fbTUxMmkgX19JLAorICAgICAgICAgX19tbWFzazY0IF9fVSwgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfdnBlcm1pMnZhcnFpNTEyX21hc2sgKChfX3Y2NHFpKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y2NHFpKSBfX0kKKyAgICAgICAgICAgICAgLyogaWR4ICovICwKKyAgICAgICAgICAgICAgKF9fdjY0cWkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fbW1hc2s2NCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9wZXJtdXRleDJ2YXJfZXBpOCAoX19tNTEyaSBfX0EsIF9fbTUxMmkgX19JLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl92cGVybXQydmFycWk1MTJfbWFzayAoKF9fdjY0cWkpIF9fSQorICAgICAgICAgICAgICAvKiBpZHggKi8gLAorICAgICAgICAgICAgICAoX192NjRxaSkgX19BLAorICAgICAgICAgICAgICAoX192NjRxaSkgX19CLAorICAgICAgICAgICAgICAoX19tbWFzazY0KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19wZXJtdXRleDJ2YXJfZXBpOCAoX19tNTEyaSBfX0EsIF9fbW1hc2s2NCBfX1UsCisgICAgICAgIF9fbTUxMmkgX19JLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl92cGVybXQydmFycWk1MTJfbWFzayAoKF9fdjY0cWkpIF9fSQorICAgICAgICAgICAgICAvKiBpZHggKi8gLAorICAgICAgICAgICAgICAoX192NjRxaSkgX19BLAorICAgICAgICAgICAgICAoX192NjRxaSkgX19CLAorICAgICAgICAgICAgICAoX19tbWFzazY0KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X3Blcm11dGV4MnZhcl9lcGk4IChfX21tYXNrNjQgX19VLCBfX201MTJpIF9fQSwKKyAgICAgICAgIF9fbTUxMmkgX19JLCBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl92cGVybXQydmFycWk1MTJfbWFza3ogKChfX3Y2NHFpKSBfX0kKKyAgICAgICAgICAgICAgIC8qIGlkeCAqLyAsCisgICAgICAgICAgICAgICAoX192NjRxaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjY0cWkpIF9fQiwKKyAgICAgICAgICAgICAgIChfX21tYXNrNjQpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfcGVybXV0ZXh2YXJfZXBpOCAoX19tNTEyaSBfX0EsIF9fbTUxMmkgX19CKQoreworICByZXR1cm4gKF9fbTUxMmkpIF9fYnVpbHRpbl9pYTMyX3Blcm12YXJxaTUxMl9tYXNrICgoX192NjRxaSkgX19CLAorICAgICAgICAgICAgICAgICAoX192NjRxaSkgX19BLAorICAgICAgICAgICAgICAgICAoX192NjRxaSkgX21tNTEyX3VuZGVmaW5lZF9lcGkzMiAoKSwKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2s2NCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX201MTJpIF9fREVGQVVMVF9GTl9BVFRSUworX21tNTEyX21hc2t6X3Blcm11dGV4dmFyX2VwaTggKF9fbW1hc2s2NCBfX00sIF9fbTUxMmkgX19BLAorICAgICAgICBfX201MTJpIF9fQikKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl9wZXJtdmFycWk1MTJfbWFzayAoKF9fdjY0cWkpIF9fQiwKKyAgICAgICAgICAgICAgICAgKF9fdjY0cWkpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjY0cWkpIF9tbTUxMl9zZXR6ZXJvX3NpNTEyKCksCisgICAgICAgICAgICAgICAgIChfX21tYXNrNjQpIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19wZXJtdXRleHZhcl9lcGk4IChfX201MTJpIF9fVywgX19tbWFzazY0IF9fTSwgX19tNTEyaSBfX0EsCisgICAgICAgICAgICAgX19tNTEyaSBfX0IpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfcGVybXZhcnFpNTEyX21hc2sgKChfX3Y2NHFpKSBfX0IsCisgICAgICAgICAgICAgICAgIChfX3Y2NHFpKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3Y2NHFpKSBfX1csCisgICAgICAgICAgICAgICAgIChfX21tYXNrNjQpIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbWFza19tdWx0aXNoaWZ0X2VwaTY0X2VwaTggKF9fbTUxMmkgX19XLCBfX21tYXNrNjQgX19NLCBfX201MTJpIF9fWCwgX19tNTEyaSBfX1kpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfdnBtdWx0aXNoaWZ0cWI1MTJfbWFzayAoKF9fdjY0cWkpIF9fWCwKKyAgICAgICAgICAgICAgICAoX192NjRxaSkgX19ZLAorICAgICAgICAgICAgICAgIChfX3Y2NHFpKSBfX1csCisgICAgICAgICAgICAgICAgKF9fbW1hc2s2NCkgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNTEyaSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTUxMl9tYXNrel9tdWx0aXNoaWZ0X2VwaTY0X2VwaTggKF9fbW1hc2s2NCBfX00sIF9fbTUxMmkgX19YLCBfX201MTJpIF9fWSkKK3sKKyAgcmV0dXJuIChfX201MTJpKSBfX2J1aWx0aW5faWEzMl92cG11bHRpc2hpZnRxYjUxMl9tYXNrICgoX192NjRxaSkgX19YLAorICAgICAgICAgICAgICAgIChfX3Y2NHFpKSBfX1ksCisgICAgICAgICAgICAgICAgKF9fdjY0cWkpIF9tbTUxMl9zZXR6ZXJvX3NpNTEyICgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrNjQpIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTUxMmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW01MTJfbXVsdGlzaGlmdF9lcGk2NF9lcGk4IChfX201MTJpIF9fWCwgX19tNTEyaSBfX1kpCit7CisgIHJldHVybiAoX19tNTEyaSkgX19idWlsdGluX2lhMzJfdnBtdWx0aXNoaWZ0cWI1MTJfbWFzayAoKF9fdjY0cWkpIF9fWCwKKyAgICAgICAgICAgICAgICAoX192NjRxaSkgX19ZLAorICAgICAgICAgICAgICAgIChfX3Y2NHFpKSBfbW01MTJfdW5kZWZpbmVkX2VwaTMyICgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrNjQpIC0xKTsKK30KKworCisjdW5kZWYgX19ERUZBVUxUX0ZOX0FUVFJTCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvYXZ4NTEydmJtaXZsaW50cmluLmggYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9hdng1MTJ2Ym1pdmxpbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDVjNmQxCi0tLSAvZGV2L251bGwKKysrIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvYXZ4NTEydmJtaXZsaW50cmluLmgKQEAgLTAsMCArMSwyNDcgQEAKKy8qPT09LS0tLS0tLS0tLS0tLSBhdng1MTJ2Ym1pdmxpbnRyaW4uaCAtIFZCTUkgaW50cmluc2ljcyAtLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICoKKyAqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqLworI2lmbmRlZiBfX0lNTUlOVFJJTl9ICisjZXJyb3IgIk5ldmVyIHVzZSA8YXZ4NTEydmJtaXZsaW50cmluLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxpbW1pbnRyaW4uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmbmRlZiBfX1ZCTUlWTElOVFJJTl9ICisjZGVmaW5lIF9fVkJNSVZMSU5UUklOX0gKKworLyogRGVmaW5lIHRoZSBkZWZhdWx0IGF0dHJpYnV0ZXMgZm9yIHRoZSBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlLiAqLworI2RlZmluZSBfX0RFRkFVTFRfRk5fQVRUUlMgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fLCBfX3RhcmdldF9fKCJhdng1MTJ2Ym1pLGF2eDUxMnZsIikpKQorCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFzazJfcGVybXV0ZXgydmFyX2VwaTggKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fSSwgX19tbWFzazE2IF9fVSwKKyAgICAgICAgICAgIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaTJ2YXJxaTEyOF9tYXNrICgoX192MTZxaSkgX19BLAorICAgICAgICAgICAgICAoX192MTZxaSkgX19JCisgICAgICAgICAgICAgIC8qIGlkeCAqLyAsCisgICAgICAgICAgICAgIChfX3YxNnFpKSBfX0IsCisgICAgICAgICAgICAgIChfX21tYXNrMTYpCisgICAgICAgICAgICAgIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFzazJfcGVybXV0ZXgydmFyX2VwaTggKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fSSwKKyAgICAgICAgIF9fbW1hc2szMiBfX1UsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaTJ2YXJxaTI1Nl9tYXNrICgoX192MzJxaSkgX19BLAorICAgICAgICAgICAgICAoX192MzJxaSkgX19JCisgICAgICAgICAgICAgIC8qIGlkeCAqLyAsCisgICAgICAgICAgICAgIChfX3YzMnFpKSBfX0IsCisgICAgICAgICAgICAgIChfX21tYXNrMzIpCisgICAgICAgICAgICAgIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fcGVybXV0ZXgydmFyX2VwaTggKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fSSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnFpMTI4X21hc2sgKChfX3YxNnFpKSBfX0kKKyAgICAgICAgICAgICAgLyogaWR4ICovICwKKyAgICAgICAgICAgICAgKF9fdjE2cWkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjE2cWkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fbW1hc2sxNikgLQorICAgICAgICAgICAgICAxKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX3Blcm11dGV4MnZhcl9lcGk4IChfX20xMjhpIF9fQSwgX19tbWFzazE2IF9fVSwgX19tMTI4aSBfX0ksCisgICAgICAgICAgIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJxaTEyOF9tYXNrICgoX192MTZxaSkgX19JCisgICAgICAgICAgICAgIC8qIGlkeCAqLyAsCisgICAgICAgICAgICAgIChfX3YxNnFpKSBfX0EsCisgICAgICAgICAgICAgIChfX3YxNnFpKSBfX0IsCisgICAgICAgICAgICAgIChfX21tYXNrMTYpCisgICAgICAgICAgICAgIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfcGVybXV0ZXgydmFyX2VwaTggKF9fbW1hc2sxNiBfX1UsIF9fbTEyOGkgX19BLCBfX20xMjhpIF9fSSwKKyAgICAgICAgICAgIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJxaTEyOF9tYXNreiAoKF9fdjE2cWkpIF9fSQorICAgICAgICAgICAgICAgLyogaWR4ICovICwKKyAgICAgICAgICAgICAgIChfX3YxNnFpKSBfX0EsCisgICAgICAgICAgICAgICAoX192MTZxaSkgX19CLAorICAgICAgICAgICAgICAgKF9fbW1hc2sxNikKKyAgICAgICAgICAgICAgIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfcGVybXV0ZXgydmFyX2VwaTggKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fSSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnFpMjU2X21hc2sgKChfX3YzMnFpKSBfX0kKKyAgICAgICAgICAgICAgLyogaWR4ICovICwKKyAgICAgICAgICAgICAgKF9fdjMycWkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjMycWkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fbW1hc2szMikgLQorICAgICAgICAgICAgICAxKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX3Blcm11dGV4MnZhcl9lcGk4IChfX20yNTZpIF9fQSwgX19tbWFzazMyIF9fVSwKKyAgICAgICAgX19tMjU2aSBfX0ksIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJxaTI1Nl9tYXNrICgoX192MzJxaSkgX19JCisgICAgICAgICAgICAgIC8qIGlkeCAqLyAsCisgICAgICAgICAgICAgIChfX3YzMnFpKSBfX0EsCisgICAgICAgICAgICAgIChfX3YzMnFpKSBfX0IsCisgICAgICAgICAgICAgIChfX21tYXNrMzIpCisgICAgICAgICAgICAgIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfcGVybXV0ZXgydmFyX2VwaTggKF9fbW1hc2szMiBfX1UsIF9fbTI1NmkgX19BLAorICAgICAgICAgX19tMjU2aSBfX0ksIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJxaTI1Nl9tYXNreiAoKF9fdjMycWkpIF9fSQorICAgICAgICAgICAgICAgLyogaWR4ICovICwKKyAgICAgICAgICAgICAgIChfX3YzMnFpKSBfX0EsCisgICAgICAgICAgICAgICAoX192MzJxaSkgX19CLAorICAgICAgICAgICAgICAgKF9fbW1hc2szMikKKyAgICAgICAgICAgICAgIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fcGVybXV0ZXh2YXJfZXBpOCAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Blcm12YXJxaTEyOF9tYXNrICgoX192MTZxaSkgX19CLAorICAgICAgICAgICAgICAgICAoX192MTZxaSkgX19BLAorICAgICAgICAgICAgICAgICAoX192MTZxaSkgX21tX3VuZGVmaW5lZF9zaTEyOCAoKSwKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X3Blcm11dGV4dmFyX2VwaTggKF9fbW1hc2sxNiBfX00sIF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wZXJtdmFycWkxMjhfbWFzayAoKF9fdjE2cWkpIF9fQiwKKyAgICAgICAgICAgICAgICAgKF9fdjE2cWkpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjE2cWkpIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfcGVybXV0ZXh2YXJfZXBpOCAoX19tMTI4aSBfX1csIF9fbW1hc2sxNiBfX00sIF9fbTEyOGkgX19BLAorICAgICAgICAgIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Blcm12YXJxaTEyOF9tYXNrICgoX192MTZxaSkgX19CLAorICAgICAgICAgICAgICAgICAoX192MTZxaSkgX19BLAorICAgICAgICAgICAgICAgICAoX192MTZxaSkgX19XLAorICAgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3Blcm11dGV4dmFyX2VwaTggKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wZXJtdmFycWkyNTZfbWFzayAoKF9fdjMycWkpIF9fQiwKKyAgICAgICAgICAgICAgICAgKF9fdjMycWkpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjMycWkpIF9tbTI1Nl91bmRlZmluZWRfc2kyNTYgKCksCisgICAgICAgICAgICAgICAgIChfX21tYXNrMzIpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9wZXJtdXRleHZhcl9lcGk4IChfX21tYXNrMzIgX19NLCBfX20yNTZpIF9fQSwKKyAgICAgICAgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcGVybXZhcnFpMjU2X21hc2sgKChfX3YzMnFpKSBfX0IsCisgICAgICAgICAgICAgICAgIChfX3YzMnFpKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3YzMnFpKSBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2szMikgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX3Blcm11dGV4dmFyX2VwaTggKF9fbTI1NmkgX19XLCBfX21tYXNrMzIgX19NLCBfX20yNTZpIF9fQSwKKyAgICAgICAgICAgICBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wZXJtdmFycWkyNTZfbWFzayAoKF9fdjMycWkpIF9fQiwKKyAgICAgICAgICAgICAgICAgKF9fdjMycWkpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjMycWkpIF9fVywKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2szMikgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX211bHRpc2hpZnRfZXBpNjRfZXBpOCAoX19tMTI4aSBfX1csIF9fbW1hc2sxNiBfX00sIF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cG11bHRpc2hpZnRxYjEyOF9tYXNrICgoX192MTZxaSkgX19YLAorICAgICAgICAgICAgICAgIChfX3YxNnFpKSBfX1ksCisgICAgICAgICAgICAgICAgKF9fdjE2cWkpIF9fVywKKyAgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X211bHRpc2hpZnRfZXBpNjRfZXBpOCAoX19tbWFzazE2IF9fTSwgX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwbXVsdGlzaGlmdHFiMTI4X21hc2sgKChfX3YxNnFpKSBfX1gsCisgICAgICAgICAgICAgICAgKF9fdjE2cWkpIF9fWSwKKyAgICAgICAgICAgICAgICAoX192MTZxaSkKKyAgICAgICAgICAgICAgICBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX211bHRpc2hpZnRfZXBpNjRfZXBpOCAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwbXVsdGlzaGlmdHFiMTI4X21hc2sgKChfX3YxNnFpKSBfX1gsCisgICAgICAgICAgICAgICAgKF9fdjE2cWkpIF9fWSwKKyAgICAgICAgICAgICAgICAoX192MTZxaSkKKyAgICAgICAgICAgICAgICBfbW1fdW5kZWZpbmVkX3NpMTI4ICgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrMTYpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX211bHRpc2hpZnRfZXBpNjRfZXBpOCAoX19tMjU2aSBfX1csIF9fbW1hc2szMiBfX00sIF9fbTI1NmkgX19YLCBfX20yNTZpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl92cG11bHRpc2hpZnRxYjI1Nl9tYXNrICgoX192MzJxaSkgX19YLAorICAgICAgICAgICAgICAgIChfX3YzMnFpKSBfX1ksCisgICAgICAgICAgICAgICAgKF9fdjMycWkpIF9fVywKKyAgICAgICAgICAgICAgICAoX19tbWFzazMyKSBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X211bHRpc2hpZnRfZXBpNjRfZXBpOCAoX19tbWFzazMyIF9fTSwgX19tMjU2aSBfX1gsIF9fbTI1NmkgX19ZKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3ZwbXVsdGlzaGlmdHFiMjU2X21hc2sgKChfX3YzMnFpKSBfX1gsCisgICAgICAgICAgICAgICAgKF9fdjMycWkpIF9fWSwKKyAgICAgICAgICAgICAgICAoX192MzJxaSkKKyAgICAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazMyKSBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X211bHRpc2hpZnRfZXBpNjRfZXBpOCAoX19tMjU2aSBfX1gsIF9fbTI1NmkgX19ZKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3ZwbXVsdGlzaGlmdHFiMjU2X21hc2sgKChfX3YzMnFpKSBfX1gsCisgICAgICAgICAgICAgICAgKF9fdjMycWkpIF9fWSwKKyAgICAgICAgICAgICAgICAoX192MzJxaSkKKyAgICAgICAgICAgICAgICBfbW0yNTZfdW5kZWZpbmVkX3NpMjU2ICgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrMzIpIC0xKTsKK30KKworCisjdW5kZWYgX19ERUZBVUxUX0ZOX0FUVFJTCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvYXZ4NTEydmxid2ludHJpbi5oIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvYXZ4NTEydmxid2ludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MGU5OTIKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9hdng1MTJ2bGJ3aW50cmluLmgKQEAgLTAsMCArMSwzNDA2IEBACisvKj09PS0tLS0gYXZ4NTEydmxid2ludHJpbi5oIC0gQVZYNTEyVkwgYW5kIEFWWDUxMkJXIGludHJpbnNpY3MgLS0tLS0tLS0tLS0tPT09CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICoKKyAqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqLworCisjaWZuZGVmIF9fSU1NSU5UUklOX0gKKyNlcnJvciAiTmV2ZXIgdXNlIDxhdng1MTJ2bGJ3aW50cmluLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxpbW1pbnRyaW4uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmbmRlZiBfX0FWWDUxMlZMQldJTlRSSU5fSAorI2RlZmluZSBfX0FWWDUxMlZMQldJTlRSSU5fSAorCisvKiBEZWZpbmUgdGhlIGRlZmF1bHQgYXR0cmlidXRlcyBmb3IgdGhlIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUuICovCisjZGVmaW5lIF9fREVGQVVMVF9GTl9BVFRSUyBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18sIF9fdGFyZ2V0X18oImF2eDUxMnZsLGF2eDUxMmJ3IikpKQorCitzdGF0aWMgIF9faW5saW5lIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc2V0emVyb19oaSh2b2lkKXsKKyAgICByZXR1cm4gKF9fbTEyOGkpKF9fdjhoaSl7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsKK30KKworLyogSW50ZWdlciBjb21wYXJlICovCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2sxNiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbXBlcV9lcGk4X21hc2soX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazE2KV9fYnVpbHRpbl9pYTMyX3BjbXBlcWIxMjhfbWFzaygoX192MTZxaSlfX2EsIChfX3YxNnFpKV9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jbXBlcV9lcGk4X21hc2soX19tbWFzazE2IF9fdSwgX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazE2KV9fYnVpbHRpbl9pYTMyX3BjbXBlcWIxMjhfbWFzaygoX192MTZxaSlfX2EsIChfX3YxNnFpKV9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2sxNiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbXBlcV9lcHU4X21hc2soX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazE2KV9fYnVpbHRpbl9pYTMyX3VjbXBiMTI4X21hc2soKF9fdjE2cWkpX19hLCAoX192MTZxaSlfX2IsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNiktMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2sxNiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2NtcGVxX2VwdThfbWFzayhfX21tYXNrMTYgX191LCBfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrMTYpX19idWlsdGluX2lhMzJfdWNtcGIxMjhfbWFzaygoX192MTZxaSlfX2EsIChfX3YxNnFpKV9fYiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMzIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY21wZXFfZXBpOF9tYXNrKF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2szMilfX2J1aWx0aW5faWEzMl9wY21wZXFiMjU2X21hc2soKF9fdjMycWkpX19hLCAoX192MzJxaSlfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazMyKS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazMyIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfY21wZXFfZXBpOF9tYXNrKF9fbW1hc2szMiBfX3UsIF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2szMilfX2J1aWx0aW5faWEzMl9wY21wZXFiMjU2X21hc2soKF9fdjMycWkpX19hLCAoX192MzJxaSlfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMzIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY21wZXFfZXB1OF9tYXNrKF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2szMilfX2J1aWx0aW5faWEzMl91Y21wYjI1Nl9tYXNrKChfX3YzMnFpKV9fYSwgKF9fdjMycWkpX19iLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMzIpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMzIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jbXBlcV9lcHU4X21hc2soX19tbWFzazMyIF9fdSwgX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazMyKV9fYnVpbHRpbl9pYTMyX3VjbXBiMjU2X21hc2soKF9fdjMycWkpX19hLCAoX192MzJxaSlfX2IsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY21wZXFfZXBpMTZfbWFzayhfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl9wY21wZXF3MTI4X21hc2soKF9fdjhoaSlfX2EsIChfX3Y4aGkpX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2NtcGVxX2VwaTE2X21hc2soX19tbWFzazggX191LCBfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl9wY21wZXF3MTI4X21hc2soKF9fdjhoaSlfX2EsIChfX3Y4aGkpX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbXBlcV9lcHUxNl9tYXNrKF9fbTEyOGkgX19hLCBfX20xMjhpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX3VjbXB3MTI4X21hc2soKF9fdjhoaSlfX2EsIChfX3Y4aGkpX19iLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jbXBlcV9lcHUxNl9tYXNrKF9fbW1hc2s4IF9fdSwgX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfdWNtcHcxMjhfbWFzaygoX192OGhpKV9fYSwgKF9fdjhoaSlfX2IsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY21wZXFfZXBpMTZfbWFzayhfX20yNTZpIF9fYSwgX19tMjU2aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrMTYpX19idWlsdGluX2lhMzJfcGNtcGVxdzI1Nl9tYXNrKChfX3YxNmhpKV9fYSwgKF9fdjE2aGkpX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNiktMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2sxNiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2NtcGVxX2VwaTE2X21hc2soX19tbWFzazE2IF9fdSwgX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazE2KV9fYnVpbHRpbl9pYTMyX3BjbXBlcXcyNTZfbWFzaygoX192MTZoaSlfX2EsIChfX3YxNmhpKV9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2sxNiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9jbXBlcV9lcHUxNl9tYXNrKF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2sxNilfX2J1aWx0aW5faWEzMl91Y21wdzI1Nl9tYXNrKChfX3YxNmhpKV9fYSwgKF9fdjE2aGkpX19iLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jbXBlcV9lcHUxNl9tYXNrKF9fbW1hc2sxNiBfX3UsIF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2sxNilfX2J1aWx0aW5faWEzMl91Y21wdzI1Nl9tYXNrKChfX3YxNmhpKV9fYSwgKF9fdjE2aGkpX19iLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2sxNiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbXBnZV9lcGk4X21hc2soX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazE2KV9fYnVpbHRpbl9pYTMyX2NtcGIxMjhfbWFzaygoX192MTZxaSlfX2EsIChfX3YxNnFpKV9fYiwgNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jbXBnZV9lcGk4X21hc2soX19tbWFzazE2IF9fdSwgX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazE2KV9fYnVpbHRpbl9pYTMyX2NtcGIxMjhfbWFzaygoX192MTZxaSlfX2EsIChfX3YxNnFpKV9fYiwgNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2sxNiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbXBnZV9lcHU4X21hc2soX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazE2KV9fYnVpbHRpbl9pYTMyX3VjbXBiMTI4X21hc2soKF9fdjE2cWkpX19hLCAoX192MTZxaSlfX2IsIDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNiktMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2sxNiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2NtcGdlX2VwdThfbWFzayhfX21tYXNrMTYgX191LCBfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrMTYpX19idWlsdGluX2lhMzJfdWNtcGIxMjhfbWFzaygoX192MTZxaSlfX2EsIChfX3YxNnFpKV9fYiwgNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMzIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY21wZ2VfZXBpOF9tYXNrKF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2szMilfX2J1aWx0aW5faWEzMl9jbXBiMjU2X21hc2soKF9fdjMycWkpX19hLCAoX192MzJxaSlfX2IsIDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazMyKS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazMyIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfY21wZ2VfZXBpOF9tYXNrKF9fbW1hc2szMiBfX3UsIF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2szMilfX2J1aWx0aW5faWEzMl9jbXBiMjU2X21hc2soKF9fdjMycWkpX19hLCAoX192MzJxaSlfX2IsIDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMzIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY21wZ2VfZXB1OF9tYXNrKF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2szMilfX2J1aWx0aW5faWEzMl91Y21wYjI1Nl9tYXNrKChfX3YzMnFpKV9fYSwgKF9fdjMycWkpX19iLCA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMzIpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMzIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jbXBnZV9lcHU4X21hc2soX19tbWFzazMyIF9fdSwgX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazMyKV9fYnVpbHRpbl9pYTMyX3VjbXBiMjU2X21hc2soKF9fdjMycWkpX19hLCAoX192MzJxaSlfX2IsIDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY21wZ2VfZXBpMTZfbWFzayhfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl9jbXB3MTI4X21hc2soKF9fdjhoaSlfX2EsIChfX3Y4aGkpX19iLCA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2NtcGdlX2VwaTE2X21hc2soX19tbWFzazggX191LCBfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl9jbXB3MTI4X21hc2soKF9fdjhoaSlfX2EsIChfX3Y4aGkpX19iLCA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbXBnZV9lcHUxNl9tYXNrKF9fbTEyOGkgX19hLCBfX20xMjhpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX3VjbXB3MTI4X21hc2soKF9fdjhoaSlfX2EsIChfX3Y4aGkpX19iLCA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jbXBnZV9lcHUxNl9tYXNrKF9fbW1hc2s4IF9fdSwgX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfdWNtcHcxMjhfbWFzaygoX192OGhpKV9fYSwgKF9fdjhoaSlfX2IsIDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY21wZ2VfZXBpMTZfbWFzayhfX20yNTZpIF9fYSwgX19tMjU2aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrMTYpX19idWlsdGluX2lhMzJfY21wdzI1Nl9tYXNrKChfX3YxNmhpKV9fYSwgKF9fdjE2aGkpX19iLCA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNiktMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2sxNiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2NtcGdlX2VwaTE2X21hc2soX19tbWFzazE2IF9fdSwgX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazE2KV9fYnVpbHRpbl9pYTMyX2NtcHcyNTZfbWFzaygoX192MTZoaSlfX2EsIChfX3YxNmhpKV9fYiwgNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2sxNiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9jbXBnZV9lcHUxNl9tYXNrKF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2sxNilfX2J1aWx0aW5faWEzMl91Y21wdzI1Nl9tYXNrKChfX3YxNmhpKV9fYSwgKF9fdjE2aGkpX19iLCA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jbXBnZV9lcHUxNl9tYXNrKF9fbW1hc2sxNiBfX3UsIF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2sxNilfX2J1aWx0aW5faWEzMl91Y21wdzI1Nl9tYXNrKChfX3YxNmhpKV9fYSwgKF9fdjE2aGkpX19iLCA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2sxNiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbXBndF9lcGk4X21hc2soX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazE2KV9fYnVpbHRpbl9pYTMyX3BjbXBndGIxMjhfbWFzaygoX192MTZxaSlfX2EsIChfX3YxNnFpKV9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jbXBndF9lcGk4X21hc2soX19tbWFzazE2IF9fdSwgX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazE2KV9fYnVpbHRpbl9pYTMyX3BjbXBndGIxMjhfbWFzaygoX192MTZxaSlfX2EsIChfX3YxNnFpKV9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2sxNiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbXBndF9lcHU4X21hc2soX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazE2KV9fYnVpbHRpbl9pYTMyX3VjbXBiMTI4X21hc2soKF9fdjE2cWkpX19hLCAoX192MTZxaSlfX2IsIDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNiktMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2sxNiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2NtcGd0X2VwdThfbWFzayhfX21tYXNrMTYgX191LCBfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrMTYpX19idWlsdGluX2lhMzJfdWNtcGIxMjhfbWFzaygoX192MTZxaSlfX2EsIChfX3YxNnFpKV9fYiwgNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMzIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY21wZ3RfZXBpOF9tYXNrKF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2szMilfX2J1aWx0aW5faWEzMl9wY21wZ3RiMjU2X21hc2soKF9fdjMycWkpX19hLCAoX192MzJxaSlfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazMyKS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazMyIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfY21wZ3RfZXBpOF9tYXNrKF9fbW1hc2szMiBfX3UsIF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2szMilfX2J1aWx0aW5faWEzMl9wY21wZ3RiMjU2X21hc2soKF9fdjMycWkpX19hLCAoX192MzJxaSlfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMzIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY21wZ3RfZXB1OF9tYXNrKF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2szMilfX2J1aWx0aW5faWEzMl91Y21wYjI1Nl9tYXNrKChfX3YzMnFpKV9fYSwgKF9fdjMycWkpX19iLCA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMzIpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMzIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jbXBndF9lcHU4X21hc2soX19tbWFzazMyIF9fdSwgX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazMyKV9fYnVpbHRpbl9pYTMyX3VjbXBiMjU2X21hc2soKF9fdjMycWkpX19hLCAoX192MzJxaSlfX2IsIDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY21wZ3RfZXBpMTZfbWFzayhfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl9wY21wZ3R3MTI4X21hc2soKF9fdjhoaSlfX2EsIChfX3Y4aGkpX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2NtcGd0X2VwaTE2X21hc2soX19tbWFzazggX191LCBfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl9wY21wZ3R3MTI4X21hc2soKF9fdjhoaSlfX2EsIChfX3Y4aGkpX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbXBndF9lcHUxNl9tYXNrKF9fbTEyOGkgX19hLCBfX20xMjhpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX3VjbXB3MTI4X21hc2soKF9fdjhoaSlfX2EsIChfX3Y4aGkpX19iLCA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jbXBndF9lcHUxNl9tYXNrKF9fbW1hc2s4IF9fdSwgX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfdWNtcHcxMjhfbWFzaygoX192OGhpKV9fYSwgKF9fdjhoaSlfX2IsIDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY21wZ3RfZXBpMTZfbWFzayhfX20yNTZpIF9fYSwgX19tMjU2aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrMTYpX19idWlsdGluX2lhMzJfcGNtcGd0dzI1Nl9tYXNrKChfX3YxNmhpKV9fYSwgKF9fdjE2aGkpX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNiktMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2sxNiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2NtcGd0X2VwaTE2X21hc2soX19tbWFzazE2IF9fdSwgX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazE2KV9fYnVpbHRpbl9pYTMyX3BjbXBndHcyNTZfbWFzaygoX192MTZoaSlfX2EsIChfX3YxNmhpKV9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2sxNiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9jbXBndF9lcHUxNl9tYXNrKF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2sxNilfX2J1aWx0aW5faWEzMl91Y21wdzI1Nl9tYXNrKChfX3YxNmhpKV9fYSwgKF9fdjE2aGkpX19iLCA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jbXBndF9lcHUxNl9tYXNrKF9fbW1hc2sxNiBfX3UsIF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2sxNilfX2J1aWx0aW5faWEzMl91Y21wdzI1Nl9tYXNrKChfX3YxNmhpKV9fYSwgKF9fdjE2aGkpX19iLCA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2sxNiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbXBsZV9lcGk4X21hc2soX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazE2KV9fYnVpbHRpbl9pYTMyX2NtcGIxMjhfbWFzaygoX192MTZxaSlfX2EsIChfX3YxNnFpKV9fYiwgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jbXBsZV9lcGk4X21hc2soX19tbWFzazE2IF9fdSwgX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazE2KV9fYnVpbHRpbl9pYTMyX2NtcGIxMjhfbWFzaygoX192MTZxaSlfX2EsIChfX3YxNnFpKV9fYiwgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2sxNiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbXBsZV9lcHU4X21hc2soX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazE2KV9fYnVpbHRpbl9pYTMyX3VjbXBiMTI4X21hc2soKF9fdjE2cWkpX19hLCAoX192MTZxaSlfX2IsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNiktMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2sxNiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2NtcGxlX2VwdThfbWFzayhfX21tYXNrMTYgX191LCBfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrMTYpX19idWlsdGluX2lhMzJfdWNtcGIxMjhfbWFzaygoX192MTZxaSlfX2EsIChfX3YxNnFpKV9fYiwgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMzIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY21wbGVfZXBpOF9tYXNrKF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2szMilfX2J1aWx0aW5faWEzMl9jbXBiMjU2X21hc2soKF9fdjMycWkpX19hLCAoX192MzJxaSlfX2IsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazMyKS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazMyIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfY21wbGVfZXBpOF9tYXNrKF9fbW1hc2szMiBfX3UsIF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2szMilfX2J1aWx0aW5faWEzMl9jbXBiMjU2X21hc2soKF9fdjMycWkpX19hLCAoX192MzJxaSlfX2IsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMzIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY21wbGVfZXB1OF9tYXNrKF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2szMilfX2J1aWx0aW5faWEzMl91Y21wYjI1Nl9tYXNrKChfX3YzMnFpKV9fYSwgKF9fdjMycWkpX19iLCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMzIpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMzIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jbXBsZV9lcHU4X21hc2soX19tbWFzazMyIF9fdSwgX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazMyKV9fYnVpbHRpbl9pYTMyX3VjbXBiMjU2X21hc2soKF9fdjMycWkpX19hLCAoX192MzJxaSlfX2IsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY21wbGVfZXBpMTZfbWFzayhfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl9jbXB3MTI4X21hc2soKF9fdjhoaSlfX2EsIChfX3Y4aGkpX19iLCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2NtcGxlX2VwaTE2X21hc2soX19tbWFzazggX191LCBfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl9jbXB3MTI4X21hc2soKF9fdjhoaSlfX2EsIChfX3Y4aGkpX19iLCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbXBsZV9lcHUxNl9tYXNrKF9fbTEyOGkgX19hLCBfX20xMjhpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX3VjbXB3MTI4X21hc2soKF9fdjhoaSlfX2EsIChfX3Y4aGkpX19iLCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jbXBsZV9lcHUxNl9tYXNrKF9fbW1hc2s4IF9fdSwgX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfdWNtcHcxMjhfbWFzaygoX192OGhpKV9fYSwgKF9fdjhoaSlfX2IsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY21wbGVfZXBpMTZfbWFzayhfX20yNTZpIF9fYSwgX19tMjU2aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrMTYpX19idWlsdGluX2lhMzJfY21wdzI1Nl9tYXNrKChfX3YxNmhpKV9fYSwgKF9fdjE2aGkpX19iLCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNiktMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2sxNiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2NtcGxlX2VwaTE2X21hc2soX19tbWFzazE2IF9fdSwgX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazE2KV9fYnVpbHRpbl9pYTMyX2NtcHcyNTZfbWFzaygoX192MTZoaSlfX2EsIChfX3YxNmhpKV9fYiwgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2sxNiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9jbXBsZV9lcHUxNl9tYXNrKF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2sxNilfX2J1aWx0aW5faWEzMl91Y21wdzI1Nl9tYXNrKChfX3YxNmhpKV9fYSwgKF9fdjE2aGkpX19iLCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jbXBsZV9lcHUxNl9tYXNrKF9fbW1hc2sxNiBfX3UsIF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2sxNilfX2J1aWx0aW5faWEzMl91Y21wdzI1Nl9tYXNrKChfX3YxNmhpKV9fYSwgKF9fdjE2aGkpX19iLCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2sxNiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbXBsdF9lcGk4X21hc2soX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazE2KV9fYnVpbHRpbl9pYTMyX2NtcGIxMjhfbWFzaygoX192MTZxaSlfX2EsIChfX3YxNnFpKV9fYiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jbXBsdF9lcGk4X21hc2soX19tbWFzazE2IF9fdSwgX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazE2KV9fYnVpbHRpbl9pYTMyX2NtcGIxMjhfbWFzaygoX192MTZxaSlfX2EsIChfX3YxNnFpKV9fYiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2sxNiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbXBsdF9lcHU4X21hc2soX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazE2KV9fYnVpbHRpbl9pYTMyX3VjbXBiMTI4X21hc2soKF9fdjE2cWkpX19hLCAoX192MTZxaSlfX2IsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNiktMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2sxNiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2NtcGx0X2VwdThfbWFzayhfX21tYXNrMTYgX191LCBfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrMTYpX19idWlsdGluX2lhMzJfdWNtcGIxMjhfbWFzaygoX192MTZxaSlfX2EsIChfX3YxNnFpKV9fYiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMzIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY21wbHRfZXBpOF9tYXNrKF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2szMilfX2J1aWx0aW5faWEzMl9jbXBiMjU2X21hc2soKF9fdjMycWkpX19hLCAoX192MzJxaSlfX2IsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazMyKS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazMyIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfY21wbHRfZXBpOF9tYXNrKF9fbW1hc2szMiBfX3UsIF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2szMilfX2J1aWx0aW5faWEzMl9jbXBiMjU2X21hc2soKF9fdjMycWkpX19hLCAoX192MzJxaSlfX2IsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMzIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY21wbHRfZXB1OF9tYXNrKF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2szMilfX2J1aWx0aW5faWEzMl91Y21wYjI1Nl9tYXNrKChfX3YzMnFpKV9fYSwgKF9fdjMycWkpX19iLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMzIpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMzIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jbXBsdF9lcHU4X21hc2soX19tbWFzazMyIF9fdSwgX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazMyKV9fYnVpbHRpbl9pYTMyX3VjbXBiMjU2X21hc2soKF9fdjMycWkpX19hLCAoX192MzJxaSlfX2IsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY21wbHRfZXBpMTZfbWFzayhfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl9jbXB3MTI4X21hc2soKF9fdjhoaSlfX2EsIChfX3Y4aGkpX19iLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2NtcGx0X2VwaTE2X21hc2soX19tbWFzazggX191LCBfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl9jbXB3MTI4X21hc2soKF9fdjhoaSlfX2EsIChfX3Y4aGkpX19iLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbXBsdF9lcHUxNl9tYXNrKF9fbTEyOGkgX19hLCBfX20xMjhpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX3VjbXB3MTI4X21hc2soKF9fdjhoaSlfX2EsIChfX3Y4aGkpX19iLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jbXBsdF9lcHUxNl9tYXNrKF9fbW1hc2s4IF9fdSwgX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfdWNtcHcxMjhfbWFzaygoX192OGhpKV9fYSwgKF9fdjhoaSlfX2IsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY21wbHRfZXBpMTZfbWFzayhfX20yNTZpIF9fYSwgX19tMjU2aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrMTYpX19idWlsdGluX2lhMzJfY21wdzI1Nl9tYXNrKChfX3YxNmhpKV9fYSwgKF9fdjE2aGkpX19iLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNiktMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2sxNiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2NtcGx0X2VwaTE2X21hc2soX19tbWFzazE2IF9fdSwgX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazE2KV9fYnVpbHRpbl9pYTMyX2NtcHcyNTZfbWFzaygoX192MTZoaSlfX2EsIChfX3YxNmhpKV9fYiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2sxNiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9jbXBsdF9lcHUxNl9tYXNrKF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2sxNilfX2J1aWx0aW5faWEzMl91Y21wdzI1Nl9tYXNrKChfX3YxNmhpKV9fYSwgKF9fdjE2aGkpX19iLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jbXBsdF9lcHUxNl9tYXNrKF9fbW1hc2sxNiBfX3UsIF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2sxNilfX2J1aWx0aW5faWEzMl91Y21wdzI1Nl9tYXNrKChfX3YxNmhpKV9fYSwgKF9fdjE2aGkpX19iLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2sxNiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbXBuZXFfZXBpOF9tYXNrKF9fbTEyOGkgX19hLCBfX20xMjhpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2sxNilfX2J1aWx0aW5faWEzMl9jbXBiMTI4X21hc2soKF9fdjE2cWkpX19hLCAoX192MTZxaSlfX2IsIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazE2IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfY21wbmVxX2VwaThfbWFzayhfX21tYXNrMTYgX191LCBfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrMTYpX19idWlsdGluX2lhMzJfY21wYjEyOF9tYXNrKChfX3YxNnFpKV9fYSwgKF9fdjE2cWkpX19iLCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazE2IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NtcG5lcV9lcHU4X21hc2soX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazE2KV9fYnVpbHRpbl9pYTMyX3VjbXBiMTI4X21hc2soKF9fdjE2cWkpX19hLCAoX192MTZxaSlfX2IsIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNiktMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2sxNiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2NtcG5lcV9lcHU4X21hc2soX19tbWFzazE2IF9fdSwgX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazE2KV9fYnVpbHRpbl9pYTMyX3VjbXBiMTI4X21hc2soKF9fdjE2cWkpX19hLCAoX192MTZxaSlfX2IsIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazMyIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2NtcG5lcV9lcGk4X21hc2soX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazMyKV9fYnVpbHRpbl9pYTMyX2NtcGIyNTZfbWFzaygoX192MzJxaSlfX2EsIChfX3YzMnFpKV9fYiwgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMzIpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMzIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jbXBuZXFfZXBpOF9tYXNrKF9fbW1hc2szMiBfX3UsIF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2szMilfX2J1aWx0aW5faWEzMl9jbXBiMjU2X21hc2soKF9fdjMycWkpX19hLCAoX192MzJxaSlfX2IsIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMzIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY21wbmVxX2VwdThfbWFzayhfX20yNTZpIF9fYSwgX19tMjU2aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrMzIpX19idWlsdGluX2lhMzJfdWNtcGIyNTZfbWFzaygoX192MzJxaSlfX2EsIChfX3YzMnFpKV9fYiwgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazMyKS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazMyIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfY21wbmVxX2VwdThfbWFzayhfX21tYXNrMzIgX191LCBfX20yNTZpIF9fYSwgX19tMjU2aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrMzIpX19idWlsdGluX2lhMzJfdWNtcGIyNTZfbWFzaygoX192MzJxaSlfX2EsIChfX3YzMnFpKV9fYiwgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbXBuZXFfZXBpMTZfbWFzayhfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl9jbXB3MTI4X21hc2soKF9fdjhoaSlfX2EsIChfX3Y4aGkpX19iLCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2NtcG5lcV9lcGkxNl9tYXNrKF9fbW1hc2s4IF9fdSwgX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfY21wdzEyOF9tYXNrKChfX3Y4aGkpX19hLCAoX192OGhpKV9fYiwgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY21wbmVxX2VwdTE2X21hc2soX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfdWNtcHcxMjhfbWFzaygoX192OGhpKV9fYSwgKF9fdjhoaSlfX2IsIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2NtcG5lcV9lcHUxNl9tYXNrKF9fbW1hc2s4IF9fdSwgX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfdWNtcHcxMjhfbWFzaygoX192OGhpKV9fYSwgKF9fdjhoaSlfX2IsIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY21wbmVxX2VwaTE2X21hc2soX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazE2KV9fYnVpbHRpbl9pYTMyX2NtcHcyNTZfbWFzaygoX192MTZoaSlfX2EsIChfX3YxNmhpKV9fYiwgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jbXBuZXFfZXBpMTZfbWFzayhfX21tYXNrMTYgX191LCBfX20yNTZpIF9fYSwgX19tMjU2aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrMTYpX19idWlsdGluX2lhMzJfY21wdzI1Nl9tYXNrKChfX3YxNmhpKV9fYSwgKF9fdjE2aGkpX19iLCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazE2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2NtcG5lcV9lcHUxNl9tYXNrKF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2sxNilfX2J1aWx0aW5faWEzMl91Y21wdzI1Nl9tYXNrKChfX3YxNmhpKV9fYSwgKF9fdjE2aGkpX19iLCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jbXBuZXFfZXB1MTZfbWFzayhfX21tYXNrMTYgX191LCBfX20yNTZpIF9fYSwgX19tMjU2aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrMTYpX19idWlsdGluX2lhMzJfdWNtcHcyNTZfbWFzaygoX192MTZoaSlfX2EsIChfX3YxNmhpKV9fYiwgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfYWRkX2VwaTggKF9fbTI1NmkgX19XLCBfX21tYXNrMzIgX19VLCBfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpeworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BhZGRiMjU2X21hc2sgKChfX3YzMnFpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjMycWkpIF9fQiwKKyAgICAgICAgICAgICAoX192MzJxaSkgX19XLAorICAgICAgICAgICAgIChfX21tYXNrMzIpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfYWRkX2VwaTggKF9fbW1hc2szMiBfX1UsIF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikgeworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BhZGRiMjU2X21hc2sgKChfX3YzMnFpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjMycWkpIF9fQiwKKyAgICAgICAgICAgICAoX192MzJxaSkKKyAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAoX19tbWFzazMyKSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfYWRkX2VwaTE2IChfX20yNTZpIF9fVywgX19tbWFzazE2IF9fVSwgX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKSB7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcGFkZHcyNTZfbWFzayAoKF9fdjE2aGkpIF9fQSwKKyAgICAgICAgICAgICAoX192MTZoaSkgX19CLAorICAgICAgICAgICAgIChfX3YxNmhpKSBfX1csCisgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9hZGRfZXBpMTYgKF9fbW1hc2sxNiBfX1UsIF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikgeworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BhZGR3MjU2X21hc2sgKChfX3YxNmhpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjE2aGkpIF9fQiwKKyAgICAgICAgICAgICAoX192MTZoaSkKKyAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfc3ViX2VwaTggKF9fbTI1NmkgX19XLCBfX21tYXNrMzIgX19VLCBfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpIHsKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wc3ViYjI1Nl9tYXNrICgoX192MzJxaSkgX19BLAorICAgICAgICAgICAgIChfX3YzMnFpKSBfX0IsCisgICAgICAgICAgICAgKF9fdjMycWkpIF9fVywKKyAgICAgICAgICAgICAoX19tbWFzazMyKSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X3N1Yl9lcGk4IChfX21tYXNrMzIgX19VLCBfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpIHsKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wc3ViYjI1Nl9tYXNrICgoX192MzJxaSkgX19BLAorICAgICAgICAgICAgIChfX3YzMnFpKSBfX0IsCisgICAgICAgICAgICAgKF9fdjMycWkpCisgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgKF9fbW1hc2szMikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX3N1Yl9lcGkxNiAoX19tMjU2aSBfX1csIF9fbW1hc2sxNiBfX1UsIF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikgeworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BzdWJ3MjU2X21hc2sgKChfX3YxNmhpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjE2aGkpIF9fQiwKKyAgICAgICAgICAgICAoX192MTZoaSkgX19XLAorICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfc3ViX2VwaTE2IChfX21tYXNrMTYgX19VLCBfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpIHsKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wc3VidzI1Nl9tYXNrICgoX192MTZoaSkgX19BLAorICAgICAgICAgICAgIChfX3YxNmhpKSBfX0IsCisgICAgICAgICAgICAgKF9fdjE2aGkpCisgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VKTsKK30KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19hZGRfZXBpOCAoX19tMTI4aSBfX1csIF9fbW1hc2sxNiBfX1UsIF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikgeworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BhZGRiMTI4X21hc2sgKChfX3YxNnFpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjE2cWkpIF9fQiwKKyAgICAgICAgICAgICAoX192MTZxaSkgX19XLAorICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfYWRkX2VwaTggKF9fbW1hc2sxNiBfX1UsIF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikgeworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BhZGRiMTI4X21hc2sgKChfX3YxNnFpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjE2cWkpIF9fQiwKKyAgICAgICAgICAgICAoX192MTZxaSkKKyAgICAgICAgICAgICBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfYWRkX2VwaTE2IChfX20xMjhpIF9fVywgX19tbWFzazggX19VLCBfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wYWRkdzEyOF9tYXNrICgoX192OGhpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjhoaSkgX19CLAorICAgICAgICAgICAgIChfX3Y4aGkpIF9fVywKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfYWRkX2VwaTE2IChfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikgeworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BhZGR3MTI4X21hc2sgKChfX3Y4aGkpIF9fQSwKKyAgICAgICAgICAgICAoX192OGhpKSBfX0IsCisgICAgICAgICAgICAgKF9fdjhoaSkKKyAgICAgICAgICAgICBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19zdWJfZXBpOCAoX19tMTI4aSBfX1csIF9fbW1hc2sxNiBfX1UsIF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikgeworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BzdWJiMTI4X21hc2sgKChfX3YxNnFpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjE2cWkpIF9fQiwKKyAgICAgICAgICAgICAoX192MTZxaSkgX19XLAorICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfc3ViX2VwaTggKF9fbW1hc2sxNiBfX1UsIF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikgeworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BzdWJiMTI4X21hc2sgKChfX3YxNnFpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjE2cWkpIF9fQiwKKyAgICAgICAgICAgICAoX192MTZxaSkKKyAgICAgICAgICAgICBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfc3ViX2VwaTE2IChfX20xMjhpIF9fVywgX19tbWFzazggX19VLCBfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wc3VidzEyOF9tYXNrICgoX192OGhpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjhoaSkgX19CLAorICAgICAgICAgICAgIChfX3Y4aGkpIF9fVywKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfc3ViX2VwaTE2IChfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikgeworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BzdWJ3MTI4X21hc2sgKChfX3Y4aGkpIF9fQSwKKyAgICAgICAgICAgICAoX192OGhpKSBfX0IsCisgICAgICAgICAgICAgKF9fdjhoaSkKKyAgICAgICAgICAgICBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19tdWxsb19lcGkxNiAoX19tMjU2aSBfX1csIF9fbW1hc2sxNiBfX1UsIF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikgeworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BtdWxsdzI1Nl9tYXNrICgoX192MTZoaSkgX19BLAorICAgICAgICAgICAgICAoX192MTZoaSkgX19CLAorICAgICAgICAgICAgICAoX192MTZoaSkgX19XLAorICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X211bGxvX2VwaTE2IChfX21tYXNrMTYgX19VLCBfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpIHsKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wbXVsbHcyNTZfbWFzayAoKF9fdjE2aGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjE2aGkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjE2aGkpCisgICAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2ICgpLAorICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfbXVsbG9fZXBpMTYgKF9fbTEyOGkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikgeworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BtdWxsdzEyOF9tYXNrICgoX192OGhpKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y4aGkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjhoaSkgX19XLAorICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfbXVsbG9fZXBpMTYgKF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKSB7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG11bGx3MTI4X21hc2sgKChfX3Y4aGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjhoaSkgX19CLAorICAgICAgICAgICAgICAoX192OGhpKQorICAgICAgICAgICAgICBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfYmxlbmRfZXBpOCAoX19tbWFzazE2IF9fVSwgX19tMTI4aSBfX0EsIF9fbTEyOGkgX19XKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3NlbGVjdGJfMTI4ICgoX19tbWFzazE2KSBfX1UsCisgICAgICAgICAgICAgIChfX3YxNnFpKSBfX1csCisgICAgICAgICAgICAgIChfX3YxNnFpKSBfX0EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfYmxlbmRfZXBpOCAoX19tbWFzazMyIF9fVSwgX19tMjU2aSBfX0EsIF9fbTI1NmkgX19XKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3NlbGVjdGJfMjU2ICgoX19tbWFzazMyKSBfX1UsCisgICAgICAgICAgICAgICAoX192MzJxaSkgX19XLAorICAgICAgICAgICAgICAgKF9fdjMycWkpIF9fQSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19ibGVuZF9lcGkxNiAoX19tbWFzazggX19VLCBfX20xMjhpIF9fQSwgX19tMTI4aSBfX1cpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfc2VsZWN0d18xMjggKChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAgKF9fdjhoaSkgX19XLAorICAgICAgICAgICAgICAgKF9fdjhoaSkgX19BKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2JsZW5kX2VwaTE2IChfX21tYXNrMTYgX19VLCBfX20yNTZpIF9fQSwgX19tMjU2aSBfX1cpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfc2VsZWN0d18yNTYgKChfX21tYXNrMTYpIF9fVSwKKyAgICAgICAgICAgICAgIChfX3YxNmhpKSBfX1csCisgICAgICAgICAgICAgICAoX192MTZoaSkgX19BKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2Fic19lcGk4IChfX20xMjhpIF9fVywgX19tbWFzazE2IF9fVSwgX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcGFic2IxMjhfbWFzayAoKF9fdjE2cWkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3YxNnFpKSBfX1csCisgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2Fic19lcGk4IChfX21tYXNrMTYgX19VLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wYWJzYjEyOF9tYXNrICgoX192MTZxaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjE2cWkpIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2Fic19lcGk4IChfX20yNTZpIF9fVywgX19tbWFzazMyIF9fVSwgX19tMjU2aSBfX0EpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcGFic2IyNTZfbWFzayAoKF9fdjMycWkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3YzMnFpKSBfX1csCisgICAgICAgICAgICAgICAoX19tbWFzazMyKSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X2Fic19lcGk4IChfX21tYXNrMzIgX19VLCBfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wYWJzYjI1Nl9tYXNrICgoX192MzJxaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjMycWkpIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2ICgpLAorICAgICAgICAgICAgICAgKF9fbW1hc2szMikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2Fic19lcGkxNiAoX19tMTI4aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcGFic3cxMjhfbWFzayAoKF9fdjhoaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjhoaSkgX19XLAorICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2Fic19lcGkxNiAoX19tbWFzazggX19VLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wYWJzdzEyOF9tYXNrICgoX192OGhpKSBfX0EsCisgICAgICAgICAgICAgICAoX192OGhpKSBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2Fic19lcGkxNiAoX19tMjU2aSBfX1csIF9fbW1hc2sxNiBfX1UsIF9fbTI1NmkgX19BKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BhYnN3MjU2X21hc2sgKChfX3YxNmhpKSBfX0EsCisgICAgICAgICAgICAgICAoX192MTZoaSkgX19XLAorICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9hYnNfZXBpMTYgKF9fbW1hc2sxNiBfX1UsIF9fbTI1NmkgX19BKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BhYnN3MjU2X21hc2sgKChfX3YxNmhpKSBfX0EsCisgICAgICAgICAgICAgICAoX192MTZoaSkgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X3BhY2tzX2VwaTMyIChfX21tYXNrOCBfX00sIF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wYWNrc3NkdzEyOF9tYXNrICgoX192NHNpKSBfX0EsCisgICAgICAgICAgICAgICAoX192NHNpKSBfX0IsCisgICAgICAgICAgICAgICAoX192OGhpKSBfbW1fc2V0emVyb19zaTEyOCAoKSwgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX3BhY2tzX2VwaTMyIChfX20xMjhpIF9fVywgX19tbWFzazE2IF9fTSwgX19tMTI4aSBfX0EsCisgICAgICAgICAgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcGFja3NzZHcxMjhfbWFzayAoKF9fdjRzaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjRzaSkgX19CLAorICAgICAgICAgICAgICAgKF9fdjhoaSkgX19XLCBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X3BhY2tzX2VwaTMyIChfX21tYXNrMTYgX19NLCBfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcGFja3NzZHcyNTZfbWFzayAoKF9fdjhzaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjhzaSkgX19CLAorICAgICAgICAgICAgICAgKF9fdjE2aGkpIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2ICgpLAorICAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX3BhY2tzX2VwaTMyIChfX20yNTZpIF9fVywgX19tbWFzazE2IF9fTSwgX19tMjU2aSBfX0EsCisgICAgICAgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcGFja3NzZHcyNTZfbWFzayAoKF9fdjhzaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjhzaSkgX19CLAorICAgICAgICAgICAgICAgKF9fdjE2aGkpIF9fVywgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9wYWNrc19lcGkxNiAoX19tbWFzazE2IF9fTSwgX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BhY2tzc3diMTI4X21hc2sgKChfX3Y4aGkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3Y4aGkpIF9fQiwKKyAgICAgICAgICAgICAgIChfX3YxNnFpKSBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19wYWNrc19lcGkxNiAoX19tMTI4aSBfX1csIF9fbW1hc2sxNiBfX00sIF9fbTEyOGkgX19BLAorICAgICAgICAgIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BhY2tzc3diMTI4X21hc2sgKChfX3Y4aGkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3Y4aGkpIF9fQiwKKyAgICAgICAgICAgICAgIChfX3YxNnFpKSBfX1csCisgICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X3BhY2tzX2VwaTE2IChfX21tYXNrMzIgX19NLCBfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcGFja3Nzd2IyNTZfbWFzayAoKF9fdjE2aGkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3YxNmhpKSBfX0IsCisgICAgICAgICAgICAgICAoX192MzJxaSkgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfcGFja3NfZXBpMTYgKF9fbTI1NmkgX19XLCBfX21tYXNrMzIgX19NLCBfX20yNTZpIF9fQSwKKyAgICAgICBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wYWNrc3N3YjI1Nl9tYXNrICgoX192MTZoaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjE2aGkpIF9fQiwKKyAgICAgICAgICAgICAgIChfX3YzMnFpKSBfX1csCisgICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X3BhY2t1c19lcGkzMiAoX19tbWFzazggX19NLCBfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcGFja3VzZHcxMjhfbWFzayAoKF9fdjRzaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjRzaSkgX19CLAorICAgICAgICAgICAgICAgKF9fdjhoaSkgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfcGFja3VzX2VwaTMyIChfX20xMjhpIF9fVywgX19tbWFzazE2IF9fTSwgX19tMTI4aSBfX0EsCisgICAgICAgICAgIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BhY2t1c2R3MTI4X21hc2sgKChfX3Y0c2kpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3Y0c2kpIF9fQiwKKyAgICAgICAgICAgICAgIChfX3Y4aGkpIF9fVywgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9wYWNrdXNfZXBpMzIgKF9fbW1hc2sxNiBfX00sIF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wYWNrdXNkdzI1Nl9tYXNrICgoX192OHNpKSBfX0EsCisgICAgICAgICAgICAgICAoX192OHNpKSBfX0IsCisgICAgICAgICAgICAgICAoX192MTZoaSkgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfcGFja3VzX2VwaTMyIChfX20yNTZpIF9fVywgX19tbWFzazE2IF9fTSwgX19tMjU2aSBfX0EsCisgICAgICAgIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BhY2t1c2R3MjU2X21hc2sgKChfX3Y4c2kpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3Y4c2kpIF9fQiwKKyAgICAgICAgICAgICAgIChfX3YxNmhpKSBfX1csCisgICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X3BhY2t1c19lcGkxNiAoX19tbWFzazE2IF9fTSwgX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BhY2t1c3diMTI4X21hc2sgKChfX3Y4aGkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3Y4aGkpIF9fQiwKKyAgICAgICAgICAgICAgIChfX3YxNnFpKSBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19wYWNrdXNfZXBpMTYgKF9fbTEyOGkgX19XLCBfX21tYXNrMTYgX19NLCBfX20xMjhpIF9fQSwKKyAgICAgICAgICAgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcGFja3Vzd2IxMjhfbWFzayAoKF9fdjhoaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjhoaSkgX19CLAorICAgICAgICAgICAgICAgKF9fdjE2cWkpIF9fVywKKyAgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfcGFja3VzX2VwaTE2IChfX21tYXNrMzIgX19NLCBfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcGFja3Vzd2IyNTZfbWFzayAoKF9fdjE2aGkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3YxNmhpKSBfX0IsCisgICAgICAgICAgICAgICAoX192MzJxaSkgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfcGFja3VzX2VwaTE2IChfX20yNTZpIF9fVywgX19tbWFzazMyIF9fTSwgX19tMjU2aSBfX0EsCisgICAgICAgIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BhY2t1c3diMjU2X21hc2sgKChfX3YxNmhpKSBfX0EsCisgICAgICAgICAgICAgICAoX192MTZoaSkgX19CLAorICAgICAgICAgICAgICAgKF9fdjMycWkpIF9fVywKKyAgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19hZGRzX2VwaTggKF9fbTEyOGkgX19XLCBfX21tYXNrMTYgX19VLCBfX20xMjhpIF9fQSwKKyAgICAgICAgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcGFkZHNiMTI4X21hc2sgKChfX3YxNnFpKSBfX0EsCisgICAgICAgICAgICAgICAoX192MTZxaSkgX19CLAorICAgICAgICAgICAgICAgKF9fdjE2cWkpIF9fVywKKyAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfYWRkc19lcGk4IChfX21tYXNrMTYgX19VLCBfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcGFkZHNiMTI4X21hc2sgKChfX3YxNnFpKSBfX0EsCisgICAgICAgICAgICAgICAoX192MTZxaSkgX19CLAorICAgICAgICAgICAgICAgKF9fdjE2cWkpIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2FkZHNfZXBpOCAoX19tMjU2aSBfX1csIF9fbW1hc2szMiBfX1UsIF9fbTI1NmkgX19BLAorICAgICAgICAgICBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wYWRkc2IyNTZfbWFzayAoKF9fdjMycWkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3YzMnFpKSBfX0IsCisgICAgICAgICAgICAgICAoX192MzJxaSkgX19XLAorICAgICAgICAgICAgICAgKF9fbW1hc2szMikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9hZGRzX2VwaTggKF9fbW1hc2szMiBfX1UsIF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wYWRkc2IyNTZfbWFzayAoKF9fdjMycWkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3YzMnFpKSBfX0IsCisgICAgICAgICAgICAgICAoX192MzJxaSkgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgICAoX19tbWFzazMyKSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfYWRkc19lcGkxNiAoX19tMTI4aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EsCisgICAgICAgICBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wYWRkc3cxMjhfbWFzayAoKF9fdjhoaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjhoaSkgX19CLAorICAgICAgICAgICAgICAgKF9fdjhoaSkgX19XLAorICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2FkZHNfZXBpMTYgKF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BhZGRzdzEyOF9tYXNrICgoX192OGhpKSBfX0EsCisgICAgICAgICAgICAgICAoX192OGhpKSBfX0IsCisgICAgICAgICAgICAgICAoX192OGhpKSBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2FkZHNfZXBpMTYgKF9fbTI1NmkgX19XLCBfX21tYXNrMTYgX19VLCBfX20yNTZpIF9fQSwKKyAgICAgIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BhZGRzdzI1Nl9tYXNrICgoX192MTZoaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjE2aGkpIF9fQiwKKyAgICAgICAgICAgICAgIChfX3YxNmhpKSBfX1csCisgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X2FkZHNfZXBpMTYgKF9fbW1hc2sxNiBfX1UsIF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wYWRkc3cyNTZfbWFzayAoKF9fdjE2aGkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3YxNmhpKSBfX0IsCisgICAgICAgICAgICAgICAoX192MTZoaSkgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfYWRkc19lcHU4IChfX20xMjhpIF9fVywgX19tbWFzazE2IF9fVSwgX19tMTI4aSBfX0EsCisgICAgICAgIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BhZGR1c2IxMjhfbWFzayAoKF9fdjE2cWkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3YxNnFpKSBfX0IsCisgICAgICAgICAgICAgICAoX192MTZxaSkgX19XLAorICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9hZGRzX2VwdTggKF9fbW1hc2sxNiBfX1UsIF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wYWRkdXNiMTI4X21hc2sgKChfX3YxNnFpKSBfX0EsCisgICAgICAgICAgICAgICAoX192MTZxaSkgX19CLAorICAgICAgICAgICAgICAgKF9fdjE2cWkpIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2FkZHNfZXB1OCAoX19tMjU2aSBfX1csIF9fbW1hc2szMiBfX1UsIF9fbTI1NmkgX19BLAorICAgICAgICAgICBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wYWRkdXNiMjU2X21hc2sgKChfX3YzMnFpKSBfX0EsCisgICAgICAgICAgICAgICAoX192MzJxaSkgX19CLAorICAgICAgICAgICAgICAgKF9fdjMycWkpIF9fVywKKyAgICAgICAgICAgICAgIChfX21tYXNrMzIpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfYWRkc19lcHU4IChfX21tYXNrMzIgX19VLCBfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcGFkZHVzYjI1Nl9tYXNrICgoX192MzJxaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjMycWkpIF9fQiwKKyAgICAgICAgICAgICAgIChfX3YzMnFpKSBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAgIChfX21tYXNrMzIpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19hZGRzX2VwdTE2IChfX20xMjhpIF9fVywgX19tbWFzazggX19VLCBfX20xMjhpIF9fQSwKKyAgICAgICAgIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BhZGR1c3cxMjhfbWFzayAoKF9fdjhoaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjhoaSkgX19CLAorICAgICAgICAgICAgICAgKF9fdjhoaSkgX19XLAorICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2FkZHNfZXB1MTYgKF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BhZGR1c3cxMjhfbWFzayAoKF9fdjhoaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjhoaSkgX19CLAorICAgICAgICAgICAgICAgKF9fdjhoaSkgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19hZGRzX2VwdTE2IChfX20yNTZpIF9fVywgX19tbWFzazE2IF9fVSwgX19tMjU2aSBfX0EsCisgICAgICBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wYWRkdXN3MjU2X21hc2sgKChfX3YxNmhpKSBfX0EsCisgICAgICAgICAgICAgICAoX192MTZoaSkgX19CLAorICAgICAgICAgICAgICAgKF9fdjE2aGkpIF9fVywKKyAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfYWRkc19lcHUxNiAoX19tbWFzazE2IF9fVSwgX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BhZGR1c3cyNTZfbWFzayAoKF9fdjE2aGkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3YxNmhpKSBfX0IsCisgICAgICAgICAgICAgICAoX192MTZoaSkgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfYXZnX2VwdTggKF9fbTEyOGkgX19XLCBfX21tYXNrMTYgX19VLCBfX20xMjhpIF9fQSwKKyAgICAgICBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wYXZnYjEyOF9tYXNrICgoX192MTZxaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjE2cWkpIF9fQiwKKyAgICAgICAgICAgICAgIChfX3YxNnFpKSBfX1csCisgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2F2Z19lcHU4IChfX21tYXNrMTYgX19VLCBfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcGF2Z2IxMjhfbWFzayAoKF9fdjE2cWkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3YxNnFpKSBfX0IsCisgICAgICAgICAgICAgICAoX192MTZxaSkgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfYXZnX2VwdTggKF9fbTI1NmkgX19XLCBfX21tYXNrMzIgX19VLCBfX20yNTZpIF9fQSwKKyAgICAgICAgICBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wYXZnYjI1Nl9tYXNrICgoX192MzJxaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjMycWkpIF9fQiwKKyAgICAgICAgICAgICAgIChfX3YzMnFpKSBfX1csCisgICAgICAgICAgICAgICAoX19tbWFzazMyKSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X2F2Z19lcHU4IChfX21tYXNrMzIgX19VLCBfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcGF2Z2IyNTZfbWFzayAoKF9fdjMycWkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3YzMnFpKSBfX0IsCisgICAgICAgICAgICAgICAoX192MzJxaSkgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgICAoX19tbWFzazMyKSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfYXZnX2VwdTE2IChfX20xMjhpIF9fVywgX19tbWFzazggX19VLCBfX20xMjhpIF9fQSwKKyAgICAgICAgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcGF2Z3cxMjhfbWFzayAoKF9fdjhoaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjhoaSkgX19CLAorICAgICAgICAgICAgICAgKF9fdjhoaSkgX19XLAorICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2F2Z19lcHUxNiAoX19tbWFzazggX19VLCBfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcGF2Z3cxMjhfbWFzayAoKF9fdjhoaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjhoaSkgX19CLAorICAgICAgICAgICAgICAgKF9fdjhoaSkgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19hdmdfZXB1MTYgKF9fbTI1NmkgX19XLCBfX21tYXNrMTYgX19VLCBfX20yNTZpIF9fQSwKKyAgICAgICAgICAgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcGF2Z3cyNTZfbWFzayAoKF9fdjE2aGkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3YxNmhpKSBfX0IsCisgICAgICAgICAgICAgICAoX192MTZoaSkgX19XLAorICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9hdmdfZXB1MTYgKF9fbW1hc2sxNiBfX1UsIF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wYXZndzI1Nl9tYXNrICgoX192MTZoaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjE2aGkpIF9fQiwKKyAgICAgICAgICAgICAgIChfX3YxNmhpKSBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfbWF4X2VwaTggKF9fbW1hc2sxNiBfX00sIF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbWF4c2IxMjhfbWFzayAoKF9fdjE2cWkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3YxNnFpKSBfX0IsCisgICAgICAgICAgICAgICAoX192MTZxaSkgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfbWF4X2VwaTggKF9fbTEyOGkgX19XLCBfX21tYXNrMTYgX19NLCBfX20xMjhpIF9fQSwKKyAgICAgICBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbWF4c2IxMjhfbWFzayAoKF9fdjE2cWkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3YxNnFpKSBfX0IsCisgICAgICAgICAgICAgICAoX192MTZxaSkgX19XLAorICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9tYXhfZXBpOCAoX19tbWFzazMyIF9fTSwgX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BtYXhzYjI1Nl9tYXNrICgoX192MzJxaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjMycWkpIF9fQiwKKyAgICAgICAgICAgICAgIChfX3YzMnFpKSBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAgIChfX21tYXNrMzIpIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19tYXhfZXBpOCAoX19tMjU2aSBfX1csIF9fbW1hc2szMiBfX00sIF9fbTI1NmkgX19BLAorICAgICAgICAgIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BtYXhzYjI1Nl9tYXNrICgoX192MzJxaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjMycWkpIF9fQiwKKyAgICAgICAgICAgICAgIChfX3YzMnFpKSBfX1csCisgICAgICAgICAgICAgICAoX19tbWFzazMyKSBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X21heF9lcGkxNiAoX19tbWFzazggX19NLCBfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1heHN3MTI4X21hc2sgKChfX3Y4aGkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3Y4aGkpIF9fQiwKKyAgICAgICAgICAgICAgIChfX3Y4aGkpIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfbWF4X2VwaTE2IChfX20xMjhpIF9fVywgX19tbWFzazggX19NLCBfX20xMjhpIF9fQSwKKyAgICAgICAgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1heHN3MTI4X21hc2sgKChfX3Y4aGkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3Y4aGkpIF9fQiwKKyAgICAgICAgICAgICAgIChfX3Y4aGkpIF9fVywKKyAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9tYXhfZXBpMTYgKF9fbW1hc2sxNiBfX00sIF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wbWF4c3cyNTZfbWFzayAoKF9fdjE2aGkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3YxNmhpKSBfX0IsCisgICAgICAgICAgICAgICAoX192MTZoaSkgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfbWF4X2VwaTE2IChfX20yNTZpIF9fVywgX19tbWFzazE2IF9fTSwgX19tMjU2aSBfX0EsCisgICAgICAgICAgIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BtYXhzdzI1Nl9tYXNrICgoX192MTZoaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjE2aGkpIF9fQiwKKyAgICAgICAgICAgICAgIChfX3YxNmhpKSBfX1csCisgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X21heF9lcHU4IChfX21tYXNrMTYgX19NLCBfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1heHViMTI4X21hc2sgKChfX3YxNnFpKSBfX0EsCisgICAgICAgICAgICAgICAoX192MTZxaSkgX19CLAorICAgICAgICAgICAgICAgKF9fdjE2cWkpIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX21heF9lcHU4IChfX20xMjhpIF9fVywgX19tbWFzazE2IF9fTSwgX19tMTI4aSBfX0EsCisgICAgICAgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1heHViMTI4X21hc2sgKChfX3YxNnFpKSBfX0EsCisgICAgICAgICAgICAgICAoX192MTZxaSkgX19CLAorICAgICAgICAgICAgICAgKF9fdjE2cWkpIF9fVywKKyAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfbWF4X2VwdTggKF9fbW1hc2szMiBfX00sIF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wbWF4dWIyNTZfbWFzayAoKF9fdjMycWkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3YzMnFpKSBfX0IsCisgICAgICAgICAgICAgICAoX192MzJxaSkgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgICAoX19tbWFzazMyKSBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfbWF4X2VwdTggKF9fbTI1NmkgX19XLCBfX21tYXNrMzIgX19NLCBfX20yNTZpIF9fQSwKKyAgICAgICAgICBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wbWF4dWIyNTZfbWFzayAoKF9fdjMycWkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3YzMnFpKSBfX0IsCisgICAgICAgICAgICAgICAoX192MzJxaSkgX19XLAorICAgICAgICAgICAgICAgKF9fbW1hc2szMikgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9tYXhfZXB1MTYgKF9fbW1hc2s4IF9fTSwgX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BtYXh1dzEyOF9tYXNrICgoX192OGhpKSBfX0EsCisgICAgICAgICAgICAgICAoX192OGhpKSBfX0IsCisgICAgICAgICAgICAgICAoX192OGhpKSBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX21heF9lcHUxNiAoX19tMTI4aSBfX1csIF9fbW1hc2s4IF9fTSwgX19tMTI4aSBfX0EsCisgICAgICAgIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BtYXh1dzEyOF9tYXNrICgoX192OGhpKSBfX0EsCisgICAgICAgICAgICAgICAoX192OGhpKSBfX0IsCisgICAgICAgICAgICAgICAoX192OGhpKSBfX1csCisgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfbWF4X2VwdTE2IChfX21tYXNrMTYgX19NLCBfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG1heHV3MjU2X21hc2sgKChfX3YxNmhpKSBfX0EsCisgICAgICAgICAgICAgICAoX192MTZoaSkgX19CLAorICAgICAgICAgICAgICAgKF9fdjE2aGkpIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2ICgpLAorICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX21heF9lcHUxNiAoX19tMjU2aSBfX1csIF9fbW1hc2sxNiBfX00sIF9fbTI1NmkgX19BLAorICAgICAgICAgICBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wbWF4dXcyNTZfbWFzayAoKF9fdjE2aGkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3YxNmhpKSBfX0IsCisgICAgICAgICAgICAgICAoX192MTZoaSkgX19XLAorICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9taW5fZXBpOCAoX19tbWFzazE2IF9fTSwgX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BtaW5zYjEyOF9tYXNrICgoX192MTZxaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjE2cWkpIF9fQiwKKyAgICAgICAgICAgICAgIChfX3YxNnFpKSBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19taW5fZXBpOCAoX19tMTI4aSBfX1csIF9fbW1hc2sxNiBfX00sIF9fbTEyOGkgX19BLAorICAgICAgIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BtaW5zYjEyOF9tYXNrICgoX192MTZxaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjE2cWkpIF9fQiwKKyAgICAgICAgICAgICAgIChfX3YxNnFpKSBfX1csCisgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X21pbl9lcGk4IChfX21tYXNrMzIgX19NLCBfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG1pbnNiMjU2X21hc2sgKChfX3YzMnFpKSBfX0EsCisgICAgICAgICAgICAgICAoX192MzJxaSkgX19CLAorICAgICAgICAgICAgICAgKF9fdjMycWkpIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2ICgpLAorICAgICAgICAgICAgICAgKF9fbW1hc2szMikgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX21pbl9lcGk4IChfX20yNTZpIF9fVywgX19tbWFzazMyIF9fTSwgX19tMjU2aSBfX0EsCisgICAgICAgICAgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG1pbnNiMjU2X21hc2sgKChfX3YzMnFpKSBfX0EsCisgICAgICAgICAgICAgICAoX192MzJxaSkgX19CLAorICAgICAgICAgICAgICAgKF9fdjMycWkpIF9fVywKKyAgICAgICAgICAgICAgIChfX21tYXNrMzIpIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfbWluX2VwaTE2IChfX21tYXNrOCBfX00sIF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbWluc3cxMjhfbWFzayAoKF9fdjhoaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjhoaSkgX19CLAorICAgICAgICAgICAgICAgKF9fdjhoaSkgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19taW5fZXBpMTYgKF9fbTEyOGkgX19XLCBfX21tYXNrOCBfX00sIF9fbTEyOGkgX19BLAorICAgICAgICBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbWluc3cxMjhfbWFzayAoKF9fdjhoaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjhoaSkgX19CLAorICAgICAgICAgICAgICAgKF9fdjhoaSkgX19XLAorICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X21pbl9lcGkxNiAoX19tbWFzazE2IF9fTSwgX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BtaW5zdzI1Nl9tYXNrICgoX192MTZoaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjE2aGkpIF9fQiwKKyAgICAgICAgICAgICAgIChfX3YxNmhpKSBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19taW5fZXBpMTYgKF9fbTI1NmkgX19XLCBfX21tYXNrMTYgX19NLCBfX20yNTZpIF9fQSwKKyAgICAgICAgICAgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG1pbnN3MjU2X21hc2sgKChfX3YxNmhpKSBfX0EsCisgICAgICAgICAgICAgICAoX192MTZoaSkgX19CLAorICAgICAgICAgICAgICAgKF9fdjE2aGkpIF9fVywKKyAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfbWluX2VwdTggKF9fbW1hc2sxNiBfX00sIF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbWludWIxMjhfbWFzayAoKF9fdjE2cWkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3YxNnFpKSBfX0IsCisgICAgICAgICAgICAgICAoX192MTZxaSkgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfbWluX2VwdTggKF9fbTEyOGkgX19XLCBfX21tYXNrMTYgX19NLCBfX20xMjhpIF9fQSwKKyAgICAgICBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbWludWIxMjhfbWFzayAoKF9fdjE2cWkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3YxNnFpKSBfX0IsCisgICAgICAgICAgICAgICAoX192MTZxaSkgX19XLAorICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9taW5fZXB1OCAoX19tbWFzazMyIF9fTSwgX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BtaW51YjI1Nl9tYXNrICgoX192MzJxaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjMycWkpIF9fQiwKKyAgICAgICAgICAgICAgIChfX3YzMnFpKSBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAgIChfX21tYXNrMzIpIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19taW5fZXB1OCAoX19tMjU2aSBfX1csIF9fbW1hc2szMiBfX00sIF9fbTI1NmkgX19BLAorICAgICAgICAgIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BtaW51YjI1Nl9tYXNrICgoX192MzJxaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjMycWkpIF9fQiwKKyAgICAgICAgICAgICAgIChfX3YzMnFpKSBfX1csCisgICAgICAgICAgICAgICAoX19tbWFzazMyKSBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X21pbl9lcHUxNiAoX19tbWFzazggX19NLCBfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1pbnV3MTI4X21hc2sgKChfX3Y4aGkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3Y4aGkpIF9fQiwKKyAgICAgICAgICAgICAgIChfX3Y4aGkpIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfbWluX2VwdTE2IChfX20xMjhpIF9fVywgX19tbWFzazggX19NLCBfX20xMjhpIF9fQSwKKyAgICAgICAgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1pbnV3MTI4X21hc2sgKChfX3Y4aGkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3Y4aGkpIF9fQiwKKyAgICAgICAgICAgICAgIChfX3Y4aGkpIF9fVywKKyAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9taW5fZXB1MTYgKF9fbW1hc2sxNiBfX00sIF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wbWludXcyNTZfbWFzayAoKF9fdjE2aGkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3YxNmhpKSBfX0IsCisgICAgICAgICAgICAgICAoX192MTZoaSkgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfbWluX2VwdTE2IChfX20yNTZpIF9fVywgX19tbWFzazE2IF9fTSwgX19tMjU2aSBfX0EsCisgICAgICAgICAgIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BtaW51dzI1Nl9tYXNrICgoX192MTZoaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjE2aGkpIF9fQiwKKyAgICAgICAgICAgICAgIChfX3YxNmhpKSBfX1csCisgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfc2h1ZmZsZV9lcGk4IChfX20xMjhpIF9fVywgX19tbWFzazE2IF9fVSwgX19tMTI4aSBfX0EsCisgICAgICAgICAgIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BzaHVmYjEyOF9tYXNrICgoX192MTZxaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjE2cWkpIF9fQiwKKyAgICAgICAgICAgICAgIChfX3YxNnFpKSBfX1csCisgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X3NodWZmbGVfZXBpOCAoX19tbWFzazE2IF9fVSwgX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BzaHVmYjEyOF9tYXNrICgoX192MTZxaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjE2cWkpIF9fQiwKKyAgICAgICAgICAgICAgIChfX3YxNnFpKSBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19zaHVmZmxlX2VwaTggKF9fbTI1NmkgX19XLCBfX21tYXNrMzIgX19VLCBfX20yNTZpIF9fQSwKKyAgICAgICAgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcHNodWZiMjU2X21hc2sgKChfX3YzMnFpKSBfX0EsCisgICAgICAgICAgICAgICAoX192MzJxaSkgX19CLAorICAgICAgICAgICAgICAgKF9fdjMycWkpIF9fVywKKyAgICAgICAgICAgICAgIChfX21tYXNrMzIpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfc2h1ZmZsZV9lcGk4IChfX21tYXNrMzIgX19VLCBfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcHNodWZiMjU2X21hc2sgKChfX3YzMnFpKSBfX0EsCisgICAgICAgICAgICAgICAoX192MzJxaSkgX19CLAorICAgICAgICAgICAgICAgKF9fdjMycWkpIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2ICgpLAorICAgICAgICAgICAgICAgKF9fbW1hc2szMikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX3N1YnNfZXBpOCAoX19tMTI4aSBfX1csIF9fbW1hc2sxNiBfX1UsIF9fbTEyOGkgX19BLAorICAgICAgICBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wc3Vic2IxMjhfbWFzayAoKF9fdjE2cWkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3YxNnFpKSBfX0IsCisgICAgICAgICAgICAgICAoX192MTZxaSkgX19XLAorICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9zdWJzX2VwaTggKF9fbW1hc2sxNiBfX1UsIF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wc3Vic2IxMjhfbWFzayAoKF9fdjE2cWkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3YxNnFpKSBfX0IsCisgICAgICAgICAgICAgICAoX192MTZxaSkgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfc3Vic19lcGk4IChfX20yNTZpIF9fVywgX19tbWFzazMyIF9fVSwgX19tMjU2aSBfX0EsCisgICAgICAgICAgIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BzdWJzYjI1Nl9tYXNrICgoX192MzJxaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjMycWkpIF9fQiwKKyAgICAgICAgICAgICAgIChfX3YzMnFpKSBfX1csCisgICAgICAgICAgICAgICAoX19tbWFzazMyKSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X3N1YnNfZXBpOCAoX19tbWFzazMyIF9fVSwgX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BzdWJzYjI1Nl9tYXNrICgoX192MzJxaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjMycWkpIF9fQiwKKyAgICAgICAgICAgICAgIChfX3YzMnFpKSBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAgIChfX21tYXNrMzIpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19zdWJzX2VwaTE2IChfX20xMjhpIF9fVywgX19tbWFzazggX19VLCBfX20xMjhpIF9fQSwKKyAgICAgICAgIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BzdWJzdzEyOF9tYXNrICgoX192OGhpKSBfX0EsCisgICAgICAgICAgICAgICAoX192OGhpKSBfX0IsCisgICAgICAgICAgICAgICAoX192OGhpKSBfX1csCisgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfc3Vic19lcGkxNiAoX19tbWFzazggX19VLCBfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcHN1YnN3MTI4X21hc2sgKChfX3Y4aGkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3Y4aGkpIF9fQiwKKyAgICAgICAgICAgICAgIChfX3Y4aGkpIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfc3Vic19lcGkxNiAoX19tMjU2aSBfX1csIF9fbW1hc2sxNiBfX1UsIF9fbTI1NmkgX19BLAorICAgICAgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcHN1YnN3MjU2X21hc2sgKChfX3YxNmhpKSBfX0EsCisgICAgICAgICAgICAgICAoX192MTZoaSkgX19CLAorICAgICAgICAgICAgICAgKF9fdjE2aGkpIF9fVywKKyAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfc3Vic19lcGkxNiAoX19tbWFzazE2IF9fVSwgX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BzdWJzdzI1Nl9tYXNrICgoX192MTZoaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjE2aGkpIF9fQiwKKyAgICAgICAgICAgICAgIChfX3YxNmhpKSBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19zdWJzX2VwdTggKF9fbTEyOGkgX19XLCBfX21tYXNrMTYgX19VLCBfX20xMjhpIF9fQSwKKyAgICAgICAgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcHN1YnVzYjEyOF9tYXNrICgoX192MTZxaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjE2cWkpIF9fQiwKKyAgICAgICAgICAgICAgIChfX3YxNnFpKSBfX1csCisgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X3N1YnNfZXB1OCAoX19tbWFzazE2IF9fVSwgX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BzdWJ1c2IxMjhfbWFzayAoKF9fdjE2cWkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3YxNnFpKSBfX0IsCisgICAgICAgICAgICAgICAoX192MTZxaSkgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfc3Vic19lcHU4IChfX20yNTZpIF9fVywgX19tbWFzazMyIF9fVSwgX19tMjU2aSBfX0EsCisgICAgICAgICAgIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BzdWJ1c2IyNTZfbWFzayAoKF9fdjMycWkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3YzMnFpKSBfX0IsCisgICAgICAgICAgICAgICAoX192MzJxaSkgX19XLAorICAgICAgICAgICAgICAgKF9fbW1hc2szMikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9zdWJzX2VwdTggKF9fbW1hc2szMiBfX1UsIF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wc3VidXNiMjU2X21hc2sgKChfX3YzMnFpKSBfX0EsCisgICAgICAgICAgICAgICAoX192MzJxaSkgX19CLAorICAgICAgICAgICAgICAgKF9fdjMycWkpIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2ICgpLAorICAgICAgICAgICAgICAgKF9fbW1hc2szMikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX3N1YnNfZXB1MTYgKF9fbTEyOGkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BLAorICAgICAgICAgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcHN1YnVzdzEyOF9tYXNrICgoX192OGhpKSBfX0EsCisgICAgICAgICAgICAgICAoX192OGhpKSBfX0IsCisgICAgICAgICAgICAgICAoX192OGhpKSBfX1csCisgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfc3Vic19lcHUxNiAoX19tbWFzazggX19VLCBfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcHN1YnVzdzEyOF9tYXNrICgoX192OGhpKSBfX0EsCisgICAgICAgICAgICAgICAoX192OGhpKSBfX0IsCisgICAgICAgICAgICAgICAoX192OGhpKSBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX3N1YnNfZXB1MTYgKF9fbTI1NmkgX19XLCBfX21tYXNrMTYgX19VLCBfX20yNTZpIF9fQSwKKyAgICAgIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BzdWJ1c3cyNTZfbWFzayAoKF9fdjE2aGkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3YxNmhpKSBfX0IsCisgICAgICAgICAgICAgICAoX192MTZoaSkgX19XLAorICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9zdWJzX2VwdTE2IChfX21tYXNrMTYgX19VLCBfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcHN1YnVzdzI1Nl9tYXNrICgoX192MTZoaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjE2aGkpIF9fQiwKKyAgICAgICAgICAgICAgIChfX3YxNmhpKSBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFzazJfcGVybXV0ZXgydmFyX2VwaTE2IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0ksIF9fbW1hc2s4IF9fVSwKKyAgICAgICAgICAgIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaTJ2YXJoaTEyOF9tYXNrICgoX192OGhpKSBfX0EsCisgICAgICAgICAgICAgICAoX192OGhpKSBfX0kgLyogaWR4ICovICwKKyAgICAgICAgICAgICAgIChfX3Y4aGkpIF9fQiwKKyAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrMl9wZXJtdXRleDJ2YXJfZXBpMTYgKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fSSwKKyAgICAgICAgIF9fbW1hc2sxNiBfX1UsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaTJ2YXJoaTI1Nl9tYXNrICgoX192MTZoaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjE2aGkpIF9fSSAvKiBpZHggKi8gLAorICAgICAgICAgICAgICAgKF9fdjE2aGkpIF9fQiwKKyAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fcGVybXV0ZXgydmFyX2VwaTE2IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0ksIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJoaTEyOF9tYXNrICgoX192OGhpKSBfX0kvKiBpZHggKi8sCisgICAgICAgICAgICAgICAoX192OGhpKSBfX0EsCisgICAgICAgICAgICAgICAoX192OGhpKSBfX0IsCisgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX3Blcm11dGV4MnZhcl9lcGkxNiAoX19tMTI4aSBfX0EsIF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0ksCisgICAgICAgICAgIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJoaTEyOF9tYXNrICgoX192OGhpKSBfX0kvKiBpZHggKi8sCisgICAgICAgICAgICAgICAoX192OGhpKSBfX0EsCisgICAgICAgICAgICAgICAoX192OGhpKSBfX0IsCisgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfcGVybXV0ZXgydmFyX2VwaTE2IChfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BLCBfX20xMjhpIF9fSSwKKyAgICAgICAgICAgIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJoaTEyOF9tYXNreiAoKF9fdjhoaSkgX19JLyogaWR4ICovLAorICAgICAgICAgICAgICAgKF9fdjhoaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjhoaSkgX19CLAorICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3Blcm11dGV4MnZhcl9lcGkxNiAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19JLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl92cGVybXQydmFyaGkyNTZfbWFzayAoKF9fdjE2aGkpIF9fSS8qIGlkeCAqLywKKyAgICAgICAgICAgICAgIChfX3YxNmhpKSBfX0EsCisgICAgICAgICAgICAgICAoX192MTZoaSkgX19CLAorICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfcGVybXV0ZXgydmFyX2VwaTE2IChfX20yNTZpIF9fQSwgX19tbWFzazE2IF9fVSwKKyAgICAgICAgX19tMjU2aSBfX0ksIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJoaTI1Nl9tYXNrICgoX192MTZoaSkgX19JLyogaWR4ICovLAorICAgICAgICAgICAgICAgKF9fdjE2aGkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3YxNmhpKSBfX0IsCisgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X3Blcm11dGV4MnZhcl9lcGkxNiAoX19tbWFzazE2IF9fVSwgX19tMjU2aSBfX0EsCisgICAgICAgICBfX20yNTZpIF9fSSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfdnBlcm10MnZhcmhpMjU2X21hc2t6ICgoX192MTZoaSkgX19JLyogaWR4ICovLAorICAgICAgICAgICAgICAgKF9fdjE2aGkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3YxNmhpKSBfX0IsCisgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfbWFkZHVic19lcGkxNiAoX19tMTI4aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKSB7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1hZGR1YnN3MTI4X21hc2sgKChfX3YxNnFpKSBfX1gsCisgICAgICAgICAgICAgICAoX192MTZxaSkgX19ZLAorICAgICAgICAgICAgICAgKF9fdjhoaSkgX19XLAorICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X21hZGR1YnNfZXBpMTYgKF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKSB7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1hZGR1YnN3MTI4X21hc2sgKChfX3YxNnFpKSBfX1gsCisgICAgICAgICAgICAgICAoX192MTZxaSkgX19ZLAorICAgICAgICAgICAgICAoX192OGhpKSBfbW1fc2V0emVyb19zaTEyOCgpLAorICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfbWFkZHVic19lcGkxNiAoX19tMjU2aSBfX1csIF9fbW1hc2sxNiBfX1UsIF9fbTI1NmkgX19YLAorICAgICAgICAgX19tMjU2aSBfX1kpIHsKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wbWFkZHVic3cyNTZfbWFzayAoKF9fdjMycWkpIF9fWCwKKyAgICAgICAgICAgICAgIChfX3YzMnFpKSBfX1ksCisgICAgICAgICAgICAgICAoX192MTZoaSkgX19XLAorICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9tYWRkdWJzX2VwaTE2IChfX21tYXNrMTYgX19VLCBfX20yNTZpIF9fWCwgX19tMjU2aSBfX1kpIHsKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wbWFkZHVic3cyNTZfbWFzayAoKF9fdjMycWkpIF9fWCwKKyAgICAgICAgICAgICAgIChfX3YzMnFpKSBfX1ksCisgICAgICAgICAgICAgICAoX192MTZoaSkgX21tMjU2X3NldHplcm9fc2kyNTYoKSwKKyAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19tYWRkX2VwaTE2IChfX20xMjhpIF9fVywgX19tbWFzazggX19VLCBfX20xMjhpIF9fQSwKKyAgICAgICAgIF9fbTEyOGkgX19CKSB7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1hZGR3ZDEyOF9tYXNrICgoX192OGhpKSBfX0EsCisgICAgICAgICAgICAgICAoX192OGhpKSBfX0IsCisgICAgICAgICAgICAgICAoX192NHNpKSBfX1csCisgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfbWFkZF9lcGkxNiAoX19tbWFzazggX19VLCBfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbWFkZHdkMTI4X21hc2sgKChfX3Y4aGkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3Y4aGkpIF9fQiwKKyAgICAgICAgICAgICAgIChfX3Y0c2kpIF9tbV9zZXR6ZXJvX3NpMTI4KCksCisgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19tYWRkX2VwaTE2IChfX20yNTZpIF9fVywgX19tbWFzazggX19VLCBfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpIHsKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wbWFkZHdkMjU2X21hc2sgKChfX3YxNmhpKSBfX0EsCisgICAgICAgICAgICAgICAoX192MTZoaSkgX19CLAorICAgICAgICAgICAgICAgKF9fdjhzaSkgX19XLAorICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X21hZGRfZXBpMTYgKF9fbW1hc2s4IF9fVSwgX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKSB7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG1hZGR3ZDI1Nl9tYXNrICgoX192MTZoaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjE2aGkpIF9fQiwKKyAgICAgICAgICAgICAgIChfX3Y4c2kpIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2KCksCisgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY3Z0c2VwaTE2X2VwaTggKF9fbTEyOGkgX19BKSB7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnN3YjEyOF9tYXNrICgoX192OGhpKSBfX0EsCisgICAgICAgICAgICAgICAoX192MTZxaSkgX21tX3NldHplcm9fc2kxMjgoKSwKKyAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfY3Z0c2VwaTE2X2VwaTggKF9fbTEyOGkgX19PLCBfX21tYXNrOCBfX00sIF9fbTEyOGkgX19BKSB7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnN3YjEyOF9tYXNrICgoX192OGhpKSBfX0EsCisgICAgICAgICAgICAgICAoX192MTZxaSkgX19PLAorICAgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfY3Z0c2VwaTE2X2VwaTggKF9fbW1hc2s4IF9fTSwgX19tMTI4aSBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92c3diMTI4X21hc2sgKChfX3Y4aGkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3YxNnFpKSBfbW1fc2V0emVyb19zaTEyOCgpLAorICAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9jdnRzZXBpMTZfZXBpOCAoX19tMjU2aSBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92c3diMjU2X21hc2sgKChfX3YxNmhpKSBfX0EsCisgICAgICAgICAgICAgICAoX192MTZxaSkgX21tX3NldHplcm9fc2kxMjgoKSwKKyAgICAgICAgICAgICAgIChfX21tYXNrMTYpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2N2dHNlcGkxNl9lcGk4IChfX20xMjhpIF9fTywgX19tbWFzazE2IF9fTSwgX19tMjU2aSBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92c3diMjU2X21hc2sgKChfX3YxNmhpKSBfX0EsCisgICAgICAgICAgICAgICAoX192MTZxaSkgX19PLAorICAgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfY3Z0c2VwaTE2X2VwaTggKF9fbW1hc2sxNiBfX00sIF9fbTI1NmkgX19BKSB7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnN3YjI1Nl9tYXNrICgoX192MTZoaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjE2cWkpIF9tbV9zZXR6ZXJvX3NpMTI4KCksCisgICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2N2dHVzZXBpMTZfZXBpOCAoX19tMTI4aSBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92dXN3YjEyOF9tYXNrICgoX192OGhpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjE2cWkpIF9tbV9zZXR6ZXJvX3NpMTI4KCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jdnR1c2VwaTE2X2VwaTggKF9fbTEyOGkgX19PLCBfX21tYXNrOCBfX00sIF9fbTEyOGkgX19BKSB7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnVzd2IxMjhfbWFzayAoKF9fdjhoaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3YxNnFpKSBfX08sCisgICAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9jdnR1c2VwaTE2X2VwaTggKF9fbW1hc2s4IF9fTSwgX19tMTI4aSBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92dXN3YjEyOF9tYXNrICgoX192OGhpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjE2cWkpIF9tbV9zZXR6ZXJvX3NpMTI4KCksCisgICAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9jdnR1c2VwaTE2X2VwaTggKF9fbTI1NmkgX19BKSB7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnVzd2IyNTZfbWFzayAoKF9fdjE2aGkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192MTZxaSkgX21tX3NldHplcm9fc2kxMjgoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazE2KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jdnR1c2VwaTE2X2VwaTggKF9fbTEyOGkgX19PLCBfX21tYXNrMTYgX19NLCBfX20yNTZpIF9fQSkgeworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3Z1c3diMjU2X21hc2sgKChfX3YxNmhpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjE2cWkpIF9fTywKKyAgICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X2N2dHVzZXBpMTZfZXBpOCAoX19tbWFzazE2IF9fTSwgX19tMjU2aSBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92dXN3YjI1Nl9tYXNrICgoX192MTZoaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3YxNnFpKSBfbW1fc2V0emVyb19zaTEyOCgpLAorICAgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY3Z0ZXBpMTZfZXBpOCAoX19tMTI4aSBfX0EpIHsKKworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3Z3YjEyOF9tYXNrICgoX192OGhpKSBfX0EsCisgICAgICAgICAgICAgICAoX192MTZxaSkgX21tX3NldHplcm9fc2kxMjgoKSwKKyAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfY3Z0ZXBpMTZfZXBpOCAoX19tMTI4aSBfX08sIF9fbW1hc2s4IF9fTSwgX19tMTI4aSBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92d2IxMjhfbWFzayAoKF9fdjhoaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjE2cWkpIF9fTywKKyAgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfY3Z0ZXBpMTZfZXBpOCAoX19tbWFzazggX19NLCBfX20xMjhpIF9fQSkgeworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3Z3YjEyOF9tYXNrICgoX192OGhpKSBfX0EsCisgICAgICAgICAgICAgICAoX192MTZxaSkgX21tX3NldHplcm9fc2kxMjgoKSwKKyAgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jdnRlcGkxNl9zdG9yZXVfZXBpOCAodm9pZCAqIF9fUCwgX19tbWFzazggX19NLCBfX20xMjhpIF9fQSkKK3sKKyAgX19idWlsdGluX2lhMzJfcG1vdndiMTI4bWVtX21hc2sgKChfX3YxNnFpICopIF9fUCwgKF9fdjhoaSkgX19BLCBfX00pOworfQorCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jdnRzZXBpMTZfc3RvcmV1X2VwaTggKHZvaWQgKiBfX1AsIF9fbW1hc2s4IF9fTSwgX19tMTI4aSBfX0EpCit7CisgIF9fYnVpbHRpbl9pYTMyX3Btb3Zzd2IxMjhtZW1fbWFzayAoKF9fdjE2cWkgKikgX19QLCAoX192OGhpKSBfX0EsIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jdnR1c2VwaTE2X3N0b3JldV9lcGk4ICh2b2lkICogX19QLCBfX21tYXNrOCBfX00sIF9fbTEyOGkgX19BKQoreworICBfX2J1aWx0aW5faWEzMl9wbW92dXN3YjEyOG1lbV9tYXNrICgoX192MTZxaSAqKSBfX1AsIChfX3Y4aGkpIF9fQSwgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9jdnRlcGkxNl9lcGk4IChfX20yNTZpIF9fQSkgeworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3Z3YjI1Nl9tYXNrICgoX192MTZoaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjE2cWkpIF9tbV9zZXR6ZXJvX3NpMTI4KCksCisgICAgICAgICAgICAgICAoX19tbWFzazE2KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jdnRlcGkxNl9lcGk4IChfX20xMjhpIF9fTywgX19tbWFzazE2IF9fTSwgX19tMjU2aSBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92d2IyNTZfbWFzayAoKF9fdjE2aGkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3YxNnFpKSBfX08sCisgICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X2N2dGVwaTE2X2VwaTggKF9fbW1hc2sxNiBfX00sIF9fbTI1NmkgX19BKSB7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdndiMjU2X21hc2sgKChfX3YxNmhpKSBfX0EsCisgICAgICAgICAgICAgICAoX192MTZxaSkgX21tX3NldHplcm9fc2kxMjgoKSwKKyAgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jdnRlcGkxNl9zdG9yZXVfZXBpOCAodm9pZCAqIF9fUCwgX19tbWFzazE2IF9fTSwgX19tMjU2aSBfX0EpCit7CisgIF9fYnVpbHRpbl9pYTMyX3Btb3Z3YjI1Nm1lbV9tYXNrICgoX192MTZxaSAqKSBfX1AsIChfX3YxNmhpKSBfX0EsIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jdnRzZXBpMTZfc3RvcmV1X2VwaTggKHZvaWQgKiBfX1AsIF9fbW1hc2sxNiBfX00sIF9fbTI1NmkgX19BKQoreworICBfX2J1aWx0aW5faWEzMl9wbW92c3diMjU2bWVtX21hc2sgKChfX3YxNnFpICopIF9fUCwgKF9fdjE2aGkpIF9fQSwgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2N2dHVzZXBpMTZfc3RvcmV1X2VwaTggKHZvaWQgKiBfX1AsIF9fbW1hc2s4IF9fTSwgX19tMjU2aSBfX0EpCit7CisgIF9fYnVpbHRpbl9pYTMyX3Btb3Z1c3diMjU2bWVtX21hc2sgKChfX3YxNnFpKikgX19QLCAoX192MTZoaSkgX19BLCBfX00pOworfQorc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX211bGhyc19lcGkxNiAoX19tMTI4aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKSB7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG11bGhyc3cxMjhfbWFzayAoKF9fdjhoaSkgX19YLAorICAgICAgICAgICAgICAgKF9fdjhoaSkgX19ZLAorICAgICAgICAgICAgICAgKF9fdjhoaSkgX19XLAorICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X211bGhyc19lcGkxNiAoX19tbWFzazggX19VLCBfX20xMjhpIF9fWCwgX19tMTI4aSBfX1kpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbXVsaHJzdzEyOF9tYXNrICgoX192OGhpKSBfX1gsCisgICAgICAgICAgICAgICAoX192OGhpKSBfX1ksCisgICAgICAgICAgICAgIChfX3Y4aGkpIF9tbV9zZXR6ZXJvX3NpMTI4KCksCisgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19tdWxocnNfZXBpMTYgKF9fbTI1NmkgX19XLCBfX21tYXNrMTYgX19VLCBfX20yNTZpIF9fWCwgX19tMjU2aSBfX1kpIHsKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wbXVsaHJzdzI1Nl9tYXNrICgoX192MTZoaSkgX19YLAorICAgICAgICAgICAgICAgKF9fdjE2aGkpIF9fWSwKKyAgICAgICAgICAgICAgIChfX3YxNmhpKSBfX1csCisgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X211bGhyc19lcGkxNiAoX19tbWFzazE2IF9fVSwgX19tMjU2aSBfX1gsIF9fbTI1NmkgX19ZKSB7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG11bGhyc3cyNTZfbWFzayAoKF9fdjE2aGkpIF9fWCwKKyAgICAgICAgICAgICAgIChfX3YxNmhpKSBfX1ksCisgICAgICAgICAgICAgICAoX192MTZoaSkgX21tMjU2X3NldHplcm9fc2kyNTYoKSwKKyAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19tdWxoaV9lcHUxNiAoX19tMTI4aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EsCisgICAgICAgICAgX19tMTI4aSBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbXVsaHV3MTI4X21hc2sgKChfX3Y4aGkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3Y4aGkpIF9fQiwKKyAgICAgICAgICAgICAgIChfX3Y4aGkpIF9fVywKKyAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9tdWxoaV9lcHUxNiAoX19tbWFzazggX19VLCBfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbXVsaHV3MTI4X21hc2sgKChfX3Y4aGkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3Y4aGkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjhoaSkgX21tX3NldHplcm9fc2kxMjgoKSwKKyAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX211bGhpX2VwdTE2IChfX20yNTZpIF9fVywgX19tbWFzazE2IF9fVSwgX19tMjU2aSBfX0EsCisgICAgICAgX19tMjU2aSBfX0IpIHsKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wbXVsaHV3MjU2X21hc2sgKChfX3YxNmhpKSBfX0EsCisgICAgICAgICAgICAgICAoX192MTZoaSkgX19CLAorICAgICAgICAgICAgICAgKF9fdjE2aGkpIF9fVywKKyAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfbXVsaGlfZXB1MTYgKF9fbW1hc2sxNiBfX1UsIF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikgeworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BtdWxodXcyNTZfbWFzayAoKF9fdjE2aGkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3YxNmhpKSBfX0IsCisgICAgICAgICAgICAgICAoX192MTZoaSkgX21tMjU2X3NldHplcm9fc2kyNTYoKSwKKyAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19tdWxoaV9lcGkxNiAoX19tMTI4aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EsCisgICAgICAgICAgX19tMTI4aSBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbXVsaHcxMjhfbWFzayAoKF9fdjhoaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjhoaSkgX19CLAorICAgICAgICAgICAgICAgKF9fdjhoaSkgX19XLAorICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X211bGhpX2VwaTE2IChfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikgeworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BtdWxodzEyOF9tYXNrICgoX192OGhpKSBfX0EsCisgICAgICAgICAgICAgICAoX192OGhpKSBfX0IsCisgICAgICAgICAgICAgIChfX3Y4aGkpIF9tbV9zZXR6ZXJvX3NpMTI4KCksCisgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19tdWxoaV9lcGkxNiAoX19tMjU2aSBfX1csIF9fbW1hc2sxNiBfX1UsIF9fbTI1NmkgX19BLAorICAgICAgIF9fbTI1NmkgX19CKSB7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG11bGh3MjU2X21hc2sgKChfX3YxNmhpKSBfX0EsCisgICAgICAgICAgICAgICAoX192MTZoaSkgX19CLAorICAgICAgICAgICAgICAgKF9fdjE2aGkpIF9fVywKKyAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfbXVsaGlfZXBpMTYgKF9fbW1hc2sxNiBfX1UsIF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikgeworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BtdWxodzI1Nl9tYXNrICgoX192MTZoaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjE2aGkpIF9fQiwKKyAgICAgICAgICAgICAgIChfX3YxNmhpKSBfbW0yNTZfc2V0emVyb19zaTI1NigpLAorICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX3VucGFja2hpX2VwaTgoX19tMTI4aSBfX1csIF9fbW1hc2sxNiBfX1UsIF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikgeworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfc2VsZWN0Yl8xMjgoKF9fbW1hc2sxNilfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2cWkpX21tX3VucGFja2hpX2VwaTgoX19BLCBfX0IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnFpKV9fVyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfdW5wYWNraGlfZXBpOChfX21tYXNrMTYgX19VLCBfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3NlbGVjdGJfMTI4KChfX21tYXNrMTYpX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnFpKV9tbV91bnBhY2toaV9lcGk4KF9fQSwgX19CKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZxaSlfbW1fc2V0emVyb19zaTEyOCgpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX3VucGFja2hpX2VwaTgoX19tMjU2aSBfX1csIF9fbW1hc2szMiBfX1UsIF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikgeworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfc2VsZWN0Yl8yNTYoKF9fbW1hc2szMilfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjMycWkpX21tMjU2X3VucGFja2hpX2VwaTgoX19BLCBfX0IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YzMnFpKV9fVyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfdW5wYWNraGlfZXBpOChfX21tYXNrMzIgX19VLCBfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpIHsKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3NlbGVjdGJfMjU2KChfX21tYXNrMzIpX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YzMnFpKV9tbTI1Nl91bnBhY2toaV9lcGk4KF9fQSwgX19CKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MzJxaSlfbW0yNTZfc2V0emVyb19zaTI1NigpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX3VucGFja2hpX2VwaTE2KF9fbTEyOGkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikgeworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfc2VsZWN0d18xMjgoKF9fbW1hc2s4KV9fVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGhpKV9tbV91bnBhY2toaV9lcGkxNihfX0EsIF9fQiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhoaSlfX1cpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X3VucGFja2hpX2VwaTE2KF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKSB7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9zZWxlY3R3XzEyOCgoX19tbWFzazgpX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4aGkpX21tX3VucGFja2hpX2VwaTE2KF9fQSwgX19CKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGhpKSBfbW1fc2V0emVyb19zaTEyOCgpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX3VucGFja2hpX2VwaTE2KF9fbTI1NmkgX19XLCBfX21tYXNrMTYgX19VLCBfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpIHsKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3NlbGVjdHdfMjU2KChfX21tYXNrMTYpX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2aGkpX21tMjU2X3VucGFja2hpX2VwaTE2KF9fQSwgX19CKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNmhpKV9fVyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfdW5wYWNraGlfZXBpMTYoX19tbWFzazE2IF9fVSwgX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKSB7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9zZWxlY3R3XzI1NigoX19tbWFzazE2KV9fVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNmhpKV9tbTI1Nl91bnBhY2toaV9lcGkxNihfX0EsIF9fQiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZoaSlfbW0yNTZfc2V0emVyb19zaTI1NigpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX3VucGFja2xvX2VwaTgoX19tMTI4aSBfX1csIF9fbW1hc2sxNiBfX1UsIF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikgeworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfc2VsZWN0Yl8xMjgoKF9fbW1hc2sxNilfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2cWkpX21tX3VucGFja2xvX2VwaTgoX19BLCBfX0IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnFpKV9fVyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfdW5wYWNrbG9fZXBpOChfX21tYXNrMTYgX19VLCBfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3NlbGVjdGJfMTI4KChfX21tYXNrMTYpX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnFpKV9tbV91bnBhY2tsb19lcGk4KF9fQSwgX19CKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZxaSlfbW1fc2V0emVyb19zaTEyOCgpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX3VucGFja2xvX2VwaTgoX19tMjU2aSBfX1csIF9fbW1hc2szMiBfX1UsIF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikgeworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfc2VsZWN0Yl8yNTYoKF9fbW1hc2szMilfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjMycWkpX21tMjU2X3VucGFja2xvX2VwaTgoX19BLCBfX0IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YzMnFpKV9fVyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfdW5wYWNrbG9fZXBpOChfX21tYXNrMzIgX19VLCBfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpIHsKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3NlbGVjdGJfMjU2KChfX21tYXNrMzIpX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YzMnFpKV9tbTI1Nl91bnBhY2tsb19lcGk4KF9fQSwgX19CKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MzJxaSlfbW0yNTZfc2V0emVyb19zaTI1NigpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX3VucGFja2xvX2VwaTE2KF9fbTEyOGkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikgeworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfc2VsZWN0d18xMjgoKF9fbW1hc2s4KV9fVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGhpKV9tbV91bnBhY2tsb19lcGkxNihfX0EsIF9fQiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhoaSlfX1cpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X3VucGFja2xvX2VwaTE2KF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKSB7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9zZWxlY3R3XzEyOCgoX19tbWFzazgpX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4aGkpX21tX3VucGFja2xvX2VwaTE2KF9fQSwgX19CKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGhpKSBfbW1fc2V0emVyb19zaTEyOCgpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX3VucGFja2xvX2VwaTE2KF9fbTI1NmkgX19XLCBfX21tYXNrMTYgX19VLCBfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpIHsKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3NlbGVjdHdfMjU2KChfX21tYXNrMTYpX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2aGkpX21tMjU2X3VucGFja2xvX2VwaTE2KF9fQSwgX19CKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNmhpKV9fVyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfdW5wYWNrbG9fZXBpMTYoX19tbWFzazE2IF9fVSwgX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKSB7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9zZWxlY3R3XzI1NigoX19tbWFzazE2KV9fVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNmhpKV9tbTI1Nl91bnBhY2tsb19lcGkxNihfX0EsIF9fQiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZoaSlfbW0yNTZfc2V0emVyb19zaTI1NigpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2N2dGVwaThfZXBpMTYgKF9fbTEyOGkgX19XLCBfX21tYXNrMzIgX19VLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92c3hidzEyOF9tYXNrICgoX192MTZxaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3Y4aGkpIF9fVywKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfY3Z0ZXBpOF9lcGkxNiAoX19tbWFzazggX19VLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92c3hidzEyOF9tYXNrICgoX192MTZxaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3Y4aGkpCisgICAgICAgICAgICAgICAgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfY3Z0ZXBpOF9lcGkxNiAoX19tMjU2aSBfX1csIF9fbW1hc2szMiBfX1UsIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3Btb3ZzeGJ3MjU2X21hc2sgKChfX3YxNnFpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjE2aGkpIF9fVywKKyAgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X2N2dGVwaThfZXBpMTYgKF9fbW1hc2sxNiBfX1UsIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3Btb3ZzeGJ3MjU2X21hc2sgKChfX3YxNnFpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjE2aGkpCisgICAgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VKTsKK30KKworCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfY3Z0ZXB1OF9lcGkxNiAoX19tMTI4aSBfX1csIF9fbW1hc2szMiBfX1UsIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3Z6eGJ3MTI4X21hc2sgKChfX3YxNnFpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjhoaSkgX19XLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9jdnRlcHU4X2VwaTE2IChfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3Z6eGJ3MTI4X21hc2sgKChfX3YxNnFpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjhoaSkKKyAgICAgICAgICAgICAgICBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jdnRlcHU4X2VwaTE2IChfX20yNTZpIF9fVywgX19tbWFzazMyIF9fVSwgX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG1vdnp4YncyNTZfbWFzayAoKF9fdjE2cWkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192MTZoaSkgX19XLAorICAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfY3Z0ZXB1OF9lcGkxNiAoX19tbWFzazE2IF9fVSwgX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG1vdnp4YncyNTZfbWFzayAoKF9fdjE2cWkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192MTZoaSkKKyAgICAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCisKKyNkZWZpbmUgX21tX2NtcF9lcGk4X21hc2soYSwgYiwgcCkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX21tYXNrMTYpX19idWlsdGluX2lhMzJfY21wYjEyOF9tYXNrKChfX3YxNnFpKShfX20xMjhpKShhKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZxaSkoX19tMTI4aSkoYiksIChpbnQpKHApLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpLTEpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrX2NtcF9lcGk4X21hc2sobSwgYSwgYiwgcCkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX21tYXNrMTYpX19idWlsdGluX2lhMzJfY21wYjEyOF9tYXNrKChfX3YxNnFpKShfX20xMjhpKShhKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZxaSkoX19tMTI4aSkoYiksIChpbnQpKHApLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpKG0pKTsgfSkKKworI2RlZmluZSBfbW1fY21wX2VwdThfbWFzayhhLCBiLCBwKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbW1hc2sxNilfX2J1aWx0aW5faWEzMl91Y21wYjEyOF9tYXNrKChfX3YxNnFpKShfX20xMjhpKShhKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2cWkpKF9fbTEyOGkpKGIpLCAoaW50KShwKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNiktMSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2tfY21wX2VwdThfbWFzayhtLCBhLCBiLCBwKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbW1hc2sxNilfX2J1aWx0aW5faWEzMl91Y21wYjEyOF9tYXNrKChfX3YxNnFpKShfX20xMjhpKShhKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2cWkpKF9fbTEyOGkpKGIpLCAoaW50KShwKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikobSkpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9jbXBfZXBpOF9tYXNrKGEsIGIsIHApIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tbWFzazMyKV9fYnVpbHRpbl9pYTMyX2NtcGIyNTZfbWFzaygoX192MzJxaSkoX19tMjU2aSkoYSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjMycWkpKF9fbTI1NmkpKGIpLCAoaW50KShwKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazMyKS0xKTsgfSkKKworI2RlZmluZSBfbW0yNTZfbWFza19jbXBfZXBpOF9tYXNrKG0sIGEsIGIsIHApIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tbWFzazMyKV9fYnVpbHRpbl9pYTMyX2NtcGIyNTZfbWFzaygoX192MzJxaSkoX19tMjU2aSkoYSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjMycWkpKF9fbTI1NmkpKGIpLCAoaW50KShwKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazMyKShtKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X2NtcF9lcHU4X21hc2soYSwgYiwgcCkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX21tYXNrMzIpX19idWlsdGluX2lhMzJfdWNtcGIyNTZfbWFzaygoX192MzJxaSkoX19tMjU2aSkoYSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YzMnFpKShfX20yNTZpKShiKSwgKGludCkocCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMzIpLTEpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9tYXNrX2NtcF9lcHU4X21hc2sobSwgYSwgYiwgcCkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX21tYXNrMzIpX19idWlsdGluX2lhMzJfdWNtcGIyNTZfbWFzaygoX192MzJxaSkoX19tMjU2aSkoYSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YzMnFpKShfX20yNTZpKShiKSwgKGludCkocCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMzIpKG0pKTsgfSkKKworI2RlZmluZSBfbW1fY21wX2VwaTE2X21hc2soYSwgYiwgcCkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl9jbXB3MTI4X21hc2soKF9fdjhoaSkoX19tMTI4aSkoYSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGhpKShfX20xMjhpKShiKSwgKGludCkocCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrX2NtcF9lcGkxNl9tYXNrKG0sIGEsIGIsIHApIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tbWFzazgpX19idWlsdGluX2lhMzJfY21wdzEyOF9tYXNrKChfX3Y4aGkpKF9fbTEyOGkpKGEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhoaSkoX19tMTI4aSkoYiksIChpbnQpKHApLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShtKSk7IH0pCisKKyNkZWZpbmUgX21tX2NtcF9lcHUxNl9tYXNrKGEsIGIsIHApIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tbWFzazgpX19idWlsdGluX2lhMzJfdWNtcHcxMjhfbWFzaygoX192OGhpKShfX20xMjhpKShhKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGhpKShfX20xMjhpKShiKSwgKGludCkocCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsgfSkKKworI2RlZmluZSBfbW1fbWFza19jbXBfZXB1MTZfbWFzayhtLCBhLCBiLCBwKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX3VjbXB3MTI4X21hc2soKF9fdjhoaSkoX19tMTI4aSkoYSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhoaSkoX19tMTI4aSkoYiksIChpbnQpKHApLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkobSkpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9jbXBfZXBpMTZfbWFzayhhLCBiLCBwKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbW1hc2sxNilfX2J1aWx0aW5faWEzMl9jbXB3MjU2X21hc2soKF9fdjE2aGkpKF9fbTI1NmkpKGEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNmhpKShfX20yNTZpKShiKSwgKGludCkocCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNiktMSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21hc2tfY21wX2VwaTE2X21hc2sobSwgYSwgYiwgcCkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX21tYXNrMTYpX19idWlsdGluX2lhMzJfY21wdzI1Nl9tYXNrKChfX3YxNmhpKShfX20yNTZpKShhKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZoaSkoX19tMjU2aSkoYiksIChpbnQpKHApLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpKG0pKTsgfSkKKworI2RlZmluZSBfbW0yNTZfY21wX2VwdTE2X21hc2soYSwgYiwgcCkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX21tYXNrMTYpX19idWlsdGluX2lhMzJfdWNtcHcyNTZfbWFzaygoX192MTZoaSkoX19tMjU2aSkoYSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNmhpKShfX20yNTZpKShiKSwgKGludCkocCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpLTEpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9tYXNrX2NtcF9lcHUxNl9tYXNrKG0sIGEsIGIsIHApIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tbWFzazE2KV9fYnVpbHRpbl9pYTMyX3VjbXB3MjU2X21hc2soKF9fdjE2aGkpKF9fbTI1NmkpKGEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZoaSkoX19tMjU2aSkoYiksIChpbnQpKHApLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KShtKSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2tfc2h1ZmZsZWhpX2VwaTE2KFcsIFUsIEEsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3NlbGVjdHdfMTI4KChfX21tYXNrOCkoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhoaSlfbW1fc2h1ZmZsZWhpX2VwaTE2KChBKSwgKGltbSkpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4aGkpKF9fbTEyOGkpKFcpKTsgfSkKKworI2RlZmluZSBfbW1fbWFza3pfc2h1ZmZsZWhpX2VwaTE2KFUsIEEsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3NlbGVjdHdfMTI4KChfX21tYXNrOCkoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhoaSlfbW1fc2h1ZmZsZWhpX2VwaTE2KChBKSwgKGltbSkpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4aGkpX21tX3NldHplcm9faGkoKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21hc2tfc2h1ZmZsZWhpX2VwaTE2KFcsIFUsIEEsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3NlbGVjdHdfMjU2KChfX21tYXNrMTYpKFUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNmhpKV9tbTI1Nl9zaHVmZmxlaGlfZXBpMTYoKEEpLCAoaW1tKSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2aGkpKF9fbTI1NmkpKFcpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfbWFza3pfc2h1ZmZsZWhpX2VwaTE2KFUsIEEsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3NlbGVjdHdfMjU2KChfX21tYXNrMTYpKFUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNmhpKV9tbTI1Nl9zaHVmZmxlaGlfZXBpMTYoKEEpLCAoaW1tKSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2aGkpX21tMjU2X3NldHplcm9fc2kyNTYoKSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2tfc2h1ZmZsZWxvX2VwaTE2KFcsIFUsIEEsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3NlbGVjdHdfMTI4KChfX21tYXNrOCkoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhoaSlfbW1fc2h1ZmZsZWxvX2VwaTE2KChBKSwgKGltbSkpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4aGkpKF9fbTEyOGkpKFcpKTsgfSkKKworI2RlZmluZSBfbW1fbWFza3pfc2h1ZmZsZWxvX2VwaTE2KFUsIEEsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3NlbGVjdHdfMTI4KChfX21tYXNrOCkoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhoaSlfbW1fc2h1ZmZsZWxvX2VwaTE2KChBKSwgKGltbSkpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4aGkpX21tX3NldHplcm9faGkoKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21hc2tfc2h1ZmZsZWxvX2VwaTE2KFcsIFUsIEEsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3NlbGVjdHdfMjU2KChfX21tYXNrMTYpKFUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNmhpKV9tbTI1Nl9zaHVmZmxlbG9fZXBpMTYoKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGltbSkpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNmhpKShfX20yNTZpKShXKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21hc2t6X3NodWZmbGVsb19lcGkxNihVLCBBLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9zZWxlY3R3XzI1NigoX19tbWFzazE2KShVKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZoaSlfbW0yNTZfc2h1ZmZsZWxvX2VwaTE2KChBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbW0pKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZoaSlfbW0yNTZfc2V0emVyb19zaTI1NigpKTsgfSkKKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9zbGx2X2VwaTE2IChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcHNsbHYxNmhpX21hc2sgKChfX3YxNmhpKSBfX0EsCisgICAgICAgICAgICAgIChfX3YxNmhpKSBfX0IsCisgICAgICAgICAgICAgIChfX3YxNmhpKQorICAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2sxNikgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfc2xsdl9lcGkxNiAoX19tMjU2aSBfX1csIF9fbW1hc2sxNiBfX1UsIF9fbTI1NmkgX19BLAorICAgICAgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcHNsbHYxNmhpX21hc2sgKChfX3YxNmhpKSBfX0EsCisgICAgICAgICAgICAgIChfX3YxNmhpKSBfX0IsCisgICAgICAgICAgICAgIChfX3YxNmhpKSBfX1csCisgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfc2xsdl9lcGkxNiAoX19tbWFzazE2IF9fVSwgX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BzbGx2MTZoaV9tYXNrICgoX192MTZoaSkgX19BLAorICAgICAgICAgICAgICAoX192MTZoaSkgX19CLAorICAgICAgICAgICAgICAoX192MTZoaSkKKyAgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc2xsdl9lcGkxNiAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BzbGx2OGhpX21hc2sgKChfX3Y4aGkpIF9fQSwKKyAgICAgICAgICAgICAoX192OGhpKSBfX0IsCisgICAgICAgICAgICAgKF9fdjhoaSkKKyAgICAgICAgICAgICBfbW1fc2V0emVyb19oaSAoKSwKKyAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX3NsbHZfZXBpMTYgKF9fbTEyOGkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BLAorICAgICAgICAgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcHNsbHY4aGlfbWFzayAoKF9fdjhoaSkgX19BLAorICAgICAgICAgICAgIChfX3Y4aGkpIF9fQiwKKyAgICAgICAgICAgICAoX192OGhpKSBfX1csCisgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X3NsbHZfZXBpMTYgKF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BzbGx2OGhpX21hc2sgKChfX3Y4aGkpIF9fQSwKKyAgICAgICAgICAgICAoX192OGhpKSBfX0IsCisgICAgICAgICAgICAgKF9fdjhoaSkKKyAgICAgICAgICAgICBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19zbGxfZXBpMTYgKF9fbTEyOGkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BLAorICAgICAgICBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wc2xsdzEyOF9tYXNrICgoX192OGhpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjhoaSkgX19CLAorICAgICAgICAgICAgIChfX3Y4aGkpIF9fVywKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfc2xsX2VwaTE2IChfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wc2xsdzEyOF9tYXNrICgoX192OGhpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjhoaSkgX19CLAorICAgICAgICAgICAgIChfX3Y4aGkpCisgICAgICAgICAgICAgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfc2xsX2VwaTE2IChfX20yNTZpIF9fVywgX19tbWFzazE2IF9fVSwgX19tMjU2aSBfX0EsCisgICAgICAgICAgIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BzbGx3MjU2X21hc2sgKChfX3YxNmhpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjhoaSkgX19CLAorICAgICAgICAgICAgIChfX3YxNmhpKSBfX1csCisgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9zbGxfZXBpMTYgKF9fbW1hc2sxNiBfX1UsIF9fbTI1NmkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wc2xsdzI1Nl9tYXNrICgoX192MTZoaSkgX19BLAorICAgICAgICAgICAgIChfX3Y4aGkpIF9fQiwKKyAgICAgICAgICAgICAoX192MTZoaSkKKyAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCisjZGVmaW5lIF9tbV9tYXNrX3NsbGlfZXBpMTYoVywgVSwgQSwgQikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BzbGx3aTEyOF9tYXNrKChfX3Y4aGkpKF9fbTEyOGkpKEEpLCAoaW50KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGhpKShfX20xMjhpKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW1fbWFza3pfc2xsaV9lcGkxNihVLCBBLCBCKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHNsbHdpMTI4X21hc2soKF9fdjhoaSkoX19tMTI4aSkoQSksIChpbnQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4aGkpX21tX3NldHplcm9fc2kxMjgoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfbWFza19zbGxpX2VwaTE2KFcsIFUsIEEsIEIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wc2xsd2kyNTZfbWFzaygoX192MTZoaSkoX19tMjU2aSkoQSksIChpbnQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNmhpKShfX20yNTZpKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KShVKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21hc2t6X3NsbGlfZXBpMTYoVSwgQSwgQikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BzbGx3aTI1Nl9tYXNrKChfX3YxNmhpKShfX20yNTZpKShBKSwgKGludCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2aGkpX21tMjU2X3NldHplcm9fc2kyNTYoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KShVKSk7IH0pCisKKworCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3NybHZfZXBpMTYgKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wc3JsdjE2aGlfbWFzayAoKF9fdjE2aGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjE2aGkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjE2aGkpCisgICAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2ICgpLAorICAgICAgICAgICAgICAoX19tbWFzazE2KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19zcmx2X2VwaTE2IChfX20yNTZpIF9fVywgX19tbWFzazE2IF9fVSwgX19tMjU2aSBfX0EsCisgICAgICBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wc3JsdjE2aGlfbWFzayAoKF9fdjE2aGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjE2aGkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjE2aGkpIF9fVywKKyAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9zcmx2X2VwaTE2IChfX21tYXNrMTYgX19VLCBfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcHNybHYxNmhpX21hc2sgKChfX3YxNmhpKSBfX0EsCisgICAgICAgICAgICAgIChfX3YxNmhpKSBfX0IsCisgICAgICAgICAgICAgIChfX3YxNmhpKQorICAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zcmx2X2VwaTE2IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcHNybHY4aGlfbWFzayAoKF9fdjhoaSkgX19BLAorICAgICAgICAgICAgIChfX3Y4aGkpIF9fQiwKKyAgICAgICAgICAgICAoX192OGhpKQorICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX2hpICgpLAorICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfc3Jsdl9lcGkxNiAoX19tMTI4aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EsCisgICAgICAgICBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wc3JsdjhoaV9tYXNrICgoX192OGhpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjhoaSkgX19CLAorICAgICAgICAgICAgIChfX3Y4aGkpIF9fVywKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfc3Jsdl9lcGkxNiAoX19tbWFzazggX19VLCBfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcHNybHY4aGlfbWFzayAoKF9fdjhoaSkgX19BLAorICAgICAgICAgICAgIChfX3Y4aGkpIF9fQiwKKyAgICAgICAgICAgICAoX192OGhpKQorICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9zcmF2X2VwaTE2IChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcHNyYXYxNmhpX21hc2sgKChfX3YxNmhpKSBfX0EsCisgICAgICAgICAgICAgIChfX3YxNmhpKSBfX0IsCisgICAgICAgICAgICAgIChfX3YxNmhpKQorICAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2sxNikgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfc3Jhdl9lcGkxNiAoX19tMjU2aSBfX1csIF9fbW1hc2sxNiBfX1UsIF9fbTI1NmkgX19BLAorICAgICAgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcHNyYXYxNmhpX21hc2sgKChfX3YxNmhpKSBfX0EsCisgICAgICAgICAgICAgIChfX3YxNmhpKSBfX0IsCisgICAgICAgICAgICAgIChfX3YxNmhpKSBfX1csCisgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfc3Jhdl9lcGkxNiAoX19tbWFzazE2IF9fVSwgX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BzcmF2MTZoaV9tYXNrICgoX192MTZoaSkgX19BLAorICAgICAgICAgICAgICAoX192MTZoaSkgX19CLAorICAgICAgICAgICAgICAoX192MTZoaSkKKyAgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc3Jhdl9lcGkxNiAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BzcmF2OGhpX21hc2sgKChfX3Y4aGkpIF9fQSwKKyAgICAgICAgICAgICAoX192OGhpKSBfX0IsCisgICAgICAgICAgICAgKF9fdjhoaSkKKyAgICAgICAgICAgICBfbW1fc2V0emVyb19oaSAoKSwKKyAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX3NyYXZfZXBpMTYgKF9fbTEyOGkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BLAorICAgICAgICAgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcHNyYXY4aGlfbWFzayAoKF9fdjhoaSkgX19BLAorICAgICAgICAgICAgIChfX3Y4aGkpIF9fQiwKKyAgICAgICAgICAgICAoX192OGhpKSBfX1csCisgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X3NyYXZfZXBpMTYgKF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BzcmF2OGhpX21hc2sgKChfX3Y4aGkpIF9fQSwKKyAgICAgICAgICAgICAoX192OGhpKSBfX0IsCisgICAgICAgICAgICAgKF9fdjhoaSkKKyAgICAgICAgICAgICBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19zcmFfZXBpMTYgKF9fbTEyOGkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BLAorICAgICAgICBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wc3JhdzEyOF9tYXNrICgoX192OGhpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjhoaSkgX19CLAorICAgICAgICAgICAgIChfX3Y4aGkpIF9fVywKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfc3JhX2VwaTE2IChfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wc3JhdzEyOF9tYXNrICgoX192OGhpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjhoaSkgX19CLAorICAgICAgICAgICAgIChfX3Y4aGkpCisgICAgICAgICAgICAgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfc3JhX2VwaTE2IChfX20yNTZpIF9fVywgX19tbWFzazE2IF9fVSwgX19tMjU2aSBfX0EsCisgICAgICAgICAgIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BzcmF3MjU2X21hc2sgKChfX3YxNmhpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjhoaSkgX19CLAorICAgICAgICAgICAgIChfX3YxNmhpKSBfX1csCisgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9zcmFfZXBpMTYgKF9fbW1hc2sxNiBfX1UsIF9fbTI1NmkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wc3JhdzI1Nl9tYXNrICgoX192MTZoaSkgX19BLAorICAgICAgICAgICAgIChfX3Y4aGkpIF9fQiwKKyAgICAgICAgICAgICAoX192MTZoaSkKKyAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCisjZGVmaW5lIF9tbV9tYXNrX3NyYWlfZXBpMTYoVywgVSwgQSwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHNyYXdpMTI4X21hc2soKF9fdjhoaSkoX19tMTI4aSkoQSksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhoaSkoX19tMTI4aSkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2t6X3NyYWlfZXBpMTYoVSwgQSwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHNyYXdpMTI4X21hc2soKF9fdjhoaSkoX19tMTI4aSkoQSksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhoaSlfbW1fc2V0emVyb19zaTEyOCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSkpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9tYXNrX3NyYWlfZXBpMTYoVywgVSwgQSwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHNyYXdpMjU2X21hc2soKF9fdjE2aGkpKF9fbTI1NmkpKEEpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNmhpKShfX20yNTZpKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KShVKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21hc2t6X3NyYWlfZXBpMTYoVSwgQSwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHNyYXdpMjU2X21hc2soKF9fdjE2aGkpKF9fbTI1NmkpKEEpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNmhpKV9tbTI1Nl9zZXR6ZXJvX3NpMjU2KCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikoVSkpOyB9KQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfc3JsX2VwaTE2IChfX20xMjhpIF9fVywgX19tbWFzazggX19VLCBfX20xMjhpIF9fQSwKKyAgICAgICAgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcHNybHcxMjhfbWFzayAoKF9fdjhoaSkgX19BLAorICAgICAgICAgICAgIChfX3Y4aGkpIF9fQiwKKyAgICAgICAgICAgICAoX192OGhpKSBfX1csCisgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X3NybF9lcGkxNiAoX19tbWFzazggX19VLCBfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcHNybHcxMjhfbWFzayAoKF9fdjhoaSkgX19BLAorICAgICAgICAgICAgIChfX3Y4aGkpIF9fQiwKKyAgICAgICAgICAgICAoX192OGhpKQorICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX3NybF9lcGkxNiAoX19tMjU2aSBfX1csIF9fbW1hc2sxNiBfX1UsIF9fbTI1NmkgX19BLAorICAgICAgICAgICBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wc3JsdzI1Nl9tYXNrICgoX192MTZoaSkgX19BLAorICAgICAgICAgICAgIChfX3Y4aGkpIF9fQiwKKyAgICAgICAgICAgICAoX192MTZoaSkgX19XLAorICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfc3JsX2VwaTE2IChfX21tYXNrMTYgX19VLCBfX20yNTZpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcHNybHcyNTZfbWFzayAoKF9fdjE2aGkpIF9fQSwKKyAgICAgICAgICAgICAoX192OGhpKSBfX0IsCisgICAgICAgICAgICAgKF9fdjE2aGkpCisgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VKTsKK30KKworI2RlZmluZSBfbW1fbWFza19zcmxpX2VwaTE2KFcsIFUsIEEsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3Bzcmx3aTEyOF9tYXNrKChfX3Y4aGkpKF9fbTEyOGkpKEEpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4aGkpKF9fbTEyOGkpKFcpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSkpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrel9zcmxpX2VwaTE2KFUsIEEsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3Bzcmx3aTEyOF9tYXNrKChfX3Y4aGkpKF9fbTEyOGkpKEEpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4aGkpX21tX3NldHplcm9fc2kxMjgoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfbWFza19zcmxpX2VwaTE2KFcsIFUsIEEsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3Bzcmx3aTI1Nl9tYXNrKChfX3YxNmhpKShfX20yNTZpKShBKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZoaSkoX19tMjU2aSkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikoVSkpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9tYXNrel9zcmxpX2VwaTE2KFUsIEEsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3Bzcmx3aTI1Nl9tYXNrKChfX3YxNmhpKShfX20yNTZpKShBKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZoaSlfbW0yNTZfc2V0emVyb19zaTI1NigpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpKFUpKTsgfSkKKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX21vdl9lcGkxNiAoX19tMTI4aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfc2VsZWN0d18xMjggKChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAgIChfX3Y4aGkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192OGhpKSBfX1cpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X21vdl9lcGkxNiAoX19tbWFzazggX19VLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9zZWxlY3R3XzEyOCAoKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgICAgICAgKF9fdjhoaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3Y4aGkpIF9tbV9zZXR6ZXJvX2hpICgpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX21vdl9lcGkxNiAoX19tMjU2aSBfX1csIF9fbW1hc2sxNiBfX1UsIF9fbTI1NmkgX19BKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3NlbGVjdHdfMjU2ICgoX19tbWFzazE2KSBfX1UsCisgICAgICAgICAgICAgICAgKF9fdjE2aGkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192MTZoaSkgX19XKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9tb3ZfZXBpMTYgKF9fbW1hc2sxNiBfX1UsIF9fbTI1NmkgX19BKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3NlbGVjdHdfMjU2ICgoX19tbWFzazE2KSBfX1UsCisgICAgICAgICAgICAgICAgKF9fdjE2aGkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192MTZoaSkgX21tMjU2X3NldHplcm9fc2kyNTYgKCkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfbW92X2VwaTggKF9fbTEyOGkgX19XLCBfX21tYXNrMTYgX19VLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9zZWxlY3RiXzEyOCAoKF9fbW1hc2sxNikgX19VLAorICAgICAgICAgICAgICAgIChfX3YxNnFpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjE2cWkpIF9fVyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfbW92X2VwaTggKF9fbW1hc2sxNiBfX1UsIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3NlbGVjdGJfMTI4ICgoX19tbWFzazE2KSBfX1UsCisgICAgICAgICAgICAgICAgKF9fdjE2cWkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192MTZxaSkgX21tX3NldHplcm9faGkgKCkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfbW92X2VwaTggKF9fbTI1NmkgX19XLCBfX21tYXNrMzIgX19VLCBfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9zZWxlY3RiXzI1NiAoKF9fbW1hc2szMikgX19VLAorICAgICAgICAgICAgICAgIChfX3YzMnFpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjMycWkpIF9fVyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfbW92X2VwaTggKF9fbW1hc2szMiBfX1UsIF9fbTI1NmkgX19BKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3NlbGVjdGJfMjU2ICgoX19tbWFzazMyKSBfX1UsCisgICAgICAgICAgICAgICAgKF9fdjMycWkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192MzJxaSkgX21tMjU2X3NldHplcm9fc2kyNTYgKCkpOworfQorCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19zZXQxX2VwaTggKF9fbTEyOGkgX19PLCBfX21tYXNrMTYgX19NLCBjaGFyIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wYnJvYWRjYXN0YjEyOF9ncHJfbWFzayAoX19BLAorICAgICAgICAgICAgICAgICAoX192MTZxaSkgX19PLAorICAgICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X3NldDFfZXBpOCAoX19tbWFzazE2IF9fTSwgY2hhciBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcGJyb2FkY2FzdGIxMjhfZ3ByX21hc2sgKF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjE2cWkpCisgICAgICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfc2V0MV9lcGk4IChfX20yNTZpIF9fTywgX19tbWFzazMyIF9fTSwgY2hhciBfX0EpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcGJyb2FkY2FzdGIyNTZfZ3ByX21hc2sgKF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjMycWkpIF9fTywKKyAgICAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9zZXQxX2VwaTggKF9fbW1hc2szMiBfX00sIGNoYXIgX19BKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3Bicm9hZGNhc3RiMjU2X2dwcl9tYXNrIChfX0EsCisgICAgICAgICAgICAgICAgIChfX3YzMnFpKQorICAgICAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2xvYWR1X2VwaTE2IChfX20xMjhpIF9fVywgX19tbWFzazggX19VLCB2b2lkIGNvbnN0ICpfX1ApCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfbG9hZGRxdWhpMTI4X21hc2sgKChfX3Y4aGkgKikgX19QLAorICAgICAgICAgICAgICAgICAoX192OGhpKSBfX1csCisgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9sb2FkdV9lcGkxNiAoX19tbWFzazggX19VLCB2b2lkIGNvbnN0ICpfX1ApCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfbG9hZGRxdWhpMTI4X21hc2sgKChfX3Y4aGkgKikgX19QLAorICAgICAgICAgICAgICAgICAoX192OGhpKQorICAgICAgICAgICAgICAgICBfbW1fc2V0emVyb19oaSAoKSwKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfbG9hZHVfZXBpMTYgKF9fbTI1NmkgX19XLCBfX21tYXNrMTYgX19VLCB2b2lkIGNvbnN0ICpfX1ApCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfbG9hZGRxdWhpMjU2X21hc2sgKChfX3YxNmhpICopIF9fUCwKKyAgICAgICAgICAgICAgICAgKF9fdjE2aGkpIF9fVywKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9sb2FkdV9lcGkxNiAoX19tbWFzazE2IF9fVSwgdm9pZCBjb25zdCAqX19QKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX2xvYWRkcXVoaTI1Nl9tYXNrICgoX192MTZoaSAqKSBfX1AsCisgICAgICAgICAgICAgICAgIChfX3YxNmhpKQorICAgICAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2xvYWR1X2VwaTggKF9fbTEyOGkgX19XLCBfX21tYXNrMTYgX19VLCB2b2lkIGNvbnN0ICpfX1ApCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfbG9hZGRxdXFpMTI4X21hc2sgKChfX3YxNnFpICopIF9fUCwKKyAgICAgICAgICAgICAgICAgKF9fdjE2cWkpIF9fVywKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9sb2FkdV9lcGk4IChfX21tYXNrMTYgX19VLCB2b2lkIGNvbnN0ICpfX1ApCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfbG9hZGRxdXFpMTI4X21hc2sgKChfX3YxNnFpICopIF9fUCwKKyAgICAgICAgICAgICAgICAgKF9fdjE2cWkpCisgICAgICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfbG9hZHVfZXBpOCAoX19tMjU2aSBfX1csIF9fbW1hc2szMiBfX1UsIHZvaWQgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9sb2FkZHF1cWkyNTZfbWFzayAoKF9fdjMycWkgKikgX19QLAorICAgICAgICAgICAgICAgICAoX192MzJxaSkgX19XLAorICAgICAgICAgICAgICAgICAoX19tbWFzazMyKSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X2xvYWR1X2VwaTggKF9fbW1hc2szMiBfX1UsIHZvaWQgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9sb2FkZHF1cWkyNTZfbWFzayAoKF9fdjMycWkgKikgX19QLAorICAgICAgICAgICAgICAgICAoX192MzJxaSkKKyAgICAgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgICAgIChfX21tYXNrMzIpIF9fVSk7Cit9CitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfc3RvcmV1X2VwaTE2ICh2b2lkICpfX1AsIF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EpCit7CisgIF9fYnVpbHRpbl9pYTMyX3N0b3JlZHF1aGkxMjhfbWFzayAoKF9fdjhoaSAqKSBfX1AsCisgICAgICAgICAgICAgKF9fdjhoaSkgX19BLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX3N0b3JldV9lcGkxNiAodm9pZCAqX19QLCBfX21tYXNrMTYgX19VLCBfX20yNTZpIF9fQSkKK3sKKyAgX19idWlsdGluX2lhMzJfc3RvcmVkcXVoaTI1Nl9tYXNrICgoX192MTZoaSAqKSBfX1AsCisgICAgICAgICAgICAgKF9fdjE2aGkpIF9fQSwKKyAgICAgICAgICAgICAoX19tbWFzazE2KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfc3RvcmV1X2VwaTggKHZvaWQgKl9fUCwgX19tbWFzazE2IF9fVSwgX19tMTI4aSBfX0EpCit7CisgIF9fYnVpbHRpbl9pYTMyX3N0b3JlZHF1cWkxMjhfbWFzayAoKF9fdjE2cWkgKikgX19QLAorICAgICAgICAgICAgIChfX3YxNnFpKSBfX0EsCisgICAgICAgICAgICAgKF9fbW1hc2sxNikgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX3N0b3JldV9lcGk4ICh2b2lkICpfX1AsIF9fbW1hc2szMiBfX1UsIF9fbTI1NmkgX19BKQoreworICBfX2J1aWx0aW5faWEzMl9zdG9yZWRxdXFpMjU2X21hc2sgKChfX3YzMnFpICopIF9fUCwKKyAgICAgICAgICAgICAoX192MzJxaSkgX19BLAorICAgICAgICAgICAgIChfX21tYXNrMzIpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2sxNiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV90ZXN0X2VwaThfbWFzayAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbW1hc2sxNikgX19idWlsdGluX2lhMzJfcHRlc3RtYjEyOCAoKF9fdjE2cWkpIF9fQSwKKyAgICAgICAgICAgIChfX3YxNnFpKSBfX0IsCisgICAgICAgICAgICAoX19tbWFzazE2KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2sxNiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX3Rlc3RfZXBpOF9tYXNrIChfX21tYXNrMTYgX19VLCBfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tbWFzazE2KSBfX2J1aWx0aW5faWEzMl9wdGVzdG1iMTI4ICgoX192MTZxaSkgX19BLAorICAgICAgICAgICAgKF9fdjE2cWkpIF9fQiwgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazMyIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3Rlc3RfZXBpOF9tYXNrIChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tbWFzazMyKSBfX2J1aWx0aW5faWEzMl9wdGVzdG1iMjU2ICgoX192MzJxaSkgX19BLAorICAgICAgICAgICAgKF9fdjMycWkpIF9fQiwKKyAgICAgICAgICAgIChfX21tYXNrMzIpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazMyIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfdGVzdF9lcGk4X21hc2sgKF9fbW1hc2szMiBfX1UsIF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX21tYXNrMzIpIF9fYnVpbHRpbl9pYTMyX3B0ZXN0bWIyNTYgKChfX3YzMnFpKSBfX0EsCisgICAgICAgICAgICAoX192MzJxaSkgX19CLCBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV90ZXN0X2VwaTE2X21hc2sgKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX21tYXNrOCkgX19idWlsdGluX2lhMzJfcHRlc3RtdzEyOCAoKF9fdjhoaSkgX19BLAorICAgICAgICAgICAgICAgICAoX192OGhpKSBfX0IsCisgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX3Rlc3RfZXBpMTZfbWFzayAoX19tbWFzazggX19VLCBfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tbWFzazgpIF9fYnVpbHRpbl9pYTMyX3B0ZXN0bXcxMjggKChfX3Y4aGkpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjhoaSkgX19CLCBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfdGVzdF9lcGkxNl9tYXNrIChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tbWFzazE2KSBfX2J1aWx0aW5faWEzMl9wdGVzdG13MjU2ICgoX192MTZoaSkgX19BLAorICAgICAgICAgICAgKF9fdjE2aGkpIF9fQiwKKyAgICAgICAgICAgIChfX21tYXNrMTYpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazE2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfdGVzdF9lcGkxNl9tYXNrIChfX21tYXNrMTYgX19VLCBfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tbWFzazE2KSBfX2J1aWx0aW5faWEzMl9wdGVzdG13MjU2ICgoX192MTZoaSkgX19BLAorICAgICAgICAgICAgKF9fdjE2aGkpIF9fQiwgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazE2IF9fREVGQVVMVF9GTl9BVFRSUworX21tX3Rlc3RuX2VwaThfbWFzayAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbW1hc2sxNikgX19idWlsdGluX2lhMzJfcHRlc3RubWIxMjggKChfX3YxNnFpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjE2cWkpIF9fQiwKKyAgICAgICAgICAgICAoX19tbWFzazE2KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2sxNiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX3Rlc3RuX2VwaThfbWFzayAoX19tbWFzazE2IF9fVSwgX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbW1hc2sxNikgX19idWlsdGluX2lhMzJfcHRlc3RubWIxMjggKChfX3YxNnFpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjE2cWkpIF9fQiwgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazMyIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3Rlc3RuX2VwaThfbWFzayAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbW1hc2szMikgX19idWlsdGluX2lhMzJfcHRlc3RubWIyNTYgKChfX3YzMnFpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjMycWkpIF9fQiwKKyAgICAgICAgICAgICAoX19tbWFzazMyKSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2szMiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX3Rlc3RuX2VwaThfbWFzayAoX19tbWFzazMyIF9fVSwgX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbW1hc2szMikgX19idWlsdGluX2lhMzJfcHRlc3RubWIyNTYgKChfX3YzMnFpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjMycWkpIF9fQiwgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fdGVzdG5fZXBpMTZfbWFzayAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbW1hc2s4KSBfX2J1aWx0aW5faWEzMl9wdGVzdG5tdzEyOCAoKF9fdjhoaSkgX19BLAorICAgICAgICAgICAgKF9fdjhoaSkgX19CLAorICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfdGVzdG5fZXBpMTZfbWFzayAoX19tbWFzazggX19VLCBfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tbWFzazgpIF9fYnVpbHRpbl9pYTMyX3B0ZXN0bm13MTI4ICgoX192OGhpKSBfX0EsCisgICAgICAgICAgICAoX192OGhpKSBfX0IsIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2sxNiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl90ZXN0bl9lcGkxNl9tYXNrIChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tbWFzazE2KSBfX2J1aWx0aW5faWEzMl9wdGVzdG5tdzI1NiAoKF9fdjE2aGkpIF9fQSwKKyAgICAgICAgICAgICAoX192MTZoaSkgX19CLAorICAgICAgICAgICAgIChfX21tYXNrMTYpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazE2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfdGVzdG5fZXBpMTZfbWFzayAoX19tbWFzazE2IF9fVSwgX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbW1hc2sxNikgX19idWlsdGluX2lhMzJfcHRlc3RubXcyNTYgKChfX3YxNmhpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjE2aGkpIF9fQiwgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazE2IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21vdmVwaThfbWFzayAoX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tbWFzazE2KSBfX2J1aWx0aW5faWEzMl9jdnRiMm1hc2sxMjggKChfX3YxNnFpKSBfX0EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrMzIgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbW92ZXBpOF9tYXNrIChfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX21tYXNrMzIpIF9fYnVpbHRpbl9pYTMyX2N2dGIybWFzazI1NiAoKF9fdjMycWkpIF9fQSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21vdmVwaTE2X21hc2sgKF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbW1hc2s4KSBfX2J1aWx0aW5faWEzMl9jdnR3Mm1hc2sxMjggKChfX3Y4aGkpIF9fQSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2sxNiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tb3ZlcGkxNl9tYXNrIChfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX21tYXNrMTYpIF9fYnVpbHRpbl9pYTMyX2N2dHcybWFzazI1NiAoKF9fdjE2aGkpIF9fQSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbW92bV9lcGk4IChfX21tYXNrMTYgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2N2dG1hc2syYjEyOCAoX19BKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tb3ZtX2VwaTggKF9fbW1hc2szMiBfX0EpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfY3Z0bWFzazJiMjU2IChfX0EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21vdm1fZXBpMTYgKF9fbW1hc2s4IF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9jdnRtYXNrMncxMjggKF9fQSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbW92bV9lcGkxNiAoX19tbWFzazE2IF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9jdnRtYXNrMncyNTYgKF9fQSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19icm9hZGNhc3RiX2VwaTggKF9fbTEyOGkgX19PLCBfX21tYXNrMTYgX19NLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3NlbGVjdGJfMTI4KF9fTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnFpKSBfbW1fYnJvYWRjYXN0Yl9lcGk4KF9fQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZxaSkgX19PKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9icm9hZGNhc3RiX2VwaTggKF9fbW1hc2sxNiBfX00sIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfc2VsZWN0Yl8xMjgoX19NLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2cWkpIF9tbV9icm9hZGNhc3RiX2VwaTgoX19BKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnFpKSBfbW1fc2V0emVyb19zaTEyOCgpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2Jyb2FkY2FzdGJfZXBpOCAoX19tMjU2aSBfX08sIF9fbW1hc2szMiBfX00sIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfc2VsZWN0Yl8yNTYoX19NLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjMycWkpIF9tbTI1Nl9icm9hZGNhc3RiX2VwaTgoX19BKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YzMnFpKSBfX08pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X2Jyb2FkY2FzdGJfZXBpOCAoX19tbWFzazMyIF9fTSwgX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9zZWxlY3RiXzI1NihfX00sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MzJxaSkgX21tMjU2X2Jyb2FkY2FzdGJfZXBpOChfX0EpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjMycWkpIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2KCkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfYnJvYWRjYXN0d19lcGkxNiAoX19tMTI4aSBfX08sIF9fbW1hc2s4IF9fTSwgX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9zZWxlY3R3XzEyOChfX00sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGhpKSBfbW1fYnJvYWRjYXN0d19lcGkxNihfX0EpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhoaSkgX19PKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9icm9hZGNhc3R3X2VwaTE2IChfX21tYXNrOCBfX00sIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfc2VsZWN0d18xMjgoX19NLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhoaSkgX21tX2Jyb2FkY2FzdHdfZXBpMTYoX19BKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4aGkpIF9tbV9zZXR6ZXJvX3NpMTI4KCkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfYnJvYWRjYXN0d19lcGkxNiAoX19tMjU2aSBfX08sIF9fbW1hc2sxNiBfX00sIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfc2VsZWN0d18yNTYoX19NLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2aGkpIF9tbTI1Nl9icm9hZGNhc3R3X2VwaTE2KF9fQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZoaSkgX19PKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9icm9hZGNhc3R3X2VwaTE2IChfX21tYXNrMTYgX19NLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3NlbGVjdHdfMjU2KF9fTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNmhpKSBfbW0yNTZfYnJvYWRjYXN0d19lcGkxNihfX0EpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2aGkpIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2KCkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfc2V0MV9lcGkxNiAoX19tMjU2aSBfX08sIF9fbW1hc2sxNiBfX00sIHNob3J0IF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wYnJvYWRjYXN0dzI1Nl9ncHJfbWFzayAoX19BLAorICAgICAgICAgICAgICAgICAoX192MTZoaSkgX19PLAorICAgICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X3NldDFfZXBpMTYgKF9fbW1hc2sxNiBfX00sIHNob3J0IF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wYnJvYWRjYXN0dzI1Nl9ncHJfbWFzayAoX19BLAorICAgICAgICAgICAgICAgICAoX192MTZoaSkgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19zZXQxX2VwaTE2IChfX20xMjhpIF9fTywgX19tbWFzazggX19NLCBzaG9ydCBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcGJyb2FkY2FzdHcxMjhfZ3ByX21hc2sgKF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjhoaSkgX19PLAorICAgICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X3NldDFfZXBpMTYgKF9fbW1hc2s4IF9fTSwgc2hvcnQgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Bicm9hZGNhc3R3MTI4X2dwcl9tYXNrIChfX0EsCisgICAgICAgICAgICAgICAgIChfX3Y4aGkpIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3Blcm11dGV4dmFyX2VwaTE2IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcGVybXZhcmhpMTI4X21hc2sgKChfX3Y4aGkpIF9fQiwKKyAgICAgICAgICAgICAgICAgKF9fdjhoaSkgX19BLAorICAgICAgICAgICAgICAgICAoX192OGhpKSBfbW1fdW5kZWZpbmVkX3NpMTI4ICgpLAorICAgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9wZXJtdXRleHZhcl9lcGkxNiAoX19tbWFzazggX19NLCBfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcGVybXZhcmhpMTI4X21hc2sgKChfX3Y4aGkpIF9fQiwKKyAgICAgICAgICAgICAgICAgKF9fdjhoaSkgX19BLAorICAgICAgICAgICAgICAgICAoX192OGhpKSBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfcGVybXV0ZXh2YXJfZXBpMTYgKF9fbTEyOGkgX19XLCBfX21tYXNrOCBfX00sIF9fbTEyOGkgX19BLAorICAgICAgICAgIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Blcm12YXJoaTEyOF9tYXNrICgoX192OGhpKSBfX0IsCisgICAgICAgICAgICAgICAgIChfX3Y4aGkpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjhoaSkgX19XLAorICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfcGVybXV0ZXh2YXJfZXBpMTYgKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wZXJtdmFyaGkyNTZfbWFzayAoKF9fdjE2aGkpIF9fQiwKKyAgICAgICAgICAgICAgICAgKF9fdjE2aGkpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjE2aGkpIF9tbTI1Nl91bmRlZmluZWRfc2kyNTYgKCksCisgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9wZXJtdXRleHZhcl9lcGkxNiAoX19tbWFzazE2IF9fTSwgX19tMjU2aSBfX0EsCisgICAgICAgIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3Blcm12YXJoaTI1Nl9tYXNrICgoX192MTZoaSkgX19CLAorICAgICAgICAgICAgICAgICAoX192MTZoaSkgX19BLAorICAgICAgICAgICAgICAgICAoX192MTZoaSkgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19wZXJtdXRleHZhcl9lcGkxNiAoX19tMjU2aSBfX1csIF9fbW1hc2sxNiBfX00sIF9fbTI1NmkgX19BLAorICAgICAgICAgICAgIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3Blcm12YXJoaTI1Nl9tYXNrICgoX192MTZoaSkgX19CLAorICAgICAgICAgICAgICAgICAoX192MTZoaSkgX19BLAorICAgICAgICAgICAgICAgICAoX192MTZoaSkgX19XLAorICAgICAgICAgICAgICAgICAoX19tbWFzazE2KSBfX00pOworfQorCisjZGVmaW5lIF9tbV9tYXNrX2FsaWducl9lcGk4KFcsIFUsIEEsIEIsIE4pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wYWxpZ25yMTI4X21hc2soKF9fdjE2cWkpKF9fbTEyOGkpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZxaSkoX19tMTI4aSkoQiksIChpbnQpKE4pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZxaSkoX19tMTI4aSkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpKFUpKTsgfSkKKworI2RlZmluZSBfbW1fbWFza3pfYWxpZ25yX2VwaTgoVSwgQSwgQiwgTikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BhbGlnbnIxMjhfbWFzaygoX192MTZxaSkoX19tMTI4aSkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnFpKShfX20xMjhpKShCKSwgKGludCkoTiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnFpKV9tbV9zZXR6ZXJvX3NpMTI4KCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpKFUpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfbWFza19hbGlnbnJfZXBpOChXLCBVLCBBLCBCLCBOKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcGFsaWducjI1Nl9tYXNrKChfX3YzMnFpKShfX20yNTZpKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjMycWkpKF9fbTI1NmkpKEIpLCAoaW50KShOKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjMycWkpKF9fbTI1NmkpKFcpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazMyKShVKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21hc2t6X2FsaWducl9lcGk4KFUsIEEsIEIsIE4pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wYWxpZ25yMjU2X21hc2soKF9fdjMycWkpKF9fbTI1NmkpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MzJxaSkoX19tMjU2aSkoQiksIChpbnQpKE4pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MzJxaSlfbW0yNTZfc2V0emVyb19zaTI1NigpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazMyKShVKSk7IH0pCisKKyNkZWZpbmUgX21tX2Ric2FkX2VwdTgoQSwgQiwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGkpX19idWlsdGluX2lhMzJfZGJwc2FkYncxMjhfbWFzaygoX192MTZxaSkoX19tMTI4aSkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZxaSkoX19tMTI4aSkoQiksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGhpKV9tbV9zZXR6ZXJvX2hpKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrX2Ric2FkX2VwdTgoVywgVSwgQSwgQiwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGkpX19idWlsdGluX2lhMzJfZGJwc2FkYncxMjhfbWFzaygoX192MTZxaSkoX19tMTI4aSkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZxaSkoX19tMTI4aSkoQiksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGhpKShfX20xMjhpKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSkpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrel9kYnNhZF9lcHU4KFUsIEEsIEIsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX2RicHNhZGJ3MTI4X21hc2soKF9fdjE2cWkpKF9fbTEyOGkpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2cWkpKF9fbTEyOGkpKEIpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhoaSlfbW1fc2V0emVyb19zaTEyOCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X2Ric2FkX2VwdTgoQSwgQiwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmkpX19idWlsdGluX2lhMzJfZGJwc2FkYncyNTZfbWFzaygoX192MzJxaSkoX19tMjU2aSkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MzJxaSkoX19tMjU2aSkoQiksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZoaSlfbW0yNTZfc2V0emVyb19zaTI1NigpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2sxNiktMSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21hc2tfZGJzYWRfZXB1OChXLCBVLCBBLCBCLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9kYnBzYWRidzI1Nl9tYXNrKChfX3YzMnFpKShfX20yNTZpKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YzMnFpKShfX20yNTZpKShCKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNmhpKShfX20yNTZpKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrMTYpKFUpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfbWFza3pfZGJzYWRfZXB1OChVLCBBLCBCLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9kYnBzYWRidzI1Nl9tYXNrKChfX3YzMnFpKShfX20yNTZpKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YzMnFpKShfX20yNTZpKShCKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNmhpKV9tbTI1Nl9zZXR6ZXJvX3NpMjU2KCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazE2KShVKSk7IH0pCisKKyN1bmRlZiBfX0RFRkFVTFRfRk5fQVRUUlMKKworI2VuZGlmIC8qIF9fQVZYNTEyVkxCV0lOVFJJTl9IICovCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9hdng1MTJ2bGNkaW50cmluLmggYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9hdng1MTJ2bGNkaW50cmluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IwMmUyZQotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL2F2eDUxMnZsY2RpbnRyaW4uaApAQCAtMCwwICsxLDI2MyBAQAorLyo9PT0tLS0tIGF2eDUxMnZsY2RpbnRyaW4uaCAtIEFWWDUxMlZMIGFuZCBBVlg1MTJDRCBpbnRyaW5zaWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqCisgKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisgKi8KKyNpZm5kZWYgX19JTU1JTlRSSU5fSAorI2Vycm9yICJOZXZlciB1c2UgPGF2eDUxMnZsY2RpbnRyaW4uaD4gZGlyZWN0bHk7IGluY2x1ZGUgPGltbWludHJpbi5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9fQVZYNTEyVkxDRElOVFJJTl9ICisjZGVmaW5lIF9fQVZYNTEyVkxDRElOVFJJTl9ICisKKy8qIERlZmluZSB0aGUgZGVmYXVsdCBhdHRyaWJ1dGVzIGZvciB0aGUgZnVuY3Rpb25zIGluIHRoaXMgZmlsZS4gKi8KKyNkZWZpbmUgX19ERUZBVUxUX0ZOX0FUVFJTIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXywgX190YXJnZXRfXygiYXZ4NTEydmwsYXZ4NTEyY2QiKSkpCisKKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9icm9hZGNhc3RtYl9lcGk2NCAoX19tbWFzazggX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2Jyb2FkY2FzdG1iMTI4IChfX0EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2Jyb2FkY2FzdG1iX2VwaTY0IChfX21tYXNrOCBfX0EpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfYnJvYWRjYXN0bWIyNTYgKF9fQSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fYnJvYWRjYXN0bXdfZXBpMzIgKF9fbW1hc2sxNiBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfYnJvYWRjYXN0bXcxMjggKF9fQSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfYnJvYWRjYXN0bXdfZXBpMzIgKF9fbW1hc2sxNiBfX0EpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfYnJvYWRjYXN0bXcyNTYgKF9fQSk7Cit9CisKKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jb25mbGljdF9lcGk2NCAoX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb25mbGljdGRpXzEyOF9tYXNrICgoX192MmRpKSBfX0EsCisgICAgICAgICAgICAgICAoX192MmRpKSBfbW1fdW5kZWZpbmVkX3NpMTI4ICgpLAorICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jb25mbGljdF9lcGk2NCAoX19tMTI4aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb25mbGljdGRpXzEyOF9tYXNrICgoX192MmRpKSBfX0EsCisgICAgICAgICAgICAgICAoX192MmRpKSBfX1csCisgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfY29uZmxpY3RfZXBpNjQgKF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb25mbGljdGRpXzEyOF9tYXNrICgoX192MmRpKSBfX0EsCisgICAgICAgICAgICAgICAoX192MmRpKQorICAgICAgICAgICAgICAgX21tX3NldHplcm9fZGkgKCksCisgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY29uZmxpY3RfZXBpNjQgKF9fbTI1NmkgX19BKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3ZwY29uZmxpY3RkaV8yNTZfbWFzayAoKF9fdjRkaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjRkaSkgIF9tbTI1Nl91bmRlZmluZWRfc2kyNTYgKCksCisgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2NvbmZsaWN0X2VwaTY0IChfX20yNTZpIF9fVywgX19tbWFzazggX19VLCBfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl92cGNvbmZsaWN0ZGlfMjU2X21hc2sgKChfX3Y0ZGkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3Y0ZGkpIF9fVywKKyAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9jb25mbGljdF9lcGk2NCAoX19tbWFzazggX19VLCBfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl92cGNvbmZsaWN0ZGlfMjU2X21hc2sgKChfX3Y0ZGkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3Y0ZGkpIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2ICgpLAorICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NvbmZsaWN0X2VwaTMyIChfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbmZsaWN0c2lfMTI4X21hc2sgKChfX3Y0c2kpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3Y0c2kpIF9tbV91bmRlZmluZWRfc2kxMjggKCksCisgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2NvbmZsaWN0X2VwaTMyIChfX20xMjhpIF9fVywgX19tbWFzazggX19VLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbmZsaWN0c2lfMTI4X21hc2sgKChfX3Y0c2kpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3Y0c2kpIF9fVywKKyAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9jb25mbGljdF9lcGkzMiAoX19tbWFzazggX19VLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbmZsaWN0c2lfMTI4X21hc2sgKChfX3Y0c2kpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3Y0c2kpIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2NvbmZsaWN0X2VwaTMyIChfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl92cGNvbmZsaWN0c2lfMjU2X21hc2sgKChfX3Y4c2kpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3Y4c2kpIF9tbTI1Nl91bmRlZmluZWRfc2kyNTYgKCksCisgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2NvbmZsaWN0X2VwaTMyIChfX20yNTZpIF9fVywgX19tbWFzazggX19VLCBfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl92cGNvbmZsaWN0c2lfMjU2X21hc2sgKChfX3Y4c2kpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3Y4c2kpIF9fVywKKyAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9jb25mbGljdF9lcGkzMiAoX19tbWFzazggX19VLCBfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl92cGNvbmZsaWN0c2lfMjU2X21hc2sgKChfX3Y4c2kpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3Y4c2kpCisgICAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9semNudF9lcGkzMiAoX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBsemNudGRfMTI4X21hc2sgKChfX3Y0c2kpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjRzaSkKKyAgICAgICAgICAgICAgICAgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfbHpjbnRfZXBpMzIgKF9fbTEyOGkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwbHpjbnRkXzEyOF9tYXNrICgoX192NHNpKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3Y0c2kpIF9fVywKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2x6Y250X2VwaTMyIChfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwbHpjbnRkXzEyOF9tYXNrICgoX192NHNpKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3Y0c2kpCisgICAgICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbHpjbnRfZXBpMzIgKF9fbTI1NmkgX19BKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3ZwbHpjbnRkXzI1Nl9tYXNrICgoX192OHNpKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3Y4c2kpCisgICAgICAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2ICgpLAorICAgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2x6Y250X2VwaTMyIChfX20yNTZpIF9fVywgX19tbWFzazggX19VLCBfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl92cGx6Y250ZF8yNTZfbWFzayAoKF9fdjhzaSkgX19BLAorICAgICAgICAgICAgICAgICAoX192OHNpKSBfX1csCisgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9semNudF9lcGkzMiAoX19tbWFzazggX19VLCBfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl92cGx6Y250ZF8yNTZfbWFzayAoKF9fdjhzaSkgX19BLAorICAgICAgICAgICAgICAgICAoX192OHNpKQorICAgICAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2x6Y250X2VwaTY0IChfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGx6Y250cV8xMjhfbWFzayAoKF9fdjJkaSkgX19BLAorICAgICAgICAgICAgICAgICAoX192MmRpKQorICAgICAgICAgICAgICAgICBfbW1fc2V0emVyb19kaSAoKSwKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19semNudF9lcGk2NCAoX19tMTI4aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBsemNudHFfMTI4X21hc2sgKChfX3YyZGkpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjJkaSkgX19XLAorICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfbHpjbnRfZXBpNjQgKF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBsemNudHFfMTI4X21hc2sgKChfX3YyZGkpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjJkaSkKKyAgICAgICAgICAgICAgICAgX21tX3NldHplcm9fZGkgKCksCisgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9semNudF9lcGk2NCAoX19tMjU2aSBfX0EpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfdnBsemNudHFfMjU2X21hc2sgKChfX3Y0ZGkpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjRkaSkKKyAgICAgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfbHpjbnRfZXBpNjQgKF9fbTI1NmkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTI1NmkgX19BKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3ZwbHpjbnRxXzI1Nl9tYXNrICgoX192NGRpKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3Y0ZGkpIF9fVywKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X2x6Y250X2VwaTY0IChfX21tYXNrOCBfX1UsIF9fbTI1NmkgX19BKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3ZwbHpjbnRxXzI1Nl9tYXNrICgoX192NGRpKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3Y0ZGkpCisgICAgICAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2ICgpLAorICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKKyN1bmRlZiBfX0RFRkFVTFRfRk5fQVRUUlMKKworI2VuZGlmIC8qIF9fQVZYNTEyVkxDRElOVFJJTl9IICovCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9hdng1MTJ2bGRxaW50cmluLmggYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9hdng1MTJ2bGRxaW50cmluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE4N2JjZAotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL2F2eDUxMnZsZHFpbnRyaW4uaApAQCAtMCwwICsxLDEyNjUgQEAKKy8qPT09LS0tLSBhdng1MTJ2bGRxaW50cmluLmggLSBBVlg1MTJWTCBhbmQgQVZYNTEyRFEgaW50cmluc2ljcyAtLS0tLS0tLS0tLS09PT0KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKgorICo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICovCisKKyNpZm5kZWYgX19JTU1JTlRSSU5fSAorI2Vycm9yICJOZXZlciB1c2UgPGF2eDUxMnZsZHFpbnRyaW4uaD4gZGlyZWN0bHk7IGluY2x1ZGUgPGltbWludHJpbi5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9fQVZYNTEyVkxEUUlOVFJJTl9ICisjZGVmaW5lIF9fQVZYNTEyVkxEUUlOVFJJTl9ICisKKy8qIERlZmluZSB0aGUgZGVmYXVsdCBhdHRyaWJ1dGVzIGZvciB0aGUgZnVuY3Rpb25zIGluIHRoaXMgZmlsZS4gKi8KKyNkZWZpbmUgX19ERUZBVUxUX0ZOX0FUVFJTIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXywgX190YXJnZXRfXygiYXZ4NTEydmwsYXZ4NTEyZHEiKSkpCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbXVsbG9fZXBpNjQgKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikgeworICByZXR1cm4gKF9fbTI1NmkpICgoX192NGR1KSBfX0EgKiAoX192NGR1KSBfX0IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfbXVsbG9fZXBpNjQgKF9fbTI1NmkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikgeworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BtdWxscTI1Nl9tYXNrICgoX192NGRpKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y0ZGkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjRkaSkgX19XLAorICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfbXVsbG9fZXBpNjQgKF9fbW1hc2s4IF9fVSwgX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKSB7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG11bGxxMjU2X21hc2sgKChfX3Y0ZGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjRkaSkgX19CLAorICAgICAgICAgICAgICAoX192NGRpKQorICAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX211bGxvX2VwaTY0IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjhpKSAoKF9fdjJkdSkgX19BICogKF9fdjJkdSkgX19CKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX211bGxvX2VwaTY0IChfX20xMjhpIF9fVywgX19tbWFzazggX19VLCBfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbXVsbHExMjhfbWFzayAoKF9fdjJkaSkgX19BLAorICAgICAgICAgICAgICAoX192MmRpKSBfX0IsCisgICAgICAgICAgICAgIChfX3YyZGkpIF9fVywKKyAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X211bGxvX2VwaTY0IChfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikgeworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BtdWxscTEyOF9tYXNrICgoX192MmRpKSBfX0EsCisgICAgICAgICAgICAgIChfX3YyZGkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjJkaSkKKyAgICAgICAgICAgICAgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2FuZG5vdF9wZCAoX19tMjU2ZCBfX1csIF9fbW1hc2s4IF9fVSwgX19tMjU2ZCBfX0EsIF9fbTI1NmQgX19CKSB7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfYW5kbnBkMjU2X21hc2sgKChfX3Y0ZGYpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjRkZikgX19CLAorICAgICAgICAgICAgICAoX192NGRmKSBfX1csCisgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9hbmRub3RfcGQgKF9fbW1hc2s4IF9fVSwgX19tMjU2ZCBfX0EsIF9fbTI1NmQgX19CKSB7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfYW5kbnBkMjU2X21hc2sgKChfX3Y0ZGYpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjRkZikgX19CLAorICAgICAgICAgICAgICAoX192NGRmKQorICAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19wZCAoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfYW5kbm90X3BkIChfX20xMjhkIF9fVywgX19tbWFzazggX19VLCBfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9hbmRucGQxMjhfbWFzayAoKF9fdjJkZikgX19BLAorICAgICAgICAgICAgICAoX192MmRmKSBfX0IsCisgICAgICAgICAgICAgIChfX3YyZGYpIF9fVywKKyAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2FuZG5vdF9wZCAoX19tbWFzazggX19VLCBfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9hbmRucGQxMjhfbWFzayAoKF9fdjJkZikgX19BLAorICAgICAgICAgICAgICAoX192MmRmKSBfX0IsCisgICAgICAgICAgICAgIChfX3YyZGYpCisgICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3BkICgpLAorICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2FuZG5vdF9wcyAoX19tMjU2IF9fVywgX19tbWFzazggX19VLCBfX20yNTYgX19BLCBfX20yNTYgX19CKSB7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9hbmRucHMyNTZfbWFzayAoKF9fdjhzZikgX19BLAorICAgICAgICAgICAgIChfX3Y4c2YpIF9fQiwKKyAgICAgICAgICAgICAoX192OHNmKSBfX1csCisgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfYW5kbm90X3BzIChfX21tYXNrOCBfX1UsIF9fbTI1NiBfX0EsIF9fbTI1NiBfX0IpIHsKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX2FuZG5wczI1Nl9tYXNrICgoX192OHNmKSBfX0EsCisgICAgICAgICAgICAgKF9fdjhzZikgX19CLAorICAgICAgICAgICAgIChfX3Y4c2YpCisgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fcHMgKCksCisgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19hbmRub3RfcHMgKF9fbTEyOCBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4IF9fQSwgX19tMTI4IF9fQikgeworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfYW5kbnBzMTI4X21hc2sgKChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAgICAoX192NHNmKSBfX0IsCisgICAgICAgICAgICAgKF9fdjRzZikgX19XLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2FuZG5vdF9wcyAoX19tbWFzazggX19VLCBfX20xMjggX19BLCBfX20xMjggX19CKSB7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9hbmRucHMxMjhfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgIChfX3Y0c2YpIF9fQiwKKyAgICAgICAgICAgICAoX192NHNmKQorICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3BzICgpLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2FuZF9wZCAoX19tMjU2ZCBfX1csIF9fbW1hc2s4IF9fVSwgX19tMjU2ZCBfX0EsIF9fbTI1NmQgX19CKSB7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfYW5kcGQyNTZfbWFzayAoKF9fdjRkZikgX19BLAorICAgICAgICAgICAgIChfX3Y0ZGYpIF9fQiwKKyAgICAgICAgICAgICAoX192NGRmKSBfX1csCisgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X2FuZF9wZCAoX19tbWFzazggX19VLCBfX20yNTZkIF9fQSwgX19tMjU2ZCBfX0IpIHsKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9hbmRwZDI1Nl9tYXNrICgoX192NGRmKSBfX0EsCisgICAgICAgICAgICAgKF9fdjRkZikgX19CLAorICAgICAgICAgICAgIChfX3Y0ZGYpCisgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fcGQgKCksCisgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfYW5kX3BkIChfX20xMjhkIF9fVywgX19tbWFzazggX19VLCBfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9hbmRwZDEyOF9tYXNrICgoX192MmRmKSBfX0EsCisgICAgICAgICAgICAgKF9fdjJkZikgX19CLAorICAgICAgICAgICAgIChfX3YyZGYpIF9fVywKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfYW5kX3BkIChfX21tYXNrOCBfX1UsIF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikgeworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX2FuZHBkMTI4X21hc2sgKChfX3YyZGYpIF9fQSwKKyAgICAgICAgICAgICAoX192MmRmKSBfX0IsCisgICAgICAgICAgICAgKF9fdjJkZikKKyAgICAgICAgICAgICBfbW1fc2V0emVyb19wZCAoKSwKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2FuZF9wcyAoX19tMjU2IF9fVywgX19tbWFzazggX19VLCBfX20yNTYgX19BLCBfX20yNTYgX19CKSB7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9hbmRwczI1Nl9tYXNrICgoX192OHNmKSBfX0EsCisgICAgICAgICAgICAoX192OHNmKSBfX0IsCisgICAgICAgICAgICAoX192OHNmKSBfX1csCisgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9hbmRfcHMgKF9fbW1hc2s4IF9fVSwgX19tMjU2IF9fQSwgX19tMjU2IF9fQikgeworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfYW5kcHMyNTZfbWFzayAoKF9fdjhzZikgX19BLAorICAgICAgICAgICAgKF9fdjhzZikgX19CLAorICAgICAgICAgICAgKF9fdjhzZikKKyAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3BzICgpLAorICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19hbmRfcHMgKF9fbTEyOCBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4IF9fQSwgX19tMTI4IF9fQikgeworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfYW5kcHMxMjhfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgKF9fdjRzZikgX19CLAorICAgICAgICAgICAgKF9fdjRzZikgX19XLAorICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfYW5kX3BzIChfX21tYXNrOCBfX1UsIF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2FuZHBzMTI4X21hc2sgKChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAgIChfX3Y0c2YpIF9fQiwKKyAgICAgICAgICAgIChfX3Y0c2YpCisgICAgICAgICAgICBfbW1fc2V0emVyb19wcyAoKSwKKyAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX3hvcl9wZCAoX19tMjU2ZCBfX1csIF9fbW1hc2s4IF9fVSwgX19tMjU2ZCBfX0EsCisgICAgICAgIF9fbTI1NmQgX19CKSB7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfeG9ycGQyNTZfbWFzayAoKF9fdjRkZikgX19BLAorICAgICAgICAgICAgIChfX3Y0ZGYpIF9fQiwKKyAgICAgICAgICAgICAoX192NGRmKSBfX1csCisgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X3hvcl9wZCAoX19tbWFzazggX19VLCBfX20yNTZkIF9fQSwgX19tMjU2ZCBfX0IpIHsKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl94b3JwZDI1Nl9tYXNrICgoX192NGRmKSBfX0EsCisgICAgICAgICAgICAgKF9fdjRkZikgX19CLAorICAgICAgICAgICAgIChfX3Y0ZGYpCisgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fcGQgKCksCisgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfeG9yX3BkIChfX20xMjhkIF9fVywgX19tbWFzazggX19VLCBfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl94b3JwZDEyOF9tYXNrICgoX192MmRmKSBfX0EsCisgICAgICAgICAgICAgKF9fdjJkZikgX19CLAorICAgICAgICAgICAgIChfX3YyZGYpIF9fVywKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfeG9yX3BkIChfX21tYXNrOCBfX1UsIF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikgeworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3hvcnBkMTI4X21hc2sgKChfX3YyZGYpIF9fQSwKKyAgICAgICAgICAgICAoX192MmRmKSBfX0IsCisgICAgICAgICAgICAgKF9fdjJkZikKKyAgICAgICAgICAgICBfbW1fc2V0emVyb19wZCAoKSwKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX3hvcl9wcyAoX19tMjU2IF9fVywgX19tbWFzazggX19VLCBfX20yNTYgX19BLCBfX20yNTYgX19CKSB7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl94b3JwczI1Nl9tYXNrICgoX192OHNmKSBfX0EsCisgICAgICAgICAgICAoX192OHNmKSBfX0IsCisgICAgICAgICAgICAoX192OHNmKSBfX1csCisgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel94b3JfcHMgKF9fbW1hc2s4IF9fVSwgX19tMjU2IF9fQSwgX19tMjU2IF9fQikgeworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfeG9ycHMyNTZfbWFzayAoKF9fdjhzZikgX19BLAorICAgICAgICAgICAgKF9fdjhzZikgX19CLAorICAgICAgICAgICAgKF9fdjhzZikKKyAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3BzICgpLAorICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza194b3JfcHMgKF9fbTEyOCBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4IF9fQSwgX19tMTI4IF9fQikgeworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfeG9ycHMxMjhfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgKF9fdjRzZikgX19CLAorICAgICAgICAgICAgKF9fdjRzZikgX19XLAorICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfeG9yX3BzIChfX21tYXNrOCBfX1UsIF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3hvcnBzMTI4X21hc2sgKChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAgIChfX3Y0c2YpIF9fQiwKKyAgICAgICAgICAgIChfX3Y0c2YpCisgICAgICAgICAgICBfbW1fc2V0emVyb19wcyAoKSwKKyAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX29yX3BkIChfX20yNTZkIF9fVywgX19tbWFzazggX19VLCBfX20yNTZkIF9fQSwgX19tMjU2ZCBfX0IpIHsKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9vcnBkMjU2X21hc2sgKChfX3Y0ZGYpIF9fQSwKKyAgICAgICAgICAgIChfX3Y0ZGYpIF9fQiwKKyAgICAgICAgICAgIChfX3Y0ZGYpIF9fVywKKyAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9vcl9wZCAoX19tbWFzazggX19VLCBfX20yNTZkIF9fQSwgX19tMjU2ZCBfX0IpIHsKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9vcnBkMjU2X21hc2sgKChfX3Y0ZGYpIF9fQSwKKyAgICAgICAgICAgIChfX3Y0ZGYpIF9fQiwKKyAgICAgICAgICAgIChfX3Y0ZGYpCisgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19wZCAoKSwKKyAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX29yX3BkIChfX20xMjhkIF9fVywgX19tbWFzazggX19VLCBfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9vcnBkMTI4X21hc2sgKChfX3YyZGYpIF9fQSwKKyAgICAgICAgICAgIChfX3YyZGYpIF9fQiwKKyAgICAgICAgICAgIChfX3YyZGYpIF9fVywKKyAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9vcl9wZCAoX19tbWFzazggX19VLCBfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9vcnBkMTI4X21hc2sgKChfX3YyZGYpIF9fQSwKKyAgICAgICAgICAgIChfX3YyZGYpIF9fQiwKKyAgICAgICAgICAgIChfX3YyZGYpCisgICAgICAgICAgICBfbW1fc2V0emVyb19wZCAoKSwKKyAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfb3JfcHMgKF9fbTI1NiBfX1csIF9fbW1hc2s4IF9fVSwgX19tMjU2IF9fQSwgX19tMjU2IF9fQikgeworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfb3JwczI1Nl9tYXNrICgoX192OHNmKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3Y4c2YpIF9fQiwKKyAgICAgICAgICAgICAgICAgKF9fdjhzZikgX19XLAorICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9vcl9wcyAoX19tbWFzazggX19VLCBfX20yNTYgX19BLCBfX20yNTYgX19CKSB7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9vcnBzMjU2X21hc2sgKChfX3Y4c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjhzZikgX19CLAorICAgICAgICAgICAgICAgICAoX192OHNmKQorICAgICAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19wcyAoKSwKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19vcl9wcyAoX19tMTI4IF9fVywgX19tbWFzazggX19VLCBfX20xMjggX19BLCBfX20xMjggX19CKSB7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9vcnBzMTI4X21hc2sgKChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjRzZikgX19CLAorICAgICAgICAgICAgICAgICAoX192NHNmKSBfX1csCisgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X29yX3BzIChfX21tYXNrOCBfX1UsIF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX29ycHMxMjhfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgICAoX192NHNmKSBfX0IsCisgICAgICAgICAgICAgICAgIChfX3Y0c2YpCisgICAgICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3BzICgpLAorICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY3Z0cGRfZXBpNjQgKF9fbTEyOGQgX19BKSB7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfY3Z0cGQycXExMjhfbWFzayAoKF9fdjJkZikgX19BLAorICAgICAgICAgICAgICAgIChfX3YyZGkpIF9tbV9zZXR6ZXJvX3NpMTI4KCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jdnRwZF9lcGk2NCAoX19tMTI4aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4ZCBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9jdnRwZDJxcTEyOF9tYXNrICgoX192MmRmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjJkaSkgX19XLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9jdnRwZF9lcGk2NCAoX19tbWFzazggX19VLCBfX20xMjhkIF9fQSkgeworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2N2dHBkMnFxMTI4X21hc2sgKChfX3YyZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192MmRpKSBfbW1fc2V0emVyb19zaTEyOCgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9jdnRwZF9lcGk2NCAoX19tMjU2ZCBfX0EpIHsKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9jdnRwZDJxcTI1Nl9tYXNrICgoX192NGRmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjRkaSkgX21tMjU2X3NldHplcm9fc2kyNTYoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2N2dHBkX2VwaTY0IChfX20yNTZpIF9fVywgX19tbWFzazggX19VLCBfX20yNTZkIF9fQSkgeworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX2N2dHBkMnFxMjU2X21hc2sgKChfX3Y0ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192NGRpKSBfX1csCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X2N2dHBkX2VwaTY0IChfX21tYXNrOCBfX1UsIF9fbTI1NmQgX19BKSB7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfY3Z0cGQycXEyNTZfbWFzayAoKF9fdjRkZikgX19BLAorICAgICAgICAgICAgICAgIChfX3Y0ZGkpIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2KCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2N2dHBkX2VwdTY0IChfX20xMjhkIF9fQSkgeworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2N2dHBkMnVxcTEyOF9tYXNrICgoX192MmRmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjJkaSkgX21tX3NldHplcm9fc2kxMjgoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2N2dHBkX2VwdTY0IChfX20xMjhpIF9fVywgX19tbWFzazggX19VLCBfX20xMjhkIF9fQSkgeworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2N2dHBkMnVxcTEyOF9tYXNrICgoX192MmRmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjJkaSkgX19XLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9jdnRwZF9lcHU2NCAoX19tbWFzazggX19VLCBfX20xMjhkIF9fQSkgeworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2N2dHBkMnVxcTEyOF9tYXNrICgoX192MmRmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjJkaSkgX21tX3NldHplcm9fc2kxMjgoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY3Z0cGRfZXB1NjQgKF9fbTI1NmQgX19BKSB7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfY3Z0cGQydXFxMjU2X21hc2sgKChfX3Y0ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192NGRpKSBfbW0yNTZfc2V0emVyb19zaTI1NigpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfY3Z0cGRfZXB1NjQgKF9fbTI1NmkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTI1NmQgX19BKSB7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfY3Z0cGQydXFxMjU2X21hc2sgKChfX3Y0ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192NGRpKSBfX1csCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X2N2dHBkX2VwdTY0IChfX21tYXNrOCBfX1UsIF9fbTI1NmQgX19BKSB7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfY3Z0cGQydXFxMjU2X21hc2sgKChfX3Y0ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192NGRpKSBfbW0yNTZfc2V0emVyb19zaTI1NigpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jdnRwc19lcGk2NCAoX19tMTI4IF9fQSkgeworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2N2dHBzMnFxMTI4X21hc2sgKChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192MmRpKSBfbW1fc2V0emVyb19zaTEyOCgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfY3Z0cHNfZXBpNjQgKF9fbTEyOGkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOCBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9jdnRwczJxcTEyOF9tYXNrICgoX192NHNmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjJkaSkgX19XLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9jdnRwc19lcGk2NCAoX19tbWFzazggX19VLCBfX20xMjggX19BKSB7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfY3Z0cHMycXExMjhfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgIChfX3YyZGkpIF9tbV9zZXR6ZXJvX3NpMTI4KCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2N2dHBzX2VwaTY0IChfX20xMjggX19BKSB7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfY3Z0cHMycXEyNTZfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgIChfX3Y0ZGkpIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2KCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jdnRwc19lcGk2NCAoX19tMjU2aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4IF9fQSkgeworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX2N2dHBzMnFxMjU2X21hc2sgKChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192NGRpKSBfX1csCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X2N2dHBzX2VwaTY0IChfX21tYXNrOCBfX1UsIF9fbTEyOCBfX0EpIHsKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9jdnRwczJxcTI1Nl9tYXNrICgoX192NHNmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjRkaSkgX21tMjU2X3NldHplcm9fc2kyNTYoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY3Z0cHNfZXB1NjQgKF9fbTEyOCBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9jdnRwczJ1cXExMjhfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgIChfX3YyZGkpIF9tbV9zZXR6ZXJvX3NpMTI4KCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jdnRwc19lcHU2NCAoX19tMTI4aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4IF9fQSkgeworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2N2dHBzMnVxcTEyOF9tYXNrICgoX192NHNmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjJkaSkgX19XLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9jdnRwc19lcHU2NCAoX19tbWFzazggX19VLCBfX20xMjggX19BKSB7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfY3Z0cHMydXFxMTI4X21hc2sgKChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192MmRpKSBfbW1fc2V0emVyb19zaTEyOCgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9jdnRwc19lcHU2NCAoX19tMTI4IF9fQSkgeworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX2N2dHBzMnVxcTI1Nl9tYXNrICgoX192NHNmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjRkaSkgX21tMjU2X3NldHplcm9fc2kyNTYoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2N2dHBzX2VwdTY0IChfX20yNTZpIF9fVywgX19tbWFzazggX19VLCBfX20xMjggX19BKSB7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfY3Z0cHMydXFxMjU2X21hc2sgKChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192NGRpKSBfX1csCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X2N2dHBzX2VwdTY0IChfX21tYXNrOCBfX1UsIF9fbTEyOCBfX0EpIHsKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9jdnRwczJ1cXEyNTZfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgIChfX3Y0ZGkpIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2KCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2N2dGVwaTY0X3BkIChfX20xMjhpIF9fQSkgeworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX2N2dHFxMnBkMTI4X21hc2sgKChfX3YyZGkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192MmRmKSBfbW1fc2V0emVyb19wZCgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfY3Z0ZXBpNjRfcGQgKF9fbTEyOGQgX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BKSB7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfY3Z0cXEycGQxMjhfbWFzayAoKF9fdjJkaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3YyZGYpIF9fVywKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfY3Z0ZXBpNjRfcGQgKF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9jdnRxcTJwZDEyOF9tYXNrICgoX192MmRpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjJkZikgX21tX3NldHplcm9fcGQoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY3Z0ZXBpNjRfcGQgKF9fbTI1NmkgX19BKSB7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfY3Z0cXEycGQyNTZfbWFzayAoKF9fdjRkaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3Y0ZGYpIF9tbTI1Nl9zZXR6ZXJvX3BkKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jdnRlcGk2NF9wZCAoX19tMjU2ZCBfX1csIF9fbW1hc2s4IF9fVSwgX19tMjU2aSBfX0EpIHsKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9jdnRxcTJwZDI1Nl9tYXNrICgoX192NGRpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjRkZikgX19XLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9jdnRlcGk2NF9wZCAoX19tbWFzazggX19VLCBfX20yNTZpIF9fQSkgeworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX2N2dHFxMnBkMjU2X21hc2sgKChfX3Y0ZGkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192NGRmKSBfbW0yNTZfc2V0emVyb19wZCgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2N2dGVwaTY0X3BzIChfX20xMjhpIF9fQSkgeworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY3Z0cXEycHMxMjhfbWFzayAoKF9fdjJkaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3Y0c2YpIF9tbV9zZXR6ZXJvX3BzKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2N2dGVwaTY0X3BzIChfX20xMjggX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BKSB7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9jdnRxcTJwczEyOF9tYXNrICgoX192MmRpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjRzZikgX19XLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2N2dGVwaTY0X3BzIChfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BKSB7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9jdnRxcTJwczEyOF9tYXNrICgoX192MmRpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjRzZikgX21tX3NldHplcm9fcHMoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9jdnRlcGk2NF9wcyAoX19tMjU2aSBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2N2dHFxMnBzMjU2X21hc2sgKChfX3Y0ZGkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192NHNmKSBfbW1fc2V0emVyb19wcygpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jdnRlcGk2NF9wcyAoX19tMTI4IF9fVywgX19tbWFzazggX19VLCBfX20yNTZpIF9fQSkgeworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY3Z0cXEycHMyNTZfbWFzayAoKF9fdjRkaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3Y0c2YpIF9fVywKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9jdnRlcGk2NF9wcyAoX19tbWFzazggX19VLCBfX20yNTZpIF9fQSkgeworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY3Z0cXEycHMyNTZfbWFzayAoKF9fdjRkaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3Y0c2YpIF9tbV9zZXR6ZXJvX3BzKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2N2dHRwZF9lcGk2NCAoX19tMTI4ZCBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9jdnR0cGQycXExMjhfbWFzayAoKF9fdjJkZikgX19BLAorICAgICAgICAgICAgICAgIChfX3YyZGkpIF9tbV9zZXR6ZXJvX3NpMTI4KCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jdnR0cGRfZXBpNjQgKF9fbTEyOGkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOGQgX19BKSB7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfY3Z0dHBkMnFxMTI4X21hc2sgKChfX3YyZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192MmRpKSBfX1csCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2N2dHRwZF9lcGk2NCAoX19tbWFzazggX19VLCBfX20xMjhkIF9fQSkgeworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2N2dHRwZDJxcTEyOF9tYXNrICgoX192MmRmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjJkaSkgX21tX3NldHplcm9fc2kxMjgoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY3Z0dHBkX2VwaTY0IChfX20yNTZkIF9fQSkgeworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX2N2dHRwZDJxcTI1Nl9tYXNrICgoX192NGRmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjRkaSkgX21tMjU2X3NldHplcm9fc2kyNTYoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2N2dHRwZF9lcGk2NCAoX19tMjU2aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMjU2ZCBfX0EpIHsKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9jdnR0cGQycXEyNTZfbWFzayAoKF9fdjRkZikgX19BLAorICAgICAgICAgICAgICAgIChfX3Y0ZGkpIF9fVywKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfY3Z0dHBkX2VwaTY0IChfX21tYXNrOCBfX1UsIF9fbTI1NmQgX19BKSB7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfY3Z0dHBkMnFxMjU2X21hc2sgKChfX3Y0ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192NGRpKSBfbW0yNTZfc2V0emVyb19zaTI1NigpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jdnR0cGRfZXB1NjQgKF9fbTEyOGQgX19BKSB7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfY3Z0dHBkMnVxcTEyOF9tYXNrICgoX192MmRmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjJkaSkgX21tX3NldHplcm9fc2kxMjgoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2N2dHRwZF9lcHU2NCAoX19tMTI4aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4ZCBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9jdnR0cGQydXFxMTI4X21hc2sgKChfX3YyZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192MmRpKSBfX1csCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2N2dHRwZF9lcHU2NCAoX19tbWFzazggX19VLCBfX20xMjhkIF9fQSkgeworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2N2dHRwZDJ1cXExMjhfbWFzayAoKF9fdjJkZikgX19BLAorICAgICAgICAgICAgICAgIChfX3YyZGkpIF9tbV9zZXR6ZXJvX3NpMTI4KCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2N2dHRwZF9lcHU2NCAoX19tMjU2ZCBfX0EpIHsKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9jdnR0cGQydXFxMjU2X21hc2sgKChfX3Y0ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192NGRpKSBfbW0yNTZfc2V0emVyb19zaTI1NigpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfY3Z0dHBkX2VwdTY0IChfX20yNTZpIF9fVywgX19tbWFzazggX19VLCBfX20yNTZkIF9fQSkgeworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX2N2dHRwZDJ1cXEyNTZfbWFzayAoKF9fdjRkZikgX19BLAorICAgICAgICAgICAgICAgIChfX3Y0ZGkpIF9fVywKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfY3Z0dHBkX2VwdTY0IChfX21tYXNrOCBfX1UsIF9fbTI1NmQgX19BKSB7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfY3Z0dHBkMnVxcTI1Nl9tYXNrICgoX192NGRmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjRkaSkgX21tMjU2X3NldHplcm9fc2kyNTYoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY3Z0dHBzX2VwaTY0IChfX20xMjggX19BKSB7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfY3Z0dHBzMnFxMTI4X21hc2sgKChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192MmRpKSBfbW1fc2V0emVyb19zaTEyOCgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfY3Z0dHBzX2VwaTY0IChfX20xMjhpIF9fVywgX19tbWFzazggX19VLCBfX20xMjggX19BKSB7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfY3Z0dHBzMnFxMTI4X21hc2sgKChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192MmRpKSBfX1csCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2N2dHRwc19lcGk2NCAoX19tbWFzazggX19VLCBfX20xMjggX19BKSB7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfY3Z0dHBzMnFxMTI4X21hc2sgKChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192MmRpKSBfbW1fc2V0emVyb19zaTEyOCgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9jdnR0cHNfZXBpNjQgKF9fbTEyOCBfX0EpIHsKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9jdnR0cHMycXEyNTZfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgIChfX3Y0ZGkpIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2KCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jdnR0cHNfZXBpNjQgKF9fbTI1NmkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOCBfX0EpIHsKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9jdnR0cHMycXEyNTZfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgIChfX3Y0ZGkpIF9fVywKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfY3Z0dHBzX2VwaTY0IChfX21tYXNrOCBfX1UsIF9fbTEyOCBfX0EpIHsKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9jdnR0cHMycXEyNTZfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgIChfX3Y0ZGkpIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2KCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2N2dHRwc19lcHU2NCAoX19tMTI4IF9fQSkgeworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2N2dHRwczJ1cXExMjhfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgIChfX3YyZGkpIF9tbV9zZXR6ZXJvX3NpMTI4KCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jdnR0cHNfZXB1NjQgKF9fbTEyOGkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOCBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9jdnR0cHMydXFxMTI4X21hc2sgKChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192MmRpKSBfX1csCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2N2dHRwc19lcHU2NCAoX19tbWFzazggX19VLCBfX20xMjggX19BKSB7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfY3Z0dHBzMnVxcTEyOF9tYXNrICgoX192NHNmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjJkaSkgX21tX3NldHplcm9fc2kxMjgoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY3Z0dHBzX2VwdTY0IChfX20xMjggX19BKSB7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfY3Z0dHBzMnVxcTI1Nl9tYXNrICgoX192NHNmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjRkaSkgX21tMjU2X3NldHplcm9fc2kyNTYoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2N2dHRwc19lcHU2NCAoX19tMjU2aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4IF9fQSkgeworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX2N2dHRwczJ1cXEyNTZfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgIChfX3Y0ZGkpIF9fVywKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfY3Z0dHBzX2VwdTY0IChfX21tYXNrOCBfX1UsIF9fbTEyOCBfX0EpIHsKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9jdnR0cHMydXFxMjU2X21hc2sgKChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192NGRpKSBfbW0yNTZfc2V0emVyb19zaTI1NigpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jdnRlcHU2NF9wZCAoX19tMTI4aSBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9jdnR1cXEycGQxMjhfbWFzayAoKF9fdjJkaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3YyZGYpIF9tbV9zZXR6ZXJvX3BkKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jdnRlcHU2NF9wZCAoX19tMTI4ZCBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9jdnR1cXEycGQxMjhfbWFzayAoKF9fdjJkaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3YyZGYpIF9fVywKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfY3Z0ZXB1NjRfcGQgKF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9jdnR1cXEycGQxMjhfbWFzayAoKF9fdjJkaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3YyZGYpIF9tbV9zZXR6ZXJvX3BkKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2N2dGVwdTY0X3BkIChfX20yNTZpIF9fQSkgeworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX2N2dHVxcTJwZDI1Nl9tYXNrICgoX192NGRpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjRkZikgX21tMjU2X3NldHplcm9fcGQoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2N2dGVwdTY0X3BkIChfX20yNTZkIF9fVywgX19tbWFzazggX19VLCBfX20yNTZpIF9fQSkgeworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX2N2dHVxcTJwZDI1Nl9tYXNrICgoX192NGRpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjRkZikgX19XLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9jdnRlcHU2NF9wZCAoX19tbWFzazggX19VLCBfX20yNTZpIF9fQSkgeworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX2N2dHVxcTJwZDI1Nl9tYXNrICgoX192NGRpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjRkZikgX21tMjU2X3NldHplcm9fcGQoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jdnRlcHU2NF9wcyAoX19tMTI4aSBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2N2dHVxcTJwczEyOF9tYXNrICgoX192MmRpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjRzZikgX21tX3NldHplcm9fcHMoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfY3Z0ZXB1NjRfcHMgKF9fbTEyOCBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2N2dHVxcTJwczEyOF9tYXNrICgoX192MmRpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjRzZikgX19XLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2N2dGVwdTY0X3BzIChfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BKSB7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9jdnR1cXEycHMxMjhfbWFzayAoKF9fdjJkaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3Y0c2YpIF9tbV9zZXR6ZXJvX3BzKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY3Z0ZXB1NjRfcHMgKF9fbTI1NmkgX19BKSB7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9jdnR1cXEycHMyNTZfbWFzayAoKF9fdjRkaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3Y0c2YpIF9tbV9zZXR6ZXJvX3BzKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2N2dGVwdTY0X3BzIChfX20xMjggX19XLCBfX21tYXNrOCBfX1UsIF9fbTI1NmkgX19BKSB7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9jdnR1cXEycHMyNTZfbWFzayAoKF9fdjRkaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3Y0c2YpIF9fVywKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9jdnRlcHU2NF9wcyAoX19tbWFzazggX19VLCBfX20yNTZpIF9fQSkgeworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY3Z0dXFxMnBzMjU2X21hc2sgKChfX3Y0ZGkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192NHNmKSBfbW1fc2V0emVyb19wcygpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworI2RlZmluZSBfbW1fcmFuZ2VfcGQoQSwgQiwgQykgX19leHRlbnNpb25fXyAoeyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX3JhbmdlcGQxMjhfbWFzaygoX192MmRmKShfX20xMjhkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZikoX19tMTI4ZCkoQiksIChpbnQpKEMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKV9tbV9zZXR6ZXJvX3BkKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2tfcmFuZ2VfcGQoVywgVSwgQSwgQiwgQykgX19leHRlbnNpb25fXyAoeyAgICAgICAgICBcCisgIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX3JhbmdlcGQxMjhfbWFzaygoX192MmRmKShfX20xMjhkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZikoX19tMTI4ZCkoQiksIChpbnQpKEMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2t6X3JhbmdlX3BkKFUsIEEsIEIsIEMpIF9fZXh0ZW5zaW9uX18gKHsgICAgICAgICAgICAgIFwKKyAgKF9fbTEyOGQpX19idWlsdGluX2lhMzJfcmFuZ2VwZDEyOF9tYXNrKChfX3YyZGYpKF9fbTEyOGQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShCKSwgKGludCkoQyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpX21tX3NldHplcm9fcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X3JhbmdlX3BkKEEsIEIsIEMpIF9fZXh0ZW5zaW9uX18gKHsgICAgICAgICAgICAgICAgICAgICAgXAorICAoX19tMjU2ZClfX2J1aWx0aW5faWEzMl9yYW5nZXBkMjU2X21hc2soKF9fdjRkZikoX19tMjU2ZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGYpKF9fbTI1NmQpKEIpLCAoaW50KShDKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkZilfbW0yNTZfc2V0emVyb19wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9tYXNrX3JhbmdlX3BkKFcsIFUsIEEsIEIsIEMpIF9fZXh0ZW5zaW9uX18gKHsgICAgICAgXAorICAoX19tMjU2ZClfX2J1aWx0aW5faWEzMl9yYW5nZXBkMjU2X21hc2soKF9fdjRkZikoX19tMjU2ZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGYpKF9fbTI1NmQpKEIpLCAoaW50KShDKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkZikoX19tMjU2ZCkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSkpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9tYXNrel9yYW5nZV9wZChVLCBBLCBCLCBDKSBfX2V4dGVuc2lvbl9fICh7ICAgICAgICAgICBcCisgIChfX20yNTZkKV9fYnVpbHRpbl9pYTMyX3JhbmdlcGQyNTZfbWFzaygoX192NGRmKShfX20yNTZkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkZikoX19tMjU2ZCkoQiksIChpbnQpKEMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRmKV9tbTI1Nl9zZXR6ZXJvX3BkKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSkpOyB9KQorCisjZGVmaW5lIF9tbV9yYW5nZV9wcyhBLCBCLCBDKSBfX2V4dGVuc2lvbl9fICh7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKF9fbTEyOClfX2J1aWx0aW5faWEzMl9yYW5nZXBzMTI4X21hc2soKF9fdjRzZikoX19tMTI4KShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKShfX20xMjgpKEIpLCAoaW50KShDKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKV9tbV9zZXR6ZXJvX3BzKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsgfSkKKworI2RlZmluZSBfbW1fbWFza19yYW5nZV9wcyhXLCBVLCBBLCBCLCBDKSBfX2V4dGVuc2lvbl9fICh7ICAgICAgICAgIFwKKyAgKF9fbTEyOClfX2J1aWx0aW5faWEzMl9yYW5nZXBzMTI4X21hc2soKF9fdjRzZikoX19tMTI4KShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKShfX20xMjgpKEIpLCAoaW50KShDKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKShfX20xMjgpKFcpLCAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW1fbWFza3pfcmFuZ2VfcHMoVSwgQSwgQiwgQykgX19leHRlbnNpb25fXyAoeyAgICAgICAgICAgICAgXAorICAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX3JhbmdlcHMxMjhfbWFzaygoX192NHNmKShfX20xMjgpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpKF9fbTEyOCkoQiksIChpbnQpKEMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpX21tX3NldHplcm9fcHMoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfcmFuZ2VfcHMoQSwgQiwgQykgX19leHRlbnNpb25fXyAoeyAgICAgICAgICAgICAgICAgICAgICBcCisgIChfX20yNTYpX19idWlsdGluX2lhMzJfcmFuZ2VwczI1Nl9tYXNrKChfX3Y4c2YpKF9fbTI1NikoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzZikoX19tMjU2KShCKSwgKGludCkoQyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzZilfbW0yNTZfc2V0emVyb19wcygpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21hc2tfcmFuZ2VfcHMoVywgVSwgQSwgQiwgQykgX19leHRlbnNpb25fXyAoeyAgICAgICBcCisgIChfX20yNTYpX19idWlsdGluX2lhMzJfcmFuZ2VwczI1Nl9tYXNrKChfX3Y4c2YpKF9fbTI1NikoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzZikoX19tMjU2KShCKSwgKGludCkoQyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzZikoX19tMjU2KShXKSwgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21hc2t6X3JhbmdlX3BzKFUsIEEsIEIsIEMpIF9fZXh0ZW5zaW9uX18gKHsgICAgICAgICAgIFwKKyAgKF9fbTI1NilfX2J1aWx0aW5faWEzMl9yYW5nZXBzMjU2X21hc2soKF9fdjhzZikoX19tMjU2KShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNmKShfX20yNTYpKEIpLCAoaW50KShDKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNmKV9tbTI1Nl9zZXR6ZXJvX3BzKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tX3JlZHVjZV9wZChBLCBCKSBfX2V4dGVuc2lvbl9fICh7ICAgICAgICAgICAgICAgIFwKKyAgKF9fbTEyOGQpX19idWlsdGluX2lhMzJfcmVkdWNlcGQxMjhfbWFzaygoX192MmRmKShfX20xMjhkKShBKSwgKGludCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKV9tbV9zZXR6ZXJvX3BkKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrX3JlZHVjZV9wZChXLCBVLCBBLCBCKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGQpX19idWlsdGluX2lhMzJfcmVkdWNlcGQxMjhfbWFzaygoX192MmRmKShfX20xMjhkKShBKSwgKGludCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSkpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrel9yZWR1Y2VfcGQoVSwgQSwgQikgX19leHRlbnNpb25fXyAoeyAgICAgXAorICAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9yZWR1Y2VwZDEyOF9tYXNrKChfX3YyZGYpKF9fbTEyOGQpKEEpLCAoaW50KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpX21tX3NldHplcm9fcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSkpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9yZWR1Y2VfcGQoQSwgQikgX19leHRlbnNpb25fXyAoeyAgICAgICAgICAgICAgICBcCisgIChfX20yNTZkKV9fYnVpbHRpbl9pYTMyX3JlZHVjZXBkMjU2X21hc2soKF9fdjRkZikoX19tMjU2ZCkoQSksIChpbnQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkZilfbW0yNTZfc2V0emVyb19wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsgfSkKKworI2RlZmluZSBfbW0yNTZfbWFza19yZWR1Y2VfcGQoVywgVSwgQSwgQikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTZkKV9fYnVpbHRpbl9pYTMyX3JlZHVjZXBkMjU2X21hc2soKF9fdjRkZikoX19tMjU2ZCkoQSksIChpbnQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkZikoX19tMjU2ZCkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfbWFza3pfcmVkdWNlX3BkKFUsIEEsIEIpIF9fZXh0ZW5zaW9uX18gKHsgICAgIFwKKyAgKF9fbTI1NmQpX19idWlsdGluX2lhMzJfcmVkdWNlcGQyNTZfbWFzaygoX192NGRmKShfX20yNTZkKShBKSwgKGludCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRmKV9tbTI1Nl9zZXR6ZXJvX3BkKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW1fcmVkdWNlX3BzKEEsIEIpIF9fZXh0ZW5zaW9uX18gKHsgICAgICAgICAgICAgICAgICAgXAorICAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX3JlZHVjZXBzMTI4X21hc2soKF9fdjRzZikoX19tMTI4KShBKSwgKGludCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpX21tX3NldHplcm9fcHMoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsgfSkKKworI2RlZmluZSBfbW1fbWFza19yZWR1Y2VfcHMoVywgVSwgQSwgQikgX19leHRlbnNpb25fXyAoeyAgICBcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfcmVkdWNlcHMxMjhfbWFzaygoX192NHNmKShfX20xMjgpKEEpLCAoaW50KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2t6X3JlZHVjZV9wcyhVLCBBLCBCKSBfX2V4dGVuc2lvbl9fICh7ICAgICAgICBcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfcmVkdWNlcHMxMjhfbWFzaygoX192NHNmKShfX20xMjgpKEEpLCAoaW50KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZilfbW1fc2V0emVyb19wcygpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfcmVkdWNlX3BzKEEsIEIpIF9fZXh0ZW5zaW9uX18gKHsgICAgICAgICAgICAgICAgXAorICAoX19tMjU2KV9fYnVpbHRpbl9pYTMyX3JlZHVjZXBzMjU2X21hc2soKF9fdjhzZikoX19tMjU2KShBKSwgKGludCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2YpX21tMjU2X3NldHplcm9fcHMoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsgfSkKKworI2RlZmluZSBfbW0yNTZfbWFza19yZWR1Y2VfcHMoVywgVSwgQSwgQikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTYpX19idWlsdGluX2lhMzJfcmVkdWNlcHMyNTZfbWFzaygoX192OHNmKShfX20yNTYpKEEpLCAoaW50KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzZikoX19tMjU2KShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21hc2t6X3JlZHVjZV9wcyhVLCBBLCBCKSBfX2V4dGVuc2lvbl9fICh7ICAgICBcCisgIChfX20yNTYpX19idWlsdGluX2lhMzJfcmVkdWNlcHMyNTZfbWFzaygoX192OHNmKShfX20yNTYpKEEpLCAoaW50KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzZilfbW0yNTZfc2V0emVyb19wcygpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbW92ZXBpMzJfbWFzayAoX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tbWFzazgpIF9fYnVpbHRpbl9pYTMyX2N2dGQybWFzazEyOCAoKF9fdjRzaSkgX19BKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbW92ZXBpMzJfbWFzayAoX19tMjU2aSBfX0EpCit7CisgIHJldHVybiAoX19tbWFzazgpIF9fYnVpbHRpbl9pYTMyX2N2dGQybWFzazI1NiAoKF9fdjhzaSkgX19BKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tb3ZtX2VwaTMyIChfX21tYXNrOCBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfY3Z0bWFzazJkMTI4IChfX0EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21vdm1fZXBpMzIgKF9fbW1hc2s4IF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9jdnRtYXNrMmQyNTYgKF9fQSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbW92bV9lcGk2NCAoX19tbWFzazggX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2N2dG1hc2sycTEyOCAoX19BKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tb3ZtX2VwaTY0IChfX21tYXNrOCBfX0EpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfY3Z0bWFzazJxMjU2IChfX0EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tb3ZlcGk2NF9tYXNrIChfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX21tYXNrOCkgX19idWlsdGluX2lhMzJfY3Z0cTJtYXNrMTI4ICgoX192MmRpKSBfX0EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tb3ZlcGk2NF9tYXNrIChfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX21tYXNrOCkgX19idWlsdGluX2lhMzJfY3Z0cTJtYXNrMjU2ICgoX192NGRpKSBfX0EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfYnJvYWRjYXN0X2YzMngyIChfX20xMjggX19BKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfYnJvYWRjYXN0ZjMyeDJfMjU2X21hc2sgKChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192OHNmKV9tbTI1Nl91bmRlZmluZWRfcHMoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfYnJvYWRjYXN0X2YzMngyIChfX20yNTYgX19PLCBfX21tYXNrOCBfX00sIF9fbTEyOCBfX0EpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9icm9hZGNhc3RmMzJ4Ml8yNTZfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgIChfX3Y4c2YpIF9fTywKKyAgICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfYnJvYWRjYXN0X2YzMngyIChfX21tYXNrOCBfX00sIF9fbTEyOCBfX0EpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9icm9hZGNhc3RmMzJ4Ml8yNTZfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgIChfX3Y4c2YpIF9tbTI1Nl9zZXR6ZXJvX3BzICgpLAorICAgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfYnJvYWRjYXN0X2Y2NHgyIChfX20xMjhkIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9icm9hZGNhc3RmNjR4Ml8yNTZfbWFzayAoKF9fdjJkZikgX19BLAorICAgICAgICAgICAgICAgICAoX192NGRmKV9tbTI1Nl91bmRlZmluZWRfcGQoKSwKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19icm9hZGNhc3RfZjY0eDIgKF9fbTI1NmQgX19PLCBfX21tYXNrOCBfX00sIF9fbTEyOGQgX19BKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX2Jyb2FkY2FzdGY2NHgyXzI1Nl9tYXNrICgoX192MmRmKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3Y0ZGYpIF9fTywKKyAgICAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9icm9hZGNhc3RfZjY0eDIgKF9fbW1hc2s4IF9fTSwgX19tMTI4ZCBfX0EpCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfYnJvYWRjYXN0ZjY0eDJfMjU2X21hc2sgKChfX3YyZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjRkZikgX21tMjU2X3NldHplcm9fcHMgKCksCisgICAgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fYnJvYWRjYXN0X2kzMngyIChfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9icm9hZGNhc3RpMzJ4Ml8xMjhfbWFzayAoKF9fdjRzaSkgX19BLAorICAgICAgICAgICAgICAgICAoX192NHNpKV9tbV91bmRlZmluZWRfc2kxMjgoKSwKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19icm9hZGNhc3RfaTMyeDIgKF9fbTEyOGkgX19PLCBfX21tYXNrOCBfX00sIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2Jyb2FkY2FzdGkzMngyXzEyOF9tYXNrICgoX192NHNpKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3Y0c2kpIF9fTywKKyAgICAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9icm9hZGNhc3RfaTMyeDIgKF9fbW1hc2s4IF9fTSwgX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfYnJvYWRjYXN0aTMyeDJfMTI4X21hc2sgKChfX3Y0c2kpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjRzaSkgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfYnJvYWRjYXN0X2kzMngyIChfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9icm9hZGNhc3RpMzJ4Ml8yNTZfbWFzayAoKF9fdjRzaSkgX19BLAorICAgICAgICAgICAgICAgICAoX192OHNpKV9tbTI1Nl91bmRlZmluZWRfc2kyNTYoKSwKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19icm9hZGNhc3RfaTMyeDIgKF9fbTI1NmkgX19PLCBfX21tYXNrOCBfX00sIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX2Jyb2FkY2FzdGkzMngyXzI1Nl9tYXNrICgoX192NHNpKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3Y4c2kpIF9fTywKKyAgICAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9icm9hZGNhc3RfaTMyeDIgKF9fbW1hc2s4IF9fTSwgX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfYnJvYWRjYXN0aTMyeDJfMjU2X21hc2sgKChfX3Y0c2kpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjhzaSkgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfYnJvYWRjYXN0X2k2NHgyIChfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9icm9hZGNhc3RpNjR4Ml8yNTZfbWFzayAoKF9fdjJkaSkgX19BLAorICAgICAgICAgICAgICAgICAoX192NGRpKV9tbTI1Nl91bmRlZmluZWRfc2kyNTYoKSwKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19icm9hZGNhc3RfaTY0eDIgKF9fbTI1NmkgX19PLCBfX21tYXNrOCBfX00sIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX2Jyb2FkY2FzdGk2NHgyXzI1Nl9tYXNrICgoX192MmRpKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3Y0ZGkpIF9fTywKKyAgICAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9icm9hZGNhc3RfaTY0eDIgKF9fbW1hc2s4IF9fTSwgX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfYnJvYWRjYXN0aTY0eDJfMjU2X21hc2sgKChfX3YyZGkpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjRkaSkgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgICAgIF9fTSk7Cit9CisKKyNkZWZpbmUgX21tMjU2X2V4dHJhY3RmNjR4Ml9wZChBLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9leHRyYWN0ZjY0eDJfMjU2X21hc2soKF9fdjRkZikoX19tMjU2ZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpX21tX3NldHplcm9fcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsgfSkKKworI2RlZmluZSBfbW0yNTZfbWFza19leHRyYWN0ZjY0eDJfcGQoVywgVSwgQSwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGQpX19idWlsdGluX2lhMzJfZXh0cmFjdGY2NHgyXzI1Nl9tYXNrKChfX3Y0ZGYpKF9fbTI1NmQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21hc2t6X2V4dHJhY3RmNjR4Ml9wZChVLCBBLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9leHRyYWN0ZjY0eDJfMjU2X21hc2soKF9fdjRkZikoX19tMjU2ZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpX21tX3NldHplcm9fcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X2V4dHJhY3RpNjR4Ml9lcGk2NChBLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9leHRyYWN0aTY0eDJfMjU2X21hc2soKF9fdjRkaSkoX19tMjU2aSkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGkpX21tX3NldHplcm9fZGkoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsgfSkKKworI2RlZmluZSBfbW0yNTZfbWFza19leHRyYWN0aTY0eDJfZXBpNjQoVywgVSwgQSwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGkpX19idWlsdGluX2lhMzJfZXh0cmFjdGk2NHgyXzI1Nl9tYXNrKChfX3Y0ZGkpKF9fbTI1NmkpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRpKShfX20xMjhpKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21hc2t6X2V4dHJhY3RpNjR4Ml9lcGk2NChVLCBBLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9leHRyYWN0aTY0eDJfMjU2X21hc2soKF9fdjRkaSkoX19tMjU2aSkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGkpX21tX3NldHplcm9fZGkoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X2luc2VydGY2NHgyKEEsIEIsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTZkKV9fYnVpbHRpbl9pYTMyX2luc2VydGY2NHgyXzI1Nl9tYXNrKChfX3Y0ZGYpKF9fbTI1NmQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fbTEyOGQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkZilfbW0yNTZfc2V0emVyb19wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21hc2tfaW5zZXJ0ZjY0eDIoVywgVSwgQSwgQiwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmQpX19idWlsdGluX2lhMzJfaW5zZXJ0ZjY0eDJfMjU2X21hc2soKF9fdjRkZikoX19tMjU2ZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZikoX19tMTI4ZCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRmKShfX20yNTZkKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfbWFza3pfaW5zZXJ0ZjY0eDIoVSwgQSwgQiwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmQpX19idWlsdGluX2lhMzJfaW5zZXJ0ZjY0eDJfMjU2X21hc2soKF9fdjRkZikoX19tMjU2ZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZikoX19tMTI4ZCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRmKV9tbTI1Nl9zZXR6ZXJvX3BkKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X2luc2VydGk2NHgyKEEsIEIsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX2luc2VydGk2NHgyXzI1Nl9tYXNrKChfX3Y0ZGkpKF9fbTI1NmkpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGkpKF9fbTEyOGkpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkaSlfbW0yNTZfc2V0emVyb19zaTI1NigpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21hc2tfaW5zZXJ0aTY0eDIoVywgVSwgQSwgQiwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmkpX19idWlsdGluX2lhMzJfaW5zZXJ0aTY0eDJfMjU2X21hc2soKF9fdjRkaSkoX19tMjU2aSkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkaSkoX19tMTI4aSkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRpKShfX20yNTZpKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfbWFza3pfaW5zZXJ0aTY0eDIoVSwgQSwgQiwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmkpX19idWlsdGluX2lhMzJfaW5zZXJ0aTY0eDJfMjU2X21hc2soKF9fdjRkaSkoX19tMjU2aSkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkaSkoX19tMTI4aSkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRpKV9tbTI1Nl9zZXR6ZXJvX3NpMjU2KCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2tfZnBjbGFzc19wZF9tYXNrKFUsIEEsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl9mcGNsYXNzcGQxMjhfbWFzaygoX192MmRmKShfX20xMjhkKShBKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tX2ZwY2xhc3NfcGRfbWFzayhBLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tbWFzazgpX19idWlsdGluX2lhMzJfZnBjbGFzc3BkMTI4X21hc2soKF9fdjJkZikoX19tMTI4ZCkoQSksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21hc2tfZnBjbGFzc19wZF9tYXNrKFUsIEEsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl9mcGNsYXNzcGQyNTZfbWFzaygoX192NGRmKShfX20yNTZkKShBKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X2ZwY2xhc3NfcGRfbWFzayhBLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tbWFzazgpX19idWlsdGluX2lhMzJfZnBjbGFzc3BkMjU2X21hc2soKF9fdjRkZikoX19tMjU2ZCkoQSksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2tfZnBjbGFzc19wc19tYXNrKFUsIEEsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl9mcGNsYXNzcHMxMjhfbWFzaygoX192NHNmKShfX20xMjgpKEEpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW1fZnBjbGFzc19wc19tYXNrKEEsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl9mcGNsYXNzcHMxMjhfbWFzaygoX192NHNmKShfX20xMjgpKEEpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9tYXNrX2ZwY2xhc3NfcHNfbWFzayhVLCBBLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tbWFzazgpX19idWlsdGluX2lhMzJfZnBjbGFzc3BzMjU2X21hc2soKF9fdjhzZikoX19tMjU2KShBKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X2ZwY2xhc3NfcHNfbWFzayhBLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tbWFzazgpX19idWlsdGluX2lhMzJfZnBjbGFzc3BzMjU2X21hc2soKF9fdjhzZikoX19tMjU2KShBKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsgfSkKKworI3VuZGVmIF9fREVGQVVMVF9GTl9BVFRSUworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL2F2eDUxMnZsaW50cmluLmggYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9hdng1MTJ2bGludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NWNlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9hdng1MTJ2bGludHJpbi5oCkBAIC0wLDAgKzEsOTE3MCBAQAorLyo9PT0tLS0tIGF2eDUxMnZsaW50cmluLmggLSBBVlg1MTJWTCBpbnRyaW5zaWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqCisgKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisgKi8KKworI2lmbmRlZiBfX0lNTUlOVFJJTl9ICisjZXJyb3IgIk5ldmVyIHVzZSA8YXZ4NTEydmxpbnRyaW4uaD4gZGlyZWN0bHk7IGluY2x1ZGUgPGltbWludHJpbi5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9fQVZYNTEyVkxJTlRSSU5fSAorI2RlZmluZSBfX0FWWDUxMlZMSU5UUklOX0gKKworI2RlZmluZSBfX0RFRkFVTFRfRk5fQVRUUlMgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fLCBfX3RhcmdldF9fKCJhdng1MTJ2bCIpKSkKKworLyogRG9lc24ndCByZXF1aXJlIGF2eDUxMnZsLCB1c2VkIGluIGF2eDUxMmRxaW50cmluLmggKi8KK3N0YXRpYyAgX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18sIF9fdGFyZ2V0X18oImF2eDUxMmYiKSkpCitfbW1fc2V0emVyb19kaSh2b2lkKSB7CisgIHJldHVybiAoX19tMTI4aSkoX192MmRpKXsgMExMLCAwTEx9OworfQorCisvKiBJbnRlZ2VyIGNvbXBhcmUgKi8KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY21wZXFfZXBpMzJfbWFzayhfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl9wY21wZXFkMTI4X21hc2soKF9fdjRzaSlfX2EsIChfX3Y0c2kpX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2NtcGVxX2VwaTMyX21hc2soX19tbWFzazggX191LCBfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl9wY21wZXFkMTI4X21hc2soKF9fdjRzaSlfX2EsIChfX3Y0c2kpX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbXBlcV9lcHUzMl9tYXNrKF9fbTEyOGkgX19hLCBfX20xMjhpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX3VjbXBkMTI4X21hc2soKF9fdjRzaSlfX2EsIChfX3Y0c2kpX19iLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jbXBlcV9lcHUzMl9tYXNrKF9fbW1hc2s4IF9fdSwgX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfdWNtcGQxMjhfbWFzaygoX192NHNpKV9fYSwgKF9fdjRzaSlfX2IsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9jbXBlcV9lcGkzMl9tYXNrKF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX3BjbXBlcWQyNTZfbWFzaygoX192OHNpKV9fYSwgKF9fdjhzaSlfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfY21wZXFfZXBpMzJfbWFzayhfX21tYXNrOCBfX3UsIF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX3BjbXBlcWQyNTZfbWFzaygoX192OHNpKV9fYSwgKF9fdjhzaSlfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2NtcGVxX2VwdTMyX21hc2soX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfdWNtcGQyNTZfbWFzaygoX192OHNpKV9fYSwgKF9fdjhzaSlfX2IsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2NtcGVxX2VwdTMyX21hc2soX19tbWFzazggX191LCBfX20yNTZpIF9fYSwgX19tMjU2aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl91Y21wZDI1Nl9tYXNrKChfX3Y4c2kpX19hLCAoX192OHNpKV9fYiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NtcGVxX2VwaTY0X21hc2soX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfcGNtcGVxcTEyOF9tYXNrKChfX3YyZGkpX19hLCAoX192MmRpKV9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jbXBlcV9lcGk2NF9tYXNrKF9fbW1hc2s4IF9fdSwgX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfcGNtcGVxcTEyOF9tYXNrKChfX3YyZGkpX19hLCAoX192MmRpKV9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY21wZXFfZXB1NjRfbWFzayhfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl91Y21wcTEyOF9tYXNrKChfX3YyZGkpX19hLCAoX192MmRpKV9fYiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfY21wZXFfZXB1NjRfbWFzayhfX21tYXNrOCBfX3UsIF9fbTEyOGkgX19hLCBfX20xMjhpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX3VjbXBxMTI4X21hc2soKF9fdjJkaSlfX2EsIChfX3YyZGkpX19iLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY21wZXFfZXBpNjRfbWFzayhfX20yNTZpIF9fYSwgX19tMjU2aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl9wY21wZXFxMjU2X21hc2soKF9fdjRkaSlfX2EsIChfX3Y0ZGkpX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2NtcGVxX2VwaTY0X21hc2soX19tbWFzazggX191LCBfX20yNTZpIF9fYSwgX19tMjU2aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl9wY21wZXFxMjU2X21hc2soKF9fdjRkaSlfX2EsIChfX3Y0ZGkpX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9jbXBlcV9lcHU2NF9tYXNrKF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX3VjbXBxMjU2X21hc2soKF9fdjRkaSlfX2EsIChfX3Y0ZGkpX19iLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jbXBlcV9lcHU2NF9tYXNrKF9fbW1hc2s4IF9fdSwgX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfdWNtcHEyNTZfbWFzaygoX192NGRpKV9fYSwgKF9fdjRkaSlfX2IsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NtcGdlX2VwaTMyX21hc2soX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfY21wZDEyOF9tYXNrKChfX3Y0c2kpX19hLCAoX192NHNpKV9fYiwgNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jbXBnZV9lcGkzMl9tYXNrKF9fbW1hc2s4IF9fdSwgX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfY21wZDEyOF9tYXNrKChfX3Y0c2kpX19hLCAoX192NHNpKV9fYiwgNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY21wZ2VfZXB1MzJfbWFzayhfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl91Y21wZDEyOF9tYXNrKChfX3Y0c2kpX19hLCAoX192NHNpKV9fYiwgNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfY21wZ2VfZXB1MzJfbWFzayhfX21tYXNrOCBfX3UsIF9fbTEyOGkgX19hLCBfX20xMjhpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX3VjbXBkMTI4X21hc2soKF9fdjRzaSlfX2EsIChfX3Y0c2kpX19iLCA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY21wZ2VfZXBpMzJfbWFzayhfX20yNTZpIF9fYSwgX19tMjU2aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl9jbXBkMjU2X21hc2soKF9fdjhzaSlfX2EsIChfX3Y4c2kpX19iLCA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2NtcGdlX2VwaTMyX21hc2soX19tbWFzazggX191LCBfX20yNTZpIF9fYSwgX19tMjU2aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl9jbXBkMjU2X21hc2soKF9fdjhzaSlfX2EsIChfX3Y4c2kpX19iLCA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9jbXBnZV9lcHUzMl9tYXNrKF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX3VjbXBkMjU2X21hc2soKF9fdjhzaSlfX2EsIChfX3Y4c2kpX19iLCA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jbXBnZV9lcHUzMl9tYXNrKF9fbW1hc2s4IF9fdSwgX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfdWNtcGQyNTZfbWFzaygoX192OHNpKV9fYSwgKF9fdjhzaSlfX2IsIDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbXBnZV9lcGk2NF9tYXNrKF9fbTEyOGkgX19hLCBfX20xMjhpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX2NtcHExMjhfbWFzaygoX192MmRpKV9fYSwgKF9fdjJkaSlfX2IsIDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfY21wZ2VfZXBpNjRfbWFzayhfX21tYXNrOCBfX3UsIF9fbTEyOGkgX19hLCBfX20xMjhpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX2NtcHExMjhfbWFzaygoX192MmRpKV9fYSwgKF9fdjJkaSlfX2IsIDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NtcGdlX2VwdTY0X21hc2soX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfdWNtcHExMjhfbWFzaygoX192MmRpKV9fYSwgKF9fdjJkaSlfX2IsIDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2NtcGdlX2VwdTY0X21hc2soX19tbWFzazggX191LCBfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl91Y21wcTEyOF9tYXNrKChfX3YyZGkpX19hLCAoX192MmRpKV9fYiwgNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2NtcGdlX2VwaTY0X21hc2soX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfY21wcTI1Nl9tYXNrKChfX3Y0ZGkpX19hLCAoX192NGRpKV9fYiwgNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jbXBnZV9lcGk2NF9tYXNrKF9fbW1hc2s4IF9fdSwgX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfY21wcTI1Nl9tYXNrKChfX3Y0ZGkpX19hLCAoX192NGRpKV9fYiwgNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY21wZ2VfZXB1NjRfbWFzayhfX20yNTZpIF9fYSwgX19tMjU2aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl91Y21wcTI1Nl9tYXNrKChfX3Y0ZGkpX19hLCAoX192NGRpKV9fYiwgNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfY21wZ2VfZXB1NjRfbWFzayhfX21tYXNrOCBfX3UsIF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX3VjbXBxMjU2X21hc2soKF9fdjRkaSlfX2EsIChfX3Y0ZGkpX19iLCA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY21wZ3RfZXBpMzJfbWFzayhfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl9wY21wZ3RkMTI4X21hc2soKF9fdjRzaSlfX2EsIChfX3Y0c2kpX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2NtcGd0X2VwaTMyX21hc2soX19tbWFzazggX191LCBfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl9wY21wZ3RkMTI4X21hc2soKF9fdjRzaSlfX2EsIChfX3Y0c2kpX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbXBndF9lcHUzMl9tYXNrKF9fbTEyOGkgX19hLCBfX20xMjhpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX3VjbXBkMTI4X21hc2soKF9fdjRzaSlfX2EsIChfX3Y0c2kpX19iLCA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jbXBndF9lcHUzMl9tYXNrKF9fbW1hc2s4IF9fdSwgX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfdWNtcGQxMjhfbWFzaygoX192NHNpKV9fYSwgKF9fdjRzaSlfX2IsIDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9jbXBndF9lcGkzMl9tYXNrKF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX3BjbXBndGQyNTZfbWFzaygoX192OHNpKV9fYSwgKF9fdjhzaSlfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfY21wZ3RfZXBpMzJfbWFzayhfX21tYXNrOCBfX3UsIF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX3BjbXBndGQyNTZfbWFzaygoX192OHNpKV9fYSwgKF9fdjhzaSlfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2NtcGd0X2VwdTMyX21hc2soX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfdWNtcGQyNTZfbWFzaygoX192OHNpKV9fYSwgKF9fdjhzaSlfX2IsIDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2NtcGd0X2VwdTMyX21hc2soX19tbWFzazggX191LCBfX20yNTZpIF9fYSwgX19tMjU2aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl91Y21wZDI1Nl9tYXNrKChfX3Y4c2kpX19hLCAoX192OHNpKV9fYiwgNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NtcGd0X2VwaTY0X21hc2soX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfcGNtcGd0cTEyOF9tYXNrKChfX3YyZGkpX19hLCAoX192MmRpKV9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jbXBndF9lcGk2NF9tYXNrKF9fbW1hc2s4IF9fdSwgX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfcGNtcGd0cTEyOF9tYXNrKChfX3YyZGkpX19hLCAoX192MmRpKV9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY21wZ3RfZXB1NjRfbWFzayhfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl91Y21wcTEyOF9tYXNrKChfX3YyZGkpX19hLCAoX192MmRpKV9fYiwgNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfY21wZ3RfZXB1NjRfbWFzayhfX21tYXNrOCBfX3UsIF9fbTEyOGkgX19hLCBfX20xMjhpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX3VjbXBxMTI4X21hc2soKF9fdjJkaSlfX2EsIChfX3YyZGkpX19iLCA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY21wZ3RfZXBpNjRfbWFzayhfX20yNTZpIF9fYSwgX19tMjU2aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl9wY21wZ3RxMjU2X21hc2soKF9fdjRkaSlfX2EsIChfX3Y0ZGkpX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2NtcGd0X2VwaTY0X21hc2soX19tbWFzazggX191LCBfX20yNTZpIF9fYSwgX19tMjU2aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl9wY21wZ3RxMjU2X21hc2soKF9fdjRkaSlfX2EsIChfX3Y0ZGkpX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9jbXBndF9lcHU2NF9tYXNrKF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX3VjbXBxMjU2X21hc2soKF9fdjRkaSlfX2EsIChfX3Y0ZGkpX19iLCA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jbXBndF9lcHU2NF9tYXNrKF9fbW1hc2s4IF9fdSwgX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfdWNtcHEyNTZfbWFzaygoX192NGRpKV9fYSwgKF9fdjRkaSlfX2IsIDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbXBsZV9lcGkzMl9tYXNrKF9fbTEyOGkgX19hLCBfX20xMjhpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX2NtcGQxMjhfbWFzaygoX192NHNpKV9fYSwgKF9fdjRzaSlfX2IsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfY21wbGVfZXBpMzJfbWFzayhfX21tYXNrOCBfX3UsIF9fbTEyOGkgX19hLCBfX20xMjhpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX2NtcGQxMjhfbWFzaygoX192NHNpKV9fYSwgKF9fdjRzaSlfX2IsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NtcGxlX2VwdTMyX21hc2soX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfdWNtcGQxMjhfbWFzaygoX192NHNpKV9fYSwgKF9fdjRzaSlfX2IsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2NtcGxlX2VwdTMyX21hc2soX19tbWFzazggX191LCBfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl91Y21wZDEyOF9tYXNrKChfX3Y0c2kpX19hLCAoX192NHNpKV9fYiwgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2NtcGxlX2VwaTMyX21hc2soX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfY21wZDI1Nl9tYXNrKChfX3Y4c2kpX19hLCAoX192OHNpKV9fYiwgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jbXBsZV9lcGkzMl9tYXNrKF9fbW1hc2s4IF9fdSwgX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfY21wZDI1Nl9tYXNrKChfX3Y4c2kpX19hLCAoX192OHNpKV9fYiwgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY21wbGVfZXB1MzJfbWFzayhfX20yNTZpIF9fYSwgX19tMjU2aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl91Y21wZDI1Nl9tYXNrKChfX3Y4c2kpX19hLCAoX192OHNpKV9fYiwgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfY21wbGVfZXB1MzJfbWFzayhfX21tYXNrOCBfX3UsIF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX3VjbXBkMjU2X21hc2soKF9fdjhzaSlfX2EsIChfX3Y4c2kpX19iLCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY21wbGVfZXBpNjRfbWFzayhfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl9jbXBxMTI4X21hc2soKF9fdjJkaSlfX2EsIChfX3YyZGkpX19iLCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2NtcGxlX2VwaTY0X21hc2soX19tbWFzazggX191LCBfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl9jbXBxMTI4X21hc2soKF9fdjJkaSlfX2EsIChfX3YyZGkpX19iLCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbXBsZV9lcHU2NF9tYXNrKF9fbTEyOGkgX19hLCBfX20xMjhpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX3VjbXBxMTI4X21hc2soKF9fdjJkaSlfX2EsIChfX3YyZGkpX19iLCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jbXBsZV9lcHU2NF9tYXNrKF9fbW1hc2s4IF9fdSwgX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfdWNtcHExMjhfbWFzaygoX192MmRpKV9fYSwgKF9fdjJkaSlfX2IsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9jbXBsZV9lcGk2NF9tYXNrKF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX2NtcHEyNTZfbWFzaygoX192NGRpKV9fYSwgKF9fdjRkaSlfX2IsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfY21wbGVfZXBpNjRfbWFzayhfX21tYXNrOCBfX3UsIF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX2NtcHEyNTZfbWFzaygoX192NGRpKV9fYSwgKF9fdjRkaSlfX2IsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2NtcGxlX2VwdTY0X21hc2soX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfdWNtcHEyNTZfbWFzaygoX192NGRpKV9fYSwgKF9fdjRkaSlfX2IsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2NtcGxlX2VwdTY0X21hc2soX19tbWFzazggX191LCBfX20yNTZpIF9fYSwgX19tMjU2aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl91Y21wcTI1Nl9tYXNrKChfX3Y0ZGkpX19hLCAoX192NGRpKV9fYiwgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NtcGx0X2VwaTMyX21hc2soX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfY21wZDEyOF9tYXNrKChfX3Y0c2kpX19hLCAoX192NHNpKV9fYiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jbXBsdF9lcGkzMl9tYXNrKF9fbW1hc2s4IF9fdSwgX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfY21wZDEyOF9tYXNrKChfX3Y0c2kpX19hLCAoX192NHNpKV9fYiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY21wbHRfZXB1MzJfbWFzayhfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl91Y21wZDEyOF9tYXNrKChfX3Y0c2kpX19hLCAoX192NHNpKV9fYiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfY21wbHRfZXB1MzJfbWFzayhfX21tYXNrOCBfX3UsIF9fbTEyOGkgX19hLCBfX20xMjhpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX3VjbXBkMTI4X21hc2soKF9fdjRzaSlfX2EsIChfX3Y0c2kpX19iLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY21wbHRfZXBpMzJfbWFzayhfX20yNTZpIF9fYSwgX19tMjU2aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl9jbXBkMjU2X21hc2soKF9fdjhzaSlfX2EsIChfX3Y4c2kpX19iLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2NtcGx0X2VwaTMyX21hc2soX19tbWFzazggX191LCBfX20yNTZpIF9fYSwgX19tMjU2aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl9jbXBkMjU2X21hc2soKF9fdjhzaSlfX2EsIChfX3Y4c2kpX19iLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9jbXBsdF9lcHUzMl9tYXNrKF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX3VjbXBkMjU2X21hc2soKF9fdjhzaSlfX2EsIChfX3Y4c2kpX19iLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jbXBsdF9lcHUzMl9tYXNrKF9fbW1hc2s4IF9fdSwgX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfdWNtcGQyNTZfbWFzaygoX192OHNpKV9fYSwgKF9fdjhzaSlfX2IsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbXBsdF9lcGk2NF9tYXNrKF9fbTEyOGkgX19hLCBfX20xMjhpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX2NtcHExMjhfbWFzaygoX192MmRpKV9fYSwgKF9fdjJkaSlfX2IsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfY21wbHRfZXBpNjRfbWFzayhfX21tYXNrOCBfX3UsIF9fbTEyOGkgX19hLCBfX20xMjhpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX2NtcHExMjhfbWFzaygoX192MmRpKV9fYSwgKF9fdjJkaSlfX2IsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NtcGx0X2VwdTY0X21hc2soX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfdWNtcHExMjhfbWFzaygoX192MmRpKV9fYSwgKF9fdjJkaSlfX2IsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2NtcGx0X2VwdTY0X21hc2soX19tbWFzazggX191LCBfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl91Y21wcTEyOF9tYXNrKChfX3YyZGkpX19hLCAoX192MmRpKV9fYiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2NtcGx0X2VwaTY0X21hc2soX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfY21wcTI1Nl9tYXNrKChfX3Y0ZGkpX19hLCAoX192NGRpKV9fYiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jbXBsdF9lcGk2NF9tYXNrKF9fbW1hc2s4IF9fdSwgX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfY21wcTI1Nl9tYXNrKChfX3Y0ZGkpX19hLCAoX192NGRpKV9fYiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY21wbHRfZXB1NjRfbWFzayhfX20yNTZpIF9fYSwgX19tMjU2aSBfX2IpIHsKKyAgcmV0dXJuIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl91Y21wcTI1Nl9tYXNrKChfX3Y0ZGkpX19hLCAoX192NGRpKV9fYiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfY21wbHRfZXB1NjRfbWFzayhfX21tYXNrOCBfX3UsIF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX3VjbXBxMjU2X21hc2soKF9fdjRkaSlfX2EsIChfX3Y0ZGkpX19iLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY21wbmVxX2VwaTMyX21hc2soX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfY21wZDEyOF9tYXNrKChfX3Y0c2kpX19hLCAoX192NHNpKV9fYiwgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jbXBuZXFfZXBpMzJfbWFzayhfX21tYXNrOCBfX3UsIF9fbTEyOGkgX19hLCBfX20xMjhpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX2NtcGQxMjhfbWFzaygoX192NHNpKV9fYSwgKF9fdjRzaSlfX2IsIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NtcG5lcV9lcHUzMl9tYXNrKF9fbTEyOGkgX19hLCBfX20xMjhpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX3VjbXBkMTI4X21hc2soKF9fdjRzaSlfX2EsIChfX3Y0c2kpX19iLCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jbXBuZXFfZXB1MzJfbWFzayhfX21tYXNrOCBfX3UsIF9fbTEyOGkgX19hLCBfX20xMjhpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX3VjbXBkMTI4X21hc2soKF9fdjRzaSlfX2EsIChfX3Y0c2kpX19iLCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY21wbmVxX2VwaTMyX21hc2soX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfY21wZDI1Nl9tYXNrKChfX3Y4c2kpX19hLCAoX192OHNpKV9fYiwgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jbXBuZXFfZXBpMzJfbWFzayhfX21tYXNrOCBfX3UsIF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX2NtcGQyNTZfbWFzaygoX192OHNpKV9fYSwgKF9fdjhzaSlfX2IsIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2NtcG5lcV9lcHUzMl9tYXNrKF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX3VjbXBkMjU2X21hc2soKF9fdjhzaSlfX2EsIChfX3Y4c2kpX19iLCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jbXBuZXFfZXB1MzJfbWFzayhfX21tYXNrOCBfX3UsIF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX3VjbXBkMjU2X21hc2soKF9fdjhzaSlfX2EsIChfX3Y4c2kpX19iLCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY21wbmVxX2VwaTY0X21hc2soX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfY21wcTEyOF9tYXNrKChfX3YyZGkpX19hLCAoX192MmRpKV9fYiwgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jbXBuZXFfZXBpNjRfbWFzayhfX21tYXNrOCBfX3UsIF9fbTEyOGkgX19hLCBfX20xMjhpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX2NtcHExMjhfbWFzaygoX192MmRpKV9fYSwgKF9fdjJkaSlfX2IsIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NtcG5lcV9lcHU2NF9tYXNrKF9fbTEyOGkgX19hLCBfX20xMjhpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX3VjbXBxMTI4X21hc2soKF9fdjJkaSlfX2EsIChfX3YyZGkpX19iLCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jbXBuZXFfZXB1NjRfbWFzayhfX21tYXNrOCBfX3UsIF9fbTEyOGkgX19hLCBfX20xMjhpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX3VjbXBxMTI4X21hc2soKF9fdjJkaSlfX2EsIChfX3YyZGkpX19iLCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY21wbmVxX2VwaTY0X21hc2soX19tMjU2aSBfX2EsIF9fbTI1NmkgX19iKSB7CisgIHJldHVybiAoX19tbWFzazgpX19idWlsdGluX2lhMzJfY21wcTI1Nl9tYXNrKChfX3Y0ZGkpX19hLCAoX192NGRpKV9fYiwgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jbXBuZXFfZXBpNjRfbWFzayhfX21tYXNrOCBfX3UsIF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX2NtcHEyNTZfbWFzaygoX192NGRpKV9fYSwgKF9fdjRkaSlfX2IsIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2NtcG5lcV9lcHU2NF9tYXNrKF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX3VjbXBxMjU2X21hc2soKF9fdjRkaSlfX2EsIChfX3Y0ZGkpX19iLCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jbXBuZXFfZXB1NjRfbWFzayhfX21tYXNrOCBfX3UsIF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikgeworICByZXR1cm4gKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX3VjbXBxMjU2X21hc2soKF9fdjRkaSlfX2EsIChfX3Y0ZGkpX19iLCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2FkZF9lcGkzMiAoX19tMjU2aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMjU2aSBfX0EsCisgICAgICAgICAgIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BhZGRkMjU2X21hc2sgKChfX3Y4c2kpIF9fQSwKKyAgICAgICAgICAgICAoX192OHNpKSBfX0IsCisgICAgICAgICAgICAgKF9fdjhzaSkgX19XLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9hZGRfZXBpMzIgKF9fbW1hc2s4IF9fVSwgX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BhZGRkMjU2X21hc2sgKChfX3Y4c2kpIF9fQSwKKyAgICAgICAgICAgICAoX192OHNpKSBfX0IsCisgICAgICAgICAgICAgKF9fdjhzaSkKKyAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19hZGRfZXBpNjQgKF9fbTI1NmkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTI1NmkgX19BLAorICAgICAgICAgICBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wYWRkcTI1Nl9tYXNrICgoX192NGRpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjRkaSkgX19CLAorICAgICAgICAgICAgIChfX3Y0ZGkpIF9fVywKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfYWRkX2VwaTY0IChfX21tYXNrOCBfX1UsIF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wYWRkcTI1Nl9tYXNrICgoX192NGRpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjRkaSkgX19CLAorICAgICAgICAgICAgIChfX3Y0ZGkpCisgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfc3ViX2VwaTMyIChfX20yNTZpIF9fVywgX19tbWFzazggX19VLCBfX20yNTZpIF9fQSwKKyAgICAgICAgICAgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcHN1YmQyNTZfbWFzayAoKF9fdjhzaSkgX19BLAorICAgICAgICAgICAgIChfX3Y4c2kpIF9fQiwKKyAgICAgICAgICAgICAoX192OHNpKSBfX1csCisgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X3N1Yl9lcGkzMiAoX19tbWFzazggX19VLCBfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcHN1YmQyNTZfbWFzayAoKF9fdjhzaSkgX19BLAorICAgICAgICAgICAgIChfX3Y4c2kpIF9fQiwKKyAgICAgICAgICAgICAoX192OHNpKQorICAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2ICgpLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX3N1Yl9lcGk2NCAoX19tMjU2aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMjU2aSBfX0EsCisgICAgICAgICAgIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BzdWJxMjU2X21hc2sgKChfX3Y0ZGkpIF9fQSwKKyAgICAgICAgICAgICAoX192NGRpKSBfX0IsCisgICAgICAgICAgICAgKF9fdjRkaSkgX19XLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9zdWJfZXBpNjQgKF9fbW1hc2s4IF9fVSwgX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BzdWJxMjU2X21hc2sgKChfX3Y0ZGkpIF9fQSwKKyAgICAgICAgICAgICAoX192NGRpKSBfX0IsCisgICAgICAgICAgICAgKF9fdjRkaSkKKyAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19hZGRfZXBpMzIgKF9fbTEyOGkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BLAorICAgICAgICBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wYWRkZDEyOF9tYXNrICgoX192NHNpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjRzaSkgX19CLAorICAgICAgICAgICAgIChfX3Y0c2kpIF9fVywKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfYWRkX2VwaTMyIChfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wYWRkZDEyOF9tYXNrICgoX192NHNpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjRzaSkgX19CLAorICAgICAgICAgICAgIChfX3Y0c2kpCisgICAgICAgICAgICAgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfYWRkX2VwaTY0IChfX20xMjhpIF9fVywgX19tbWFzazggX19VLCBfX20xMjhpIF9fQSwKKyAgICAgICAgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcGFkZHExMjhfbWFzayAoKF9fdjJkaSkgX19BLAorICAgICAgICAgICAgIChfX3YyZGkpIF9fQiwKKyAgICAgICAgICAgICAoX192MmRpKSBfX1csCisgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2FkZF9lcGk2NCAoX19tbWFzazggX19VLCBfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcGFkZHExMjhfbWFzayAoKF9fdjJkaSkgX19BLAorICAgICAgICAgICAgIChfX3YyZGkpIF9fQiwKKyAgICAgICAgICAgICAoX192MmRpKQorICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX3N1Yl9lcGkzMiAoX19tMTI4aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EsCisgICAgICAgIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BzdWJkMTI4X21hc2sgKChfX3Y0c2kpIF9fQSwKKyAgICAgICAgICAgICAoX192NHNpKSBfX0IsCisgICAgICAgICAgICAgKF9fdjRzaSkgX19XLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9zdWJfZXBpMzIgKF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BzdWJkMTI4X21hc2sgKChfX3Y0c2kpIF9fQSwKKyAgICAgICAgICAgICAoX192NHNpKSBfX0IsCisgICAgICAgICAgICAgKF9fdjRzaSkKKyAgICAgICAgICAgICBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19zdWJfZXBpNjQgKF9fbTEyOGkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BLAorICAgICAgICBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wc3VicTEyOF9tYXNrICgoX192MmRpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjJkaSkgX19CLAorICAgICAgICAgICAgIChfX3YyZGkpIF9fVywKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfc3ViX2VwaTY0IChfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wc3VicTEyOF9tYXNrICgoX192MmRpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjJkaSkgX19CLAorICAgICAgICAgICAgIChfX3YyZGkpCisgICAgICAgICAgICAgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfbXVsX2VwaTMyIChfX20yNTZpIF9fVywgX19tbWFzazggX19NLCBfX20yNTZpIF9fWCwKKyAgICAgICAgICAgX19tMjU2aSBfX1kpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG11bGRxMjU2X21hc2sgKChfX3Y4c2kpIF9fWCwKKyAgICAgICAgICAgICAgKF9fdjhzaSkgX19ZLAorICAgICAgICAgICAgICAoX192NGRpKSBfX1csIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfbXVsX2VwaTMyIChfX21tYXNrOCBfX00sIF9fbTI1NmkgX19YLCBfX20yNTZpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wbXVsZHEyNTZfbWFzayAoKF9fdjhzaSkgX19YLAorICAgICAgICAgICAgICAoX192OHNpKSBfX1ksCisgICAgICAgICAgICAgIChfX3Y0ZGkpCisgICAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2ICgpLAorICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfbXVsX2VwaTMyIChfX20xMjhpIF9fVywgX19tbWFzazggX19NLCBfX20xMjhpIF9fWCwKKyAgICAgICAgX19tMTI4aSBfX1kpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG11bGRxMTI4X21hc2sgKChfX3Y0c2kpIF9fWCwKKyAgICAgICAgICAgICAgKF9fdjRzaSkgX19ZLAorICAgICAgICAgICAgICAoX192MmRpKSBfX1csIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfbXVsX2VwaTMyIChfX21tYXNrOCBfX00sIF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbXVsZHExMjhfbWFzayAoKF9fdjRzaSkgX19YLAorICAgICAgICAgICAgICAoX192NHNpKSBfX1ksCisgICAgICAgICAgICAgIChfX3YyZGkpCisgICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfbXVsX2VwdTMyIChfX20yNTZpIF9fVywgX19tbWFzazggX19NLCBfX20yNTZpIF9fWCwKKyAgICAgICAgICAgX19tMjU2aSBfX1kpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG11bHVkcTI1Nl9tYXNrICgoX192OHNpKSBfX1gsCisgICAgICAgICAgICAgICAoX192OHNpKSBfX1ksCisgICAgICAgICAgICAgICAoX192NGRpKSBfX1csIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfbXVsX2VwdTMyIChfX21tYXNrOCBfX00sIF9fbTI1NmkgX19YLCBfX20yNTZpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wbXVsdWRxMjU2X21hc2sgKChfX3Y4c2kpIF9fWCwKKyAgICAgICAgICAgICAgIChfX3Y4c2kpIF9fWSwKKyAgICAgICAgICAgICAgIChfX3Y0ZGkpCisgICAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19tdWxfZXB1MzIgKF9fbTEyOGkgX19XLCBfX21tYXNrOCBfX00sIF9fbTEyOGkgX19YLAorICAgICAgICBfX20xMjhpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbXVsdWRxMTI4X21hc2sgKChfX3Y0c2kpIF9fWCwKKyAgICAgICAgICAgICAgIChfX3Y0c2kpIF9fWSwKKyAgICAgICAgICAgICAgIChfX3YyZGkpIF9fVywgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9tdWxfZXB1MzIgKF9fbW1hc2s4IF9fTSwgX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BtdWx1ZHExMjhfbWFzayAoKF9fdjRzaSkgX19YLAorICAgICAgICAgICAgICAgKF9fdjRzaSkgX19ZLAorICAgICAgICAgICAgICAgKF9fdjJkaSkKKyAgICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9tdWxsb19lcGkzMiAoX19tbWFzazggX19NLCBfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG11bGxkMjU2X21hc2sgKChfX3Y4c2kpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjhzaSkgX19CLAorICAgICAgICAgICAgICAoX192OHNpKQorICAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX211bGxvX2VwaTMyIChfX20yNTZpIF9fVywgX19tbWFzazggX19NLCBfX20yNTZpIF9fQSwKKyAgICAgICBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wbXVsbGQyNTZfbWFzayAoKF9fdjhzaSkgX19BLAorICAgICAgICAgICAgICAoX192OHNpKSBfX0IsCisgICAgICAgICAgICAgIChfX3Y4c2kpIF9fVywgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9tdWxsb19lcGkzMiAoX19tbWFzazggX19NLCBfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG11bGxkMTI4X21hc2sgKChfX3Y0c2kpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjRzaSkgX19CLAorICAgICAgICAgICAgICAoX192NHNpKQorICAgICAgICAgICAgICBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX211bGxvX2VwaTMyIChfX20xMjhpIF9fVywgX19tbWFzazE2IF9fTSwgX19tMTI4aSBfX0EsCisgICAgICAgICAgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG11bGxkMTI4X21hc2sgKChfX3Y0c2kpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjRzaSkgX19CLAorICAgICAgICAgICAgICAoX192NHNpKSBfX1csIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19hbmRfZXBpMzIoX19tMjU2aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfc2VsZWN0ZF8yNTYoKF9fbW1hc2s4KV9fVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2kpX21tMjU2X2FuZF9zaTI1NihfX0EsIF9fQiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNpKV9fVyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfYW5kX2VwaTMyKF9fbW1hc2s4IF9fVSwgX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX21tMjU2X21hc2tfYW5kX2VwaTMyKF9tbTI1Nl9zZXR6ZXJvX3NpMjU2KCksIF9fVSwgX19BLCBfX0IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfYW5kX2VwaTMyKF9fbTEyOGkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3NlbGVjdGRfMTI4KChfX21tYXNrOClfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNpKV9tbV9hbmRfc2kxMjgoX19BLCBfX0IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzaSlfX1cpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2FuZF9lcGkzMihfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9tbV9tYXNrX2FuZF9lcGkzMihfbW1fc2V0emVyb19zaTEyOCgpLCBfX1UsIF9fQSwgX19CKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2FuZG5vdF9lcGkzMihfX20yNTZpIF9fVywgX19tbWFzazggX19VLCBfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9zZWxlY3RkXzI1NigoX19tbWFzazgpX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzaSlfbW0yNTZfYW5kbm90X3NpMjU2KF9fQSwgX19CKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2kpX19XKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9hbmRub3RfZXBpMzIoX19tbWFzazggX19VLCBfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfbW0yNTZfbWFza19hbmRub3RfZXBpMzIoX21tMjU2X3NldHplcm9fc2kyNTYoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1UsIF9fQSwgX19CKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2FuZG5vdF9lcGkzMihfX20xMjhpIF9fVywgX19tbWFzazggX19VLCBfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9zZWxlY3RkXzEyOCgoX19tbWFzazgpX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzaSlfbW1fYW5kbm90X3NpMTI4KF9fQSwgX19CKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2kpX19XKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9hbmRub3RfZXBpMzIgKF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX21tX21hc2tfYW5kbm90X2VwaTMyKF9tbV9zZXR6ZXJvX3NpMTI4KCksIF9fVSwgX19BLCBfX0IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfb3JfZXBpMzIgKF9fbTI1NmkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3NlbGVjdGRfMjU2KChfX21tYXNrOClfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNpKV9tbTI1Nl9vcl9zaTI1NihfX0EsIF9fQiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNpKV9fVyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfb3JfZXBpMzIoX19tbWFzazggX19VLCBfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfbW0yNTZfbWFza19vcl9lcGkzMihfbW0yNTZfc2V0emVyb19zaTI1NigpLCBfX1UsIF9fQSwgX19CKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX29yX2VwaTMyKF9fbTEyOGkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3NlbGVjdGRfMTI4KChfX21tYXNrOClfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNpKV9tbV9vcl9zaTEyOChfX0EsIF9fQiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNpKV9fVyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfb3JfZXBpMzIoX19tbWFzazggX19VLCBfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfbW1fbWFza19vcl9lcGkzMihfbW1fc2V0emVyb19zaTEyOCgpLCBfX1UsIF9fQSwgX19CKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX3hvcl9lcGkzMihfX20yNTZpIF9fVywgX19tbWFzazggX19VLCBfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9zZWxlY3RkXzI1NigoX19tbWFzazgpX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzaSlfbW0yNTZfeG9yX3NpMjU2KF9fQSwgX19CKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2kpX19XKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel94b3JfZXBpMzIoX19tbWFzazggX19VLCBfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfbW0yNTZfbWFza194b3JfZXBpMzIoX21tMjU2X3NldHplcm9fc2kyNTYoKSwgX19VLCBfX0EsIF9fQik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza194b3JfZXBpMzIoX19tMTI4aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EsCisgICAgICAgIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfc2VsZWN0ZF8xMjgoKF9fbW1hc2s4KV9fVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2kpX21tX3hvcl9zaTEyOChfX0EsIF9fQiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNpKV9fVyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfeG9yX2VwaTMyKF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX21tX21hc2tfeG9yX2VwaTMyKF9tbV9zZXR6ZXJvX3NpMTI4KCksIF9fVSwgX19BLCBfX0IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfYW5kX2VwaTY0KF9fbTI1NmkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3NlbGVjdHFfMjU2KChfX21tYXNrOClfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRpKV9tbTI1Nl9hbmRfc2kyNTYoX19BLCBfX0IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkaSlfX1cpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X2FuZF9lcGk2NChfX21tYXNrOCBfX1UsIF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9tbTI1Nl9tYXNrX2FuZF9lcGk2NChfbW0yNTZfc2V0emVyb19zaTI1NigpLCBfX1UsIF9fQSwgX19CKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2FuZF9lcGk2NChfX20xMjhpIF9fVywgX19tbWFzazggX19VLCBfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9zZWxlY3RxXzEyOCgoX19tbWFzazgpX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkaSlfbW1fYW5kX3NpMTI4KF9fQSwgX19CKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGkpX19XKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9hbmRfZXBpNjQoX19tbWFzazggX19VLCBfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfbW1fbWFza19hbmRfZXBpNjQoX21tX3NldHplcm9fc2kxMjgoKSwgX19VLCBfX0EsIF9fQik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19hbmRub3RfZXBpNjQoX19tMjU2aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfc2VsZWN0cV8yNTYoKF9fbW1hc2s4KV9fVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGkpX21tMjU2X2FuZG5vdF9zaTI1NihfX0EsIF9fQiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRpKV9fVyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfYW5kbm90X2VwaTY0KF9fbW1hc2s4IF9fVSwgX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX21tMjU2X21hc2tfYW5kbm90X2VwaTY0KF9tbTI1Nl9zZXR6ZXJvX3NpMjU2KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19VLCBfX0EsIF9fQik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19hbmRub3RfZXBpNjQoX19tMTI4aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfc2VsZWN0cV8xMjgoKF9fbW1hc2s4KV9fVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGkpX21tX2FuZG5vdF9zaTEyOChfX0EsIF9fQiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRpKV9fVyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfYW5kbm90X2VwaTY0KF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX21tX21hc2tfYW5kbm90X2VwaTY0KF9tbV9zZXR6ZXJvX3NpMTI4KCksIF9fVSwgX19BLCBfX0IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfb3JfZXBpNjQoX19tMjU2aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfc2VsZWN0cV8yNTYoKF9fbW1hc2s4KV9fVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGkpX21tMjU2X29yX3NpMjU2KF9fQSwgX19CKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGkpX19XKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9vcl9lcGk2NChfX21tYXNrOCBfX1UsIF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9tbTI1Nl9tYXNrX29yX2VwaTY0KF9tbTI1Nl9zZXR6ZXJvX3NpMjU2KCksIF9fVSwgX19BLCBfX0IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfb3JfZXBpNjQoX19tMTI4aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfc2VsZWN0cV8xMjgoKF9fbW1hc2s4KV9fVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGkpX21tX29yX3NpMTI4KF9fQSwgX19CKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGkpX19XKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9vcl9lcGk2NChfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9tbV9tYXNrX29yX2VwaTY0KF9tbV9zZXR6ZXJvX3NpMTI4KCksIF9fVSwgX19BLCBfX0IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfeG9yX2VwaTY0KF9fbTI1NmkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3NlbGVjdHFfMjU2KChfX21tYXNrOClfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRpKV9tbTI1Nl94b3Jfc2kyNTYoX19BLCBfX0IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkaSlfX1cpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X3hvcl9lcGk2NChfX21tYXNrOCBfX1UsIF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9tbTI1Nl9tYXNrX3hvcl9lcGk2NChfbW0yNTZfc2V0emVyb19zaTI1NigpLCBfX1UsIF9fQSwgX19CKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX3hvcl9lcGk2NChfX20xMjhpIF9fVywgX19tbWFzazggX19VLCBfX20xMjhpIF9fQSwKKyAgICAgICAgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9zZWxlY3RxXzEyOCgoX19tbWFzazgpX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkaSlfbW1feG9yX3NpMTI4KF9fQSwgX19CKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGkpX19XKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel94b3JfZXBpNjQoX19tbWFzazggX19VLCBfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfbW1fbWFza194b3JfZXBpNjQoX21tX3NldHplcm9fc2kxMjgoKSwgX19VLCBfX0EsIF9fQik7Cit9CisKKyNkZWZpbmUgX21tX2NtcF9lcGkzMl9tYXNrKGEsIGIsIHApIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tbWFzazgpX19idWlsdGluX2lhMzJfY21wZDEyOF9tYXNrKChfX3Y0c2kpKF9fbTEyOGkpKGEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzaSkoX19tMTI4aSkoYiksIChpbnQpKHApLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsgfSkKKworI2RlZmluZSBfbW1fbWFza19jbXBfZXBpMzJfbWFzayhtLCBhLCBiLCBwKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX2NtcGQxMjhfbWFzaygoX192NHNpKShfX20xMjhpKShhKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2kpKF9fbTEyOGkpKGIpLCAoaW50KShwKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkobSkpOyB9KQorCisjZGVmaW5lIF9tbV9jbXBfZXB1MzJfbWFzayhhLCBiLCBwKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX3VjbXBkMTI4X21hc2soKF9fdjRzaSkoX19tMTI4aSkoYSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzaSkoX19tMTI4aSkoYiksIChpbnQpKHApLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2tfY21wX2VwdTMyX21hc2sobSwgYSwgYiwgcCkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl91Y21wZDEyOF9tYXNrKChfX3Y0c2kpKF9fbTEyOGkpKGEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2kpKF9fbTEyOGkpKGIpLCAoaW50KShwKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKG0pKTsgfSkKKworI2RlZmluZSBfbW0yNTZfY21wX2VwaTMyX21hc2soYSwgYiwgcCkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl9jbXBkMjU2X21hc2soKF9fdjhzaSkoX19tMjU2aSkoYSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNpKShfX20yNTZpKShiKSwgKGludCkocCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9tYXNrX2NtcF9lcGkzMl9tYXNrKG0sIGEsIGIsIHApIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tbWFzazgpX19idWlsdGluX2lhMzJfY21wZDI1Nl9tYXNrKChfX3Y4c2kpKF9fbTI1NmkpKGEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzaSkoX19tMjU2aSkoYiksIChpbnQpKHApLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShtKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X2NtcF9lcHUzMl9tYXNrKGEsIGIsIHApIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tbWFzazgpX19idWlsdGluX2lhMzJfdWNtcGQyNTZfbWFzaygoX192OHNpKShfX20yNTZpKShhKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNpKShfX20yNTZpKShiKSwgKGludCkocCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsgfSkKKworI2RlZmluZSBfbW0yNTZfbWFza19jbXBfZXB1MzJfbWFzayhtLCBhLCBiLCBwKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX3VjbXBkMjU2X21hc2soKF9fdjhzaSkoX19tMjU2aSkoYSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzaSkoX19tMjU2aSkoYiksIChpbnQpKHApLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkobSkpOyB9KQorCisjZGVmaW5lIF9tbV9jbXBfZXBpNjRfbWFzayhhLCBiLCBwKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX2NtcHExMjhfbWFzaygoX192MmRpKShfX20xMjhpKShhKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGkpKF9fbTEyOGkpKGIpLCAoaW50KShwKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2tfY21wX2VwaTY0X21hc2sobSwgYSwgYiwgcCkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl9jbXBxMTI4X21hc2soKF9fdjJkaSkoX19tMTI4aSkoYSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRpKShfX20xMjhpKShiKSwgKGludCkocCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKG0pKTsgfSkKKworI2RlZmluZSBfbW1fY21wX2VwdTY0X21hc2soYSwgYiwgcCkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl91Y21wcTEyOF9tYXNrKChfX3YyZGkpKF9fbTEyOGkpKGEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGkpKF9fbTEyOGkpKGIpLCAoaW50KShwKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrX2NtcF9lcHU2NF9tYXNrKG0sIGEsIGIsIHApIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tbWFzazgpX19idWlsdGluX2lhMzJfdWNtcHExMjhfbWFzaygoX192MmRpKShfX20xMjhpKShhKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRpKShfX20xMjhpKShiKSwgKGludCkocCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShtKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X2NtcF9lcGk2NF9tYXNrKGEsIGIsIHApIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tbWFzazgpX19idWlsdGluX2lhMzJfY21wcTI1Nl9tYXNrKChfX3Y0ZGkpKF9fbTI1NmkpKGEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkaSkoX19tMjU2aSkoYiksIChpbnQpKHApLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsgfSkKKworI2RlZmluZSBfbW0yNTZfbWFza19jbXBfZXBpNjRfbWFzayhtLCBhLCBiLCBwKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX2NtcHEyNTZfbWFzaygoX192NGRpKShfX20yNTZpKShhKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGkpKF9fbTI1NmkpKGIpLCAoaW50KShwKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkobSkpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9jbXBfZXB1NjRfbWFzayhhLCBiLCBwKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX3VjbXBxMjU2X21hc2soKF9fdjRkaSkoX19tMjU2aSkoYSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkaSkoX19tMjU2aSkoYiksIChpbnQpKHApLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21hc2tfY21wX2VwdTY0X21hc2sobSwgYSwgYiwgcCkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl91Y21wcTI1Nl9tYXNrKChfX3Y0ZGkpKF9fbTI1NmkpKGEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGkpKF9fbTI1NmkpKGIpLCAoaW50KShwKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKG0pKTsgfSkKKworI2RlZmluZSBfbW0yNTZfY21wX3BzX21hc2soYSwgYiwgcCkgIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tbWFzazgpX19idWlsdGluX2lhMzJfY21wcHMyNTZfbWFzaygoX192OHNmKShfX20yNTYpKGEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2YpKF9fbTI1NikoYiksIChpbnQpKHApLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21hc2tfY21wX3BzX21hc2sobSwgYSwgYiwgcCkgIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tbWFzazgpX19idWlsdGluX2lhMzJfY21wcHMyNTZfbWFzaygoX192OHNmKShfX20yNTYpKGEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2YpKF9fbTI1NikoYiksIChpbnQpKHApLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkobSkpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9jbXBfcGRfbWFzayhhLCBiLCBwKSAgX19leHRlbnNpb25fXyAoeyBcCisgIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl9jbXBwZDI1Nl9tYXNrKChfX3Y0ZGYpKF9fbTI1NmQpKGEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGYpKF9fbTI1NmQpKGIpLCAoaW50KShwKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9tYXNrX2NtcF9wZF9tYXNrKG0sIGEsIGIsIHApICBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX2NtcHBkMjU2X21hc2soKF9fdjRkZikoX19tMjU2ZCkoYSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkZikoX19tMjU2ZCkoYiksIChpbnQpKHApLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkobSkpOyB9KQorCisjZGVmaW5lIF9tbV9jbXBfcHNfbWFzayhhLCBiLCBwKSAgX19leHRlbnNpb25fXyAoeyBcCisgIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl9jbXBwczEyOF9tYXNrKChfX3Y0c2YpKF9fbTEyOCkoYSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShiKSwgKGludCkocCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsgfSkKKworI2RlZmluZSBfbW1fbWFza19jbXBfcHNfbWFzayhtLCBhLCBiLCBwKSAgX19leHRlbnNpb25fXyAoeyBcCisgIChfX21tYXNrOClfX2J1aWx0aW5faWEzMl9jbXBwczEyOF9tYXNrKChfX3Y0c2YpKF9fbTEyOCkoYSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShiKSwgKGludCkocCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShtKSk7IH0pCisKKyNkZWZpbmUgX21tX2NtcF9wZF9tYXNrKGEsIGIsIHApICBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbW1hc2s4KV9fYnVpbHRpbl9pYTMyX2NtcHBkMTI4X21hc2soKF9fdjJkZikoX19tMTI4ZCkoYSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZikoX19tMTI4ZCkoYiksIChpbnQpKHApLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2tfY21wX3BkX21hc2sobSwgYSwgYiwgcCkgIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tbWFzazgpX19idWlsdGluX2lhMzJfY21wcGQxMjhfbWFzaygoX192MmRmKShfX20xMjhkKShhKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShiKSwgKGludCkocCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShtKSk7IH0pCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19mbWFkZF9wZChfX20xMjhkIF9fQSwgX19tbWFzazggX19VLCBfX20xMjhkIF9fQiwgX19tMTI4ZCBfX0MpCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfdmZtYWRkcGQxMjhfbWFzayAoKF9fdjJkZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKSBfX0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2szX2ZtYWRkX3BkKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQiwgX19tMTI4ZCBfX0MsIF9fbW1hc2s4IF9fVSkKK3sKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl92Zm1hZGRwZDEyOF9tYXNrMyAoKF9fdjJkZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKSBfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpIF9fQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2ZtYWRkX3BkKF9fbW1hc2s4IF9fVSwgX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CLCBfX20xMjhkIF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl92Zm1hZGRwZDEyOF9tYXNreiAoKF9fdjJkZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKSBfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpIF9fQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfZm1zdWJfcGQoX19tMTI4ZCBfX0EsIF9fbW1hc2s4IF9fVSwgX19tMTI4ZCBfX0IsIF9fbTEyOGQgX19DKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBkMTI4X21hc2sgKChfX3YyZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKSBfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShfX3YyZGYpIF9fQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfZm1zdWJfcGQoX19tbWFzazggX19VLCBfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IsIF9fbTEyOGQgX19DKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBkMTI4X21hc2t6ICgoX192MmRmKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShfX3YyZGYpIF9fQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2szX2ZubWFkZF9wZChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IsIF9fbTEyOGQgX19DLCBfX21tYXNrOCBfX1UpCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfdmZtYWRkcGQxMjhfbWFzazMgKC0oX192MmRmKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZikgX19DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfZm5tYWRkX3BkKF9fbW1hc2s4IF9fVSwgX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CLCBfX20xMjhkIF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl92Zm1hZGRwZDEyOF9tYXNreiAoLShfX3YyZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZikgX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKSBfX0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9mbm1zdWJfcGQoX19tbWFzazggX19VLCBfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IsIF9fbTEyOGQgX19DKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBkMTI4X21hc2t6ICgtKF9fdjJkZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKSBfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oX192MmRmKSBfX0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2ZtYWRkX3BkKF9fbTI1NmQgX19BLCBfX21tYXNrOCBfX1UsIF9fbTI1NmQgX19CLCBfX20yNTZkIF9fQykKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl92Zm1hZGRwZDI1Nl9tYXNrICgoX192NGRmKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkZikgX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGYpIF9fQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFzazNfZm1hZGRfcGQoX19tMjU2ZCBfX0EsIF9fbTI1NmQgX19CLCBfX20yNTZkIF9fQywgX19tbWFzazggX19VKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBkMjU2X21hc2szICgoX192NGRmKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGYpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkZikgX19DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfZm1hZGRfcGQoX19tbWFzazggX19VLCBfX20yNTZkIF9fQSwgX19tMjU2ZCBfX0IsIF9fbTI1NmQgX19DKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBkMjU2X21hc2t6ICgoX192NGRmKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGYpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkZikgX19DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19mbXN1Yl9wZChfX20yNTZkIF9fQSwgX19tbWFzazggX19VLCBfX20yNTZkIF9fQiwgX19tMjU2ZCBfX0MpCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfdmZtYWRkcGQyNTZfbWFzayAoKF9fdjRkZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGYpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKF9fdjRkZikgX19DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9mbXN1Yl9wZChfX21tYXNrOCBfX1UsIF9fbTI1NmQgX19BLCBfX20yNTZkIF9fQiwgX19tMjU2ZCBfX0MpCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfdmZtYWRkcGQyNTZfbWFza3ogKChfX3Y0ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkZikgX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKF9fdjRkZikgX19DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFzazNfZm5tYWRkX3BkKF9fbTI1NmQgX19BLCBfX20yNTZkIF9fQiwgX19tMjU2ZCBfX0MsIF9fbW1hc2s4IF9fVSkKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl92Zm1hZGRwZDI1Nl9tYXNrMyAoLShfX3Y0ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkZikgX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRmKSBfX0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9mbm1hZGRfcGQoX19tbWFzazggX19VLCBfX20yNTZkIF9fQSwgX19tMjU2ZCBfX0IsIF9fbTI1NmQgX19DKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBkMjU2X21hc2t6ICgtKF9fdjRkZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRmKSBfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGYpIF9fQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X2ZubXN1Yl9wZChfX21tYXNrOCBfX1UsIF9fbTI1NmQgX19BLCBfX20yNTZkIF9fQiwgX19tMjU2ZCBfX0MpCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfdmZtYWRkcGQyNTZfbWFza3ogKC0oX192NGRmKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGYpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShfX3Y0ZGYpIF9fQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19mbWFkZF9wcyhfX20xMjggX19BLCBfX21tYXNrOCBfX1UsIF9fbTEyOCBfX0IsIF9fbTEyOCBfX0MpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl92Zm1hZGRwczEyOF9tYXNrICgoX192NHNmKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKSBfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKSBfX0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrM19mbWFkZF9wcyhfX20xMjggX19BLCBfX20xMjggX19CLCBfX20xMjggX19DLCBfX21tYXNrOCBfX1UpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl92Zm1hZGRwczEyOF9tYXNrMyAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKSBfX0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfZm1hZGRfcHMoX19tbWFzazggX19VLCBfX20xMjggX19BLCBfX20xMjggX19CLCBfX20xMjggX19DKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfdmZtYWRkcHMxMjhfbWFza3ogKChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKSBfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikgX19DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfZm1zdWJfcHMoX19tMTI4IF9fQSwgX19tbWFzazggX19VLCBfX20xMjggX19CLCBfX20xMjggX19DKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfdmZtYWRkcHMxMjhfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikgX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShfX3Y0c2YpIF9fQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2Ztc3ViX3BzKF9fbW1hc2s4IF9fVSwgX19tMTI4IF9fQSwgX19tMTI4IF9fQiwgX19tMTI4IF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBzMTI4X21hc2t6ICgoX192NHNmKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikgX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oX192NHNmKSBfX0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFzazNfZm5tYWRkX3BzKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IsIF9fbTEyOCBfX0MsIF9fbW1hc2s4IF9fVSkKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBzMTI4X21hc2szICgtKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKSBfX0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfZm5tYWRkX3BzKF9fbW1hc2s4IF9fVSwgX19tMTI4IF9fQSwgX19tMTI4IF9fQiwgX19tMTI4IF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBzMTI4X21hc2t6ICgtKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKSBfX0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfZm5tc3ViX3BzKF9fbW1hc2s4IF9fVSwgX19tMTI4IF9fQSwgX19tMTI4IF9fQiwgX19tMTI4IF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBzMTI4X21hc2t6ICgtKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKF9fdjRzZikgX19DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfZm1hZGRfcHMoX19tMjU2IF9fQSwgX19tbWFzazggX19VLCBfX20yNTYgX19CLCBfX20yNTYgX19DKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfdmZtYWRkcHMyNTZfbWFzayAoKF9fdjhzZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzZikgX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzZikgX19DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFzazNfZm1hZGRfcHMoX19tMjU2IF9fQSwgX19tMjU2IF9fQiwgX19tMjU2IF9fQywgX19tbWFzazggX19VKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfdmZtYWRkcHMyNTZfbWFzazMgKChfX3Y4c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNmKSBfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzZikgX19DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X2ZtYWRkX3BzKF9fbW1hc2s4IF9fVSwgX19tMjU2IF9fQSwgX19tMjU2IF9fQiwgX19tMjU2IF9fQykKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBzMjU2X21hc2t6ICgoX192OHNmKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzZikgX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2YpIF9fQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2Ztc3ViX3BzKF9fbTI1NiBfX0EsIF9fbW1hc2s4IF9fVSwgX19tMjU2IF9fQiwgX19tMjU2IF9fQykKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBzMjU2X21hc2sgKChfX3Y4c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2YpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oX192OHNmKSBfX0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9mbXN1Yl9wcyhfX21tYXNrOCBfX1UsIF9fbTI1NiBfX0EsIF9fbTI1NiBfX0IsIF9fbTI1NiBfX0MpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl92Zm1hZGRwczI1Nl9tYXNreiAoKF9fdjhzZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2YpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKF9fdjhzZikgX19DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2szX2ZubWFkZF9wcyhfX20yNTYgX19BLCBfX20yNTYgX19CLCBfX20yNTYgX19DLCBfX21tYXNrOCBfX1UpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl92Zm1hZGRwczI1Nl9tYXNrMyAoLShfX3Y4c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNmKSBfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzZikgX19DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X2ZubWFkZF9wcyhfX21tYXNrOCBfX1UsIF9fbTI1NiBfX0EsIF9fbTI1NiBfX0IsIF9fbTI1NiBfX0MpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl92Zm1hZGRwczI1Nl9tYXNreiAoLShfX3Y4c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNmKSBfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzZikgX19DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X2ZubXN1Yl9wcyhfX21tYXNrOCBfX1UsIF9fbTI1NiBfX0EsIF9fbTI1NiBfX0IsIF9fbTI1NiBfX0MpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl92Zm1hZGRwczI1Nl9tYXNreiAoLShfX3Y4c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNmKSBfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShfX3Y4c2YpIF9fQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19mbWFkZHN1Yl9wZChfX20xMjhkIF9fQSwgX19tbWFzazggX19VLCBfX20xMjhkIF9fQiwgX19tMTI4ZCBfX0MpCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfdmZtYWRkc3VicGQxMjhfbWFzayAoKF9fdjJkZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKSBfX0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2szX2ZtYWRkc3ViX3BkKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQiwgX19tMTI4ZCBfX0MsIF9fbW1hc2s4IF9fVSkKK3sKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwZDEyOF9tYXNrMyAoKF9fdjJkZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKSBfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpIF9fQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2ZtYWRkc3ViX3BkKF9fbW1hc2s4IF9fVSwgX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CLCBfX20xMjhkIF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwZDEyOF9tYXNreiAoKF9fdjJkZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKSBfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpIF9fQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfZm1zdWJhZGRfcGQoX19tMTI4ZCBfX0EsIF9fbW1hc2s4IF9fVSwgX19tMTI4ZCBfX0IsIF9fbTEyOGQgX19DKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBkMTI4X21hc2sgKChfX3YyZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKSBfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShfX3YyZGYpIF9fQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfZm1zdWJhZGRfcGQoX19tbWFzazggX19VLCBfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IsIF9fbTEyOGQgX19DKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBkMTI4X21hc2t6ICgoX192MmRmKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShfX3YyZGYpIF9fQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfZm1hZGRzdWJfcGQoX19tMjU2ZCBfX0EsIF9fbW1hc2s4IF9fVSwgX19tMjU2ZCBfX0IsIF9fbTI1NmQgX19DKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBkMjU2X21hc2sgKChfX3Y0ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRmKSBfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkZikgX19DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrM19mbWFkZHN1Yl9wZChfX20yNTZkIF9fQSwgX19tMjU2ZCBfX0IsIF9fbTI1NmQgX19DLCBfX21tYXNrOCBfX1UpCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfdmZtYWRkc3VicGQyNTZfbWFzazMgKChfX3Y0ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkZikgX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRmKSBfX0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9mbWFkZHN1Yl9wZChfX21tYXNrOCBfX1UsIF9fbTI1NmQgX19BLCBfX20yNTZkIF9fQiwgX19tMjU2ZCBfX0MpCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfdmZtYWRkc3VicGQyNTZfbWFza3ogKChfX3Y0ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkZikgX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRmKSBfX0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2Ztc3ViYWRkX3BkKF9fbTI1NmQgX19BLCBfX21tYXNrOCBfX1UsIF9fbTI1NmQgX19CLCBfX20yNTZkIF9fQykKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwZDI1Nl9tYXNrICgoX192NGRmKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkZikgX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oX192NGRmKSBfX0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X2Ztc3ViYWRkX3BkKF9fbW1hc2s4IF9fVSwgX19tMjU2ZCBfX0EsIF9fbTI1NmQgX19CLCBfX20yNTZkIF9fQykKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwZDI1Nl9tYXNreiAoKF9fdjRkZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRmKSBfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oX192NGRmKSBfX0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfZm1hZGRzdWJfcHMoX19tMTI4IF9fQSwgX19tbWFzazggX19VLCBfX20xMjggX19CLCBfX20xMjggX19DKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfdmZtYWRkc3VicHMxMjhfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikgX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikgX19DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFzazNfZm1hZGRzdWJfcHMoX19tMTI4IF9fQSwgX19tMTI4IF9fQiwgX19tMTI4IF9fQywgX19tbWFzazggX19VKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfdmZtYWRkc3VicHMxMjhfbWFzazMgKChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKSBfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikgX19DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2ZtYWRkc3ViX3BzKF9fbW1hc2s4IF9fVSwgX19tMTI4IF9fQSwgX19tMTI4IF9fQiwgX19tMTI4IF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBzMTI4X21hc2t6ICgoX192NHNmKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikgX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpIF9fQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2Ztc3ViYWRkX3BzKF9fbTEyOCBfX0EsIF9fbW1hc2s4IF9fVSwgX19tMTI4IF9fQiwgX19tMTI4IF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBzMTI4X21hc2sgKChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oX192NHNmKSBfX0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9mbXN1YmFkZF9wcyhfX21tYXNrOCBfX1UsIF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IsIF9fbTEyOCBfX0MpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwczEyOF9tYXNreiAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKF9fdjRzZikgX19DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfZm1hZGRzdWJfcHMoX19tMjU2IF9fQSwgX19tbWFzazggX19VLCBfX20yNTYgX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTI1NiBfX0MpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwczI1Nl9tYXNrICgoX192OHNmKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNmKSBfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNmKSBfX0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrM19mbWFkZHN1Yl9wcyhfX20yNTYgX19BLCBfX20yNTYgX19CLCBfX20yNTYgX19DLCBfX21tYXNrOCBfX1UpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwczI1Nl9tYXNrMyAoKF9fdjhzZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2YpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNmKSBfX0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfZm1hZGRzdWJfcHMoX19tbWFzazggX19VLCBfX20yNTYgX19BLCBfX20yNTYgX19CLCBfX20yNTYgX19DKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfdmZtYWRkc3VicHMyNTZfbWFza3ogKChfX3Y4c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNmKSBfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzZikgX19DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfZm1zdWJhZGRfcHMoX19tMjU2IF9fQSwgX19tbWFzazggX19VLCBfX20yNTYgX19CLCBfX20yNTYgX19DKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfdmZtYWRkc3VicHMyNTZfbWFzayAoKF9fdjhzZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzZikgX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShfX3Y4c2YpIF9fQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X2Ztc3ViYWRkX3BzKF9fbW1hc2s4IF9fVSwgX19tMjU2IF9fQSwgX19tMjU2IF9fQiwgX19tMjU2IF9fQykKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBzMjU2X21hc2t6ICgoX192OHNmKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzZikgX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oX192OHNmKSBfX0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2szX2Ztc3ViX3BkKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQiwgX19tMTI4ZCBfX0MsIF9fbW1hc2s4IF9fVSkKK3sKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl92Zm1zdWJwZDEyOF9tYXNrMyAoKF9fdjJkZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKSBfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpIF9fQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2szX2Ztc3ViX3BkKF9fbTI1NmQgX19BLCBfX20yNTZkIF9fQiwgX19tMjU2ZCBfX0MsIF9fbW1hc2s4IF9fVSkKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl92Zm1zdWJwZDI1Nl9tYXNrMyAoKF9fdjRkZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRmKSBfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGYpIF9fQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFzazNfZm1zdWJfcHMoX19tMTI4IF9fQSwgX19tMTI4IF9fQiwgX19tMTI4IF9fQywgX19tbWFzazggX19VKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfdmZtc3VicHMxMjhfbWFzazMgKChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKSBfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikgX19DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2szX2Ztc3ViX3BzKF9fbTI1NiBfX0EsIF9fbTI1NiBfX0IsIF9fbTI1NiBfX0MsIF9fbW1hc2s4IF9fVSkKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX3ZmbXN1YnBzMjU2X21hc2szICgoX192OHNmKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzZikgX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2YpIF9fQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFzazNfZm1zdWJhZGRfcGQoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CLCBfX20xMjhkIF9fQywgX19tbWFzazggX19VKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3ZmbXN1YmFkZHBkMTI4X21hc2szICgoX192MmRmKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZikgX19DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFzazNfZm1zdWJhZGRfcGQoX19tMjU2ZCBfX0EsIF9fbTI1NmQgX19CLCBfX20yNTZkIF9fQywgX19tbWFzazggX19VKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX3ZmbXN1YmFkZHBkMjU2X21hc2szICgoX192NGRmKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGYpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkZikgX19DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrM19mbXN1YmFkZF9wcyhfX20xMjggX19BLCBfX20xMjggX19CLCBfX20xMjggX19DLCBfX21tYXNrOCBfX1UpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl92Zm1zdWJhZGRwczEyOF9tYXNrMyAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKSBfX0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFzazNfZm1zdWJhZGRfcHMoX19tMjU2IF9fQSwgX19tMjU2IF9fQiwgX19tMjU2IF9fQywgX19tbWFzazggX19VKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfdmZtc3ViYWRkcHMyNTZfbWFzazMgKChfX3Y4c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNmKSBfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzZikgX19DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2ZubWFkZF9wZChfX20xMjhkIF9fQSwgX19tbWFzazggX19VLCBfX20xMjhkIF9fQiwgX19tMTI4ZCBfX0MpCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfdmZubWFkZHBkMTI4X21hc2sgKChfX3YyZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZikgX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKSBfX0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2ZubWFkZF9wZChfX20yNTZkIF9fQSwgX19tbWFzazggX19VLCBfX20yNTZkIF9fQiwgX19tMjU2ZCBfX0MpCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfdmZubWFkZHBkMjU2X21hc2sgKChfX3Y0ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkZikgX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRmKSBfX0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfZm5tYWRkX3BzKF9fbTEyOCBfX0EsIF9fbW1hc2s4IF9fVSwgX19tMTI4IF9fQiwgX19tMTI4IF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3Zmbm1hZGRwczEyOF9tYXNrICgoX192NHNmKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikgX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpIF9fQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2ZubWFkZF9wcyhfX20yNTYgX19BLCBfX21tYXNrOCBfX1UsIF9fbTI1NiBfX0IsIF9fbTI1NiBfX0MpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl92Zm5tYWRkcHMyNTZfbWFzayAoKF9fdjhzZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2YpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNmKSBfX0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfZm5tc3ViX3BkKF9fbTEyOGQgX19BLCBfX21tYXNrOCBfX1UsIF9fbTEyOGQgX19CLCBfX20xMjhkIF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl92Zm5tc3VicGQxMjhfbWFzayAoKF9fdjJkZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKSBfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpIF9fQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2szX2ZubXN1Yl9wZChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IsIF9fbTEyOGQgX19DLCBfX21tYXNrOCBfX1UpCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfdmZubXN1YnBkMTI4X21hc2szICgoX192MmRmKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKSBfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKSBfX0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19mbm1zdWJfcGQoX19tMjU2ZCBfX0EsIF9fbW1hc2s4IF9fVSwgX19tMjU2ZCBfX0IsIF9fbTI1NmQgX19DKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX3Zmbm1zdWJwZDI1Nl9tYXNrICgoX192NGRmKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGYpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkZikgX19DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFzazNfZm5tc3ViX3BkKF9fbTI1NmQgX19BLCBfX20yNTZkIF9fQiwgX19tMjU2ZCBfX0MsIF9fbW1hc2s4IF9fVSkKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl92Zm5tc3VicGQyNTZfbWFzazMgKChfX3Y0ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGYpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGYpIF9fQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfZm5tc3ViX3BzKF9fbTEyOCBfX0EsIF9fbW1hc2s4IF9fVSwgX19tMTI4IF9fQiwgX19tMTI4IF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3Zmbm1zdWJwczEyOF9tYXNrICgoX192NHNmKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikgX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpIF9fQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrM19mbm1zdWJfcHMoX19tMTI4IF9fQSwgX19tMTI4IF9fQiwgX19tMTI4IF9fQywgX19tbWFzazggX19VKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfdmZubXN1YnBzMTI4X21hc2szICgoX192NHNmKSBfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikgX19DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2ZubXN1Yl9wcyhfX20yNTYgX19BLCBfX21tYXNrOCBfX1UsIF9fbTI1NiBfX0IsIF9fbTI1NiBfX0MpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl92Zm5tc3VicHMyNTZfbWFzayAoKF9fdjhzZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2YpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNmKSBfX0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFzazNfZm5tc3ViX3BzKF9fbTI1NiBfX0EsIF9fbTI1NiBfX0IsIF9fbTI1NiBfX0MsIF9fbW1hc2s4IF9fVSkKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX3Zmbm1zdWJwczI1Nl9tYXNrMyAoKF9fdjhzZikgX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNmKSBfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2YpIF9fQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfYWRkX3BkIChfX20xMjhkIF9fVywgX19tbWFzazggX19VLCBfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9hZGRwZDEyOF9tYXNrICgoX192MmRmKSBfX0EsCisgICAgICAgICAgICAgKF9fdjJkZikgX19CLAorICAgICAgICAgICAgIChfX3YyZGYpIF9fVywKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfYWRkX3BkIChfX21tYXNrOCBfX1UsIF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikgeworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX2FkZHBkMTI4X21hc2sgKChfX3YyZGYpIF9fQSwKKyAgICAgICAgICAgICAoX192MmRmKSBfX0IsCisgICAgICAgICAgICAgKF9fdjJkZikKKyAgICAgICAgICAgICBfbW1fc2V0emVyb19wZCAoKSwKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19hZGRfcGQgKF9fbTI1NmQgX19XLCBfX21tYXNrOCBfX1UsIF9fbTI1NmQgX19BLCBfX20yNTZkIF9fQikgeworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX2FkZHBkMjU2X21hc2sgKChfX3Y0ZGYpIF9fQSwKKyAgICAgICAgICAgICAoX192NGRmKSBfX0IsCisgICAgICAgICAgICAgKF9fdjRkZikgX19XLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9hZGRfcGQgKF9fbW1hc2s4IF9fVSwgX19tMjU2ZCBfX0EsIF9fbTI1NmQgX19CKSB7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfYWRkcGQyNTZfbWFzayAoKF9fdjRkZikgX19BLAorICAgICAgICAgICAgIChfX3Y0ZGYpIF9fQiwKKyAgICAgICAgICAgICAoX192NGRmKQorICAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3BkICgpLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfYWRkX3BzIChfX20xMjggX19XLCBfX21tYXNrMTYgX19VLCBfX20xMjggX19BLCBfX20xMjggX19CKSB7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9hZGRwczEyOF9tYXNrICgoX192NHNmKSBfX0EsCisgICAgICAgICAgICAoX192NHNmKSBfX0IsCisgICAgICAgICAgICAoX192NHNmKSBfX1csCisgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9hZGRfcHMgKF9fbW1hc2sxNiBfX1UsIF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2FkZHBzMTI4X21hc2sgKChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAgIChfX3Y0c2YpIF9fQiwKKyAgICAgICAgICAgIChfX3Y0c2YpCisgICAgICAgICAgICBfbW1fc2V0emVyb19wcyAoKSwKKyAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfYWRkX3BzIChfX20yNTYgX19XLCBfX21tYXNrMTYgX19VLCBfX20yNTYgX19BLCBfX20yNTYgX19CKSB7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9hZGRwczI1Nl9tYXNrICgoX192OHNmKSBfX0EsCisgICAgICAgICAgICAoX192OHNmKSBfX0IsCisgICAgICAgICAgICAoX192OHNmKSBfX1csCisgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9hZGRfcHMgKF9fbW1hc2sxNiBfX1UsIF9fbTI1NiBfX0EsIF9fbTI1NiBfX0IpIHsKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX2FkZHBzMjU2X21hc2sgKChfX3Y4c2YpIF9fQSwKKyAgICAgICAgICAgIChfX3Y4c2YpIF9fQiwKKyAgICAgICAgICAgIChfX3Y4c2YpCisgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19wcyAoKSwKKyAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2JsZW5kX2VwaTMyIChfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BLCBfX20xMjhpIF9fVykgeworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3NlbGVjdGRfMTI4ICgoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICAgICAgICAoX192NHNpKSBfX1csCisgICAgICAgICAgICAgICAgKF9fdjRzaSkgX19BKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2JsZW5kX2VwaTMyIChfX21tYXNrOCBfX1UsIF9fbTI1NmkgX19BLCBfX20yNTZpIF9fVykgeworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3NlbGVjdGRfMjU2ICgoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICAgICAgICAoX192OHNpKSBfX1csCisgICAgICAgICAgICAgICAgKF9fdjhzaSkgX19BKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2JsZW5kX3BkIChfX21tYXNrOCBfX1UsIF9fbTEyOGQgX19BLCBfX20xMjhkIF9fVykgeworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3NlbGVjdHBkXzEyOCAoKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgICAgICAgIChfX3YyZGYpIF9fVywKKyAgICAgICAgICAgICAgICAgKF9fdjJkZikgX19BKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2JsZW5kX3BkIChfX21tYXNrOCBfX1UsIF9fbTI1NmQgX19BLCBfX20yNTZkIF9fVykgeworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX3NlbGVjdHBkXzI1NiAoKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgICAgICAgIChfX3Y0ZGYpIF9fVywKKyAgICAgICAgICAgICAgICAgKF9fdjRkZikgX19BKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfYmxlbmRfcHMgKF9fbW1hc2s4IF9fVSwgX19tMTI4IF9fQSwgX19tMTI4IF9fVykgeworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfc2VsZWN0cHNfMTI4ICgoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICAgICAgICAoX192NHNmKSBfX1csCisgICAgICAgICAgICAgICAgKF9fdjRzZikgX19BKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfYmxlbmRfcHMgKF9fbW1hc2s4IF9fVSwgX19tMjU2IF9fQSwgX19tMjU2IF9fVykgeworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfc2VsZWN0cHNfMjU2ICgoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICAgICAgICAoX192OHNmKSBfX1csCisgICAgICAgICAgICAgICAgKF9fdjhzZikgX19BKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2JsZW5kX2VwaTY0IChfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BLCBfX20xMjhpIF9fVykgeworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3NlbGVjdHFfMTI4ICgoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICAgICAgICAoX192MmRpKSBfX1csCisgICAgICAgICAgICAgICAgKF9fdjJkaSkgX19BKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2JsZW5kX2VwaTY0IChfX21tYXNrOCBfX1UsIF9fbTI1NmkgX19BLCBfX20yNTZpIF9fVykgeworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3NlbGVjdHFfMjU2ICgoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICAgICAgICAoX192NGRpKSBfX1csCisgICAgICAgICAgICAgICAgKF9fdjRkaSkgX19BKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2NvbXByZXNzX3BkIChfX20xMjhkIF9fVywgX19tbWFzazggX19VLCBfX20xMjhkIF9fQSkgeworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzZGYxMjhfbWFzayAoKF9fdjJkZikgX19BLAorICAgICAgICAgICAgICAgICAgKF9fdjJkZikgX19XLAorICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2NvbXByZXNzX3BkIChfX21tYXNrOCBfX1UsIF9fbTEyOGQgX19BKSB7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfY29tcHJlc3NkZjEyOF9tYXNrICgoX192MmRmKSBfX0EsCisgICAgICAgICAgICAgICAgICAoX192MmRmKQorICAgICAgICAgICAgICAgICAgX21tX3NldHplcm9fcGQgKCksCisgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jb21wcmVzc19wZCAoX19tMjU2ZCBfX1csIF9fbW1hc2s4IF9fVSwgX19tMjU2ZCBfX0EpIHsKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9jb21wcmVzc2RmMjU2X21hc2sgKChfX3Y0ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAgIChfX3Y0ZGYpIF9fVywKKyAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9jb21wcmVzc19wZCAoX19tbWFzazggX19VLCBfX20yNTZkIF9fQSkgeworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzZGYyNTZfbWFzayAoKF9fdjRkZikgX19BLAorICAgICAgICAgICAgICAgICAgKF9fdjRkZikKKyAgICAgICAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3BkICgpLAorICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfY29tcHJlc3NfZXBpNjQgKF9fbTEyOGkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BKSB7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfY29tcHJlc3NkaTEyOF9tYXNrICgoX192MmRpKSBfX0EsCisgICAgICAgICAgICAgICAgICAoX192MmRpKSBfX1csCisgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfY29tcHJlc3NfZXBpNjQgKF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9jb21wcmVzc2RpMTI4X21hc2sgKChfX3YyZGkpIF9fQSwKKyAgICAgICAgICAgICAgICAgIChfX3YyZGkpCisgICAgICAgICAgICAgICAgICBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2NvbXByZXNzX2VwaTY0IChfX20yNTZpIF9fVywgX19tbWFzazggX19VLCBfX20yNTZpIF9fQSkgeworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzZGkyNTZfbWFzayAoKF9fdjRkaSkgX19BLAorICAgICAgICAgICAgICAgICAgKF9fdjRkaSkgX19XLAorICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X2NvbXByZXNzX2VwaTY0IChfX21tYXNrOCBfX1UsIF9fbTI1NmkgX19BKSB7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfY29tcHJlc3NkaTI1Nl9tYXNrICgoX192NGRpKSBfX0EsCisgICAgICAgICAgICAgICAgICAoX192NGRpKQorICAgICAgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2NvbXByZXNzX3BzIChfX20xMjggX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOCBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc2YxMjhfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgICAoX192NHNmKSBfX1csCisgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2NvbXByZXNzX3BzIChfX21tYXNrOCBfX1UsIF9fbTEyOCBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc2YxMjhfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgICAoX192NHNmKQorICAgICAgICAgICAgICAgICBfbW1fc2V0emVyb19wcyAoKSwKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jb21wcmVzc19wcyAoX19tMjU2IF9fVywgX19tbWFzazggX19VLCBfX20yNTYgX19BKSB7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9jb21wcmVzc3NmMjU2X21hc2sgKChfX3Y4c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjhzZikgX19XLAorICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9jb21wcmVzc19wcyAoX19tbWFzazggX19VLCBfX20yNTYgX19BKSB7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9jb21wcmVzc3NmMjU2X21hc2sgKChfX3Y4c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjhzZikKKyAgICAgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fcHMgKCksCisgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2NvbXByZXNzX2VwaTMyIChfX20xMjhpIF9fVywgX19tbWFzazggX19VLCBfX20xMjhpIF9fQSkgeworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc2kxMjhfbWFzayAoKF9fdjRzaSkgX19BLAorICAgICAgICAgICAgICAgICAgKF9fdjRzaSkgX19XLAorICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2NvbXByZXNzX2VwaTMyIChfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BKSB7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfY29tcHJlc3NzaTEyOF9tYXNrICgoX192NHNpKSBfX0EsCisgICAgICAgICAgICAgICAgICAoX192NHNpKQorICAgICAgICAgICAgICAgICAgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jb21wcmVzc19lcGkzMiAoX19tMjU2aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMjU2aSBfX0EpIHsKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9jb21wcmVzc3NpMjU2X21hc2sgKChfX3Y4c2kpIF9fQSwKKyAgICAgICAgICAgICAgICAgIChfX3Y4c2kpIF9fVywKKyAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9jb21wcmVzc19lcGkzMiAoX19tbWFzazggX19VLCBfX20yNTZpIF9fQSkgeworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc2kyNTZfbWFzayAoKF9fdjhzaSkgX19BLAorICAgICAgICAgICAgICAgICAgKF9fdjhzaSkKKyAgICAgICAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2ICgpLAorICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfY29tcHJlc3NzdG9yZXVfcGQgKHZvaWQgKl9fUCwgX19tbWFzazggX19VLCBfX20xMjhkIF9fQSkgeworICBfX2J1aWx0aW5faWEzMl9jb21wcmVzc3N0b3JlZGYxMjhfbWFzayAoKF9fdjJkZiAqKSBfX1AsCisgICAgICAgICAgICAoX192MmRmKSBfX0EsCisgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jb21wcmVzc3N0b3JldV9wZCAodm9pZCAqX19QLCBfX21tYXNrOCBfX1UsIF9fbTI1NmQgX19BKSB7CisgIF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc3RvcmVkZjI1Nl9tYXNrICgoX192NGRmICopIF9fUCwKKyAgICAgICAgICAgIChfX3Y0ZGYpIF9fQSwKKyAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2NvbXByZXNzc3RvcmV1X2VwaTY0ICh2b2lkICpfX1AsIF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EpIHsKKyAgX19idWlsdGluX2lhMzJfY29tcHJlc3NzdG9yZWRpMTI4X21hc2sgKChfX3YyZGkgKikgX19QLAorICAgICAgICAgICAgKF9fdjJkaSkgX19BLAorICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfY29tcHJlc3NzdG9yZXVfZXBpNjQgKHZvaWQgKl9fUCwgX19tbWFzazggX19VLCBfX20yNTZpIF9fQSkgeworICBfX2J1aWx0aW5faWEzMl9jb21wcmVzc3N0b3JlZGkyNTZfbWFzayAoKF9fdjRkaSAqKSBfX1AsCisgICAgICAgICAgICAoX192NGRpKSBfX0EsCisgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jb21wcmVzc3N0b3JldV9wcyAodm9pZCAqX19QLCBfX21tYXNrOCBfX1UsIF9fbTEyOCBfX0EpIHsKKyAgX19idWlsdGluX2lhMzJfY29tcHJlc3NzdG9yZXNmMTI4X21hc2sgKChfX3Y0c2YgKikgX19QLAorICAgICAgICAgICAgKF9fdjRzZikgX19BLAorICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfY29tcHJlc3NzdG9yZXVfcHMgKHZvaWQgKl9fUCwgX19tbWFzazggX19VLCBfX20yNTYgX19BKSB7CisgIF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc3RvcmVzZjI1Nl9tYXNrICgoX192OHNmICopIF9fUCwKKyAgICAgICAgICAgIChfX3Y4c2YpIF9fQSwKKyAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2NvbXByZXNzc3RvcmV1X2VwaTMyICh2b2lkICpfX1AsIF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EpIHsKKyAgX19idWlsdGluX2lhMzJfY29tcHJlc3NzdG9yZXNpMTI4X21hc2sgKChfX3Y0c2kgKikgX19QLAorICAgICAgICAgICAgKF9fdjRzaSkgX19BLAorICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfY29tcHJlc3NzdG9yZXVfZXBpMzIgKHZvaWQgKl9fUCwgX19tbWFzazggX19VLCBfX20yNTZpIF9fQSkgeworICBfX2J1aWx0aW5faWEzMl9jb21wcmVzc3N0b3Jlc2kyNTZfbWFzayAoKF9fdjhzaSAqKSBfX1AsCisgICAgICAgICAgICAoX192OHNpKSBfX0EsCisgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jdnRlcGkzMl9wZCAoX19tMTI4ZCBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9jdnRkcTJwZDEyOF9tYXNrICgoX192NHNpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjJkZikgX19XLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9jdnRlcGkzMl9wZCAoX19tbWFzazggX19VLCBfX20xMjhpIF9fQSkgeworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX2N2dGRxMnBkMTI4X21hc2sgKChfX3Y0c2kpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192MmRmKQorICAgICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3BkICgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2N2dGVwaTMyX3BkIChfX20yNTZkIF9fVywgX19tbWFzazggX19VLCBfX20xMjhpIF9fQSkgeworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX2N2dGRxMnBkMjU2X21hc2sgKChfX3Y0c2kpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192NGRmKSBfX1csCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X2N2dGVwaTMyX3BkIChfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BKSB7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfY3Z0ZHEycGQyNTZfbWFzayAoKF9fdjRzaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3Y0ZGYpCisgICAgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fcGQgKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jdnRlcGkzMl9wcyAoX19tMTI4IF9fVywgX19tbWFzazggX19VLCBfX20xMjhpIF9fQSkgeworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY3Z0ZHEycHMxMjhfbWFzayAoKF9fdjRzaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjRzZikgX19XLAorICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfY3Z0ZXBpMzJfcHMgKF9fbW1hc2sxNiBfX1UsIF9fbTEyOGkgX19BKSB7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9jdnRkcTJwczEyOF9tYXNrICgoX192NHNpKSBfX0EsCisgICAgICAgICAgICAgICAoX192NHNmKQorICAgICAgICAgICAgICAgX21tX3NldHplcm9fcHMgKCksCisgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2N2dGVwaTMyX3BzIChfX20yNTYgX19XLCBfX21tYXNrOCBfX1UsIF9fbTI1NmkgX19BKSB7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9jdnRkcTJwczI1Nl9tYXNrICgoX192OHNpKSBfX0EsCisgICAgICAgICAgICAgICAoX192OHNmKSBfX1csCisgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9jdnRlcGkzMl9wcyAoX19tbWFzazE2IF9fVSwgX19tMjU2aSBfX0EpIHsKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX2N2dGRxMnBzMjU2X21hc2sgKChfX3Y4c2kpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3Y4c2YpCisgICAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19wcyAoKSwKKyAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2N2dHBkX2VwaTMyIChfX20xMjhpIF9fVywgX19tbWFzazggX19VLCBfX20xMjhkIF9fQSkgeworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2N2dHBkMmRxMTI4X21hc2sgKChfX3YyZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192NHNpKSBfX1csCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2N2dHBkX2VwaTMyIChfX21tYXNrOCBfX1UsIF9fbTEyOGQgX19BKSB7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfY3Z0cGQyZHExMjhfbWFzayAoKF9fdjJkZikgX19BLAorICAgICAgICAgICAgICAgIChfX3Y0c2kpCisgICAgICAgICAgICAgICAgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfY3Z0cGRfZXBpMzIgKF9fbTEyOGkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTI1NmQgX19BKSB7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfY3Z0cGQyZHEyNTZfbWFzayAoKF9fdjRkZikgX19BLAorICAgICAgICAgICAgICAgIChfX3Y0c2kpIF9fVywKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfY3Z0cGRfZXBpMzIgKF9fbW1hc2s4IF9fVSwgX19tMjU2ZCBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9jdnRwZDJkcTI1Nl9tYXNrICgoX192NGRmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjRzaSkKKyAgICAgICAgICAgICAgICBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2N2dHBkX3BzIChfX20xMjggX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOGQgX19BKSB7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9jdnRwZDJwc19tYXNrICgoX192MmRmKSBfX0EsCisgICAgICAgICAgICAoX192NHNmKSBfX1csCisgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9jdnRwZF9wcyAoX19tbWFzazggX19VLCBfX20xMjhkIF9fQSkgeworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY3Z0cGQycHNfbWFzayAoKF9fdjJkZikgX19BLAorICAgICAgICAgICAgKF9fdjRzZikKKyAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3BzICgpLAorICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jdnRwZF9wcyAoX19tMTI4IF9fVywgX19tbWFzazggX19VLCBfX20yNTZkIF9fQSkgeworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY3Z0cGQycHMyNTZfbWFzayAoKF9fdjRkZikgX19BLAorICAgICAgICAgICAgICAgKF9fdjRzZikgX19XLAorICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfY3Z0cGRfcHMgKF9fbW1hc2s4IF9fVSwgX19tMjU2ZCBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2N2dHBkMnBzMjU2X21hc2sgKChfX3Y0ZGYpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3Y0c2YpCisgICAgICAgICAgICAgICBfbW1fc2V0emVyb19wcyAoKSwKKyAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jdnRwZF9lcHUzMiAoX19tMTI4ZCBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9jdnRwZDJ1ZHExMjhfbWFzayAoKF9fdjJkZikgX19BLAorICAgICAgICAgICAgICAgICAoX192NHNpKQorICAgICAgICAgICAgICAgICBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jdnRwZF9lcHUzMiAoX19tMTI4aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4ZCBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9jdnRwZDJ1ZHExMjhfbWFzayAoKF9fdjJkZikgX19BLAorICAgICAgICAgICAgICAgICAoX192NHNpKSBfX1csCisgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9jdnRwZF9lcHUzMiAoX19tbWFzazggX19VLCBfX20xMjhkIF9fQSkgeworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2N2dHBkMnVkcTEyOF9tYXNrICgoX192MmRmKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3Y0c2kpCisgICAgICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY3Z0cGRfZXB1MzIgKF9fbTI1NmQgX19BKSB7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfY3Z0cGQydWRxMjU2X21hc2sgKChfX3Y0ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjRzaSkKKyAgICAgICAgICAgICAgICAgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfY3Z0cGRfZXB1MzIgKF9fbTEyOGkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTI1NmQgX19BKSB7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfY3Z0cGQydWRxMjU2X21hc2sgKChfX3Y0ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjRzaSkgX19XLAorICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfY3Z0cGRfZXB1MzIgKF9fbW1hc2s4IF9fVSwgX19tMjU2ZCBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9jdnRwZDJ1ZHEyNTZfbWFzayAoKF9fdjRkZikgX19BLAorICAgICAgICAgICAgICAgICAoX192NHNpKQorICAgICAgICAgICAgICAgICBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfY3Z0cHNfZXBpMzIgKF9fbTEyOGkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOCBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9jdnRwczJkcTEyOF9tYXNrICgoX192NHNmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjRzaSkgX19XLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9jdnRwc19lcGkzMiAoX19tbWFzazggX19VLCBfX20xMjggX19BKSB7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfY3Z0cHMyZHExMjhfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgIChfX3Y0c2kpCisgICAgICAgICAgICAgICAgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfY3Z0cHNfZXBpMzIgKF9fbTI1NmkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTI1NiBfX0EpIHsKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9jdnRwczJkcTI1Nl9tYXNrICgoX192OHNmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjhzaSkgX19XLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9jdnRwc19lcGkzMiAoX19tbWFzazggX19VLCBfX20yNTYgX19BKSB7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfY3Z0cHMyZHEyNTZfbWFzayAoKF9fdjhzZikgX19BLAorICAgICAgICAgICAgICAgIChfX3Y4c2kpCisgICAgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfY3Z0cHNfcGQgKF9fbTEyOGQgX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOCBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9jdnRwczJwZDEyOF9tYXNrICgoX192NHNmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjJkZikgX19XLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9jdnRwc19wZCAoX19tbWFzazggX19VLCBfX20xMjggX19BKSB7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfY3Z0cHMycGQxMjhfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgIChfX3YyZGYpCisgICAgICAgICAgICAgICAgX21tX3NldHplcm9fcGQgKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfY3Z0cHNfcGQgKF9fbTI1NmQgX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOCBfX0EpIHsKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9jdnRwczJwZDI1Nl9tYXNrICgoX192NHNmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjRkZikgX19XLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9jdnRwc19wZCAoX19tbWFzazggX19VLCBfX20xMjggX19BKSB7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfY3Z0cHMycGQyNTZfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgIChfX3Y0ZGYpCisgICAgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fcGQgKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2N2dHBzX2VwdTMyIChfX20xMjggX19BKSB7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfY3Z0cHMydWRxMTI4X21hc2sgKChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjRzaSkKKyAgICAgICAgICAgICAgICAgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfY3Z0cHNfZXB1MzIgKF9fbTEyOGkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOCBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9jdnRwczJ1ZHExMjhfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgICAoX192NHNpKSBfX1csCisgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9jdnRwc19lcHUzMiAoX19tbWFzazggX19VLCBfX20xMjggX19BKSB7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfY3Z0cHMydWRxMTI4X21hc2sgKChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjRzaSkKKyAgICAgICAgICAgICAgICAgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9jdnRwc19lcHUzMiAoX19tMjU2IF9fQSkgeworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX2N2dHBzMnVkcTI1Nl9tYXNrICgoX192OHNmKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3Y4c2kpCisgICAgICAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2ICgpLAorICAgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2N2dHBzX2VwdTMyIChfX20yNTZpIF9fVywgX19tbWFzazggX19VLCBfX20yNTYgX19BKSB7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfY3Z0cHMydWRxMjU2X21hc2sgKChfX3Y4c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjhzaSkgX19XLAorICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfY3Z0cHNfZXB1MzIgKF9fbW1hc2s4IF9fVSwgX19tMjU2IF9fQSkgeworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX2N2dHBzMnVkcTI1Nl9tYXNrICgoX192OHNmKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3Y4c2kpCisgICAgICAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2ICgpLAorICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jdnR0cGRfZXBpMzIgKF9fbTEyOGkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOGQgX19BKSB7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfY3Z0dHBkMmRxMTI4X21hc2sgKChfX3YyZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjRzaSkgX19XLAorICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfY3Z0dHBkX2VwaTMyIChfX21tYXNrOCBfX1UsIF9fbTEyOGQgX19BKSB7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfY3Z0dHBkMmRxMTI4X21hc2sgKChfX3YyZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjRzaSkKKyAgICAgICAgICAgICAgICAgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2N2dHRwZF9lcGkzMiAoX19tMTI4aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMjU2ZCBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9jdnR0cGQyZHEyNTZfbWFzayAoKF9fdjRkZikgX19BLAorICAgICAgICAgICAgICAgICAoX192NHNpKSBfX1csCisgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9jdnR0cGRfZXBpMzIgKF9fbW1hc2s4IF9fVSwgX19tMjU2ZCBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9jdnR0cGQyZHEyNTZfbWFzayAoKF9fdjRkZikgX19BLAorICAgICAgICAgICAgICAgICAoX192NHNpKQorICAgICAgICAgICAgICAgICBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2N2dHRwZF9lcHUzMiAoX19tMTI4ZCBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9jdnR0cGQydWRxMTI4X21hc2sgKChfX3YyZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAgIChfX3Y0c2kpCisgICAgICAgICAgICAgICAgICBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfY3Z0dHBkX2VwdTMyIChfX20xMjhpIF9fVywgX19tbWFzazggX19VLCBfX20xMjhkIF9fQSkgeworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2N2dHRwZDJ1ZHExMjhfbWFzayAoKF9fdjJkZikgX19BLAorICAgICAgICAgICAgICAgICAgKF9fdjRzaSkgX19XLAorICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2N2dHRwZF9lcHUzMiAoX19tbWFzazggX19VLCBfX20xMjhkIF9fQSkgeworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2N2dHRwZDJ1ZHExMjhfbWFzayAoKF9fdjJkZikgX19BLAorICAgICAgICAgICAgICAgICAgKF9fdjRzaSkKKyAgICAgICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2N2dHRwZF9lcHUzMiAoX19tMjU2ZCBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9jdnR0cGQydWRxMjU2X21hc2sgKChfX3Y0ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAgIChfX3Y0c2kpCisgICAgICAgICAgICAgICAgICBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfY3Z0dHBkX2VwdTMyIChfX20xMjhpIF9fVywgX19tbWFzazggX19VLCBfX20yNTZkIF9fQSkgeworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2N2dHRwZDJ1ZHEyNTZfbWFzayAoKF9fdjRkZikgX19BLAorICAgICAgICAgICAgICAgICAgKF9fdjRzaSkgX19XLAorICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X2N2dHRwZF9lcHUzMiAoX19tbWFzazggX19VLCBfX20yNTZkIF9fQSkgeworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2N2dHRwZDJ1ZHEyNTZfbWFzayAoKF9fdjRkZikgX19BLAorICAgICAgICAgICAgICAgICAgKF9fdjRzaSkKKyAgICAgICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfY3Z0dHBzX2VwaTMyIChfX20xMjhpIF9fVywgX19tbWFzazggX19VLCBfX20xMjggX19BKSB7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfY3Z0dHBzMmRxMTI4X21hc2sgKChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjRzaSkgX19XLAorICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfY3Z0dHBzX2VwaTMyIChfX21tYXNrOCBfX1UsIF9fbTEyOCBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9jdnR0cHMyZHExMjhfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgICAoX192NHNpKQorICAgICAgICAgICAgICAgICBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfY3Z0dHBzX2VwaTMyIChfX20yNTZpIF9fVywgX19tbWFzazggX19VLCBfX20yNTYgX19BKSB7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfY3Z0dHBzMmRxMjU2X21hc2sgKChfX3Y4c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjhzaSkgX19XLAorICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfY3Z0dHBzX2VwaTMyIChfX21tYXNrOCBfX1UsIF9fbTI1NiBfX0EpIHsKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9jdnR0cHMyZHEyNTZfbWFzayAoKF9fdjhzZikgX19BLAorICAgICAgICAgICAgICAgICAoX192OHNpKQorICAgICAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2N2dHRwc19lcHUzMiAoX19tMTI4IF9fQSkgeworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2N2dHRwczJ1ZHExMjhfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgICAgKF9fdjRzaSkKKyAgICAgICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jdnR0cHNfZXB1MzIgKF9fbTEyOGkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOCBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9jdnR0cHMydWRxMTI4X21hc2sgKChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAgIChfX3Y0c2kpIF9fVywKKyAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9jdnR0cHNfZXB1MzIgKF9fbW1hc2s4IF9fVSwgX19tMTI4IF9fQSkgeworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2N2dHRwczJ1ZHExMjhfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgICAgKF9fdjRzaSkKKyAgICAgICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2N2dHRwc19lcHUzMiAoX19tMjU2IF9fQSkgeworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX2N2dHRwczJ1ZHEyNTZfbWFzayAoKF9fdjhzZikgX19BLAorICAgICAgICAgICAgICAgICAgKF9fdjhzaSkKKyAgICAgICAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2ICgpLAorICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jdnR0cHNfZXB1MzIgKF9fbTI1NmkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTI1NiBfX0EpIHsKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9jdnR0cHMydWRxMjU2X21hc2sgKChfX3Y4c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAgIChfX3Y4c2kpIF9fVywKKyAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9jdnR0cHNfZXB1MzIgKF9fbW1hc2s4IF9fVSwgX19tMjU2IF9fQSkgeworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX2N2dHRwczJ1ZHEyNTZfbWFzayAoKF9fdjhzZikgX19BLAorICAgICAgICAgICAgICAgICAgKF9fdjhzaSkKKyAgICAgICAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2ICgpLAorICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2N2dGVwdTMyX3BkIChfX20xMjhpIF9fQSkgeworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX2N2dHVkcTJwZDEyOF9tYXNrICgoX192NHNpKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3YyZGYpCisgICAgICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3BkICgpLAorICAgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2N2dGVwdTMyX3BkIChfX20xMjhkIF9fVywgX19tbWFzazggX19VLCBfX20xMjhpIF9fQSkgeworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX2N2dHVkcTJwZDEyOF9tYXNrICgoX192NHNpKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3YyZGYpIF9fVywKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2N2dGVwdTMyX3BkIChfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BKSB7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfY3Z0dWRxMnBkMTI4X21hc2sgKChfX3Y0c2kpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjJkZikKKyAgICAgICAgICAgICAgICAgX21tX3NldHplcm9fcGQgKCksCisgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9jdnRlcHUzMl9wZCAoX19tMTI4aSBfX0EpIHsKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9jdnR1ZHEycGQyNTZfbWFzayAoKF9fdjRzaSkgX19BLAorICAgICAgICAgICAgICAgICAoX192NGRmKQorICAgICAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19wZCAoKSwKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jdnRlcHUzMl9wZCAoX19tMjU2ZCBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EpIHsKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9jdnR1ZHEycGQyNTZfbWFzayAoKF9fdjRzaSkgX19BLAorICAgICAgICAgICAgICAgICAoX192NGRmKSBfX1csCisgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9jdnRlcHUzMl9wZCAoX19tbWFzazggX19VLCBfX20xMjhpIF9fQSkgeworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX2N2dHVkcTJwZDI1Nl9tYXNrICgoX192NHNpKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3Y0ZGYpCisgICAgICAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3BkICgpLAorICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jdnRlcHUzMl9wcyAoX19tMTI4aSBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2N2dHVkcTJwczEyOF9tYXNrICgoX192NHNpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjRzZikKKyAgICAgICAgICAgICAgICBfbW1fc2V0emVyb19wcyAoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfY3Z0ZXB1MzJfcHMgKF9fbTEyOCBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2N2dHVkcTJwczEyOF9tYXNrICgoX192NHNpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjRzZikgX19XLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2N2dGVwdTMyX3BzIChfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BKSB7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9jdnR1ZHEycHMxMjhfbWFzayAoKF9fdjRzaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3Y0c2YpCisgICAgICAgICAgICAgICAgX21tX3NldHplcm9fcHMgKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY3Z0ZXB1MzJfcHMgKF9fbTI1NmkgX19BKSB7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9jdnR1ZHEycHMyNTZfbWFzayAoKF9fdjhzaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3Y4c2YpCisgICAgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fcHMgKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2N2dGVwdTMyX3BzIChfX20yNTYgX19XLCBfX21tYXNrOCBfX1UsIF9fbTI1NmkgX19BKSB7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9jdnR1ZHEycHMyNTZfbWFzayAoKF9fdjhzaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3Y4c2YpIF9fVywKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9jdnRlcHUzMl9wcyAoX19tbWFzazggX19VLCBfX20yNTZpIF9fQSkgeworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfY3Z0dWRxMnBzMjU2X21hc2sgKChfX3Y4c2kpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192OHNmKQorICAgICAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3BzICgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2Rpdl9wZCAoX19tMTI4ZCBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKSB7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfZGl2cGRfbWFzayAoKF9fdjJkZikgX19BLAorICAgICAgICAgICAgICAgIChfX3YyZGYpIF9fQiwKKyAgICAgICAgICAgICAgICAoX192MmRmKSBfX1csCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2Rpdl9wZCAoX19tbWFzazggX19VLCBfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9kaXZwZF9tYXNrICgoX192MmRmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjJkZikgX19CLAorICAgICAgICAgICAgICAgIChfX3YyZGYpCisgICAgICAgICAgICAgICAgX21tX3NldHplcm9fcGQgKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfZGl2X3BkIChfX20yNTZkIF9fVywgX19tbWFzazggX19VLCBfX20yNTZkIF9fQSwKKyAgICAgICAgX19tMjU2ZCBfX0IpIHsKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9kaXZwZDI1Nl9tYXNrICgoX192NGRmKSBfX0EsCisgICAgICAgICAgICAgKF9fdjRkZikgX19CLAorICAgICAgICAgICAgIChfX3Y0ZGYpIF9fVywKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfZGl2X3BkIChfX21tYXNrOCBfX1UsIF9fbTI1NmQgX19BLCBfX20yNTZkIF9fQikgeworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX2RpdnBkMjU2X21hc2sgKChfX3Y0ZGYpIF9fQSwKKyAgICAgICAgICAgICAoX192NGRmKSBfX0IsCisgICAgICAgICAgICAgKF9fdjRkZikKKyAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19wZCAoKSwKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2Rpdl9wcyAoX19tMTI4IF9fVywgX19tbWFzazggX19VLCBfX20xMjggX19BLCBfX20xMjggX19CKSB7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9kaXZwc19tYXNrICgoX192NHNmKSBfX0EsCisgICAgICAgICAgICAgICAoX192NHNmKSBfX0IsCisgICAgICAgICAgICAgICAoX192NHNmKSBfX1csCisgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9kaXZfcHMgKF9fbW1hc2s4IF9fVSwgX19tMTI4IF9fQSwgX19tMTI4IF9fQikgeworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfZGl2cHNfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgKF9fdjRzZikgX19CLAorICAgICAgICAgICAgICAgKF9fdjRzZikKKyAgICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3BzICgpLAorICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19kaXZfcHMgKF9fbTI1NiBfX1csIF9fbW1hc2s4IF9fVSwgX19tMjU2IF9fQSwgX19tMjU2IF9fQikgeworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfZGl2cHMyNTZfbWFzayAoKF9fdjhzZikgX19BLAorICAgICAgICAgICAgKF9fdjhzZikgX19CLAorICAgICAgICAgICAgKF9fdjhzZikgX19XLAorICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfZGl2X3BzIChfX21tYXNrOCBfX1UsIF9fbTI1NiBfX0EsIF9fbTI1NiBfX0IpIHsKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX2RpdnBzMjU2X21hc2sgKChfX3Y4c2YpIF9fQSwKKyAgICAgICAgICAgIChfX3Y4c2YpIF9fQiwKKyAgICAgICAgICAgIChfX3Y4c2YpCisgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19wcyAoKSwKKyAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2V4cGFuZF9wZCAoX19tMTI4ZCBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4ZCBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9leHBhbmRkZjEyOF9tYXNrICgoX192MmRmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjJkZikgX19XLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9leHBhbmRfcGQgKF9fbW1hc2s4IF9fVSwgX19tMTI4ZCBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9leHBhbmRkZjEyOF9tYXNrICgoX192MmRmKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3YyZGYpCisgICAgICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3BkICgpLAorICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19leHBhbmRfcGQgKF9fbTI1NmQgX19XLCBfX21tYXNrOCBfX1UsIF9fbTI1NmQgX19BKSB7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfZXhwYW5kZGYyNTZfbWFzayAoKF9fdjRkZikgX19BLAorICAgICAgICAgICAgICAgIChfX3Y0ZGYpIF9fVywKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfZXhwYW5kX3BkIChfX21tYXNrOCBfX1UsIF9fbTI1NmQgX19BKSB7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfZXhwYW5kZGYyNTZfbWFzayAoKF9fdjRkZikgX19BLAorICAgICAgICAgICAgICAgICAoX192NGRmKQorICAgICAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19wZCAoKSwKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfZXhwYW5kX2VwaTY0IChfX20xMjhpIF9fVywgX19tbWFzazggX19VLCBfX20xMjhpIF9fQSkgeworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2V4cGFuZGRpMTI4X21hc2sgKChfX3YyZGkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192MmRpKSBfX1csCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2V4cGFuZF9lcGk2NCAoX19tbWFzazggX19VLCBfX20xMjhpIF9fQSkgeworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2V4cGFuZGRpMTI4X21hc2sgKChfX3YyZGkpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjJkaSkKKyAgICAgICAgICAgICAgICAgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2V4cGFuZF9lcGk2NCAoX19tMjU2aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMjU2aSBfX0EpIHsKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9leHBhbmRkaTI1Nl9tYXNrICgoX192NGRpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjRkaSkgX19XLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9leHBhbmRfZXBpNjQgKF9fbW1hc2s4IF9fVSwgX19tMjU2aSBfX0EpIHsKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9leHBhbmRkaTI1Nl9tYXNrICgoX192NGRpKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3Y0ZGkpCisgICAgICAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2ICgpLAorICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19leHBhbmRsb2FkdV9wZCAoX19tMTI4ZCBfX1csIF9fbW1hc2s4IF9fVSwgdm9pZCBjb25zdCAqX19QKSB7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfZXhwYW5kbG9hZGRmMTI4X21hc2sgKChfX3YyZGYgKikgX19QLAorICAgICAgICAgICAgICAoX192MmRmKSBfX1csCisgICAgICAgICAgICAgIChfX21tYXNrOCkKKyAgICAgICAgICAgICAgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9leHBhbmRsb2FkdV9wZCAoX19tbWFzazggX19VLCB2b2lkIGNvbnN0ICpfX1ApIHsKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9leHBhbmRsb2FkZGYxMjhfbWFzayAoKF9fdjJkZiAqKSBfX1AsCisgICAgICAgICAgICAgICAoX192MmRmKQorICAgICAgICAgICAgICAgX21tX3NldHplcm9fcGQgKCksCisgICAgICAgICAgICAgICAoX19tbWFzazgpCisgICAgICAgICAgICAgICBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfZXhwYW5kbG9hZHVfcGQgKF9fbTI1NmQgX19XLCBfX21tYXNrOCBfX1UsIHZvaWQgY29uc3QgKl9fUCkgeworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX2V4cGFuZGxvYWRkZjI1Nl9tYXNrICgoX192NGRmICopIF9fUCwKKyAgICAgICAgICAgICAgKF9fdjRkZikgX19XLAorICAgICAgICAgICAgICAoX19tbWFzazgpCisgICAgICAgICAgICAgIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfZXhwYW5kbG9hZHVfcGQgKF9fbW1hc2s4IF9fVSwgdm9pZCBjb25zdCAqX19QKSB7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfZXhwYW5kbG9hZGRmMjU2X21hc2sgKChfX3Y0ZGYgKikgX19QLAorICAgICAgICAgICAgICAgKF9fdjRkZikKKyAgICAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3BkICgpLAorICAgICAgICAgICAgICAgKF9fbW1hc2s4KQorICAgICAgICAgICAgICAgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2V4cGFuZGxvYWR1X2VwaTY0IChfX20xMjhpIF9fVywgX19tbWFzazggX19VLCB2b2lkIGNvbnN0ICpfX1ApIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9leHBhbmRsb2FkZGkxMjhfbWFzayAoKF9fdjJkaSAqKSBfX1AsCisgICAgICAgICAgICAgIChfX3YyZGkpIF9fVywKKyAgICAgICAgICAgICAgKF9fbW1hc2s4KQorICAgICAgICAgICAgICBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2V4cGFuZGxvYWR1X2VwaTY0IChfX21tYXNrOCBfX1UsIHZvaWQgY29uc3QgKl9fUCkgeworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2V4cGFuZGxvYWRkaTEyOF9tYXNrICgoX192MmRpICopIF9fUCwKKyAgICAgICAgICAgICAgIChfX3YyZGkpCisgICAgICAgICAgICAgICBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAgIChfX21tYXNrOCkKKyAgICAgICAgICAgICAgIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19leHBhbmRsb2FkdV9lcGk2NCAoX19tMjU2aSBfX1csIF9fbW1hc2s4IF9fVSwKKyAgICAgICAgICAgICB2b2lkIGNvbnN0ICpfX1ApIHsKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9leHBhbmRsb2FkZGkyNTZfbWFzayAoKF9fdjRkaSAqKSBfX1AsCisgICAgICAgICAgICAgIChfX3Y0ZGkpIF9fVywKKyAgICAgICAgICAgICAgKF9fbW1hc2s4KQorICAgICAgICAgICAgICBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X2V4cGFuZGxvYWR1X2VwaTY0IChfX21tYXNrOCBfX1UsIHZvaWQgY29uc3QgKl9fUCkgeworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX2V4cGFuZGxvYWRkaTI1Nl9tYXNrICgoX192NGRpICopIF9fUCwKKyAgICAgICAgICAgICAgIChfX3Y0ZGkpCisgICAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAgIChfX21tYXNrOCkKKyAgICAgICAgICAgICAgIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2V4cGFuZGxvYWR1X3BzIChfX20xMjggX19XLCBfX21tYXNrOCBfX1UsIHZvaWQgY29uc3QgKl9fUCkgeworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfZXhwYW5kbG9hZHNmMTI4X21hc2sgKChfX3Y0c2YgKikgX19QLAorICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpIF9fVywKKyAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9leHBhbmRsb2FkdV9wcyAoX19tbWFzazggX19VLCB2b2lkIGNvbnN0ICpfX1ApIHsKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2V4cGFuZGxvYWRzZjEyOF9tYXNrICgoX192NHNmICopIF9fUCwKKyAgICAgICAgICAgICAgKF9fdjRzZikKKyAgICAgICAgICAgICAgX21tX3NldHplcm9fcHMgKCksCisgICAgICAgICAgICAgIChfX21tYXNrOCkKKyAgICAgICAgICAgICAgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfZXhwYW5kbG9hZHVfcHMgKF9fbTI1NiBfX1csIF9fbW1hc2s4IF9fVSwgdm9pZCBjb25zdCAqX19QKSB7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9leHBhbmRsb2Fkc2YyNTZfbWFzayAoKF9fdjhzZiAqKSBfX1AsCisgICAgICAgICAgICAgICAgICAgKF9fdjhzZikgX19XLAorICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X2V4cGFuZGxvYWR1X3BzIChfX21tYXNrOCBfX1UsIHZvaWQgY29uc3QgKl9fUCkgeworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfZXhwYW5kbG9hZHNmMjU2X21hc2sgKChfX3Y4c2YgKikgX19QLAorICAgICAgICAgICAgICAoX192OHNmKQorICAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19wcyAoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2s4KQorICAgICAgICAgICAgICBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfZXhwYW5kbG9hZHVfZXBpMzIgKF9fbTEyOGkgX19XLCBfX21tYXNrOCBfX1UsIHZvaWQgY29uc3QgKl9fUCkgeworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2V4cGFuZGxvYWRzaTEyOF9tYXNrICgoX192NHNpICopIF9fUCwKKyAgICAgICAgICAgICAgKF9fdjRzaSkgX19XLAorICAgICAgICAgICAgICAoX19tbWFzazgpCisgICAgICAgICAgICAgIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfZXhwYW5kbG9hZHVfZXBpMzIgKF9fbW1hc2s4IF9fVSwgdm9pZCBjb25zdCAqX19QKSB7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfZXhwYW5kbG9hZHNpMTI4X21hc2sgKChfX3Y0c2kgKikgX19QLAorICAgICAgICAgICAgICAgKF9fdjRzaSkKKyAgICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAgICAgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2V4cGFuZGxvYWR1X2VwaTMyIChfX20yNTZpIF9fVywgX19tbWFzazggX19VLAorICAgICAgICAgICAgIHZvaWQgY29uc3QgKl9fUCkgeworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX2V4cGFuZGxvYWRzaTI1Nl9tYXNrICgoX192OHNpICopIF9fUCwKKyAgICAgICAgICAgICAgKF9fdjhzaSkgX19XLAorICAgICAgICAgICAgICAoX19tbWFzazgpCisgICAgICAgICAgICAgIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfZXhwYW5kbG9hZHVfZXBpMzIgKF9fbW1hc2s4IF9fVSwgdm9pZCBjb25zdCAqX19QKSB7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfZXhwYW5kbG9hZHNpMjU2X21hc2sgKChfX3Y4c2kgKikgX19QLAorICAgICAgICAgICAgICAgKF9fdjhzaSkKKyAgICAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2ICgpLAorICAgICAgICAgICAgICAgKF9fbW1hc2s4KQorICAgICAgICAgICAgICAgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfZXhwYW5kX3BzIChfX20xMjggX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOCBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2V4cGFuZHNmMTI4X21hc2sgKChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3Y0c2YpIF9fVywKKyAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2V4cGFuZF9wcyAoX19tbWFzazggX19VLCBfX20xMjggX19BKSB7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9leHBhbmRzZjEyOF9tYXNrICgoX192NHNmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjRzZikKKyAgICAgICAgICAgICAgICBfbW1fc2V0emVyb19wcyAoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2V4cGFuZF9wcyAoX19tMjU2IF9fVywgX19tbWFzazggX19VLCBfX20yNTYgX19BKSB7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9leHBhbmRzZjI1Nl9tYXNrICgoX192OHNmKSBfX0EsCisgICAgICAgICAgICAgICAoX192OHNmKSBfX1csCisgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9leHBhbmRfcHMgKF9fbW1hc2s4IF9fVSwgX19tMjU2IF9fQSkgeworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfZXhwYW5kc2YyNTZfbWFzayAoKF9fdjhzZikgX19BLAorICAgICAgICAgICAgICAgIChfX3Y4c2YpCisgICAgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fcHMgKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfZXhwYW5kX2VwaTMyIChfX20xMjhpIF9fVywgX19tbWFzazggX19VLCBfX20xMjhpIF9fQSkgeworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2V4cGFuZHNpMTI4X21hc2sgKChfX3Y0c2kpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192NHNpKSBfX1csCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2V4cGFuZF9lcGkzMiAoX19tbWFzazggX19VLCBfX20xMjhpIF9fQSkgeworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2V4cGFuZHNpMTI4X21hc2sgKChfX3Y0c2kpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjRzaSkKKyAgICAgICAgICAgICAgICAgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2V4cGFuZF9lcGkzMiAoX19tMjU2aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMjU2aSBfX0EpIHsKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9leHBhbmRzaTI1Nl9tYXNrICgoX192OHNpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjhzaSkgX19XLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9leHBhbmRfZXBpMzIgKF9fbW1hc2s4IF9fVSwgX19tMjU2aSBfX0EpIHsKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9leHBhbmRzaTI1Nl9tYXNrICgoX192OHNpKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3Y4c2kpCisgICAgICAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2ICgpLAorICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fZ2V0ZXhwX3BkIChfX20xMjhkIF9fQSkgeworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX2dldGV4cHBkMTI4X21hc2sgKChfX3YyZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192MmRmKQorICAgICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3BkICgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfZ2V0ZXhwX3BkIChfX20xMjhkIF9fVywgX19tbWFzazggX19VLCBfX20xMjhkIF9fQSkgeworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX2dldGV4cHBkMTI4X21hc2sgKChfX3YyZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192MmRmKSBfX1csCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2dldGV4cF9wZCAoX19tbWFzazggX19VLCBfX20xMjhkIF9fQSkgeworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX2dldGV4cHBkMTI4X21hc2sgKChfX3YyZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192MmRmKQorICAgICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3BkICgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9nZXRleHBfcGQgKF9fbTI1NmQgX19BKSB7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfZ2V0ZXhwcGQyNTZfbWFzayAoKF9fdjRkZikgX19BLAorICAgICAgICAgICAgICAgIChfX3Y0ZGYpCisgICAgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fcGQgKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19nZXRleHBfcGQgKF9fbTI1NmQgX19XLCBfX21tYXNrOCBfX1UsIF9fbTI1NmQgX19BKSB7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfZ2V0ZXhwcGQyNTZfbWFzayAoKF9fdjRkZikgX19BLAorICAgICAgICAgICAgICAgIChfX3Y0ZGYpIF9fVywKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfZ2V0ZXhwX3BkIChfX21tYXNrOCBfX1UsIF9fbTI1NmQgX19BKSB7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfZ2V0ZXhwcGQyNTZfbWFzayAoKF9fdjRkZikgX19BLAorICAgICAgICAgICAgICAgIChfX3Y0ZGYpCisgICAgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fcGQgKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fZ2V0ZXhwX3BzIChfX20xMjggX19BKSB7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9nZXRleHBwczEyOF9tYXNrICgoX192NHNmKSBfX0EsCisgICAgICAgICAgICAgICAoX192NHNmKQorICAgICAgICAgICAgICAgX21tX3NldHplcm9fcHMgKCksCisgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfZ2V0ZXhwX3BzIChfX20xMjggX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOCBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2dldGV4cHBzMTI4X21hc2sgKChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3Y0c2YpIF9fVywKKyAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2dldGV4cF9wcyAoX19tbWFzazggX19VLCBfX20xMjggX19BKSB7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9nZXRleHBwczEyOF9tYXNrICgoX192NHNmKSBfX0EsCisgICAgICAgICAgICAgICAoX192NHNmKQorICAgICAgICAgICAgICAgX21tX3NldHplcm9fcHMgKCksCisgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9nZXRleHBfcHMgKF9fbTI1NiBfX0EpIHsKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX2dldGV4cHBzMjU2X21hc2sgKChfX3Y4c2YpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3Y4c2YpCisgICAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19wcyAoKSwKKyAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19nZXRleHBfcHMgKF9fbTI1NiBfX1csIF9fbW1hc2s4IF9fVSwgX19tMjU2IF9fQSkgeworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfZ2V0ZXhwcHMyNTZfbWFzayAoKF9fdjhzZikgX19BLAorICAgICAgICAgICAgICAgKF9fdjhzZikgX19XLAorICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfZ2V0ZXhwX3BzIChfX21tYXNrOCBfX1UsIF9fbTI1NiBfX0EpIHsKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX2dldGV4cHBzMjU2X21hc2sgKChfX3Y4c2YpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3Y4c2YpCisgICAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19wcyAoKSwKKyAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX21heF9wZCAoX19tMTI4ZCBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKSB7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfbWF4cGRfbWFzayAoKF9fdjJkZikgX19BLAorICAgICAgICAgICAgICAgIChfX3YyZGYpIF9fQiwKKyAgICAgICAgICAgICAgICAoX192MmRmKSBfX1csCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X21heF9wZCAoX19tbWFzazggX19VLCBfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9tYXhwZF9tYXNrICgoX192MmRmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjJkZikgX19CLAorICAgICAgICAgICAgICAgIChfX3YyZGYpCisgICAgICAgICAgICAgICAgX21tX3NldHplcm9fcGQgKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfbWF4X3BkIChfX20yNTZkIF9fVywgX19tbWFzazggX19VLCBfX20yNTZkIF9fQSwKKyAgICAgICAgX19tMjU2ZCBfX0IpIHsKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9tYXhwZDI1Nl9tYXNrICgoX192NGRmKSBfX0EsCisgICAgICAgICAgICAgKF9fdjRkZikgX19CLAorICAgICAgICAgICAgIChfX3Y0ZGYpIF9fVywKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfbWF4X3BkIChfX21tYXNrOCBfX1UsIF9fbTI1NmQgX19BLCBfX20yNTZkIF9fQikgeworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX21heHBkMjU2X21hc2sgKChfX3Y0ZGYpIF9fQSwKKyAgICAgICAgICAgICAoX192NGRmKSBfX0IsCisgICAgICAgICAgICAgKF9fdjRkZikKKyAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19wZCAoKSwKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX21heF9wcyAoX19tMTI4IF9fVywgX19tbWFzazggX19VLCBfX20xMjggX19BLCBfX20xMjggX19CKSB7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9tYXhwc19tYXNrICgoX192NHNmKSBfX0EsCisgICAgICAgICAgICAgICAoX192NHNmKSBfX0IsCisgICAgICAgICAgICAgICAoX192NHNmKSBfX1csCisgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9tYXhfcHMgKF9fbW1hc2s4IF9fVSwgX19tMTI4IF9fQSwgX19tMTI4IF9fQikgeworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfbWF4cHNfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgKF9fdjRzZikgX19CLAorICAgICAgICAgICAgICAgKF9fdjRzZikKKyAgICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3BzICgpLAorICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19tYXhfcHMgKF9fbTI1NiBfX1csIF9fbW1hc2s4IF9fVSwgX19tMjU2IF9fQSwgX19tMjU2IF9fQikgeworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfbWF4cHMyNTZfbWFzayAoKF9fdjhzZikgX19BLAorICAgICAgICAgICAgKF9fdjhzZikgX19CLAorICAgICAgICAgICAgKF9fdjhzZikgX19XLAorICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfbWF4X3BzIChfX21tYXNrOCBfX1UsIF9fbTI1NiBfX0EsIF9fbTI1NiBfX0IpIHsKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX21heHBzMjU2X21hc2sgKChfX3Y4c2YpIF9fQSwKKyAgICAgICAgICAgIChfX3Y4c2YpIF9fQiwKKyAgICAgICAgICAgIChfX3Y4c2YpCisgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19wcyAoKSwKKyAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX21pbl9wZCAoX19tMTI4ZCBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKSB7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfbWlucGRfbWFzayAoKF9fdjJkZikgX19BLAorICAgICAgICAgICAgICAgIChfX3YyZGYpIF9fQiwKKyAgICAgICAgICAgICAgICAoX192MmRmKSBfX1csCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X21pbl9wZCAoX19tbWFzazggX19VLCBfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9taW5wZF9tYXNrICgoX192MmRmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjJkZikgX19CLAorICAgICAgICAgICAgICAgIChfX3YyZGYpCisgICAgICAgICAgICAgICAgX21tX3NldHplcm9fcGQgKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfbWluX3BkIChfX20yNTZkIF9fVywgX19tbWFzazggX19VLCBfX20yNTZkIF9fQSwKKyAgICAgICAgX19tMjU2ZCBfX0IpIHsKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9taW5wZDI1Nl9tYXNrICgoX192NGRmKSBfX0EsCisgICAgICAgICAgICAgKF9fdjRkZikgX19CLAorICAgICAgICAgICAgIChfX3Y0ZGYpIF9fVywKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfbWluX3BkIChfX21tYXNrOCBfX1UsIF9fbTI1NmQgX19BLCBfX20yNTZkIF9fQikgeworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX21pbnBkMjU2X21hc2sgKChfX3Y0ZGYpIF9fQSwKKyAgICAgICAgICAgICAoX192NGRmKSBfX0IsCisgICAgICAgICAgICAgKF9fdjRkZikKKyAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19wZCAoKSwKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX21pbl9wcyAoX19tMTI4IF9fVywgX19tbWFzazggX19VLCBfX20xMjggX19BLCBfX20xMjggX19CKSB7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9taW5wc19tYXNrICgoX192NHNmKSBfX0EsCisgICAgICAgICAgICAgICAoX192NHNmKSBfX0IsCisgICAgICAgICAgICAgICAoX192NHNmKSBfX1csCisgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9taW5fcHMgKF9fbW1hc2s4IF9fVSwgX19tMTI4IF9fQSwgX19tMTI4IF9fQikgeworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfbWlucHNfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgKF9fdjRzZikgX19CLAorICAgICAgICAgICAgICAgKF9fdjRzZikKKyAgICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3BzICgpLAorICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19taW5fcHMgKF9fbTI1NiBfX1csIF9fbW1hc2s4IF9fVSwgX19tMjU2IF9fQSwgX19tMjU2IF9fQikgeworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfbWlucHMyNTZfbWFzayAoKF9fdjhzZikgX19BLAorICAgICAgICAgICAgKF9fdjhzZikgX19CLAorICAgICAgICAgICAgKF9fdjhzZikgX19XLAorICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfbWluX3BzIChfX21tYXNrOCBfX1UsIF9fbTI1NiBfX0EsIF9fbTI1NiBfX0IpIHsKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX21pbnBzMjU2X21hc2sgKChfX3Y4c2YpIF9fQSwKKyAgICAgICAgICAgIChfX3Y4c2YpIF9fQiwKKyAgICAgICAgICAgIChfX3Y4c2YpCisgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19wcyAoKSwKKyAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX211bF9wZCAoX19tMTI4ZCBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKSB7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfbXVscGRfbWFzayAoKF9fdjJkZikgX19BLAorICAgICAgICAgICAgICAgIChfX3YyZGYpIF9fQiwKKyAgICAgICAgICAgICAgICAoX192MmRmKSBfX1csCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X211bF9wZCAoX19tbWFzazggX19VLCBfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9tdWxwZF9tYXNrICgoX192MmRmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjJkZikgX19CLAorICAgICAgICAgICAgICAgIChfX3YyZGYpCisgICAgICAgICAgICAgICAgX21tX3NldHplcm9fcGQgKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfbXVsX3BkIChfX20yNTZkIF9fVywgX19tbWFzazggX19VLCBfX20yNTZkIF9fQSwKKyAgICAgICAgX19tMjU2ZCBfX0IpIHsKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9tdWxwZDI1Nl9tYXNrICgoX192NGRmKSBfX0EsCisgICAgICAgICAgICAgKF9fdjRkZikgX19CLAorICAgICAgICAgICAgIChfX3Y0ZGYpIF9fVywKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfbXVsX3BkIChfX21tYXNrOCBfX1UsIF9fbTI1NmQgX19BLCBfX20yNTZkIF9fQikgeworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX211bHBkMjU2X21hc2sgKChfX3Y0ZGYpIF9fQSwKKyAgICAgICAgICAgICAoX192NGRmKSBfX0IsCisgICAgICAgICAgICAgKF9fdjRkZikKKyAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19wZCAoKSwKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX211bF9wcyAoX19tMTI4IF9fVywgX19tbWFzazggX19VLCBfX20xMjggX19BLCBfX20xMjggX19CKSB7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9tdWxwc19tYXNrICgoX192NHNmKSBfX0EsCisgICAgICAgICAgICAgICAoX192NHNmKSBfX0IsCisgICAgICAgICAgICAgICAoX192NHNmKSBfX1csCisgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9tdWxfcHMgKF9fbW1hc2s4IF9fVSwgX19tMTI4IF9fQSwgX19tMTI4IF9fQikgeworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfbXVscHNfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgKF9fdjRzZikgX19CLAorICAgICAgICAgICAgICAgKF9fdjRzZikKKyAgICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3BzICgpLAorICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19tdWxfcHMgKF9fbTI1NiBfX1csIF9fbW1hc2s4IF9fVSwgX19tMjU2IF9fQSwgX19tMjU2IF9fQikgeworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfbXVscHMyNTZfbWFzayAoKF9fdjhzZikgX19BLAorICAgICAgICAgICAgKF9fdjhzZikgX19CLAorICAgICAgICAgICAgKF9fdjhzZikgX19XLAorICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfbXVsX3BzIChfX21tYXNrOCBfX1UsIF9fbTI1NiBfX0EsIF9fbTI1NiBfX0IpIHsKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX211bHBzMjU2X21hc2sgKChfX3Y4c2YpIF9fQSwKKyAgICAgICAgICAgIChfX3Y4c2YpIF9fQiwKKyAgICAgICAgICAgIChfX3Y4c2YpCisgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19wcyAoKSwKKyAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2Fic19lcGkzMiAoX19tMTI4aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wYWJzZDEyOF9tYXNrICgoX192NHNpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjRzaSkgX19XLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9hYnNfZXBpMzIgKF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wYWJzZDEyOF9tYXNrICgoX192NHNpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjRzaSkKKyAgICAgICAgICAgICBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19hYnNfZXBpMzIgKF9fbTI1NmkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTI1NmkgX19BKSB7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcGFic2QyNTZfbWFzayAoKF9fdjhzaSkgX19BLAorICAgICAgICAgICAgIChfX3Y4c2kpIF9fVywKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfYWJzX2VwaTMyIChfX21tYXNrOCBfX1UsIF9fbTI1NmkgX19BKSB7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcGFic2QyNTZfbWFzayAoKF9fdjhzaSkgX19BLAorICAgICAgICAgICAgIChfX3Y4c2kpCisgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2Fic19lcGk2NCAoX19tMTI4aSBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wYWJzcTEyOF9tYXNrICgoX192MmRpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjJkaSkKKyAgICAgICAgICAgICBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2Fic19lcGk2NCAoX19tMTI4aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wYWJzcTEyOF9tYXNrICgoX192MmRpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjJkaSkgX19XLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9hYnNfZXBpNjQgKF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wYWJzcTEyOF9tYXNrICgoX192MmRpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjJkaSkKKyAgICAgICAgICAgICBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfYWJzX2VwaTY0IChfX20yNTZpIF9fQSkgeworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BhYnNxMjU2X21hc2sgKChfX3Y0ZGkpIF9fQSwKKyAgICAgICAgICAgICAoX192NGRpKQorICAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2ICgpLAorICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfYWJzX2VwaTY0IChfX20yNTZpIF9fVywgX19tbWFzazggX19VLCBfX20yNTZpIF9fQSkgeworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BhYnNxMjU2X21hc2sgKChfX3Y0ZGkpIF9fQSwKKyAgICAgICAgICAgICAoX192NGRpKSBfX1csCisgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X2Fic19lcGk2NCAoX19tbWFzazggX19VLCBfX20yNTZpIF9fQSkgeworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BhYnNxMjU2X21hc2sgKChfX3Y0ZGkpIF9fQSwKKyAgICAgICAgICAgICAoX192NGRpKQorICAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2ICgpLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9tYXhfZXBpMzIgKF9fbW1hc2s4IF9fTSwgX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKSB7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1heHNkMTI4X21hc2sgKChfX3Y0c2kpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjRzaSkgX19CLAorICAgICAgICAgICAgICAoX192NHNpKQorICAgICAgICAgICAgICBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX21heF9lcGkzMiAoX19tMTI4aSBfX1csIF9fbW1hc2s4IF9fTSwgX19tMTI4aSBfX0EsCisgICAgICAgIF9fbTEyOGkgX19CKSB7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1heHNkMTI4X21hc2sgKChfX3Y0c2kpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjRzaSkgX19CLAorICAgICAgICAgICAgICAoX192NHNpKSBfX1csIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfbWF4X2VwaTMyIChfX21tYXNrOCBfX00sIF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikgeworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BtYXhzZDI1Nl9tYXNrICgoX192OHNpKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y4c2kpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjhzaSkKKyAgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19tYXhfZXBpMzIgKF9fbTI1NmkgX19XLCBfX21tYXNrOCBfX00sIF9fbTI1NmkgX19BLAorICAgICAgICAgICBfX20yNTZpIF9fQikgeworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BtYXhzZDI1Nl9tYXNrICgoX192OHNpKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y4c2kpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjhzaSkgX19XLCBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X21heF9lcGk2NCAoX19tbWFzazggX19NLCBfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbWF4c3ExMjhfbWFzayAoKF9fdjJkaSkgX19BLAorICAgICAgICAgICAgICAoX192MmRpKSBfX0IsCisgICAgICAgICAgICAgIChfX3YyZGkpCisgICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfbWF4X2VwaTY0IChfX20xMjhpIF9fVywgX19tbWFzazggX19NLCBfX20xMjhpIF9fQSwKKyAgICAgICAgX19tMTI4aSBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbWF4c3ExMjhfbWFzayAoKF9fdjJkaSkgX19BLAorICAgICAgICAgICAgICAoX192MmRpKSBfX0IsCisgICAgICAgICAgICAgIChfX3YyZGkpIF9fVywgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXhfZXBpNjQgKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikgeworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BtYXhzcTEyOF9tYXNrICgoX192MmRpKSBfX0EsCisgICAgICAgICAgICAgIChfX3YyZGkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjJkaSkKKyAgICAgICAgICAgICAgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X21heF9lcGk2NCAoX19tbWFzazggX19NLCBfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpIHsKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wbWF4c3EyNTZfbWFzayAoKF9fdjRkaSkgX19BLAorICAgICAgICAgICAgICAoX192NGRpKSBfX0IsCisgICAgICAgICAgICAgIChfX3Y0ZGkpCisgICAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2ICgpLAorICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfbWF4X2VwaTY0IChfX20yNTZpIF9fVywgX19tbWFzazggX19NLCBfX20yNTZpIF9fQSwKKyAgICAgICAgICAgX19tMjU2aSBfX0IpIHsKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wbWF4c3EyNTZfbWFzayAoKF9fdjRkaSkgX19BLAorICAgICAgICAgICAgICAoX192NGRpKSBfX0IsCisgICAgICAgICAgICAgIChfX3Y0ZGkpIF9fVywgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXhfZXBpNjQgKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikgeworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BtYXhzcTI1Nl9tYXNrICgoX192NGRpKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y0ZGkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjRkaSkKKyAgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X21heF9lcHUzMiAoX19tbWFzazggX19NLCBfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbWF4dWQxMjhfbWFzayAoKF9fdjRzaSkgX19BLAorICAgICAgICAgICAgICAoX192NHNpKSBfX0IsCisgICAgICAgICAgICAgIChfX3Y0c2kpCisgICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfbWF4X2VwdTMyIChfX20xMjhpIF9fVywgX19tbWFzazggX19NLCBfX20xMjhpIF9fQSwKKyAgICAgICAgX19tMTI4aSBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbWF4dWQxMjhfbWFzayAoKF9fdjRzaSkgX19BLAorICAgICAgICAgICAgICAoX192NHNpKSBfX0IsCisgICAgICAgICAgICAgIChfX3Y0c2kpIF9fVywgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9tYXhfZXB1MzIgKF9fbW1hc2s4IF9fTSwgX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKSB7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG1heHVkMjU2X21hc2sgKChfX3Y4c2kpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjhzaSkgX19CLAorICAgICAgICAgICAgICAoX192OHNpKQorICAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX21heF9lcHUzMiAoX19tMjU2aSBfX1csIF9fbW1hc2s4IF9fTSwgX19tMjU2aSBfX0EsCisgICAgICAgICAgIF9fbTI1NmkgX19CKSB7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG1heHVkMjU2X21hc2sgKChfX3Y4c2kpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjhzaSkgX19CLAorICAgICAgICAgICAgICAoX192OHNpKSBfX1csIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfbWF4X2VwdTY0IChfX21tYXNrOCBfX00sIF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikgeworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BtYXh1cTEyOF9tYXNrICgoX192MmRpKSBfX0EsCisgICAgICAgICAgICAgIChfX3YyZGkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjJkaSkKKyAgICAgICAgICAgICAgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWF4X2VwdTY0IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbWF4dXExMjhfbWFzayAoKF9fdjJkaSkgX19BLAorICAgICAgICAgICAgICAoX192MmRpKSBfX0IsCisgICAgICAgICAgICAgIChfX3YyZGkpCisgICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX21heF9lcHU2NCAoX19tMTI4aSBfX1csIF9fbW1hc2s4IF9fTSwgX19tMTI4aSBfX0EsCisgICAgICAgIF9fbTEyOGkgX19CKSB7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1heHVxMTI4X21hc2sgKChfX3YyZGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjJkaSkgX19CLAorICAgICAgICAgICAgICAoX192MmRpKSBfX1csIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfbWF4X2VwdTY0IChfX21tYXNrOCBfX00sIF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikgeworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BtYXh1cTI1Nl9tYXNrICgoX192NGRpKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y0ZGkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjRkaSkKKyAgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWF4X2VwdTY0IChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpIHsKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wbWF4dXEyNTZfbWFzayAoKF9fdjRkaSkgX19BLAorICAgICAgICAgICAgICAoX192NGRpKSBfX0IsCisgICAgICAgICAgICAgIChfX3Y0ZGkpCisgICAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2ICgpLAorICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX21heF9lcHU2NCAoX19tMjU2aSBfX1csIF9fbW1hc2s4IF9fTSwgX19tMjU2aSBfX0EsCisgICAgICAgICAgIF9fbTI1NmkgX19CKSB7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG1heHVxMjU2X21hc2sgKChfX3Y0ZGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjRkaSkgX19CLAorICAgICAgICAgICAgICAoX192NGRpKSBfX1csIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfbWluX2VwaTMyIChfX21tYXNrOCBfX00sIF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikgeworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BtaW5zZDEyOF9tYXNrICgoX192NHNpKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y0c2kpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjRzaSkKKyAgICAgICAgICAgICAgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19taW5fZXBpMzIgKF9fbTEyOGkgX19XLCBfX21tYXNrOCBfX00sIF9fbTEyOGkgX19BLAorICAgICAgICBfX20xMjhpIF9fQikgeworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BtaW5zZDEyOF9tYXNrICgoX192NHNpKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y0c2kpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjRzaSkgX19XLCBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X21pbl9lcGkzMiAoX19tbWFzazggX19NLCBfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpIHsKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wbWluc2QyNTZfbWFzayAoKF9fdjhzaSkgX19BLAorICAgICAgICAgICAgICAoX192OHNpKSBfX0IsCisgICAgICAgICAgICAgIChfX3Y4c2kpCisgICAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2ICgpLAorICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfbWluX2VwaTMyIChfX20yNTZpIF9fVywgX19tbWFzazggX19NLCBfX20yNTZpIF9fQSwKKyAgICAgICAgICAgX19tMjU2aSBfX0IpIHsKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wbWluc2QyNTZfbWFzayAoKF9fdjhzaSkgX19BLAorICAgICAgICAgICAgICAoX192OHNpKSBfX0IsCisgICAgICAgICAgICAgIChfX3Y4c2kpIF9fVywgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9taW5fZXBpNjQgKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikgeworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BtaW5zcTEyOF9tYXNrICgoX192MmRpKSBfX0EsCisgICAgICAgICAgICAgIChfX3YyZGkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjJkaSkKKyAgICAgICAgICAgICAgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfbWluX2VwaTY0IChfX20xMjhpIF9fVywgX19tbWFzazggX19NLCBfX20xMjhpIF9fQSwKKyAgICAgICAgX19tMTI4aSBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbWluc3ExMjhfbWFzayAoKF9fdjJkaSkgX19BLAorICAgICAgICAgICAgICAoX192MmRpKSBfX0IsCisgICAgICAgICAgICAgIChfX3YyZGkpIF9fVywgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9taW5fZXBpNjQgKF9fbW1hc2s4IF9fTSwgX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKSB7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1pbnNxMTI4X21hc2sgKChfX3YyZGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjJkaSkgX19CLAorICAgICAgICAgICAgICAoX192MmRpKQorICAgICAgICAgICAgICBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9taW5fZXBpNjQgKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikgeworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BtaW5zcTI1Nl9tYXNrICgoX192NGRpKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y0ZGkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjRkaSkKKyAgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfbWluX2VwaTY0IChfX20yNTZpIF9fVywgX19tbWFzazggX19NLCBfX20yNTZpIF9fQSwKKyAgICAgICAgICAgX19tMjU2aSBfX0IpIHsKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wbWluc3EyNTZfbWFzayAoKF9fdjRkaSkgX19BLAorICAgICAgICAgICAgICAoX192NGRpKSBfX0IsCisgICAgICAgICAgICAgIChfX3Y0ZGkpIF9fVywgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9taW5fZXBpNjQgKF9fbW1hc2s4IF9fTSwgX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKSB7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG1pbnNxMjU2X21hc2sgKChfX3Y0ZGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjRkaSkgX19CLAorICAgICAgICAgICAgICAoX192NGRpKQorICAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9taW5fZXB1MzIgKF9fbW1hc2s4IF9fTSwgX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKSB7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1pbnVkMTI4X21hc2sgKChfX3Y0c2kpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjRzaSkgX19CLAorICAgICAgICAgICAgICAoX192NHNpKQorICAgICAgICAgICAgICBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX21pbl9lcHUzMiAoX19tMTI4aSBfX1csIF9fbW1hc2s4IF9fTSwgX19tMTI4aSBfX0EsCisgICAgICAgIF9fbTEyOGkgX19CKSB7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1pbnVkMTI4X21hc2sgKChfX3Y0c2kpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjRzaSkgX19CLAorICAgICAgICAgICAgICAoX192NHNpKSBfX1csIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfbWluX2VwdTMyIChfX21tYXNrOCBfX00sIF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikgeworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BtaW51ZDI1Nl9tYXNrICgoX192OHNpKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y4c2kpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjhzaSkKKyAgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19taW5fZXB1MzIgKF9fbTI1NmkgX19XLCBfX21tYXNrOCBfX00sIF9fbTI1NmkgX19BLAorICAgICAgICAgICBfX20yNTZpIF9fQikgeworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BtaW51ZDI1Nl9tYXNrICgoX192OHNpKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y4c2kpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjhzaSkgX19XLCBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21pbl9lcHU2NCAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKSB7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1pbnVxMTI4X21hc2sgKChfX3YyZGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjJkaSkgX19CLAorICAgICAgICAgICAgICAoX192MmRpKQorICAgICAgICAgICAgICBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19taW5fZXB1NjQgKF9fbTEyOGkgX19XLCBfX21tYXNrOCBfX00sIF9fbTEyOGkgX19BLAorICAgICAgICBfX20xMjhpIF9fQikgeworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BtaW51cTEyOF9tYXNrICgoX192MmRpKSBfX0EsCisgICAgICAgICAgICAgIChfX3YyZGkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjJkaSkgX19XLCBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X21pbl9lcHU2NCAoX19tbWFzazggX19NLCBfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbWludXExMjhfbWFzayAoKF9fdjJkaSkgX19BLAorICAgICAgICAgICAgICAoX192MmRpKSBfX0IsCisgICAgICAgICAgICAgIChfX3YyZGkpCisgICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21pbl9lcHU2NCAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKSB7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG1pbnVxMjU2X21hc2sgKChfX3Y0ZGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjRkaSkgX19CLAorICAgICAgICAgICAgICAoX192NGRpKQorICAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19taW5fZXB1NjQgKF9fbTI1NmkgX19XLCBfX21tYXNrOCBfX00sIF9fbTI1NmkgX19BLAorICAgICAgICAgICBfX20yNTZpIF9fQikgeworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BtaW51cTI1Nl9tYXNrICgoX192NGRpKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y0ZGkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjRkaSkgX19XLCBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X21pbl9lcHU2NCAoX19tbWFzazggX19NLCBfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpIHsKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wbWludXEyNTZfbWFzayAoKF9fdjRkaSkgX19BLAorICAgICAgICAgICAgICAoX192NGRpKSBfX0IsCisgICAgICAgICAgICAgIChfX3Y0ZGkpCisgICAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2ICgpLAorICAgICAgICAgICAgICBfX00pOworfQorCisjZGVmaW5lIF9tbV9yb3VuZHNjYWxlX3BkKEEsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX3JuZHNjYWxlcGRfMTI4X21hc2soKF9fdjJkZikoX19tMTI4ZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZilfbW1fc2V0emVyb19wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsgfSkKKworCisjZGVmaW5lIF9tbV9tYXNrX3JvdW5kc2NhbGVfcGQoVywgVSwgQSwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGQpX19idWlsdGluX2lhMzJfcm5kc2NhbGVwZF8xMjhfbWFzaygoX192MmRmKShfX20xMjhkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSkpOyB9KQorCisKKyNkZWZpbmUgX21tX21hc2t6X3JvdW5kc2NhbGVfcGQoVSwgQSwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGQpX19idWlsdGluX2lhMzJfcm5kc2NhbGVwZF8xMjhfbWFzaygoX192MmRmKShfX20xMjhkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKV9tbV9zZXR6ZXJvX3BkKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworCisjZGVmaW5lIF9tbTI1Nl9yb3VuZHNjYWxlX3BkKEEsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTZkKV9fYnVpbHRpbl9pYTMyX3JuZHNjYWxlcGRfMjU2X21hc2soKF9fdjRkZikoX19tMjU2ZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkZilfbW0yNTZfc2V0emVyb19wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsgfSkKKworCisjZGVmaW5lIF9tbTI1Nl9tYXNrX3JvdW5kc2NhbGVfcGQoVywgVSwgQSwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmQpX19idWlsdGluX2lhMzJfcm5kc2NhbGVwZF8yNTZfbWFzaygoX192NGRmKShfX20yNTZkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRmKShfX20yNTZkKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSkpOyB9KQorCisKKyNkZWZpbmUgX21tMjU2X21hc2t6X3JvdW5kc2NhbGVfcGQoVSwgQSwgaW1tKSAgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTZkKV9fYnVpbHRpbl9pYTMyX3JuZHNjYWxlcGRfMjU2X21hc2soKF9fdjRkZikoX19tMjU2ZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkZilfbW0yNTZfc2V0emVyb19wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tX3JvdW5kc2NhbGVfcHMoQSwgaW1tKSAgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfcm5kc2NhbGVwc18xMjhfbWFzaygoX192NHNmKShfX20xMjgpKEEpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKV9tbV9zZXR6ZXJvX3BzKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSk7IH0pCisKKworI2RlZmluZSBfbW1fbWFza19yb3VuZHNjYWxlX3BzKFcsIFUsIEEsIGltbSkgIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX3JuZHNjYWxlcHNfMTI4X21hc2soKF9fdjRzZikoX19tMTI4KShBKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKworI2RlZmluZSBfbW1fbWFza3pfcm91bmRzY2FsZV9wcyhVLCBBLCBpbW0pICBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOClfX2J1aWx0aW5faWEzMl9ybmRzY2FsZXBzXzEyOF9tYXNrKChfX3Y0c2YpKF9fbTEyOCkoQSksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpX21tX3NldHplcm9fcHMoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X3JvdW5kc2NhbGVfcHMoQSwgaW1tKSAgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTYpX19idWlsdGluX2lhMzJfcm5kc2NhbGVwc18yNTZfbWFzaygoX192OHNmKShfX20yNTYpKEEpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNmKV9tbTI1Nl9zZXR6ZXJvX3BzKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21hc2tfcm91bmRzY2FsZV9wcyhXLCBVLCBBLCBpbW0pICBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NilfX2J1aWx0aW5faWEzMl9ybmRzY2FsZXBzXzI1Nl9tYXNrKChfX3Y4c2YpKF9fbTI1NikoQSksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2YpKF9fbTI1NikoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSkpOyB9KQorCisKKyNkZWZpbmUgX21tMjU2X21hc2t6X3JvdW5kc2NhbGVfcHMoVSwgQSwgaW1tKSAgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTYpX19idWlsdGluX2lhMzJfcm5kc2NhbGVwc18yNTZfbWFzaygoX192OHNmKShfX20yNTYpKEEpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNmKV9tbTI1Nl9zZXR6ZXJvX3BzKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSkpOyB9KQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3NjYWxlZl9wZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKSB7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfc2NhbGVmcGQxMjhfbWFzayAoKF9fdjJkZikgX19BLAorICAgICAgICAgICAgICAgIChfX3YyZGYpIF9fQiwKKyAgICAgICAgICAgICAgICAoX192MmRmKQorICAgICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3BkICgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfc2NhbGVmX3BkIChfX20xMjhkIF9fVywgX19tbWFzazggX19VLCBfX20xMjhkIF9fQSwKKyAgICAgICAgX19tMTI4ZCBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9zY2FsZWZwZDEyOF9tYXNrICgoX192MmRmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjJkZikgX19CLAorICAgICAgICAgICAgICAgIChfX3YyZGYpIF9fVywKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfc2NhbGVmX3BkIChfX21tYXNrOCBfX1UsIF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikgeworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3NjYWxlZnBkMTI4X21hc2sgKChfX3YyZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192MmRmKSBfX0IsCisgICAgICAgICAgICAgICAgKF9fdjJkZikKKyAgICAgICAgICAgICAgICBfbW1fc2V0emVyb19wZCAoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfc2NhbGVmX3BkIChfX20yNTZkIF9fQSwgX19tMjU2ZCBfX0IpIHsKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9zY2FsZWZwZDI1Nl9tYXNrICgoX192NGRmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjRkZikgX19CLAorICAgICAgICAgICAgICAgIChfX3Y0ZGYpCisgICAgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fcGQgKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19zY2FsZWZfcGQgKF9fbTI1NmQgX19XLCBfX21tYXNrOCBfX1UsIF9fbTI1NmQgX19BLAorICAgICAgICAgICBfX20yNTZkIF9fQikgeworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX3NjYWxlZnBkMjU2X21hc2sgKChfX3Y0ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192NGRmKSBfX0IsCisgICAgICAgICAgICAgICAgKF9fdjRkZikgX19XLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9zY2FsZWZfcGQgKF9fbW1hc2s4IF9fVSwgX19tMjU2ZCBfX0EsIF9fbTI1NmQgX19CKSB7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfc2NhbGVmcGQyNTZfbWFzayAoKF9fdjRkZikgX19BLAorICAgICAgICAgICAgICAgIChfX3Y0ZGYpIF9fQiwKKyAgICAgICAgICAgICAgICAoX192NGRmKQorICAgICAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3BkICgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX3NjYWxlZl9wcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikgeworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfc2NhbGVmcHMxMjhfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgKF9fdjRzZikgX19CLAorICAgICAgICAgICAgICAgKF9fdjRzZikKKyAgICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3BzICgpLAorICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX3NjYWxlZl9wcyAoX19tMTI4IF9fVywgX19tbWFzazggX19VLCBfX20xMjggX19BLCBfX20xMjggX19CKSB7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9zY2FsZWZwczEyOF9tYXNrICgoX192NHNmKSBfX0EsCisgICAgICAgICAgICAgICAoX192NHNmKSBfX0IsCisgICAgICAgICAgICAgICAoX192NHNmKSBfX1csCisgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9zY2FsZWZfcHMgKF9fbW1hc2s4IF9fVSwgX19tMTI4IF9fQSwgX19tMTI4IF9fQikgeworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfc2NhbGVmcHMxMjhfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgKF9fdjRzZikgX19CLAorICAgICAgICAgICAgICAgKF9fdjRzZikKKyAgICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3BzICgpLAorICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfc2NhbGVmX3BzIChfX20yNTYgX19BLCBfX20yNTYgX19CKSB7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9zY2FsZWZwczI1Nl9tYXNrICgoX192OHNmKSBfX0EsCisgICAgICAgICAgICAgICAoX192OHNmKSBfX0IsCisgICAgICAgICAgICAgICAoX192OHNmKQorICAgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fcHMgKCksCisgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfc2NhbGVmX3BzIChfX20yNTYgX19XLCBfX21tYXNrOCBfX1UsIF9fbTI1NiBfX0EsCisgICAgICAgICAgIF9fbTI1NiBfX0IpIHsKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX3NjYWxlZnBzMjU2X21hc2sgKChfX3Y4c2YpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3Y4c2YpIF9fQiwKKyAgICAgICAgICAgICAgIChfX3Y4c2YpIF9fVywKKyAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X3NjYWxlZl9wcyAoX19tbWFzazggX19VLCBfX20yNTYgX19BLCBfX20yNTYgX19CKSB7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9zY2FsZWZwczI1Nl9tYXNrICgoX192OHNmKSBfX0EsCisgICAgICAgICAgICAgICAoX192OHNmKSBfX0IsCisgICAgICAgICAgICAgICAoX192OHNmKQorICAgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fcHMgKCksCisgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKKyNkZWZpbmUgX21tX2k2NHNjYXR0ZXJfcGQoYWRkciwgaW5kZXgsIHYxLCBzY2FsZSkgX19leHRlbnNpb25fXyAoeyBcCisgIF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJkaXYyZGYoKGRvdWJsZSAqKShhZGRyKSwgKF9fbW1hc2s4KS0xLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkaSkoX19tMTI4aSkoaW5kZXgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZikoX19tMTI4ZCkodjEpLCAoaW50KShzY2FsZSkpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrX2k2NHNjYXR0ZXJfcGQoYWRkciwgbWFzaywgaW5kZXgsIHYxLCBzY2FsZSkgX19leHRlbnNpb25fXyAoeyBcCisgIF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJkaXYyZGYoKGRvdWJsZSAqKShhZGRyKSwgKF9fbW1hc2s4KShtYXNrKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGkpKF9fbTEyOGkpKGluZGV4KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fbTEyOGQpKHYxKSwgKGludCkoc2NhbGUpKTsgfSkKKworI2RlZmluZSBfbW1faTY0c2NhdHRlcl9lcGk2NChhZGRyLCBpbmRleCwgdjEsIHNjYWxlKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgX19idWlsdGluX2lhMzJfc2NhdHRlcmRpdjJkaSgobG9uZyBsb25nICopKGFkZHIpLCAoX19tbWFzazgpLTEsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRpKShfX20xMjhpKShpbmRleCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRpKShfX20xMjhpKSh2MSksIChpbnQpKHNjYWxlKSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2tfaTY0c2NhdHRlcl9lcGk2NChhZGRyLCBtYXNrLCBpbmRleCwgdjEsIHNjYWxlKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgX19idWlsdGluX2lhMzJfc2NhdHRlcmRpdjJkaSgobG9uZyBsb25nICopKGFkZHIpLCAoX19tbWFzazgpKG1hc2spLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkaSkoX19tMTI4aSkoaW5kZXgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkaSkoX19tMTI4aSkodjEpLCAoaW50KShzY2FsZSkpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9pNjRzY2F0dGVyX3BkKGFkZHIsIGluZGV4LCB2MSwgc2NhbGUpIF9fZXh0ZW5zaW9uX18gKHsgXAorICBfX2J1aWx0aW5faWEzMl9zY2F0dGVyZGl2NGRmKChkb3VibGUgKikoYWRkciksIChfX21tYXNrOCktMSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGkpKF9fbTI1NmkpKGluZGV4KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGYpKF9fbTI1NmQpKHYxKSwgKGludCkoc2NhbGUpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfbWFza19pNjRzY2F0dGVyX3BkKGFkZHIsIG1hc2ssIGluZGV4LCB2MSwgc2NhbGUpIF9fZXh0ZW5zaW9uX18gKHsgXAorICBfX2J1aWx0aW5faWEzMl9zY2F0dGVyZGl2NGRmKChkb3VibGUgKikoYWRkciksIChfX21tYXNrOCkobWFzayksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRpKShfX20yNTZpKShpbmRleCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRmKShfX20yNTZkKSh2MSksIChpbnQpKHNjYWxlKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X2k2NHNjYXR0ZXJfZXBpNjQoYWRkciwgaW5kZXgsIHYxLCBzY2FsZSkgX19leHRlbnNpb25fXyAoeyBcCisgIF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJkaXY0ZGkoKGxvbmcgbG9uZyAqKShhZGRyKSwgKF9fbW1hc2s4KS0xLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkaSkoX19tMjU2aSkoaW5kZXgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkaSkoX19tMjU2aSkodjEpLCAoaW50KShzY2FsZSkpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9tYXNrX2k2NHNjYXR0ZXJfZXBpNjQoYWRkciwgbWFzaywgaW5kZXgsIHYxLCBzY2FsZSkgX19leHRlbnNpb25fXyAoeyBcCisgIF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJkaXY0ZGkoKGxvbmcgbG9uZyAqKShhZGRyKSwgKF9fbW1hc2s4KShtYXNrKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGkpKF9fbTI1NmkpKGluZGV4KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGkpKF9fbTI1NmkpKHYxKSwgKGludCkoc2NhbGUpKTsgfSkKKworI2RlZmluZSBfbW1faTY0c2NhdHRlcl9wcyhhZGRyLCBpbmRleCwgdjEsIHNjYWxlKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgX19idWlsdGluX2lhMzJfc2NhdHRlcmRpdjRzZigoZmxvYXQgKikoYWRkciksIChfX21tYXNrOCktMSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGkpKF9fbTEyOGkpKGluZGV4KSwgKF9fdjRzZikoX19tMTI4KSh2MSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShzY2FsZSkpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrX2k2NHNjYXR0ZXJfcHMoYWRkciwgbWFzaywgaW5kZXgsIHYxLCBzY2FsZSkgX19leHRlbnNpb25fXyAoeyBcCisgIF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJkaXY0c2YoKGZsb2F0ICopKGFkZHIpLCAoX19tbWFzazgpKG1hc2spLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkaSkoX19tMTI4aSkoaW5kZXgpLCAoX192NHNmKShfX20xMjgpKHYxKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKHNjYWxlKSk7IH0pCisKKyNkZWZpbmUgX21tX2k2NHNjYXR0ZXJfZXBpMzIoYWRkciwgaW5kZXgsIHYxLCBzY2FsZSkgX19leHRlbnNpb25fXyAoeyBcCisgIF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJkaXY0c2koKGludCAqKShhZGRyKSwgKF9fbW1hc2s4KS0xLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkaSkoX19tMTI4aSkoaW5kZXgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzaSkoX19tMTI4aSkodjEpLCAoaW50KShzY2FsZSkpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrX2k2NHNjYXR0ZXJfZXBpMzIoYWRkciwgbWFzaywgaW5kZXgsIHYxLCBzY2FsZSkgX19leHRlbnNpb25fXyAoeyBcCisgIF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJkaXY0c2koKGludCAqKShhZGRyKSwgKF9fbW1hc2s4KShtYXNrKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGkpKF9fbTEyOGkpKGluZGV4KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2kpKF9fbTEyOGkpKHYxKSwgKGludCkoc2NhbGUpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfaTY0c2NhdHRlcl9wcyhhZGRyLCBpbmRleCwgdjEsIHNjYWxlKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgX19idWlsdGluX2lhMzJfc2NhdHRlcmRpdjhzZigoZmxvYXQgKikoYWRkciksIChfX21tYXNrOCktMSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGkpKF9fbTI1NmkpKGluZGV4KSwgKF9fdjRzZikoX19tMTI4KSh2MSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShzY2FsZSkpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9tYXNrX2k2NHNjYXR0ZXJfcHMoYWRkciwgbWFzaywgaW5kZXgsIHYxLCBzY2FsZSkgX19leHRlbnNpb25fXyAoeyBcCisgIF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJkaXY4c2YoKGZsb2F0ICopKGFkZHIpLCAoX19tbWFzazgpKG1hc2spLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkaSkoX19tMjU2aSkoaW5kZXgpLCAoX192NHNmKShfX20xMjgpKHYxKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKHNjYWxlKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X2k2NHNjYXR0ZXJfZXBpMzIoYWRkciwgaW5kZXgsIHYxLCBzY2FsZSkgX19leHRlbnNpb25fXyAoeyBcCisgIF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJkaXY4c2koKGludCAqKShhZGRyKSwgKF9fbW1hc2s4KS0xLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkaSkoX19tMjU2aSkoaW5kZXgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzaSkoX19tMTI4aSkodjEpLCAoaW50KShzY2FsZSkpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9tYXNrX2k2NHNjYXR0ZXJfZXBpMzIoYWRkciwgbWFzaywgaW5kZXgsIHYxLCBzY2FsZSkgX19leHRlbnNpb25fXyAoeyAgXAorICBfX2J1aWx0aW5faWEzMl9zY2F0dGVyZGl2OHNpKChpbnQgKikoYWRkciksIChfX21tYXNrOCkobWFzayksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRpKShfX20yNTZpKShpbmRleCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNpKShfX20xMjhpKSh2MSksIChpbnQpKHNjYWxlKSk7IH0pCisKKyNkZWZpbmUgX21tX2kzMnNjYXR0ZXJfcGQoYWRkciwgaW5kZXgsIHYxLCBzY2FsZSkgX19leHRlbnNpb25fXyAoeyAgICAgIFwKKyAgX19idWlsdGluX2lhMzJfc2NhdHRlcnNpdjJkZigoZG91YmxlICopKGFkZHIpLCAoX19tbWFzazgpLTEsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNpKShfX20xMjhpKShpbmRleCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKSh2MSksIChpbnQpKHNjYWxlKSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2tfaTMyc2NhdHRlcl9wZChhZGRyLCBtYXNrLCBpbmRleCwgdjEsIHNjYWxlKSBfX2V4dGVuc2lvbl9fICh7ICAgICAgICBcCisgIF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJzaXYyZGYoKGRvdWJsZSAqKShhZGRyKSwgKF9fbW1hc2s4KShtYXNrKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2kpKF9fbTEyOGkpKGluZGV4KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fbTEyOGQpKHYxKSwgKGludCkoc2NhbGUpKTsgfSkKKworI2RlZmluZSBfbW1faTMyc2NhdHRlcl9lcGk2NChhZGRyLCBpbmRleCwgdjEsIHNjYWxlKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgX19idWlsdGluX2lhMzJfc2NhdHRlcnNpdjJkaSgobG9uZyBsb25nICopKGFkZHIpLCAoX19tbWFzazgpLTEsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNpKShfX20xMjhpKShpbmRleCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRpKShfX20xMjhpKSh2MSksIChpbnQpKHNjYWxlKSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2tfaTMyc2NhdHRlcl9lcGk2NChhZGRyLCBtYXNrLCBpbmRleCwgdjEsIHNjYWxlKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgX19idWlsdGluX2lhMzJfc2NhdHRlcnNpdjJkaSgobG9uZyBsb25nICopKGFkZHIpLCAoX19tbWFzazgpKG1hc2spLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzaSkoX19tMTI4aSkoaW5kZXgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkaSkoX19tMTI4aSkodjEpLCAoaW50KShzY2FsZSkpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9pMzJzY2F0dGVyX3BkKGFkZHIsIGluZGV4LCB2MSwgc2NhbGUpIF9fZXh0ZW5zaW9uX18gKHsgXAorICBfX2J1aWx0aW5faWEzMl9zY2F0dGVyc2l2NGRmKChkb3VibGUgKikoYWRkciksIChfX21tYXNrOCktMSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2kpKF9fbTEyOGkpKGluZGV4KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGYpKF9fbTI1NmQpKHYxKSwgKGludCkoc2NhbGUpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfbWFza19pMzJzY2F0dGVyX3BkKGFkZHIsIG1hc2ssIGluZGV4LCB2MSwgc2NhbGUpIF9fZXh0ZW5zaW9uX18gKHsgXAorICBfX2J1aWx0aW5faWEzMl9zY2F0dGVyc2l2NGRmKChkb3VibGUgKikoYWRkciksIChfX21tYXNrOCkobWFzayksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNpKShfX20xMjhpKShpbmRleCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRmKShfX20yNTZkKSh2MSksIChpbnQpKHNjYWxlKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X2kzMnNjYXR0ZXJfZXBpNjQoYWRkciwgaW5kZXgsIHYxLCBzY2FsZSkgX19leHRlbnNpb25fXyAoeyBcCisgIF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJzaXY0ZGkoKGxvbmcgbG9uZyAqKShhZGRyKSwgKF9fbW1hc2s4KS0xLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzaSkoX19tMTI4aSkoaW5kZXgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkaSkoX19tMjU2aSkodjEpLCAoaW50KShzY2FsZSkpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9tYXNrX2kzMnNjYXR0ZXJfZXBpNjQoYWRkciwgbWFzaywgaW5kZXgsIHYxLCBzY2FsZSkgX19leHRlbnNpb25fXyAoeyBcCisgIF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJzaXY0ZGkoKGxvbmcgbG9uZyAqKShhZGRyKSwgKF9fbW1hc2s4KShtYXNrKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2kpKF9fbTEyOGkpKGluZGV4KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGkpKF9fbTI1NmkpKHYxKSwgKGludCkoc2NhbGUpKTsgfSkKKworI2RlZmluZSBfbW1faTMyc2NhdHRlcl9wcyhhZGRyLCBpbmRleCwgdjEsIHNjYWxlKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgX19idWlsdGluX2lhMzJfc2NhdHRlcnNpdjRzZigoZmxvYXQgKikoYWRkciksIChfX21tYXNrOCktMSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2kpKF9fbTEyOGkpKGluZGV4KSwgKF9fdjRzZikoX19tMTI4KSh2MSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShzY2FsZSkpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrX2kzMnNjYXR0ZXJfcHMoYWRkciwgbWFzaywgaW5kZXgsIHYxLCBzY2FsZSkgX19leHRlbnNpb25fXyAoeyBcCisgIF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJzaXY0c2YoKGZsb2F0ICopKGFkZHIpLCAoX19tbWFzazgpKG1hc2spLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzaSkoX19tMTI4aSkoaW5kZXgpLCAoX192NHNmKShfX20xMjgpKHYxKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKHNjYWxlKSk7IH0pCisKKyNkZWZpbmUgX21tX2kzMnNjYXR0ZXJfZXBpMzIoYWRkciwgaW5kZXgsIHYxLCBzY2FsZSkgX19leHRlbnNpb25fXyAoeyBcCisgIF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJzaXY0c2koKGludCAqKShhZGRyKSwgKF9fbW1hc2s4KS0xLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzaSkoX19tMTI4aSkoaW5kZXgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzaSkoX19tMTI4aSkodjEpLCAoaW50KShzY2FsZSkpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrX2kzMnNjYXR0ZXJfZXBpMzIoYWRkciwgbWFzaywgaW5kZXgsIHYxLCBzY2FsZSkgX19leHRlbnNpb25fXyAoeyBcCisgIF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJzaXY0c2koKGludCAqKShhZGRyKSwgKF9fbW1hc2s4KShtYXNrKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2kpKF9fbTEyOGkpKGluZGV4KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2kpKF9fbTEyOGkpKHYxKSwgKGludCkoc2NhbGUpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfaTMyc2NhdHRlcl9wcyhhZGRyLCBpbmRleCwgdjEsIHNjYWxlKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgX19idWlsdGluX2lhMzJfc2NhdHRlcnNpdjhzZigoZmxvYXQgKikoYWRkciksIChfX21tYXNrOCktMSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2kpKF9fbTI1NmkpKGluZGV4KSwgKF9fdjhzZikoX19tMjU2KSh2MSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShzY2FsZSkpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9tYXNrX2kzMnNjYXR0ZXJfcHMoYWRkciwgbWFzaywgaW5kZXgsIHYxLCBzY2FsZSkgX19leHRlbnNpb25fXyAoeyBcCisgIF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJzaXY4c2YoKGZsb2F0ICopKGFkZHIpLCAoX19tbWFzazgpKG1hc2spLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzaSkoX19tMjU2aSkoaW5kZXgpLCAoX192OHNmKShfX20yNTYpKHYxKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKHNjYWxlKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X2kzMnNjYXR0ZXJfZXBpMzIoYWRkciwgaW5kZXgsIHYxLCBzY2FsZSkgX19leHRlbnNpb25fXyAoeyBcCisgIF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJzaXY4c2koKGludCAqKShhZGRyKSwgKF9fbW1hc2s4KS0xLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzaSkoX19tMjU2aSkoaW5kZXgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzaSkoX19tMjU2aSkodjEpLCAoaW50KShzY2FsZSkpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9tYXNrX2kzMnNjYXR0ZXJfZXBpMzIoYWRkciwgbWFzaywgaW5kZXgsIHYxLCBzY2FsZSkgX19leHRlbnNpb25fXyAoeyBcCisgIF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJzaXY4c2koKGludCAqKShhZGRyKSwgKF9fbW1hc2s4KShtYXNrKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2kpKF9fbTI1NmkpKGluZGV4KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2kpKF9fbTI1NmkpKHYxKSwgKGludCkoc2NhbGUpKTsgfSkKKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX3NxcnRfcGQgKF9fbTEyOGQgX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOGQgX19BKSB7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfc3FydHBkMTI4X21hc2sgKChfX3YyZGYpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjJkZikgX19XLAorICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfc3FydF9wZCAoX19tbWFzazggX19VLCBfX20xMjhkIF9fQSkgeworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3NxcnRwZDEyOF9tYXNrICgoX192MmRmKSBfX0EsCisgICAgICAgICAgICAgIChfX3YyZGYpCisgICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3BkICgpLAorICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19zcXJ0X3BkIChfX20yNTZkIF9fVywgX19tbWFzazggX19VLCBfX20yNTZkIF9fQSkgeworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX3NxcnRwZDI1Nl9tYXNrICgoX192NGRmKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y0ZGYpIF9fVywKKyAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X3NxcnRfcGQgKF9fbW1hc2s4IF9fVSwgX19tMjU2ZCBfX0EpIHsKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9zcXJ0cGQyNTZfbWFzayAoKF9fdjRkZikgX19BLAorICAgICAgICAgICAgICAoX192NGRmKQorICAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19wZCAoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19zcXJ0X3BzIChfX20xMjggX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOCBfX0EpIHsKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3NxcnRwczEyOF9tYXNrICgoX192NHNmKSBfX0EsCisgICAgICAgICAgICAgKF9fdjRzZikgX19XLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X3NxcnRfcHMgKF9fbW1hc2s4IF9fVSwgX19tMTI4IF9fQSkgeworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfc3FydHBzMTI4X21hc2sgKChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAgICAoX192NHNmKQorICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3BzICgpLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfc3FydF9wcyAoX19tMjU2IF9fVywgX19tbWFzazggX19VLCBfX20yNTYgX19BKSB7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9zcXJ0cHMyNTZfbWFzayAoKF9fdjhzZikgX19BLAorICAgICAgICAgICAgIChfX3Y4c2YpIF9fVywKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9zcXJ0X3BzIChfX21tYXNrOCBfX1UsIF9fbTI1NiBfX0EpIHsKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX3NxcnRwczI1Nl9tYXNrICgoX192OHNmKSBfX0EsCisgICAgICAgICAgICAgKF9fdjhzZikKKyAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19wcyAoKSwKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19zdWJfcGQgKF9fbTEyOGQgX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikgeworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3N1YnBkMTI4X21hc2sgKChfX3YyZGYpIF9fQSwKKyAgICAgICAgICAgICAoX192MmRmKSBfX0IsCisgICAgICAgICAgICAgKF9fdjJkZikgX19XLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9zdWJfcGQgKF9fbW1hc2s4IF9fVSwgX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKSB7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfc3VicGQxMjhfbWFzayAoKF9fdjJkZikgX19BLAorICAgICAgICAgICAgIChfX3YyZGYpIF9fQiwKKyAgICAgICAgICAgICAoX192MmRmKQorICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3BkICgpLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX3N1Yl9wZCAoX19tMjU2ZCBfX1csIF9fbW1hc2s4IF9fVSwgX19tMjU2ZCBfX0EsCisgICAgICAgIF9fbTI1NmQgX19CKSB7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfc3VicGQyNTZfbWFzayAoKF9fdjRkZikgX19BLAorICAgICAgICAgICAgIChfX3Y0ZGYpIF9fQiwKKyAgICAgICAgICAgICAoX192NGRmKSBfX1csCisgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X3N1Yl9wZCAoX19tbWFzazggX19VLCBfX20yNTZkIF9fQSwgX19tMjU2ZCBfX0IpIHsKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9zdWJwZDI1Nl9tYXNrICgoX192NGRmKSBfX0EsCisgICAgICAgICAgICAgKF9fdjRkZikgX19CLAorICAgICAgICAgICAgIChfX3Y0ZGYpCisgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fcGQgKCksCisgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19zdWJfcHMgKF9fbTEyOCBfX1csIF9fbW1hc2sxNiBfX1UsIF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3N1YnBzMTI4X21hc2sgKChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAgIChfX3Y0c2YpIF9fQiwKKyAgICAgICAgICAgIChfX3Y0c2YpIF9fVywKKyAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X3N1Yl9wcyAoX19tbWFzazE2IF9fVSwgX19tMTI4IF9fQSwgX19tMTI4IF9fQikgeworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfc3VicHMxMjhfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgKF9fdjRzZikgX19CLAorICAgICAgICAgICAgKF9fdjRzZikKKyAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3BzICgpLAorICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19zdWJfcHMgKF9fbTI1NiBfX1csIF9fbW1hc2sxNiBfX1UsIF9fbTI1NiBfX0EsIF9fbTI1NiBfX0IpIHsKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX3N1YnBzMjU2X21hc2sgKChfX3Y4c2YpIF9fQSwKKyAgICAgICAgICAgIChfX3Y4c2YpIF9fQiwKKyAgICAgICAgICAgIChfX3Y4c2YpIF9fVywKKyAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X3N1Yl9wcyAoX19tbWFzazE2IF9fVSwgX19tMjU2IF9fQSwgX19tMjU2IF9fQikgeworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfc3VicHMyNTZfbWFzayAoKF9fdjhzZikgX19BLAorICAgICAgICAgICAgKF9fdjhzZikgX19CLAorICAgICAgICAgICAgKF9fdjhzZikKKyAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3BzICgpLAorICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2syX3Blcm11dGV4MnZhcl9lcGkzMiAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19JLCBfX21tYXNrOCBfX1UsCisgICAgICAgICAgICBfX20xMjhpIF9fQikgeworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaTJ2YXJkMTI4X21hc2sgKChfX3Y0c2kpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAoX192NHNpKSBfX0kKKyAgICAgICAgICAgICAgICAgICAvKiBpZHggKi8gLAorICAgICAgICAgICAgICAgICAgIChfX3Y0c2kpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFzazJfcGVybXV0ZXgydmFyX2VwaTMyIChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0ksCisgICAgICAgICBfX21tYXNrOCBfX1UsIF9fbTI1NmkgX19CKSB7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfdnBlcm1pMnZhcmQyNTZfbWFzayAoKF9fdjhzaSkgX19BLAorICAgICAgICAgICAgICAgICAgIChfX3Y4c2kpIF9fSQorICAgICAgICAgICAgICAgICAgIC8qIGlkeCAqLyAsCisgICAgICAgICAgICAgICAgICAgKF9fdjhzaSkgX19CLAorICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrMl9wZXJtdXRleDJ2YXJfcGQgKF9fbTEyOGQgX19BLCBfX20xMjhpIF9fSSwgX19tbWFzazggX19VLAorICAgICAgICAgX19tMTI4ZCBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl92cGVybWkydmFycGQxMjhfbWFzayAoKF9fdjJkZikgX19BLAorICAgICAgICAgICAgICAoX192MmRpKSBfX0kKKyAgICAgICAgICAgICAgLyogaWR4ICovICwKKyAgICAgICAgICAgICAgKF9fdjJkZikgX19CLAorICAgICAgICAgICAgICAoX19tbWFzazgpCisgICAgICAgICAgICAgIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFzazJfcGVybXV0ZXgydmFyX3BkIChfX20yNTZkIF9fQSwgX19tMjU2aSBfX0ksIF9fbW1hc2s4IF9fVSwKKyAgICAgICAgICAgIF9fbTI1NmQgX19CKSB7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfdnBlcm1pMnZhcnBkMjU2X21hc2sgKChfX3Y0ZGYpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjRkaSkgX19JCisgICAgICAgICAgICAgIC8qIGlkeCAqLyAsCisgICAgICAgICAgICAgIChfX3Y0ZGYpIF9fQiwKKyAgICAgICAgICAgICAgKF9fbW1hc2s4KQorICAgICAgICAgICAgICBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFzazJfcGVybXV0ZXgydmFyX3BzIChfX20xMjggX19BLCBfX20xMjhpIF9fSSwgX19tbWFzazggX19VLAorICAgICAgICAgX19tMTI4IF9fQikgeworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfdnBlcm1pMnZhcnBzMTI4X21hc2sgKChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAoX192NHNpKSBfX0kKKyAgICAgICAgICAgICAgICAgICAvKiBpZHggKi8gLAorICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrMl9wZXJtdXRleDJ2YXJfcHMgKF9fbTI1NiBfX0EsIF9fbTI1NmkgX19JLCBfX21tYXNrOCBfX1UsCisgICAgICAgICAgICBfX20yNTYgX19CKSB7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl92cGVybWkydmFycHMyNTZfbWFzayAoKF9fdjhzZikgX19BLAorICAgICAgICAgICAgICAgICAgIChfX3Y4c2kpIF9fSQorICAgICAgICAgICAgICAgICAgIC8qIGlkeCAqLyAsCisgICAgICAgICAgICAgICAgICAgKF9fdjhzZikgX19CLAorICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrMl9wZXJtdXRleDJ2YXJfZXBpNjQgKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fSSwgX19tbWFzazggX19VLAorICAgICAgICAgICAgX19tMTI4aSBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGVybWkydmFycTEyOF9tYXNrICgoX192MmRpKSBfX0EsCisgICAgICAgICAgICAgICAgICAgKF9fdjJkaSkgX19JCisgICAgICAgICAgICAgICAgICAgLyogaWR4ICovICwKKyAgICAgICAgICAgICAgICAgICAoX192MmRpKSBfX0IsCisgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2syX3Blcm11dGV4MnZhcl9lcGk2NCAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19JLAorICAgICAgICAgX19tbWFzazggX19VLCBfX20yNTZpIF9fQikgeworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaTJ2YXJxMjU2X21hc2sgKChfX3Y0ZGkpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAoX192NGRpKSBfX0kKKyAgICAgICAgICAgICAgICAgICAvKiBpZHggKi8gLAorICAgICAgICAgICAgICAgICAgIChfX3Y0ZGkpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fcGVybXV0ZXgydmFyX2VwaTMyIChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0ksIF9fbTEyOGkgX19CKSB7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBlcm10MnZhcmQxMjhfbWFzayAoKF9fdjRzaSkgX19JCisgICAgICAgICAgICAgICAgICAgLyogaWR4ICovICwKKyAgICAgICAgICAgICAgICAgICAoX192NHNpKSBfX0EsCisgICAgICAgICAgICAgICAgICAgKF9fdjRzaSkgX19CLAorICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfcGVybXV0ZXgydmFyX2VwaTMyIChfX20xMjhpIF9fQSwgX19tbWFzazggX19VLCBfX20xMjhpIF9fSSwKKyAgICAgICAgICAgX19tMTI4aSBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGVybXQydmFyZDEyOF9tYXNrICgoX192NHNpKSBfX0kKKyAgICAgICAgICAgICAgICAgICAvKiBpZHggKi8gLAorICAgICAgICAgICAgICAgICAgIChfX3Y0c2kpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAoX192NHNpKSBfX0IsCisgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X3Blcm11dGV4MnZhcl9lcGkzMiAoX19tbWFzazggX19VLCBfX20xMjhpIF9fQSwgX19tMTI4aSBfX0ksCisgICAgICAgICAgICBfX20xMjhpIF9fQikgeworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJkMTI4X21hc2t6ICgoX192NHNpKSBfX0kKKyAgICAgICAgICAgICAgLyogaWR4ICovICwKKyAgICAgICAgICAgICAgKF9fdjRzaSkgX19BLAorICAgICAgICAgICAgICAoX192NHNpKSBfX0IsCisgICAgICAgICAgICAgIChfX21tYXNrOCkKKyAgICAgICAgICAgICAgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9wZXJtdXRleDJ2YXJfZXBpMzIgKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fSSwgX19tMjU2aSBfX0IpIHsKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl92cGVybXQydmFyZDI1Nl9tYXNrICgoX192OHNpKSBfX0kKKyAgICAgICAgICAgICAgICAgICAvKiBpZHggKi8gLAorICAgICAgICAgICAgICAgICAgIChfX3Y4c2kpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAoX192OHNpKSBfX0IsCisgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19wZXJtdXRleDJ2YXJfZXBpMzIgKF9fbTI1NmkgX19BLCBfX21tYXNrOCBfX1UsIF9fbTI1NmkgX19JLAorICAgICAgICBfX20yNTZpIF9fQikgeworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJkMjU2X21hc2sgKChfX3Y4c2kpIF9fSQorICAgICAgICAgICAgICAgICAgIC8qIGlkeCAqLyAsCisgICAgICAgICAgICAgICAgICAgKF9fdjhzaSkgX19BLAorICAgICAgICAgICAgICAgICAgIChfX3Y4c2kpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfcGVybXV0ZXgydmFyX2VwaTMyIChfX21tYXNrOCBfX1UsIF9fbTI1NmkgX19BLAorICAgICAgICAgX19tMjU2aSBfX0ksIF9fbTI1NmkgX19CKSB7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfdnBlcm10MnZhcmQyNTZfbWFza3ogKChfX3Y4c2kpIF9fSQorICAgICAgICAgICAgICAvKiBpZHggKi8gLAorICAgICAgICAgICAgICAoX192OHNpKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y4c2kpIF9fQiwKKyAgICAgICAgICAgICAgKF9fbW1hc2s4KQorICAgICAgICAgICAgICBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3Blcm11dGV4MnZhcl9wZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGkgX19JLCBfX20xMjhkIF9fQikgeworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJwZDEyOF9tYXNrICgoX192MmRpKSBfX0kKKyAgICAgICAgICAgICAgLyogaWR4ICovICwKKyAgICAgICAgICAgICAgKF9fdjJkZikgX19BLAorICAgICAgICAgICAgICAoX192MmRmKSBfX0IsCisgICAgICAgICAgICAgIChfX21tYXNrOCkgLQorICAgICAgICAgICAgICAxKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX3Blcm11dGV4MnZhcl9wZCAoX19tMTI4ZCBfX0EsIF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0ksCisgICAgICAgIF9fbTEyOGQgX19CKSB7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnBkMTI4X21hc2sgKChfX3YyZGkpIF9fSQorICAgICAgICAgICAgICAvKiBpZHggKi8gLAorICAgICAgICAgICAgICAoX192MmRmKSBfX0EsCisgICAgICAgICAgICAgIChfX3YyZGYpIF9fQiwKKyAgICAgICAgICAgICAgKF9fbW1hc2s4KQorICAgICAgICAgICAgICBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X3Blcm11dGV4MnZhcl9wZCAoX19tbWFzazggX19VLCBfX20xMjhkIF9fQSwgX19tMTI4aSBfX0ksCisgICAgICAgICBfX20xMjhkIF9fQikgeworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJwZDEyOF9tYXNreiAoKF9fdjJkaSkgX19JCisgICAgICAgICAgICAgICAvKiBpZHggKi8gLAorICAgICAgICAgICAgICAgKF9fdjJkZikgX19BLAorICAgICAgICAgICAgICAgKF9fdjJkZikgX19CLAorICAgICAgICAgICAgICAgKF9fbW1hc2s4KQorICAgICAgICAgICAgICAgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9wZXJtdXRleDJ2YXJfcGQgKF9fbTI1NmQgX19BLCBfX20yNTZpIF9fSSwgX19tMjU2ZCBfX0IpIHsKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl92cGVybXQydmFycGQyNTZfbWFzayAoKF9fdjRkaSkgX19JCisgICAgICAgICAgICAgIC8qIGlkeCAqLyAsCisgICAgICAgICAgICAgIChfX3Y0ZGYpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjRkZikgX19CLAorICAgICAgICAgICAgICAoX19tbWFzazgpIC0KKyAgICAgICAgICAgICAgMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19wZXJtdXRleDJ2YXJfcGQgKF9fbTI1NmQgX19BLCBfX21tYXNrOCBfX1UsIF9fbTI1NmkgX19JLAorICAgICAgICAgICBfX20yNTZkIF9fQikgeworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJwZDI1Nl9tYXNrICgoX192NGRpKSBfX0kKKyAgICAgICAgICAgICAgLyogaWR4ICovICwKKyAgICAgICAgICAgICAgKF9fdjRkZikgX19BLAorICAgICAgICAgICAgICAoX192NGRmKSBfX0IsCisgICAgICAgICAgICAgIChfX21tYXNrOCkKKyAgICAgICAgICAgICAgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9wZXJtdXRleDJ2YXJfcGQgKF9fbW1hc2s4IF9fVSwgX19tMjU2ZCBfX0EsIF9fbTI1NmkgX19JLAorICAgICAgICAgICAgX19tMjU2ZCBfX0IpIHsKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl92cGVybXQydmFycGQyNTZfbWFza3ogKChfX3Y0ZGkpIF9fSQorICAgICAgICAgICAgICAgLyogaWR4ICovICwKKyAgICAgICAgICAgICAgIChfX3Y0ZGYpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3Y0ZGYpIF9fQiwKKyAgICAgICAgICAgICAgIChfX21tYXNrOCkKKyAgICAgICAgICAgICAgIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9wZXJtdXRleDJ2YXJfcHMgKF9fbTEyOCBfX0EsIF9fbTEyOGkgX19JLCBfX20xMjggX19CKSB7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl92cGVybXQydmFycHMxMjhfbWFzayAoKF9fdjRzaSkgX19JCisgICAgICAgICAgICAgICAgICAgLyogaWR4ICovICwKKyAgICAgICAgICAgICAgICAgICAoX192NHNmKSBfX0EsCisgICAgICAgICAgICAgICAgICAgKF9fdjRzZikgX19CLAorICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19wZXJtdXRleDJ2YXJfcHMgKF9fbTEyOCBfX0EsIF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0ksCisgICAgICAgIF9fbTEyOCBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJwczEyOF9tYXNrICgoX192NHNpKSBfX0kKKyAgICAgICAgICAgICAgICAgICAvKiBpZHggKi8gLAorICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAoX192NHNmKSBfX0IsCisgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfcGVybXV0ZXgydmFyX3BzIChfX21tYXNrOCBfX1UsIF9fbTEyOCBfX0EsIF9fbTEyOGkgX19JLAorICAgICAgICAgX19tMTI4IF9fQikgeworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnBzMTI4X21hc2t6ICgoX192NHNpKSBfX0kKKyAgICAgICAgICAgICAgLyogaWR4ICovICwKKyAgICAgICAgICAgICAgKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAoX192NHNmKSBfX0IsCisgICAgICAgICAgICAgIChfX21tYXNrOCkKKyAgICAgICAgICAgICAgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3Blcm11dGV4MnZhcl9wcyAoX19tMjU2IF9fQSwgX19tMjU2aSBfX0ksIF9fbTI1NiBfX0IpIHsKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJwczI1Nl9tYXNrICgoX192OHNpKSBfX0kKKyAgICAgICAgICAgICAgICAgICAvKiBpZHggKi8gLAorICAgICAgICAgICAgICAgICAgIChfX3Y4c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAoX192OHNmKSBfX0IsCisgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX3Blcm11dGV4MnZhcl9wcyAoX19tMjU2IF9fQSwgX19tbWFzazggX19VLCBfX20yNTZpIF9fSSwKKyAgICAgICAgICAgX19tMjU2IF9fQikgeworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnBzMjU2X21hc2sgKChfX3Y4c2kpIF9fSQorICAgICAgICAgICAgICAgICAgIC8qIGlkeCAqLyAsCisgICAgICAgICAgICAgICAgICAgKF9fdjhzZikgX19BLAorICAgICAgICAgICAgICAgICAgIChfX3Y4c2YpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9wZXJtdXRleDJ2YXJfcHMgKF9fbW1hc2s4IF9fVSwgX19tMjU2IF9fQSwgX19tMjU2aSBfX0ksCisgICAgICAgICAgICBfX20yNTYgX19CKSB7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl92cGVybXQydmFycHMyNTZfbWFza3ogKChfX3Y4c2kpIF9fSQorICAgICAgICAgICAgICAvKiBpZHggKi8gLAorICAgICAgICAgICAgICAoX192OHNmKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y4c2YpIF9fQiwKKyAgICAgICAgICAgICAgKF9fbW1hc2s4KQorICAgICAgICAgICAgICBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3Blcm11dGV4MnZhcl9lcGk2NCAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19JLCBfX20xMjhpIF9fQikgeworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJxMTI4X21hc2sgKChfX3YyZGkpIF9fSQorICAgICAgICAgICAgICAgICAgIC8qIGlkeCAqLyAsCisgICAgICAgICAgICAgICAgICAgKF9fdjJkaSkgX19BLAorICAgICAgICAgICAgICAgICAgIChfX3YyZGkpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX3Blcm11dGV4MnZhcl9lcGk2NCAoX19tMTI4aSBfX0EsIF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0ksCisgICAgICAgICAgIF9fbTEyOGkgX19CKSB7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnExMjhfbWFzayAoKF9fdjJkaSkgX19JCisgICAgICAgICAgICAgICAgICAgLyogaWR4ICovICwKKyAgICAgICAgICAgICAgICAgICAoX192MmRpKSBfX0EsCisgICAgICAgICAgICAgICAgICAgKF9fdjJkaSkgX19CLAorICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9wZXJtdXRleDJ2YXJfZXBpNjQgKF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EsIF9fbTEyOGkgX19JLAorICAgICAgICAgICAgX19tMTI4aSBfX0IpIHsKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGVybXQydmFycTEyOF9tYXNreiAoKF9fdjJkaSkgX19JCisgICAgICAgICAgICAgIC8qIGlkeCAqLyAsCisgICAgICAgICAgICAgIChfX3YyZGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjJkaSkgX19CLAorICAgICAgICAgICAgICAoX19tbWFzazgpCisgICAgICAgICAgICAgIF9fVSk7Cit9CisKKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9wZXJtdXRleDJ2YXJfZXBpNjQgKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fSSwgX19tMjU2aSBfX0IpIHsKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl92cGVybXQydmFycTI1Nl9tYXNrICgoX192NGRpKSBfX0kKKyAgICAgICAgICAgICAgICAgICAvKiBpZHggKi8gLAorICAgICAgICAgICAgICAgICAgIChfX3Y0ZGkpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAoX192NGRpKSBfX0IsCisgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19wZXJtdXRleDJ2YXJfZXBpNjQgKF9fbTI1NmkgX19BLCBfX21tYXNrOCBfX1UsIF9fbTI1NmkgX19JLAorICAgICAgICBfX20yNTZpIF9fQikgeworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJxMjU2X21hc2sgKChfX3Y0ZGkpIF9fSQorICAgICAgICAgICAgICAgICAgIC8qIGlkeCAqLyAsCisgICAgICAgICAgICAgICAgICAgKF9fdjRkaSkgX19BLAorICAgICAgICAgICAgICAgICAgIChfX3Y0ZGkpIF9fQiwKKyAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfcGVybXV0ZXgydmFyX2VwaTY0IChfX21tYXNrOCBfX1UsIF9fbTI1NmkgX19BLAorICAgICAgICAgX19tMjU2aSBfX0ksIF9fbTI1NmkgX19CKSB7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnEyNTZfbWFza3ogKChfX3Y0ZGkpIF9fSQorICAgICAgICAgICAgICAvKiBpZHggKi8gLAorICAgICAgICAgICAgICAoX192NGRpKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y0ZGkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fbW1hc2s4KQorICAgICAgICAgICAgICBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfY3Z0ZXBpOF9lcGkzMiAoX19tMTI4aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnN4YmQxMjhfbWFzayAoKF9fdjE2cWkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192NHNpKSBfX1csCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2N2dGVwaThfZXBpMzIgKF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnN4YmQxMjhfbWFzayAoKF9fdjE2cWkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192NHNpKQorICAgICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2N2dGVwaThfZXBpMzIgKF9fbTI1NmkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3Btb3ZzeGJkMjU2X21hc2sgKChfX3YxNnFpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjhzaSkgX19XLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9jdnRlcGk4X2VwaTMyIChfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3Btb3ZzeGJkMjU2X21hc2sgKChfX3YxNnFpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjhzaSkKKyAgICAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jdnRlcGk4X2VwaTY0IChfX20xMjhpIF9fVywgX19tbWFzazggX19VLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92c3hicTEyOF9tYXNrICgoX192MTZxaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3YyZGkpIF9fVywKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfY3Z0ZXBpOF9lcGk2NCAoX19tbWFzazggX19VLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92c3hicTEyOF9tYXNrICgoX192MTZxaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3YyZGkpCisgICAgICAgICAgICAgICAgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfY3Z0ZXBpOF9lcGk2NCAoX19tMjU2aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG1vdnN4YnEyNTZfbWFzayAoKF9fdjE2cWkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192NGRpKSBfX1csCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X2N2dGVwaThfZXBpNjQgKF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG1vdnN4YnEyNTZfbWFzayAoKF9fdjE2cWkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192NGRpKQorICAgICAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2ICgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2N2dGVwaTMyX2VwaTY0IChfX20xMjhpIF9fVywgX19tbWFzazggX19VLCBfX20xMjhpIF9fWCkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92c3hkcTEyOF9tYXNrICgoX192NHNpKSBfX1gsCisgICAgICAgICAgICAgICAgKF9fdjJkaSkgX19XLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9jdnRlcGkzMl9lcGk2NCAoX19tbWFzazggX19VLCBfX20xMjhpIF9fWCkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92c3hkcTEyOF9tYXNrICgoX192NHNpKSBfX1gsCisgICAgICAgICAgICAgICAgKF9fdjJkaSkKKyAgICAgICAgICAgICAgICBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jdnRlcGkzMl9lcGk2NCAoX19tMjU2aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX1gpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG1vdnN4ZHEyNTZfbWFzayAoKF9fdjRzaSkgX19YLAorICAgICAgICAgICAgICAgIChfX3Y0ZGkpIF9fVywKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfY3Z0ZXBpMzJfZXBpNjQgKF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX1gpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG1vdnN4ZHEyNTZfbWFzayAoKF9fdjRzaSkgX19YLAorICAgICAgICAgICAgICAgIChfX3Y0ZGkpCisgICAgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfY3Z0ZXBpMTZfZXBpMzIgKF9fbTEyOGkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3ZzeHdkMTI4X21hc2sgKChfX3Y4aGkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192NHNpKSBfX1csCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2N2dGVwaTE2X2VwaTMyIChfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3ZzeHdkMTI4X21hc2sgKChfX3Y4aGkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192NHNpKQorICAgICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2N2dGVwaTE2X2VwaTMyIChfX20yNTZpIF9fVywgX19tbWFzazggX19VLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wbW92c3h3ZDI1Nl9tYXNrICgoX192OGhpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjhzaSkgX19XLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9jdnRlcGkxNl9lcGkzMiAoX19tbWFzazggX19VLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wbW92c3h3ZDI1Nl9tYXNrICgoX192OGhpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjhzaSkKKyAgICAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jdnRlcGkxNl9lcGk2NCAoX19tMTI4aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnN4d3ExMjhfbWFzayAoKF9fdjhoaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3YyZGkpIF9fVywKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfY3Z0ZXBpMTZfZXBpNjQgKF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnN4d3ExMjhfbWFzayAoKF9fdjhoaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3YyZGkpCisgICAgICAgICAgICAgICAgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfY3Z0ZXBpMTZfZXBpNjQgKF9fbTI1NmkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3Btb3ZzeHdxMjU2X21hc2sgKChfX3Y4aGkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192NGRpKSBfX1csCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X2N2dGVwaTE2X2VwaTY0IChfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3Btb3ZzeHdxMjU2X21hc2sgKChfX3Y4aGkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192NGRpKQorICAgICAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2ICgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfY3Z0ZXB1OF9lcGkzMiAoX19tMTI4aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnp4YmQxMjhfbWFzayAoKF9fdjE2cWkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192NHNpKSBfX1csCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2N2dGVwdThfZXBpMzIgKF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnp4YmQxMjhfbWFzayAoKF9fdjE2cWkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192NHNpKQorICAgICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2N2dGVwdThfZXBpMzIgKF9fbTI1NmkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3Btb3Z6eGJkMjU2X21hc2sgKChfX3YxNnFpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjhzaSkgX19XLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9jdnRlcHU4X2VwaTMyIChfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3Btb3Z6eGJkMjU2X21hc2sgKChfX3YxNnFpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjhzaSkKKyAgICAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jdnRlcHU4X2VwaTY0IChfX20xMjhpIF9fVywgX19tbWFzazggX19VLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92enhicTEyOF9tYXNrICgoX192MTZxaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3YyZGkpIF9fVywKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfY3Z0ZXB1OF9lcGk2NCAoX19tbWFzazggX19VLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92enhicTEyOF9tYXNrICgoX192MTZxaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3YyZGkpCisgICAgICAgICAgICAgICAgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfY3Z0ZXB1OF9lcGk2NCAoX19tMjU2aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG1vdnp4YnEyNTZfbWFzayAoKF9fdjE2cWkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192NGRpKSBfX1csCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X2N2dGVwdThfZXBpNjQgKF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG1vdnp4YnEyNTZfbWFzayAoKF9fdjE2cWkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192NGRpKQorICAgICAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2ICgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2N2dGVwdTMyX2VwaTY0IChfX20xMjhpIF9fVywgX19tbWFzazggX19VLCBfX20xMjhpIF9fWCkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92enhkcTEyOF9tYXNrICgoX192NHNpKSBfX1gsCisgICAgICAgICAgICAgICAgKF9fdjJkaSkgX19XLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9jdnRlcHUzMl9lcGk2NCAoX19tbWFzazggX19VLCBfX20xMjhpIF9fWCkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92enhkcTEyOF9tYXNrICgoX192NHNpKSBfX1gsCisgICAgICAgICAgICAgICAgKF9fdjJkaSkKKyAgICAgICAgICAgICAgICBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jdnRlcHUzMl9lcGk2NCAoX19tMjU2aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX1gpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG1vdnp4ZHEyNTZfbWFzayAoKF9fdjRzaSkgX19YLAorICAgICAgICAgICAgICAgIChfX3Y0ZGkpIF9fVywKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfY3Z0ZXB1MzJfZXBpNjQgKF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX1gpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG1vdnp4ZHEyNTZfbWFzayAoKF9fdjRzaSkgX19YLAorICAgICAgICAgICAgICAgIChfX3Y0ZGkpCisgICAgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfY3Z0ZXB1MTZfZXBpMzIgKF9fbTEyOGkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3Z6eHdkMTI4X21hc2sgKChfX3Y4aGkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192NHNpKSBfX1csCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2N2dGVwdTE2X2VwaTMyIChfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3Z6eHdkMTI4X21hc2sgKChfX3Y4aGkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192NHNpKQorICAgICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2N2dGVwdTE2X2VwaTMyIChfX20yNTZpIF9fVywgX19tbWFzazggX19VLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wbW92enh3ZDI1Nl9tYXNrICgoX192OGhpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjhzaSkgX19XLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9jdnRlcHUxNl9lcGkzMiAoX19tbWFzazggX19VLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wbW92enh3ZDI1Nl9tYXNrICgoX192OGhpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjhzaSkKKyAgICAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jdnRlcHUxNl9lcGk2NCAoX19tMTI4aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnp4d3ExMjhfbWFzayAoKF9fdjhoaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3YyZGkpIF9fVywKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfY3Z0ZXB1MTZfZXBpNjQgKF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnp4d3ExMjhfbWFzayAoKF9fdjhoaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3YyZGkpCisgICAgICAgICAgICAgICAgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfY3Z0ZXB1MTZfZXBpNjQgKF9fbTI1NmkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3Btb3Z6eHdxMjU2X21hc2sgKChfX3Y4aGkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192NGRpKSBfX1csCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X2N2dGVwdTE2X2VwaTY0IChfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3Btb3Z6eHdxMjU2X21hc2sgKChfX3Y4aGkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192NGRpKQorICAgICAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2ICgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworCisjZGVmaW5lIF9tbV9yb2xfZXBpMzIoYSwgYikgX19leHRlbnNpb25fXyAoe1wKKyAgKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHJvbGQxMjhfbWFzaygoX192NHNpKShfX20xMjhpKShhKSwgKGludCkoYiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNpKV9tbV9zZXR6ZXJvX3NpMTI4KCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrX3JvbF9lcGkzMih3LCB1LCBhLCBiKSBfX2V4dGVuc2lvbl9fICh7XAorICAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wcm9sZDEyOF9tYXNrKChfX3Y0c2kpKF9fbTEyOGkpKGEpLCAoaW50KShiKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2kpKF9fbTEyOGkpKHcpLCAoX19tbWFzazgpKHUpKTsgfSkKKworI2RlZmluZSBfbW1fbWFza3pfcm9sX2VwaTMyKHUsIGEsIGIpIF9fZXh0ZW5zaW9uX18gKHtcCisgIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3Byb2xkMTI4X21hc2soKF9fdjRzaSkoX19tMTI4aSkoYSksIChpbnQpKGIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzaSlfbW1fc2V0emVyb19zaTEyOCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSh1KSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X3JvbF9lcGkzMihhLCBiKSBfX2V4dGVuc2lvbl9fICh7XAorICAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wcm9sZDI1Nl9tYXNrKChfX3Y4c2kpKF9fbTI1NmkpKGEpLCAoaW50KShiKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2kpX21tMjU2X3NldHplcm9fc2kyNTYoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21hc2tfcm9sX2VwaTMyKHcsIHUsIGEsIGIpIF9fZXh0ZW5zaW9uX18gKHtcCisgIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3Byb2xkMjU2X21hc2soKF9fdjhzaSkoX19tMjU2aSkoYSksIChpbnQpKGIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzaSkoX19tMjU2aSkodyksIChfX21tYXNrOCkodSkpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9tYXNrel9yb2xfZXBpMzIodSwgYSwgYikgX19leHRlbnNpb25fXyAoe1wKKyAgKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHJvbGQyNTZfbWFzaygoX192OHNpKShfX20yNTZpKShhKSwgKGludCkoYiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNpKV9tbTI1Nl9zZXR6ZXJvX3NpMjU2KCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKHUpKTsgfSkKKworI2RlZmluZSBfbW1fcm9sX2VwaTY0KGEsIGIpIF9fZXh0ZW5zaW9uX18gKHtcCisgIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3Byb2xxMTI4X21hc2soKF9fdjJkaSkoX19tMTI4aSkoYSksIChpbnQpKGIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkaSlfbW1fc2V0emVyb19kaSgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsgfSkKKworI2RlZmluZSBfbW1fbWFza19yb2xfZXBpNjQodywgdSwgYSwgYikgX19leHRlbnNpb25fXyAoe1wKKyAgKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHJvbHExMjhfbWFzaygoX192MmRpKShfX20xMjhpKShhKSwgKGludCkoYiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRpKShfX20xMjhpKSh3KSwgKF9fbW1hc2s4KSh1KSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2t6X3JvbF9lcGk2NCh1LCBhLCBiKSBfX2V4dGVuc2lvbl9fICh7XAorICAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wcm9scTEyOF9tYXNrKChfX3YyZGkpKF9fbTEyOGkpKGEpLCAoaW50KShiKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGkpX21tX3NldHplcm9fZGkoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkodSkpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9yb2xfZXBpNjQoYSwgYikgX19leHRlbnNpb25fXyAoe1wKKyAgKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHJvbHEyNTZfbWFzaygoX192NGRpKShfX20yNTZpKShhKSwgKGludCkoYiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRpKV9tbTI1Nl9zZXR6ZXJvX3NpMjU2KCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9tYXNrX3JvbF9lcGk2NCh3LCB1LCBhLCBiKSBfX2V4dGVuc2lvbl9fICh7XAorICAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wcm9scTI1Nl9tYXNrKChfX3Y0ZGkpKF9fbTI1NmkpKGEpLCAoaW50KShiKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGkpKF9fbTI1NmkpKHcpLCAoX19tbWFzazgpKHUpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfbWFza3pfcm9sX2VwaTY0KHUsIGEsIGIpIF9fZXh0ZW5zaW9uX18gKHtcCisgIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3Byb2xxMjU2X21hc2soKF9fdjRkaSkoX19tMjU2aSkoYSksIChpbnQpKGIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkaSlfbW0yNTZfc2V0emVyb19zaTI1NigpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSh1KSk7IH0pCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fcm9sdl9lcGkzMiAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Byb2x2ZDEyOF9tYXNrICgoX192NHNpKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y0c2kpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjRzaSkKKyAgICAgICAgICAgICAgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfcm9sdl9lcGkzMiAoX19tMTI4aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EsCisgICAgICAgICBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wcm9sdmQxMjhfbWFzayAoKF9fdjRzaSkgX19BLAorICAgICAgICAgICAgICAoX192NHNpKSBfX0IsCisgICAgICAgICAgICAgIChfX3Y0c2kpIF9fVywKKyAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X3JvbHZfZXBpMzIgKF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Byb2x2ZDEyOF9tYXNrICgoX192NHNpKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y0c2kpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjRzaSkKKyAgICAgICAgICAgICAgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9yb2x2X2VwaTMyIChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcHJvbHZkMjU2X21hc2sgKChfX3Y4c2kpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjhzaSkgX19CLAorICAgICAgICAgICAgICAoX192OHNpKQorICAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19yb2x2X2VwaTMyIChfX20yNTZpIF9fVywgX19tbWFzazggX19VLCBfX20yNTZpIF9fQSwKKyAgICAgIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3Byb2x2ZDI1Nl9tYXNrICgoX192OHNpKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y4c2kpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjhzaSkgX19XLAorICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfcm9sdl9lcGkzMiAoX19tbWFzazggX19VLCBfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcHJvbHZkMjU2X21hc2sgKChfX3Y4c2kpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjhzaSkgX19CLAorICAgICAgICAgICAgICAoX192OHNpKQorICAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3JvbHZfZXBpNjQgKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wcm9sdnExMjhfbWFzayAoKF9fdjJkaSkgX19BLAorICAgICAgICAgICAgICAoX192MmRpKSBfX0IsCisgICAgICAgICAgICAgIChfX3YyZGkpCisgICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX2RpICgpLAorICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX3JvbHZfZXBpNjQgKF9fbTEyOGkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BLAorICAgICAgICAgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcHJvbHZxMTI4X21hc2sgKChfX3YyZGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjJkaSkgX19CLAorICAgICAgICAgICAgICAoX192MmRpKSBfX1csCisgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9yb2x2X2VwaTY0IChfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wcm9sdnExMjhfbWFzayAoKF9fdjJkaSkgX19BLAorICAgICAgICAgICAgICAoX192MmRpKSBfX0IsCisgICAgICAgICAgICAgIChfX3YyZGkpCisgICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX2RpICgpLAorICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfcm9sdl9lcGk2NCAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3Byb2x2cTI1Nl9tYXNrICgoX192NGRpKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y0ZGkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjRkaSkKKyAgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfcm9sdl9lcGk2NCAoX19tMjU2aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMjU2aSBfX0EsCisgICAgICBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wcm9sdnEyNTZfbWFzayAoKF9fdjRkaSkgX19BLAorICAgICAgICAgICAgICAoX192NGRpKSBfX0IsCisgICAgICAgICAgICAgIChfX3Y0ZGkpIF9fVywKKyAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X3JvbHZfZXBpNjQgKF9fbW1hc2s4IF9fVSwgX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3Byb2x2cTI1Nl9tYXNrICgoX192NGRpKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y0ZGkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjRkaSkKKyAgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworI2RlZmluZSBfbW1fcm9yX2VwaTMyKEEsIEIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wcm9yZDEyOF9tYXNrKChfX3Y0c2kpKF9fbTEyOGkpKEEpLCAoaW50KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2kpX21tX3NldHplcm9fc2kxMjgoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2tfcm9yX2VwaTMyKFcsIFUsIEEsIEIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wcm9yZDEyOF9tYXNrKChfX3Y0c2kpKF9fbTEyOGkpKEEpLCAoaW50KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2kpKF9fbTEyOGkpKFcpLCAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW1fbWFza3pfcm9yX2VwaTMyKFUsIEEsIEIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wcm9yZDEyOF9tYXNrKChfX3Y0c2kpKF9fbTEyOGkpKEEpLCAoaW50KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2kpX21tX3NldHplcm9fc2kxMjgoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSkpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9yb3JfZXBpMzIoQSwgQikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3Byb3JkMjU2X21hc2soKF9fdjhzaSkoX19tMjU2aSkoQSksIChpbnQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzaSlfbW0yNTZfc2V0emVyb19zaTI1NigpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsgfSkKKworI2RlZmluZSBfbW0yNTZfbWFza19yb3JfZXBpMzIoVywgVSwgQSwgQikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3Byb3JkMjU2X21hc2soKF9fdjhzaSkoX19tMjU2aSkoQSksIChpbnQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzaSkoX19tMjU2aSkoVyksIChfX21tYXNrOCkoVSkpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9tYXNrel9yb3JfZXBpMzIoVSwgQSwgQikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3Byb3JkMjU2X21hc2soKF9fdjhzaSkoX19tMjU2aSkoQSksIChpbnQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzaSlfbW0yNTZfc2V0emVyb19zaTI1NigpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tX3Jvcl9lcGk2NChBLCBCKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHJvcnExMjhfbWFzaygoX192MmRpKShfX20xMjhpKShBKSwgKGludCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRpKV9tbV9zZXR6ZXJvX2RpKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrX3Jvcl9lcGk2NChXLCBVLCBBLCBCKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHJvcnExMjhfbWFzaygoX192MmRpKShfX20xMjhpKShBKSwgKGludCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRpKShfX20xMjhpKShXKSwgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2t6X3Jvcl9lcGk2NChVLCBBLCBCKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHJvcnExMjhfbWFzaygoX192MmRpKShfX20xMjhpKShBKSwgKGludCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRpKV9tbV9zZXR6ZXJvX2RpKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfcm9yX2VwaTY0KEEsIEIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wcm9ycTI1Nl9tYXNrKChfX3Y0ZGkpKF9fbTI1NmkpKEEpLCAoaW50KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGkpX21tMjU2X3NldHplcm9fc2kyNTYoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21hc2tfcm9yX2VwaTY0KFcsIFUsIEEsIEIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wcm9ycTI1Nl9tYXNrKChfX3Y0ZGkpKF9fbTI1NmkpKEEpLCAoaW50KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGkpKF9fbTI1NmkpKFcpLCAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfbWFza3pfcm9yX2VwaTY0KFUsIEEsIEIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wcm9ycTI1Nl9tYXNrKChfX3Y0ZGkpKF9fbTI1NmkpKEEpLCAoaW50KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGkpX21tMjU2X3NldHplcm9fc2kyNTYoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSkpOyB9KQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfc2xsX2VwaTMyIChfX20xMjhpIF9fVywgX19tbWFzazggX19VLCBfX20xMjhpIF9fQSwKKyAgICAgICAgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcHNsbGQxMjhfbWFzayAoKF9fdjRzaSkgX19BLAorICAgICAgICAgICAgIChfX3Y0c2kpIF9fQiwKKyAgICAgICAgICAgICAoX192NHNpKSBfX1csCisgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X3NsbF9lcGkzMiAoX19tbWFzazggX19VLCBfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcHNsbGQxMjhfbWFzayAoKF9fdjRzaSkgX19BLAorICAgICAgICAgICAgIChfX3Y0c2kpIF9fQiwKKyAgICAgICAgICAgICAoX192NHNpKQorICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX3NsbF9lcGkzMiAoX19tMjU2aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMjU2aSBfX0EsCisgICAgICAgICAgIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BzbGxkMjU2X21hc2sgKChfX3Y4c2kpIF9fQSwKKyAgICAgICAgICAgICAoX192NHNpKSBfX0IsCisgICAgICAgICAgICAgKF9fdjhzaSkgX19XLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9zbGxfZXBpMzIgKF9fbW1hc2s4IF9fVSwgX19tMjU2aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BzbGxkMjU2X21hc2sgKChfX3Y4c2kpIF9fQSwKKyAgICAgICAgICAgICAoX192NHNpKSBfX0IsCisgICAgICAgICAgICAgKF9fdjhzaSkKKyAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKKyNkZWZpbmUgX21tX21hc2tfc2xsaV9lcGkzMihXLCBVLCBBLCBCKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHNsbGRpMTI4X21hc2soKF9fdjRzaSkoX19tMTI4aSkoQSksIChpbnQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2kpKF9fbTEyOGkpKFcpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSkpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrel9zbGxpX2VwaTMyKFUsIEEsIEIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc2xsZGkxMjhfbWFzaygoX192NHNpKShfX20xMjhpKShBKSwgKGludCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzaSlfbW1fc2V0emVyb19zaTEyOCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSkpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9tYXNrX3NsbGlfZXBpMzIoVywgVSwgQSwgQikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BzbGxkaTI1Nl9tYXNrKChfX3Y4c2kpKF9fbTI1NmkpKEEpLCAoaW50KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNpKShfX20yNTZpKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfbWFza3pfc2xsaV9lcGkzMihVLCBBLCBCKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHNsbGRpMjU2X21hc2soKF9fdjhzaSkoX19tMjU2aSkoQSksIChpbnQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2kpX21tMjU2X3NldHplcm9fc2kyNTYoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX3NsbF9lcGk2NCAoX19tMTI4aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EsCisgICAgICAgIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BzbGxxMTI4X21hc2sgKChfX3YyZGkpIF9fQSwKKyAgICAgICAgICAgICAoX192MmRpKSBfX0IsCisgICAgICAgICAgICAgKF9fdjJkaSkgX19XLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9zbGxfZXBpNjQgKF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BzbGxxMTI4X21hc2sgKChfX3YyZGkpIF9fQSwKKyAgICAgICAgICAgICAoX192MmRpKSBfX0IsCisgICAgICAgICAgICAgKF9fdjJkaSkKKyAgICAgICAgICAgICBfbW1fc2V0emVyb19kaSAoKSwKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19zbGxfZXBpNjQgKF9fbTI1NmkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTI1NmkgX19BLAorICAgICAgICAgICBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wc2xscTI1Nl9tYXNrICgoX192NGRpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjJkaSkgX19CLAorICAgICAgICAgICAgIChfX3Y0ZGkpIF9fVywKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfc2xsX2VwaTY0IChfX21tYXNrOCBfX1UsIF9fbTI1NmkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wc2xscTI1Nl9tYXNrICgoX192NGRpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjJkaSkgX19CLAorICAgICAgICAgICAgIChfX3Y0ZGkpCisgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCisjZGVmaW5lIF9tbV9tYXNrX3NsbGlfZXBpNjQoVywgVSwgQSwgQikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BzbGxxaTEyOF9tYXNrKChfX3YyZGkpKF9fbTEyOGkpKEEpLCAoaW50KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRpKShfX20xMjhpKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW1fbWFza3pfc2xsaV9lcGk2NChVLCBBLCBCKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHNsbHFpMTI4X21hc2soKF9fdjJkaSkoX19tMTI4aSkoQSksIChpbnQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGkpX21tX3NldHplcm9fZGkoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfbWFza19zbGxpX2VwaTY0KFcsIFUsIEEsIEIpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wc2xscWkyNTZfbWFzaygoX192NGRpKShfX20yNTZpKShBKSwgKGludCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkaSkoX19tMjU2aSkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21hc2t6X3NsbGlfZXBpNjQoVSwgQSwgQikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BzbGxxaTI1Nl9tYXNrKChfX3Y0ZGkpKF9fbTI1NmkpKEEpLCAoaW50KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRpKV9tbTI1Nl9zZXR6ZXJvX3NpMjU2KCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9yb3J2X2VwaTMyIChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcHJvcnZkMTI4X21hc2sgKChfX3Y0c2kpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjRzaSkgX19CLAorICAgICAgICAgICAgICAoX192NHNpKQorICAgICAgICAgICAgICBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19yb3J2X2VwaTMyIChfX20xMjhpIF9fVywgX19tbWFzazggX19VLCBfX20xMjhpIF9fQSwKKyAgICAgICAgIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Byb3J2ZDEyOF9tYXNrICgoX192NHNpKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y0c2kpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjRzaSkgX19XLAorICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfcm9ydl9lcGkzMiAoX19tbWFzazggX19VLCBfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcHJvcnZkMTI4X21hc2sgKChfX3Y0c2kpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjRzaSkgX19CLAorICAgICAgICAgICAgICAoX192NHNpKQorICAgICAgICAgICAgICBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3JvcnZfZXBpMzIgKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wcm9ydmQyNTZfbWFzayAoKF9fdjhzaSkgX19BLAorICAgICAgICAgICAgICAoX192OHNpKSBfX0IsCisgICAgICAgICAgICAgIChfX3Y4c2kpCisgICAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2ICgpLAorICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX3JvcnZfZXBpMzIgKF9fbTI1NmkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTI1NmkgX19BLAorICAgICAgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcHJvcnZkMjU2X21hc2sgKChfX3Y4c2kpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjhzaSkgX19CLAorICAgICAgICAgICAgICAoX192OHNpKSBfX1csCisgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9yb3J2X2VwaTMyIChfX21tYXNrOCBfX1UsIF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wcm9ydmQyNTZfbWFzayAoKF9fdjhzaSkgX19BLAorICAgICAgICAgICAgICAoX192OHNpKSBfX0IsCisgICAgICAgICAgICAgIChfX3Y4c2kpCisgICAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2ICgpLAorICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fcm9ydl9lcGk2NCAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Byb3J2cTEyOF9tYXNrICgoX192MmRpKSBfX0EsCisgICAgICAgICAgICAgIChfX3YyZGkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjJkaSkKKyAgICAgICAgICAgICAgX21tX3NldHplcm9fZGkgKCksCisgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfcm9ydl9lcGk2NCAoX19tMTI4aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EsCisgICAgICAgICBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wcm9ydnExMjhfbWFzayAoKF9fdjJkaSkgX19BLAorICAgICAgICAgICAgICAoX192MmRpKSBfX0IsCisgICAgICAgICAgICAgIChfX3YyZGkpIF9fVywKKyAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X3JvcnZfZXBpNjQgKF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Byb3J2cTEyOF9tYXNrICgoX192MmRpKSBfX0EsCisgICAgICAgICAgICAgIChfX3YyZGkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjJkaSkKKyAgICAgICAgICAgICAgX21tX3NldHplcm9fZGkgKCksCisgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9yb3J2X2VwaTY0IChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcHJvcnZxMjU2X21hc2sgKChfX3Y0ZGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjRkaSkgX19CLAorICAgICAgICAgICAgICAoX192NGRpKQorICAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19yb3J2X2VwaTY0IChfX20yNTZpIF9fVywgX19tbWFzazggX19VLCBfX20yNTZpIF9fQSwKKyAgICAgIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3Byb3J2cTI1Nl9tYXNrICgoX192NGRpKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y0ZGkpIF9fQiwKKyAgICAgICAgICAgICAgKF9fdjRkaSkgX19XLAorICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfcm9ydl9lcGk2NCAoX19tbWFzazggX19VLCBfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcHJvcnZxMjU2X21hc2sgKChfX3Y0ZGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjRkaSkgX19CLAorICAgICAgICAgICAgICAoX192NGRpKQorICAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfc2xsdl9lcGk2NCAoX19tMTI4aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX1gsCisgICAgICAgICBfX20xMjhpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wc2xsdjJkaV9tYXNrICgoX192MmRpKSBfX1gsCisgICAgICAgICAgICAgKF9fdjJkaSkgX19ZLAorICAgICAgICAgICAgIChfX3YyZGkpIF9fVywKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfc2xsdl9lcGk2NCAoX19tbWFzazggX19VLCBfX20xMjhpIF9fWCwgX19tMTI4aSBfX1kpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcHNsbHYyZGlfbWFzayAoKF9fdjJkaSkgX19YLAorICAgICAgICAgICAgIChfX3YyZGkpIF9fWSwKKyAgICAgICAgICAgICAoX192MmRpKQorICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX2RpICgpLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX3NsbHZfZXBpNjQgKF9fbTI1NmkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTI1NmkgX19YLAorICAgICAgX19tMjU2aSBfX1kpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcHNsbHY0ZGlfbWFzayAoKF9fdjRkaSkgX19YLAorICAgICAgICAgICAgIChfX3Y0ZGkpIF9fWSwKKyAgICAgICAgICAgICAoX192NGRpKSBfX1csCisgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X3NsbHZfZXBpNjQgKF9fbW1hc2s4IF9fVSwgX19tMjU2aSBfX1gsIF9fbTI1NmkgX19ZKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BzbGx2NGRpX21hc2sgKChfX3Y0ZGkpIF9fWCwKKyAgICAgICAgICAgICAoX192NGRpKSBfX1ksCisgICAgICAgICAgICAgKF9fdjRkaSkKKyAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19zbGx2X2VwaTMyIChfX20xMjhpIF9fVywgX19tbWFzazggX19VLCBfX20xMjhpIF9fWCwKKyAgICAgICAgIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BzbGx2NHNpX21hc2sgKChfX3Y0c2kpIF9fWCwKKyAgICAgICAgICAgICAoX192NHNpKSBfX1ksCisgICAgICAgICAgICAgKF9fdjRzaSkgX19XLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9zbGx2X2VwaTMyIChfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wc2xsdjRzaV9tYXNrICgoX192NHNpKSBfX1gsCisgICAgICAgICAgICAgKF9fdjRzaSkgX19ZLAorICAgICAgICAgICAgIChfX3Y0c2kpCisgICAgICAgICAgICAgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfc2xsdl9lcGkzMiAoX19tMjU2aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMjU2aSBfX1gsCisgICAgICBfX20yNTZpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wc2xsdjhzaV9tYXNrICgoX192OHNpKSBfX1gsCisgICAgICAgICAgICAgKF9fdjhzaSkgX19ZLAorICAgICAgICAgICAgIChfX3Y4c2kpIF9fVywKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfc2xsdl9lcGkzMiAoX19tbWFzazggX19VLCBfX20yNTZpIF9fWCwgX19tMjU2aSBfX1kpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcHNsbHY4c2lfbWFzayAoKF9fdjhzaSkgX19YLAorICAgICAgICAgICAgIChfX3Y4c2kpIF9fWSwKKyAgICAgICAgICAgICAoX192OHNpKQorICAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2ICgpLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19zcmx2X2VwaTY0IChfX20xMjhpIF9fVywgX19tbWFzazggX19VLCBfX20xMjhpIF9fWCwKKyAgICAgICAgIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Bzcmx2MmRpX21hc2sgKChfX3YyZGkpIF9fWCwKKyAgICAgICAgICAgICAoX192MmRpKSBfX1ksCisgICAgICAgICAgICAgKF9fdjJkaSkgX19XLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9zcmx2X2VwaTY0IChfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wc3JsdjJkaV9tYXNrICgoX192MmRpKSBfX1gsCisgICAgICAgICAgICAgKF9fdjJkaSkgX19ZLAorICAgICAgICAgICAgIChfX3YyZGkpCisgICAgICAgICAgICAgX21tX3NldHplcm9fZGkgKCksCisgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfc3Jsdl9lcGk2NCAoX19tMjU2aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMjU2aSBfX1gsCisgICAgICBfX20yNTZpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wc3JsdjRkaV9tYXNrICgoX192NGRpKSBfX1gsCisgICAgICAgICAgICAgKF9fdjRkaSkgX19ZLAorICAgICAgICAgICAgIChfX3Y0ZGkpIF9fVywKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfc3Jsdl9lcGk2NCAoX19tbWFzazggX19VLCBfX20yNTZpIF9fWCwgX19tMjU2aSBfX1kpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcHNybHY0ZGlfbWFzayAoKF9fdjRkaSkgX19YLAorICAgICAgICAgICAgIChfX3Y0ZGkpIF9fWSwKKyAgICAgICAgICAgICAoX192NGRpKQorICAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2ICgpLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX3NybHZfZXBpMzIgKF9fbTEyOGkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19YLAorICAgICAgICAgX19tMTI4aSBfX1kpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcHNybHY0c2lfbWFzayAoKF9fdjRzaSkgX19YLAorICAgICAgICAgICAgIChfX3Y0c2kpIF9fWSwKKyAgICAgICAgICAgICAoX192NHNpKSBfX1csCisgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X3NybHZfZXBpMzIgKF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Bzcmx2NHNpX21hc2sgKChfX3Y0c2kpIF9fWCwKKyAgICAgICAgICAgICAoX192NHNpKSBfX1ksCisgICAgICAgICAgICAgKF9fdjRzaSkKKyAgICAgICAgICAgICBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19zcmx2X2VwaTMyIChfX20yNTZpIF9fVywgX19tbWFzazggX19VLCBfX20yNTZpIF9fWCwKKyAgICAgIF9fbTI1NmkgX19ZKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3Bzcmx2OHNpX21hc2sgKChfX3Y4c2kpIF9fWCwKKyAgICAgICAgICAgICAoX192OHNpKSBfX1ksCisgICAgICAgICAgICAgKF9fdjhzaSkgX19XLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9zcmx2X2VwaTMyIChfX21tYXNrOCBfX1UsIF9fbTI1NmkgX19YLCBfX20yNTZpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wc3JsdjhzaV9tYXNrICgoX192OHNpKSBfX1gsCisgICAgICAgICAgICAgKF9fdjhzaSkgX19ZLAorICAgICAgICAgICAgIChfX3Y4c2kpCisgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCisKKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX3NybF9lcGkzMiAoX19tMTI4aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EsCisgICAgICAgIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BzcmxkMTI4X21hc2sgKChfX3Y0c2kpIF9fQSwKKyAgICAgICAgICAgICAoX192NHNpKSBfX0IsCisgICAgICAgICAgICAgKF9fdjRzaSkgX19XLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9zcmxfZXBpMzIgKF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BzcmxkMTI4X21hc2sgKChfX3Y0c2kpIF9fQSwKKyAgICAgICAgICAgICAoX192NHNpKSBfX0IsCisgICAgICAgICAgICAgKF9fdjRzaSkKKyAgICAgICAgICAgICBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19zcmxfZXBpMzIgKF9fbTI1NmkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTI1NmkgX19BLAorICAgICAgICAgICBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wc3JsZDI1Nl9tYXNrICgoX192OHNpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjRzaSkgX19CLAorICAgICAgICAgICAgIChfX3Y4c2kpIF9fVywKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfc3JsX2VwaTMyIChfX21tYXNrOCBfX1UsIF9fbTI1NmkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wc3JsZDI1Nl9tYXNrICgoX192OHNpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjRzaSkgX19CLAorICAgICAgICAgICAgIChfX3Y4c2kpCisgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCisjZGVmaW5lIF9tbV9tYXNrX3NybGlfZXBpMzIoVywgVSwgQSwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHNybGRpMTI4X21hc2soKF9fdjRzaSkoX19tMTI4aSkoQSksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzaSkoX19tMTI4aSkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2t6X3NybGlfZXBpMzIoVSwgQSwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHNybGRpMTI4X21hc2soKF9fdjRzaSkoX19tMTI4aSkoQSksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzaSlfbW1fc2V0emVyb19zaTEyOCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSkpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9tYXNrX3NybGlfZXBpMzIoVywgVSwgQSwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHNybGRpMjU2X21hc2soKF9fdjhzaSkoX19tMjU2aSkoQSksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzaSkoX19tMjU2aSkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21hc2t6X3NybGlfZXBpMzIoVSwgQSwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHNybGRpMjU2X21hc2soKF9fdjhzaSkoX19tMjU2aSkoQSksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzaSlfbW0yNTZfc2V0emVyb19zaTI1NigpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSkpOyB9KQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfc3JsX2VwaTY0IChfX20xMjhpIF9fVywgX19tbWFzazggX19VLCBfX20xMjhpIF9fQSwKKyAgICAgICAgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcHNybHExMjhfbWFzayAoKF9fdjJkaSkgX19BLAorICAgICAgICAgICAgIChfX3YyZGkpIF9fQiwKKyAgICAgICAgICAgICAoX192MmRpKSBfX1csCisgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X3NybF9lcGk2NCAoX19tbWFzazggX19VLCBfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcHNybHExMjhfbWFzayAoKF9fdjJkaSkgX19BLAorICAgICAgICAgICAgIChfX3YyZGkpIF9fQiwKKyAgICAgICAgICAgICAoX192MmRpKQorICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX2RpICgpLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX3NybF9lcGk2NCAoX19tMjU2aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMjU2aSBfX0EsCisgICAgICAgICAgIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BzcmxxMjU2X21hc2sgKChfX3Y0ZGkpIF9fQSwKKyAgICAgICAgICAgICAoX192MmRpKSBfX0IsCisgICAgICAgICAgICAgKF9fdjRkaSkgX19XLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9zcmxfZXBpNjQgKF9fbW1hc2s4IF9fVSwgX19tMjU2aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BzcmxxMjU2X21hc2sgKChfX3Y0ZGkpIF9fQSwKKyAgICAgICAgICAgICAoX192MmRpKSBfX0IsCisgICAgICAgICAgICAgKF9fdjRkaSkKKyAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKKyNkZWZpbmUgX21tX21hc2tfc3JsaV9lcGk2NChXLCBVLCBBLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc3JscWkxMjhfbWFzaygoX192MmRpKShfX20xMjhpKShBKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRpKShfX20xMjhpKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW1fbWFza3pfc3JsaV9lcGk2NChVLCBBLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc3JscWkxMjhfbWFzaygoX192MmRpKShfX20xMjhpKShBKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRpKV9tbV9zZXR6ZXJvX3NpMTI4KCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21hc2tfc3JsaV9lcGk2NChXLCBVLCBBLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wc3JscWkyNTZfbWFzaygoX192NGRpKShfX20yNTZpKShBKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRpKShfX20yNTZpKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfbWFza3pfc3JsaV9lcGk2NChVLCBBLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wc3JscWkyNTZfbWFzaygoX192NGRpKShfX20yNTZpKShBKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRpKV9tbTI1Nl9zZXR6ZXJvX3NpMjU2KCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19zcmF2X2VwaTMyIChfX20xMjhpIF9fVywgX19tbWFzazggX19VLCBfX20xMjhpIF9fWCwKKyAgICAgICAgIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BzcmF2NHNpX21hc2sgKChfX3Y0c2kpIF9fWCwKKyAgICAgICAgICAgICAoX192NHNpKSBfX1ksCisgICAgICAgICAgICAgKF9fdjRzaSkgX19XLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9zcmF2X2VwaTMyIChfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wc3JhdjRzaV9tYXNrICgoX192NHNpKSBfX1gsCisgICAgICAgICAgICAgKF9fdjRzaSkgX19ZLAorICAgICAgICAgICAgIChfX3Y0c2kpCisgICAgICAgICAgICAgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfc3Jhdl9lcGkzMiAoX19tMjU2aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMjU2aSBfX1gsCisgICAgICBfX20yNTZpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wc3JhdjhzaV9tYXNrICgoX192OHNpKSBfX1gsCisgICAgICAgICAgICAgKF9fdjhzaSkgX19ZLAorICAgICAgICAgICAgIChfX3Y4c2kpIF9fVywKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfc3Jhdl9lcGkzMiAoX19tbWFzazggX19VLCBfX20yNTZpIF9fWCwgX19tMjU2aSBfX1kpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcHNyYXY4c2lfbWFzayAoKF9fdjhzaSkgX19YLAorICAgICAgICAgICAgIChfX3Y4c2kpIF9fWSwKKyAgICAgICAgICAgICAoX192OHNpKQorICAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2ICgpLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zcmF2X2VwaTY0IChfX20xMjhpIF9fWCwgX19tMTI4aSBfX1kpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcHNyYXZxMTI4X21hc2sgKChfX3YyZGkpIF9fWCwKKyAgICAgICAgICAgICAgKF9fdjJkaSkgX19ZLAorICAgICAgICAgICAgICAoX192MmRpKQorICAgICAgICAgICAgICBfbW1fc2V0emVyb19kaSAoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19zcmF2X2VwaTY0IChfX20xMjhpIF9fVywgX19tbWFzazggX19VLCBfX20xMjhpIF9fWCwKKyAgICAgICAgIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BzcmF2cTEyOF9tYXNrICgoX192MmRpKSBfX1gsCisgICAgICAgICAgICAgIChfX3YyZGkpIF9fWSwKKyAgICAgICAgICAgICAgKF9fdjJkaSkgX19XLAorICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfc3Jhdl9lcGk2NCAoX19tbWFzazggX19VLCBfX20xMjhpIF9fWCwgX19tMTI4aSBfX1kpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcHNyYXZxMTI4X21hc2sgKChfX3YyZGkpIF9fWCwKKyAgICAgICAgICAgICAgKF9fdjJkaSkgX19ZLAorICAgICAgICAgICAgICAoX192MmRpKQorICAgICAgICAgICAgICBfbW1fc2V0emVyb19kaSAoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3NyYXZfZXBpNjQgKF9fbTI1NmkgX19YLCBfX20yNTZpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wc3JhdnEyNTZfbWFzayAoKF9fdjRkaSkgX19YLAorICAgICAgICAgICAgICAoX192NGRpKSBfX1ksCisgICAgICAgICAgICAgIChfX3Y0ZGkpCisgICAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2ICgpLAorICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX3NyYXZfZXBpNjQgKF9fbTI1NmkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTI1NmkgX19YLAorICAgICAgX19tMjU2aSBfX1kpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcHNyYXZxMjU2X21hc2sgKChfX3Y0ZGkpIF9fWCwKKyAgICAgICAgICAgICAgKF9fdjRkaSkgX19ZLAorICAgICAgICAgICAgICAoX192NGRpKSBfX1csCisgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9zcmF2X2VwaTY0IChfX21tYXNrOCBfX1UsIF9fbTI1NmkgX19YLCBfX20yNTZpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wc3JhdnEyNTZfbWFzayAoKF9fdjRkaSkgX19YLAorICAgICAgICAgICAgICAoX192NGRpKSBfX1ksCisgICAgICAgICAgICAgIChfX3Y0ZGkpCisgICAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2ICgpLAorICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19tb3ZfZXBpMzIgKF9fbTEyOGkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3NlbGVjdGRfMTI4ICgoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICAgICAgICAgKF9fdjRzaSkgX19BLAorICAgICAgICAgICAgICAgICAoX192NHNpKSBfX1cpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X21vdl9lcGkzMiAoX19tbWFzazggX19VLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9zZWxlY3RkXzEyOCAoKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgICAgICAgIChfX3Y0c2kpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjRzaSkgX21tX3NldHplcm9fc2kxMjggKCkpOworfQorCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19tb3ZfZXBpMzIgKF9fbTI1NmkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTI1NmkgX19BKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3NlbGVjdGRfMjU2ICgoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICAgICAgICAgKF9fdjhzaSkgX19BLAorICAgICAgICAgICAgICAgICAoX192OHNpKSBfX1cpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X21vdl9lcGkzMiAoX19tbWFzazggX19VLCBfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9zZWxlY3RkXzI1NiAoKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgICAgICAgIChfX3Y4c2kpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjhzaSkgX21tMjU2X3NldHplcm9fc2kyNTYgKCkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfbG9hZF9lcGkzMiAoX19tMTI4aSBfX1csIF9fbW1hc2s4IF9fVSwgdm9pZCBjb25zdCAqX19QKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX21vdmRxYTMybG9hZDEyOF9tYXNrICgoX192NHNpICopIF9fUCwKKyAgICAgICAgICAgICAgKF9fdjRzaSkgX19XLAorICAgICAgICAgICAgICAoX19tbWFzazgpCisgICAgICAgICAgICAgIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfbG9hZF9lcGkzMiAoX19tbWFzazggX19VLCB2b2lkIGNvbnN0ICpfX1ApCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfbW92ZHFhMzJsb2FkMTI4X21hc2sgKChfX3Y0c2kgKikgX19QLAorICAgICAgICAgICAgICAoX192NHNpKQorICAgICAgICAgICAgICBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2s4KQorICAgICAgICAgICAgICBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfbG9hZF9lcGkzMiAoX19tMjU2aSBfX1csIF9fbW1hc2s4IF9fVSwgdm9pZCBjb25zdCAqX19QKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX21vdmRxYTMybG9hZDI1Nl9tYXNrICgoX192OHNpICopIF9fUCwKKyAgICAgICAgICAgICAgKF9fdjhzaSkgX19XLAorICAgICAgICAgICAgICAoX19tbWFzazgpCisgICAgICAgICAgICAgIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfbG9hZF9lcGkzMiAoX19tbWFzazggX19VLCB2b2lkIGNvbnN0ICpfX1ApCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfbW92ZHFhMzJsb2FkMjU2X21hc2sgKChfX3Y4c2kgKikgX19QLAorICAgICAgICAgICAgICAoX192OHNpKQorICAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2s4KQorICAgICAgICAgICAgICBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfc3RvcmVfZXBpMzIgKHZvaWQgKl9fUCwgX19tbWFzazggX19VLCBfX20xMjhpIF9fQSkKK3sKKyAgX19idWlsdGluX2lhMzJfbW92ZHFhMzJzdG9yZTEyOF9tYXNrICgoX192NHNpICopIF9fUCwKKyAgICAgICAgICAoX192NHNpKSBfX0EsCisgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfc3RvcmVfZXBpMzIgKHZvaWQgKl9fUCwgX19tbWFzazggX19VLCBfX20yNTZpIF9fQSkKK3sKKyAgX19idWlsdGluX2lhMzJfbW92ZHFhMzJzdG9yZTI1Nl9tYXNrICgoX192OHNpICopIF9fUCwKKyAgICAgICAgICAoX192OHNpKSBfX0EsCisgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfbW92X2VwaTY0IChfX20xMjhpIF9fVywgX19tbWFzazggX19VLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9zZWxlY3RxXzEyOCAoKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgICAgICAgIChfX3YyZGkpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjJkaSkgX19XKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9tb3ZfZXBpNjQgKF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfc2VsZWN0cV8xMjggKChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAgICAoX192MmRpKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3YyZGkpIF9tbV9zZXR6ZXJvX2RpICgpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX21vdl9lcGk2NCAoX19tMjU2aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMjU2aSBfX0EpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfc2VsZWN0cV8yNTYgKChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAgICAoX192NGRpKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3Y0ZGkpIF9fVyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfbW92X2VwaTY0IChfX21tYXNrOCBfX1UsIF9fbTI1NmkgX19BKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3NlbGVjdHFfMjU2ICgoX19tbWFzazgpIF9fVSwKKyAgICAgICAgICAgICAgICAgKF9fdjRkaSkgX19BLAorICAgICAgICAgICAgICAgICAoX192NGRpKSBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19sb2FkX2VwaTY0IChfX20xMjhpIF9fVywgX19tbWFzazggX19VLCB2b2lkIGNvbnN0ICpfX1ApCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfbW92ZHFhNjRsb2FkMTI4X21hc2sgKChfX3YyZGkgKikgX19QLAorICAgICAgICAgICAgICAoX192MmRpKSBfX1csCisgICAgICAgICAgICAgIChfX21tYXNrOCkKKyAgICAgICAgICAgICAgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9sb2FkX2VwaTY0IChfX21tYXNrOCBfX1UsIHZvaWQgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9tb3ZkcWE2NGxvYWQxMjhfbWFzayAoKF9fdjJkaSAqKSBfX1AsCisgICAgICAgICAgICAgIChfX3YyZGkpCisgICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX2RpICgpLAorICAgICAgICAgICAgICAoX19tbWFzazgpCisgICAgICAgICAgICAgIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19sb2FkX2VwaTY0IChfX20yNTZpIF9fVywgX19tbWFzazggX19VLCB2b2lkIGNvbnN0ICpfX1ApCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfbW92ZHFhNjRsb2FkMjU2X21hc2sgKChfX3Y0ZGkgKikgX19QLAorICAgICAgICAgICAgICAoX192NGRpKSBfX1csCisgICAgICAgICAgICAgIChfX21tYXNrOCkKKyAgICAgICAgICAgICAgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9sb2FkX2VwaTY0IChfX21tYXNrOCBfX1UsIHZvaWQgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9tb3ZkcWE2NGxvYWQyNTZfbWFzayAoKF9fdjRkaSAqKSBfX1AsCisgICAgICAgICAgICAgIChfX3Y0ZGkpCisgICAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2ICgpLAorICAgICAgICAgICAgICAoX19tbWFzazgpCisgICAgICAgICAgICAgIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19zdG9yZV9lcGk2NCAodm9pZCAqX19QLCBfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BKQoreworICBfX2J1aWx0aW5faWEzMl9tb3ZkcWE2NHN0b3JlMTI4X21hc2sgKChfX3YyZGkgKikgX19QLAorICAgICAgICAgIChfX3YyZGkpIF9fQSwKKyAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19zdG9yZV9lcGk2NCAodm9pZCAqX19QLCBfX21tYXNrOCBfX1UsIF9fbTI1NmkgX19BKQoreworICBfX2J1aWx0aW5faWEzMl9tb3ZkcWE2NHN0b3JlMjU2X21hc2sgKChfX3Y0ZGkgKikgX19QLAorICAgICAgICAgIChfX3Y0ZGkpIF9fQSwKKyAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19tb3ZlZHVwX3BkIChfX20xMjhkIF9fVywgX19tbWFzazggX19VLCBfX20xMjhkIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX3NlbGVjdHBkXzEyOCgoX19tbWFzazgpX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpX21tX21vdmVkdXBfcGQoX19BKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKV9fVyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfbW92ZWR1cF9wZCAoX19tbWFzazggX19VLCBfX20xMjhkIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX3NlbGVjdHBkXzEyOCgoX19tbWFzazgpX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpX21tX21vdmVkdXBfcGQoX19BKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKV9tbV9zZXR6ZXJvX3BkKCkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfbW92ZWR1cF9wZCAoX19tMjU2ZCBfX1csIF9fbW1hc2s4IF9fVSwgX19tMjU2ZCBfX0EpCit7CisgIHJldHVybiAoX19tMjU2ZClfX2J1aWx0aW5faWEzMl9zZWxlY3RwZF8yNTYoKF9fbW1hc2s4KV9fVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRmKV9tbTI1Nl9tb3ZlZHVwX3BkKF9fQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkZilfX1cpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X21vdmVkdXBfcGQgKF9fbW1hc2s4IF9fVSwgX19tMjU2ZCBfX0EpCit7CisgIHJldHVybiAoX19tMjU2ZClfX2J1aWx0aW5faWEzMl9zZWxlY3RwZF8yNTYoKF9fbW1hc2s4KV9fVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRmKV9tbTI1Nl9tb3ZlZHVwX3BkKF9fQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkZilfbW0yNTZfc2V0emVyb19wZCgpKTsKK30KKworCisjZGVmaW5lIF9tbV9tYXNrX3NldDFfZXBpMzIoTywgTSwgQSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3Bicm9hZGNhc3RkMTI4X2dwcl9tYXNrKChpbnQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2kpKF9fbTEyOGkpKE8pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoTSkpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrel9zZXQxX2VwaTMyKE0sIEEpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wYnJvYWRjYXN0ZDEyOF9ncHJfbWFzaygoaW50KShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNpKV9tbV9zZXR6ZXJvX3NpMTI4KCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShNKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21hc2tfc2V0MV9lcGkzMihPLCBNLCBBKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcGJyb2FkY2FzdGQyNTZfZ3ByX21hc2soKGludCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzaSkoX19tMjU2aSkoTyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShNKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21hc2t6X3NldDFfZXBpMzIoTSwgQSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3Bicm9hZGNhc3RkMjU2X2dwcl9tYXNrKChpbnQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2kpX21tMjU2X3NldHplcm9fc2kyNTYoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKE0pKTsgfSkKKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX3NldDFfZXBpNjQgKF9fbTEyOGkgX19PLCBfX21tYXNrOCBfX00sIGxvbmcgbG9uZyBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcGJyb2FkY2FzdHExMjhfZ3ByX21hc2sgKF9fQSwgKF9fdjJkaSkgX19PLAorICAgICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X3NldDFfZXBpNjQgKF9fbW1hc2s4IF9fTSwgbG9uZyBsb25nIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wYnJvYWRjYXN0cTEyOF9ncHJfbWFzayAoX19BLAorICAgICAgICAgICAgICAgICAoX192MmRpKQorICAgICAgICAgICAgICAgICBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX3NldDFfZXBpNjQgKF9fbTI1NmkgX19PLCBfX21tYXNrOCBfX00sIGxvbmcgbG9uZyBfX0EpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcGJyb2FkY2FzdHEyNTZfZ3ByX21hc2sgKF9fQSwgKF9fdjRkaSkgX19PLAorICAgICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X3NldDFfZXBpNjQgKF9fbW1hc2s4IF9fTSwgbG9uZyBsb25nIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wYnJvYWRjYXN0cTI1Nl9ncHJfbWFzayAoX19BLAorICAgICAgICAgICAgICAgICAoX192NGRpKQorICAgICAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAgICAgX19NKTsKK30KKworI2RlZmluZSBfbW1fZml4dXBpbW1fcGQoQSwgQiwgQywgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGQpX19idWlsdGluX2lhMzJfZml4dXBpbW1wZDEyOF9tYXNrKChfX3YyZGYpKF9fbTEyOGQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkaSkoX19tMTI4aSkoQyksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2tfZml4dXBpbW1fcGQoQSwgVSwgQiwgQywgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGQpX19idWlsdGluX2lhMzJfZml4dXBpbW1wZDEyOF9tYXNrKChfX3YyZGYpKF9fbTEyOGQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkaSkoX19tMTI4aSkoQyksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSkpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrel9maXh1cGltbV9wZChVLCBBLCBCLCBDLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9maXh1cGltbXBkMTI4X21hc2t6KChfX3YyZGYpKF9fbTEyOGQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZikoX19tMTI4ZCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRpKShfX20xMjhpKShDKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGltbSksIChfX21tYXNrOCkoVSkpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9maXh1cGltbV9wZChBLCBCLCBDLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2ZClfX2J1aWx0aW5faWEzMl9maXh1cGltbXBkMjU2X21hc2soKF9fdjRkZikoX19tMjU2ZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGYpKF9fbTI1NmQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRpKShfX20yNTZpKShDKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsgfSkKKworI2RlZmluZSBfbW0yNTZfbWFza19maXh1cGltbV9wZChBLCBVLCBCLCBDLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2ZClfX2J1aWx0aW5faWEzMl9maXh1cGltbXBkMjU2X21hc2soKF9fdjRkZikoX19tMjU2ZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGYpKF9fbTI1NmQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRpKShfX20yNTZpKShDKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21hc2t6X2ZpeHVwaW1tX3BkKFUsIEEsIEIsIEMsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTZkKV9fYnVpbHRpbl9pYTMyX2ZpeHVwaW1tcGQyNTZfbWFza3ooKF9fdjRkZikoX19tMjU2ZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRmKShfX20yNTZkKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGkpKF9fbTI1NmkpKEMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoaW1tKSwgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tX2ZpeHVwaW1tX3BzKEEsIEIsIEMsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfZml4dXBpbW1wczEyOF9tYXNrKChfX3Y0c2YpKF9fbTEyOCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNpKShfX20xMjhpKShDKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrX2ZpeHVwaW1tX3BzKEEsIFUsIEIsIEMsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfZml4dXBpbW1wczEyOF9tYXNrKChfX3Y0c2YpKF9fbTEyOCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNpKShfX20xMjhpKShDKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW1fbWFza3pfZml4dXBpbW1fcHMoVSwgQSwgQiwgQywgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOClfX2J1aWx0aW5faWEzMl9maXh1cGltbXBzMTI4X21hc2t6KChfX3Y0c2YpKF9fbTEyOCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpKF9fbTEyOCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2kpKF9fbTEyOGkpKEMpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfZml4dXBpbW1fcHMoQSwgQiwgQywgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NilfX2J1aWx0aW5faWEzMl9maXh1cGltbXBzMjU2X21hc2soKF9fdjhzZikoX19tMjU2KShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNmKShfX20yNTYpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2kpKF9fbTI1NmkpKEMpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21hc2tfZml4dXBpbW1fcHMoQSwgVSwgQiwgQywgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NilfX2J1aWx0aW5faWEzMl9maXh1cGltbXBzMjU2X21hc2soKF9fdjhzZikoX19tMjU2KShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNmKShfX20yNTYpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2kpKF9fbTI1NmkpKEMpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSkpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9tYXNrel9maXh1cGltbV9wcyhVLCBBLCBCLCBDLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2KV9fYnVpbHRpbl9pYTMyX2ZpeHVwaW1tcHMyNTZfbWFza3ooKF9fdjhzZikoX19tMjU2KShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzZikoX19tMjU2KShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzaSkoX19tMjU2aSkoQyksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSkpOyB9KQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfbG9hZF9wZCAoX19tMTI4ZCBfX1csIF9fbW1hc2s4IF9fVSwgdm9pZCBjb25zdCAqX19QKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX2xvYWRhcGQxMjhfbWFzayAoKF9fdjJkZiAqKSBfX1AsCisgICAgICAgICAgICAgICAoX192MmRmKSBfX1csCisgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfbG9hZF9wZCAoX19tbWFzazggX19VLCB2b2lkIGNvbnN0ICpfX1ApCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfbG9hZGFwZDEyOF9tYXNrICgoX192MmRmICopIF9fUCwKKyAgICAgICAgICAgICAgIChfX3YyZGYpCisgICAgICAgICAgICAgICBfbW1fc2V0emVyb19wZCAoKSwKKyAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2xvYWRfcGQgKF9fbTI1NmQgX19XLCBfX21tYXNrOCBfX1UsIHZvaWQgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9sb2FkYXBkMjU2X21hc2sgKChfX3Y0ZGYgKikgX19QLAorICAgICAgICAgICAgICAgKF9fdjRkZikgX19XLAorICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X2xvYWRfcGQgKF9fbW1hc2s4IF9fVSwgdm9pZCBjb25zdCAqX19QKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX2xvYWRhcGQyNTZfbWFzayAoKF9fdjRkZiAqKSBfX1AsCisgICAgICAgICAgICAgICAoX192NGRmKQorICAgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fcGQgKCksCisgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2xvYWRfcHMgKF9fbTEyOCBfX1csIF9fbW1hc2s4IF9fVSwgdm9pZCBjb25zdCAqX19QKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfbG9hZGFwczEyOF9tYXNrICgoX192NHNmICopIF9fUCwKKyAgICAgICAgICAgICAgKF9fdjRzZikgX19XLAorICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9sb2FkX3BzIChfX21tYXNrOCBfX1UsIHZvaWQgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2xvYWRhcHMxMjhfbWFzayAoKF9fdjRzZiAqKSBfX1AsCisgICAgICAgICAgICAgIChfX3Y0c2YpCisgICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3BzICgpLAorICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2xvYWRfcHMgKF9fbTI1NiBfX1csIF9fbW1hc2s4IF9fVSwgdm9pZCBjb25zdCAqX19QKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfbG9hZGFwczI1Nl9tYXNrICgoX192OHNmICopIF9fUCwKKyAgICAgICAgICAgICAgKF9fdjhzZikgX19XLAorICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9sb2FkX3BzIChfX21tYXNrOCBfX1UsIHZvaWQgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX2xvYWRhcHMyNTZfbWFzayAoKF9fdjhzZiAqKSBfX1AsCisgICAgICAgICAgICAgIChfX3Y4c2YpCisgICAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3BzICgpLAorICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19sb2FkdV9lcGk2NCAoX19tMTI4aSBfX1csIF9fbW1hc2s4IF9fVSwgdm9pZCBjb25zdCAqX19QKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2xvYWRkcXVkaTEyOF9tYXNrICgoX192MmRpICopIF9fUCwKKyAgICAgICAgICAgICAgICAgKF9fdjJkaSkgX19XLAorICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfbG9hZHVfZXBpNjQgKF9fbW1hc2s4IF9fVSwgdm9pZCBjb25zdCAqX19QKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2xvYWRkcXVkaTEyOF9tYXNrICgoX192MmRpICopIF9fUCwKKyAgICAgICAgICAgICAgICAgKF9fdjJkaSkKKyAgICAgICAgICAgICAgICAgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2xvYWR1X2VwaTY0IChfX20yNTZpIF9fVywgX19tbWFzazggX19VLCB2b2lkIGNvbnN0ICpfX1ApCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfbG9hZGRxdWRpMjU2X21hc2sgKChfX3Y0ZGkgKikgX19QLAorICAgICAgICAgICAgICAgICAoX192NGRpKSBfX1csCisgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9sb2FkdV9lcGk2NCAoX19tbWFzazggX19VLCB2b2lkIGNvbnN0ICpfX1ApCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfbG9hZGRxdWRpMjU2X21hc2sgKChfX3Y0ZGkgKikgX19QLAorICAgICAgICAgICAgICAgICAoX192NGRpKQorICAgICAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfbG9hZHVfZXBpMzIgKF9fbTEyOGkgX19XLCBfX21tYXNrOCBfX1UsIHZvaWQgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9sb2FkZHF1c2kxMjhfbWFzayAoKF9fdjRzaSAqKSBfX1AsCisgICAgICAgICAgICAgICAgIChfX3Y0c2kpIF9fVywKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2xvYWR1X2VwaTMyIChfX21tYXNrOCBfX1UsIHZvaWQgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9sb2FkZHF1c2kxMjhfbWFzayAoKF9fdjRzaSAqKSBfX1AsCisgICAgICAgICAgICAgICAgIChfX3Y0c2kpCisgICAgICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19sb2FkdV9lcGkzMiAoX19tMjU2aSBfX1csIF9fbW1hc2s4IF9fVSwgdm9pZCBjb25zdCAqX19QKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX2xvYWRkcXVzaTI1Nl9tYXNrICgoX192OHNpICopIF9fUCwKKyAgICAgICAgICAgICAgICAgKF9fdjhzaSkgX19XLAorICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfbG9hZHVfZXBpMzIgKF9fbW1hc2s4IF9fVSwgdm9pZCBjb25zdCAqX19QKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX2xvYWRkcXVzaTI1Nl9tYXNrICgoX192OHNpICopIF9fUCwKKyAgICAgICAgICAgICAgICAgKF9fdjhzaSkKKyAgICAgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2xvYWR1X3BkIChfX20xMjhkIF9fVywgX19tbWFzazggX19VLCB2b2lkIGNvbnN0ICpfX1ApCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfbG9hZHVwZDEyOF9tYXNrICgoX192MmRmICopIF9fUCwKKyAgICAgICAgICAgICAgIChfX3YyZGYpIF9fVywKKyAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9sb2FkdV9wZCAoX19tbWFzazggX19VLCB2b2lkIGNvbnN0ICpfX1ApCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfbG9hZHVwZDEyOF9tYXNrICgoX192MmRmICopIF9fUCwKKyAgICAgICAgICAgICAgIChfX3YyZGYpCisgICAgICAgICAgICAgICBfbW1fc2V0emVyb19wZCAoKSwKKyAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2xvYWR1X3BkIChfX20yNTZkIF9fVywgX19tbWFzazggX19VLCB2b2lkIGNvbnN0ICpfX1ApCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfbG9hZHVwZDI1Nl9tYXNrICgoX192NGRmICopIF9fUCwKKyAgICAgICAgICAgICAgIChfX3Y0ZGYpIF9fVywKKyAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9sb2FkdV9wZCAoX19tbWFzazggX19VLCB2b2lkIGNvbnN0ICpfX1ApCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfbG9hZHVwZDI1Nl9tYXNrICgoX192NGRmICopIF9fUCwKKyAgICAgICAgICAgICAgIChfX3Y0ZGYpCisgICAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19wZCAoKSwKKyAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfbG9hZHVfcHMgKF9fbTEyOCBfX1csIF9fbW1hc2s4IF9fVSwgdm9pZCBjb25zdCAqX19QKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfbG9hZHVwczEyOF9tYXNrICgoX192NHNmICopIF9fUCwKKyAgICAgICAgICAgICAgKF9fdjRzZikgX19XLAorICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9sb2FkdV9wcyAoX19tbWFzazggX19VLCB2b2lkIGNvbnN0ICpfX1ApCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9sb2FkdXBzMTI4X21hc2sgKChfX3Y0c2YgKikgX19QLAorICAgICAgICAgICAgICAoX192NHNmKQorICAgICAgICAgICAgICBfbW1fc2V0emVyb19wcyAoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19sb2FkdV9wcyAoX19tMjU2IF9fVywgX19tbWFzazggX19VLCB2b2lkIGNvbnN0ICpfX1ApCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9sb2FkdXBzMjU2X21hc2sgKChfX3Y4c2YgKikgX19QLAorICAgICAgICAgICAgICAoX192OHNmKSBfX1csCisgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X2xvYWR1X3BzIChfX21tYXNrOCBfX1UsIHZvaWQgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX2xvYWR1cHMyNTZfbWFzayAoKF9fdjhzZiAqKSBfX1AsCisgICAgICAgICAgICAgIChfX3Y4c2YpCisgICAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3BzICgpLAorICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19zdG9yZV9wZCAodm9pZCAqX19QLCBfX21tYXNrOCBfX1UsIF9fbTEyOGQgX19BKQoreworICBfX2J1aWx0aW5faWEzMl9zdG9yZWFwZDEyOF9tYXNrICgoX192MmRmICopIF9fUCwKKyAgICAgICAgICAgKF9fdjJkZikgX19BLAorICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19zdG9yZV9wZCAodm9pZCAqX19QLCBfX21tYXNrOCBfX1UsIF9fbTI1NmQgX19BKQoreworICBfX2J1aWx0aW5faWEzMl9zdG9yZWFwZDI1Nl9tYXNrICgoX192NGRmICopIF9fUCwKKyAgICAgICAgICAgKF9fdjRkZikgX19BLAorICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19zdG9yZV9wcyAodm9pZCAqX19QLCBfX21tYXNrOCBfX1UsIF9fbTEyOCBfX0EpCit7CisgIF9fYnVpbHRpbl9pYTMyX3N0b3JlYXBzMTI4X21hc2sgKChfX3Y0c2YgKikgX19QLAorICAgICAgICAgICAoX192NHNmKSBfX0EsCisgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX3N0b3JlX3BzICh2b2lkICpfX1AsIF9fbW1hc2s4IF9fVSwgX19tMjU2IF9fQSkKK3sKKyAgX19idWlsdGluX2lhMzJfc3RvcmVhcHMyNTZfbWFzayAoKF9fdjhzZiAqKSBfX1AsCisgICAgICAgICAgIChfX3Y4c2YpIF9fQSwKKyAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfc3RvcmV1X2VwaTY0ICh2b2lkICpfX1AsIF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EpCit7CisgIF9fYnVpbHRpbl9pYTMyX3N0b3JlZHF1ZGkxMjhfbWFzayAoKF9fdjJkaSAqKSBfX1AsCisgICAgICAgICAgICAgKF9fdjJkaSkgX19BLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX3N0b3JldV9lcGk2NCAodm9pZCAqX19QLCBfX21tYXNrOCBfX1UsIF9fbTI1NmkgX19BKQoreworICBfX2J1aWx0aW5faWEzMl9zdG9yZWRxdWRpMjU2X21hc2sgKChfX3Y0ZGkgKikgX19QLAorICAgICAgICAgICAgIChfX3Y0ZGkpIF9fQSwKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19zdG9yZXVfZXBpMzIgKHZvaWQgKl9fUCwgX19tbWFzazggX19VLCBfX20xMjhpIF9fQSkKK3sKKyAgX19idWlsdGluX2lhMzJfc3RvcmVkcXVzaTEyOF9tYXNrICgoX192NHNpICopIF9fUCwKKyAgICAgICAgICAgICAoX192NHNpKSBfX0EsCisgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfc3RvcmV1X2VwaTMyICh2b2lkICpfX1AsIF9fbW1hc2s4IF9fVSwgX19tMjU2aSBfX0EpCit7CisgIF9fYnVpbHRpbl9pYTMyX3N0b3JlZHF1c2kyNTZfbWFzayAoKF9fdjhzaSAqKSBfX1AsCisgICAgICAgICAgICAgKF9fdjhzaSkgX19BLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX3N0b3JldV9wZCAodm9pZCAqX19QLCBfX21tYXNrOCBfX1UsIF9fbTEyOGQgX19BKQoreworICBfX2J1aWx0aW5faWEzMl9zdG9yZXVwZDEyOF9tYXNrICgoX192MmRmICopIF9fUCwKKyAgICAgICAgICAgKF9fdjJkZikgX19BLAorICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19zdG9yZXVfcGQgKHZvaWQgKl9fUCwgX19tbWFzazggX19VLCBfX20yNTZkIF9fQSkKK3sKKyAgX19idWlsdGluX2lhMzJfc3RvcmV1cGQyNTZfbWFzayAoKF9fdjRkZiAqKSBfX1AsCisgICAgICAgICAgIChfX3Y0ZGYpIF9fQSwKKyAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfc3RvcmV1X3BzICh2b2lkICpfX1AsIF9fbW1hc2s4IF9fVSwgX19tMTI4IF9fQSkKK3sKKyAgX19idWlsdGluX2lhMzJfc3RvcmV1cHMxMjhfbWFzayAoKF9fdjRzZiAqKSBfX1AsCisgICAgICAgICAgIChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfc3RvcmV1X3BzICh2b2lkICpfX1AsIF9fbW1hc2s4IF9fVSwgX19tMjU2IF9fQSkKK3sKKyAgX19idWlsdGluX2lhMzJfc3RvcmV1cHMyNTZfbWFzayAoKF9fdjhzZiAqKSBfX1AsCisgICAgICAgICAgIChfX3Y4c2YpIF9fQSwKKyAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza191bnBhY2toaV9wZChfX20xMjhkIF9fVywgX19tbWFzazggX19VLCBfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9zZWxlY3RwZF8xMjgoKF9fbW1hc2s4KV9fVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKV9tbV91bnBhY2toaV9wZChfX0EsIF9fQiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZilfX1cpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X3VucGFja2hpX3BkKF9fbW1hc2s4IF9fVSwgX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfc2VsZWN0cGRfMTI4KChfX21tYXNrOClfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZilfbW1fdW5wYWNraGlfcGQoX19BLCBfX0IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpX21tX3NldHplcm9fcGQoKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza191bnBhY2toaV9wZChfX20yNTZkIF9fVywgX19tbWFzazggX19VLCBfX20yNTZkIF9fQSwgX19tMjU2ZCBfX0IpCit7CisgIHJldHVybiAoX19tMjU2ZClfX2J1aWx0aW5faWEzMl9zZWxlY3RwZF8yNTYoKF9fbW1hc2s4KV9fVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRmKV9tbTI1Nl91bnBhY2toaV9wZChfX0EsIF9fQiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkZilfX1cpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X3VucGFja2hpX3BkKF9fbW1hc2s4IF9fVSwgX19tMjU2ZCBfX0EsIF9fbTI1NmQgX19CKQoreworICByZXR1cm4gKF9fbTI1NmQpX19idWlsdGluX2lhMzJfc2VsZWN0cGRfMjU2KChfX21tYXNrOClfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkZilfbW0yNTZfdW5wYWNraGlfcGQoX19BLCBfX0IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGYpX21tMjU2X3NldHplcm9fcGQoKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX3VucGFja2hpX3BzKF9fbTEyOCBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjgpX19idWlsdGluX2lhMzJfc2VsZWN0cHNfMTI4KChfX21tYXNrOClfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKV9tbV91bnBhY2toaV9wcyhfX0EsIF9fQiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKV9fVyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel91bnBhY2toaV9wcyhfX21tYXNrOCBfX1UsIF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX3NlbGVjdHBzXzEyOCgoX19tbWFzazgpX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZilfbW1fdW5wYWNraGlfcHMoX19BLCBfX0IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZilfbW1fc2V0emVyb19wcygpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfdW5wYWNraGlfcHMoX19tMjU2IF9fVywgX19tbWFzazggX19VLCBfX20yNTYgX19BLCBfX20yNTYgX19CKQoreworICByZXR1cm4gKF9fbTI1NilfX2J1aWx0aW5faWEzMl9zZWxlY3Rwc18yNTYoKF9fbW1hc2s4KV9fVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNmKV9tbTI1Nl91bnBhY2toaV9wcyhfX0EsIF9fQiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzZilfX1cpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfdW5wYWNraGlfcHMoX19tbWFzazggX19VLCBfX20yNTYgX19BLCBfX20yNTYgX19CKQoreworICByZXR1cm4gKF9fbTI1NilfX2J1aWx0aW5faWEzMl9zZWxlY3Rwc18yNTYoKF9fbW1hc2s4KV9fVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNmKV9tbTI1Nl91bnBhY2toaV9wcyhfX0EsIF9fQiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzZilfbW0yNTZfc2V0emVyb19wcygpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX3VucGFja2xvX3BkKF9fbTEyOGQgX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX3NlbGVjdHBkXzEyOCgoX19tbWFzazgpX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpX21tX3VucGFja2xvX3BkKF9fQSwgX19CKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKV9fVyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfdW5wYWNrbG9fcGQoX19tbWFzazggX19VLCBfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9zZWxlY3RwZF8xMjgoKF9fbW1hc2s4KV9fVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKV9tbV91bnBhY2tsb19wZChfX0EsIF9fQiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZilfbW1fc2V0emVyb19wZCgpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX3VucGFja2xvX3BkKF9fbTI1NmQgX19XLCBfX21tYXNrOCBfX1UsIF9fbTI1NmQgX19BLCBfX20yNTZkIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZkKV9fYnVpbHRpbl9pYTMyX3NlbGVjdHBkXzI1NigoX19tbWFzazgpX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGYpX21tMjU2X3VucGFja2xvX3BkKF9fQSwgX19CKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRmKV9fVyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfdW5wYWNrbG9fcGQoX19tbWFzazggX19VLCBfX20yNTZkIF9fQSwgX19tMjU2ZCBfX0IpCit7CisgIHJldHVybiAoX19tMjU2ZClfX2J1aWx0aW5faWEzMl9zZWxlY3RwZF8yNTYoKF9fbW1hc2s4KV9fVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRmKV9tbTI1Nl91bnBhY2tsb19wZChfX0EsIF9fQiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkZilfbW0yNTZfc2V0emVyb19wZCgpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfdW5wYWNrbG9fcHMoX19tMTI4IF9fVywgX19tbWFzazggX19VLCBfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOClfX2J1aWx0aW5faWEzMl9zZWxlY3Rwc18xMjgoKF9fbW1hc2s4KV9fVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpX21tX3VucGFja2xvX3BzKF9fQSwgX19CKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpX19XKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X3VucGFja2xvX3BzKF9fbW1hc2s4IF9fVSwgX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjgpX19idWlsdGluX2lhMzJfc2VsZWN0cHNfMTI4KChfX21tYXNrOClfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKV9tbV91bnBhY2tsb19wcyhfX0EsIF9fQiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKV9tbV9zZXR6ZXJvX3BzKCkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza191bnBhY2tsb19wcyhfX20yNTYgX19XLCBfX21tYXNrOCBfX1UsIF9fbTI1NiBfX0EsIF9fbTI1NiBfX0IpCit7CisgIHJldHVybiAoX19tMjU2KV9fYnVpbHRpbl9pYTMyX3NlbGVjdHBzXzI1NigoX19tbWFzazgpX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2YpX21tMjU2X3VucGFja2xvX3BzKF9fQSwgX19CKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNmKV9fVyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel91bnBhY2tsb19wcyhfX21tYXNrOCBfX1UsIF9fbTI1NiBfX0EsIF9fbTI1NiBfX0IpCit7CisgIHJldHVybiAoX19tMjU2KV9fYnVpbHRpbl9pYTMyX3NlbGVjdHBzXzI1NigoX19tbWFzazgpX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2YpX21tMjU2X3VucGFja2xvX3BzKF9fQSwgX19CKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNmKV9tbTI1Nl9zZXR6ZXJvX3BzKCkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3JjcDE0X3BkIChfX20xMjhkIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9yY3AxNHBkMTI4X21hc2sgKChfX3YyZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192MmRmKQorICAgICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3BkICgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfcmNwMTRfcGQgKF9fbTEyOGQgX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOGQgX19BKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3JjcDE0cGQxMjhfbWFzayAoKF9fdjJkZikgX19BLAorICAgICAgICAgICAgICAgIChfX3YyZGYpIF9fVywKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfcmNwMTRfcGQgKF9fbW1hc2s4IF9fVSwgX19tMTI4ZCBfX0EpCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfcmNwMTRwZDEyOF9tYXNrICgoX192MmRmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjJkZikKKyAgICAgICAgICAgICAgICBfbW1fc2V0emVyb19wZCAoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfcmNwMTRfcGQgKF9fbTI1NmQgX19BKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX3JjcDE0cGQyNTZfbWFzayAoKF9fdjRkZikgX19BLAorICAgICAgICAgICAgICAgIChfX3Y0ZGYpCisgICAgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fcGQgKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19yY3AxNF9wZCAoX19tMjU2ZCBfX1csIF9fbW1hc2s4IF9fVSwgX19tMjU2ZCBfX0EpCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfcmNwMTRwZDI1Nl9tYXNrICgoX192NGRmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjRkZikgX19XLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9yY3AxNF9wZCAoX19tbWFzazggX19VLCBfX20yNTZkIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9yY3AxNHBkMjU2X21hc2sgKChfX3Y0ZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192NGRmKQorICAgICAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3BkICgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX3JjcDE0X3BzIChfX20xMjggX19BKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfcmNwMTRwczEyOF9tYXNrICgoX192NHNmKSBfX0EsCisgICAgICAgICAgICAgICAoX192NHNmKQorICAgICAgICAgICAgICAgX21tX3NldHplcm9fcHMgKCksCisgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfcmNwMTRfcHMgKF9fbTEyOCBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4IF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3JjcDE0cHMxMjhfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgKF9fdjRzZikgX19XLAorICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfcmNwMTRfcHMgKF9fbW1hc2s4IF9fVSwgX19tMTI4IF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3JjcDE0cHMxMjhfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgKF9fdjRzZikKKyAgICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3BzICgpLAorICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfcmNwMTRfcHMgKF9fbTI1NiBfX0EpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9yY3AxNHBzMjU2X21hc2sgKChfX3Y4c2YpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3Y4c2YpCisgICAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19wcyAoKSwKKyAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19yY3AxNF9wcyAoX19tMjU2IF9fVywgX19tbWFzazggX19VLCBfX20yNTYgX19BKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfcmNwMTRwczI1Nl9tYXNrICgoX192OHNmKSBfX0EsCisgICAgICAgICAgICAgICAoX192OHNmKSBfX1csCisgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9yY3AxNF9wcyAoX19tbWFzazggX19VLCBfX20yNTYgX19BKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfcmNwMTRwczI1Nl9tYXNrICgoX192OHNmKSBfX0EsCisgICAgICAgICAgICAgICAoX192OHNmKQorICAgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fcHMgKCksCisgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKKyNkZWZpbmUgX21tX21hc2tfcGVybXV0ZV9wZChXLCBVLCBYLCBDKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGQpX19idWlsdGluX2lhMzJfc2VsZWN0cGRfMTI4KChfX21tYXNrOCkoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpX21tX3Blcm11dGVfcGQoKFgpLCAoQykpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShXKSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2t6X3Blcm11dGVfcGQoVSwgWCwgQykgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX3NlbGVjdHBkXzEyOCgoX19tbWFzazgpKFUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKV9tbV9wZXJtdXRlX3BkKChYKSwgKEMpKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZilfbW1fc2V0emVyb19wZCgpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfbWFza19wZXJtdXRlX3BkKFcsIFUsIFgsIEMpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2ZClfX2J1aWx0aW5faWEzMl9zZWxlY3RwZF8yNTYoKF9fbW1hc2s4KShVKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkZilfbW0yNTZfcGVybXV0ZV9wZCgoWCksIChDKSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGYpKF9fbTI1NmQpKFcpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfbWFza3pfcGVybXV0ZV9wZChVLCBYLCBDKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmQpX19idWlsdGluX2lhMzJfc2VsZWN0cGRfMjU2KChfX21tYXNrOCkoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGYpX21tMjU2X3Blcm11dGVfcGQoKFgpLCAoQykpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRmKV9tbTI1Nl9zZXR6ZXJvX3BkKCkpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrX3Blcm11dGVfcHMoVywgVSwgWCwgQykgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfc2VsZWN0cHNfMTI4KChfX21tYXNrOCkoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZilfbW1fcGVybXV0ZV9wcygoWCksIChDKSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShXKSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2t6X3Blcm11dGVfcHMoVSwgWCwgQykgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfc2VsZWN0cHNfMTI4KChfX21tYXNrOCkoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZilfbW1fcGVybXV0ZV9wcygoWCksIChDKSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZilfbW1fc2V0emVyb19wcygpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfbWFza19wZXJtdXRlX3BzKFcsIFUsIFgsIEMpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2KV9fYnVpbHRpbl9pYTMyX3NlbGVjdHBzXzI1NigoX19tbWFzazgpKFUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2YpX21tMjU2X3Blcm11dGVfcHMoKFgpLCAoQykpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2YpKF9fbTI1NikoVykpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9tYXNrel9wZXJtdXRlX3BzKFUsIFgsIEMpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2KV9fYnVpbHRpbl9pYTMyX3NlbGVjdHBzXzI1NigoX19tbWFzazgpKFUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2YpX21tMjU2X3Blcm11dGVfcHMoKFgpLCAoQykpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2YpX21tMjU2X3NldHplcm9fcHMoKSk7IH0pCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19wZXJtdXRldmFyX3BkIChfX20xMjhkIF9fVywgX19tbWFzazggX19VLCBfX20xMjhkIF9fQSwKKyAgICAgIF9fbTEyOGkgX19DKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaWx2YXJwZF9tYXNrICgoX192MmRmKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3YyZGkpIF9fQywKKyAgICAgICAgICAgICAgICAgKF9fdjJkZikgX19XLAorICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfcGVybXV0ZXZhcl9wZCAoX19tbWFzazggX19VLCBfX20xMjhkIF9fQSwgX19tMTI4aSBfX0MpCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfdnBlcm1pbHZhcnBkX21hc2sgKChfX3YyZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjJkaSkgX19DLAorICAgICAgICAgICAgICAgICAoX192MmRmKQorICAgICAgICAgICAgICAgICBfbW1fc2V0emVyb19wZCAoKSwKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfcGVybXV0ZXZhcl9wZCAoX19tMjU2ZCBfX1csIF9fbW1hc2s4IF9fVSwgX19tMjU2ZCBfX0EsCisgICAgICAgICBfX20yNTZpIF9fQykKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl92cGVybWlsdmFycGQyNTZfbWFzayAoKF9fdjRkZikgX19BLAorICAgICAgICAgICAgICAoX192NGRpKSBfX0MsCisgICAgICAgICAgICAgIChfX3Y0ZGYpIF9fVywKKyAgICAgICAgICAgICAgKF9fbW1hc2s4KQorICAgICAgICAgICAgICBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X3Blcm11dGV2YXJfcGQgKF9fbW1hc2s4IF9fVSwgX19tMjU2ZCBfX0EsIF9fbTI1NmkgX19DKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaWx2YXJwZDI1Nl9tYXNrICgoX192NGRmKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y0ZGkpIF9fQywKKyAgICAgICAgICAgICAgKF9fdjRkZikKKyAgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fcGQgKCksCisgICAgICAgICAgICAgIChfX21tYXNrOCkKKyAgICAgICAgICAgICAgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfcGVybXV0ZXZhcl9wcyAoX19tMTI4IF9fVywgX19tbWFzazggX19VLCBfX20xMjggX19BLAorICAgICAgX19tMTI4aSBfX0MpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl92cGVybWlsdmFycHNfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgIChfX3Y0c2kpIF9fQywKKyAgICAgICAgICAgICAgICAoX192NHNmKSBfX1csCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfcGVybXV0ZXZhcl9wcyAoX19tbWFzazggX19VLCBfX20xMjggX19BLCBfX20xMjhpIF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaWx2YXJwc19tYXNrICgoX192NHNmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjRzaSkgX19DLAorICAgICAgICAgICAgICAgIChfX3Y0c2YpCisgICAgICAgICAgICAgICAgX21tX3NldHplcm9fcHMgKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19wZXJtdXRldmFyX3BzIChfX20yNTYgX19XLCBfX21tYXNrOCBfX1UsIF9fbTI1NiBfX0EsCisgICAgICAgICBfX20yNTZpIF9fQykKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaWx2YXJwczI1Nl9tYXNrICgoX192OHNmKSBfX0EsCisgICAgICAgICAgICAgICAgICAgKF9fdjhzaSkgX19DLAorICAgICAgICAgICAgICAgICAgIChfX3Y4c2YpIF9fVywKKyAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9wZXJtdXRldmFyX3BzIChfX21tYXNrOCBfX1UsIF9fbTI1NiBfX0EsIF9fbTI1NmkgX19DKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfdnBlcm1pbHZhcnBzMjU2X21hc2sgKChfX3Y4c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAgICAoX192OHNpKSBfX0MsCisgICAgICAgICAgICAgICAgICAgKF9fdjhzZikKKyAgICAgICAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19wcyAoKSwKKyAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX3Rlc3RfZXBpMzJfbWFzayAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbW1hc2s4KSBfX2J1aWx0aW5faWEzMl9wdGVzdG1kMTI4ICgoX192NHNpKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3Y0c2kpIF9fQiwKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfdGVzdF9lcGkzMl9tYXNrIChfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX21tYXNrOCkgX19idWlsdGluX2lhMzJfcHRlc3RtZDEyOCAoKF9fdjRzaSkgX19BLAorICAgICAgICAgICAgICAgICAoX192NHNpKSBfX0IsIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3Rlc3RfZXBpMzJfbWFzayAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbW1hc2s4KSBfX2J1aWx0aW5faWEzMl9wdGVzdG1kMjU2ICgoX192OHNpKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3Y4c2kpIF9fQiwKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfdGVzdF9lcGkzMl9tYXNrIChfX21tYXNrOCBfX1UsIF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX21tYXNrOCkgX19idWlsdGluX2lhMzJfcHRlc3RtZDI1NiAoKF9fdjhzaSkgX19BLAorICAgICAgICAgICAgICAgICAoX192OHNpKSBfX0IsIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX3Rlc3RfZXBpNjRfbWFzayAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbW1hc2s4KSBfX2J1aWx0aW5faWEzMl9wdGVzdG1xMTI4ICgoX192MmRpKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3YyZGkpIF9fQiwKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfdGVzdF9lcGk2NF9tYXNrIChfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX21tYXNrOCkgX19idWlsdGluX2lhMzJfcHRlc3RtcTEyOCAoKF9fdjJkaSkgX19BLAorICAgICAgICAgICAgICAgICAoX192MmRpKSBfX0IsIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3Rlc3RfZXBpNjRfbWFzayAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbW1hc2s4KSBfX2J1aWx0aW5faWEzMl9wdGVzdG1xMjU2ICgoX192NGRpKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3Y0ZGkpIF9fQiwKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfdGVzdF9lcGk2NF9tYXNrIChfX21tYXNrOCBfX1UsIF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX21tYXNrOCkgX19idWlsdGluX2lhMzJfcHRlc3RtcTI1NiAoKF9fdjRkaSkgX19BLAorICAgICAgICAgICAgICAgICAoX192NGRpKSBfX0IsIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX3Rlc3RuX2VwaTMyX21hc2sgKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX21tYXNrOCkgX19idWlsdGluX2lhMzJfcHRlc3RubWQxMjggKChfX3Y0c2kpIF9fQSwKKyAgICAgICAgICAgIChfX3Y0c2kpIF9fQiwKKyAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX3Rlc3RuX2VwaTMyX21hc2sgKF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbW1hc2s4KSBfX2J1aWx0aW5faWEzMl9wdGVzdG5tZDEyOCAoKF9fdjRzaSkgX19BLAorICAgICAgICAgICAgKF9fdjRzaSkgX19CLCBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl90ZXN0bl9lcGkzMl9tYXNrIChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tbWFzazgpIF9fYnVpbHRpbl9pYTMyX3B0ZXN0bm1kMjU2ICgoX192OHNpKSBfX0EsCisgICAgICAgICAgICAoX192OHNpKSBfX0IsCisgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza190ZXN0bl9lcGkzMl9tYXNrIChfX21tYXNrOCBfX1UsIF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX21tYXNrOCkgX19idWlsdGluX2lhMzJfcHRlc3RubWQyNTYgKChfX3Y4c2kpIF9fQSwKKyAgICAgICAgICAgIChfX3Y4c2kpIF9fQiwgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tbWFzazggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fdGVzdG5fZXBpNjRfbWFzayAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbW1hc2s4KSBfX2J1aWx0aW5faWEzMl9wdGVzdG5tcTEyOCAoKF9fdjJkaSkgX19BLAorICAgICAgICAgICAgKF9fdjJkaSkgX19CLAorICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfdGVzdG5fZXBpNjRfbWFzayAoX19tbWFzazggX19VLCBfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tbWFzazgpIF9fYnVpbHRpbl9pYTMyX3B0ZXN0bm1xMTI4ICgoX192MmRpKSBfX0EsCisgICAgICAgICAgICAoX192MmRpKSBfX0IsIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbW1hc2s4IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3Rlc3RuX2VwaTY0X21hc2sgKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX21tYXNrOCkgX19idWlsdGluX2lhMzJfcHRlc3RubXEyNTYgKChfX3Y0ZGkpIF9fQSwKKyAgICAgICAgICAgIChfX3Y0ZGkpIF9fQiwKKyAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX21tYXNrOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX3Rlc3RuX2VwaTY0X21hc2sgKF9fbW1hc2s4IF9fVSwgX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbW1hc2s4KSBfX2J1aWx0aW5faWEzMl9wdGVzdG5tcTI1NiAoKF9fdjRkaSkgX19BLAorICAgICAgICAgICAgKF9fdjRkaSkgX19CLCBfX1UpOworfQorCisKKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX3VucGFja2hpX2VwaTMyKF9fbTEyOGkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3NlbGVjdGRfMTI4KChfX21tYXNrOClfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzaSlfbW1fdW5wYWNraGlfZXBpMzIoX19BLCBfX0IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2kpX19XKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel91bnBhY2toaV9lcGkzMihfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3NlbGVjdGRfMTI4KChfX21tYXNrOClfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzaSlfbW1fdW5wYWNraGlfZXBpMzIoX19BLCBfX0IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2kpX21tX3NldHplcm9fc2kxMjgoKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza191bnBhY2toaV9lcGkzMihfX20yNTZpIF9fVywgX19tbWFzazggX19VLCBfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9zZWxlY3RkXzI1NigoX19tbWFzazgpX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2kpX21tMjU2X3VucGFja2hpX2VwaTMyKF9fQSwgX19CKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNpKV9fVyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfdW5wYWNraGlfZXBpMzIoX19tbWFzazggX19VLCBfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9zZWxlY3RkXzI1NigoX19tbWFzazgpX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2kpX21tMjU2X3VucGFja2hpX2VwaTMyKF9fQSwgX19CKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNpKV9tbTI1Nl9zZXR6ZXJvX3NpMjU2KCkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfdW5wYWNraGlfZXBpNjQoX19tMTI4aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfc2VsZWN0cV8xMjgoKF9fbW1hc2s4KV9fVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRpKV9tbV91bnBhY2toaV9lcGk2NChfX0EsIF9fQiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkaSlfX1cpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X3VucGFja2hpX2VwaTY0KF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfc2VsZWN0cV8xMjgoKF9fbW1hc2s4KV9fVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRpKV9tbV91bnBhY2toaV9lcGk2NChfX0EsIF9fQiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkaSlfbW1fc2V0emVyb19kaSgpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX3VucGFja2hpX2VwaTY0KF9fbTI1NmkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3NlbGVjdHFfMjU2KChfX21tYXNrOClfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkaSlfbW0yNTZfdW5wYWNraGlfZXBpNjQoX19BLCBfX0IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGkpX19XKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel91bnBhY2toaV9lcGk2NChfX21tYXNrOCBfX1UsIF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3NlbGVjdHFfMjU2KChfX21tYXNrOClfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkaSlfbW0yNTZfdW5wYWNraGlfZXBpNjQoX19BLCBfX0IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGkpX21tMjU2X3NldHplcm9fc2kyNTYoKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza191bnBhY2tsb19lcGkzMihfX20xMjhpIF9fVywgX19tbWFzazggX19VLCBfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9zZWxlY3RkXzEyOCgoX19tbWFzazgpX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2kpX21tX3VucGFja2xvX2VwaTMyKF9fQSwgX19CKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNpKV9fVyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfdW5wYWNrbG9fZXBpMzIoX19tbWFzazggX19VLCBfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9zZWxlY3RkXzEyOCgoX19tbWFzazgpX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2kpX21tX3VucGFja2xvX2VwaTMyKF9fQSwgX19CKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNpKV9tbV9zZXR6ZXJvX3NpMTI4KCkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfdW5wYWNrbG9fZXBpMzIoX19tMjU2aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfc2VsZWN0ZF8yNTYoKF9fbW1hc2s4KV9fVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNpKV9tbTI1Nl91bnBhY2tsb19lcGkzMihfX0EsIF9fQiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzaSlfX1cpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X3VucGFja2xvX2VwaTMyKF9fbW1hc2s4IF9fVSwgX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfc2VsZWN0ZF8yNTYoKF9fbW1hc2s4KV9fVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNpKV9tbTI1Nl91bnBhY2tsb19lcGkzMihfX0EsIF9fQiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzaSlfbW0yNTZfc2V0emVyb19zaTI1NigpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX3VucGFja2xvX2VwaTY0KF9fbTEyOGkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3NlbGVjdHFfMTI4KChfX21tYXNrOClfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkaSlfbW1fdW5wYWNrbG9fZXBpNjQoX19BLCBfX0IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGkpX19XKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel91bnBhY2tsb19lcGk2NChfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3NlbGVjdHFfMTI4KChfX21tYXNrOClfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkaSlfbW1fdW5wYWNrbG9fZXBpNjQoX19BLCBfX0IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGkpX21tX3NldHplcm9fZGkoKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza191bnBhY2tsb19lcGk2NChfX20yNTZpIF9fVywgX19tbWFzazggX19VLCBfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9zZWxlY3RxXzI1NigoX19tbWFzazgpX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGkpX21tMjU2X3VucGFja2xvX2VwaTY0KF9fQSwgX19CKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRpKV9fVyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfdW5wYWNrbG9fZXBpNjQoX19tbWFzazggX19VLCBfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9zZWxlY3RxXzI1NigoX19tbWFzazgpX19VLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGkpX21tMjU2X3VucGFja2xvX2VwaTY0KF9fQSwgX19CKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRpKV9tbTI1Nl9zZXR6ZXJvX3NpMjU2KCkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfc3JhX2VwaTMyIChfX20xMjhpIF9fVywgX19tbWFzazggX19VLCBfX20xMjhpIF9fQSwKKyAgICAgICAgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcHNyYWQxMjhfbWFzayAoKF9fdjRzaSkgX19BLAorICAgICAgICAgICAgIChfX3Y0c2kpIF9fQiwKKyAgICAgICAgICAgICAoX192NHNpKSBfX1csCisgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X3NyYV9lcGkzMiAoX19tbWFzazggX19VLCBfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcHNyYWQxMjhfbWFzayAoKF9fdjRzaSkgX19BLAorICAgICAgICAgICAgIChfX3Y0c2kpIF9fQiwKKyAgICAgICAgICAgICAoX192NHNpKQorICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX3NyYV9lcGkzMiAoX19tMjU2aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMjU2aSBfX0EsCisgICAgICAgICAgIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BzcmFkMjU2X21hc2sgKChfX3Y4c2kpIF9fQSwKKyAgICAgICAgICAgICAoX192NHNpKSBfX0IsCisgICAgICAgICAgICAgKF9fdjhzaSkgX19XLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9zcmFfZXBpMzIgKF9fbW1hc2s4IF9fVSwgX19tMjU2aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BzcmFkMjU2X21hc2sgKChfX3Y4c2kpIF9fQSwKKyAgICAgICAgICAgICAoX192NHNpKSBfX0IsCisgICAgICAgICAgICAgKF9fdjhzaSkKKyAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKKyNkZWZpbmUgX21tX21hc2tfc3JhaV9lcGkzMihXLCBVLCBBLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc3JhZGkxMjhfbWFzaygoX192NHNpKShfX20xMjhpKShBKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNpKShfX20xMjhpKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW1fbWFza3pfc3JhaV9lcGkzMihVLCBBLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc3JhZGkxMjhfbWFzaygoX192NHNpKShfX20xMjhpKShBKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNpKV9tbV9zZXR6ZXJvX3NpMTI4KCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21hc2tfc3JhaV9lcGkzMihXLCBVLCBBLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wc3JhZGkyNTZfbWFzaygoX192OHNpKShfX20yNTZpKShBKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNpKShfX20yNTZpKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfbWFza3pfc3JhaV9lcGkzMihVLCBBLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wc3JhZGkyNTZfbWFzaygoX192OHNpKShfX20yNTZpKShBKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNpKV9tbTI1Nl9zZXR6ZXJvX3NpMjU2KCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc3JhX2VwaTY0IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcHNyYXExMjhfbWFzayAoKF9fdjJkaSkgX19BLAorICAgICAgICAgICAgIChfX3YyZGkpIF9fQiwKKyAgICAgICAgICAgICAoX192MmRpKQorICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX2RpICgpLAorICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfc3JhX2VwaTY0IChfX20xMjhpIF9fVywgX19tbWFzazggX19VLCBfX20xMjhpIF9fQSwKKyAgICAgICAgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcHNyYXExMjhfbWFzayAoKF9fdjJkaSkgX19BLAorICAgICAgICAgICAgIChfX3YyZGkpIF9fQiwKKyAgICAgICAgICAgICAoX192MmRpKSBfX1csCisgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X3NyYV9lcGk2NCAoX19tbWFzazggX19VLCBfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcHNyYXExMjhfbWFzayAoKF9fdjJkaSkgX19BLAorICAgICAgICAgICAgIChfX3YyZGkpIF9fQiwKKyAgICAgICAgICAgICAoX192MmRpKQorICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX2RpICgpLAorICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9zcmFfZXBpNjQgKF9fbTI1NmkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wc3JhcTI1Nl9tYXNrICgoX192NGRpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjJkaSkgX19CLAorICAgICAgICAgICAgIChfX3Y0ZGkpCisgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19zcmFfZXBpNjQgKF9fbTI1NmkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTI1NmkgX19BLAorICAgICAgICAgICBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wc3JhcTI1Nl9tYXNrICgoX192NGRpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjJkaSkgX19CLAorICAgICAgICAgICAgIChfX3Y0ZGkpIF9fVywKKyAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfc3JhX2VwaTY0IChfX21tYXNrOCBfX1UsIF9fbTI1NmkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wc3JhcTI1Nl9tYXNrICgoX192NGRpKSBfX0EsCisgICAgICAgICAgICAgKF9fdjJkaSkgX19CLAorICAgICAgICAgICAgIChfX3Y0ZGkpCisgICAgICAgICAgICAgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCisjZGVmaW5lIF9tbV9zcmFpX2VwaTY0KEEsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BzcmFxaTEyOF9tYXNrKChfX3YyZGkpKF9fbTEyOGkpKEEpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGkpX21tX3NldHplcm9fZGkoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrX3NyYWlfZXBpNjQoVywgVSwgQSwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHNyYXFpMTI4X21hc2soKF9fdjJkaSkoX19tMTI4aSkoQSksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkaSkoX19tMTI4aSkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2t6X3NyYWlfZXBpNjQoVSwgQSwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHNyYXFpMTI4X21hc2soKF9fdjJkaSkoX19tMTI4aSkoQSksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkaSlfbW1fc2V0emVyb19zaTEyOCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSkpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9zcmFpX2VwaTY0KEEsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BzcmFxaTI1Nl9tYXNrKChfX3Y0ZGkpKF9fbTI1NmkpKEEpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGkpX21tMjU2X3NldHplcm9fc2kyNTYoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9tYXNrX3NyYWlfZXBpNjQoVywgVSwgQSwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHNyYXFpMjU2X21hc2soKF9fdjRkaSkoX19tMjU2aSkoQSksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkaSkoX19tMjU2aSkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21hc2t6X3NyYWlfZXBpNjQoVSwgQSwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHNyYXFpMjU2X21hc2soKF9fdjRkaSkoX19tMjU2aSkoQSksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkaSlfbW0yNTZfc2V0emVyb19zaTI1NigpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSkpOyB9KQorCisjZGVmaW5lIF9tbV90ZXJuYXJ5bG9naWNfZXBpMzIoQSwgQiwgQywgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHRlcm5sb2dkMTI4X21hc2soKF9fdjRzaSkoX19tMTI4aSkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzaSkoX19tMTI4aSkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzaSkoX19tMTI4aSkoQyksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsgfSkKKworI2RlZmluZSBfbW1fbWFza190ZXJuYXJ5bG9naWNfZXBpMzIoQSwgVSwgQiwgQywgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHRlcm5sb2dkMTI4X21hc2soKF9fdjRzaSkoX19tMTI4aSkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzaSkoX19tMTI4aSkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzaSkoX19tMTI4aSkoQyksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2t6X3Rlcm5hcnlsb2dpY19lcGkzMihVLCBBLCBCLCBDLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wdGVybmxvZ2QxMjhfbWFza3ooKF9fdjRzaSkoX19tMTI4aSkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2kpKF9fbTEyOGkpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNpKShfX20xMjhpKShDKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X3Rlcm5hcnlsb2dpY19lcGkzMihBLCBCLCBDLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wdGVybmxvZ2QyNTZfbWFzaygoX192OHNpKShfX20yNTZpKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNpKShfX20yNTZpKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNpKShfX20yNTZpKShDKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9tYXNrX3Rlcm5hcnlsb2dpY19lcGkzMihBLCBVLCBCLCBDLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wdGVybmxvZ2QyNTZfbWFzaygoX192OHNpKShfX20yNTZpKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNpKShfX20yNTZpKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNpKShfX20yNTZpKShDKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfbWFza3pfdGVybmFyeWxvZ2ljX2VwaTMyKFUsIEEsIEIsIEMsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3B0ZXJubG9nZDI1Nl9tYXNreigoX192OHNpKShfX20yNTZpKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzaSkoX19tMjU2aSkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2kpKF9fbTI1NmkpKEMpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW1fdGVybmFyeWxvZ2ljX2VwaTY0KEEsIEIsIEMsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3B0ZXJubG9ncTEyOF9tYXNrKChfX3YyZGkpKF9fbTEyOGkpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGkpKF9fbTEyOGkpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGkpKF9fbTEyOGkpKEMpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2tfdGVybmFyeWxvZ2ljX2VwaTY0KEEsIFUsIEIsIEMsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3B0ZXJubG9ncTEyOF9tYXNrKChfX3YyZGkpKF9fbTEyOGkpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGkpKF9fbTEyOGkpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGkpKF9fbTEyOGkpKEMpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSkpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrel90ZXJuYXJ5bG9naWNfZXBpNjQoVSwgQSwgQiwgQywgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHRlcm5sb2dxMTI4X21hc2t6KChfX3YyZGkpKF9fbTEyOGkpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRpKShfX20xMjhpKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkaSkoX19tMTI4aSkoQyksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSkpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl90ZXJuYXJ5bG9naWNfZXBpNjQoQSwgQiwgQywgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHRlcm5sb2dxMjU2X21hc2soKF9fdjRkaSkoX19tMjU2aSkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkaSkoX19tMjU2aSkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkaSkoX19tMjU2aSkoQyksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsgfSkKKworI2RlZmluZSBfbW0yNTZfbWFza190ZXJuYXJ5bG9naWNfZXBpNjQoQSwgVSwgQiwgQywgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHRlcm5sb2dxMjU2X21hc2soKF9fdjRkaSkoX19tMjU2aSkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkaSkoX19tMjU2aSkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkaSkoX19tMjU2aSkoQyksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21hc2t6X3Rlcm5hcnlsb2dpY19lcGk2NChVLCBBLCBCLCBDLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wdGVybmxvZ3EyNTZfbWFza3ooKF9fdjRkaSkoX19tMjU2aSkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGkpKF9fbTI1NmkpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRpKShfX20yNTZpKShDKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKworCisjZGVmaW5lIF9tbTI1Nl9zaHVmZmxlX2YzMng0KEEsIEIsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTYpX19idWlsdGluX2lhMzJfc2h1Zl9mMzJ4NF8yNTZfbWFzaygoX192OHNmKShfX20yNTYpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNmKShfX20yNTYpKEIpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNmKV9tbTI1Nl9zZXR6ZXJvX3BzKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21hc2tfc2h1ZmZsZV9mMzJ4NChXLCBVLCBBLCBCLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2KV9fYnVpbHRpbl9pYTMyX3NodWZfZjMyeDRfMjU2X21hc2soKF9fdjhzZikoX19tMjU2KShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzZikoX19tMjU2KShCKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzZikoX19tMjU2KShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21hc2t6X3NodWZmbGVfZjMyeDQoVSwgQSwgQiwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NilfX2J1aWx0aW5faWEzMl9zaHVmX2YzMng0XzI1Nl9tYXNrKChfX3Y4c2YpKF9fbTI1NikoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2YpKF9fbTI1NikoQiksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2YpX21tMjU2X3NldHplcm9fcHMoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X3NodWZmbGVfZjY0eDIoQSwgQiwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmQpX19idWlsdGluX2lhMzJfc2h1Zl9mNjR4Ml8yNTZfbWFzaygoX192NGRmKShfX20yNTZkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGYpKF9fbTI1NmQpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGYpX21tMjU2X3NldHplcm9fcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21hc2tfc2h1ZmZsZV9mNjR4MihXLCBVLCBBLCBCLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2ZClfX2J1aWx0aW5faWEzMl9zaHVmX2Y2NHgyXzI1Nl9tYXNrKChfX3Y0ZGYpKF9fbTI1NmQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkZikoX19tMjU2ZCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkZikoX19tMjU2ZCkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfbWFza3pfc2h1ZmZsZV9mNjR4MihVLCBBLCBCLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2ZClfX2J1aWx0aW5faWEzMl9zaHVmX2Y2NHgyXzI1Nl9tYXNrKChfX3Y0ZGYpKF9fbTI1NmQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkZikoX19tMjU2ZCkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkZilfbW0yNTZfc2V0emVyb19wZCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X3NodWZmbGVfaTMyeDQoQSwgQiwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmkpX19idWlsdGluX2lhMzJfc2h1Zl9pMzJ4NF8yNTZfbWFzaygoX192OHNpKShfX20yNTZpKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2kpKF9fbTI1NmkpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2kpX21tMjU2X3NldHplcm9fc2kyNTYoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21hc2tfc2h1ZmZsZV9pMzJ4NChXLCBVLCBBLCBCLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9zaHVmX2kzMng0XzI1Nl9tYXNrKChfX3Y4c2kpKF9fbTI1NmkpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzaSkoX19tMjU2aSkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzaSkoX19tMjU2aSkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfbWFza3pfc2h1ZmZsZV9pMzJ4NChVLCBBLCBCLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9zaHVmX2kzMng0XzI1Nl9tYXNrKChfX3Y4c2kpKF9fbTI1NmkpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzaSkoX19tMjU2aSkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzaSlfbW0yNTZfc2V0emVyb19zaTI1NigpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X3NodWZmbGVfaTY0eDIoQSwgQiwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmkpX19idWlsdGluX2lhMzJfc2h1Zl9pNjR4Ml8yNTZfbWFzaygoX192NGRpKShfX20yNTZpKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGkpKF9fbTI1NmkpKEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGkpX21tMjU2X3NldHplcm9fc2kyNTYoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21hc2tfc2h1ZmZsZV9pNjR4MihXLCBVLCBBLCBCLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9zaHVmX2k2NHgyXzI1Nl9tYXNrKChfX3Y0ZGkpKF9fbTI1NmkpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkaSkoX19tMjU2aSkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkaSkoX19tMjU2aSkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfbWFza3pfc2h1ZmZsZV9pNjR4MihVLCBBLCBCLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9zaHVmX2k2NHgyXzI1Nl9tYXNrKChfX3Y0ZGkpKF9fbTI1NmkpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkaSkoX19tMjU2aSkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkaSlfbW0yNTZfc2V0emVyb19zaTI1NigpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2tfc2h1ZmZsZV9wZChXLCBVLCBBLCBCLCBNKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGQpX19idWlsdGluX2lhMzJfc2VsZWN0cGRfMTI4KChfX21tYXNrOCkoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpX21tX3NodWZmbGVfcGQoKEEpLCAoQiksIChNKSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fbTEyOGQpKFcpKTsgfSkKKworI2RlZmluZSBfbW1fbWFza3pfc2h1ZmZsZV9wZChVLCBBLCBCLCBNKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGQpX19idWlsdGluX2lhMzJfc2VsZWN0cGRfMTI4KChfX21tYXNrOCkoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpX21tX3NodWZmbGVfcGQoKEEpLCAoQiksIChNKSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpX21tX3NldHplcm9fcGQoKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21hc2tfc2h1ZmZsZV9wZChXLCBVLCBBLCBCLCBNKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmQpX19idWlsdGluX2lhMzJfc2VsZWN0cGRfMjU2KChfX21tYXNrOCkoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGYpX21tMjU2X3NodWZmbGVfcGQoKEEpLCAoQiksIChNKSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGYpKF9fbTI1NmQpKFcpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfbWFza3pfc2h1ZmZsZV9wZChVLCBBLCBCLCBNKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmQpX19idWlsdGluX2lhMzJfc2VsZWN0cGRfMjU2KChfX21tYXNrOCkoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGYpX21tMjU2X3NodWZmbGVfcGQoKEEpLCAoQiksIChNKSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGYpX21tMjU2X3NldHplcm9fcGQoKSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2tfc2h1ZmZsZV9wcyhXLCBVLCBBLCBCLCBNKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOClfX2J1aWx0aW5faWEzMl9zZWxlY3Rwc18xMjgoKF9fbW1hc2s4KShVKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKV9tbV9zaHVmZmxlX3BzKChBKSwgKEIpLCAoTSkpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpKF9fbTEyOCkoVykpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrel9zaHVmZmxlX3BzKFUsIEEsIEIsIE0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX3NlbGVjdHBzXzEyOCgoX19tbWFzazgpKFUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpX21tX3NodWZmbGVfcHMoKEEpLCAoQiksIChNKSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZilfbW1fc2V0emVyb19wcygpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfbWFza19zaHVmZmxlX3BzKFcsIFUsIEEsIEIsIE0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2KV9fYnVpbHRpbl9pYTMyX3NlbGVjdHBzXzI1NigoX19tbWFzazgpKFUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2YpX21tMjU2X3NodWZmbGVfcHMoKEEpLCAoQiksIChNKSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzZikoX19tMjU2KShXKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21hc2t6X3NodWZmbGVfcHMoVSwgQSwgQiwgTSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTYpX19idWlsdGluX2lhMzJfc2VsZWN0cHNfMjU2KChfX21tYXNrOCkoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzZilfbW0yNTZfc2h1ZmZsZV9wcygoQSksIChCKSwgKE0pKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNmKV9tbTI1Nl9zZXR6ZXJvX3BzKCkpOyB9KQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3JzcXJ0MTRfcGQgKF9fbTEyOGQgX19BKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3JzcXJ0MTRwZDEyOF9tYXNrICgoX192MmRmKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3YyZGYpCisgICAgICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3BkICgpLAorICAgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX3JzcXJ0MTRfcGQgKF9fbTEyOGQgX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOGQgX19BKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3JzcXJ0MTRwZDEyOF9tYXNrICgoX192MmRmKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3YyZGYpIF9fVywKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X3JzcXJ0MTRfcGQgKF9fbW1hc2s4IF9fVSwgX19tMTI4ZCBfX0EpCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfcnNxcnQxNHBkMTI4X21hc2sgKChfX3YyZGYpIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjJkZikKKyAgICAgICAgICAgICAgICAgX21tX3NldHplcm9fcGQgKCksCisgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9yc3FydDE0X3BkIChfX20yNTZkIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9yc3FydDE0cGQyNTZfbWFzayAoKF9fdjRkZikgX19BLAorICAgICAgICAgICAgICAgICAoX192NGRmKQorICAgICAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19wZCAoKSwKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19yc3FydDE0X3BkIChfX20yNTZkIF9fVywgX19tbWFzazggX19VLCBfX20yNTZkIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9yc3FydDE0cGQyNTZfbWFzayAoKF9fdjRkZikgX19BLAorICAgICAgICAgICAgICAgICAoX192NGRmKSBfX1csCisgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9yc3FydDE0X3BkIChfX21tYXNrOCBfX1UsIF9fbTI1NmQgX19BKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX3JzcXJ0MTRwZDI1Nl9tYXNrICgoX192NGRmKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3Y0ZGYpCisgICAgICAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3BkICgpLAorICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9yc3FydDE0X3BzIChfX20xMjggX19BKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfcnNxcnQxNHBzMTI4X21hc2sgKChfX3Y0c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192NHNmKQorICAgICAgICAgICAgICAgIF9tbV9zZXR6ZXJvX3BzICgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19yc3FydDE0X3BzIChfX20xMjggX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOCBfX0EpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9yc3FydDE0cHMxMjhfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgIChfX3Y0c2YpIF9fVywKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9yc3FydDE0X3BzIChfX21tYXNrOCBfX1UsIF9fbTEyOCBfX0EpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9yc3FydDE0cHMxMjhfbWFzayAoKF9fdjRzZikgX19BLAorICAgICAgICAgICAgICAgIChfX3Y0c2YpCisgICAgICAgICAgICAgICAgX21tX3NldHplcm9fcHMgKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfcnNxcnQxNF9wcyAoX19tMjU2IF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX3JzcXJ0MTRwczI1Nl9tYXNrICgoX192OHNmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjhzZikKKyAgICAgICAgICAgICAgICBfbW0yNTZfc2V0emVyb19wcyAoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfcnNxcnQxNF9wcyAoX19tMjU2IF9fVywgX19tbWFzazggX19VLCBfX20yNTYgX19BKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfcnNxcnQxNHBzMjU2X21hc2sgKChfX3Y4c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192OHNmKSBfX1csCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfcnNxcnQxNF9wcyAoX19tbWFzazggX19VLCBfX20yNTYgX19BKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfcnNxcnQxNHBzMjU2X21hc2sgKChfX3Y4c2YpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192OHNmKQorICAgICAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3BzICgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2Jyb2FkY2FzdF9mMzJ4NCAoX19tMTI4IF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX2Jyb2FkY2FzdGYzMng0XzI1Nl9tYXNrICgoX192NHNmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjhzZilfbW0yNTZfdW5kZWZpbmVkX3BkICgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19icm9hZGNhc3RfZjMyeDQgKF9fbTI1NiBfX08sIF9fbW1hc2s4IF9fTSwgX19tMTI4IF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX2Jyb2FkY2FzdGYzMng0XzI1Nl9tYXNrICgoX192NHNmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjhzZikgX19PLAorICAgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9icm9hZGNhc3RfZjMyeDQgKF9fbW1hc2s4IF9fTSwgX19tMTI4IF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX2Jyb2FkY2FzdGYzMng0XzI1Nl9tYXNrICgoX192NHNmKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjhzZikgX21tMjU2X3NldHplcm9fcHMgKCksCisgICAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9icm9hZGNhc3RfaTMyeDQgKF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX2Jyb2FkY2FzdGkzMng0XzI1Nl9tYXNrICgoX192NHNpKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3Y4c2kpX21tMjU2X3VuZGVmaW5lZF9zaTI1NiAoKSwKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19icm9hZGNhc3RfaTMyeDQgKF9fbTI1NmkgX19PLCBfX21tYXNrOCBfX00sIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX2Jyb2FkY2FzdGkzMng0XzI1Nl9tYXNrICgoX192NHNpKSBfX0EsCisgICAgICAgICAgICAgICAgIChfX3Y4c2kpCisgICAgICAgICAgICAgICAgIF9fTywgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9icm9hZGNhc3RfaTMyeDQgKF9fbW1hc2s4IF9fTSwgX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfYnJvYWRjYXN0aTMyeDRfMjU2X21hc2sgKChfX3Y0c2kpCisgICAgICAgICAgICAgICAgIF9fQSwKKyAgICAgICAgICAgICAgICAgKF9fdjhzaSkgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19icm9hZGNhc3RzZF9wZCAoX19tMjU2ZCBfX08sIF9fbW1hc2s4IF9fTSwgX19tMTI4ZCBfX0EpCit7CisgIHJldHVybiAoX19tMjU2ZClfX2J1aWx0aW5faWEzMl9zZWxlY3RwZF8yNTYoX19NLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGYpIF9tbTI1Nl9icm9hZGNhc3RzZF9wZChfX0EpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGYpIF9fTyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfYnJvYWRjYXN0c2RfcGQgKF9fbW1hc2s4IF9fTSwgX19tMTI4ZCBfX0EpCit7CisgIHJldHVybiAoX19tMjU2ZClfX2J1aWx0aW5faWEzMl9zZWxlY3RwZF8yNTYoX19NLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGYpIF9tbTI1Nl9icm9hZGNhc3RzZF9wZChfX0EpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGYpIF9tbTI1Nl9zZXR6ZXJvX3BkKCkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19icm9hZGNhc3Rzc19wcyAoX19tMTI4IF9fTywgX19tbWFzazggX19NLCBfX20xMjggX19BKQoreworICByZXR1cm4gKF9fbTEyOClfX2J1aWx0aW5faWEzMl9zZWxlY3Rwc18xMjgoX19NLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikgX21tX2Jyb2FkY2FzdHNzX3BzKF9fQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKSBfX08pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfYnJvYWRjYXN0c3NfcHMgKF9fbW1hc2s4IF9fTSwgX19tMTI4IF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjgpX19idWlsdGluX2lhMzJfc2VsZWN0cHNfMTI4KF9fTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpIF9tbV9icm9hZGNhc3Rzc19wcyhfX0EpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikgX21tX3NldHplcm9fcHMoKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2Jyb2FkY2FzdHNzX3BzIChfX20yNTYgX19PLCBfX21tYXNrOCBfX00sIF9fbTEyOCBfX0EpCit7CisgIHJldHVybiAoX19tMjU2KV9fYnVpbHRpbl9pYTMyX3NlbGVjdHBzXzI1NihfX00sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNmKSBfbW0yNTZfYnJvYWRjYXN0c3NfcHMoX19BKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2YpIF9fTyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9icm9hZGNhc3Rzc19wcyAoX19tbWFzazggX19NLCBfX20xMjggX19BKQoreworICByZXR1cm4gKF9fbTI1NilfX2J1aWx0aW5faWEzMl9zZWxlY3Rwc18yNTYoX19NLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzZikgX21tMjU2X2Jyb2FkY2FzdHNzX3BzKF9fQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNmKSBfbW0yNTZfc2V0emVyb19wcygpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2Jyb2FkY2FzdGRfZXBpMzIgKF9fbTEyOGkgX19PLCBfX21tYXNrOCBfX00sIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfc2VsZWN0ZF8xMjgoX19NLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzaSkgX21tX2Jyb2FkY2FzdGRfZXBpMzIoX19BKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2kpIF9fTyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfYnJvYWRjYXN0ZF9lcGkzMiAoX19tbWFzazggX19NLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3NlbGVjdGRfMTI4KF9fTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2kpIF9tbV9icm9hZGNhc3RkX2VwaTMyKF9fQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNpKSBfbW1fc2V0emVyb19zaTEyOCgpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2Jyb2FkY2FzdGRfZXBpMzIgKF9fbTI1NmkgX19PLCBfX21tYXNrOCBfX00sIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfc2VsZWN0ZF8yNTYoX19NLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzaSkgX21tMjU2X2Jyb2FkY2FzdGRfZXBpMzIoX19BKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2kpIF9fTyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfYnJvYWRjYXN0ZF9lcGkzMiAoX19tbWFzazggX19NLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3NlbGVjdGRfMjU2KF9fTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2kpIF9tbTI1Nl9icm9hZGNhc3RkX2VwaTMyKF9fQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNpKSBfbW0yNTZfc2V0emVyb19zaTI1NigpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2Jyb2FkY2FzdHFfZXBpNjQgKF9fbTEyOGkgX19PLCBfX21tYXNrOCBfX00sIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfc2VsZWN0cV8xMjgoX19NLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkaSkgX21tX2Jyb2FkY2FzdHFfZXBpNjQoX19BKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGkpIF9fTyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfYnJvYWRjYXN0cV9lcGk2NCAoX19tbWFzazggX19NLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3NlbGVjdHFfMTI4KF9fTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGkpIF9tbV9icm9hZGNhc3RxX2VwaTY0KF9fQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRpKSBfbW1fc2V0emVyb19zaTEyOCgpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2Jyb2FkY2FzdHFfZXBpNjQgKF9fbTI1NmkgX19PLCBfX21tYXNrOCBfX00sIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfc2VsZWN0cV8yNTYoX19NLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkaSkgX21tMjU2X2Jyb2FkY2FzdHFfZXBpNjQoX19BKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGkpIF9fTyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfYnJvYWRjYXN0cV9lcGk2NCAoX19tbWFzazggX19NLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3NlbGVjdHFfMjU2KF9fTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGkpIF9tbTI1Nl9icm9hZGNhc3RxX2VwaTY0KF9fQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRpKSBfbW0yNTZfc2V0emVyb19zaTI1NigpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jdnRzZXBpMzJfZXBpOCAoX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnNkYjEyOF9tYXNrICgoX192NHNpKSBfX0EsCisgICAgICAgICAgICAgICAoX192MTZxaSlfbW1fdW5kZWZpbmVkX3NpMTI4KCksCisgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2N2dHNlcGkzMl9lcGk4IChfX20xMjhpIF9fTywgX19tbWFzazggX19NLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92c2RiMTI4X21hc2sgKChfX3Y0c2kpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3YxNnFpKSBfX08sIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfY3Z0c2VwaTMyX2VwaTggKF9fbW1hc2s4IF9fTSwgX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnNkYjEyOF9tYXNrICgoX192NHNpKSBfX0EsCisgICAgICAgICAgICAgICAoX192MTZxaSkgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfY3Z0c2VwaTMyX3N0b3JldV9lcGk4ICh2b2lkICogX19QLCBfX21tYXNrOCBfX00sIF9fbTEyOGkgX19BKQoreworICBfX2J1aWx0aW5faWEzMl9wbW92c2RiMTI4bWVtX21hc2sgKChfX3YxNnFpICopIF9fUCwgKF9fdjRzaSkgX19BLCBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2N2dHNlcGkzMl9lcGk4IChfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92c2RiMjU2X21hc2sgKChfX3Y4c2kpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3YxNnFpKV9tbV91bmRlZmluZWRfc2kxMjgoKSwKKyAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfY3Z0c2VwaTMyX2VwaTggKF9fbTEyOGkgX19PLCBfX21tYXNrOCBfX00sIF9fbTI1NmkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3ZzZGIyNTZfbWFzayAoKF9fdjhzaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjE2cWkpIF9fTywgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9jdnRzZXBpMzJfZXBpOCAoX19tbWFzazggX19NLCBfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92c2RiMjU2X21hc2sgKChfX3Y4c2kpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3YxNnFpKSBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jdnRzZXBpMzJfc3RvcmV1X2VwaTggKHZvaWQgKiBfX1AsIF9fbW1hc2s4IF9fTSwgX19tMjU2aSBfX0EpCit7CisgIF9fYnVpbHRpbl9pYTMyX3Btb3ZzZGIyNTZtZW1fbWFzayAoKF9fdjE2cWkgKikgX19QLCAoX192OHNpKSBfX0EsIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY3Z0c2VwaTMyX2VwaTE2IChfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92c2R3MTI4X21hc2sgKChfX3Y0c2kpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3Y4aGkpX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2N2dHNlcGkzMl9lcGkxNiAoX19tMTI4aSBfX08sIF9fbW1hc2s4IF9fTSwgX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnNkdzEyOF9tYXNrICgoX192NHNpKSBfX0EsCisgICAgICAgICAgICAgICAoX192OGhpKV9fTywKKyAgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfY3Z0c2VwaTMyX2VwaTE2IChfX21tYXNrOCBfX00sIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3ZzZHcxMjhfbWFzayAoKF9fdjRzaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjhoaSkgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfY3Z0c2VwaTMyX3N0b3JldV9lcGkxNiAodm9pZCAqIF9fUCwgX19tbWFzazggX19NLCBfX20xMjhpIF9fQSkKK3sKKyAgX19idWlsdGluX2lhMzJfcG1vdnNkdzEyOG1lbV9tYXNrICgoX192OGhpICopIF9fUCwgKF9fdjRzaSkgX19BLCBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2N2dHNlcGkzMl9lcGkxNiAoX19tMjU2aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnNkdzI1Nl9tYXNrICgoX192OHNpKSBfX0EsCisgICAgICAgICAgICAgICAoX192OGhpKV9tbV91bmRlZmluZWRfc2kxMjgoKSwKKyAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfY3Z0c2VwaTMyX2VwaTE2IChfX20xMjhpIF9fTywgX19tbWFzazggX19NLCBfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92c2R3MjU2X21hc2sgKChfX3Y4c2kpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3Y4aGkpIF9fTywgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9jdnRzZXBpMzJfZXBpMTYgKF9fbW1hc2s4IF9fTSwgX19tMjU2aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnNkdzI1Nl9tYXNrICgoX192OHNpKSBfX0EsCisgICAgICAgICAgICAgICAoX192OGhpKSBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jdnRzZXBpMzJfc3RvcmV1X2VwaTE2ICh2b2lkICogX19QLCBfX21tYXNrOCBfX00sIF9fbTI1NmkgX19BKQoreworICBfX2J1aWx0aW5faWEzMl9wbW92c2R3MjU2bWVtX21hc2sgKChfX3Y4aGkgKikgX19QLCAoX192OHNpKSBfX0EsIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY3Z0c2VwaTY0X2VwaTggKF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3ZzcWIxMjhfbWFzayAoKF9fdjJkaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjE2cWkpX21tX3VuZGVmaW5lZF9zaTEyOCgpLAorICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jdnRzZXBpNjRfZXBpOCAoX19tMTI4aSBfX08sIF9fbW1hc2s4IF9fTSwgX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnNxYjEyOF9tYXNrICgoX192MmRpKSBfX0EsCisgICAgICAgICAgICAgICAoX192MTZxaSkgX19PLCBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2N2dHNlcGk2NF9lcGk4IChfX21tYXNrOCBfX00sIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3ZzcWIxMjhfbWFzayAoKF9fdjJkaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjE2cWkpIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2N2dHNlcGk2NF9zdG9yZXVfZXBpOCAodm9pZCAqIF9fUCwgX19tbWFzazggX19NLCBfX20xMjhpIF9fQSkKK3sKKyAgX19idWlsdGluX2lhMzJfcG1vdnNxYjEyOG1lbV9tYXNrICgoX192MTZxaSAqKSBfX1AsIChfX3YyZGkpIF9fQSwgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9jdnRzZXBpNjRfZXBpOCAoX19tMjU2aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnNxYjI1Nl9tYXNrICgoX192NGRpKSBfX0EsCisgICAgICAgICAgICAgICAoX192MTZxaSlfbW1fdW5kZWZpbmVkX3NpMTI4KCksCisgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2N2dHNlcGk2NF9lcGk4IChfX20xMjhpIF9fTywgX19tbWFzazggX19NLCBfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92c3FiMjU2X21hc2sgKChfX3Y0ZGkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3YxNnFpKSBfX08sIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfY3Z0c2VwaTY0X2VwaTggKF9fbW1hc2s4IF9fTSwgX19tMjU2aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnNxYjI1Nl9tYXNrICgoX192NGRpKSBfX0EsCisgICAgICAgICAgICAgICAoX192MTZxaSkgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfY3Z0c2VwaTY0X3N0b3JldV9lcGk4ICh2b2lkICogX19QLCBfX21tYXNrOCBfX00sIF9fbTI1NmkgX19BKQoreworICBfX2J1aWx0aW5faWEzMl9wbW92c3FiMjU2bWVtX21hc2sgKChfX3YxNnFpICopIF9fUCwgKF9fdjRkaSkgX19BLCBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2N2dHNlcGk2NF9lcGkzMiAoX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnNxZDEyOF9tYXNrICgoX192MmRpKSBfX0EsCisgICAgICAgICAgICAgICAoX192NHNpKV9tbV91bmRlZmluZWRfc2kxMjgoKSwKKyAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfY3Z0c2VwaTY0X2VwaTMyIChfX20xMjhpIF9fTywgX19tbWFzazggX19NLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92c3FkMTI4X21hc2sgKChfX3YyZGkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3Y0c2kpIF9fTywgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9jdnRzZXBpNjRfZXBpMzIgKF9fbW1hc2s4IF9fTSwgX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnNxZDEyOF9tYXNrICgoX192MmRpKSBfX0EsCisgICAgICAgICAgICAgICAoX192NHNpKSBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jdnRzZXBpNjRfc3RvcmV1X2VwaTMyICh2b2lkICogX19QLCBfX21tYXNrOCBfX00sIF9fbTEyOGkgX19BKQoreworICBfX2J1aWx0aW5faWEzMl9wbW92c3FkMTI4bWVtX21hc2sgKChfX3Y0c2kgKikgX19QLCAoX192MmRpKSBfX0EsIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY3Z0c2VwaTY0X2VwaTMyIChfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92c3FkMjU2X21hc2sgKChfX3Y0ZGkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3Y0c2kpX21tX3VuZGVmaW5lZF9zaTEyOCgpLAorICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jdnRzZXBpNjRfZXBpMzIgKF9fbTEyOGkgX19PLCBfX21tYXNrOCBfX00sIF9fbTI1NmkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3ZzcWQyNTZfbWFzayAoKF9fdjRkaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjRzaSlfX08sCisgICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X2N2dHNlcGk2NF9lcGkzMiAoX19tbWFzazggX19NLCBfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92c3FkMjU2X21hc2sgKChfX3Y0ZGkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3Y0c2kpIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2N2dHNlcGk2NF9zdG9yZXVfZXBpMzIgKHZvaWQgKiBfX1AsIF9fbW1hc2s4IF9fTSwgX19tMjU2aSBfX0EpCit7CisgIF9fYnVpbHRpbl9pYTMyX3Btb3ZzcWQyNTZtZW1fbWFzayAoKF9fdjRzaSAqKSBfX1AsIChfX3Y0ZGkpIF9fQSwgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jdnRzZXBpNjRfZXBpMTYgKF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3ZzcXcxMjhfbWFzayAoKF9fdjJkaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjhoaSlfbW1fdW5kZWZpbmVkX3NpMTI4KCksCisgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2N2dHNlcGk2NF9lcGkxNiAoX19tMTI4aSBfX08sIF9fbW1hc2s4IF9fTSwgX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnNxdzEyOF9tYXNrICgoX192MmRpKSBfX0EsCisgICAgICAgICAgICAgICAoX192OGhpKSBfX08sIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfY3Z0c2VwaTY0X2VwaTE2IChfX21tYXNrOCBfX00sIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3ZzcXcxMjhfbWFzayAoKF9fdjJkaSkgX19BLAorICAgICAgICAgICAgICAgKF9fdjhoaSkgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfY3Z0c2VwaTY0X3N0b3JldV9lcGkxNiAodm9pZCAqIF9fUCwgX19tbWFzazggX19NLCBfX20xMjhpIF9fQSkKK3sKKyAgX19idWlsdGluX2lhMzJfcG1vdnNxdzEyOG1lbV9tYXNrICgoX192OGhpICopIF9fUCwgKF9fdjJkaSkgX19BLCBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2N2dHNlcGk2NF9lcGkxNiAoX19tMjU2aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnNxdzI1Nl9tYXNrICgoX192NGRpKSBfX0EsCisgICAgICAgICAgICAgICAoX192OGhpKV9tbV91bmRlZmluZWRfc2kxMjgoKSwKKyAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfY3Z0c2VwaTY0X2VwaTE2IChfX20xMjhpIF9fTywgX19tbWFzazggX19NLCBfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92c3F3MjU2X21hc2sgKChfX3Y0ZGkpIF9fQSwKKyAgICAgICAgICAgICAgIChfX3Y4aGkpIF9fTywgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9jdnRzZXBpNjRfZXBpMTYgKF9fbW1hc2s4IF9fTSwgX19tMjU2aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnNxdzI1Nl9tYXNrICgoX192NGRpKSBfX0EsCisgICAgICAgICAgICAgICAoX192OGhpKSBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jdnRzZXBpNjRfc3RvcmV1X2VwaTE2ICh2b2lkICogX19QLCBfX21tYXNrOCBfX00sIF9fbTI1NmkgX19BKQoreworICBfX2J1aWx0aW5faWEzMl9wbW92c3F3MjU2bWVtX21hc2sgKChfX3Y4aGkgKikgX19QLCAoX192NGRpKSBfX0EsIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY3Z0dXNlcGkzMl9lcGk4IChfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92dXNkYjEyOF9tYXNrICgoX192NHNpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjE2cWkpX21tX3VuZGVmaW5lZF9zaTEyOCgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfY3Z0dXNlcGkzMl9lcGk4IChfX20xMjhpIF9fTywgX19tbWFzazggX19NLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92dXNkYjEyOF9tYXNrICgoX192NHNpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjE2cWkpIF9fTywKKyAgICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2N2dHVzZXBpMzJfZXBpOCAoX19tbWFzazggX19NLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92dXNkYjEyOF9tYXNrICgoX192NHNpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjE2cWkpIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jdnR1c2VwaTMyX3N0b3JldV9lcGk4ICh2b2lkICogX19QLCBfX21tYXNrOCBfX00sIF9fbTEyOGkgX19BKQoreworICBfX2J1aWx0aW5faWEzMl9wbW92dXNkYjEyOG1lbV9tYXNrICgoX192MTZxaSAqKSBfX1AsIChfX3Y0c2kpIF9fQSwgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9jdnR1c2VwaTMyX2VwaTggKF9fbTI1NmkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3Z1c2RiMjU2X21hc2sgKChfX3Y4c2kpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192MTZxaSlfbW1fdW5kZWZpbmVkX3NpMTI4KCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jdnR1c2VwaTMyX2VwaTggKF9fbTEyOGkgX19PLCBfX21tYXNrOCBfX00sIF9fbTI1NmkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3Z1c2RiMjU2X21hc2sgKChfX3Y4c2kpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192MTZxaSkgX19PLAorICAgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfY3Z0dXNlcGkzMl9lcGk4IChfX21tYXNrOCBfX00sIF9fbTI1NmkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3Z1c2RiMjU2X21hc2sgKChfX3Y4c2kpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192MTZxaSkgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2N2dHVzZXBpMzJfc3RvcmV1X2VwaTggKHZvaWQgKiBfX1AsIF9fbW1hc2s4IF9fTSwgX19tMjU2aSBfX0EpCit7CisgIF9fYnVpbHRpbl9pYTMyX3Btb3Z1c2RiMjU2bWVtX21hc2sgKChfX3YxNnFpKikgX19QLCAoX192OHNpKSBfX0EsIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY3Z0dXNlcGkzMl9lcGkxNiAoX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnVzZHcxMjhfbWFzayAoKF9fdjRzaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3Y4aGkpX21tX3VuZGVmaW5lZF9zaTEyOCgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfY3Z0dXNlcGkzMl9lcGkxNiAoX19tMTI4aSBfX08sIF9fbW1hc2s4IF9fTSwgX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnVzZHcxMjhfbWFzayAoKF9fdjRzaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3Y4aGkpIF9fTywgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9jdnR1c2VwaTMyX2VwaTE2IChfX21tYXNrOCBfX00sIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3Z1c2R3MTI4X21hc2sgKChfX3Y0c2kpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192OGhpKSBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfY3Z0dXNlcGkzMl9zdG9yZXVfZXBpMTYgKHZvaWQgKiBfX1AsIF9fbW1hc2s4IF9fTSwgX19tMTI4aSBfX0EpCit7CisgIF9fYnVpbHRpbl9pYTMyX3Btb3Z1c2R3MTI4bWVtX21hc2sgKChfX3Y4aGkgKikgX19QLCAoX192NHNpKSBfX0EsIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY3Z0dXNlcGkzMl9lcGkxNiAoX19tMjU2aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnVzZHcyNTZfbWFzayAoKF9fdjhzaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3Y4aGkpIF9tbV91bmRlZmluZWRfc2kxMjgoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2N2dHVzZXBpMzJfZXBpMTYgKF9fbTEyOGkgX19PLCBfX21tYXNrOCBfX00sIF9fbTI1NmkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3Z1c2R3MjU2X21hc2sgKChfX3Y4c2kpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192OGhpKSBfX08sIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfY3Z0dXNlcGkzMl9lcGkxNiAoX19tbWFzazggX19NLCBfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92dXNkdzI1Nl9tYXNrICgoX192OHNpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjhoaSkgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2N2dHVzZXBpMzJfc3RvcmV1X2VwaTE2ICh2b2lkICogX19QLCBfX21tYXNrOCBfX00sIF9fbTI1NmkgX19BKQoreworICBfX2J1aWx0aW5faWEzMl9wbW92dXNkdzI1Nm1lbV9tYXNrICgoX192OGhpICopIF9fUCwgKF9fdjhzaSkgX19BLCBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2N2dHVzZXBpNjRfZXBpOCAoX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnVzcWIxMjhfbWFzayAoKF9fdjJkaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3YxNnFpKV9tbV91bmRlZmluZWRfc2kxMjgoKSwKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2N2dHVzZXBpNjRfZXBpOCAoX19tMTI4aSBfX08sIF9fbW1hc2s4IF9fTSwgX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnVzcWIxMjhfbWFzayAoKF9fdjJkaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3YxNnFpKSBfX08sCisgICAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9jdnR1c2VwaTY0X2VwaTggKF9fbW1hc2s4IF9fTSwgX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnVzcWIxMjhfbWFzayAoKF9fdjJkaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3YxNnFpKSBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfY3Z0dXNlcGk2NF9zdG9yZXVfZXBpOCAodm9pZCAqIF9fUCwgX19tbWFzazggX19NLCBfX20xMjhpIF9fQSkKK3sKKyAgX19idWlsdGluX2lhMzJfcG1vdnVzcWIxMjhtZW1fbWFzayAoKF9fdjE2cWkgKikgX19QLCAoX192MmRpKSBfX0EsIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY3Z0dXNlcGk2NF9lcGk4IChfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92dXNxYjI1Nl9tYXNrICgoX192NGRpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjE2cWkpX21tX3VuZGVmaW5lZF9zaTEyOCgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfY3Z0dXNlcGk2NF9lcGk4IChfX20xMjhpIF9fTywgX19tbWFzazggX19NLCBfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92dXNxYjI1Nl9tYXNrICgoX192NGRpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjE2cWkpIF9fTywKKyAgICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X2N2dHVzZXBpNjRfZXBpOCAoX19tbWFzazggX19NLCBfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92dXNxYjI1Nl9tYXNrICgoX192NGRpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjE2cWkpIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jdnR1c2VwaTY0X3N0b3JldV9lcGk4ICh2b2lkICogX19QLCBfX21tYXNrOCBfX00sIF9fbTI1NmkgX19BKQoreworICBfX2J1aWx0aW5faWEzMl9wbW92dXNxYjI1Nm1lbV9tYXNrICgoX192MTZxaSAqKSBfX1AsIChfX3Y0ZGkpIF9fQSwgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jdnR1c2VwaTY0X2VwaTMyIChfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92dXNxZDEyOF9tYXNrICgoX192MmRpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjRzaSlfbW1fdW5kZWZpbmVkX3NpMTI4KCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jdnR1c2VwaTY0X2VwaTMyIChfX20xMjhpIF9fTywgX19tbWFzazggX19NLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92dXNxZDEyOF9tYXNrICgoX192MmRpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjRzaSkgX19PLCBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2N2dHVzZXBpNjRfZXBpMzIgKF9fbW1hc2s4IF9fTSwgX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnVzcWQxMjhfbWFzayAoKF9fdjJkaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3Y0c2kpIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jdnR1c2VwaTY0X3N0b3JldV9lcGkzMiAodm9pZCAqIF9fUCwgX19tbWFzazggX19NLCBfX20xMjhpIF9fQSkKK3sKKyAgX19idWlsdGluX2lhMzJfcG1vdnVzcWQxMjhtZW1fbWFzayAoKF9fdjRzaSAqKSBfX1AsIChfX3YyZGkpIF9fQSwgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9jdnR1c2VwaTY0X2VwaTMyIChfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92dXNxZDI1Nl9tYXNrICgoX192NGRpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjRzaSlfbW1fdW5kZWZpbmVkX3NpMTI4KCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jdnR1c2VwaTY0X2VwaTMyIChfX20xMjhpIF9fTywgX19tbWFzazggX19NLCBfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92dXNxZDI1Nl9tYXNrICgoX192NGRpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjRzaSkgX19PLCBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X2N2dHVzZXBpNjRfZXBpMzIgKF9fbW1hc2s4IF9fTSwgX19tMjU2aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnVzcWQyNTZfbWFzayAoKF9fdjRkaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3Y0c2kpIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jdnR1c2VwaTY0X3N0b3JldV9lcGkzMiAodm9pZCAqIF9fUCwgX19tbWFzazggX19NLCBfX20yNTZpIF9fQSkKK3sKKyAgX19idWlsdGluX2lhMzJfcG1vdnVzcWQyNTZtZW1fbWFzayAoKF9fdjRzaSAqKSBfX1AsIChfX3Y0ZGkpIF9fQSwgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jdnR1c2VwaTY0X2VwaTE2IChfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92dXNxdzEyOF9tYXNrICgoX192MmRpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjhoaSlfbW1fdW5kZWZpbmVkX3NpMTI4KCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jdnR1c2VwaTY0X2VwaTE2IChfX20xMjhpIF9fTywgX19tbWFzazggX19NLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92dXNxdzEyOF9tYXNrICgoX192MmRpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjhoaSkgX19PLCBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2t6X2N2dHVzZXBpNjRfZXBpMTYgKF9fbW1hc2s4IF9fTSwgX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnVzcXcxMjhfbWFzayAoKF9fdjJkaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3Y4aGkpIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jdnR1c2VwaTY0X3N0b3JldV9lcGkxNiAodm9pZCAqIF9fUCwgX19tbWFzazggX19NLCBfX20xMjhpIF9fQSkKK3sKKyAgX19idWlsdGluX2lhMzJfcG1vdnVzcXcxMjhtZW1fbWFzayAoKF9fdjhoaSAqKSBfX1AsIChfX3YyZGkpIF9fQSwgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9jdnR1c2VwaTY0X2VwaTE2IChfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92dXNxdzI1Nl9tYXNrICgoX192NGRpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjhoaSlfbW1fdW5kZWZpbmVkX3NpMTI4KCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jdnR1c2VwaTY0X2VwaTE2IChfX20xMjhpIF9fTywgX19tbWFzazggX19NLCBfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92dXNxdzI1Nl9tYXNrICgoX192NGRpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjhoaSkgX19PLCBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X2N2dHVzZXBpNjRfZXBpMTYgKF9fbW1hc2s4IF9fTSwgX19tMjU2aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnVzcXcyNTZfbWFzayAoKF9fdjRkaSkgX19BLAorICAgICAgICAgICAgICAgIChfX3Y4aGkpIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jdnR1c2VwaTY0X3N0b3JldV9lcGkxNiAodm9pZCAqIF9fUCwgX19tbWFzazggX19NLCBfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3Btb3Z1c3F3MjU2bWVtX21hc2sgKChfX3Y4aGkgKikgX19QLCAoX192NGRpKSBfX0EsIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY3Z0ZXBpMzJfZXBpOCAoX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdmRiMTI4X21hc2sgKChfX3Y0c2kpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjE2cWkpX21tX3VuZGVmaW5lZF9zaTEyOCgpLAorICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2N2dGVwaTMyX2VwaTggKF9fbTEyOGkgX19PLCBfX21tYXNrOCBfX00sIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3ZkYjEyOF9tYXNrICgoX192NHNpKSBfX0EsCisgICAgICAgICAgICAgIChfX3YxNnFpKSBfX08sIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfY3Z0ZXBpMzJfZXBpOCAoX19tbWFzazggX19NLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92ZGIxMjhfbWFzayAoKF9fdjRzaSkgX19BLAorICAgICAgICAgICAgICAoX192MTZxaSkKKyAgICAgICAgICAgICAgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jdnRlcGkzMl9zdG9yZXVfZXBpOCAodm9pZCAqIF9fUCwgX19tbWFzazggX19NLCBfX20xMjhpIF9fQSkKK3sKKyAgX19idWlsdGluX2lhMzJfcG1vdmRiMTI4bWVtX21hc2sgKChfX3YxNnFpICopIF9fUCwgKF9fdjRzaSkgX19BLCBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2N2dGVwaTMyX2VwaTggKF9fbTI1NmkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3ZkYjI1Nl9tYXNrICgoX192OHNpKSBfX0EsCisgICAgICAgICAgICAgIChfX3YxNnFpKV9tbV91bmRlZmluZWRfc2kxMjgoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jdnRlcGkzMl9lcGk4IChfX20xMjhpIF9fTywgX19tbWFzazggX19NLCBfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92ZGIyNTZfbWFzayAoKF9fdjhzaSkgX19BLAorICAgICAgICAgICAgICAoX192MTZxaSkgX19PLCBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X2N2dGVwaTMyX2VwaTggKF9fbW1hc2s4IF9fTSwgX19tMjU2aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdmRiMjU2X21hc2sgKChfX3Y4c2kpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjE2cWkpIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfY3Z0ZXBpMzJfc3RvcmV1X2VwaTggKHZvaWQgKiBfX1AsIF9fbW1hc2s4IF9fTSwgX19tMjU2aSBfX0EpCit7CisgIF9fYnVpbHRpbl9pYTMyX3Btb3ZkYjI1Nm1lbV9tYXNrICgoX192MTZxaSAqKSBfX1AsIChfX3Y4c2kpIF9fQSwgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jdnRlcGkzMl9lcGkxNiAoX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdmR3MTI4X21hc2sgKChfX3Y0c2kpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjhoaSkgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfY3Z0ZXBpMzJfZXBpMTYgKF9fbTEyOGkgX19PLCBfX21tYXNrOCBfX00sIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3ZkdzEyOF9tYXNrICgoX192NHNpKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y4aGkpIF9fTywgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9jdnRlcGkzMl9lcGkxNiAoX19tbWFzazggX19NLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92ZHcxMjhfbWFzayAoKF9fdjRzaSkgX19BLAorICAgICAgICAgICAgICAoX192OGhpKSBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2N2dGVwaTMyX3N0b3JldV9lcGkxNiAodm9pZCAqIF9fUCwgX19tbWFzazggX19NLCBfX20xMjhpIF9fQSkKK3sKKyAgX19idWlsdGluX2lhMzJfcG1vdmR3MTI4bWVtX21hc2sgKChfX3Y4aGkgKikgX19QLCAoX192NHNpKSBfX0EsIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY3Z0ZXBpMzJfZXBpMTYgKF9fbTI1NmkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3ZkdzI1Nl9tYXNrICgoX192OHNpKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y4aGkpX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfY3Z0ZXBpMzJfZXBpMTYgKF9fbTEyOGkgX19PLCBfX21tYXNrOCBfX00sIF9fbTI1NmkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3ZkdzI1Nl9tYXNrICgoX192OHNpKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y4aGkpIF9fTywgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9jdnRlcGkzMl9lcGkxNiAoX19tbWFzazggX19NLCBfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92ZHcyNTZfbWFzayAoKF9fdjhzaSkgX19BLAorICAgICAgICAgICAgICAoX192OGhpKSBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2N2dGVwaTMyX3N0b3JldV9lcGkxNiAodm9pZCAqICBfX1AsIF9fbW1hc2s4IF9fTSwgX19tMjU2aSBfX0EpCit7CisgIF9fYnVpbHRpbl9pYTMyX3Btb3ZkdzI1Nm1lbV9tYXNrICgoX192OGhpICopIF9fUCwgKF9fdjhzaSkgX19BLCBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2N2dGVwaTY0X2VwaTggKF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3ZxYjEyOF9tYXNrICgoX192MmRpKSBfX0EsCisgICAgICAgICAgICAgIChfX3YxNnFpKSBfbW1fdW5kZWZpbmVkX3NpMTI4KCksCisgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfY3Z0ZXBpNjRfZXBpOCAoX19tMTI4aSBfX08sIF9fbW1hc2s4IF9fTSwgX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnFiMTI4X21hc2sgKChfX3YyZGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjE2cWkpIF9fTywgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9jdnRlcGk2NF9lcGk4IChfX21tYXNrOCBfX00sIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3ZxYjEyOF9tYXNrICgoX192MmRpKSBfX0EsCisgICAgICAgICAgICAgIChfX3YxNnFpKSBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2N2dGVwaTY0X3N0b3JldV9lcGk4ICh2b2lkICogX19QLCBfX21tYXNrOCBfX00sIF9fbTEyOGkgX19BKQoreworICBfX2J1aWx0aW5faWEzMl9wbW92cWIxMjhtZW1fbWFzayAoKF9fdjE2cWkgKikgX19QLCAoX192MmRpKSBfX0EsIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY3Z0ZXBpNjRfZXBpOCAoX19tMjU2aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnFiMjU2X21hc2sgKChfX3Y0ZGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjE2cWkpIF9tbV91bmRlZmluZWRfc2kxMjgoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jdnRlcGk2NF9lcGk4IChfX20xMjhpIF9fTywgX19tbWFzazggX19NLCBfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92cWIyNTZfbWFzayAoKF9fdjRkaSkgX19BLAorICAgICAgICAgICAgICAoX192MTZxaSkgX19PLCBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X2N2dGVwaTY0X2VwaTggKF9fbW1hc2s4IF9fTSwgX19tMjU2aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnFiMjU2X21hc2sgKChfX3Y0ZGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjE2cWkpIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfY3Z0ZXBpNjRfc3RvcmV1X2VwaTggKHZvaWQgKiBfX1AsIF9fbW1hc2s4IF9fTSwgX19tMjU2aSBfX0EpCit7CisgIF9fYnVpbHRpbl9pYTMyX3Btb3ZxYjI1Nm1lbV9tYXNrICgoX192MTZxaSAqKSBfX1AsIChfX3Y0ZGkpIF9fQSwgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jdnRlcGk2NF9lcGkzMiAoX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnFkMTI4X21hc2sgKChfX3YyZGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjRzaSlfbW1fdW5kZWZpbmVkX3NpMTI4KCksCisgICAgICAgICAgICAgIChfX21tYXNrOCkgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfY3Z0ZXBpNjRfZXBpMzIgKF9fbTEyOGkgX19PLCBfX21tYXNrOCBfX00sIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3ZxZDEyOF9tYXNrICgoX192MmRpKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y0c2kpIF9fTywgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9jdnRlcGk2NF9lcGkzMiAoX19tbWFzazggX19NLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92cWQxMjhfbWFzayAoKF9fdjJkaSkgX19BLAorICAgICAgICAgICAgICAoX192NHNpKSBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2N2dGVwaTY0X3N0b3JldV9lcGkzMiAodm9pZCAqIF9fUCwgX19tbWFzazggX19NLCBfX20xMjhpIF9fQSkKK3sKKyAgX19idWlsdGluX2lhMzJfcG1vdnFkMTI4bWVtX21hc2sgKChfX3Y0c2kgKikgX19QLCAoX192MmRpKSBfX0EsIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY3Z0ZXBpNjRfZXBpMzIgKF9fbTI1NmkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3ZxZDI1Nl9tYXNrICgoX192NGRpKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y0c2kpIF9tbV91bmRlZmluZWRfc2kxMjgoKSwKKyAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jdnRlcGk2NF9lcGkzMiAoX19tMTI4aSBfX08sIF9fbW1hc2s4IF9fTSwgX19tMjU2aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnFkMjU2X21hc2sgKChfX3Y0ZGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjRzaSkgX19PLCBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X2N2dGVwaTY0X2VwaTMyIChfX21tYXNrOCBfX00sIF9fbTI1NmkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3ZxZDI1Nl9tYXNrICgoX192NGRpKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y0c2kpIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAorICAgICAgICAgICAgICBfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfY3Z0ZXBpNjRfc3RvcmV1X2VwaTMyICh2b2lkICogX19QLCBfX21tYXNrOCBfX00sIF9fbTI1NmkgX19BKQoreworICBfX2J1aWx0aW5faWEzMl9wbW92cWQyNTZtZW1fbWFzayAoKF9fdjRzaSAqKSBfX1AsIChfX3Y0ZGkpIF9fQSwgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jdnRlcGk2NF9lcGkxNiAoX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnF3MTI4X21hc2sgKChfX3YyZGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjhoaSkgX21tX3VuZGVmaW5lZF9zaTEyOCgpLAorICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2N2dGVwaTY0X2VwaTE2IChfX20xMjhpIF9fTywgX19tbWFzazggX19NLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92cXcxMjhfbWFzayAoKF9fdjJkaSkgX19BLAorICAgICAgICAgICAgICAoX192OGhpKV9fTywKKyAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9jdnRlcGk2NF9lcGkxNiAoX19tbWFzazggX19NLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92cXcxMjhfbWFzayAoKF9fdjJkaSkgX19BLAorICAgICAgICAgICAgICAoX192OGhpKSBfbW1fc2V0emVyb19zaTEyOCAoKSwKKyAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2N2dGVwaTY0X3N0b3JldV9lcGkxNiAodm9pZCAqIF9fUCwgX19tbWFzazggX19NLCBfX20xMjhpIF9fQSkKK3sKKyAgX19idWlsdGluX2lhMzJfcG1vdnF3MTI4bWVtX21hc2sgKChfX3Y4aGkgKikgX19QLCAoX192MmRpKSBfX0EsIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY3Z0ZXBpNjRfZXBpMTYgKF9fbTI1NmkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3ZxdzI1Nl9tYXNrICgoX192NGRpKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y4aGkpX21tX3VuZGVmaW5lZF9zaTEyOCgpLAorICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX2N2dGVwaTY0X2VwaTE2IChfX20xMjhpIF9fTywgX19tbWFzazggX19NLCBfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92cXcyNTZfbWFzayAoKF9fdjRkaSkgX19BLAorICAgICAgICAgICAgICAoX192OGhpKSBfX08sIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfY3Z0ZXBpNjRfZXBpMTYgKF9fbW1hc2s4IF9fTSwgX19tMjU2aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnF3MjU2X21hc2sgKChfX3Y0ZGkpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjhoaSkgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jdnRlcGk2NF9zdG9yZXVfZXBpMTYgKHZvaWQgKiBfX1AsIF9fbW1hc2s4IF9fTSwgX19tMjU2aSBfX0EpCit7CisgIF9fYnVpbHRpbl9pYTMyX3Btb3ZxdzI1Nm1lbV9tYXNrICgoX192OGhpICopIF9fUCwgKF9fdjRkaSkgX19BLCBfX00pOworfQorCisjZGVmaW5lIF9tbTI1Nl9leHRyYWN0ZjMyeDRfcHMoQSwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOClfX2J1aWx0aW5faWEzMl9leHRyYWN0ZjMyeDRfMjU2X21hc2soKF9fdjhzZikoX19tMjU2KShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpX21tX3NldHplcm9fcHMoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9tYXNrX2V4dHJhY3RmMzJ4NF9wcyhXLCBVLCBBLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX2V4dHJhY3RmMzJ4NF8yNTZfbWFzaygoX192OHNmKShfX20yNTYpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfbWFza3pfZXh0cmFjdGYzMng0X3BzKFUsIEEsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfZXh0cmFjdGYzMng0XzI1Nl9tYXNrKChfX3Y4c2YpKF9fbTI1NikoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKV9tbV9zZXR6ZXJvX3BzKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X2V4dHJhY3RpMzJ4NF9lcGkzMihBLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9leHRyYWN0aTMyeDRfMjU2X21hc2soKF9fdjhzaSkoX19tMjU2aSkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2kpX21tX3NldHplcm9fc2kxMjgoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsgfSkKKworI2RlZmluZSBfbW0yNTZfbWFza19leHRyYWN0aTMyeDRfZXBpMzIoVywgVSwgQSwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGkpX19idWlsdGluX2lhMzJfZXh0cmFjdGkzMng0XzI1Nl9tYXNrKChfX3Y4c2kpKF9fbTI1NmkpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNpKShfX20xMjhpKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21hc2t6X2V4dHJhY3RpMzJ4NF9lcGkzMihVLCBBLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9leHRyYWN0aTMyeDRfMjU2X21hc2soKF9fdjhzaSkoX19tMjU2aSkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2kpX21tX3NldHplcm9fc2kxMjgoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X2luc2VydGYzMng0KEEsIEIsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTYpX19idWlsdGluX2lhMzJfaW5zZXJ0ZjMyeDRfMjU2X21hc2soKF9fdjhzZikoX19tMjU2KShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpKF9fbTEyOCkoQiksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNmKV9tbTI1Nl9zZXR6ZXJvX3BzKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9tYXNrX2luc2VydGYzMng0KFcsIFUsIEEsIEIsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTYpX19idWlsdGluX2lhMzJfaW5zZXJ0ZjMyeDRfMjU2X21hc2soKF9fdjhzZikoX19tMjU2KShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpKF9fbTEyOCkoQiksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNmKShfX20yNTYpKFcpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21hc2t6X2luc2VydGYzMng0KFUsIEEsIEIsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTYpX19idWlsdGluX2lhMzJfaW5zZXJ0ZjMyeDRfMjU2X21hc2soKF9fdjhzZikoX19tMjU2KShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpKF9fbTEyOCkoQiksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNmKV9tbTI1Nl9zZXR6ZXJvX3BzKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfaW5zZXJ0aTMyeDQoQSwgQiwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmkpX19idWlsdGluX2lhMzJfaW5zZXJ0aTMyeDRfMjU2X21hc2soKF9fdjhzaSkoX19tMjU2aSkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzaSkoX19tMTI4aSkoQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNpKV9tbTI1Nl9zZXR6ZXJvX3NpMjU2KCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsgfSkKKworI2RlZmluZSBfbW0yNTZfbWFza19pbnNlcnRpMzJ4NChXLCBVLCBBLCBCLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9pbnNlcnRpMzJ4NF8yNTZfbWFzaygoX192OHNpKShfX20yNTZpKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNpKShfX20xMjhpKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2kpKF9fbTI1NmkpKFcpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSkpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9tYXNrel9pbnNlcnRpMzJ4NChVLCBBLCBCLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9pbnNlcnRpMzJ4NF8yNTZfbWFzaygoX192OHNpKShfX20yNTZpKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNpKShfX20xMjhpKShCKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2kpX21tMjU2X3NldHplcm9fc2kyNTYoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW1fZ2V0bWFudF9wZChBLCBCLCBDKSBfX2V4dGVuc2lvbl9fKHtcCisgIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2dldG1hbnRwZDEyOF9tYXNrKChfX3YyZGYpKF9fbTEyOGQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKCgoQyk8PDIpIHwgKEIpKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKV9tbV9zZXR6ZXJvX3BkKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsgfSkKKworI2RlZmluZSBfbW1fbWFza19nZXRtYW50X3BkKFcsIFUsIEEsIEIsIEMpIF9fZXh0ZW5zaW9uX18oe1wKKyAgKF9fbTEyOGQpX19idWlsdGluX2lhMzJfZ2V0bWFudHBkMTI4X21hc2soKF9fdjJkZikoX19tMTI4ZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoKChDKTw8MikgfCAoQikpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fbTEyOGQpKFcpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSkpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrel9nZXRtYW50X3BkKFUsIEEsIEIsIEMpIF9fZXh0ZW5zaW9uX18oe1wKKyAgKF9fbTEyOGQpX19idWlsdGluX2lhMzJfZ2V0bWFudHBkMTI4X21hc2soKF9fdjJkZikoX19tMTI4ZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoKChDKTw8MikgfCAoQikpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpX21tX3NldHplcm9fcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfZ2V0bWFudF9wZChBLCBCLCBDKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmQpX19idWlsdGluX2lhMzJfZ2V0bWFudHBkMjU2X21hc2soKF9fdjRkZikoX19tMjU2ZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoKChDKTw8MikgfCAoQikpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGYpX21tMjU2X3NldHplcm9fcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9tYXNrX2dldG1hbnRfcGQoVywgVSwgQSwgQiwgQykgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTZkKV9fYnVpbHRpbl9pYTMyX2dldG1hbnRwZDI1Nl9tYXNrKChfX3Y0ZGYpKF9fbTI1NmQpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKCgoQyk8PDIpIHwgKEIpKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRmKShfX20yNTZkKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfbWFza3pfZ2V0bWFudF9wZChVLCBBLCBCLCBDKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmQpX19idWlsdGluX2lhMzJfZ2V0bWFudHBkMjU2X21hc2soKF9fdjRkZikoX19tMjU2ZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoKChDKTw8MikgfCAoQikpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGYpX21tMjU2X3NldHplcm9fcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW1fZ2V0bWFudF9wcyhBLCBCLCBDKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOClfX2J1aWx0aW5faWEzMl9nZXRtYW50cHMxMjhfbWFzaygoX192NHNmKShfX20xMjgpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoKChDKTw8MikgfCAoQikpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZilfbW1fc2V0emVyb19wcygpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsgfSkKKworI2RlZmluZSBfbW1fbWFza19nZXRtYW50X3BzKFcsIFUsIEEsIEIsIEMpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX2dldG1hbnRwczEyOF9tYXNrKChfX3Y0c2YpKF9fbTEyOCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSgoKEMpPDwyKSB8IChCKSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKShfX20xMjgpKFcpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2t6X2dldG1hbnRfcHMoVSwgQSwgQiwgQykgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfZ2V0bWFudHBzMTI4X21hc2soKF9fdjRzZikoX19tMTI4KShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKCgoQyk8PDIpIHwgKEIpKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpX21tX3NldHplcm9fcHMoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSkpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9nZXRtYW50X3BzKEEsIEIsIEMpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2KV9fYnVpbHRpbl9pYTMyX2dldG1hbnRwczI1Nl9tYXNrKChfX3Y4c2YpKF9fbTI1NikoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSgoKEMpPDwyKSB8IChCKSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNmKV9tbTI1Nl9zZXR6ZXJvX3BzKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9tYXNrX2dldG1hbnRfcHMoVywgVSwgQSwgQiwgQykgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTYpX19idWlsdGluX2lhMzJfZ2V0bWFudHBzMjU2X21hc2soKF9fdjhzZikoX19tMjU2KShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKCgoQyk8PDIpIHwgKEIpKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2YpKF9fbTI1NikoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfbWFza3pfZ2V0bWFudF9wcyhVLCBBLCBCLCBDKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NilfX2J1aWx0aW5faWEzMl9nZXRtYW50cHMyNTZfbWFzaygoX192OHNmKShfX20yNTYpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoKChDKTw8MikgfCAoQikpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzZilfbW0yNTZfc2V0emVyb19wcygpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tX21tYXNrX2k2NGdhdGhlcl9wZCh2MV9vbGQsIG1hc2ssIGluZGV4LCBhZGRyLCBzY2FsZSkgX19leHRlbnNpb25fXyAoe1wKKyAgKF9fbTEyOGQpX19idWlsdGluX2lhMzJfZ2F0aGVyM2RpdjJkZigoX192MmRmKShfX20xMjhkKSh2MV9vbGQpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSBjb25zdCAqKShhZGRyKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGkpKF9fbTEyOGkpKGluZGV4KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkobWFzayksIChpbnQpKHNjYWxlKSk7IH0pCisKKyNkZWZpbmUgX21tX21tYXNrX2k2NGdhdGhlcl9lcGk2NCh2MV9vbGQsIG1hc2ssIGluZGV4LCBhZGRyLCBzY2FsZSkgX19leHRlbnNpb25fXyAoe1wKKyAgKF9fbTEyOGkpX19idWlsdGluX2lhMzJfZ2F0aGVyM2RpdjJkaSgoX192MmRpKShfX20xMjhpKSh2MV9vbGQpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyBjb25zdCAqKShhZGRyKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGkpKF9fbTEyOGkpKGluZGV4KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkobWFzayksIChpbnQpKHNjYWxlKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21tYXNrX2k2NGdhdGhlcl9wZCh2MV9vbGQsIG1hc2ssIGluZGV4LCBhZGRyLCBzY2FsZSkgX19leHRlbnNpb25fXyAoe1wKKyAgKF9fbTI1NmQpX19idWlsdGluX2lhMzJfZ2F0aGVyM2RpdjRkZigoX192NGRmKShfX20yNTZkKSh2MV9vbGQpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSBjb25zdCAqKShhZGRyKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGkpKF9fbTI1NmkpKGluZGV4KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkobWFzayksIChpbnQpKHNjYWxlKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21tYXNrX2k2NGdhdGhlcl9lcGk2NCh2MV9vbGQsIG1hc2ssIGluZGV4LCBhZGRyLCBzY2FsZSkgX19leHRlbnNpb25fXyAoe1wKKyAgKF9fbTI1NmkpX19idWlsdGluX2lhMzJfZ2F0aGVyM2RpdjRkaSgoX192NGRpKShfX20yNTZpKSh2MV9vbGQpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyBjb25zdCAqKShhZGRyKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGkpKF9fbTI1NmkpKGluZGV4KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkobWFzayksIChpbnQpKHNjYWxlKSk7IH0pCisKKyNkZWZpbmUgX21tX21tYXNrX2k2NGdhdGhlcl9wcyh2MV9vbGQsIG1hc2ssIGluZGV4LCBhZGRyLCBzY2FsZSkgX19leHRlbnNpb25fXyAoe1wKKyAgKF9fbTEyOClfX2J1aWx0aW5faWEzMl9nYXRoZXIzZGl2NHNmKChfX3Y0c2YpKF9fbTEyOCkodjFfb2xkKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0IGNvbnN0ICopKGFkZHIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRpKShfX20xMjhpKShpbmRleCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkobWFzayksIChpbnQpKHNjYWxlKSk7IH0pCisKKyNkZWZpbmUgX21tX21tYXNrX2k2NGdhdGhlcl9lcGkzMih2MV9vbGQsIG1hc2ssIGluZGV4LCBhZGRyLCBzY2FsZSkgX19leHRlbnNpb25fXyAoe1wKKyAgKF9fbTEyOGkpX19idWlsdGluX2lhMzJfZ2F0aGVyM2RpdjRzaSgoX192NHNpKShfX20xMjhpKSh2MV9vbGQpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCBjb25zdCAqKShhZGRyKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGkpKF9fbTEyOGkpKGluZGV4KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkobWFzayksIChpbnQpKHNjYWxlKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21tYXNrX2k2NGdhdGhlcl9wcyh2MV9vbGQsIG1hc2ssIGluZGV4LCBhZGRyLCBzY2FsZSkgX19leHRlbnNpb25fXyAoe1wKKyAgKF9fbTEyOClfX2J1aWx0aW5faWEzMl9nYXRoZXIzZGl2OHNmKChfX3Y0c2YpKF9fbTEyOCkodjFfb2xkKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0IGNvbnN0ICopKGFkZHIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRpKShfX20yNTZpKShpbmRleCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkobWFzayksIChpbnQpKHNjYWxlKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21tYXNrX2k2NGdhdGhlcl9lcGkzMih2MV9vbGQsIG1hc2ssIGluZGV4LCBhZGRyLCBzY2FsZSkgX19leHRlbnNpb25fXyAoe1wKKyAgKF9fbTEyOGkpX19idWlsdGluX2lhMzJfZ2F0aGVyM2RpdjhzaSgoX192NHNpKShfX20xMjhpKSh2MV9vbGQpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCBjb25zdCAqKShhZGRyKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGkpKF9fbTI1NmkpKGluZGV4KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkobWFzayksIChpbnQpKHNjYWxlKSk7IH0pCisKKyNkZWZpbmUgX21tX21tYXNrX2kzMmdhdGhlcl9wZCh2MV9vbGQsIG1hc2ssIGluZGV4LCBhZGRyLCBzY2FsZSkgX19leHRlbnNpb25fXyAoe1wKKyAgKF9fbTEyOGQpX19idWlsdGluX2lhMzJfZ2F0aGVyM3NpdjJkZigoX192MmRmKShfX20xMjhkKSh2MV9vbGQpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSBjb25zdCAqKShhZGRyKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2kpKF9fbTEyOGkpKGluZGV4KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkobWFzayksIChpbnQpKHNjYWxlKSk7IH0pCisKKyNkZWZpbmUgX21tX21tYXNrX2kzMmdhdGhlcl9lcGk2NCh2MV9vbGQsIG1hc2ssIGluZGV4LCBhZGRyLCBzY2FsZSkgX19leHRlbnNpb25fXyAoe1wKKyAgKF9fbTEyOGkpX19idWlsdGluX2lhMzJfZ2F0aGVyM3NpdjJkaSgoX192MmRpKShfX20xMjhpKSh2MV9vbGQpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyBjb25zdCAqKShhZGRyKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2kpKF9fbTEyOGkpKGluZGV4KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkobWFzayksIChpbnQpKHNjYWxlKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21tYXNrX2kzMmdhdGhlcl9wZCh2MV9vbGQsIG1hc2ssIGluZGV4LCBhZGRyLCBzY2FsZSkgX19leHRlbnNpb25fXyAoe1wKKyAgKF9fbTI1NmQpX19idWlsdGluX2lhMzJfZ2F0aGVyM3NpdjRkZigoX192NGRmKShfX20yNTZkKSh2MV9vbGQpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSBjb25zdCAqKShhZGRyKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2kpKF9fbTEyOGkpKGluZGV4KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkobWFzayksIChpbnQpKHNjYWxlKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21tYXNrX2kzMmdhdGhlcl9lcGk2NCh2MV9vbGQsIG1hc2ssIGluZGV4LCBhZGRyLCBzY2FsZSkgX19leHRlbnNpb25fXyAoe1wKKyAgKF9fbTI1NmkpX19idWlsdGluX2lhMzJfZ2F0aGVyM3NpdjRkaSgoX192NGRpKShfX20yNTZpKSh2MV9vbGQpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyBjb25zdCAqKShhZGRyKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2kpKF9fbTEyOGkpKGluZGV4KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkobWFzayksIChpbnQpKHNjYWxlKSk7IH0pCisKKyNkZWZpbmUgX21tX21tYXNrX2kzMmdhdGhlcl9wcyh2MV9vbGQsIG1hc2ssIGluZGV4LCBhZGRyLCBzY2FsZSkgX19leHRlbnNpb25fXyAoe1wKKyAgKF9fbTEyOClfX2J1aWx0aW5faWEzMl9nYXRoZXIzc2l2NHNmKChfX3Y0c2YpKF9fbTEyOCkodjFfb2xkKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0IGNvbnN0ICopKGFkZHIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNpKShfX20xMjhpKShpbmRleCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkobWFzayksIChpbnQpKHNjYWxlKSk7IH0pCisKKyNkZWZpbmUgX21tX21tYXNrX2kzMmdhdGhlcl9lcGkzMih2MV9vbGQsIG1hc2ssIGluZGV4LCBhZGRyLCBzY2FsZSkgX19leHRlbnNpb25fXyAoe1wKKyAgKF9fbTEyOGkpX19idWlsdGluX2lhMzJfZ2F0aGVyM3NpdjRzaSgoX192NHNpKShfX20xMjhpKSh2MV9vbGQpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCBjb25zdCAqKShhZGRyKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2kpKF9fbTEyOGkpKGluZGV4KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkobWFzayksIChpbnQpKHNjYWxlKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21tYXNrX2kzMmdhdGhlcl9wcyh2MV9vbGQsIG1hc2ssIGluZGV4LCBhZGRyLCBzY2FsZSkgX19leHRlbnNpb25fXyAoe1wKKyAgKF9fbTI1NilfX2J1aWx0aW5faWEzMl9nYXRoZXIzc2l2OHNmKChfX3Y4c2YpKF9fbTI1NikodjFfb2xkKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0IGNvbnN0ICopKGFkZHIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNpKShfX20yNTZpKShpbmRleCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkobWFzayksIChpbnQpKHNjYWxlKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21tYXNrX2kzMmdhdGhlcl9lcGkzMih2MV9vbGQsIG1hc2ssIGluZGV4LCBhZGRyLCBzY2FsZSkgX19leHRlbnNpb25fXyAoe1wKKyAgKF9fbTI1NmkpX19idWlsdGluX2lhMzJfZ2F0aGVyM3NpdjhzaSgoX192OHNpKShfX20yNTZpKSh2MV9vbGQpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCBjb25zdCAqKShhZGRyKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2kpKF9fbTI1NmkpKGluZGV4KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkobWFzayksIChpbnQpKHNjYWxlKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X3Blcm11dGV4X3BkKFgsIEMpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2ZClfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcigoX192NGRmKShfX20yNTZkKShYKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRmKV9tbTI1Nl91bmRlZmluZWRfcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEMpID4+IDApICYgMHgzLCAoKEMpID4+IDIpICYgMHgzLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQykgPj4gNCkgJiAweDMsICgoQykgPj4gNikgJiAweDMpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9tYXNrX3Blcm11dGV4X3BkKFcsIFUsIFgsIEMpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2ZClfX2J1aWx0aW5faWEzMl9zZWxlY3RwZF8yNTYoKF9fbW1hc2s4KShVKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkZilfbW0yNTZfcGVybXV0ZXhfcGQoKFgpLCAoQykpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRmKShfX20yNTZkKShXKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21hc2t6X3Blcm11dGV4X3BkKFUsIFgsIEMpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2ZClfX2J1aWx0aW5faWEzMl9zZWxlY3RwZF8yNTYoKF9fbW1hc2s4KShVKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkZilfbW0yNTZfcGVybXV0ZXhfcGQoKFgpLCAoQykpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRmKV9tbTI1Nl9zZXR6ZXJvX3BkKCkpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9wZXJtdXRleF9lcGk2NChYLCBDKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmkpX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjRkaSkoX19tMjU2aSkoWCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkaSlfbW0yNTZfdW5kZWZpbmVkX3NpMjU2KCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDKSA+PiAwKSAmIDB4MywgKChDKSA+PiAyKSAmIDB4MywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEMpID4+IDQpICYgMHgzLCAoKEMpID4+IDYpICYgMHgzKTsgfSkKKworI2RlZmluZSBfbW0yNTZfbWFza19wZXJtdXRleF9lcGk2NChXLCBVLCBYLCBDKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmkpX19idWlsdGluX2lhMzJfc2VsZWN0cV8yNTYoKF9fbW1hc2s4KShVKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRpKV9tbTI1Nl9wZXJtdXRleF9lcGk2NCgoWCksIChDKSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkaSkoX19tMjU2aSkoVykpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9tYXNrel9wZXJtdXRleF9lcGk2NChVLCBYLCBDKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmkpX19idWlsdGluX2lhMzJfc2VsZWN0cV8yNTYoKF9fbW1hc2s4KShVKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRpKV9tbTI1Nl9wZXJtdXRleF9lcGk2NCgoWCksIChDKSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkaSlfbW0yNTZfc2V0emVyb19zaTI1NigpKTsgfSkKKworc3RhdGljIF9faW5saW5lX18gX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9wZXJtdXRleHZhcl9wZCAoX19tMjU2aSBfX1gsIF9fbTI1NmQgX19ZKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX3Blcm12YXJkZjI1Nl9tYXNrICgoX192NGRmKSBfX1ksCisgICAgICAgICAgICAgICAgIChfX3Y0ZGkpIF9fWCwKKyAgICAgICAgICAgICAgICAgKF9fdjRkZikgX21tMjU2X3VuZGVmaW5lZF9zaTI1NiAoKSwKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19wZXJtdXRleHZhcl9wZCAoX19tMjU2ZCBfX1csIF9fbW1hc2s4IF9fVSwgX19tMjU2aSBfX1gsCisgICAgICAgICAgX19tMjU2ZCBfX1kpCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfcGVybXZhcmRmMjU2X21hc2sgKChfX3Y0ZGYpIF9fWSwKKyAgICAgICAgICAgICAgICAgKF9fdjRkaSkgX19YLAorICAgICAgICAgICAgICAgICAoX192NGRmKSBfX1csCisgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9wZXJtdXRleHZhcl9wZCAoX19tbWFzazggX19VLCBfX20yNTZpIF9fWCwgX19tMjU2ZCBfX1kpCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfcGVybXZhcmRmMjU2X21hc2sgKChfX3Y0ZGYpIF9fWSwKKyAgICAgICAgICAgICAgICAgKF9fdjRkaSkgX19YLAorICAgICAgICAgICAgICAgICAoX192NGRmKSBfbW0yNTZfc2V0emVyb19wZCAoKSwKKyAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X3Blcm11dGV4dmFyX2VwaTY0IChfX21tYXNrOCBfX00sIF9fbTI1NmkgX19YLCBfX20yNTZpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wZXJtdmFyZGkyNTZfbWFzayAoKF9fdjRkaSkgX19ZLAorICAgICAgICAgICAgICAgICAoX192NGRpKSBfX1gsCisgICAgICAgICAgICAgICAgIChfX3Y0ZGkpIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2ICgpLAorICAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfcGVybXV0ZXh2YXJfZXBpNjQgKCBfX20yNTZpIF9fWCwgX19tMjU2aSBfX1kpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcGVybXZhcmRpMjU2X21hc2sgKChfX3Y0ZGkpIF9fWSwKKyAgICAgICAgICAgICAgICAgKF9fdjRkaSkgX19YLAorICAgICAgICAgICAgICAgICAoX192NGRpKSBfbW0yNTZfdW5kZWZpbmVkX3NpMjU2ICgpLAorICAgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrX3Blcm11dGV4dmFyX2VwaTY0IChfX20yNTZpIF9fVywgX19tbWFzazggX19NLCBfX20yNTZpIF9fWCwKKyAgICAgICAgICAgICBfX20yNTZpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wZXJtdmFyZGkyNTZfbWFzayAoKF9fdjRkaSkgX19ZLAorICAgICAgICAgICAgICAgICAoX192NGRpKSBfX1gsCisgICAgICAgICAgICAgICAgIChfX3Y0ZGkpIF9fVywKKyAgICAgICAgICAgICAgICAgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfcGVybXV0ZXh2YXJfcHMgKF9fbTI1NiBfX1csIF9fbW1hc2s4IF9fVSwgX19tMjU2aSBfX1gsCisgICAgICAgICAgX19tMjU2IF9fWSkKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX3Blcm12YXJzZjI1Nl9tYXNrICgoX192OHNmKSBfX1ksCisgICAgICAgICAgICAgICAgKF9fdjhzaSkgX19YLAorICAgICAgICAgICAgICAgIChfX3Y4c2YpIF9fVywKKyAgICAgICAgICAgICAgICAoX19tbWFzazgpIF9fVSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9wZXJtdXRleHZhcl9wcyAoX19tbWFzazggX19VLCBfX20yNTZpIF9fWCwgX19tMjU2IF9fWSkKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX3Blcm12YXJzZjI1Nl9tYXNrICgoX192OHNmKSBfX1ksCisgICAgICAgICAgICAgICAgKF9fdjhzaSkgX19YLAorICAgICAgICAgICAgICAgIChfX3Y4c2YpIF9tbTI1Nl9zZXR6ZXJvX3BzICgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3Blcm11dGV4dmFyX3BzIChfX20yNTZpIF9fWCwgX19tMjU2IF9fWSkKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX3Blcm12YXJzZjI1Nl9tYXNrICgoX192OHNmKSBfX1ksCisgICAgICAgICAgICAgICAgKF9fdjhzaSkgX19YLAorICAgICAgICAgICAgICAgIChfX3Y4c2YpIF9tbTI1Nl91bmRlZmluZWRfc2kyNTYgKCksCisgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSAtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfcGVybXV0ZXh2YXJfZXBpMzIgKF9fbW1hc2s4IF9fTSwgX19tMjU2aSBfX1gsIF9fbTI1NmkgX19ZKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3Blcm12YXJzaTI1Nl9tYXNrICgoX192OHNpKSBfX1ksCisgICAgICAgICAgICAgICAgIChfX3Y4c2kpIF9fWCwKKyAgICAgICAgICAgICAgICAgKF9fdjhzaSkgX21tMjU2X3NldHplcm9fc2kyNTYgKCksCisgICAgICAgICAgICAgICAgIF9fTSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19wZXJtdXRleHZhcl9lcGkzMiAoX19tMjU2aSBfX1csIF9fbW1hc2s4IF9fTSwgX19tMjU2aSBfX1gsCisgICAgICAgICAgICAgX19tMjU2aSBfX1kpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcGVybXZhcnNpMjU2X21hc2sgKChfX3Y4c2kpIF9fWSwKKyAgICAgICAgICAgICAgICAgKF9fdjhzaSkgX19YLAorICAgICAgICAgICAgICAgICAoX192OHNpKSBfX1csCisgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19NKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9wZXJtdXRleHZhcl9lcGkzMiAoX19tMjU2aSBfX1gsIF9fbTI1NmkgX19ZKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3Blcm12YXJzaTI1Nl9tYXNrICgoX192OHNpKSBfX1ksCisgICAgICAgICAgICAgICAgIChfX3Y4c2kpIF9fWCwKKyAgICAgICAgICAgICAgICAgKF9fdjhzaSkgX21tMjU2X3VuZGVmaW5lZF9zaTI1NigpLAorICAgICAgICAgICAgICAgICAoX19tbWFzazgpIC0xKTsKK30KKworI2RlZmluZSBfbW1fYWxpZ25yX2VwaTMyKEEsIEIsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX2FsaWduZDEyOF9tYXNrKChfX3Y0c2kpKF9fbTEyOGkpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2kpKF9fbTEyOGkpKEIpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2kpX21tX3VuZGVmaW5lZF9zaTEyOCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCktMSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2tfYWxpZ25yX2VwaTMyKFcsIFUsIEEsIEIsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX2FsaWduZDEyOF9tYXNrKChfX3Y0c2kpKF9fbTEyOGkpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2kpKF9fbTEyOGkpKEIpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2kpKF9fbTEyOGkpKFcpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSkpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrel9hbGlnbnJfZXBpMzIoVSwgQSwgQiwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGkpX19idWlsdGluX2lhMzJfYWxpZ25kMTI4X21hc2soKF9fdjRzaSkoX19tMTI4aSkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzaSkoX19tMTI4aSkoQiksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzaSlfbW1fc2V0emVyb19zaTEyOCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkoVSkpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9hbGlnbnJfZXBpMzIoQSwgQiwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmkpX19idWlsdGluX2lhMzJfYWxpZ25kMjU2X21hc2soKF9fdjhzaSkoX19tMjU2aSkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzaSkoX19tMjU2aSkoQiksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzaSlfbW0yNTZfdW5kZWZpbmVkX3NpMjU2KCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsgfSkKKworI2RlZmluZSBfbW0yNTZfbWFza19hbGlnbnJfZXBpMzIoVywgVSwgQSwgQiwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmkpX19idWlsdGluX2lhMzJfYWxpZ25kMjU2X21hc2soKF9fdjhzaSkoX19tMjU2aSkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzaSkoX19tMjU2aSkoQiksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzaSkoX19tMjU2aSkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21hc2t6X2FsaWducl9lcGkzMihVLCBBLCBCLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9hbGlnbmQyNTZfbWFzaygoX192OHNpKShfX20yNTZpKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNpKShfX20yNTZpKShCKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNpKV9tbTI1Nl9zZXR6ZXJvX3NpMjU2KCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tX2FsaWducl9lcGk2NChBLCBCLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9hbGlnbnExMjhfbWFzaygoX192MmRpKShfX20xMjhpKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRpKShfX20xMjhpKShCKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRpKV9tbV9zZXR6ZXJvX2RpKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KS0xKTsgfSkKKworI2RlZmluZSBfbW1fbWFza19hbGlnbnJfZXBpNjQoVywgVSwgQSwgQiwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGkpX19idWlsdGluX2lhMzJfYWxpZ25xMTI4X21hc2soKF9fdjJkaSkoX19tMTI4aSkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkaSkoX19tMTI4aSkoQiksIChpbnQpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkaSkoX19tMTI4aSkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2t6X2FsaWducl9lcGk2NChVLCBBLCBCLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9hbGlnbnExMjhfbWFzaygoX192MmRpKShfX20xMjhpKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRpKShfX20xMjhpKShCKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRpKV9tbV9zZXR6ZXJvX2RpKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X2FsaWducl9lcGk2NChBLCBCLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9hbGlnbnEyNTZfbWFzaygoX192NGRpKShfX20yNTZpKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRpKShfX20yNTZpKShCKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRpKV9tbTI1Nl91bmRlZmluZWRfcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpLTEpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9tYXNrX2FsaWducl9lcGk2NChXLCBVLCBBLCBCLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9hbGlnbnEyNTZfbWFzaygoX192NGRpKShfX20yNTZpKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRpKShfX20yNTZpKShCKSwgKGludCkoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRpKShfX20yNTZpKShXKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfbWFza3pfYWxpZ25yX2VwaTY0KFUsIEEsIEIsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX2FsaWducTI1Nl9tYXNrKChfX3Y0ZGkpKF9fbTI1NmkpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGkpKF9fbTI1NmkpKEIpLCAoaW50KShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGkpX21tMjU2X3NldHplcm9fc2kyNTYoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tbWFzazgpKFUpKTsgfSkKKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfbW92ZWhkdXBfcHMgKF9fbTEyOCBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4IF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjgpX19idWlsdGluX2lhMzJfc2VsZWN0cHNfMTI4KChfX21tYXNrOClfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKV9tbV9tb3ZlaGR1cF9wcyhfX0EpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZilfX1cpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfbW92ZWhkdXBfcHMgKF9fbW1hc2s4IF9fVSwgX19tMTI4IF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjgpX19idWlsdGluX2lhMzJfc2VsZWN0cHNfMTI4KChfX21tYXNrOClfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKV9tbV9tb3ZlaGR1cF9wcyhfX0EpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZilfbW1fc2V0emVyb19wcygpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfbW92ZWhkdXBfcHMgKF9fbTI1NiBfX1csIF9fbW1hc2s4IF9fVSwgX19tMjU2IF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTYpX19idWlsdGluX2lhMzJfc2VsZWN0cHNfMjU2KChfX21tYXNrOClfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNmKV9tbTI1Nl9tb3ZlaGR1cF9wcyhfX0EpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzZilfX1cpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfbW92ZWhkdXBfcHMgKF9fbW1hc2s4IF9fVSwgX19tMjU2IF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTYpX19idWlsdGluX2lhMzJfc2VsZWN0cHNfMjU2KChfX21tYXNrOClfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNmKV9tbTI1Nl9tb3ZlaGR1cF9wcyhfX0EpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzZilfbW0yNTZfc2V0emVyb19wcygpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfbW92ZWxkdXBfcHMgKF9fbTEyOCBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4IF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjgpX19idWlsdGluX2lhMzJfc2VsZWN0cHNfMTI4KChfX21tYXNrOClfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKV9tbV9tb3ZlbGR1cF9wcyhfX0EpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZilfX1cpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfbW92ZWxkdXBfcHMgKF9fbW1hc2s4IF9fVSwgX19tMTI4IF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjgpX19idWlsdGluX2lhMzJfc2VsZWN0cHNfMTI4KChfX21tYXNrOClfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKV9tbV9tb3ZlbGR1cF9wcyhfX0EpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZilfbW1fc2V0emVyb19wcygpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfbW92ZWxkdXBfcHMgKF9fbTI1NiBfX1csIF9fbW1hc2s4IF9fVSwgX19tMjU2IF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTYpX19idWlsdGluX2lhMzJfc2VsZWN0cHNfMjU2KChfX21tYXNrOClfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNmKV9tbTI1Nl9tb3ZlbGR1cF9wcyhfX0EpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzZilfX1cpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfbW92ZWxkdXBfcHMgKF9fbW1hc2s4IF9fVSwgX19tMjU2IF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTYpX19idWlsdGluX2lhMzJfc2VsZWN0cHNfMjU2KChfX21tYXNrOClfX1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNmKV9tbTI1Nl9tb3ZlbGR1cF9wcyhfX0EpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzZilfbW0yNTZfc2V0emVyb19wcygpKTsKK30KKworI2RlZmluZSBfbW0yNTZfbWFza19zaHVmZmxlX2VwaTMyKFcsIFUsIEEsIEkpIF9fZXh0ZW5zaW9uX18oe1wKKyAgKF9fbTI1NmkpX19idWlsdGluX2lhMzJfc2VsZWN0ZF8yNTYoKF9fbW1hc2s4KShVKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNpKV9tbTI1Nl9zaHVmZmxlX2VwaTMyKChBKSwgKEkpKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNpKShfX20yNTZpKShXKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21hc2t6X3NodWZmbGVfZXBpMzIoVSwgQSwgSSkgX19leHRlbnNpb25fXyh7XAorICAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9zZWxlY3RkXzI1NigoX19tbWFzazgpKFUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2kpX21tMjU2X3NodWZmbGVfZXBpMzIoKEEpLCAoSSkpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2kpX21tMjU2X3NldHplcm9fc2kyNTYoKSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2tfc2h1ZmZsZV9lcGkzMihXLCBVLCBBLCBJKSBfX2V4dGVuc2lvbl9fKHtcCisgIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3NlbGVjdGRfMTI4KChfX21tYXNrOCkoVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzaSlfbW1fc2h1ZmZsZV9lcGkzMigoQSksIChJKSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzaSkoX19tMTI4aSkoVykpOyB9KQorCisjZGVmaW5lIF9tbV9tYXNrel9zaHVmZmxlX2VwaTMyKFUsIEEsIEkpIF9fZXh0ZW5zaW9uX18oe1wKKyAgKF9fbTEyOGkpX19idWlsdGluX2lhMzJfc2VsZWN0ZF8xMjgoKF9fbW1hc2s4KShVKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNpKV9tbV9zaHVmZmxlX2VwaTMyKChBKSwgKEkpKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNpKV9tbV9zZXR6ZXJvX3NpMTI4KCkpOyB9KQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tfbW92X3BkIChfX20xMjhkIF9fVywgX19tbWFzazggX19VLCBfX20xMjhkIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9zZWxlY3RwZF8xMjggKChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAoX192MmRmKSBfX0EsCisgICAgICAgICAgICAgIChfX3YyZGYpIF9fVyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfbW92X3BkIChfX21tYXNrOCBfX1UsIF9fbTEyOGQgX19BKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3NlbGVjdHBkXzEyOCAoKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgICAgIChfX3YyZGYpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjJkZikgX21tX3NldHplcm9fcGQgKCkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTZkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfbW92X3BkIChfX20yNTZkIF9fVywgX19tbWFzazggX19VLCBfX20yNTZkIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9zZWxlY3RwZF8yNTYgKChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgICAoX192NGRmKSBfX0EsCisgICAgICAgICAgICAgIChfX3Y0ZGYpIF9fVyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfbW92X3BkIChfX21tYXNrOCBfX1UsIF9fbTI1NmQgX19BKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX3NlbGVjdHBkXzI1NiAoKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgICAgIChfX3Y0ZGYpIF9fQSwKKyAgICAgICAgICAgICAgKF9fdjRkZikgX21tMjU2X3NldHplcm9fcGQgKCkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19tb3ZfcHMgKF9fbTEyOCBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4IF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3NlbGVjdHBzXzEyOCAoKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgICAgKF9fdjRzZikgX19BLAorICAgICAgICAgICAgIChfX3Y0c2YpIF9fVyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9tb3ZfcHMgKF9fbW1hc2s4IF9fVSwgX19tMTI4IF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3NlbGVjdHBzXzEyOCAoKF9fbW1hc2s4KSBfX1UsCisgICAgICAgICAgICAgKF9fdjRzZikgX19BLAorICAgICAgICAgICAgIChfX3Y0c2YpIF9tbV9zZXR6ZXJvX3BzICgpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfbW92X3BzIChfX20yNTYgX19XLCBfX21tYXNrOCBfX1UsIF9fbTI1NiBfX0EpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9zZWxlY3Rwc18yNTYgKChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgIChfX3Y4c2YpIF9fQSwKKyAgICAgICAgICAgICAoX192OHNmKSBfX1cpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza3pfbW92X3BzIChfX21tYXNrOCBfX1UsIF9fbTI1NiBfX0EpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9zZWxlY3Rwc18yNTYgKChfX21tYXNrOCkgX19VLAorICAgICAgICAgICAgIChfX3Y4c2YpIF9fQSwKKyAgICAgICAgICAgICAoX192OHNmKSBfbW0yNTZfc2V0emVyb19wcyAoKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrX2N2dHBoX3BzIChfX20xMjggX19XLCBfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfdmN2dHBoMnBzX21hc2sgKChfX3Y4aGkpIF9fQSwKKyAgICAgICAgICAgICAoX192NHNmKSBfX1csCisgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3pfY3Z0cGhfcHMgKF9fbW1hc2s4IF9fVSwgX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl92Y3Z0cGgycHNfbWFzayAoKF9fdjhoaSkgX19BLAorICAgICAgICAgICAgIChfX3Y0c2YpCisgICAgICAgICAgICAgX21tX3NldHplcm9fcHMgKCksCisgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza19jdnRwaF9wcyAoX19tMjU2IF9fVywgX19tbWFzazggX19VLCBfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX3ZjdnRwaDJwczI1Nl9tYXNrICgoX192OGhpKSBfX0EsCisgICAgICAgICAgICAgICAgKF9fdjhzZikgX19XLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2t6X2N2dHBoX3BzIChfX21tYXNrOCBfX1UsIF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfdmN2dHBoMnBzMjU2X21hc2sgKChfX3Y4aGkpIF9fQSwKKyAgICAgICAgICAgICAgICAoX192OHNmKQorICAgICAgICAgICAgICAgIF9tbTI1Nl9zZXR6ZXJvX3BzICgpLAorICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza19jdnRwc19waCAoX19tMTI4aSBfX1csIF9fbW1hc2s4IF9fVSwgX19tMTI4IF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92Y3Z0cHMycGhfbWFzayAoKF9fdjRzZikgX19BLCBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4aGkpIF9fVywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmUgX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrel9jdnRwc19waCAoX19tbWFzazggX19VLCBfX20xMjggX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZjdnRwczJwaF9tYXNrICgoX192NHNmKSBfX0EsIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhoaSkgX21tX3NldHplcm9fc2kxMjggKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX21tYXNrOCkgX19VKTsKK30KKworI2RlZmluZSBfbW1fbWFza19jdnRfcm91bmRwc19waChXLCBVLCBBLCBJKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGkpX19idWlsdGluX2lhMzJfdmN2dHBzMnBoX21hc2soKF9fdjRzZikoX19tMTI4KShBKSwgKGludCkoSSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhoaSkoX19tMTI4aSkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tX21hc2t6X2N2dF9yb3VuZHBzX3BoKFUsIEEsIEkpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl92Y3Z0cHMycGhfbWFzaygoX192NHNmKShfX20xMjgpKEEpLCAoaW50KShJKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGhpKV9tbV9zZXR6ZXJvX3NpMTI4KCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKK3N0YXRpYyBfX2lubGluZSBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tfY3Z0cHNfcGggKF9fbTEyOGkgX19XLCBfX21tYXNrOCBfX1UsIF9fbTI1NiBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdmN2dHBzMnBoMjU2X21hc2sgKChfX3Y4c2YpIF9fQSwgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhoaSkgX19XLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorCitzdGF0aWMgX19pbmxpbmUgX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrel9jdnRwc19waCAoIF9fbW1hc2s4IF9fVSwgX19tMjU2IF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92Y3Z0cHMycGgyNTZfbWFzayAoKF9fdjhzZikgX19BLCBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGhpKSBfbW1fc2V0emVyb19zaTEyOCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KSBfX1UpOworfQorI2RlZmluZSBfbW0yNTZfbWFza19jdnRfcm91bmRwc19waChXLCBVLCBBLCBJKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGkpX19idWlsdGluX2lhMzJfdmN2dHBzMnBoMjU2X21hc2soKF9fdjhzZikoX19tMjU2KShBKSwgKGludCkoSSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhoaSkoX19tMTI4aSkoVyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKyNkZWZpbmUgX21tMjU2X21hc2t6X2N2dF9yb3VuZHBzX3BoKFUsIEEsIEkpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl92Y3Z0cHMycGgyNTZfbWFzaygoX192OHNmKShfX20yNTYpKEEpLCAoaW50KShJKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGhpKV9tbV9zZXR6ZXJvX3NpMTI4KCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbW1hc2s4KShVKSk7IH0pCisKKworI3VuZGVmIF9fREVGQVVMVF9GTl9BVFRSUworCisjZW5kaWYgLyogX19BVlg1MTJWTElOVFJJTl9IICovCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9hdnhpbnRyaW4uaCBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL2F2eGludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YmZkZmIKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9hdnhpbnRyaW4uaApAQCAtMCwwICsxLDI5MjggQEAKKy8qPT09LS0tLSBhdnhpbnRyaW4uaCAtIEFWWCBpbnRyaW5zaWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKgorICo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICovCisKKyNpZm5kZWYgX19JTU1JTlRSSU5fSAorI2Vycm9yICJOZXZlciB1c2UgPGF2eGludHJpbi5oPiBkaXJlY3RseTsgaW5jbHVkZSA8aW1taW50cmluLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpZm5kZWYgX19BVlhJTlRSSU5fSAorI2RlZmluZSBfX0FWWElOVFJJTl9ICisKK3R5cGVkZWYgZG91YmxlIF9fdjRkZiBfX2F0dHJpYnV0ZV9fICgoX192ZWN0b3Jfc2l6ZV9fICgzMikpKTsKK3R5cGVkZWYgZmxvYXQgX192OHNmIF9fYXR0cmlidXRlX18gKChfX3ZlY3Rvcl9zaXplX18gKDMyKSkpOwordHlwZWRlZiBsb25nIGxvbmcgX192NGRpIF9fYXR0cmlidXRlX18gKChfX3ZlY3Rvcl9zaXplX18gKDMyKSkpOwordHlwZWRlZiBpbnQgX192OHNpIF9fYXR0cmlidXRlX18gKChfX3ZlY3Rvcl9zaXplX18gKDMyKSkpOwordHlwZWRlZiBzaG9ydCBfX3YxNmhpIF9fYXR0cmlidXRlX18gKChfX3ZlY3Rvcl9zaXplX18gKDMyKSkpOwordHlwZWRlZiBjaGFyIF9fdjMycWkgX19hdHRyaWJ1dGVfXyAoKF9fdmVjdG9yX3NpemVfXyAoMzIpKSk7CisKKy8qIFVuc2lnbmVkIHR5cGVzICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBfX3Y0ZHUgX19hdHRyaWJ1dGVfXyAoKF9fdmVjdG9yX3NpemVfXyAoMzIpKSk7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBfX3Y4c3UgX19hdHRyaWJ1dGVfXyAoKF9fdmVjdG9yX3NpemVfXyAoMzIpKSk7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IF9fdjE2aHUgX19hdHRyaWJ1dGVfXyAoKF9fdmVjdG9yX3NpemVfXyAoMzIpKSk7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgX192MzJxdSBfX2F0dHJpYnV0ZV9fICgoX192ZWN0b3Jfc2l6ZV9fICgzMikpKTsKKworLyogV2UgbmVlZCBhbiBleHBsaWNpdGx5IHNpZ25lZCB2YXJpYW50IGZvciBjaGFyLiBOb3RlIHRoYXQgdGhpcyBzaG91bGRuJ3QKKyAqIGFwcGVhciBpbiB0aGUgaW50ZXJmYWNlIHRob3VnaC4gKi8KK3R5cGVkZWYgc2lnbmVkIGNoYXIgX192MzJxcyBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oMzIpKSk7CisKK3R5cGVkZWYgZmxvYXQgX19tMjU2IF9fYXR0cmlidXRlX18gKChfX3ZlY3Rvcl9zaXplX18gKDMyKSkpOwordHlwZWRlZiBkb3VibGUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oMzIpKSk7Cit0eXBlZGVmIGxvbmcgbG9uZyBfX20yNTZpIF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXygzMikpKTsKKworLyogRGVmaW5lIHRoZSBkZWZhdWx0IGF0dHJpYnV0ZXMgZm9yIHRoZSBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlLiAqLworI2RlZmluZSBfX0RFRkFVTFRfRk5fQVRUUlMgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fLCBfX3RhcmdldF9fKCJhdngiKSkpCisKKy8qIEFyaXRobWV0aWMgKi8KKy8vLyBcYnJpZWYgQWRkcyB0d28gMjU2LWJpdCB2ZWN0b3JzIG9mIFs0IHggZG91YmxlXS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWQUREUEQgLyBBRERQRCBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs0IHggZG91YmxlXSBjb250YWluaW5nIG9uZSBvZiB0aGUgc291cmNlIG9wZXJhbmRzLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs0IHggZG91YmxlXSBjb250YWluaW5nIG9uZSBvZiB0aGUgc291cmNlIG9wZXJhbmRzLgorLy8vIFxyZXR1cm5zIEEgMjU2LWJpdCB2ZWN0b3Igb2YgWzQgeCBkb3VibGVdIGNvbnRhaW5pbmcgdGhlIHN1bXMgb2YgYm90aAorLy8vICAgIG9wZXJhbmRzLgorc3RhdGljIF9faW5saW5lIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfYWRkX3BkKF9fbTI1NmQgX19hLCBfX20yNTZkIF9fYikKK3sKKyAgcmV0dXJuIChfX20yNTZkKSgoX192NGRmKV9fYSsoX192NGRmKV9fYik7Cit9CisKKy8vLyBcYnJpZWYgQWRkcyB0d28gMjU2LWJpdCB2ZWN0b3JzIG9mIFs4IHggZmxvYXRdLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZBRERQUyAvIEFERFBTIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMjU2LWJpdCB2ZWN0b3Igb2YgWzggeCBmbG9hdF0gY29udGFpbmluZyBvbmUgb2YgdGhlIHNvdXJjZSBvcGVyYW5kcy4KKy8vLyBccGFyYW0gX19iCisvLy8gICAgQSAyNTYtYml0IHZlY3RvciBvZiBbOCB4IGZsb2F0XSBjb250YWluaW5nIG9uZSBvZiB0aGUgc291cmNlIG9wZXJhbmRzLgorLy8vIFxyZXR1cm5zIEEgMjU2LWJpdCB2ZWN0b3Igb2YgWzggeCBmbG9hdF0gY29udGFpbmluZyB0aGUgc3VtcyBvZiBib3RoCisvLy8gICAgb3BlcmFuZHMuCitzdGF0aWMgX19pbmxpbmUgX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2FkZF9wcyhfX20yNTYgX19hLCBfX20yNTYgX19iKQoreworICByZXR1cm4gKF9fbTI1NikoKF9fdjhzZilfX2ErKF9fdjhzZilfX2IpOworfQorCisvLy8gXGJyaWVmIFN1YnRyYWN0cyB0d28gMjU2LWJpdCB2ZWN0b3JzIG9mIFs0IHggZG91YmxlXS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWU1VCUEQgLyBTVUJQRCBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs0IHggZG91YmxlXSBjb250YWluaW5nIHRoZSBtaW51ZW5kLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs0IHggZG91YmxlXSBjb250YWluaW5nIHRoZSBzdWJ0cmFoZW5kLgorLy8vIFxyZXR1cm5zIEEgMjU2LWJpdCB2ZWN0b3Igb2YgWzQgeCBkb3VibGVdIGNvbnRhaW5pbmcgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4KKy8vLyAgICBib3RoIG9wZXJhbmRzLgorc3RhdGljIF9faW5saW5lIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfc3ViX3BkKF9fbTI1NmQgX19hLCBfX20yNTZkIF9fYikKK3sKKyAgcmV0dXJuIChfX20yNTZkKSgoX192NGRmKV9fYS0oX192NGRmKV9fYik7Cit9CisKKy8vLyBcYnJpZWYgU3VidHJhY3RzIHR3byAyNTYtYml0IHZlY3RvcnMgb2YgWzggeCBmbG9hdF0uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVlNVQlBTIC8gU1VCUFMgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAyNTYtYml0IHZlY3RvciBvZiBbOCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSBtaW51ZW5kLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs4IHggZmxvYXRdIGNvbnRhaW5pbmcgdGhlIHN1YnRyYWhlbmQuCisvLy8gXHJldHVybnMgQSAyNTYtYml0IHZlY3RvciBvZiBbOCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuCisvLy8gICAgYm90aCBvcGVyYW5kcy4KK3N0YXRpYyBfX2lubGluZSBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfc3ViX3BzKF9fbTI1NiBfX2EsIF9fbTI1NiBfX2IpCit7CisgIHJldHVybiAoX19tMjU2KSgoX192OHNmKV9fYS0oX192OHNmKV9fYik7Cit9CisKKy8vLyBcYnJpZWYgQWRkcyB0aGUgZXZlbi1pbmRleGVkIHZhbHVlcyBhbmQgc3VidHJhY3RzIHRoZSBvZGQtaW5kZXhlZCB2YWx1ZXMgb2YKKy8vLyAgICB0d28gMjU2LWJpdCB2ZWN0b3JzIG9mIFs0IHggZG91YmxlXS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWQUREU1VCUEQgLyBBRERTVUJQRCBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs0IHggZG91YmxlXSBjb250YWluaW5nIHRoZSBsZWZ0IHNvdXJjZSBvcGVyYW5kLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs0IHggZG91YmxlXSBjb250YWluaW5nIHRoZSByaWdodCBzb3VyY2Ugb3BlcmFuZC4KKy8vLyBccmV0dXJucyBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs0IHggZG91YmxlXSBjb250YWluaW5nIHRoZSBhbHRlcm5hdGluZyBzdW1zCisvLy8gICAgYW5kIGRpZmZlcmVuY2VzIGJldHdlZW4gYm90aCBvcGVyYW5kcy4KK3N0YXRpYyBfX2lubGluZSBfX20yNTZkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2FkZHN1Yl9wZChfX20yNTZkIF9fYSwgX19tMjU2ZCBfX2IpCit7CisgIHJldHVybiAoX19tMjU2ZClfX2J1aWx0aW5faWEzMl9hZGRzdWJwZDI1NigoX192NGRmKV9fYSwgKF9fdjRkZilfX2IpOworfQorCisvLy8gXGJyaWVmIEFkZHMgdGhlIGV2ZW4taW5kZXhlZCB2YWx1ZXMgYW5kIHN1YnRyYWN0cyB0aGUgb2RkLWluZGV4ZWQgdmFsdWVzIG9mCisvLy8gICAgdHdvIDI1Ni1iaXQgdmVjdG9ycyBvZiBbOCB4IGZsb2F0XS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWQUREU1VCUFMgLyBBRERTVUJQUyBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs4IHggZmxvYXRdIGNvbnRhaW5pbmcgdGhlIGxlZnQgc291cmNlIG9wZXJhbmQuCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgMjU2LWJpdCB2ZWN0b3Igb2YgWzggeCBmbG9hdF0gY29udGFpbmluZyB0aGUgcmlnaHQgc291cmNlIG9wZXJhbmQuCisvLy8gXHJldHVybnMgQSAyNTYtYml0IHZlY3RvciBvZiBbOCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSBhbHRlcm5hdGluZyBzdW1zIGFuZAorLy8vICAgIGRpZmZlcmVuY2VzIGJldHdlZW4gYm90aCBvcGVyYW5kcy4KK3N0YXRpYyBfX2lubGluZSBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfYWRkc3ViX3BzKF9fbTI1NiBfX2EsIF9fbTI1NiBfX2IpCit7CisgIHJldHVybiAoX19tMjU2KV9fYnVpbHRpbl9pYTMyX2FkZHN1YnBzMjU2KChfX3Y4c2YpX19hLCAoX192OHNmKV9fYik7Cit9CisKKy8vLyBcYnJpZWYgRGl2aWRlcyB0d28gMjU2LWJpdCB2ZWN0b3JzIG9mIFs0IHggZG91YmxlXS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWRElWUEQgLyBESVZQRCBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs0IHggZG91YmxlXSBjb250YWluaW5nIHRoZSBkaXZpZGVuZC4KKy8vLyBccGFyYW0gX19iCisvLy8gICAgQSAyNTYtYml0IHZlY3RvciBvZiBbNCB4IGRvdWJsZV0gY29udGFpbmluZyB0aGUgZGl2aXNvci4KKy8vLyBccmV0dXJucyBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs0IHggZG91YmxlXSBjb250YWluaW5nIHRoZSBxdW90aWVudHMgb2YgYm90aAorLy8vICAgIG9wZXJhbmRzLgorc3RhdGljIF9faW5saW5lIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfZGl2X3BkKF9fbTI1NmQgX19hLCBfX20yNTZkIF9fYikKK3sKKyAgcmV0dXJuIChfX20yNTZkKSgoX192NGRmKV9fYS8oX192NGRmKV9fYik7Cit9CisKKy8vLyBcYnJpZWYgRGl2aWRlcyB0d28gMjU2LWJpdCB2ZWN0b3JzIG9mIFs4IHggZmxvYXRdLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZESVZQUyAvIERJVlBTIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMjU2LWJpdCB2ZWN0b3Igb2YgWzggeCBmbG9hdF0gY29udGFpbmluZyB0aGUgZGl2aWRlbmQuCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgMjU2LWJpdCB2ZWN0b3Igb2YgWzggeCBmbG9hdF0gY29udGFpbmluZyB0aGUgZGl2aXNvci4KKy8vLyBccmV0dXJucyBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs4IHggZmxvYXRdIGNvbnRhaW5pbmcgdGhlIHF1b3RpZW50cyBvZiBib3RoCisvLy8gICAgb3BlcmFuZHMuCitzdGF0aWMgX19pbmxpbmUgX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2Rpdl9wcyhfX20yNTYgX19hLCBfX20yNTYgX19iKQoreworICByZXR1cm4gKF9fbTI1NikoKF9fdjhzZilfX2EvKF9fdjhzZilfX2IpOworfQorCisvLy8gXGJyaWVmIENvbXBhcmVzIHR3byAyNTYtYml0IHZlY3RvcnMgb2YgWzQgeCBkb3VibGVdIGFuZCByZXR1cm5zIHRoZSBncmVhdGVyCisvLy8gICAgb2YgZWFjaCBwYWlyIG9mIHZhbHVlcy4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWTUFYUEQgLyBNQVhQRCBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs0IHggZG91YmxlXSBjb250YWluaW5nIG9uZSBvZiB0aGUgb3BlcmFuZHMuCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgMjU2LWJpdCB2ZWN0b3Igb2YgWzQgeCBkb3VibGVdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBvcGVyYW5kcy4KKy8vLyBccmV0dXJucyBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs0IHggZG91YmxlXSBjb250YWluaW5nIHRoZSBtYXhpbXVtIHZhbHVlcworLy8vICAgIGJldHdlZW4gYm90aCBvcGVyYW5kcy4KK3N0YXRpYyBfX2lubGluZSBfX20yNTZkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21heF9wZChfX20yNTZkIF9fYSwgX19tMjU2ZCBfX2IpCit7CisgIHJldHVybiAoX19tMjU2ZClfX2J1aWx0aW5faWEzMl9tYXhwZDI1NigoX192NGRmKV9fYSwgKF9fdjRkZilfX2IpOworfQorCisvLy8gXGJyaWVmIENvbXBhcmVzIHR3byAyNTYtYml0IHZlY3RvcnMgb2YgWzggeCBmbG9hdF0gYW5kIHJldHVybnMgdGhlIGdyZWF0ZXIKKy8vLyAgICBvZiBlYWNoIHBhaXIgb2YgdmFsdWVzLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZNQVhQUyAvIE1BWFBTIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMjU2LWJpdCB2ZWN0b3Igb2YgWzggeCBmbG9hdF0gY29udGFpbmluZyBvbmUgb2YgdGhlIG9wZXJhbmRzLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs4IHggZmxvYXRdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBvcGVyYW5kcy4KKy8vLyBccmV0dXJucyBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs4IHggZmxvYXRdIGNvbnRhaW5pbmcgdGhlIG1heGltdW0gdmFsdWVzCisvLy8gICAgYmV0d2VlbiBib3RoIG9wZXJhbmRzLgorc3RhdGljIF9faW5saW5lIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXhfcHMoX19tMjU2IF9fYSwgX19tMjU2IF9fYikKK3sKKyAgcmV0dXJuIChfX20yNTYpX19idWlsdGluX2lhMzJfbWF4cHMyNTYoKF9fdjhzZilfX2EsIChfX3Y4c2YpX19iKTsKK30KKworLy8vIFxicmllZiBDb21wYXJlcyB0d28gMjU2LWJpdCB2ZWN0b3JzIG9mIFs0IHggZG91YmxlXSBhbmQgcmV0dXJucyB0aGUgbGVzc2VyCisvLy8gICAgb2YgZWFjaCBwYWlyIG9mIHZhbHVlcy4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWTUlOUEQgLyBNSU5QRCBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs0IHggZG91YmxlXSBjb250YWluaW5nIG9uZSBvZiB0aGUgb3BlcmFuZHMuCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgMjU2LWJpdCB2ZWN0b3Igb2YgWzQgeCBkb3VibGVdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBvcGVyYW5kcy4KKy8vLyBccmV0dXJucyBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs0IHggZG91YmxlXSBjb250YWluaW5nIHRoZSBtaW5pbXVtIHZhbHVlcworLy8vICAgIGJldHdlZW4gYm90aCBvcGVyYW5kcy4KK3N0YXRpYyBfX2lubGluZSBfX20yNTZkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21pbl9wZChfX20yNTZkIF9fYSwgX19tMjU2ZCBfX2IpCit7CisgIHJldHVybiAoX19tMjU2ZClfX2J1aWx0aW5faWEzMl9taW5wZDI1NigoX192NGRmKV9fYSwgKF9fdjRkZilfX2IpOworfQorCisvLy8gXGJyaWVmIENvbXBhcmVzIHR3byAyNTYtYml0IHZlY3RvcnMgb2YgWzggeCBmbG9hdF0gYW5kIHJldHVybnMgdGhlIGxlc3NlcgorLy8vICAgIG9mIGVhY2ggcGFpciBvZiB2YWx1ZXMuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVk1JTlBTIC8gTUlOUFMgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAyNTYtYml0IHZlY3RvciBvZiBbOCB4IGZsb2F0XSBjb250YWluaW5nIG9uZSBvZiB0aGUgb3BlcmFuZHMuCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgMjU2LWJpdCB2ZWN0b3Igb2YgWzggeCBmbG9hdF0gY29udGFpbmluZyBvbmUgb2YgdGhlIG9wZXJhbmRzLgorLy8vIFxyZXR1cm5zIEEgMjU2LWJpdCB2ZWN0b3Igb2YgWzggeCBmbG9hdF0gY29udGFpbmluZyB0aGUgbWluaW11bSB2YWx1ZXMKKy8vLyAgICBiZXR3ZWVuIGJvdGggb3BlcmFuZHMuCitzdGF0aWMgX19pbmxpbmUgX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21pbl9wcyhfX20yNTYgX19hLCBfX20yNTYgX19iKQoreworICByZXR1cm4gKF9fbTI1NilfX2J1aWx0aW5faWEzMl9taW5wczI1NigoX192OHNmKV9fYSwgKF9fdjhzZilfX2IpOworfQorCisvLy8gXGJyaWVmIE11bHRpcGxpZXMgdHdvIDI1Ni1iaXQgdmVjdG9ycyBvZiBbNCB4IGRvdWJsZV0uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVk1VTFBEIC8gTVVMUEQgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAyNTYtYml0IHZlY3RvciBvZiBbNCB4IGRvdWJsZV0gY29udGFpbmluZyBvbmUgb2YgdGhlIG9wZXJhbmRzLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs0IHggZG91YmxlXSBjb250YWluaW5nIG9uZSBvZiB0aGUgb3BlcmFuZHMuCisvLy8gXHJldHVybnMgQSAyNTYtYml0IHZlY3RvciBvZiBbNCB4IGRvdWJsZV0gY29udGFpbmluZyB0aGUgcHJvZHVjdHMgb2YgYm90aAorLy8vICAgIG9wZXJhbmRzLgorc3RhdGljIF9faW5saW5lIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbXVsX3BkKF9fbTI1NmQgX19hLCBfX20yNTZkIF9fYikKK3sKKyAgcmV0dXJuIChfX20yNTZkKSgoX192NGRmKV9fYSAqIChfX3Y0ZGYpX19iKTsKK30KKworLy8vIFxicmllZiBNdWx0aXBsaWVzIHR3byAyNTYtYml0IHZlY3RvcnMgb2YgWzggeCBmbG9hdF0uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVk1VTFBTIC8gTVVMUFMgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAyNTYtYml0IHZlY3RvciBvZiBbOCB4IGZsb2F0XSBjb250YWluaW5nIG9uZSBvZiB0aGUgb3BlcmFuZHMuCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgMjU2LWJpdCB2ZWN0b3Igb2YgWzggeCBmbG9hdF0gY29udGFpbmluZyBvbmUgb2YgdGhlIG9wZXJhbmRzLgorLy8vIFxyZXR1cm5zIEEgMjU2LWJpdCB2ZWN0b3Igb2YgWzggeCBmbG9hdF0gY29udGFpbmluZyB0aGUgcHJvZHVjdHMgb2YgYm90aAorLy8vICAgIG9wZXJhbmRzLgorc3RhdGljIF9faW5saW5lIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tdWxfcHMoX19tMjU2IF9fYSwgX19tMjU2IF9fYikKK3sKKyAgcmV0dXJuIChfX20yNTYpKChfX3Y4c2YpX19hICogKF9fdjhzZilfX2IpOworfQorCisvLy8gXGJyaWVmIENhbGN1bGF0ZXMgdGhlIHNxdWFyZSByb290cyBvZiB0aGUgdmFsdWVzIGluIGEgMjU2LWJpdCB2ZWN0b3Igb2YKKy8vLyAgICBbNCB4IGRvdWJsZV0uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVlNRUlRQRCAvIFNRUlRQRCBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs0IHggZG91YmxlXS4KKy8vLyBccmV0dXJucyBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs0IHggZG91YmxlXSBjb250YWluaW5nIHRoZSBzcXVhcmUgcm9vdHMgb2YgdGhlCisvLy8gICAgdmFsdWVzIGluIHRoZSBvcGVyYW5kLgorc3RhdGljIF9faW5saW5lIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfc3FydF9wZChfX20yNTZkIF9fYSkKK3sKKyAgcmV0dXJuIChfX20yNTZkKV9fYnVpbHRpbl9pYTMyX3NxcnRwZDI1NigoX192NGRmKV9fYSk7Cit9CisKKy8vLyBcYnJpZWYgQ2FsY3VsYXRlcyB0aGUgc3F1YXJlIHJvb3RzIG9mIHRoZSB2YWx1ZXMgaW4gYSAyNTYtYml0IHZlY3RvciBvZgorLy8vICAgIFs4IHggZmxvYXRdLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZTUVJUUFMgLyBTUVJUUFMgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAyNTYtYml0IHZlY3RvciBvZiBbOCB4IGZsb2F0XS4KKy8vLyBccmV0dXJucyBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs4IHggZmxvYXRdIGNvbnRhaW5pbmcgdGhlIHNxdWFyZSByb290cyBvZiB0aGUKKy8vLyAgICB2YWx1ZXMgaW4gdGhlIG9wZXJhbmQuCitzdGF0aWMgX19pbmxpbmUgX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3NxcnRfcHMoX19tMjU2IF9fYSkKK3sKKyAgcmV0dXJuIChfX20yNTYpX19idWlsdGluX2lhMzJfc3FydHBzMjU2KChfX3Y4c2YpX19hKTsKK30KKworLy8vIFxicmllZiBDYWxjdWxhdGVzIHRoZSByZWNpcHJvY2FsIHNxdWFyZSByb290cyBvZiB0aGUgdmFsdWVzIGluIGEgMjU2LWJpdAorLy8vICAgIHZlY3RvciBvZiBbOCB4IGZsb2F0XS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWUlNRUlRQUyAvIFJTUVJUUFMgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAyNTYtYml0IHZlY3RvciBvZiBbOCB4IGZsb2F0XS4KKy8vLyBccmV0dXJucyBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs4IHggZmxvYXRdIGNvbnRhaW5pbmcgdGhlIHJlY2lwcm9jYWwgc3F1YXJlCisvLy8gICAgcm9vdHMgb2YgdGhlIHZhbHVlcyBpbiB0aGUgb3BlcmFuZC4KK3N0YXRpYyBfX2lubGluZSBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfcnNxcnRfcHMoX19tMjU2IF9fYSkKK3sKKyAgcmV0dXJuIChfX20yNTYpX19idWlsdGluX2lhMzJfcnNxcnRwczI1NigoX192OHNmKV9fYSk7Cit9CisKKy8vLyBcYnJpZWYgQ2FsY3VsYXRlcyB0aGUgcmVjaXByb2NhbHMgb2YgdGhlIHZhbHVlcyBpbiBhIDI1Ni1iaXQgdmVjdG9yIG9mCisvLy8gICAgWzggeCBmbG9hdF0uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVlJDUFBTIC8gUkNQUFMgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAyNTYtYml0IHZlY3RvciBvZiBbOCB4IGZsb2F0XS4KKy8vLyBccmV0dXJucyBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs4IHggZmxvYXRdIGNvbnRhaW5pbmcgdGhlIHJlY2lwcm9jYWxzIG9mIHRoZQorLy8vICAgIHZhbHVlcyBpbiB0aGUgb3BlcmFuZC4KK3N0YXRpYyBfX2lubGluZSBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfcmNwX3BzKF9fbTI1NiBfX2EpCit7CisgIHJldHVybiAoX19tMjU2KV9fYnVpbHRpbl9pYTMyX3JjcHBzMjU2KChfX3Y4c2YpX19hKTsKK30KKworLy8vIFxicmllZiBSb3VuZHMgdGhlIHZhbHVlcyBpbiBhIDI1Ni1iaXQgdmVjdG9yIG9mIFs0IHggZG91YmxlXSBhcyBzcGVjaWZpZWQKKy8vLyAgICBieSB0aGUgYnl0ZSBvcGVyYW5kLiBUaGUgc291cmNlIHZhbHVlcyBhcmUgcm91bmRlZCB0byBpbnRlZ2VyIHZhbHVlcyBhbmQKKy8vLyAgICByZXR1cm5lZCBhcyA2NC1iaXQgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZXMuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBcY29kZQorLy8vIF9fbTI1NmQgX21tMjU2X3JvdW5kX3BkKF9fbTI1NmQgViwgY29uc3QgaW50IE0pOworLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVlJPVU5EUEQgLyBST1VORFBEIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIFYKKy8vLyAgICBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs0IHggZG91YmxlXS4KKy8vLyBccGFyYW0gTQorLy8vICAgIEFuIGludGVnZXIgdmFsdWUgdGhhdCBzcGVjaWZpZXMgdGhlIHJvdW5kaW5nIG9wZXJhdGlvbi4KKy8vLyAgICBCaXRzIFs3OjRdIGFyZSByZXNlcnZlZC4KKy8vLyAgICBCaXQgWzNdIGlzIGEgcHJlY2lzaW9uIGV4Y2VwdGlvbiB2YWx1ZToKKy8vLyAgICAwOiBBIG5vcm1hbCBQRSBleGNlcHRpb24gaXMgdXNlZC4KKy8vLyAgICAxOiBUaGUgUEUgZmllbGQgaXMgbm90IHVwZGF0ZWQuCisvLy8gICAgQml0IFsyXSBpcyB0aGUgcm91bmRpbmcgY29udHJvbCBzb3VyY2U6CisvLy8gICAgMDogVXNlIGJpdHMgWzE6MF0gb2YgTS4KKy8vLyAgICAxOiBVc2UgdGhlIGN1cnJlbnQgTVhDU1Igc2V0dGluZy4KKy8vLyAgICBCaXRzIFsxOjBdIGNvbnRhaW4gdGhlIHJvdW5kaW5nIGNvbnRyb2wgZGVmaW5pdGlvbjoKKy8vLyAgICAwMDogTmVhcmVzdC4KKy8vLyAgICAwMTogRG93bndhcmQgKHRvd2FyZCBuZWdhdGl2ZSBpbmZpbml0eSkuCisvLy8gICAgMTA6IFVwd2FyZCAodG93YXJkIHBvc2l0aXZlIGluZmluaXR5KS4KKy8vLyAgICAxMTogVHJ1bmNhdGVkLgorLy8vIFxyZXR1cm5zIEEgMjU2LWJpdCB2ZWN0b3Igb2YgWzQgeCBkb3VibGVdIGNvbnRhaW5pbmcgdGhlIHJvdW5kZWQgdmFsdWVzLgorI2RlZmluZSBfbW0yNTZfcm91bmRfcGQoViwgTSkgX19leHRlbnNpb25fXyAoeyBcCisgICAgKF9fbTI1NmQpX19idWlsdGluX2lhMzJfcm91bmRwZDI1NigoX192NGRmKShfX20yNTZkKShWKSwgKE0pKTsgfSkKKworLy8vIFxicmllZiBSb3VuZHMgdGhlIHZhbHVlcyBzdG9yZWQgaW4gYSAyNTYtYml0IHZlY3RvciBvZiBbOCB4IGZsb2F0XSBhcworLy8vICAgIHNwZWNpZmllZCBieSB0aGUgYnl0ZSBvcGVyYW5kLiBUaGUgc291cmNlIHZhbHVlcyBhcmUgcm91bmRlZCB0byBpbnRlZ2VyCisvLy8gICAgdmFsdWVzIGFuZCByZXR1cm5lZCBhcyBmbG9hdGluZy1wb2ludCB2YWx1ZXMuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBcY29kZQorLy8vIF9fbTI1NiBfbW0yNTZfcm91bmRfcHMoX19tMjU2IFYsIGNvbnN0IGludCBNKTsKKy8vLyBcZW5kY29kZQorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZST1VORFBTIC8gUk9VTkRQUyBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBWCisvLy8gICAgQSAyNTYtYml0IHZlY3RvciBvZiBbOCB4IGZsb2F0XS4KKy8vLyBccGFyYW0gTQorLy8vICAgIEFuIGludGVnZXIgdmFsdWUgdGhhdCBzcGVjaWZpZXMgdGhlIHJvdW5kaW5nIG9wZXJhdGlvbi4KKy8vLyAgICBCaXRzIFs3OjRdIGFyZSByZXNlcnZlZC4KKy8vLyAgICBCaXQgWzNdIGlzIGEgcHJlY2lzaW9uIGV4Y2VwdGlvbiB2YWx1ZToKKy8vLyAgICAwOiBBIG5vcm1hbCBQRSBleGNlcHRpb24gaXMgdXNlZC4KKy8vLyAgICAxOiBUaGUgUEUgZmllbGQgaXMgbm90IHVwZGF0ZWQuCisvLy8gICAgQml0IFsyXSBpcyB0aGUgcm91bmRpbmcgY29udHJvbCBzb3VyY2U6CisvLy8gICAgMDogVXNlIGJpdHMgWzE6MF0gb2YgTS4KKy8vLyAgICAxOiBVc2UgdGhlIGN1cnJlbnQgTVhDU1Igc2V0dGluZy4KKy8vLyAgICBCaXRzIFsxOjBdIGNvbnRhaW4gdGhlIHJvdW5kaW5nIGNvbnRyb2wgZGVmaW5pdGlvbjoKKy8vLyAgICAwMDogTmVhcmVzdC4KKy8vLyAgICAwMTogRG93bndhcmQgKHRvd2FyZCBuZWdhdGl2ZSBpbmZpbml0eSkuCisvLy8gICAgMTA6IFVwd2FyZCAodG93YXJkIHBvc2l0aXZlIGluZmluaXR5KS4KKy8vLyAgICAxMTogVHJ1bmNhdGVkLgorLy8vIFxyZXR1cm5zIEEgMjU2LWJpdCB2ZWN0b3Igb2YgWzggeCBmbG9hdF0gY29udGFpbmluZyB0aGUgcm91bmRlZCB2YWx1ZXMuCisjZGVmaW5lIF9tbTI1Nl9yb3VuZF9wcyhWLCBNKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NilfX2J1aWx0aW5faWEzMl9yb3VuZHBzMjU2KChfX3Y4c2YpKF9fbTI1NikoViksIChNKSk7IH0pCisKKy8vLyBcYnJpZWYgUm91bmRzIHVwIHRoZSB2YWx1ZXMgc3RvcmVkIGluIGEgMjU2LWJpdCB2ZWN0b3Igb2YgWzQgeCBkb3VibGVdLiBUaGUKKy8vLyAgICBzb3VyY2UgdmFsdWVzIGFyZSByb3VuZGVkIHVwIHRvIGludGVnZXIgdmFsdWVzIGFuZCByZXR1cm5lZCBhcyA2NC1iaXQKKy8vLyAgICBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlcy4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFxjb2RlCisvLy8gX19tMjU2ZCBfbW0yNTZfY2VpbF9wZChfX20yNTZkIFYpOworLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVlJPVU5EUEQgLyBST1VORFBEIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIFYKKy8vLyAgICBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs0IHggZG91YmxlXS4KKy8vLyBccmV0dXJucyBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs0IHggZG91YmxlXSBjb250YWluaW5nIHRoZSByb3VuZGVkIHVwIHZhbHVlcy4KKyNkZWZpbmUgX21tMjU2X2NlaWxfcGQoVikgIF9tbTI1Nl9yb3VuZF9wZCgoViksIF9NTV9GUk9VTkRfQ0VJTCkKKworLy8vIFxicmllZiBSb3VuZHMgZG93biB0aGUgdmFsdWVzIHN0b3JlZCBpbiBhIDI1Ni1iaXQgdmVjdG9yIG9mIFs0IHggZG91YmxlXS4KKy8vLyAgICBUaGUgc291cmNlIHZhbHVlcyBhcmUgcm91bmRlZCBkb3duIHRvIGludGVnZXIgdmFsdWVzIGFuZCByZXR1cm5lZCBhcworLy8vICAgIDY0LWJpdCBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlcy4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFxjb2RlCisvLy8gX19tMjU2ZCBfbW0yNTZfZmxvb3JfcGQoX19tMjU2ZCBWKTsKKy8vLyBcZW5kY29kZQorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZST1VORFBEIC8gUk9VTkRQRCBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBWCisvLy8gICAgQSAyNTYtYml0IHZlY3RvciBvZiBbNCB4IGRvdWJsZV0uCisvLy8gXHJldHVybnMgQSAyNTYtYml0IHZlY3RvciBvZiBbNCB4IGRvdWJsZV0gY29udGFpbmluZyB0aGUgcm91bmRlZCBkb3duCisvLy8gICAgdmFsdWVzLgorI2RlZmluZSBfbW0yNTZfZmxvb3JfcGQoVikgX21tMjU2X3JvdW5kX3BkKChWKSwgX01NX0ZST1VORF9GTE9PUikKKworLy8vIFxicmllZiBSb3VuZHMgdXAgdGhlIHZhbHVlcyBzdG9yZWQgaW4gYSAyNTYtYml0IHZlY3RvciBvZiBbOCB4IGZsb2F0XS4gVGhlCisvLy8gICAgc291cmNlIHZhbHVlcyBhcmUgcm91bmRlZCB1cCB0byBpbnRlZ2VyIHZhbHVlcyBhbmQgcmV0dXJuZWQgYXMKKy8vLyAgICBmbG9hdGluZy1wb2ludCB2YWx1ZXMuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBcY29kZQorLy8vIF9fbTI1NiBfbW0yNTZfY2VpbF9wcyhfX20yNTYgVik7CisvLy8gXGVuZGNvZGUKKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWUk9VTkRQUyAvIFJPVU5EUFMgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gVgorLy8vICAgIEEgMjU2LWJpdCB2ZWN0b3Igb2YgWzggeCBmbG9hdF0uCisvLy8gXHJldHVybnMgQSAyNTYtYml0IHZlY3RvciBvZiBbOCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSByb3VuZGVkIHVwIHZhbHVlcy4KKyNkZWZpbmUgX21tMjU2X2NlaWxfcHMoVikgIF9tbTI1Nl9yb3VuZF9wcygoViksIF9NTV9GUk9VTkRfQ0VJTCkKKworLy8vIFxicmllZiBSb3VuZHMgZG93biB0aGUgdmFsdWVzIHN0b3JlZCBpbiBhIDI1Ni1iaXQgdmVjdG9yIG9mIFs4IHggZmxvYXRdLiBUaGUKKy8vLyAgICBzb3VyY2UgdmFsdWVzIGFyZSByb3VuZGVkIGRvd24gdG8gaW50ZWdlciB2YWx1ZXMgYW5kIHJldHVybmVkIGFzCisvLy8gICAgZmxvYXRpbmctcG9pbnQgdmFsdWVzLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gXGNvZGUKKy8vLyBfX20yNTYgX21tMjU2X2Zsb29yX3BzKF9fbTI1NiBWKTsKKy8vLyBcZW5kY29kZQorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZST1VORFBTIC8gUk9VTkRQUyBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBWCisvLy8gICAgQSAyNTYtYml0IHZlY3RvciBvZiBbOCB4IGZsb2F0XS4KKy8vLyBccmV0dXJucyBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs4IHggZmxvYXRdIGNvbnRhaW5pbmcgdGhlIHJvdW5kZWQgZG93biB2YWx1ZXMuCisjZGVmaW5lIF9tbTI1Nl9mbG9vcl9wcyhWKSBfbW0yNTZfcm91bmRfcHMoKFYpLCBfTU1fRlJPVU5EX0ZMT09SKQorCisvKiBMb2dpY2FsICovCisvLy8gXGJyaWVmIFBlcmZvcm1zIGEgYml0d2lzZSBBTkQgb2YgdHdvIDI1Ni1iaXQgdmVjdG9ycyBvZiBbNCB4IGRvdWJsZV0uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVkFORFBEIC8gQU5EUEQgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAyNTYtYml0IHZlY3RvciBvZiBbNCB4IGRvdWJsZV0gY29udGFpbmluZyBvbmUgb2YgdGhlIHNvdXJjZSBvcGVyYW5kcy4KKy8vLyBccGFyYW0gX19iCisvLy8gICAgQSAyNTYtYml0IHZlY3RvciBvZiBbNCB4IGRvdWJsZV0gY29udGFpbmluZyBvbmUgb2YgdGhlIHNvdXJjZSBvcGVyYW5kcy4KKy8vLyBccmV0dXJucyBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs0IHggZG91YmxlXSBjb250YWluaW5nIHRoZSBiaXR3aXNlIEFORCBvZiB0aGUKKy8vLyAgICB2YWx1ZXMgYmV0d2VlbiBib3RoIG9wZXJhbmRzLgorc3RhdGljIF9faW5saW5lIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfYW5kX3BkKF9fbTI1NmQgX19hLCBfX20yNTZkIF9fYikKK3sKKyAgcmV0dXJuIChfX20yNTZkKSgoX192NGR1KV9fYSAmIChfX3Y0ZHUpX19iKTsKK30KKworLy8vIFxicmllZiBQZXJmb3JtcyBhIGJpdHdpc2UgQU5EIG9mIHR3byAyNTYtYml0IHZlY3RvcnMgb2YgWzggeCBmbG9hdF0uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVkFORFBTIC8gQU5EUFMgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAyNTYtYml0IHZlY3RvciBvZiBbOCB4IGZsb2F0XSBjb250YWluaW5nIG9uZSBvZiB0aGUgc291cmNlIG9wZXJhbmRzLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs4IHggZmxvYXRdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBzb3VyY2Ugb3BlcmFuZHMuCisvLy8gXHJldHVybnMgQSAyNTYtYml0IHZlY3RvciBvZiBbOCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSBiaXR3aXNlIEFORCBvZiB0aGUKKy8vLyAgICB2YWx1ZXMgYmV0d2VlbiBib3RoIG9wZXJhbmRzLgorc3RhdGljIF9faW5saW5lIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9hbmRfcHMoX19tMjU2IF9fYSwgX19tMjU2IF9fYikKK3sKKyAgcmV0dXJuIChfX20yNTYpKChfX3Y4c3UpX19hICYgKF9fdjhzdSlfX2IpOworfQorCisvLy8gXGJyaWVmIFBlcmZvcm1zIGEgYml0d2lzZSBBTkQgb2YgdHdvIDI1Ni1iaXQgdmVjdG9ycyBvZiBbNCB4IGRvdWJsZV0sIHVzaW5nCisvLy8gICAgdGhlIG9uZSdzIGNvbXBsZW1lbnQgb2YgdGhlIHZhbHVlcyBjb250YWluZWQgaW4gdGhlIGZpcnN0IHNvdXJjZSBvcGVyYW5kLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZBTkROUEQgLyBBTkROUEQgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAyNTYtYml0IHZlY3RvciBvZiBbNCB4IGRvdWJsZV0gY29udGFpbmluZyB0aGUgbGVmdCBzb3VyY2Ugb3BlcmFuZC4gVGhlCisvLy8gICAgb25lJ3MgY29tcGxlbWVudCBvZiB0aGlzIHZhbHVlIGlzIHVzZWQgaW4gdGhlIGJpdHdpc2UgQU5ELgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs0IHggZG91YmxlXSBjb250YWluaW5nIHRoZSByaWdodCBzb3VyY2Ugb3BlcmFuZC4KKy8vLyBccmV0dXJucyBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs0IHggZG91YmxlXSBjb250YWluaW5nIHRoZSBiaXR3aXNlIEFORCBvZiB0aGUKKy8vLyAgICB2YWx1ZXMgb2YgdGhlIHNlY29uZCBvcGVyYW5kIGFuZCB0aGUgb25lJ3MgY29tcGxlbWVudCBvZiB0aGUgZmlyc3QKKy8vLyAgICBvcGVyYW5kLgorc3RhdGljIF9faW5saW5lIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfYW5kbm90X3BkKF9fbTI1NmQgX19hLCBfX20yNTZkIF9fYikKK3sKKyAgcmV0dXJuIChfX20yNTZkKSh+KF9fdjRkdSlfX2EgJiAoX192NGR1KV9fYik7Cit9CisKKy8vLyBcYnJpZWYgUGVyZm9ybXMgYSBiaXR3aXNlIEFORCBvZiB0d28gMjU2LWJpdCB2ZWN0b3JzIG9mIFs4IHggZmxvYXRdLCB1c2luZworLy8vICAgIHRoZSBvbmUncyBjb21wbGVtZW50IG9mIHRoZSB2YWx1ZXMgY29udGFpbmVkIGluIHRoZSBmaXJzdCBzb3VyY2Ugb3BlcmFuZC4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWQU5ETlBTIC8gQU5ETlBTIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMjU2LWJpdCB2ZWN0b3Igb2YgWzggeCBmbG9hdF0gY29udGFpbmluZyB0aGUgbGVmdCBzb3VyY2Ugb3BlcmFuZC4gVGhlCisvLy8gICAgb25lJ3MgY29tcGxlbWVudCBvZiB0aGlzIHZhbHVlIGlzIHVzZWQgaW4gdGhlIGJpdHdpc2UgQU5ELgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs4IHggZmxvYXRdIGNvbnRhaW5pbmcgdGhlIHJpZ2h0IHNvdXJjZSBvcGVyYW5kLgorLy8vIFxyZXR1cm5zIEEgMjU2LWJpdCB2ZWN0b3Igb2YgWzggeCBmbG9hdF0gY29udGFpbmluZyB0aGUgYml0d2lzZSBBTkQgb2YgdGhlCisvLy8gICAgdmFsdWVzIG9mIHRoZSBzZWNvbmQgb3BlcmFuZCBhbmQgdGhlIG9uZSdzIGNvbXBsZW1lbnQgb2YgdGhlIGZpcnN0CisvLy8gICAgb3BlcmFuZC4KK3N0YXRpYyBfX2lubGluZSBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfYW5kbm90X3BzKF9fbTI1NiBfX2EsIF9fbTI1NiBfX2IpCit7CisgIHJldHVybiAoX19tMjU2KSh+KF9fdjhzdSlfX2EgJiAoX192OHN1KV9fYik7Cit9CisKKy8vLyBcYnJpZWYgUGVyZm9ybXMgYSBiaXR3aXNlIE9SIG9mIHR3byAyNTYtYml0IHZlY3RvcnMgb2YgWzQgeCBkb3VibGVdLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZPUlBEIC8gT1JQRCBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs0IHggZG91YmxlXSBjb250YWluaW5nIG9uZSBvZiB0aGUgc291cmNlIG9wZXJhbmRzLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs0IHggZG91YmxlXSBjb250YWluaW5nIG9uZSBvZiB0aGUgc291cmNlIG9wZXJhbmRzLgorLy8vIFxyZXR1cm5zIEEgMjU2LWJpdCB2ZWN0b3Igb2YgWzQgeCBkb3VibGVdIGNvbnRhaW5pbmcgdGhlIGJpdHdpc2UgT1Igb2YgdGhlCisvLy8gICAgdmFsdWVzIGJldHdlZW4gYm90aCBvcGVyYW5kcy4KK3N0YXRpYyBfX2lubGluZSBfX20yNTZkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X29yX3BkKF9fbTI1NmQgX19hLCBfX20yNTZkIF9fYikKK3sKKyAgcmV0dXJuIChfX20yNTZkKSgoX192NGR1KV9fYSB8IChfX3Y0ZHUpX19iKTsKK30KKworLy8vIFxicmllZiBQZXJmb3JtcyBhIGJpdHdpc2UgT1Igb2YgdHdvIDI1Ni1iaXQgdmVjdG9ycyBvZiBbOCB4IGZsb2F0XS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWT1JQUyAvIE9SUFMgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAyNTYtYml0IHZlY3RvciBvZiBbOCB4IGZsb2F0XSBjb250YWluaW5nIG9uZSBvZiB0aGUgc291cmNlIG9wZXJhbmRzLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs4IHggZmxvYXRdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBzb3VyY2Ugb3BlcmFuZHMuCisvLy8gXHJldHVybnMgQSAyNTYtYml0IHZlY3RvciBvZiBbOCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSBiaXR3aXNlIE9SIG9mIHRoZQorLy8vICAgIHZhbHVlcyBiZXR3ZWVuIGJvdGggb3BlcmFuZHMuCitzdGF0aWMgX19pbmxpbmUgX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X29yX3BzKF9fbTI1NiBfX2EsIF9fbTI1NiBfX2IpCit7CisgIHJldHVybiAoX19tMjU2KSgoX192OHN1KV9fYSB8IChfX3Y4c3UpX19iKTsKK30KKworLy8vIFxicmllZiBQZXJmb3JtcyBhIGJpdHdpc2UgWE9SIG9mIHR3byAyNTYtYml0IHZlY3RvcnMgb2YgWzQgeCBkb3VibGVdLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZYT1JQRCAvIFhPUlBEIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMjU2LWJpdCB2ZWN0b3Igb2YgWzQgeCBkb3VibGVdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBzb3VyY2Ugb3BlcmFuZHMuCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgMjU2LWJpdCB2ZWN0b3Igb2YgWzQgeCBkb3VibGVdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBzb3VyY2Ugb3BlcmFuZHMuCisvLy8gXHJldHVybnMgQSAyNTYtYml0IHZlY3RvciBvZiBbNCB4IGRvdWJsZV0gY29udGFpbmluZyB0aGUgYml0d2lzZSBYT1Igb2YgdGhlCisvLy8gICAgdmFsdWVzIGJldHdlZW4gYm90aCBvcGVyYW5kcy4KK3N0YXRpYyBfX2lubGluZSBfX20yNTZkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3hvcl9wZChfX20yNTZkIF9fYSwgX19tMjU2ZCBfX2IpCit7CisgIHJldHVybiAoX19tMjU2ZCkoKF9fdjRkdSlfX2EgXiAoX192NGR1KV9fYik7Cit9CisKKy8vLyBcYnJpZWYgUGVyZm9ybXMgYSBiaXR3aXNlIFhPUiBvZiB0d28gMjU2LWJpdCB2ZWN0b3JzIG9mIFs4IHggZmxvYXRdLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZYT1JQUyAvIFhPUlBTIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMjU2LWJpdCB2ZWN0b3Igb2YgWzggeCBmbG9hdF0gY29udGFpbmluZyBvbmUgb2YgdGhlIHNvdXJjZSBvcGVyYW5kcy4KKy8vLyBccGFyYW0gX19iCisvLy8gICAgQSAyNTYtYml0IHZlY3RvciBvZiBbOCB4IGZsb2F0XSBjb250YWluaW5nIG9uZSBvZiB0aGUgc291cmNlIG9wZXJhbmRzLgorLy8vIFxyZXR1cm5zIEEgMjU2LWJpdCB2ZWN0b3Igb2YgWzggeCBmbG9hdF0gY29udGFpbmluZyB0aGUgYml0d2lzZSBYT1Igb2YgdGhlCisvLy8gICAgdmFsdWVzIGJldHdlZW4gYm90aCBvcGVyYW5kcy4KK3N0YXRpYyBfX2lubGluZSBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfeG9yX3BzKF9fbTI1NiBfX2EsIF9fbTI1NiBfX2IpCit7CisgIHJldHVybiAoX19tMjU2KSgoX192OHN1KV9fYSBeIChfX3Y4c3UpX19iKTsKK30KKworLyogSG9yaXpvbnRhbCBhcml0aG1ldGljICovCisvLy8gXGJyaWVmIEhvcml6b250YWxseSBhZGRzIHRoZSBhZGphY2VudCBwYWlycyBvZiB2YWx1ZXMgY29udGFpbmVkIGluIHR3bworLy8vICAgIDI1Ni1iaXQgdmVjdG9ycyBvZiBbNCB4IGRvdWJsZV0uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVkhBRERQRCAvIEhBRERQRCBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs0IHggZG91YmxlXSBjb250YWluaW5nIG9uZSBvZiB0aGUgc291cmNlIG9wZXJhbmRzLgorLy8vICAgIFRoZSBob3Jpem9udGFsIHN1bXMgb2YgdGhlIHZhbHVlcyBhcmUgcmV0dXJuZWQgaW4gdGhlIGV2ZW4taW5kZXhlZAorLy8vICAgIGVsZW1lbnRzIG9mIGEgdmVjdG9yIG9mIFs0IHggZG91YmxlXS4KKy8vLyBccGFyYW0gX19iCisvLy8gICAgQSAyNTYtYml0IHZlY3RvciBvZiBbNCB4IGRvdWJsZV0gY29udGFpbmluZyBvbmUgb2YgdGhlIHNvdXJjZSBvcGVyYW5kcy4KKy8vLyAgICBUaGUgaG9yaXpvbnRhbCBzdW1zIG9mIHRoZSB2YWx1ZXMgYXJlIHJldHVybmVkIGluIHRoZSBvZGQtaW5kZXhlZAorLy8vICAgIGVsZW1lbnRzIG9mIGEgdmVjdG9yIG9mIFs0IHggZG91YmxlXS4KKy8vLyBccmV0dXJucyBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs0IHggZG91YmxlXSBjb250YWluaW5nIHRoZSBob3Jpem9udGFsIHN1bXMgb2YKKy8vLyAgICBib3RoIG9wZXJhbmRzLgorc3RhdGljIF9faW5saW5lIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfaGFkZF9wZChfX20yNTZkIF9fYSwgX19tMjU2ZCBfX2IpCit7CisgIHJldHVybiAoX19tMjU2ZClfX2J1aWx0aW5faWEzMl9oYWRkcGQyNTYoKF9fdjRkZilfX2EsIChfX3Y0ZGYpX19iKTsKK30KKworLy8vIFxicmllZiBIb3Jpem9udGFsbHkgYWRkcyB0aGUgYWRqYWNlbnQgcGFpcnMgb2YgdmFsdWVzIGNvbnRhaW5lZCBpbiB0d28KKy8vLyAgICAyNTYtYml0IHZlY3RvcnMgb2YgWzggeCBmbG9hdF0uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVkhBRERQUyAvIEhBRERQUyBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs4IHggZmxvYXRdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBzb3VyY2Ugb3BlcmFuZHMuCisvLy8gICAgVGhlIGhvcml6b250YWwgc3VtcyBvZiB0aGUgdmFsdWVzIGFyZSByZXR1cm5lZCBpbiB0aGUgZWxlbWVudHMgd2l0aAorLy8vICAgIGluZGV4IDAsIDEsIDQsIDUgb2YgYSB2ZWN0b3Igb2YgWzggeCBmbG9hdF0uCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgMjU2LWJpdCB2ZWN0b3Igb2YgWzggeCBmbG9hdF0gY29udGFpbmluZyBvbmUgb2YgdGhlIHNvdXJjZSBvcGVyYW5kcy4KKy8vLyAgICBUaGUgaG9yaXpvbnRhbCBzdW1zIG9mIHRoZSB2YWx1ZXMgYXJlIHJldHVybmVkIGluIHRoZSBlbGVtZW50cyB3aXRoCisvLy8gICAgaW5kZXggMiwgMywgNiwgNyBvZiBhIHZlY3RvciBvZiBbOCB4IGZsb2F0XS4KKy8vLyBccmV0dXJucyBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs4IHggZmxvYXRdIGNvbnRhaW5pbmcgdGhlIGhvcml6b250YWwgc3VtcyBvZgorLy8vICAgIGJvdGggb3BlcmFuZHMuCitzdGF0aWMgX19pbmxpbmUgX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2hhZGRfcHMoX19tMjU2IF9fYSwgX19tMjU2IF9fYikKK3sKKyAgcmV0dXJuIChfX20yNTYpX19idWlsdGluX2lhMzJfaGFkZHBzMjU2KChfX3Y4c2YpX19hLCAoX192OHNmKV9fYik7Cit9CisKKy8vLyBcYnJpZWYgSG9yaXpvbnRhbGx5IHN1YnRyYWN0cyB0aGUgYWRqYWNlbnQgcGFpcnMgb2YgdmFsdWVzIGNvbnRhaW5lZCBpbiB0d28KKy8vLyAgICAyNTYtYml0IHZlY3RvcnMgb2YgWzQgeCBkb3VibGVdLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZIU1VCUEQgLyBIU1VCUEQgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAyNTYtYml0IHZlY3RvciBvZiBbNCB4IGRvdWJsZV0gY29udGFpbmluZyBvbmUgb2YgdGhlIHNvdXJjZSBvcGVyYW5kcy4KKy8vLyAgICBUaGUgaG9yaXpvbnRhbCBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSB2YWx1ZXMgYXJlIHJldHVybmVkIGluIHRoZQorLy8vICAgIGV2ZW4taW5kZXhlZCBlbGVtZW50cyBvZiBhIHZlY3RvciBvZiBbNCB4IGRvdWJsZV0uCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgMjU2LWJpdCB2ZWN0b3Igb2YgWzQgeCBkb3VibGVdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBzb3VyY2Ugb3BlcmFuZHMuCisvLy8gICAgVGhlIGhvcml6b250YWwgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgdmFsdWVzIGFyZSByZXR1cm5lZCBpbiB0aGUKKy8vLyAgICBvZGQtaW5kZXhlZCBlbGVtZW50cyBvZiBhIHZlY3RvciBvZiBbNCB4IGRvdWJsZV0uCisvLy8gXHJldHVybnMgQSAyNTYtYml0IHZlY3RvciBvZiBbNCB4IGRvdWJsZV0gY29udGFpbmluZyB0aGUgaG9yaXpvbnRhbAorLy8vICAgIGRpZmZlcmVuY2VzIG9mIGJvdGggb3BlcmFuZHMuCitzdGF0aWMgX19pbmxpbmUgX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9oc3ViX3BkKF9fbTI1NmQgX19hLCBfX20yNTZkIF9fYikKK3sKKyAgcmV0dXJuIChfX20yNTZkKV9fYnVpbHRpbl9pYTMyX2hzdWJwZDI1NigoX192NGRmKV9fYSwgKF9fdjRkZilfX2IpOworfQorCisvLy8gXGJyaWVmIEhvcml6b250YWxseSBzdWJ0cmFjdHMgdGhlIGFkamFjZW50IHBhaXJzIG9mIHZhbHVlcyBjb250YWluZWQgaW4gdHdvCisvLy8gICAgMjU2LWJpdCB2ZWN0b3JzIG9mIFs4IHggZmxvYXRdLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZIU1VCUFMgLyBIU1VCUFMgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAyNTYtYml0IHZlY3RvciBvZiBbOCB4IGZsb2F0XSBjb250YWluaW5nIG9uZSBvZiB0aGUgc291cmNlIG9wZXJhbmRzLgorLy8vICAgIFRoZSBob3Jpem9udGFsIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIHZhbHVlcyBhcmUgcmV0dXJuZWQgaW4gdGhlCisvLy8gICAgZWxlbWVudHMgd2l0aCBpbmRleCAwLCAxLCA0LCA1IG9mIGEgdmVjdG9yIG9mIFs4IHggZmxvYXRdLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs4IHggZmxvYXRdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBzb3VyY2Ugb3BlcmFuZHMuCisvLy8gICAgVGhlIGhvcml6b250YWwgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgdmFsdWVzIGFyZSByZXR1cm5lZCBpbiB0aGUKKy8vLyAgICBlbGVtZW50cyB3aXRoIGluZGV4IDIsIDMsIDYsIDcgb2YgYSB2ZWN0b3Igb2YgWzggeCBmbG9hdF0uCisvLy8gXHJldHVybnMgQSAyNTYtYml0IHZlY3RvciBvZiBbOCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSBob3Jpem9udGFsCisvLy8gICAgZGlmZmVyZW5jZXMgb2YgYm90aCBvcGVyYW5kcy4KK3N0YXRpYyBfX2lubGluZSBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfaHN1Yl9wcyhfX20yNTYgX19hLCBfX20yNTYgX19iKQoreworICByZXR1cm4gKF9fbTI1NilfX2J1aWx0aW5faWEzMl9oc3VicHMyNTYoKF9fdjhzZilfX2EsIChfX3Y4c2YpX19iKTsKK30KKworLyogVmVjdG9yIHBlcm11dGF0aW9ucyAqLworLy8vIFxicmllZiBDb3BpZXMgdGhlIHZhbHVlcyBpbiBhIDEyOC1iaXQgdmVjdG9yIG9mIFsyIHggZG91YmxlXSBhcyBzcGVjaWZpZWQKKy8vLyAgICBieSB0aGUgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBvcGVyYW5kLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZQRVJNSUxQRCAvIFBFUk1JTFBEIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzIgeCBkb3VibGVdLgorLy8vIFxwYXJhbSBfX2MKKy8vLyAgICBBIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3Igb3BlcmFuZCBzcGVjaWZ5aW5nIGhvdyB0aGUgdmFsdWVzIGFyZSB0byBiZQorLy8vICAgIGNvcGllZC4KKy8vLyAgICBCaXQgWzFdOgorLy8vICAgIDA6IEJpdHMgWzYzOjBdIG9mIHRoZSBzb3VyY2UgYXJlIGNvcGllZCB0byBiaXRzIFs2MzowXSBvZiB0aGUKKy8vLyAgICByZXR1cm5lZCB2ZWN0b3IuCisvLy8gICAgMTogQml0cyBbMTI3OjY0XSBvZiB0aGUgc291cmNlIGFyZSBjb3BpZWQgdG8gYml0cyBbNjM6MF0gb2YgdGhlCisvLy8gICAgcmV0dXJuZWQgdmVjdG9yLgorLy8vICAgIEJpdCBbNjVdOgorLy8vICAgIDA6IEJpdHMgWzYzOjBdIG9mIHRoZSBzb3VyY2UgYXJlIGNvcGllZCB0byBiaXRzIFsxMjc6NjRdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICAxOiBCaXRzIFsxMjc6NjRdIG9mIHRoZSBzb3VyY2UgYXJlIGNvcGllZCB0byBiaXRzIFsxMjc6NjRdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgdmVjdG9yIG9mIFsyIHggZG91YmxlXSBjb250YWluaW5nIHRoZSBjb3BpZWQgdmFsdWVzLgorc3RhdGljIF9faW5saW5lIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fcGVybXV0ZXZhcl9wZChfX20xMjhkIF9fYSwgX19tMTI4aSBfX2MpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl92cGVybWlsdmFycGQoKF9fdjJkZilfX2EsIChfX3YyZGkpX19jKTsKK30KKworLy8vIFxicmllZiBDb3BpZXMgdGhlIHZhbHVlcyBpbiBhIDI1Ni1iaXQgdmVjdG9yIG9mIFs0IHggZG91YmxlXSBhcworLy8vICAgIHNwZWNpZmllZCBieSB0aGUgMjU2LWJpdCBpbnRlZ2VyIHZlY3RvciBvcGVyYW5kLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZQRVJNSUxQRCAvIFBFUk1JTFBEIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMjU2LWJpdCB2ZWN0b3Igb2YgWzQgeCBkb3VibGVdLgorLy8vIFxwYXJhbSBfX2MKKy8vLyAgICBBIDI1Ni1iaXQgaW50ZWdlciB2ZWN0b3Igb3BlcmFuZCBzcGVjaWZ5aW5nIGhvdyB0aGUgdmFsdWVzIGFyZSB0byBiZQorLy8vICAgIGNvcGllZC4KKy8vLyAgICBCaXQgWzFdOgorLy8vICAgIDA6IEJpdHMgWzYzOjBdIG9mIHRoZSBzb3VyY2UgYXJlIGNvcGllZCB0byBiaXRzIFs2MzowXSBvZiB0aGUKKy8vLyAgICByZXR1cm5lZCB2ZWN0b3IuCisvLy8gICAgMTogQml0cyBbMTI3OjY0XSBvZiB0aGUgc291cmNlIGFyZSBjb3BpZWQgdG8gYml0cyBbNjM6MF0gb2YgdGhlCisvLy8gICAgcmV0dXJuZWQgdmVjdG9yLgorLy8vICAgIEJpdCBbNjVdOgorLy8vICAgIDA6IEJpdHMgWzYzOjBdIG9mIHRoZSBzb3VyY2UgYXJlIGNvcGllZCB0byBiaXRzIFsxMjc6NjRdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICAxOiBCaXRzIFsxMjc6NjRdIG9mIHRoZSBzb3VyY2UgYXJlIGNvcGllZCB0byBiaXRzIFsxMjc6NjRdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICBCaXQgWzEyOV06CisvLy8gICAgMDogQml0cyBbMTkxOjEyOF0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzE5MToxMjhdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICAxOiBCaXRzIFsyNTU6MTkyXSBvZiB0aGUgc291cmNlIGFyZSBjb3BpZWQgdG8gYml0cyBbMTkxOjEyOF0gb2YgdGhlCisvLy8gICAgcmV0dXJuZWQgdmVjdG9yLgorLy8vICAgIEJpdCBbMTkzXToKKy8vLyAgICAwOiBCaXRzIFsxOTE6MTI4XSBvZiB0aGUgc291cmNlIGFyZSBjb3BpZWQgdG8gYml0cyBbMjU1OjE5Ml0gb2YgdGhlCisvLy8gICAgcmV0dXJuZWQgdmVjdG9yLgorLy8vICAgIDE6IEJpdHMgWzI1NToxOTJdIG9mIHRoZSBzb3VyY2UgYXJlIGNvcGllZCB0byBiaXRzIFsyNTU6MTkyXSBvZiB0aGUKKy8vLyAgICByZXR1cm5lZCB2ZWN0b3IuCisvLy8gXHJldHVybnMgQSAyNTYtYml0IHZlY3RvciBvZiBbNCB4IGRvdWJsZV0gY29udGFpbmluZyB0aGUgY29waWVkIHZhbHVlcy4KK3N0YXRpYyBfX2lubGluZSBfX20yNTZkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3Blcm11dGV2YXJfcGQoX19tMjU2ZCBfX2EsIF9fbTI1NmkgX19jKQoreworICByZXR1cm4gKF9fbTI1NmQpX19idWlsdGluX2lhMzJfdnBlcm1pbHZhcnBkMjU2KChfX3Y0ZGYpX19hLCAoX192NGRpKV9fYyk7Cit9CisKKy8vLyBcYnJpZWYgQ29waWVzIHRoZSB2YWx1ZXMgc3RvcmVkIGluIGEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0gYXMKKy8vLyAgICBzcGVjaWZpZWQgYnkgdGhlIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3Igb3BlcmFuZC4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWUEVSTUlMUFMgLyBQRVJNSUxQUyBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdLgorLy8vIFxwYXJhbSBfX2MKKy8vLyAgICBBIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3Igb3BlcmFuZCBzcGVjaWZ5aW5nIGhvdyB0aGUgdmFsdWVzIGFyZSB0byBiZQorLy8vICAgIGNvcGllZC4KKy8vLyAgICBCaXRzIFsxOjBdOgorLy8vICAgIDAwOiBCaXRzIFszMTowXSBvZiB0aGUgc291cmNlIGFyZSBjb3BpZWQgdG8gYml0cyBbMzE6MF0gb2YgdGhlCisvLy8gICAgcmV0dXJuZWQgdmVjdG9yLgorLy8vICAgIDAxOiBCaXRzIFs2MzozMl0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzMxOjBdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICAxMDogQml0cyBbOTU6NjRdIG9mIHRoZSBzb3VyY2UgYXJlIGNvcGllZCB0byBiaXRzIFszMTowXSBvZiB0aGUKKy8vLyAgICByZXR1cm5lZCB2ZWN0b3IuCisvLy8gICAgMTE6IEJpdHMgWzEyNzo5Nl0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzMxOjBdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICBCaXRzIFszMzozMl06CisvLy8gICAgMDA6IEJpdHMgWzMxOjBdIG9mIHRoZSBzb3VyY2UgYXJlIGNvcGllZCB0byBiaXRzIFs2MzozMl0gb2YgdGhlCisvLy8gICAgcmV0dXJuZWQgdmVjdG9yLgorLy8vICAgIDAxOiBCaXRzIFs2MzozMl0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzYzOjMyXSBvZiB0aGUKKy8vLyAgICByZXR1cm5lZCB2ZWN0b3IuCisvLy8gICAgMTA6IEJpdHMgWzk1OjY0XSBvZiB0aGUgc291cmNlIGFyZSBjb3BpZWQgdG8gYml0cyBbNjM6MzJdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICAxMTogQml0cyBbMTI3Ojk2XSBvZiB0aGUgc291cmNlIGFyZSBjb3BpZWQgdG8gYml0cyBbNjM6MzJdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICBCaXRzIFs2NTo2NF06CisvLy8gICAgMDA6IEJpdHMgWzMxOjBdIG9mIHRoZSBzb3VyY2UgYXJlIGNvcGllZCB0byBiaXRzIFs5NTo2NF0gb2YgdGhlCisvLy8gICAgcmV0dXJuZWQgdmVjdG9yLgorLy8vICAgIDAxOiBCaXRzIFs2MzozMl0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzk1OjY0XSBvZiB0aGUKKy8vLyAgICByZXR1cm5lZCB2ZWN0b3IuCisvLy8gICAgMTA6IEJpdHMgWzk1OjY0XSBvZiB0aGUgc291cmNlIGFyZSBjb3BpZWQgdG8gYml0cyBbOTU6NjRdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICAxMTogQml0cyBbMTI3Ojk2XSBvZiB0aGUgc291cmNlIGFyZSBjb3BpZWQgdG8gYml0cyBbOTU6NjRdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICBCaXRzIFs5Nzo5Nl06CisvLy8gICAgMDA6IEJpdHMgWzMxOjBdIG9mIHRoZSBzb3VyY2UgYXJlIGNvcGllZCB0byBiaXRzIFsxMjc6OTZdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICAwMTogQml0cyBbNjM6MzJdIG9mIHRoZSBzb3VyY2UgYXJlIGNvcGllZCB0byBiaXRzIFsxMjc6OTZdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICAxMDogQml0cyBbOTU6NjRdIG9mIHRoZSBzb3VyY2UgYXJlIGNvcGllZCB0byBiaXRzIFsxMjc6OTZdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICAxMTogQml0cyBbMTI3Ojk2XSBvZiB0aGUgc291cmNlIGFyZSBjb3BpZWQgdG8gYml0cyBbMTI3Ojk2XSBvZiB0aGUKKy8vLyAgICByZXR1cm5lZCB2ZWN0b3IuCisvLy8gXHJldHVybnMgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSBjb3BpZWQgdmFsdWVzLgorc3RhdGljIF9faW5saW5lIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9wZXJtdXRldmFyX3BzKF9fbTEyOCBfX2EsIF9fbTEyOGkgX19jKQoreworICByZXR1cm4gKF9fbTEyOClfX2J1aWx0aW5faWEzMl92cGVybWlsdmFycHMoKF9fdjRzZilfX2EsIChfX3Y0c2kpX19jKTsKK30KKworLy8vIFxicmllZiBDb3BpZXMgdGhlIHZhbHVlcyBzdG9yZWQgaW4gYSAyNTYtYml0IHZlY3RvciBvZiBbOCB4IGZsb2F0XSBhcworLy8vICAgIHNwZWNpZmllZCBieSB0aGUgMjU2LWJpdCBpbnRlZ2VyIHZlY3RvciBvcGVyYW5kLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZQRVJNSUxQUyAvIFBFUk1JTFBTIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMjU2LWJpdCB2ZWN0b3Igb2YgWzggeCBmbG9hdF0uCisvLy8gXHBhcmFtIF9fYworLy8vICAgIEEgMjU2LWJpdCBpbnRlZ2VyIHZlY3RvciBvcGVyYW5kIHNwZWNpZnlpbmcgaG93IHRoZSB2YWx1ZXMgYXJlIHRvIGJlCisvLy8gICAgY29waWVkLgorLy8vICAgIEJpdHMgWzE6MF06CisvLy8gICAgMDA6IEJpdHMgWzMxOjBdIG9mIHRoZSBzb3VyY2UgYXJlIGNvcGllZCB0byBiaXRzIFszMTowXSBvZiB0aGUKKy8vLyAgICByZXR1cm5lZCB2ZWN0b3IuCisvLy8gICAgMDE6IEJpdHMgWzYzOjMyXSBvZiB0aGUgc291cmNlIGFyZSBjb3BpZWQgdG8gYml0cyBbMzE6MF0gb2YgdGhlCisvLy8gICAgcmV0dXJuZWQgdmVjdG9yLgorLy8vICAgIDEwOiBCaXRzIFs5NTo2NF0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzMxOjBdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICAxMTogQml0cyBbMTI3Ojk2XSBvZiB0aGUgc291cmNlIGFyZSBjb3BpZWQgdG8gYml0cyBbMzE6MF0gb2YgdGhlCisvLy8gICAgcmV0dXJuZWQgdmVjdG9yLgorLy8vICAgIEJpdHMgWzMzOjMyXToKKy8vLyAgICAwMDogQml0cyBbMzE6MF0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzYzOjMyXSBvZiB0aGUKKy8vLyAgICByZXR1cm5lZCB2ZWN0b3IuCisvLy8gICAgMDE6IEJpdHMgWzYzOjMyXSBvZiB0aGUgc291cmNlIGFyZSBjb3BpZWQgdG8gYml0cyBbNjM6MzJdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICAxMDogQml0cyBbOTU6NjRdIG9mIHRoZSBzb3VyY2UgYXJlIGNvcGllZCB0byBiaXRzIFs2MzozMl0gb2YgdGhlCisvLy8gICAgcmV0dXJuZWQgdmVjdG9yLgorLy8vICAgIDExOiBCaXRzIFsxMjc6OTZdIG9mIHRoZSBzb3VyY2UgYXJlIGNvcGllZCB0byBiaXRzIFs2MzozMl0gb2YgdGhlCisvLy8gICAgcmV0dXJuZWQgdmVjdG9yLgorLy8vICAgIEJpdHMgWzY1OjY0XToKKy8vLyAgICAwMDogQml0cyBbMzE6MF0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzk1OjY0XSBvZiB0aGUKKy8vLyAgICByZXR1cm5lZCB2ZWN0b3IuCisvLy8gICAgMDE6IEJpdHMgWzYzOjMyXSBvZiB0aGUgc291cmNlIGFyZSBjb3BpZWQgdG8gYml0cyBbOTU6NjRdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICAxMDogQml0cyBbOTU6NjRdIG9mIHRoZSBzb3VyY2UgYXJlIGNvcGllZCB0byBiaXRzIFs5NTo2NF0gb2YgdGhlCisvLy8gICAgcmV0dXJuZWQgdmVjdG9yLgorLy8vICAgIDExOiBCaXRzIFsxMjc6OTZdIG9mIHRoZSBzb3VyY2UgYXJlIGNvcGllZCB0byBiaXRzIFs5NTo2NF0gb2YgdGhlCisvLy8gICAgcmV0dXJuZWQgdmVjdG9yLgorLy8vICAgIEJpdHMgWzk3Ojk2XToKKy8vLyAgICAwMDogQml0cyBbMzE6MF0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzEyNzo5Nl0gb2YgdGhlCisvLy8gICAgcmV0dXJuZWQgdmVjdG9yLgorLy8vICAgIDAxOiBCaXRzIFs2MzozMl0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzEyNzo5Nl0gb2YgdGhlCisvLy8gICAgcmV0dXJuZWQgdmVjdG9yLgorLy8vICAgIDEwOiBCaXRzIFs5NTo2NF0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzEyNzo5Nl0gb2YgdGhlCisvLy8gICAgcmV0dXJuZWQgdmVjdG9yLgorLy8vICAgIDExOiBCaXRzIFsxMjc6OTZdIG9mIHRoZSBzb3VyY2UgYXJlIGNvcGllZCB0byBiaXRzIFsxMjc6OTZdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICBCaXRzIFsxMjk6MTI4XToKKy8vLyAgICAwMDogQml0cyBbMTU5OjEyOF0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzE1OToxMjhdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICAwMTogQml0cyBbMTkxOjE2MF0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzE1OToxMjhdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICAxMDogQml0cyBbMjIzOjE5Ml0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzE1OToxMjhdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICAxMTogQml0cyBbMjU1OjIyNF0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzE1OToxMjhdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICBCaXRzIFsxNjE6MTYwXToKKy8vLyAgICAwMDogQml0cyBbMTU5OjEyOF0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzE5MToxNjBdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICAwMTogQml0cyBbMTkxOjE2MF0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzE5MToxNjBdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICAxMDogQml0cyBbMjIzOjE5Ml0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzE5MToxNjBdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICAxMTogQml0cyBbMjU1OjIyNF0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzE5MToxNjBdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICBCaXRzIFsxOTM6MTkyXToKKy8vLyAgICAwMDogQml0cyBbMTU5OjEyOF0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzIyMzoxOTJdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICAwMTogQml0cyBbMTkxOjE2MF0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzIyMzoxOTJdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICAxMDogQml0cyBbMjIzOjE5Ml0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzIyMzoxOTJdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICAxMTogQml0cyBbMjU1OjIyNF0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzIyMzoxOTJdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICBCaXRzIFsyMjU6MjI0XToKKy8vLyAgICAwMDogQml0cyBbMTU5OjEyOF0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzI1NToyMjRdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICAwMTogQml0cyBbMTkxOjE2MF0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzI1NToyMjRdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICAxMDogQml0cyBbMjIzOjE5Ml0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzI1NToyMjRdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICAxMTogQml0cyBbMjU1OjIyNF0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzI1NToyMjRdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyBccmV0dXJucyBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs4IHggZmxvYXRdIGNvbnRhaW5pbmcgdGhlIGNvcGllZCB2YWx1ZXMuCitzdGF0aWMgX19pbmxpbmUgX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3Blcm11dGV2YXJfcHMoX19tMjU2IF9fYSwgX19tMjU2aSBfX2MpCit7CisgIHJldHVybiAoX19tMjU2KV9fYnVpbHRpbl9pYTMyX3ZwZXJtaWx2YXJwczI1NigoX192OHNmKV9fYSwgKF9fdjhzaSlfX2MpOworfQorCisvLy8gXGJyaWVmIENvcGllcyB0aGUgdmFsdWVzIGluIGEgMTI4LWJpdCB2ZWN0b3Igb2YgWzIgeCBkb3VibGVdIGFzCisvLy8gICAgc3BlY2lmaWVkIGJ5IHRoZSBpbW1lZGlhdGUgaW50ZWdlciBvcGVyYW5kLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gXGNvZGUKKy8vLyBfX20xMjhkIF9tbV9wZXJtdXRlX3BkKF9fbTEyOGQgQSwgY29uc3QgaW50IEMpOworLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVlBFUk1JTFBEIC8gUEVSTUlMUEQgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gQQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzIgeCBkb3VibGVdLgorLy8vIFxwYXJhbSBDCisvLy8gICAgQW4gaW1tZWRpYXRlIGludGVnZXIgb3BlcmFuZCBzcGVjaWZ5aW5nIGhvdyB0aGUgdmFsdWVzIGFyZSB0byBiZSBjb3BpZWQuCisvLy8gICAgQml0IFswXToKKy8vLyAgICAwOiBCaXRzIFs2MzowXSBvZiB0aGUgc291cmNlIGFyZSBjb3BpZWQgdG8gYml0cyBbNjM6MF0gb2YgdGhlCisvLy8gICAgcmV0dXJuZWQgdmVjdG9yLgorLy8vICAgIDE6IEJpdHMgWzEyNzo2NF0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzYzOjBdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICBCaXQgWzFdOgorLy8vICAgIDA6IEJpdHMgWzYzOjBdIG9mIHRoZSBzb3VyY2UgYXJlIGNvcGllZCB0byBiaXRzIFsxMjc6NjRdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICAxOiBCaXRzIFsxMjc6NjRdIG9mIHRoZSBzb3VyY2UgYXJlIGNvcGllZCB0byBiaXRzIFsxMjc6NjRdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgdmVjdG9yIG9mIFsyIHggZG91YmxlXSBjb250YWluaW5nIHRoZSBjb3BpZWQgdmFsdWVzLgorI2RlZmluZSBfbW1fcGVybXV0ZV9wZChBLCBDKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGQpX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjJkZikoX19tMTI4ZCkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZilfbW1fdW5kZWZpbmVkX3BkKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDKSA+PiAwKSAmIDB4MSwgKChDKSA+PiAxKSAmIDB4MSk7IH0pCisKKy8vLyBcYnJpZWYgQ29waWVzIHRoZSB2YWx1ZXMgaW4gYSAyNTYtYml0IHZlY3RvciBvZiBbNCB4IGRvdWJsZV0gYXMKKy8vLyAgICBzcGVjaWZpZWQgYnkgdGhlIGltbWVkaWF0ZSBpbnRlZ2VyIG9wZXJhbmQuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBcY29kZQorLy8vIF9fbTI1NmQgX21tMjU2X3Blcm11dGVfcGQoX19tMjU2ZCBBLCBjb25zdCBpbnQgQyk7CisvLy8gXGVuZGNvZGUKKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWUEVSTUlMUEQgLyBQRVJNSUxQRCBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBBCisvLy8gICAgQSAyNTYtYml0IHZlY3RvciBvZiBbNCB4IGRvdWJsZV0uCisvLy8gXHBhcmFtIEMKKy8vLyAgICBBbiBpbW1lZGlhdGUgaW50ZWdlciBvcGVyYW5kIHNwZWNpZnlpbmcgaG93IHRoZSB2YWx1ZXMgYXJlIHRvIGJlIGNvcGllZC4KKy8vLyAgICBCaXQgWzBdOgorLy8vICAgIDA6IEJpdHMgWzYzOjBdIG9mIHRoZSBzb3VyY2UgYXJlIGNvcGllZCB0byBiaXRzIFs2MzowXSBvZiB0aGUKKy8vLyAgICByZXR1cm5lZCB2ZWN0b3IuCisvLy8gICAgMTogQml0cyBbMTI3OjY0XSBvZiB0aGUgc291cmNlIGFyZSBjb3BpZWQgdG8gYml0cyBbNjM6MF0gb2YgdGhlCisvLy8gICAgcmV0dXJuZWQgdmVjdG9yLgorLy8vICAgIEJpdCBbMV06CisvLy8gICAgMDogQml0cyBbNjM6MF0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzEyNzo2NF0gb2YgdGhlCisvLy8gICAgcmV0dXJuZWQgdmVjdG9yLgorLy8vICAgIDE6IEJpdHMgWzEyNzo2NF0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzEyNzo2NF0gb2YgdGhlCisvLy8gICAgcmV0dXJuZWQgdmVjdG9yLgorLy8vICAgIEJpdCBbMl06CisvLy8gICAgMDogQml0cyBbMTkxOjEyOF0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzE5MToxMjhdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICAxOiBCaXRzIFsyNTU6MTkyXSBvZiB0aGUgc291cmNlIGFyZSBjb3BpZWQgdG8gYml0cyBbMTkxOjEyOF0gb2YgdGhlCisvLy8gICAgcmV0dXJuZWQgdmVjdG9yLgorLy8vICAgIEJpdCBbM106CisvLy8gICAgMDogQml0cyBbMTkxOjEyOF0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzI1NToxOTJdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICAxOiBCaXRzIFsyNTU6MTkyXSBvZiB0aGUgc291cmNlIGFyZSBjb3BpZWQgdG8gYml0cyBbMjU1OjE5Ml0gb2YgdGhlCisvLy8gICAgcmV0dXJuZWQgdmVjdG9yLgorLy8vIFxyZXR1cm5zIEEgMjU2LWJpdCB2ZWN0b3Igb2YgWzQgeCBkb3VibGVdIGNvbnRhaW5pbmcgdGhlIGNvcGllZCB2YWx1ZXMuCisjZGVmaW5lIF9tbTI1Nl9wZXJtdXRlX3BkKEEsIEMpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2ZClfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcigoX192NGRmKShfX20yNTZkKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRmKV9tbTI1Nl91bmRlZmluZWRfcGQoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICsgKCgoQykgPj4gMCkgJiAweDEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgKyAoKChDKSA+PiAxKSAmIDB4MSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiArICgoKEMpID4+IDIpICYgMHgxKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICsgKCgoQykgPj4gMykgJiAweDEpKTsgfSkKKworLy8vIFxicmllZiBDb3BpZXMgdGhlIHZhbHVlcyBpbiBhIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGFzCisvLy8gICAgc3BlY2lmaWVkIGJ5IHRoZSBpbW1lZGlhdGUgaW50ZWdlciBvcGVyYW5kLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gXGNvZGUKKy8vLyBfX20xMjggX21tX3Blcm11dGVfcHMoX19tMTI4IEEsIGNvbnN0IGludCBDKTsKKy8vLyBcZW5kY29kZQorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZQRVJNSUxQUyAvIFBFUk1JTFBTIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIEEKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdLgorLy8vIFxwYXJhbSBDCisvLy8gICAgQW4gaW1tZWRpYXRlIGludGVnZXIgb3BlcmFuZCBzcGVjaWZ5aW5nIGhvdyB0aGUgdmFsdWVzIGFyZSB0byBiZSBjb3BpZWQuCisvLy8gICAgQml0cyBbMTowXToKKy8vLyAgICAwMDogQml0cyBbMzE6MF0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzMxOjBdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICAwMTogQml0cyBbNjM6MzJdIG9mIHRoZSBzb3VyY2UgYXJlIGNvcGllZCB0byBiaXRzIFszMTowXSBvZiB0aGUKKy8vLyAgICByZXR1cm5lZCB2ZWN0b3IuCisvLy8gICAgMTA6IEJpdHMgWzk1OjY0XSBvZiB0aGUgc291cmNlIGFyZSBjb3BpZWQgdG8gYml0cyBbMzE6MF0gb2YgdGhlCisvLy8gICAgcmV0dXJuZWQgdmVjdG9yLgorLy8vICAgIDExOiBCaXRzIFsxMjc6OTZdIG9mIHRoZSBzb3VyY2UgYXJlIGNvcGllZCB0byBiaXRzIFszMTowXSBvZiB0aGUKKy8vLyAgICByZXR1cm5lZCB2ZWN0b3IuCisvLy8gICAgQml0cyBbMzoyXToKKy8vLyAgICAwMDogQml0cyBbMzE6MF0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzYzOjMyXSBvZiB0aGUKKy8vLyAgICByZXR1cm5lZCB2ZWN0b3IuCisvLy8gICAgMDE6IEJpdHMgWzYzOjMyXSBvZiB0aGUgc291cmNlIGFyZSBjb3BpZWQgdG8gYml0cyBbNjM6MzJdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICAxMDogQml0cyBbOTU6NjRdIG9mIHRoZSBzb3VyY2UgYXJlIGNvcGllZCB0byBiaXRzIFs2MzozMl0gb2YgdGhlCisvLy8gICAgcmV0dXJuZWQgdmVjdG9yLgorLy8vICAgIDExOiBCaXRzIFsxMjc6OTZdIG9mIHRoZSBzb3VyY2UgYXJlIGNvcGllZCB0byBiaXRzIFs2MzozMl0gb2YgdGhlCisvLy8gICAgcmV0dXJuZWQgdmVjdG9yLgorLy8vICAgIEJpdHMgWzU6NF06CisvLy8gICAgMDA6IEJpdHMgWzMxOjBdIG9mIHRoZSBzb3VyY2UgYXJlIGNvcGllZCB0byBiaXRzIFs5NTo2NF0gb2YgdGhlCisvLy8gICAgcmV0dXJuZWQgdmVjdG9yLgorLy8vICAgIDAxOiBCaXRzIFs2MzozMl0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzk1OjY0XSBvZiB0aGUKKy8vLyAgICByZXR1cm5lZCB2ZWN0b3IuCisvLy8gICAgMTA6IEJpdHMgWzk1OjY0XSBvZiB0aGUgc291cmNlIGFyZSBjb3BpZWQgdG8gYml0cyBbOTU6NjRdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICAxMTogQml0cyBbMTI3Ojk2XSBvZiB0aGUgc291cmNlIGFyZSBjb3BpZWQgdG8gYml0cyBbOTU6NjRdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICBCaXRzIFs3OjZdOgorLy8vICAgIDAwOiBCaXRzIFszMTowXSBvZiB0aGUgc291cmNlIGFyZSBjb3BpZWQgdG8gYml0cyBbMTI3Ojk2XSBvZiB0aGUKKy8vLyAgICByZXR1cm5lZCB2ZWN0b3IuCisvLy8gICAgMDE6IEJpdHMgWzYzOjMyXSBvZiB0aGUgc291cmNlIGFyZSBjb3BpZWQgdG8gYml0cyBbMTI3Ojk2XSBvZiB0aGUKKy8vLyAgICByZXR1cm5lZCB2ZWN0b3IuCisvLy8gICAgMTA6IEJpdHMgWzk1OjY0XSBvZiB0aGUgc291cmNlIGFyZSBjb3BpZWQgdG8gYml0cyBbMTI3Ojk2XSBvZiB0aGUKKy8vLyAgICByZXR1cm5lZCB2ZWN0b3IuCisvLy8gICAgMTE6IEJpdHMgWzEyNzo5Nl0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzEyNzo5Nl0gb2YgdGhlCisvLy8gICAgcmV0dXJuZWQgdmVjdG9yLgorLy8vIFxyZXR1cm5zIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0gY29udGFpbmluZyB0aGUgY29waWVkIHZhbHVlcy4KKyNkZWZpbmUgX21tX3Blcm11dGVfcHMoQSwgQykgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjgpX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjRzZikoX19tMTI4KShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpX21tX3VuZGVmaW5lZF9wcygpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDKSA+PiAwKSAmIDB4MywgKChDKSA+PiAyKSAmIDB4MywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQykgPj4gNCkgJiAweDMsICgoQykgPj4gNikgJiAweDMpOyB9KQorCisvLy8gXGJyaWVmIENvcGllcyB0aGUgdmFsdWVzIGluIGEgMjU2LWJpdCB2ZWN0b3Igb2YgWzggeCBmbG9hdF0gYXMKKy8vLyAgICBzcGVjaWZpZWQgYnkgdGhlIGltbWVkaWF0ZSBpbnRlZ2VyIG9wZXJhbmQuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBcY29kZQorLy8vIF9fbTI1NiBfbW0yNTZfcGVybXV0ZV9wcyhfX20yNTYgQSwgY29uc3QgaW50IEMpOworLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVlBFUk1JTFBTIC8gUEVSTUlMUFMgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gQQorLy8vICAgIEEgMjU2LWJpdCB2ZWN0b3Igb2YgWzggeCBmbG9hdF0uCisvLy8gXHBhcmFtIEMKKy8vLyAgICBBbiBpbW1lZGlhdGUgaW50ZWdlciBvcGVyYW5kIHNwZWNpZnlpbmcgaG93IHRoZSB2YWx1ZXMgYXJlIHRvIGJlIGNvcGllZC4KKy8vLyAgICBCaXRzIFsxOjBdOgorLy8vICAgIDAwOiBCaXRzIFszMTowXSBvZiB0aGUgc291cmNlIGFyZSBjb3BpZWQgdG8gYml0cyBbMzE6MF0gb2YgdGhlCisvLy8gICAgcmV0dXJuZWQgdmVjdG9yLgorLy8vICAgIDAxOiBCaXRzIFs2MzozMl0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzMxOjBdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICAxMDogQml0cyBbOTU6NjRdIG9mIHRoZSBzb3VyY2UgYXJlIGNvcGllZCB0byBiaXRzIFszMTowXSBvZiB0aGUKKy8vLyAgICByZXR1cm5lZCB2ZWN0b3IuCisvLy8gICAgMTE6IEJpdHMgWzEyNzo5Nl0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzMxOjBdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICBCaXRzIFszOjJdOgorLy8vICAgIDAwOiBCaXRzIFszMTowXSBvZiB0aGUgc291cmNlIGFyZSBjb3BpZWQgdG8gYml0cyBbNjM6MzJdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICAwMTogQml0cyBbNjM6MzJdIG9mIHRoZSBzb3VyY2UgYXJlIGNvcGllZCB0byBiaXRzIFs2MzozMl0gb2YgdGhlCisvLy8gICAgcmV0dXJuZWQgdmVjdG9yLgorLy8vICAgIDEwOiBCaXRzIFs5NTo2NF0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzYzOjMyXSBvZiB0aGUKKy8vLyAgICByZXR1cm5lZCB2ZWN0b3IuCisvLy8gICAgMTE6IEJpdHMgWzEyNzo5Nl0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzYzOjMyXSBvZiB0aGUKKy8vLyAgICByZXR1cm5lZCB2ZWN0b3IuCisvLy8gICAgQml0cyBbNTo0XToKKy8vLyAgICAwMDogQml0cyBbMzE6MF0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzk1OjY0XSBvZiB0aGUKKy8vLyAgICByZXR1cm5lZCB2ZWN0b3IuCisvLy8gICAgMDE6IEJpdHMgWzYzOjMyXSBvZiB0aGUgc291cmNlIGFyZSBjb3BpZWQgdG8gYml0cyBbOTU6NjRdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICAxMDogQml0cyBbOTU6NjRdIG9mIHRoZSBzb3VyY2UgYXJlIGNvcGllZCB0byBiaXRzIFs5NTo2NF0gb2YgdGhlCisvLy8gICAgcmV0dXJuZWQgdmVjdG9yLgorLy8vICAgIDExOiBCaXRzIFsxMjc6OTZdIG9mIHRoZSBzb3VyY2UgYXJlIGNvcGllZCB0byBiaXRzIFs5NTo2NF0gb2YgdGhlCisvLy8gICAgcmV0dXJuZWQgdmVjdG9yLgorLy8vICAgIEJpdHMgWzc6Nl06CisvLy8gICAgMDA6IEJpdHMgWzMxOjBdIG9mIHRoZSBzb3VyY2UgYXJlIGNvcGllZCB0byBiaXRzIFsxMjc6OTZdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICAwMTogQml0cyBbNjM6MzJdIG9mIHRoZSBzb3VyY2UgYXJlIGNvcGllZCB0byBiaXRzIFsxMjc6OTZdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICAxMDogQml0cyBbOTU6NjRdIG9mIHRoZSBzb3VyY2UgYXJlIGNvcGllZCB0byBiaXRzIFsxMjc6OTZdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICAxMTogQml0cyBbMTI3Ojk2XSBvZiB0aGUgc291cmNlIGFyZSBjb3BpZWQgdG8gYml0cyBbMTI3Ojk2XSBvZiB0aGUKKy8vLyAgICByZXR1cm5lZCB2ZWN0b3IuCisvLy8gICAgQml0cyBbMTowXToKKy8vLyAgICAwMDogQml0cyBbMTU5OjEyOF0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzE1OToxMjhdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICAwMTogQml0cyBbMTkxOjE2MF0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzE1OToxMjhdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICAxMDogQml0cyBbMjIzOjE5Ml0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzE1OToxMjhdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICAxMTogQml0cyBbMjU1OjIyNF0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzE1OToxMjhdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICBCaXRzIFszOjJdOgorLy8vICAgIDAwOiBCaXRzIFsxNTk6MTI4XSBvZiB0aGUgc291cmNlIGFyZSBjb3BpZWQgdG8gYml0cyBbMTkxOjE2MF0gb2YgdGhlCisvLy8gICAgcmV0dXJuZWQgdmVjdG9yLgorLy8vICAgIDAxOiBCaXRzIFsxOTE6MTYwXSBvZiB0aGUgc291cmNlIGFyZSBjb3BpZWQgdG8gYml0cyBbMTkxOjE2MF0gb2YgdGhlCisvLy8gICAgcmV0dXJuZWQgdmVjdG9yLgorLy8vICAgIDEwOiBCaXRzIFsyMjM6MTkyXSBvZiB0aGUgc291cmNlIGFyZSBjb3BpZWQgdG8gYml0cyBbMTkxOjE2MF0gb2YgdGhlCisvLy8gICAgcmV0dXJuZWQgdmVjdG9yLgorLy8vICAgIDExOiBCaXRzIFsyNTU6MjI0XSBvZiB0aGUgc291cmNlIGFyZSBjb3BpZWQgdG8gYml0cyBbMTkxOjE2MF0gb2YgdGhlCisvLy8gICAgcmV0dXJuZWQgdmVjdG9yLgorLy8vICAgIEJpdHMgWzU6NF06CisvLy8gICAgMDA6IEJpdHMgWzE1OToxMjhdIG9mIHRoZSBzb3VyY2UgYXJlIGNvcGllZCB0byBiaXRzIFsyMjM6MTkyXSBvZiB0aGUKKy8vLyAgICByZXR1cm5lZCB2ZWN0b3IuCisvLy8gICAgMDE6IEJpdHMgWzE5MToxNjBdIG9mIHRoZSBzb3VyY2UgYXJlIGNvcGllZCB0byBiaXRzIFsyMjM6MTkyXSBvZiB0aGUKKy8vLyAgICByZXR1cm5lZCB2ZWN0b3IuCisvLy8gICAgMTA6IEJpdHMgWzIyMzoxOTJdIG9mIHRoZSBzb3VyY2UgYXJlIGNvcGllZCB0byBiaXRzIFsyMjM6MTkyXSBvZiB0aGUKKy8vLyAgICByZXR1cm5lZCB2ZWN0b3IuCisvLy8gICAgMTE6IEJpdHMgWzI1NToyMjRdIG9mIHRoZSBzb3VyY2UgYXJlIGNvcGllZCB0byBiaXRzIFsyMjM6MTkyXSBvZiB0aGUKKy8vLyAgICByZXR1cm5lZCB2ZWN0b3IuCisvLy8gICAgQml0cyBbNzo2XToKKy8vLyAgICAwMDogQml0cyBbMTU5OjEyOF0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzI1NToyMjRdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICAwMTogQml0cyBbMTkxOjE2MF0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzI1NToyMjRdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICAxMDogQml0cyBbMjIzOjE5Ml0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzI1NToyMjRdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyAgICAxMTogQml0cyBbMjU1OjIyNF0gb2YgdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGJpdHMgWzI1NToyMjRdIG9mIHRoZQorLy8vICAgIHJldHVybmVkIHZlY3Rvci4KKy8vLyBccmV0dXJucyBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs4IHggZmxvYXRdIGNvbnRhaW5pbmcgdGhlIGNvcGllZCB2YWx1ZXMuCisjZGVmaW5lIF9tbTI1Nl9wZXJtdXRlX3BzKEEsIEMpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2KV9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3Y4c2YpKF9fbTI1NikoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNmKV9tbTI1Nl91bmRlZmluZWRfcHMoKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgKyAoKChDKSA+PiAwKSAmIDB4MyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICsgKCgoQykgPj4gMikgJiAweDMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCArICgoKEMpID4+IDQpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgKyAoKChDKSA+PiA2KSAmIDB4MyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ICsgKCgoQykgPj4gMCkgJiAweDMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCArICgoKEMpID4+IDIpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgKyAoKChDKSA+PiA0KSAmIDB4MyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ICsgKCgoQykgPj4gNikgJiAweDMpKTsgfSkKKworLy8vIFxicmllZiBQZXJtdXRlcyAxMjgtYml0IGRhdGEgdmFsdWVzIHN0b3JlZCBpbiB0d28gMjU2LWJpdCB2ZWN0b3JzIG9mCisvLy8gICAgWzQgeCBkb3VibGVdLCBhcyBzcGVjaWZpZWQgYnkgdGhlIGltbWVkaWF0ZSBpbnRlZ2VyIG9wZXJhbmQuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBcY29kZQorLy8vIF9fbTI1NmQgX21tMjU2X3Blcm11dGUyZjEyOF9wZChfX20yNTZkIFYxLCBfX20yNTZkIFYyLCBjb25zdCBpbnQgTSk7CisvLy8gXGVuZGNvZGUKKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWUEVSTTJGMTI4IC8gUEVSTTJGMTI4IGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIFYxCisvLy8gICAgQSAyNTYtYml0IHZlY3RvciBvZiBbNCB4IGRvdWJsZV0uCisvLy8gXHBhcmFtIFYyCisvLy8gICAgQSAyNTYtYml0IHZlY3RvciBvZiBbNCB4IGRvdWJsZS4KKy8vLyBccGFyYW0gTQorLy8vICAgIEFuIGltbWVkaWF0ZSBpbnRlZ2VyIG9wZXJhbmQgc3BlY2lmeWluZyBob3cgdGhlIHZhbHVlcyBhcmUgdG8gYmUKKy8vLyAgICBwZXJtdXRlZC4KKy8vLyAgICBCaXRzIFsxOjBdOgorLy8vICAgIDAwOiBCaXRzIFsxMjc6MF0gb2Ygb3BlcmFuZCBWMSBhcmUgY29waWVkIHRvIGJpdHMgWzEyNzowXSBvZiB0aGUKKy8vLyAgICBkZXN0aW5hdGlvbi4KKy8vLyAgICAwMTogQml0cyBbMjU1OjEyOF0gb2Ygb3BlcmFuZCBWMSBhcmUgY29waWVkIHRvIGJpdHMgWzEyNzowXSBvZiB0aGUKKy8vLyAgICBkZXN0aW5hdGlvbi4KKy8vLyAgICAxMDogQml0cyBbMTI3OjBdIG9mIG9wZXJhbmQgVjIgYXJlIGNvcGllZCB0byBiaXRzIFsxMjc6MF0gb2YgdGhlCisvLy8gICAgZGVzdGluYXRpb24uCisvLy8gICAgMTE6IEJpdHMgWzI1NToxMjhdIG9mIG9wZXJhbmQgVjIgYXJlIGNvcGllZCB0byBiaXRzIFsxMjc6MF0gb2YgdGhlCisvLy8gICAgZGVzdGluYXRpb24uCisvLy8gICAgQml0cyBbNTo0XToKKy8vLyAgICAwMDogQml0cyBbMTI3OjBdIG9mIG9wZXJhbmQgVjEgYXJlIGNvcGllZCB0byBiaXRzIFsyNTU6MTI4XSBvZiB0aGUKKy8vLyAgICBkZXN0aW5hdGlvbi4KKy8vLyAgICAwMTogQml0cyBbMjU1OjEyOF0gb2Ygb3BlcmFuZCBWMSBhcmUgY29waWVkIHRvIGJpdHMgWzI1NToxMjhdIG9mIHRoZQorLy8vICAgIGRlc3RpbmF0aW9uLgorLy8vICAgIDEwOiBCaXRzIFsxMjc6MF0gb2Ygb3BlcmFuZCBWMiBhcmUgY29waWVkIHRvIGJpdHMgWzI1NToxMjhdIG9mIHRoZQorLy8vICAgIGRlc3RpbmF0aW9uLgorLy8vICAgIDExOiBCaXRzIFsyNTU6MTI4XSBvZiBvcGVyYW5kIFYyIGFyZSBjb3BpZWQgdG8gYml0cyBbMjU1OjEyOF0gb2YgdGhlCisvLy8gICAgZGVzdGluYXRpb24uCisvLy8gXHJldHVybnMgQSAyNTYtYml0IHZlY3RvciBvZiBbNCB4IGRvdWJsZV0gY29udGFpbmluZyB0aGUgY29waWVkIHZhbHVlcy4KKyNkZWZpbmUgX21tMjU2X3Blcm11dGUyZjEyOF9wZChWMSwgVjIsIE0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2ZClfX2J1aWx0aW5faWEzMl92cGVybTJmMTI4X3BkMjU2KChfX3Y0ZGYpKF9fbTI1NmQpKFYxKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGYpKF9fbTI1NmQpKFYyKSwgKE0pKTsgfSkKKworLy8vIFxicmllZiBQZXJtdXRlcyAxMjgtYml0IGRhdGEgdmFsdWVzIHN0b3JlZCBpbiB0d28gMjU2LWJpdCB2ZWN0b3JzIG9mCisvLy8gICAgWzggeCBmbG9hdF0sIGFzIHNwZWNpZmllZCBieSB0aGUgaW1tZWRpYXRlIGludGVnZXIgb3BlcmFuZC4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFxjb2RlCisvLy8gX19tMjU2IF9tbTI1Nl9wZXJtdXRlMmYxMjhfcHMoX19tMjU2IFYxLCBfX20yNTYgVjIsIGNvbnN0IGludCBNKTsKKy8vLyBcZW5kY29kZQorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZQRVJNMkYxMjggLyBQRVJNMkYxMjggaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gVjEKKy8vLyAgICBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs4IHggZmxvYXRdLgorLy8vIFxwYXJhbSBWMgorLy8vICAgIEEgMjU2LWJpdCB2ZWN0b3Igb2YgWzggeCBmbG9hdF0uCisvLy8gXHBhcmFtIE0KKy8vLyAgICBBbiBpbW1lZGlhdGUgaW50ZWdlciBvcGVyYW5kIHNwZWNpZnlpbmcgaG93IHRoZSB2YWx1ZXMgYXJlIHRvIGJlCisvLy8gICAgcGVybXV0ZWQuCisvLy8gICAgQml0cyBbMTowXToKKy8vLyAgICAwMDogQml0cyBbMTI3OjBdIG9mIG9wZXJhbmQgVjEgYXJlIGNvcGllZCB0byBiaXRzIFsxMjc6MF0gb2YgdGhlCisvLy8gICAgZGVzdGluYXRpb24uCisvLy8gICAgMDE6IEJpdHMgWzI1NToxMjhdIG9mIG9wZXJhbmQgVjEgYXJlIGNvcGllZCB0byBiaXRzIFsxMjc6MF0gb2YgdGhlCisvLy8gICAgZGVzdGluYXRpb24uCisvLy8gICAgMTA6IEJpdHMgWzEyNzowXSBvZiBvcGVyYW5kIFYyIGFyZSBjb3BpZWQgdG8gYml0cyBbMTI3OjBdIG9mIHRoZQorLy8vICAgIGRlc3RpbmF0aW9uLgorLy8vICAgIDExOiBCaXRzIFsyNTU6MTI4XSBvZiBvcGVyYW5kIFYyIGFyZSBjb3BpZWQgdG8gYml0cyBbMTI3OjBdIG9mIHRoZQorLy8vICAgIGRlc3RpbmF0aW9uLgorLy8vICAgIEJpdHMgWzU6NF06CisvLy8gICAgMDA6IEJpdHMgWzEyNzowXSBvZiBvcGVyYW5kIFYxIGFyZSBjb3BpZWQgdG8gYml0cyBbMjU1OjEyOF0gb2YgdGhlCisvLy8gICAgZGVzdGluYXRpb24uCisvLy8gICAgMDE6IEJpdHMgWzI1NToxMjhdIG9mIG9wZXJhbmQgVjEgYXJlIGNvcGllZCB0byBiaXRzIFsyNTU6MTI4XSBvZiB0aGUKKy8vLyAgICBkZXN0aW5hdGlvbi4KKy8vLyAgICAxMDogQml0cyBbMTI3OjBdIG9mIG9wZXJhbmQgVjIgYXJlIGNvcGllZCB0byBiaXRzIFsyNTU6MTI4XSBvZiB0aGUKKy8vLyAgICBkZXN0aW5hdGlvbi4KKy8vLyAgICAxMTogQml0cyBbMjU1OjEyOF0gb2Ygb3BlcmFuZCBWMiBhcmUgY29waWVkIHRvIGJpdHMgWzI1NToxMjhdIG9mIHRoZQorLy8vICAgIGRlc3RpbmF0aW9uLgorLy8vIFxyZXR1cm5zIEEgMjU2LWJpdCB2ZWN0b3Igb2YgWzggeCBmbG9hdF0gY29udGFpbmluZyB0aGUgY29waWVkIHZhbHVlcy4KKyNkZWZpbmUgX21tMjU2X3Blcm11dGUyZjEyOF9wcyhWMSwgVjIsIE0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2KV9fYnVpbHRpbl9pYTMyX3ZwZXJtMmYxMjhfcHMyNTYoKF9fdjhzZikoX19tMjU2KShWMSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2YpKF9fbTI1NikoVjIpLCAoTSkpOyB9KQorCisvLy8gXGJyaWVmIFBlcm11dGVzIDEyOC1iaXQgZGF0YSB2YWx1ZXMgc3RvcmVkIGluIHR3byAyNTYtYml0IGludGVnZXIgdmVjdG9ycywKKy8vLyAgICBhcyBzcGVjaWZpZWQgYnkgdGhlIGltbWVkaWF0ZSBpbnRlZ2VyIG9wZXJhbmQuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBcY29kZQorLy8vIF9fbTI1NmkgX21tMjU2X3Blcm11dGUyZjEyOF9zaTI1NihfX20yNTZpIFYxLCBfX20yNTZpIFYyLCBjb25zdCBpbnQgTSk7CisvLy8gXGVuZGNvZGUKKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWUEVSTTJGMTI4IC8gUEVSTTJGMTI4IGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIFYxCisvLy8gICAgQSAyNTYtYml0IGludGVnZXIgdmVjdG9yLgorLy8vIFxwYXJhbSBWMgorLy8vICAgIEEgMjU2LWJpdCBpbnRlZ2VyIHZlY3Rvci4KKy8vLyBccGFyYW0gTQorLy8vICAgIEFuIGltbWVkaWF0ZSBpbnRlZ2VyIG9wZXJhbmQgc3BlY2lmeWluZyBob3cgdGhlIHZhbHVlcyBhcmUgdG8gYmUgY29waWVkLgorLy8vICAgIEJpdHMgWzE6MF06CisvLy8gICAgMDA6IEJpdHMgWzEyNzowXSBvZiBvcGVyYW5kIFYxIGFyZSBjb3BpZWQgdG8gYml0cyBbMTI3OjBdIG9mIHRoZQorLy8vICAgIGRlc3RpbmF0aW9uLgorLy8vICAgIDAxOiBCaXRzIFsyNTU6MTI4XSBvZiBvcGVyYW5kIFYxIGFyZSBjb3BpZWQgdG8gYml0cyBbMTI3OjBdIG9mIHRoZQorLy8vICAgIGRlc3RpbmF0aW9uLgorLy8vICAgIDEwOiBCaXRzIFsxMjc6MF0gb2Ygb3BlcmFuZCBWMiBhcmUgY29waWVkIHRvIGJpdHMgWzEyNzowXSBvZiB0aGUKKy8vLyAgICBkZXN0aW5hdGlvbi4KKy8vLyAgICAxMTogQml0cyBbMjU1OjEyOF0gb2Ygb3BlcmFuZCBWMiBhcmUgY29waWVkIHRvIGJpdHMgWzEyNzowXSBvZiB0aGUKKy8vLyAgICBkZXN0aW5hdGlvbi4KKy8vLyAgICBCaXRzIFs1OjRdOgorLy8vICAgIDAwOiBCaXRzIFsxMjc6MF0gb2Ygb3BlcmFuZCBWMSBhcmUgY29waWVkIHRvIGJpdHMgWzI1NToxMjhdIG9mIHRoZQorLy8vICAgIGRlc3RpbmF0aW9uLgorLy8vICAgIDAxOiBCaXRzIFsyNTU6MTI4XSBvZiBvcGVyYW5kIFYxIGFyZSBjb3BpZWQgdG8gYml0cyBbMjU1OjEyOF0gb2YgdGhlCisvLy8gICAgZGVzdGluYXRpb24uCisvLy8gICAgMTA6IEJpdHMgWzEyNzowXSBvZiBvcGVyYW5kIFYyIGFyZSBjb3BpZWQgdG8gYml0cyBbMjU1OjEyOF0gb2YgdGhlCisvLy8gICAgZGVzdGluYXRpb24uCisvLy8gICAgMTE6IEJpdHMgWzI1NToxMjhdIG9mIG9wZXJhbmQgVjIgYXJlIGNvcGllZCB0byBiaXRzIFsyNTU6MTI4XSBvZiB0aGUKKy8vLyAgICBkZXN0aW5hdGlvbi4KKy8vLyBccmV0dXJucyBBIDI1Ni1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgY29waWVkIHZhbHVlcy4KKyNkZWZpbmUgX21tMjU2X3Blcm11dGUyZjEyOF9zaTI1NihWMSwgVjIsIE0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl92cGVybTJmMTI4X3NpMjU2KChfX3Y4c2kpKF9fbTI1NmkpKFYxKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2kpKF9fbTI1NmkpKFYyKSwgKE0pKTsgfSkKKworLyogVmVjdG9yIEJsZW5kICovCisvLy8gXGJyaWVmIE1lcmdlcyA2NC1iaXQgZG91YmxlLXByZWNpc2lvbiBkYXRhIHZhbHVlcyBzdG9yZWQgaW4gZWl0aGVyIG9mIHRoZQorLy8vICAgIHR3byAyNTYtYml0IHZlY3RvcnMgb2YgWzQgeCBkb3VibGVdLCBhcyBzcGVjaWZpZWQgYnkgdGhlIGltbWVkaWF0ZQorLy8vICAgIGludGVnZXIgb3BlcmFuZC4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFxjb2RlCisvLy8gX19tMjU2ZCBfbW0yNTZfYmxlbmRfcGQoX19tMjU2ZCBWMSwgX19tMjU2ZCBWMiwgY29uc3QgaW50IE0pOworLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVkJMRU5EUEQgLyBCTEVORFBEIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIFYxCisvLy8gICAgQSAyNTYtYml0IHZlY3RvciBvZiBbNCB4IGRvdWJsZV0uCisvLy8gXHBhcmFtIFYyCisvLy8gICAgQSAyNTYtYml0IHZlY3RvciBvZiBbNCB4IGRvdWJsZV0uCisvLy8gXHBhcmFtIE0KKy8vLyAgICBBbiBpbW1lZGlhdGUgaW50ZWdlciBvcGVyYW5kLCB3aXRoIG1hc2sgYml0cyBbMzowXSBzcGVjaWZ5aW5nIGhvdyB0aGUKKy8vLyAgICB2YWx1ZXMgYXJlIHRvIGJlIGNvcGllZC4gVGhlIHBvc2l0aW9uIG9mIHRoZSBtYXNrIGJpdCBjb3JyZXNwb25kcyB0byB0aGUKKy8vLyAgICBpbmRleCBvZiBhIGNvcGllZCB2YWx1ZS4gV2hlbiBhIG1hc2sgYml0IGlzIDAsIHRoZSBjb3JyZXNwb25kaW5nIDY0LWJpdAorLy8vICAgIGVsZW1lbnQgaW4gb3BlcmFuZCBWMSBpcyBjb3BpZWQgdG8gdGhlIHNhbWUgcG9zaXRpb24gaW4gdGhlIGRlc3RpbmF0aW9uLgorLy8vICAgIFdoZW4gYSBtYXNrIGJpdCBpcyAxLCB0aGUgY29ycmVzcG9uZGluZyA2NC1iaXQgZWxlbWVudCBpbiBvcGVyYW5kIFYyIGlzCisvLy8gICAgY29waWVkIHRvIHRoZSBzYW1lIHBvc2l0aW9uIGluIHRoZSBkZXN0aW5hdGlvbi4KKy8vLyBccmV0dXJucyBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs0IHggZG91YmxlXSBjb250YWluaW5nIHRoZSBjb3BpZWQgdmFsdWVzLgorI2RlZmluZSBfbW0yNTZfYmxlbmRfcGQoVjEsIFYyLCBNKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmQpX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjRkZikoX19tMjU2ZCkoVjEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGYpKF9fbTI1NmQpKFYyKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChNKSAmIDB4MDEpID8gNCA6IDApLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKE0pICYgMHgwMikgPyA1IDogMSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoTSkgJiAweDA0KSA/IDYgOiAyKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChNKSAmIDB4MDgpID8gNyA6IDMpKTsgfSkKKworLy8vIFxicmllZiBNZXJnZXMgMzItYml0IHNpbmdsZS1wcmVjaXNpb24gZGF0YSB2YWx1ZXMgc3RvcmVkIGluIGVpdGhlciBvZiB0aGUKKy8vLyAgICB0d28gMjU2LWJpdCB2ZWN0b3JzIG9mIFs4IHggZmxvYXRdLCBhcyBzcGVjaWZpZWQgYnkgdGhlIGltbWVkaWF0ZQorLy8vICAgIGludGVnZXIgb3BlcmFuZC4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFxjb2RlCisvLy8gX19tMjU2IF9tbTI1Nl9ibGVuZF9wcyhfX20yNTYgVjEsIF9fbTI1NiBWMiwgY29uc3QgaW50IE0pOworLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVkJMRU5EUFMgLyBCTEVORFBTIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIFYxCisvLy8gICAgQSAyNTYtYml0IHZlY3RvciBvZiBbOCB4IGZsb2F0XS4KKy8vLyBccGFyYW0gVjIKKy8vLyAgICBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs4IHggZmxvYXRdLgorLy8vIFxwYXJhbSBNCisvLy8gICAgQW4gaW1tZWRpYXRlIGludGVnZXIgb3BlcmFuZCwgd2l0aCBtYXNrIGJpdHMgWzc6MF0gc3BlY2lmeWluZyBob3cgdGhlCisvLy8gICAgdmFsdWVzIGFyZSB0byBiZSBjb3BpZWQuIFRoZSBwb3NpdGlvbiBvZiB0aGUgbWFzayBiaXQgY29ycmVzcG9uZHMgdG8gdGhlCisvLy8gICAgaW5kZXggb2YgYSBjb3BpZWQgdmFsdWUuIFdoZW4gYSBtYXNrIGJpdCBpcyAwLCB0aGUgY29ycmVzcG9uZGluZyAzMi1iaXQKKy8vLyAgICBlbGVtZW50IGluIG9wZXJhbmQgVjEgaXMgY29waWVkIHRvIHRoZSBzYW1lIHBvc2l0aW9uIGluIHRoZSBkZXN0aW5hdGlvbi4KKy8vLyAgICBXaGVuIGEgbWFzayBiaXQgaXMgMSwgdGhlIGNvcnJlc3BvbmRpbmcgMzItYml0IGVsZW1lbnQgaW4gb3BlcmFuZCBWMiBpcworLy8vICAgIGNvcGllZCB0byB0aGUgc2FtZSBwb3NpdGlvbiBpbiB0aGUgZGVzdGluYXRpb24uCisvLy8gXHJldHVybnMgQSAyNTYtYml0IHZlY3RvciBvZiBbOCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSBjb3BpZWQgdmFsdWVzLgorI2RlZmluZSBfbW0yNTZfYmxlbmRfcHMoVjEsIFYyLCBNKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NilfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcigoX192OHNmKShfX20yNTYpKFYxKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2YpKF9fbTI1NikoVjIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoTSkgJiAweDAxKSA/ICA4IDogMCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChNKSAmIDB4MDIpID8gIDkgOiAxKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKE0pICYgMHgwNCkgPyAxMCA6IDIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoTSkgJiAweDA4KSA/IDExIDogMyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChNKSAmIDB4MTApID8gMTIgOiA0KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKE0pICYgMHgyMCkgPyAxMyA6IDUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoTSkgJiAweDQwKSA/IDE0IDogNiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChNKSAmIDB4ODApID8gMTUgOiA3KSk7IH0pCisKKy8vLyBcYnJpZWYgTWVyZ2VzIDY0LWJpdCBkb3VibGUtcHJlY2lzaW9uIGRhdGEgdmFsdWVzIHN0b3JlZCBpbiBlaXRoZXIgb2YgdGhlCisvLy8gICAgdHdvIDI1Ni1iaXQgdmVjdG9ycyBvZiBbNCB4IGRvdWJsZV0sIGFzIHNwZWNpZmllZCBieSB0aGUgMjU2LWJpdCB2ZWN0b3IKKy8vLyAgICBvcGVyYW5kLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZCTEVORFZQRCAvIEJMRU5EVlBEIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMjU2LWJpdCB2ZWN0b3Igb2YgWzQgeCBkb3VibGVdLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs0IHggZG91YmxlXS4KKy8vLyBccGFyYW0gX19jCisvLy8gICAgQSAyNTYtYml0IHZlY3RvciBvcGVyYW5kLCB3aXRoIG1hc2sgYml0cyAyNTUsIDE5MSwgMTI3LCBhbmQgNjMgc3BlY2lmeWluZworLy8vICAgIGhvdyB0aGUgdmFsdWVzIGFyZSB0byBiZSBjb3BpZWQuIFRoZSBwb3NpdGlvbiBvZiB0aGUgbWFzayBiaXQgY29ycmVzcG9uZHMKKy8vLyAgICB0byB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgb2YgYSBjb3BpZWQgdmFsdWUuIFdoZW4gYSBtYXNrIGJpdCBpcyAwLCB0aGUKKy8vLyAgICBjb3JyZXNwb25kaW5nIDY0LWJpdCBlbGVtZW50IGluIG9wZXJhbmQgX19hIGlzIGNvcGllZCB0byB0aGUgc2FtZQorLy8vICAgIHBvc2l0aW9uIGluIHRoZSBkZXN0aW5hdGlvbi4gV2hlbiBhIG1hc2sgYml0IGlzIDEsIHRoZSBjb3JyZXNwb25kaW5nCisvLy8gICAgNjQtYml0IGVsZW1lbnQgaW4gb3BlcmFuZCBfX2IgaXMgY29waWVkIHRvIHRoZSBzYW1lIHBvc2l0aW9uIGluIHRoZQorLy8vICAgIGRlc3RpbmF0aW9uLgorLy8vIFxyZXR1cm5zIEEgMjU2LWJpdCB2ZWN0b3Igb2YgWzQgeCBkb3VibGVdIGNvbnRhaW5pbmcgdGhlIGNvcGllZCB2YWx1ZXMuCitzdGF0aWMgX19pbmxpbmUgX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9ibGVuZHZfcGQoX19tMjU2ZCBfX2EsIF9fbTI1NmQgX19iLCBfX20yNTZkIF9fYykKK3sKKyAgcmV0dXJuIChfX20yNTZkKV9fYnVpbHRpbl9pYTMyX2JsZW5kdnBkMjU2KAorICAgIChfX3Y0ZGYpX19hLCAoX192NGRmKV9fYiwgKF9fdjRkZilfX2MpOworfQorCisvLy8gXGJyaWVmIE1lcmdlcyAzMi1iaXQgc2luZ2xlLXByZWNpc2lvbiBkYXRhIHZhbHVlcyBzdG9yZWQgaW4gZWl0aGVyIG9mIHRoZQorLy8vICAgIHR3byAyNTYtYml0IHZlY3RvcnMgb2YgWzggeCBmbG9hdF0sIGFzIHNwZWNpZmllZCBieSB0aGUgMjU2LWJpdCB2ZWN0b3IKKy8vLyAgICBvcGVyYW5kLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZCTEVORFZQUyAvIEJMRU5EVlBTIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMjU2LWJpdCB2ZWN0b3Igb2YgWzggeCBmbG9hdF0uCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgMjU2LWJpdCB2ZWN0b3Igb2YgWzggeCBmbG9hdF0uCisvLy8gXHBhcmFtIF9fYworLy8vICAgIEEgMjU2LWJpdCB2ZWN0b3Igb3BlcmFuZCwgd2l0aCBtYXNrIGJpdHMgMjU1LCAyMjMsIDE5MSwgMTU5LCAxMjcsIDk1LCA2MywKKy8vLyAgICBhbmQgMzEgc3BlY2lmeWluZyBob3cgdGhlIHZhbHVlcyBhcmUgdG8gYmUgY29waWVkLiBUaGUgcG9zaXRpb24gb2YgdGhlCisvLy8gICAgbWFzayBiaXQgY29ycmVzcG9uZHMgdG8gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IG9mIGEgY29waWVkIHZhbHVlLiBXaGVuCisvLy8gICAgYSBtYXNrIGJpdCBpcyAwLCB0aGUgY29ycmVzcG9uZGluZyAzMi1iaXQgZWxlbWVudCBpbiBvcGVyYW5kIF9fYSBpcworLy8vICAgIGNvcGllZCB0byB0aGUgc2FtZSBwb3NpdGlvbiBpbiB0aGUgZGVzdGluYXRpb24uIFdoZW4gYSBtYXNrIGJpdCBpcyAxLCB0aGUKKy8vLyAgICBjb3JyZXNwb25kaW5nIDMyLWJpdCBlbGVtZW50IGluIG9wZXJhbmQgX19iIGlzIGNvcGllZCB0byB0aGUgc2FtZQorLy8vICAgIHBvc2l0aW9uIGluIHRoZSBkZXN0aW5hdGlvbi4KKy8vLyBccmV0dXJucyBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs4IHggZmxvYXRdIGNvbnRhaW5pbmcgdGhlIGNvcGllZCB2YWx1ZXMuCitzdGF0aWMgX19pbmxpbmUgX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2JsZW5kdl9wcyhfX20yNTYgX19hLCBfX20yNTYgX19iLCBfX20yNTYgX19jKQoreworICByZXR1cm4gKF9fbTI1NilfX2J1aWx0aW5faWEzMl9ibGVuZHZwczI1NigKKyAgICAoX192OHNmKV9fYSwgKF9fdjhzZilfX2IsIChfX3Y4c2YpX19jKTsKK30KKworLyogVmVjdG9yIERvdCBQcm9kdWN0ICovCisvLy8gXGJyaWVmIENvbXB1dGVzIHR3byBkb3QgcHJvZHVjdHMgaW4gcGFyYWxsZWwsIHVzaW5nIHRoZSBsb3dlciBhbmQgdXBwZXIKKy8vLyAgICBoYWx2ZXMgb2YgdHdvIFs4IHggZmxvYXRdIHZlY3RvcnMgYXMgaW5wdXQgdG8gdGhlIHR3byBjb21wdXRhdGlvbnMsIGFuZAorLy8vICAgIHJldHVybmluZyB0aGUgdHdvIGRvdCBwcm9kdWN0cyBpbiB0aGUgbG93ZXIgYW5kIHVwcGVyIGhhbHZlcyBvZiB0aGUKKy8vLyAgICBbOCB4IGZsb2F0XSByZXN1bHQuIFRoZSBpbW1lZGlhdGUgaW50ZWdlciBvcGVyYW5kIGNvbnRyb2xzIHdoaWNoCisvLy8gICAgaW5wdXQgZWxlbWVudHMgd2lsbCBjb250cmlidXRlIHRvIHRoZSBkb3QgcHJvZHVjdCwgYW5kIHdoZXJlIHRoZSBmaW5hbAorLy8vICAgIHJlc3VsdHMgYXJlIHJldHVybmVkLiBJbiBnZW5lcmFsLCBmb3IgZWFjaCBkb3QgcHJvZHVjdCwgdGhlIGZvdXIKKy8vLyAgICBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIHRoZSBpbnB1dCB2ZWN0b3JzIGFyZSBtdWx0aXBsaWVkOyB0aGUgZmlyc3QKKy8vLyAgICB0d28gYW5kIHNlY29uZCB0d28gcHJvZHVjdHMgYXJlIHN1bW1lZCwgdGhlbiB0aGUgdHdvIHN1bXMgYXJlIGFkZGVkIHRvCisvLy8gICAgZm9ybSB0aGUgZmluYWwgcmVzdWx0LgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gXGNvZGUKKy8vLyBfX20yNTYgX21tMjU2X2RwX3BzKF9fbTI1NiBWMSwgX19tMjU2IFYyLCBjb25zdCBpbnQgTSk7CisvLy8gXGVuZGNvZGUKKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWRFBQUyAvIERQUFMgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gVjEKKy8vLyAgICBBIHZlY3RvciBvZiBbOCB4IGZsb2F0XSB2YWx1ZXMsIHRyZWF0ZWQgYXMgdHdvIFs0IHggZmxvYXRdIHZlY3RvcnMuCisvLy8gXHBhcmFtIFYyCisvLy8gICAgQSB2ZWN0b3Igb2YgWzggeCBmbG9hdF0gdmFsdWVzLCB0cmVhdGVkIGFzIHR3byBbNCB4IGZsb2F0XSB2ZWN0b3JzLgorLy8vIFxwYXJhbSBNCisvLy8gICAgQW4gaW1tZWRpYXRlIGludGVnZXIgYXJndW1lbnQuIEJpdHMgWzc6NF0gZGV0ZXJtaW5lIHdoaWNoIGVsZW1lbnRzIG9mCisvLy8gICAgdGhlIGlucHV0IHZlY3RvcnMgYXJlIHVzZWQsIHdpdGggYml0IFs0XSBjb3JyZXNwb25kaW5nIHRvIHRoZSBsb3dlc3QKKy8vLyAgICBlbGVtZW50IGFuZCBiaXQgWzddIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGhpZ2hlc3QgZWxlbWVudCBvZiBlYWNoIFs0IHgKKy8vLyAgICBmbG9hdF0gc3VidmVjdG9yLiBJZiBhIGJpdCBpcyBzZXQsIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIGZyb20gdGhlCisvLy8gICAgdHdvIGlucHV0IHZlY3RvcnMgYXJlIHVzZWQgYXMgYW4gaW5wdXQgZm9yIGRvdCBwcm9kdWN0OyBvdGhlcndpc2UgdGhhdAorLy8vICAgIGlucHV0IGlzIHRyZWF0ZWQgYXMgemVyby4gQml0cyBbMzowXSBkZXRlcm1pbmUgd2hpY2ggZWxlbWVudHMgb2YgdGhlCisvLy8gICAgcmVzdWx0IHdpbGwgcmVjZWl2ZSBhIGNvcHkgb2YgdGhlIGZpbmFsIGRvdCBwcm9kdWN0LCB3aXRoIGJpdCBbMF0KKy8vLyAgICBjb3JyZXNwb25kaW5nIHRvIHRoZSBsb3dlc3QgZWxlbWVudCBhbmQgYml0IFszXSBjb3JyZXNwb25kaW5nIHRvIHRoZQorLy8vICAgIGhpZ2hlc3QgZWxlbWVudCBvZiBlYWNoIFs0IHggZmxvYXRdIHN1YnZlY3Rvci4gSWYgYSBiaXQgaXMgc2V0LCB0aGUgZG90CisvLy8gICAgcHJvZHVjdCBpcyByZXR1cm5lZCBpbiB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50OyBvdGhlcndpc2UgdGhhdCBlbGVtZW50CisvLy8gICAgaXMgc2V0IHRvIHplcm8uIFRoZSBiaXRtYXNrIGlzIGFwcGxpZWQgaW4gdGhlIHNhbWUgd2F5IHRvIGVhY2ggb2YgdGhlCisvLy8gICAgdHdvIHBhcmFsbGVsIGRvdCBwcm9kdWN0IGNvbXB1dGF0aW9ucy4KKy8vLyBccmV0dXJucyBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs4IHggZmxvYXRdIGNvbnRhaW5pbmcgdGhlIHR3byBkb3QgcHJvZHVjdHMuCisjZGVmaW5lIF9tbTI1Nl9kcF9wcyhWMSwgVjIsIE0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2KV9fYnVpbHRpbl9pYTMyX2RwcHMyNTYoKF9fdjhzZikoX19tMjU2KShWMSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2YpKF9fbTI1NikoVjIpLCAoTSkpOyB9KQorCisvKiBWZWN0b3Igc2h1ZmZsZSAqLworLy8vIFxicmllZiBTZWxlY3RzIDggZmxvYXQgdmFsdWVzIGZyb20gdGhlIDI1Ni1iaXQgb3BlcmFuZHMgb2YgWzggeCBmbG9hdF0sIGFzCisvLy8gICAgc3BlY2lmaWVkIGJ5IHRoZSBpbW1lZGlhdGUgdmFsdWUgb3BlcmFuZC4gVGhlIGZvdXIgc2VsZWN0ZWQgZWxlbWVudHMgaW4KKy8vLyAgICBlYWNoIG9wZXJhbmQgYXJlIGNvcGllZCB0byB0aGUgZGVzdGluYXRpb24gYWNjb3JkaW5nIHRvIHRoZSBiaXRzCisvLy8gICAgc3BlY2lmaWVkIGluIHRoZSBpbW1lZGlhdGUgb3BlcmFuZC4gVGhlIHNlbGVjdGVkIGVsZW1lbnRzIGZyb20gdGhlIGZpcnN0CisvLy8gICAgMjU2LWJpdCBvcGVyYW5kIGFyZSBjb3BpZWQgdG8gYml0cyBbNjM6MF0gYW5kIGJpdHMgWzE5MToxMjhdIG9mIHRoZQorLy8vICAgIGRlc3RpbmF0aW9uLCBhbmQgdGhlIHNlbGVjdGVkIGVsZW1lbnRzIGZyb20gdGhlIHNlY29uZCAyNTYtYml0IG9wZXJhbmQKKy8vLyAgICBhcmUgY29waWVkIHRvIGJpdHMgWzEyNzo2NF0gYW5kIGJpdHMgWzI1NToxOTJdIG9mIHRoZSBkZXN0aW5hdGlvbi4gRm9yCisvLy8gICAgZXhhbXBsZSwgaWYgYml0cyBbNzowXSBvZiB0aGUgaW1tZWRpYXRlIG9wZXJhbmQgY29udGFpbiBhIHZhbHVlIG9mIDB4RkYsCisvLy8gICAgdGhlIDI1Ni1iaXQgZGVzdGluYXRpb24gdmVjdG9yIHdvdWxkIGNvbnRhaW4gdGhlIGZvbGxvd2luZyB2YWx1ZXM6IGJbN10sCisvLy8gICAgYls3XSwgYVs3XSwgYVs3XSwgYlszXSwgYlszXSwgYVszXSwgYVszXS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFxjb2RlCisvLy8gX19tMjU2IF9tbTI1Nl9zaHVmZmxlX3BzKF9fbTI1NiBhLCBfX20yNTYgYiwgY29uc3QgaW50IG1hc2spOworLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVlNIVUZQUyAvIFNIVUZQUyBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBhCisvLy8gICAgQSAyNTYtYml0IHZlY3RvciBvZiBbOCB4IGZsb2F0XS4gVGhlIGZvdXIgc2VsZWN0ZWQgZWxlbWVudHMgaW4gdGhpcworLy8vICAgIG9wZXJhbmQgYXJlIGNvcGllZCB0byBiaXRzIFs2MzowXSBhbmQgYml0cyBbMTkxOjEyOF0gaW4gdGhlIGRlc3RpbmF0aW9uLAorLy8vICAgIGFjY29yZGluZyB0byB0aGUgYml0cyBzcGVjaWZpZWQgaW4gdGhlIGltbWVkaWF0ZSBvcGVyYW5kLgorLy8vIFxwYXJhbSBiCisvLy8gICAgQSAyNTYtYml0IHZlY3RvciBvZiBbOCB4IGZsb2F0XS4gVGhlIGZvdXIgc2VsZWN0ZWQgZWxlbWVudHMgaW4gdGhpcworLy8vICAgIG9wZXJhbmQgYXJlIGNvcGllZCB0byBiaXRzIFsxMjc6NjRdIGFuZCBiaXRzIFsyNTU6MTkyXSBpbiB0aGUKKy8vLyAgICBkZXN0aW5hdGlvbiwgYWNjb3JkaW5nIHRvIHRoZSBiaXRzIHNwZWNpZmllZCBpbiB0aGUgaW1tZWRpYXRlIG9wZXJhbmQuCisvLy8gXHBhcmFtIG1hc2sKKy8vLyAgICBBbiBpbW1lZGlhdGUgdmFsdWUgY29udGFpbmluZyBhbiA4LWJpdCB2YWx1ZSBzcGVjaWZ5aW5nIHdoaWNoIGVsZW1lbnRzIHRvCisvLy8gICAgY29weSBmcm9tIGEgYW5kIGIuIEJpdHMgWzM6MF0gc3BlY2lmeSB0aGUgdmFsdWVzIGNvcGllZCBmcm9tIG9wZXJhbmQgYS4KKy8vLyAgICBCaXRzIFs3OjRdIHNwZWNpZnkgdGhlIHZhbHVlcyBjb3BpZWQgZnJvbSBvcGVyYW5kIGIuCisvLy8gICAgVGhlIGRlc3RpbmF0aW9ucyB3aXRoaW4gdGhlIDI1Ni1iaXQgZGVzdGluYXRpb24gYXJlIGFzc2lnbmVkIHZhbHVlcyBhcworLy8vICAgIGZvbGxvd3MsIGFjY29yZGluZyB0byB0aGUgYml0IHZhbHVlIGFzc2lnbm1lbnRzIGRlc2NyaWJlZCBiZWxvdzoKKy8vLyAgICBCaXRzIFsxOjBdIGFyZSB1c2VkIHRvIGFzc2lnbiB2YWx1ZXMgdG8gYml0cyBbMzE6MF0gYW5kIFsxNTk6MTI4XSBpbiB0aGUKKy8vLyAgICBkZXN0aW5hdGlvbi4KKy8vLyAgICBCaXRzIFszOjJdIGFyZSB1c2VkIHRvIGFzc2lnbiB2YWx1ZXMgdG8gYml0cyBbNjM6MzJdIGFuZCBbMTkxOjE2MF0gaW4gdGhlCisvLy8gICAgZGVzdGluYXRpb24uCisvLy8gICAgQml0cyBbNTo0XSBhcmUgdXNlZCB0byBhc3NpZ24gdmFsdWVzIHRvIGJpdHMgWzk1OjY0XSBhbmQgWzIyMzoxOTJdIGluIHRoZQorLy8vICAgIGRlc3RpbmF0aW9uLgorLy8vICAgIEJpdHMgWzc6Nl0gYXJlIHVzZWQgdG8gYXNzaWduIHZhbHVlcyB0byBiaXRzIFsxMjc6OTZdIGFuZCBbMjU1OjIyNF0gaW4KKy8vLyAgICB0aGUgZGVzdGluYXRpb24uCisvLy8gICAgQml0IHZhbHVlIGFzc2lnbm1lbnRzOgorLy8vICAgIDAwOiBCaXRzIFszMTowXSBhbmQgWzE1OToxMjhdIGFyZSBjb3BpZWQgZnJvbSB0aGUgc2VsZWN0ZWQgb3BlcmFuZC4KKy8vLyAgICAwMTogQml0cyBbNjM6MzJdIGFuZCBbMTkxOjE2MF0gYXJlIGNvcGllZCBmcm9tIHRoZSBzZWxlY3RlZCBvcGVyYW5kLgorLy8vICAgIDEwOiBCaXRzIFs5NTo2NF0gYW5kIFsyMjM6MTkyXSBhcmUgY29waWVkIGZyb20gdGhlIHNlbGVjdGVkIG9wZXJhbmQuCisvLy8gICAgMTE6IEJpdHMgWzEyNzo5Nl0gYW5kIFsyNTU6MjI0XSBhcmUgY29waWVkIGZyb20gdGhlIHNlbGVjdGVkIG9wZXJhbmQuCisvLy8gXHJldHVybnMgQSAyNTYtYml0IHZlY3RvciBvZiBbOCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSBzaHVmZmxlZCB2YWx1ZXMuCisjZGVmaW5lIF9tbTI1Nl9zaHVmZmxlX3BzKGEsIGIsIG1hc2spIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2KV9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3Y4c2YpKF9fbTI1NikoYSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNmKShfX20yNTYpKGIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgKyAoKChtYXNrKSA+PiAwKSAmIDB4MyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICArICgoKG1hc2spID4+IDIpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDggICsgKCgobWFzaykgPj4gNCkgJiAweDMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCAgKyAoKChtYXNrKSA+PiA2KSAmIDB4MyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ICArICgoKG1hc2spID4+IDApICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgICsgKCgobWFzaykgPj4gMikgJiAweDMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIgKyAoKChtYXNrKSA+PiA0KSAmIDB4MyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiArICgoKG1hc2spID4+IDYpICYgMHgzKSk7IH0pCisKKy8vLyBcYnJpZWYgU2VsZWN0cyBmb3VyIGRvdWJsZS1wcmVjaXNpb24gdmFsdWVzIGZyb20gdGhlIDI1Ni1iaXQgb3BlcmFuZHMgb2YKKy8vLyAgICBbNCB4IGRvdWJsZV0sIGFzIHNwZWNpZmllZCBieSB0aGUgaW1tZWRpYXRlIHZhbHVlIG9wZXJhbmQuIFRoZSBzZWxlY3RlZAorLy8vICAgIGVsZW1lbnRzIGZyb20gdGhlIGZpcnN0IDI1Ni1iaXQgb3BlcmFuZCBhcmUgY29waWVkIHRvIGJpdHMgWzYzOjBdIGFuZAorLy8vICAgIGJpdHMgWzE5MToxMjhdIGluIHRoZSBkZXN0aW5hdGlvbiwgYW5kIHRoZSBzZWxlY3RlZCBlbGVtZW50cyBmcm9tIHRoZQorLy8vICAgIHNlY29uZCAyNTYtYml0IG9wZXJhbmQgYXJlIGNvcGllZCB0byBiaXRzIFsxMjc6NjRdIGFuZCBiaXRzIFsyNTU6MTkyXSBpbgorLy8vICAgIHRoZSBkZXN0aW5hdGlvbi4gRm9yIGV4YW1wbGUsIGlmIGJpdHMgWzM6MF0gb2YgdGhlIGltbWVkaWF0ZSBvcGVyYW5kCisvLy8gICAgY29udGFpbiBhIHZhbHVlIG9mIDB4RiwgdGhlIDI1Ni1iaXQgZGVzdGluYXRpb24gdmVjdG9yIHdvdWxkIGNvbnRhaW4gdGhlCisvLy8gICAgZm9sbG93aW5nIHZhbHVlczogYlszXSwgYVszXSwgYlsxXSwgYVsxXS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFxjb2RlCisvLy8gX19tMjU2ZCBfbW0yNTZfc2h1ZmZsZV9wZChfX20yNTZkIGEsIF9fbTI1NmQgYiwgY29uc3QgaW50IG1hc2spOworLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVlNIVUZQRCAvIFNIVUZQRCBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBhCisvLy8gICAgQSAyNTYtYml0IHZlY3RvciBvZiBbNCB4IGRvdWJsZV0uCisvLy8gXHBhcmFtIGIKKy8vLyAgICBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs0IHggZG91YmxlXS4KKy8vLyBccGFyYW0gbWFzaworLy8vICAgIEFuIGltbWVkaWF0ZSB2YWx1ZSBjb250YWluaW5nIDgtYml0IHZhbHVlcyBzcGVjaWZ5aW5nIHdoaWNoIGVsZW1lbnRzIHRvCisvLy8gICAgY29weSBmcm9tIGEgYW5kIGI6CisvLy8gICAgQml0IFswXT0wOiBCaXRzIFs2MzowXSBhcmUgY29waWVkIGZyb20gYSB0byBiaXRzIFs2MzowXSBvZiB0aGUKKy8vLyAgICBkZXN0aW5hdGlvbi4KKy8vLyAgICBCaXQgWzBdPTE6IEJpdHMgWzEyNzo2NF0gYXJlIGNvcGllZCBmcm9tIGEgdG8gYml0cyBbNjM6MF0gb2YgdGhlCisvLy8gICAgZGVzdGluYXRpb24uCisvLy8gICAgQml0IFsxXT0wOiBCaXRzIFs2MzowXSBhcmUgY29waWVkIGZyb20gYiB0byBiaXRzIFsxMjc6NjRdIG9mIHRoZQorLy8vICAgIGRlc3RpbmF0aW9uLgorLy8vICAgIEJpdCBbMV09MTogQml0cyBbMTI3OjY0XSBhcmUgY29waWVkIGZyb20gYiB0byBiaXRzIFsxMjc6NjRdIG9mIHRoZQorLy8vICAgIGRlc3RpbmF0aW9uLgorLy8vICAgIEJpdCBbMl09MDogQml0cyBbMTkxOjEyOF0gYXJlIGNvcGllZCBmcm9tIGEgdG8gYml0cyBbMTkxOjEyOF0gb2YgdGhlCisvLy8gICAgZGVzdGluYXRpb24uCisvLy8gICAgQml0IFsyXT0xOiBCaXRzIFsyNTU6MTkyXSBhcmUgY29waWVkIGZyb20gYSB0byBiaXRzIFsxOTE6MTI4XSBvZiB0aGUKKy8vLyAgICBkZXN0aW5hdGlvbi4KKy8vLyAgICBCaXQgWzNdPTA6IEJpdHMgWzE5MToxMjhdIGFyZSBjb3BpZWQgZnJvbSBiIHRvIGJpdHMgWzI1NToxOTJdIG9mIHRoZQorLy8vICAgIGRlc3RpbmF0aW9uLgorLy8vICAgIEJpdCBbM109MTogQml0cyBbMjU1OjE5Ml0gYXJlIGNvcGllZCBmcm9tIGIgdG8gYml0cyBbMjU1OjE5Ml0gb2YgdGhlCisvLy8gICAgZGVzdGluYXRpb24uCisvLy8gXHJldHVybnMgQSAyNTYtYml0IHZlY3RvciBvZiBbNCB4IGRvdWJsZV0gY29udGFpbmluZyB0aGUgc2h1ZmZsZWQgdmFsdWVzLgorI2RlZmluZSBfbW0yNTZfc2h1ZmZsZV9wZChhLCBiLCBtYXNrKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NmQpX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjRkZikoX19tMjU2ZCkoYSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkZikoX19tMjU2ZCkoYiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCArICgoKG1hc2spID4+IDApICYgMHgxKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ICsgKCgobWFzaykgPj4gMSkgJiAweDEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgKyAoKChtYXNrKSA+PiAyKSAmIDB4MSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiArICgoKG1hc2spID4+IDMpICYgMHgxKSk7IH0pCisKKy8qIENvbXBhcmUgKi8KKyNkZWZpbmUgX0NNUF9FUV9PUSAgICAweDAwIC8qIEVxdWFsIChvcmRlcmVkLCBub24tc2lnbmFsaW5nKSAgKi8KKyNkZWZpbmUgX0NNUF9MVF9PUyAgICAweDAxIC8qIExlc3MtdGhhbiAob3JkZXJlZCwgc2lnbmFsaW5nKSAgKi8KKyNkZWZpbmUgX0NNUF9MRV9PUyAgICAweDAyIC8qIExlc3MtdGhhbi1vci1lcXVhbCAob3JkZXJlZCwgc2lnbmFsaW5nKSAgKi8KKyNkZWZpbmUgX0NNUF9VTk9SRF9RICAweDAzIC8qIFVub3JkZXJlZCAobm9uLXNpZ25hbGluZykgICovCisjZGVmaW5lIF9DTVBfTkVRX1VRICAgMHgwNCAvKiBOb3QtZXF1YWwgKHVub3JkZXJlZCwgbm9uLXNpZ25hbGluZykgICovCisjZGVmaW5lIF9DTVBfTkxUX1VTICAgMHgwNSAvKiBOb3QtbGVzcy10aGFuICh1bm9yZGVyZWQsIHNpZ25hbGluZykgICovCisjZGVmaW5lIF9DTVBfTkxFX1VTICAgMHgwNiAvKiBOb3QtbGVzcy10aGFuLW9yLWVxdWFsICh1bm9yZGVyZWQsIHNpZ25hbGluZykgICovCisjZGVmaW5lIF9DTVBfT1JEX1EgICAgMHgwNyAvKiBPcmRlcmVkIChub25zaWduYWxpbmcpICAgKi8KKyNkZWZpbmUgX0NNUF9FUV9VUSAgICAweDA4IC8qIEVxdWFsICh1bm9yZGVyZWQsIG5vbi1zaWduYWxpbmcpICAqLworI2RlZmluZSBfQ01QX05HRV9VUyAgIDB4MDkgLyogTm90LWdyZWF0ZXItdGhhbi1vci1lcXVhbCAodW5vcmQsIHNpZ25hbGluZykgICovCisjZGVmaW5lIF9DTVBfTkdUX1VTICAgMHgwYSAvKiBOb3QtZ3JlYXRlci10aGFuICh1bm9yZGVyZWQsIHNpZ25hbGluZykgICovCisjZGVmaW5lIF9DTVBfRkFMU0VfT1EgMHgwYiAvKiBGYWxzZSAob3JkZXJlZCwgbm9uLXNpZ25hbGluZykgICovCisjZGVmaW5lIF9DTVBfTkVRX09RICAgMHgwYyAvKiBOb3QtZXF1YWwgKG9yZGVyZWQsIG5vbi1zaWduYWxpbmcpICAqLworI2RlZmluZSBfQ01QX0dFX09TICAgIDB4MGQgLyogR3JlYXRlci10aGFuLW9yLWVxdWFsIChvcmRlcmVkLCBzaWduYWxpbmcpICAqLworI2RlZmluZSBfQ01QX0dUX09TICAgIDB4MGUgLyogR3JlYXRlci10aGFuIChvcmRlcmVkLCBzaWduYWxpbmcpICAqLworI2RlZmluZSBfQ01QX1RSVUVfVVEgIDB4MGYgLyogVHJ1ZSAodW5vcmRlcmVkLCBub24tc2lnbmFsaW5nKSAgKi8KKyNkZWZpbmUgX0NNUF9FUV9PUyAgICAweDEwIC8qIEVxdWFsIChvcmRlcmVkLCBzaWduYWxpbmcpICAqLworI2RlZmluZSBfQ01QX0xUX09RICAgIDB4MTEgLyogTGVzcy10aGFuIChvcmRlcmVkLCBub24tc2lnbmFsaW5nKSAgKi8KKyNkZWZpbmUgX0NNUF9MRV9PUSAgICAweDEyIC8qIExlc3MtdGhhbi1vci1lcXVhbCAob3JkZXJlZCwgbm9uLXNpZ25hbGluZykgICovCisjZGVmaW5lIF9DTVBfVU5PUkRfUyAgMHgxMyAvKiBVbm9yZGVyZWQgKHNpZ25hbGluZykgICovCisjZGVmaW5lIF9DTVBfTkVRX1VTICAgMHgxNCAvKiBOb3QtZXF1YWwgKHVub3JkZXJlZCwgc2lnbmFsaW5nKSAgKi8KKyNkZWZpbmUgX0NNUF9OTFRfVVEgICAweDE1IC8qIE5vdC1sZXNzLXRoYW4gKHVub3JkZXJlZCwgbm9uLXNpZ25hbGluZykgICovCisjZGVmaW5lIF9DTVBfTkxFX1VRICAgMHgxNiAvKiBOb3QtbGVzcy10aGFuLW9yLWVxdWFsICh1bm9yZCwgbm9uLXNpZ25hbGluZykgICovCisjZGVmaW5lIF9DTVBfT1JEX1MgICAgMHgxNyAvKiBPcmRlcmVkIChzaWduYWxpbmcpICAqLworI2RlZmluZSBfQ01QX0VRX1VTICAgIDB4MTggLyogRXF1YWwgKHVub3JkZXJlZCwgc2lnbmFsaW5nKSAgKi8KKyNkZWZpbmUgX0NNUF9OR0VfVVEgICAweDE5IC8qIE5vdC1ncmVhdGVyLXRoYW4tb3ItZXF1YWwgKHVub3JkLCBub24tc2lnbikgICovCisjZGVmaW5lIF9DTVBfTkdUX1VRICAgMHgxYSAvKiBOb3QtZ3JlYXRlci10aGFuICh1bm9yZGVyZWQsIG5vbi1zaWduYWxpbmcpICAqLworI2RlZmluZSBfQ01QX0ZBTFNFX09TIDB4MWIgLyogRmFsc2UgKG9yZGVyZWQsIHNpZ25hbGluZykgICovCisjZGVmaW5lIF9DTVBfTkVRX09TICAgMHgxYyAvKiBOb3QtZXF1YWwgKG9yZGVyZWQsIHNpZ25hbGluZykgICovCisjZGVmaW5lIF9DTVBfR0VfT1EgICAgMHgxZCAvKiBHcmVhdGVyLXRoYW4tb3ItZXF1YWwgKG9yZGVyZWQsIG5vbi1zaWduYWxpbmcpICAqLworI2RlZmluZSBfQ01QX0dUX09RICAgIDB4MWUgLyogR3JlYXRlci10aGFuIChvcmRlcmVkLCBub24tc2lnbmFsaW5nKSAgKi8KKyNkZWZpbmUgX0NNUF9UUlVFX1VTICAweDFmIC8qIFRydWUgKHVub3JkZXJlZCwgc2lnbmFsaW5nKSAgKi8KKworLy8vIFxicmllZiBDb21wYXJlcyBlYWNoIG9mIHRoZSBjb3JyZXNwb25kaW5nIGRvdWJsZS1wcmVjaXNpb24gdmFsdWVzIG9mIHR3bworLy8vICAgIDEyOC1iaXQgdmVjdG9ycyBvZiBbMiB4IGRvdWJsZV0sIHVzaW5nIHRoZSBvcGVyYXRpb24gc3BlY2lmaWVkIGJ5IHRoZQorLy8vICAgIGltbWVkaWF0ZSBpbnRlZ2VyIG9wZXJhbmQuIFJldHVybnMgYSBbMiB4IGRvdWJsZV0gdmVjdG9yIGNvbnNpc3Rpbmcgb2YKKy8vLyAgICB0d28gZG91YmxlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSB0d28gY29tcGFyaXNvbiByZXN1bHRzOiB6ZXJvIGlmIHRoZQorLy8vICAgIGNvbXBhcmlzb24gaXMgZmFsc2UsIGFuZCBhbGwgMSdzIGlmIHRoZSBjb21wYXJpc29uIGlzIHRydWUuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBcY29kZQorLy8vIF9fbTEyOGQgX21tX2NtcF9wZChfX20xMjhkIGEsIF9fbTEyOGQgYiwgY29uc3QgaW50IGMpOworLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVkNNUFBEIC8gQ01QUEQgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzIgeCBkb3VibGVdLgorLy8vIFxwYXJhbSBiCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbMiB4IGRvdWJsZV0uCisvLy8gXHBhcmFtIGMKKy8vLyAgICBBbiBpbW1lZGlhdGUgaW50ZWdlciBvcGVyYW5kLCB3aXRoIGJpdHMgWzQ6MF0gc3BlY2lmeWluZyB3aGljaCBjb21wYXJpc29uCisvLy8gICAgb3BlcmF0aW9uIHRvIHVzZToKKy8vLyAgICAwMGgsIDA4aCwgMTBoLCAxOGg6IEVxdWFsCisvLy8gICAgMDFoLCAwOWgsIDExaCwgMTloOiBMZXNzIHRoYW4KKy8vLyAgICAwMmgsIDBBaCwgMTJoLCAxQWg6IExlc3MgdGhhbiBvciBlcXVhbCAvIEdyZWF0ZXIgdGhhbiBvciBlcXVhbCAoc3dhcHBlZAorLy8vICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmFuZHMpCisvLy8gICAgMDNoLCAwQmgsIDEzaCwgMUJoOiBVbm9yZGVyZWQKKy8vLyAgICAwNGgsIDBDaCwgMTRoLCAxQ2g6IE5vdCBlcXVhbAorLy8vICAgIDA1aCwgMERoLCAxNWgsIDFEaDogTm90IGxlc3MgdGhhbiAvIE5vdCBncmVhdGVyIHRoYW4gKHN3YXBwZWQgb3BlcmFuZHMpCisvLy8gICAgMDZoLCAwRWgsIDE2aCwgMUVoOiBOb3QgbGVzcyB0aGFuIG9yIGVxdWFsIC8gTm90IGdyZWF0ZXIgdGhhbiBvciBlcXVhbAorLy8vICAgICAgICAgICAgICAgICAgICAgICAgKHN3YXBwZWQgb3BlcmFuZHMpCisvLy8gICAgMDdoLCAwRmgsIDE3aCwgMUZoOiBPcmRlcmVkCisvLy8gXHJldHVybnMgQSAxMjgtYml0IHZlY3RvciBvZiBbMiB4IGRvdWJsZV0gY29udGFpbmluZyB0aGUgY29tcGFyaXNvbiByZXN1bHRzLgorI2RlZmluZSBfbW1fY21wX3BkKGEsIGIsIGMpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9jbXBwZCgoX192MmRmKShfX20xMjhkKShhKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShiKSwgKGMpKTsgfSkKKworLy8vIFxicmllZiBDb21wYXJlcyBlYWNoIG9mIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlcyBvZiB0d28gMTI4LWJpdCB2ZWN0b3JzIG9mCisvLy8gICAgWzQgeCBmbG9hdF0sIHVzaW5nIHRoZSBvcGVyYXRpb24gc3BlY2lmaWVkIGJ5IHRoZSBpbW1lZGlhdGUgaW50ZWdlcgorLy8vICAgIG9wZXJhbmQuIFJldHVybnMgYSBbNCB4IGZsb2F0XSB2ZWN0b3IgY29uc2lzdGluZyBvZiBmb3VyIGZsb2F0cworLy8vICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZvdXIgY29tcGFyaXNvbiByZXN1bHRzOiB6ZXJvIGlmIHRoZSBjb21wYXJpc29uIGlzCisvLy8gICAgZmFsc2UsIGFuZCBhbGwgMSdzIGlmIHRoZSBjb21wYXJpc29uIGlzIHRydWUuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBcY29kZQorLy8vIF9fbTEyOCBfbW1fY21wX3BzKF9fbTEyOCBhLCBfX20xMjggYiwgY29uc3QgaW50IGMpOworLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVkNNUFBTIC8gQ01QUFMgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0uCisvLy8gXHBhcmFtIGIKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdLgorLy8vIFxwYXJhbSBjCisvLy8gICAgQW4gaW1tZWRpYXRlIGludGVnZXIgb3BlcmFuZCwgd2l0aCBiaXRzIFs0OjBdIHNwZWNpZnlpbmcgd2hpY2ggY29tcGFyaXNvbgorLy8vICAgIG9wZXJhdGlvbiB0byB1c2U6CisvLy8gICAgMDBoLCAwOGgsIDEwaCwgMThoOiBFcXVhbAorLy8vICAgIDAxaCwgMDloLCAxMWgsIDE5aDogTGVzcyB0aGFuCisvLy8gICAgMDJoLCAwQWgsIDEyaCwgMUFoOiBMZXNzIHRoYW4gb3IgZXF1YWwgLyBHcmVhdGVyIHRoYW4gb3IgZXF1YWwgKHN3YXBwZWQKKy8vLyAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhbmRzKQorLy8vICAgIDAzaCwgMEJoLCAxM2gsIDFCaDogVW5vcmRlcmVkCisvLy8gICAgMDRoLCAwQ2gsIDE0aCwgMUNoOiBOb3QgZXF1YWwKKy8vLyAgICAwNWgsIDBEaCwgMTVoLCAxRGg6IE5vdCBsZXNzIHRoYW4gLyBOb3QgZ3JlYXRlciB0aGFuIChzd2FwcGVkIG9wZXJhbmRzKQorLy8vICAgIDA2aCwgMEVoLCAxNmgsIDFFaDogTm90IGxlc3MgdGhhbiBvciBlcXVhbCAvIE5vdCBncmVhdGVyIHRoYW4gb3IgZXF1YWwKKy8vLyAgICAgICAgICAgICAgICAgICAgICAgKHN3YXBwZWQgb3BlcmFuZHMpCisvLy8gICAgMDdoLCAwRmgsIDE3aCwgMUZoOiBPcmRlcmVkCisvLy8gXHJldHVybnMgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSBjb21wYXJpc29uIHJlc3VsdHMuCisjZGVmaW5lIF9tbV9jbXBfcHMoYSwgYiwgYykgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfY21wcHMoKF9fdjRzZikoX19tMTI4KShhKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpKF9fbTEyOCkoYiksIChjKSk7IH0pCisKKy8vLyBcYnJpZWYgQ29tcGFyZXMgZWFjaCBvZiB0aGUgY29ycmVzcG9uZGluZyBkb3VibGUtcHJlY2lzaW9uIHZhbHVlcyBvZiB0d28KKy8vLyAgICAyNTYtYml0IHZlY3RvcnMgb2YgWzQgeCBkb3VibGVdLCB1c2luZyB0aGUgb3BlcmF0aW9uIHNwZWNpZmllZCBieSB0aGUKKy8vLyAgICBpbW1lZGlhdGUgaW50ZWdlciBvcGVyYW5kLiBSZXR1cm5zIGEgWzQgeCBkb3VibGVdIHZlY3RvciBjb25zaXN0aW5nIG9mCisvLy8gICAgZm91ciBkb3VibGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZvdXIgY29tcGFyaXNvbiByZXN1bHRzOiB6ZXJvIGlmIHRoZQorLy8vICAgIGNvbXBhcmlzb24gaXMgZmFsc2UsIGFuZCBhbGwgMSdzIGlmIHRoZSBjb21wYXJpc29uIGlzIHRydWUuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBcY29kZQorLy8vIF9fbTI1NmQgX21tMjU2X2NtcF9wZChfX20yNTZkIGEsIF9fbTI1NmQgYiwgY29uc3QgaW50IGMpOworLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVkNNUFBEIC8gQ01QUEQgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gYQorLy8vICAgIEEgMjU2LWJpdCB2ZWN0b3Igb2YgWzQgeCBkb3VibGVdLgorLy8vIFxwYXJhbSBiCisvLy8gICAgQSAyNTYtYml0IHZlY3RvciBvZiBbNCB4IGRvdWJsZV0uCisvLy8gXHBhcmFtIGMKKy8vLyAgICBBbiBpbW1lZGlhdGUgaW50ZWdlciBvcGVyYW5kLCB3aXRoIGJpdHMgWzQ6MF0gc3BlY2lmeWluZyB3aGljaCBjb21wYXJpc29uCisvLy8gICAgb3BlcmF0aW9uIHRvIHVzZToKKy8vLyAgICAwMGgsIDA4aCwgMTBoLCAxOGg6IEVxdWFsCisvLy8gICAgMDFoLCAwOWgsIDExaCwgMTloOiBMZXNzIHRoYW4KKy8vLyAgICAwMmgsIDBBaCwgMTJoLCAxQWg6IExlc3MgdGhhbiBvciBlcXVhbCAvIEdyZWF0ZXIgdGhhbiBvciBlcXVhbCAoc3dhcHBlZAorLy8vICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmFuZHMpCisvLy8gICAgMDNoLCAwQmgsIDEzaCwgMUJoOiBVbm9yZGVyZWQKKy8vLyAgICAwNGgsIDBDaCwgMTRoLCAxQ2g6IE5vdCBlcXVhbAorLy8vICAgIDA1aCwgMERoLCAxNWgsIDFEaDogTm90IGxlc3MgdGhhbiAvIE5vdCBncmVhdGVyIHRoYW4gKHN3YXBwZWQgb3BlcmFuZHMpCisvLy8gICAgMDZoLCAwRWgsIDE2aCwgMUVoOiBOb3QgbGVzcyB0aGFuIG9yIGVxdWFsIC8gTm90IGdyZWF0ZXIgdGhhbiBvciBlcXVhbAorLy8vICAgICAgICAgICAgICAgICAgICAgICAgKHN3YXBwZWQgb3BlcmFuZHMpCisvLy8gICAgMDdoLCAwRmgsIDE3aCwgMUZoOiBPcmRlcmVkCisvLy8gXHJldHVybnMgQSAyNTYtYml0IHZlY3RvciBvZiBbNCB4IGRvdWJsZV0gY29udGFpbmluZyB0aGUgY29tcGFyaXNvbiByZXN1bHRzLgorI2RlZmluZSBfbW0yNTZfY21wX3BkKGEsIGIsIGMpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2ZClfX2J1aWx0aW5faWEzMl9jbXBwZDI1NigoX192NGRmKShfX20yNTZkKShhKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRmKShfX20yNTZkKShiKSwgKGMpKTsgfSkKKworLy8vIFxicmllZiBDb21wYXJlcyBlYWNoIG9mIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlcyBvZiB0d28gMjU2LWJpdCB2ZWN0b3JzIG9mCisvLy8gICAgWzggeCBmbG9hdF0sIHVzaW5nIHRoZSBvcGVyYXRpb24gc3BlY2lmaWVkIGJ5IHRoZSBpbW1lZGlhdGUgaW50ZWdlcgorLy8vICAgIG9wZXJhbmQuIFJldHVybnMgYSBbOCB4IGZsb2F0XSB2ZWN0b3IgY29uc2lzdGluZyBvZiBlaWdodCBmbG9hdHMKKy8vLyAgICBjb3JyZXNwb25kaW5nIHRvIHRoZSBlaWdodCBjb21wYXJpc29uIHJlc3VsdHM6IHplcm8gaWYgdGhlIGNvbXBhcmlzb24gaXMKKy8vLyAgICBmYWxzZSwgYW5kIGFsbCAxJ3MgaWYgdGhlIGNvbXBhcmlzb24gaXMgdHJ1ZS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFxjb2RlCisvLy8gX19tMjU2IF9tbTI1Nl9jbXBfcHMoX19tMjU2IGEsIF9fbTI1NiBiLCBjb25zdCBpbnQgYyk7CisvLy8gXGVuZGNvZGUKKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWQ01QUFMgLyBDTVBQUyBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBhCisvLy8gICAgQSAyNTYtYml0IHZlY3RvciBvZiBbOCB4IGZsb2F0XS4KKy8vLyBccGFyYW0gYgorLy8vICAgIEEgMjU2LWJpdCB2ZWN0b3Igb2YgWzggeCBmbG9hdF0uCisvLy8gXHBhcmFtIGMKKy8vLyAgICBBbiBpbW1lZGlhdGUgaW50ZWdlciBvcGVyYW5kLCB3aXRoIGJpdHMgWzQ6MF0gc3BlY2lmeWluZyB3aGljaCBjb21wYXJpc29uCisvLy8gICAgb3BlcmF0aW9uIHRvIHVzZToKKy8vLyAgICAwMGgsIDA4aCwgMTBoLCAxOGg6IEVxdWFsCisvLy8gICAgMDFoLCAwOWgsIDExaCwgMTloOiBMZXNzIHRoYW4KKy8vLyAgICAwMmgsIDBBaCwgMTJoLCAxQWg6IExlc3MgdGhhbiBvciBlcXVhbCAvIEdyZWF0ZXIgdGhhbiBvciBlcXVhbCAoc3dhcHBlZAorLy8vICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmFuZHMpCisvLy8gICAgMDNoLCAwQmgsIDEzaCwgMUJoOiBVbm9yZGVyZWQKKy8vLyAgICAwNGgsIDBDaCwgMTRoLCAxQ2g6IE5vdCBlcXVhbAorLy8vICAgIDA1aCwgMERoLCAxNWgsIDFEaDogTm90IGxlc3MgdGhhbiAvIE5vdCBncmVhdGVyIHRoYW4gKHN3YXBwZWQgb3BlcmFuZHMpCisvLy8gICAgMDZoLCAwRWgsIDE2aCwgMUVoOiBOb3QgbGVzcyB0aGFuIG9yIGVxdWFsIC8gTm90IGdyZWF0ZXIgdGhhbiBvciBlcXVhbAorLy8vICAgICAgICAgICAgICAgICAgICAgICAoc3dhcHBlZCBvcGVyYW5kcykKKy8vLyAgICAwN2gsIDBGaCwgMTdoLCAxRmg6IE9yZGVyZWQKKy8vLyBccmV0dXJucyBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs4IHggZmxvYXRdIGNvbnRhaW5pbmcgdGhlIGNvbXBhcmlzb24gcmVzdWx0cy4KKyNkZWZpbmUgX21tMjU2X2NtcF9wcyhhLCBiLCBjKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NilfX2J1aWx0aW5faWEzMl9jbXBwczI1NigoX192OHNmKShfX20yNTYpKGEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzZikoX19tMjU2KShiKSwgKGMpKTsgfSkKKworLy8vIFxicmllZiBDb21wYXJlcyBlYWNoIG9mIHRoZSBjb3JyZXNwb25kaW5nIHNjYWxhciBkb3VibGUtcHJlY2lzaW9uIHZhbHVlcyBvZgorLy8vICAgIHR3byAxMjgtYml0IHZlY3RvcnMgb2YgWzIgeCBkb3VibGVdLCB1c2luZyB0aGUgb3BlcmF0aW9uIHNwZWNpZmllZCBieSB0aGUKKy8vLyAgICBpbW1lZGlhdGUgaW50ZWdlciBvcGVyYW5kLiBJZiB0aGUgcmVzdWx0IGlzIHRydWUsIGFsbCA2NCBiaXRzIG9mIHRoZQorLy8vICAgIGRlc3RpbmF0aW9uIHZlY3RvciBhcmUgc2V0OyBvdGhlcndpc2UgdGhleSBhcmUgY2xlYXJlZC4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFxjb2RlCisvLy8gX19tMTI4ZCBfbW1fY21wX3NkKF9fbTEyOGQgYSwgX19tMTI4ZCBiLCBjb25zdCBpbnQgYyk7CisvLy8gXGVuZGNvZGUKKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWQ01QU0QgLyBDTVBTRCBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBhCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbMiB4IGRvdWJsZV0uCisvLy8gXHBhcmFtIGIKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFsyIHggZG91YmxlXS4KKy8vLyBccGFyYW0gYworLy8vICAgIEFuIGltbWVkaWF0ZSBpbnRlZ2VyIG9wZXJhbmQsIHdpdGggYml0cyBbNDowXSBzcGVjaWZ5aW5nIHdoaWNoIGNvbXBhcmlzb24KKy8vLyAgICBvcGVyYXRpb24gdG8gdXNlOgorLy8vICAgIDAwaCwgMDhoLCAxMGgsIDE4aDogRXF1YWwKKy8vLyAgICAwMWgsIDA5aCwgMTFoLCAxOWg6IExlc3MgdGhhbgorLy8vICAgIDAyaCwgMEFoLCAxMmgsIDFBaDogTGVzcyB0aGFuIG9yIGVxdWFsIC8gR3JlYXRlciB0aGFuIG9yIGVxdWFsIChzd2FwcGVkCisvLy8gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYW5kcykKKy8vLyAgICAwM2gsIDBCaCwgMTNoLCAxQmg6IFVub3JkZXJlZAorLy8vICAgIDA0aCwgMENoLCAxNGgsIDFDaDogTm90IGVxdWFsCisvLy8gICAgMDVoLCAwRGgsIDE1aCwgMURoOiBOb3QgbGVzcyB0aGFuIC8gTm90IGdyZWF0ZXIgdGhhbiAoc3dhcHBlZCBvcGVyYW5kcykKKy8vLyAgICAwNmgsIDBFaCwgMTZoLCAxRWg6IE5vdCBsZXNzIHRoYW4gb3IgZXF1YWwgLyBOb3QgZ3JlYXRlciB0aGFuIG9yIGVxdWFsCisvLy8gICAgICAgICAgICAgICAgICAgICAgIChzd2FwcGVkIG9wZXJhbmRzKQorLy8vICAgIDA3aCwgMEZoLCAxN2gsIDFGaDogT3JkZXJlZAorLy8vIFxyZXR1cm5zIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzIgeCBkb3VibGVdIGNvbnRhaW5pbmcgdGhlIGNvbXBhcmlzb24gcmVzdWx0cy4KKyNkZWZpbmUgX21tX2NtcF9zZChhLCBiLCBjKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGQpX19idWlsdGluX2lhMzJfY21wc2QoKF9fdjJkZikoX19tMTI4ZCkoYSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZikoX19tMTI4ZCkoYiksIChjKSk7IH0pCisKKy8vLyBcYnJpZWYgQ29tcGFyZXMgZWFjaCBvZiB0aGUgY29ycmVzcG9uZGluZyBzY2FsYXIgdmFsdWVzIG9mIHR3byAxMjgtYml0CisvLy8gICAgdmVjdG9ycyBvZiBbNCB4IGZsb2F0XSwgdXNpbmcgdGhlIG9wZXJhdGlvbiBzcGVjaWZpZWQgYnkgdGhlIGltbWVkaWF0ZQorLy8vICAgIGludGVnZXIgb3BlcmFuZC4gSWYgdGhlIHJlc3VsdCBpcyB0cnVlLCBhbGwgMzIgYml0cyBvZiB0aGUgZGVzdGluYXRpb24KKy8vLyAgICB2ZWN0b3IgYXJlIHNldDsgb3RoZXJ3aXNlIHRoZXkgYXJlIGNsZWFyZWQuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBcY29kZQorLy8vIF9fbTEyOCBfbW1fY21wX3NzKF9fbTEyOCBhLCBfX20xMjggYiwgY29uc3QgaW50IGMpOworLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVkNNUFNTIC8gQ01QU1MgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0uCisvLy8gXHBhcmFtIGIKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdLgorLy8vIFxwYXJhbSBjCisvLy8gICAgQW4gaW1tZWRpYXRlIGludGVnZXIgb3BlcmFuZCwgd2l0aCBiaXRzIFs0OjBdIHNwZWNpZnlpbmcgd2hpY2ggY29tcGFyaXNvbgorLy8vICAgIG9wZXJhdGlvbiB0byB1c2U6CisvLy8gICAgMDBoLCAwOGgsIDEwaCwgMThoOiBFcXVhbAorLy8vICAgIDAxaCwgMDloLCAxMWgsIDE5aDogTGVzcyB0aGFuCisvLy8gICAgMDJoLCAwQWgsIDEyaCwgMUFoOiBMZXNzIHRoYW4gb3IgZXF1YWwgLyBHcmVhdGVyIHRoYW4gb3IgZXF1YWwgKHN3YXBwZWQKKy8vLyAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhbmRzKQorLy8vICAgIDAzaCwgMEJoLCAxM2gsIDFCaDogVW5vcmRlcmVkCisvLy8gICAgMDRoLCAwQ2gsIDE0aCwgMUNoOiBOb3QgZXF1YWwKKy8vLyAgICAwNWgsIDBEaCwgMTVoLCAxRGg6IE5vdCBsZXNzIHRoYW4gLyBOb3QgZ3JlYXRlciB0aGFuIChzd2FwcGVkIG9wZXJhbmRzKQorLy8vICAgIDA2aCwgMEVoLCAxNmgsIDFFaDogTm90IGxlc3MgdGhhbiBvciBlcXVhbCAvIE5vdCBncmVhdGVyIHRoYW4gb3IgZXF1YWwKKy8vLyAgICAgICAgICAgICAgICAgICAgICAgKHN3YXBwZWQgb3BlcmFuZHMpCisvLy8gICAgMDdoLCAwRmgsIDE3aCwgMUZoOiBPcmRlcmVkCisvLy8gXHJldHVybnMgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSBjb21wYXJpc29uIHJlc3VsdHMuCisjZGVmaW5lIF9tbV9jbXBfc3MoYSwgYiwgYykgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjgpX19idWlsdGluX2lhMzJfY21wc3MoKF9fdjRzZikoX19tMTI4KShhKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpKF9fbTEyOCkoYiksIChjKSk7IH0pCisKKy8vLyBcYnJpZWYgVGFrZXMgYSBbOCB4IGkzMl0gdmVjdG9yIGFuZCByZXR1cm5zIHRoZSB2ZWN0b3IgZWxlbWVudCB2YWx1ZQorLy8vICAgIGluZGV4ZWQgYnkgdGhlIGltbWVkaWF0ZSBjb25zdGFudCBvcGVyYW5kLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZFWFRSQUNURjEyOCtDT01QT1NJVEUgLworLy8vICAgRVhUUkFDVEYxMjgrQ09NUE9TSVRFIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMjU2LWJpdCB2ZWN0b3Igb2YgWzggeCBpMzJdLgorLy8vIFxwYXJhbSBfX2ltbQorLy8vICAgIEFuIGltbWVkaWF0ZSBpbnRlZ2VyIG9wZXJhbmQgd2l0aCBiaXRzIFsyOjBdIGRldGVybWluaW5nIHdoaWNoIHZlY3RvcgorLy8vICAgIGVsZW1lbnQgaXMgZXh0cmFjdGVkIGFuZCByZXR1cm5lZC4KKy8vLyBccmV0dXJucyBBIDMyLWJpdCBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIGV4dHJhY3RlZCAzMiBiaXRzIG9mIGV4dGVuZGVkCisvLy8gICAgcGFja2VkIGRhdGEuCitzdGF0aWMgX19pbmxpbmUgaW50IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2V4dHJhY3RfZXBpMzIoX19tMjU2aSBfX2EsIGNvbnN0IGludCBfX2ltbSkKK3sKKyAgX192OHNpIF9fYiA9IChfX3Y4c2kpX19hOworICByZXR1cm4gX19iW19faW1tICYgN107Cit9CisKKy8vLyBcYnJpZWYgVGFrZXMgYSBbMTYgeCBpMTZdIHZlY3RvciBhbmQgcmV0dXJucyB0aGUgdmVjdG9yIGVsZW1lbnQgdmFsdWUKKy8vLyAgICBpbmRleGVkIGJ5IHRoZSBpbW1lZGlhdGUgY29uc3RhbnQgb3BlcmFuZC4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWRVhUUkFDVEYxMjgrQ09NUE9TSVRFIC8KKy8vLyAgICBFWFRSQUNURjEyOCtDT01QT1NJVEUgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAyNTYtYml0IGludGVnZXIgdmVjdG9yIG9mIFsxNiB4IGkxNl0uCisvLy8gXHBhcmFtIF9faW1tCisvLy8gICAgQW4gaW1tZWRpYXRlIGludGVnZXIgb3BlcmFuZCB3aXRoIGJpdHMgWzM6MF0gZGV0ZXJtaW5pbmcgd2hpY2ggdmVjdG9yCisvLy8gICAgZWxlbWVudCBpcyBleHRyYWN0ZWQgYW5kIHJldHVybmVkLgorLy8vIFxyZXR1cm5zIEEgMzItYml0IGludGVnZXIgY29udGFpbmluZyB0aGUgZXh0cmFjdGVkIDE2IGJpdHMgb2YgemVybyBleHRlbmRlZAorLy8vICAgIHBhY2tlZCBkYXRhLgorc3RhdGljIF9faW5saW5lIGludCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9leHRyYWN0X2VwaTE2KF9fbTI1NmkgX19hLCBjb25zdCBpbnQgX19pbW0pCit7CisgIF9fdjE2aGkgX19iID0gKF9fdjE2aGkpX19hOworICByZXR1cm4gKHVuc2lnbmVkIHNob3J0KV9fYltfX2ltbSAmIDE1XTsKK30KKworLy8vIFxicmllZiBUYWtlcyBhIFszMiB4IGk4XSB2ZWN0b3IgYW5kIHJldHVybnMgdGhlIHZlY3RvciBlbGVtZW50IHZhbHVlCisvLy8gICAgaW5kZXhlZCBieSB0aGUgaW1tZWRpYXRlIGNvbnN0YW50IG9wZXJhbmQuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVkVYVFJBQ1RGMTI4K0NPTVBPU0lURSAvCisvLy8gICAgRVhUUkFDVEYxMjgrQ09NUE9TSVRFIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMjU2LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbMzIgeCBpOF0uCisvLy8gXHBhcmFtIF9faW1tCisvLy8gICAgQW4gaW1tZWRpYXRlIGludGVnZXIgb3BlcmFuZCB3aXRoIGJpdHMgWzQ6MF0gZGV0ZXJtaW5pbmcgd2hpY2ggdmVjdG9yCisvLy8gICAgZWxlbWVudCBpcyBleHRyYWN0ZWQgYW5kIHJldHVybmVkLgorLy8vIFxyZXR1cm5zIEEgMzItYml0IGludGVnZXIgY29udGFpbmluZyB0aGUgZXh0cmFjdGVkIDggYml0cyBvZiB6ZXJvIGV4dGVuZGVkCisvLy8gICAgcGFja2VkIGRhdGEuCitzdGF0aWMgX19pbmxpbmUgaW50IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2V4dHJhY3RfZXBpOChfX20yNTZpIF9fYSwgY29uc3QgaW50IF9faW1tKQoreworICBfX3YzMnFpIF9fYiA9IChfX3YzMnFpKV9fYTsKKyAgcmV0dXJuICh1bnNpZ25lZCBjaGFyKV9fYltfX2ltbSAmIDMxXTsKK30KKworI2lmZGVmIF9feDg2XzY0X18KKy8vLyBcYnJpZWYgVGFrZXMgYSBbNCB4IGk2NF0gdmVjdG9yIGFuZCByZXR1cm5zIHRoZSB2ZWN0b3IgZWxlbWVudCB2YWx1ZQorLy8vICAgIGluZGV4ZWQgYnkgdGhlIGltbWVkaWF0ZSBjb25zdGFudCBvcGVyYW5kLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZFWFRSQUNURjEyOCtDT01QT1NJVEUgLworLy8vICAgIEVYVFJBQ1RGMTI4K0NPTVBPU0lURSBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDI1Ni1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzQgeCBpNjRdLgorLy8vIFxwYXJhbSBfX2ltbQorLy8vICAgIEFuIGltbWVkaWF0ZSBpbnRlZ2VyIG9wZXJhbmQgd2l0aCBiaXRzIFsxOjBdIGRldGVybWluaW5nIHdoaWNoIHZlY3RvcgorLy8vICAgIGVsZW1lbnQgaXMgZXh0cmFjdGVkIGFuZCByZXR1cm5lZC4KKy8vLyBccmV0dXJucyBBIDY0LWJpdCBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIGV4dHJhY3RlZCA2NCBiaXRzIG9mIGV4dGVuZGVkCisvLy8gICAgcGFja2VkIGRhdGEuCitzdGF0aWMgX19pbmxpbmUgbG9uZyBsb25nICBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9leHRyYWN0X2VwaTY0KF9fbTI1NmkgX19hLCBjb25zdCBpbnQgX19pbW0pCit7CisgIF9fdjRkaSBfX2IgPSAoX192NGRpKV9fYTsKKyAgcmV0dXJuIF9fYltfX2ltbSAmIDNdOworfQorI2VuZGlmCisKKy8vLyBcYnJpZWYgVGFrZXMgYSBbOCB4IGkzMl0gdmVjdG9yIGFuZCByZXBsYWNlcyB0aGUgdmVjdG9yIGVsZW1lbnQgdmFsdWUKKy8vLyAgICBpbmRleGVkIGJ5IHRoZSBpbW1lZGlhdGUgY29uc3RhbnQgb3BlcmFuZCBieSBhIG5ldyB2YWx1ZS4gUmV0dXJucyB0aGUKKy8vLyAgICBtb2RpZmllZCB2ZWN0b3IuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVklOU0VSVEYxMjgrQ09NUE9TSVRFIC8KKy8vLyAgICBJTlNFUlRGMTI4K0NPTVBPU0lURSBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIHZlY3RvciBvZiBbOCB4IGkzMl0gdG8gYmUgdXNlZCBieSB0aGUgaW5zZXJ0IG9wZXJhdGlvbi4KKy8vLyBccGFyYW0gX19iCisvLy8gICAgQW4gaW50ZWdlciB2YWx1ZS4gVGhlIHJlcGxhY2VtZW50IHZhbHVlIGZvciB0aGUgaW5zZXJ0IG9wZXJhdGlvbi4KKy8vLyBccGFyYW0gX19pbW0KKy8vLyAgICBBbiBpbW1lZGlhdGUgaW50ZWdlciBzcGVjaWZ5aW5nIHRoZSBpbmRleCBvZiB0aGUgdmVjdG9yIGVsZW1lbnQgdG8gYmUKKy8vLyAgICByZXBsYWNlZC4KKy8vLyBccmV0dXJucyBBIGNvcHkgb2YgdmVjdG9yIF9fYSwgYWZ0ZXIgcmVwbGFjaW5nIGl0cyBlbGVtZW50IGluZGV4ZWQgYnkgX19pbW0KKy8vLyAgICAgd2l0aCBfX2IuCitzdGF0aWMgX19pbmxpbmUgX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9pbnNlcnRfZXBpMzIoX19tMjU2aSBfX2EsIGludCBfX2IsIGludCBjb25zdCBfX2ltbSkKK3sKKyAgX192OHNpIF9fYyA9IChfX3Y4c2kpX19hOworICBfX2NbX19pbW0gJiA3XSA9IF9fYjsKKyAgcmV0dXJuIChfX20yNTZpKV9fYzsKK30KKworCisvLy8gXGJyaWVmIFRha2VzIGEgWzE2IHggaTE2XSB2ZWN0b3IgYW5kIHJlcGxhY2VzIHRoZSB2ZWN0b3IgZWxlbWVudCB2YWx1ZQorLy8vICAgIGluZGV4ZWQgYnkgdGhlIGltbWVkaWF0ZSBjb25zdGFudCBvcGVyYW5kIHdpdGggYSBuZXcgdmFsdWUuIFJldHVybnMgdGhlCisvLy8gICAgbW9kaWZpZWQgdmVjdG9yLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZJTlNFUlRGMTI4K0NPTVBPU0lURSAvCisvLy8gICAgSU5TRVJURjEyOCtDT01QT1NJVEUgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSB2ZWN0b3Igb2YgWzE2IHggaTE2XSB0byBiZSB1c2VkIGJ5IHRoZSBpbnNlcnQgb3BlcmF0aW9uLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBbiBpMTYgaW50ZWdlciB2YWx1ZS4gVGhlIHJlcGxhY2VtZW50IHZhbHVlIGZvciB0aGUgaW5zZXJ0IG9wZXJhdGlvbi4KKy8vLyBccGFyYW0gX19pbW0KKy8vLyAgICBBbiBpbW1lZGlhdGUgaW50ZWdlciBzcGVjaWZ5aW5nIHRoZSBpbmRleCBvZiB0aGUgdmVjdG9yIGVsZW1lbnQgdG8gYmUKKy8vLyAgICByZXBsYWNlZC4KKy8vLyBccmV0dXJucyBBIGNvcHkgb2YgdmVjdG9yIF9fYSwgYWZ0ZXIgcmVwbGFjaW5nIGl0cyBlbGVtZW50IGluZGV4ZWQgYnkgX19pbW0KKy8vLyAgICAgd2l0aCBfX2IuCitzdGF0aWMgX19pbmxpbmUgX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9pbnNlcnRfZXBpMTYoX19tMjU2aSBfX2EsIGludCBfX2IsIGludCBjb25zdCBfX2ltbSkKK3sKKyAgX192MTZoaSBfX2MgPSAoX192MTZoaSlfX2E7CisgIF9fY1tfX2ltbSAmIDE1XSA9IF9fYjsKKyAgcmV0dXJuIChfX20yNTZpKV9fYzsKK30KKworLy8vIFxicmllZiBUYWtlcyBhIFszMiB4IGk4XSB2ZWN0b3IgYW5kIHJlcGxhY2VzIHRoZSB2ZWN0b3IgZWxlbWVudCB2YWx1ZQorLy8vICAgIGluZGV4ZWQgYnkgdGhlIGltbWVkaWF0ZSBjb25zdGFudCBvcGVyYW5kIHdpdGggYSBuZXcgdmFsdWUuIFJldHVybnMgdGhlCisvLy8gICAgbW9kaWZpZWQgdmVjdG9yLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZJTlNFUlRGMTI4K0NPTVBPU0lURSAvCisvLy8gICAgSU5TRVJURjEyOCtDT01QT1NJVEUgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSB2ZWN0b3Igb2YgWzMyIHggaThdIHRvIGJlIHVzZWQgYnkgdGhlIGluc2VydCBvcGVyYXRpb24uCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEFuIGk4IGludGVnZXIgdmFsdWUuIFRoZSByZXBsYWNlbWVudCB2YWx1ZSBmb3IgdGhlIGluc2VydCBvcGVyYXRpb24uCisvLy8gXHBhcmFtIF9faW1tCisvLy8gICAgQW4gaW1tZWRpYXRlIGludGVnZXIgc3BlY2lmeWluZyB0aGUgaW5kZXggb2YgdGhlIHZlY3RvciBlbGVtZW50IHRvIGJlCisvLy8gICAgcmVwbGFjZWQuCisvLy8gXHJldHVybnMgQSBjb3B5IG9mIHZlY3RvciBfX2EsIGFmdGVyIHJlcGxhY2luZyBpdHMgZWxlbWVudCBpbmRleGVkIGJ5IF9faW1tCisvLy8gICAgd2l0aCBfX2IuCitzdGF0aWMgX19pbmxpbmUgX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9pbnNlcnRfZXBpOChfX20yNTZpIF9fYSwgaW50IF9fYiwgaW50IGNvbnN0IF9faW1tKQoreworICBfX3YzMnFpIF9fYyA9IChfX3YzMnFpKV9fYTsKKyAgX19jW19faW1tICYgMzFdID0gX19iOworICByZXR1cm4gKF9fbTI1NmkpX19jOworfQorCisjaWZkZWYgX194ODZfNjRfXworLy8vIFxicmllZiBUYWtlcyBhIFs0IHggaTY0XSB2ZWN0b3IgYW5kIHJlcGxhY2VzIHRoZSB2ZWN0b3IgZWxlbWVudCB2YWx1ZQorLy8vICAgIGluZGV4ZWQgYnkgdGhlIGltbWVkaWF0ZSBjb25zdGFudCBvcGVyYW5kIHdpdGggYSBuZXcgdmFsdWUuIFJldHVybnMgdGhlCisvLy8gICAgbW9kaWZpZWQgdmVjdG9yLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZJTlNFUlRGMTI4K0NPTVBPU0lURSAvCisvLy8gICAgSU5TRVJURjEyOCtDT01QT1NJVEUgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSB2ZWN0b3Igb2YgWzQgeCBpNjRdIHRvIGJlIHVzZWQgYnkgdGhlIGluc2VydCBvcGVyYXRpb24uCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgNjQtYml0IGludGVnZXIgdmFsdWUuIFRoZSByZXBsYWNlbWVudCB2YWx1ZSBmb3IgdGhlIGluc2VydCBvcGVyYXRpb24uCisvLy8gXHBhcmFtIF9faW1tCisvLy8gICAgQW4gaW1tZWRpYXRlIGludGVnZXIgc3BlY2lmeWluZyB0aGUgaW5kZXggb2YgdGhlIHZlY3RvciBlbGVtZW50IHRvIGJlCisvLy8gICAgcmVwbGFjZWQuCisvLy8gXHJldHVybnMgQSBjb3B5IG9mIHZlY3RvciBfX2EsIGFmdGVyIHJlcGxhY2luZyBpdHMgZWxlbWVudCBpbmRleGVkIGJ5IF9faW1tCisvLy8gICAgIHdpdGggX19iLgorc3RhdGljIF9faW5saW5lIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfaW5zZXJ0X2VwaTY0KF9fbTI1NmkgX19hLCBsb25nIGxvbmcgX19iLCBpbnQgY29uc3QgX19pbW0pCit7CisgIF9fdjRkaSBfX2MgPSAoX192NGRpKV9fYTsKKyAgX19jW19faW1tICYgM10gPSBfX2I7CisgIHJldHVybiAoX19tMjU2aSlfX2M7Cit9CisjZW5kaWYKKworLyogQ29udmVyc2lvbiAqLworLy8vIFxicmllZiBDb252ZXJ0cyBhIHZlY3RvciBvZiBbNCB4IGkzMl0gaW50byBhIHZlY3RvciBvZiBbNCB4IGRvdWJsZV0uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVkNWVERRMlBEIC8gQ1ZURFEyUEQgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIG9mIFs0IHggaTMyXS4KKy8vLyBccmV0dXJucyBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs0IHggZG91YmxlXSBjb250YWluaW5nIHRoZSBjb252ZXJ0ZWQgdmFsdWVzLgorc3RhdGljIF9faW5saW5lIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY3Z0ZXBpMzJfcGQoX19tMTI4aSBfX2EpCit7CisgIHJldHVybiAoX19tMjU2ZClfX2J1aWx0aW5fY29udmVydHZlY3RvcigoX192NHNpKV9fYSwgX192NGRmKTsKK30KKworLy8vIFxicmllZiBDb252ZXJ0cyBhIHZlY3RvciBvZiBbOCB4IGkzMl0gaW50byBhIHZlY3RvciBvZiBbOCB4IGZsb2F0XS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWQ1ZURFEyUFMgLyBDVlREUTJQUyBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDI1Ni1iaXQgaW50ZWdlciB2ZWN0b3IuCisvLy8gXHJldHVybnMgQSAyNTYtYml0IHZlY3RvciBvZiBbOCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSBjb252ZXJ0ZWQgdmFsdWVzLgorc3RhdGljIF9faW5saW5lIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9jdnRlcGkzMl9wcyhfX20yNTZpIF9fYSkKK3sKKyAgcmV0dXJuIChfX20yNTYpX19idWlsdGluX2lhMzJfY3Z0ZHEycHMyNTYoKF9fdjhzaSkgX19hKTsKK30KKworLy8vIFxicmllZiBDb252ZXJ0cyBhIDI1Ni1iaXQgdmVjdG9yIG9mIFs0IHggZG91YmxlXSBpbnRvIGEgMTI4LWJpdCB2ZWN0b3Igb2YKKy8vLyAgICBbNCB4IGZsb2F0XS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWQ1ZUUEQyUFMgLyBDVlRQRDJQUyBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDI1Ni1iaXQgdmVjdG9yIG9mIFs0IHggZG91YmxlXS4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgdGhlIGNvbnZlcnRlZCB2YWx1ZXMuCitzdGF0aWMgX19pbmxpbmUgX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2N2dHBkX3BzKF9fbTI1NmQgX19hKQoreworICByZXR1cm4gKF9fbTEyOClfX2J1aWx0aW5faWEzMl9jdnRwZDJwczI1NigoX192NGRmKSBfX2EpOworfQorCisvLy8gXGJyaWVmIENvbnZlcnRzIGEgdmVjdG9yIG9mIFs4IHggZmxvYXRdIGludG8gYSB2ZWN0b3Igb2YgWzggeCBpMzJdLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZDVlRQUzJEUSAvIENWVFBTMkRRIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMjU2LWJpdCB2ZWN0b3Igb2YgWzggeCBmbG9hdF0uCisvLy8gXHJldHVybnMgQSAyNTYtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIGNvbnZlcnRlZCB2YWx1ZXMuCitzdGF0aWMgX19pbmxpbmUgX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9jdnRwc19lcGkzMihfX20yNTYgX19hKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfY3Z0cHMyZHEyNTYoKF9fdjhzZikgX19hKTsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY3Z0cHNfcGQoX19tMTI4IF9fYSkKK3sKKyAgcmV0dXJuIChfX20yNTZkKV9fYnVpbHRpbl9jb252ZXJ0dmVjdG9yKChfX3Y0c2YpX19hLCBfX3Y0ZGYpOworfQorCitzdGF0aWMgX19pbmxpbmUgX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9jdnR0cGRfZXBpMzIoX19tMjU2ZCBfX2EpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5fY29udmVydHZlY3RvcigoX192NGRmKSBfX2EsIF9fdjRzaSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2N2dHBkX2VwaTMyKF9fbTI1NmQgX19hKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfY3Z0cGQyZHEyNTYoKF9fdjRkZikgX19hKTsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY3Z0dHBzX2VwaTMyKF9fbTI1NiBfX2EpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5fY29udmVydHZlY3RvcigoX192OHNmKSBfX2EsIF9fdjhzaSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBkb3VibGUgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY3Z0c2RfZjY0KF9fbTI1NmQgX19hKQoreworIHJldHVybiBfX2FbMF07Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY3Z0c2kyNTZfc2kzMihfX20yNTZpIF9fYSkKK3sKKyBfX3Y4c2kgX19iID0gKF9fdjhzaSlfX2E7CisgcmV0dXJuIF9fYlswXTsKK30KKworc3RhdGljIF9faW5saW5lIGZsb2F0IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2N2dHNzX2YzMihfX20yNTYgX19hKQoreworIHJldHVybiBfX2FbMF07Cit9CisKKy8qIFZlY3RvciByZXBsaWNhdGUgKi8KK3N0YXRpYyBfX2lubGluZSBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbW92ZWhkdXBfcHMoX19tMjU2IF9fYSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3Y4c2YpX19hLCAoX192OHNmKV9fYSwgMSwgMSwgMywgMywgNSwgNSwgNywgNyk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbW92ZWxkdXBfcHMoX19tMjU2IF9fYSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3Y4c2YpX19hLCAoX192OHNmKV9fYSwgMCwgMCwgMiwgMiwgNCwgNCwgNiwgNik7Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX20yNTZkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21vdmVkdXBfcGQoX19tMjU2ZCBfX2EpCit7CisgIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcigoX192NGRmKV9fYSwgKF9fdjRkZilfX2EsIDAsIDAsIDIsIDIpOworfQorCisvKiBVbnBhY2sgYW5kIEludGVybGVhdmUgKi8KK3N0YXRpYyBfX2lubGluZSBfX20yNTZkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3VucGFja2hpX3BkKF9fbTI1NmQgX19hLCBfX20yNTZkIF9fYikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3Y0ZGYpX19hLCAoX192NGRmKV9fYiwgMSwgNSwgMSsyLCA1KzIpOworfQorCitzdGF0aWMgX19pbmxpbmUgX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl91bnBhY2tsb19wZChfX20yNTZkIF9fYSwgX19tMjU2ZCBfX2IpCit7CisgIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcigoX192NGRmKV9fYSwgKF9fdjRkZilfX2IsIDAsIDQsIDArMiwgNCsyKTsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl91bnBhY2toaV9wcyhfX20yNTYgX19hLCBfX20yNTYgX19iKQoreworICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjhzZilfX2EsIChfX3Y4c2YpX19iLCAyLCAxMCwgMisxLCAxMCsxLCA2LCAxNCwgNisxLCAxNCsxKTsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl91bnBhY2tsb19wcyhfX20yNTYgX19hLCBfX20yNTYgX19iKQoreworICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjhzZilfX2EsIChfX3Y4c2YpX19iLCAwLCA4LCAwKzEsIDgrMSwgNCwgMTIsIDQrMSwgMTIrMSk7Cit9CisKKy8qIEJpdCBUZXN0ICovCitzdGF0aWMgX19pbmxpbmUgaW50IF9fREVGQVVMVF9GTl9BVFRSUworX21tX3Rlc3R6X3BkKF9fbTEyOGQgX19hLCBfX20xMjhkIF9fYikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3Z0ZXN0enBkKChfX3YyZGYpX19hLCAoX192MmRmKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fdGVzdGNfcGQoX19tMTI4ZCBfX2EsIF9fbTEyOGQgX19iKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfdnRlc3RjcGQoKF9fdjJkZilfX2EsIChfX3YyZGYpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lIGludCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV90ZXN0bnpjX3BkKF9fbTEyOGQgX19hLCBfX20xMjhkIF9fYikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3Z0ZXN0bnpjcGQoKF9fdjJkZilfX2EsIChfX3YyZGYpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lIGludCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV90ZXN0el9wcyhfX20xMjggX19hLCBfX20xMjggX19iKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfdnRlc3R6cHMoKF9fdjRzZilfX2EsIChfX3Y0c2YpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lIGludCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV90ZXN0Y19wcyhfX20xMjggX19hLCBfX20xMjggX19iKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfdnRlc3RjcHMoKF9fdjRzZilfX2EsIChfX3Y0c2YpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lIGludCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV90ZXN0bnpjX3BzKF9fbTEyOCBfX2EsIF9fbTEyOCBfX2IpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl92dGVzdG56Y3BzKChfX3Y0c2YpX19hLCAoX192NHNmKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfdGVzdHpfcGQoX19tMjU2ZCBfX2EsIF9fbTI1NmQgX19iKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfdnRlc3R6cGQyNTYoKF9fdjRkZilfX2EsIChfX3Y0ZGYpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lIGludCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl90ZXN0Y19wZChfX20yNTZkIF9fYSwgX19tMjU2ZCBfX2IpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl92dGVzdGNwZDI1NigoX192NGRmKV9fYSwgKF9fdjRkZilfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3Rlc3RuemNfcGQoX19tMjU2ZCBfX2EsIF9fbTI1NmQgX19iKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfdnRlc3RuemNwZDI1NigoX192NGRmKV9fYSwgKF9fdjRkZilfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3Rlc3R6X3BzKF9fbTI1NiBfX2EsIF9fbTI1NiBfX2IpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl92dGVzdHpwczI1NigoX192OHNmKV9fYSwgKF9fdjhzZilfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3Rlc3RjX3BzKF9fbTI1NiBfX2EsIF9fbTI1NiBfX2IpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl92dGVzdGNwczI1NigoX192OHNmKV9fYSwgKF9fdjhzZilfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3Rlc3RuemNfcHMoX19tMjU2IF9fYSwgX19tMjU2IF9fYikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3Z0ZXN0bnpjcHMyNTYoKF9fdjhzZilfX2EsIChfX3Y4c2YpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lIGludCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl90ZXN0el9zaTI1NihfX20yNTZpIF9fYSwgX19tMjU2aSBfX2IpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9wdGVzdHoyNTYoKF9fdjRkaSlfX2EsIChfX3Y0ZGkpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lIGludCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl90ZXN0Y19zaTI1NihfX20yNTZpIF9fYSwgX19tMjU2aSBfX2IpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9wdGVzdGMyNTYoKF9fdjRkaSlfX2EsIChfX3Y0ZGkpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lIGludCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl90ZXN0bnpjX3NpMjU2KF9fbTI1NmkgX19hLCBfX20yNTZpIF9fYikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3B0ZXN0bnpjMjU2KChfX3Y0ZGkpX19hLCAoX192NGRpKV9fYik7Cit9CisKKy8qIFZlY3RvciBleHRyYWN0IHNpZ24gbWFzayAqLworc3RhdGljIF9faW5saW5lIGludCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tb3ZlbWFza19wZChfX20yNTZkIF9fYSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX21vdm1za3BkMjU2KChfX3Y0ZGYpX19hKTsKK30KKworc3RhdGljIF9faW5saW5lIGludCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tb3ZlbWFza19wcyhfX20yNTYgX19hKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfbW92bXNrcHMyNTYoKF9fdjhzZilfX2EpOworfQorCisvKiBWZWN0b3IgX196ZXJvICovCitzdGF0aWMgX19pbmxpbmUgdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl96ZXJvYWxsKHZvaWQpCit7CisgIF9fYnVpbHRpbl9pYTMyX3Z6ZXJvYWxsKCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3plcm91cHBlcih2b2lkKQoreworICBfX2J1aWx0aW5faWEzMl92emVyb3VwcGVyKCk7Cit9CisKKy8qIFZlY3RvciBsb2FkIHdpdGggYnJvYWRjYXN0ICovCitzdGF0aWMgX19pbmxpbmUgX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2Jyb2FkY2FzdF9zcyhmbG9hdCBjb25zdCAqX19hKQoreworICBmbG9hdCBfX2YgPSAqX19hOworICByZXR1cm4gKF9fbTEyOCkoX192NHNmKXsgX19mLCBfX2YsIF9fZiwgX19mIH07Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX20yNTZkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2Jyb2FkY2FzdF9zZChkb3VibGUgY29uc3QgKl9fYSkKK3sKKyAgZG91YmxlIF9fZCA9ICpfX2E7CisgIHJldHVybiAoX19tMjU2ZCkoX192NGRmKXsgX19kLCBfX2QsIF9fZCwgX19kIH07Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfYnJvYWRjYXN0X3NzKGZsb2F0IGNvbnN0ICpfX2EpCit7CisgIGZsb2F0IF9fZiA9ICpfX2E7CisgIHJldHVybiAoX19tMjU2KShfX3Y4c2YpeyBfX2YsIF9fZiwgX19mLCBfX2YsIF9fZiwgX19mLCBfX2YsIF9fZiB9OworfQorCitzdGF0aWMgX19pbmxpbmUgX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9icm9hZGNhc3RfcGQoX19tMTI4ZCBjb25zdCAqX19hKQoreworICByZXR1cm4gKF9fbTI1NmQpX19idWlsdGluX2lhMzJfdmJyb2FkY2FzdGYxMjhfcGQyNTYoKF9fdjJkZiBjb25zdCAqKV9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfYnJvYWRjYXN0X3BzKF9fbTEyOCBjb25zdCAqX19hKQoreworICByZXR1cm4gKF9fbTI1NilfX2J1aWx0aW5faWEzMl92YnJvYWRjYXN0ZjEyOF9wczI1NigoX192NHNmIGNvbnN0ICopX19hKTsKK30KKworLyogU0lNRCBsb2FkIG9wcyAqLworc3RhdGljIF9faW5saW5lIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbG9hZF9wZChkb3VibGUgY29uc3QgKl9fcCkKK3sKKyAgcmV0dXJuICooX19tMjU2ZCAqKV9fcDsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9sb2FkX3BzKGZsb2F0IGNvbnN0ICpfX3ApCit7CisgIHJldHVybiAqKF9fbTI1NiAqKV9fcDsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbG9hZHVfcGQoZG91YmxlIGNvbnN0ICpfX3ApCit7CisgIHN0cnVjdCBfX2xvYWR1X3BkIHsKKyAgICBfX20yNTZkIF9fdjsKKyAgfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fLCBfX21heV9hbGlhc19fKSk7CisgIHJldHVybiAoKHN0cnVjdCBfX2xvYWR1X3BkKilfX3ApLT5fX3Y7Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbG9hZHVfcHMoZmxvYXQgY29uc3QgKl9fcCkKK3sKKyAgc3RydWN0IF9fbG9hZHVfcHMgeworICAgIF9fbTI1NiBfX3Y7CisgIH0gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXywgX19tYXlfYWxpYXNfXykpOworICByZXR1cm4gKChzdHJ1Y3QgX19sb2FkdV9wcyopX19wKS0+X192OworfQorCitzdGF0aWMgX19pbmxpbmUgX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9sb2FkX3NpMjU2KF9fbTI1NmkgY29uc3QgKl9fcCkKK3sKKyAgcmV0dXJuICpfX3A7Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2xvYWR1X3NpMjU2KF9fbTI1NmkgY29uc3QgKl9fcCkKK3sKKyAgc3RydWN0IF9fbG9hZHVfc2kyNTYgeworICAgIF9fbTI1NmkgX192OworICB9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18sIF9fbWF5X2FsaWFzX18pKTsKKyAgcmV0dXJuICgoc3RydWN0IF9fbG9hZHVfc2kyNTYqKV9fcCktPl9fdjsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbGRkcXVfc2kyNTYoX19tMjU2aSBjb25zdCAqX19wKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfbGRkcXUyNTYoKGNoYXIgY29uc3QgKilfX3ApOworfQorCisvKiBTSU1EIHN0b3JlIG9wcyAqLworc3RhdGljIF9faW5saW5lIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfc3RvcmVfcGQoZG91YmxlICpfX3AsIF9fbTI1NmQgX19hKQoreworICAqKF9fbTI1NmQgKilfX3AgPSBfX2E7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3N0b3JlX3BzKGZsb2F0ICpfX3AsIF9fbTI1NiBfX2EpCit7CisgICooX19tMjU2ICopX19wID0gX19hOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9zdG9yZXVfcGQoZG91YmxlICpfX3AsIF9fbTI1NmQgX19hKQoreworICBzdHJ1Y3QgX19zdG9yZXVfcGQgeworICAgIF9fbTI1NmQgX192OworICB9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18sIF9fbWF5X2FsaWFzX18pKTsKKyAgKChzdHJ1Y3QgX19zdG9yZXVfcGQqKV9fcCktPl9fdiA9IF9fYTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfc3RvcmV1X3BzKGZsb2F0ICpfX3AsIF9fbTI1NiBfX2EpCit7CisgIHN0cnVjdCBfX3N0b3JldV9wcyB7CisgICAgX19tMjU2IF9fdjsKKyAgfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fLCBfX21heV9hbGlhc19fKSk7CisgICgoc3RydWN0IF9fc3RvcmV1X3BzKilfX3ApLT5fX3YgPSBfX2E7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3N0b3JlX3NpMjU2KF9fbTI1NmkgKl9fcCwgX19tMjU2aSBfX2EpCit7CisgICpfX3AgPSBfX2E7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3N0b3JldV9zaTI1NihfX20yNTZpICpfX3AsIF9fbTI1NmkgX19hKQoreworICBzdHJ1Y3QgX19zdG9yZXVfc2kyNTYgeworICAgIF9fbTI1NmkgX192OworICB9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18sIF9fbWF5X2FsaWFzX18pKTsKKyAgKChzdHJ1Y3QgX19zdG9yZXVfc2kyNTYqKV9fcCktPl9fdiA9IF9fYTsKK30KKworLyogQ29uZGl0aW9uYWwgbG9hZCBvcHMgKi8KK3N0YXRpYyBfX2lubGluZSBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hc2tsb2FkX3BkKGRvdWJsZSBjb25zdCAqX19wLCBfX20xMjhpIF9fbSkKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX21hc2tsb2FkcGQoKGNvbnN0IF9fdjJkZiAqKV9fcCwgKF9fdjJkaSlfX20pOworfQorCitzdGF0aWMgX19pbmxpbmUgX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYXNrbG9hZF9wZChkb3VibGUgY29uc3QgKl9fcCwgX19tMjU2aSBfX20pCit7CisgIHJldHVybiAoX19tMjU2ZClfX2J1aWx0aW5faWEzMl9tYXNrbG9hZHBkMjU2KChjb25zdCBfX3Y0ZGYgKilfX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGkpX19tKTsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrbG9hZF9wcyhmbG9hdCBjb25zdCAqX19wLCBfX20xMjhpIF9fbSkKK3sKKyAgcmV0dXJuIChfX20xMjgpX19idWlsdGluX2lhMzJfbWFza2xvYWRwcygoY29uc3QgX192NHNmICopX19wLCAoX192NHNpKV9fbSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFza2xvYWRfcHMoZmxvYXQgY29uc3QgKl9fcCwgX19tMjU2aSBfX20pCit7CisgIHJldHVybiAoX19tMjU2KV9fYnVpbHRpbl9pYTMyX21hc2tsb2FkcHMyNTYoKGNvbnN0IF9fdjhzZiAqKV9fcCwgKF9fdjhzaSlfX20pOworfQorCisvKiBDb25kaXRpb25hbCBzdG9yZSBvcHMgKi8KK3N0YXRpYyBfX2lubGluZSB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tzdG9yZV9wcyhmbG9hdCAqX19wLCBfX20yNTZpIF9fbSwgX19tMjU2IF9fYSkKK3sKKyAgX19idWlsdGluX2lhMzJfbWFza3N0b3JlcHMyNTYoKF9fdjhzZiAqKV9fcCwgKF9fdjhzaSlfX20sIChfX3Y4c2YpX19hKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza3N0b3JlX3BkKGRvdWJsZSAqX19wLCBfX20xMjhpIF9fbSwgX19tMTI4ZCBfX2EpCit7CisgIF9fYnVpbHRpbl9pYTMyX21hc2tzdG9yZXBkKChfX3YyZGYgKilfX3AsIChfX3YyZGkpX19tLCAoX192MmRmKV9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21hc2tzdG9yZV9wZChkb3VibGUgKl9fcCwgX19tMjU2aSBfX20sIF9fbTI1NmQgX19hKQoreworICBfX2J1aWx0aW5faWEzMl9tYXNrc3RvcmVwZDI1NigoX192NGRmICopX19wLCAoX192NGRpKV9fbSwgKF9fdjRkZilfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrc3RvcmVfcHMoZmxvYXQgKl9fcCwgX19tMTI4aSBfX20sIF9fbTEyOCBfX2EpCit7CisgIF9fYnVpbHRpbl9pYTMyX21hc2tzdG9yZXBzKChfX3Y0c2YgKilfX3AsIChfX3Y0c2kpX19tLCAoX192NHNmKV9fYSk7Cit9CisKKy8qIENhY2hlYWJpbGl0eSBzdXBwb3J0IG9wcyAqLworc3RhdGljIF9faW5saW5lIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfc3RyZWFtX3NpMjU2KF9fbTI1NmkgKl9fYSwgX19tMjU2aSBfX2IpCit7CisgIF9fYnVpbHRpbl9ub250ZW1wb3JhbF9zdG9yZSgoX192NGRpKV9fYiwgKF9fdjRkaSopX19hKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfc3RyZWFtX3BkKGRvdWJsZSAqX19hLCBfX20yNTZkIF9fYikKK3sKKyAgX19idWlsdGluX25vbnRlbXBvcmFsX3N0b3JlKChfX3Y0ZGYpX19iLCAoX192NGRmKilfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9zdHJlYW1fcHMoZmxvYXQgKl9fcCwgX19tMjU2IF9fYSkKK3sKKyAgX19idWlsdGluX25vbnRlbXBvcmFsX3N0b3JlKChfX3Y4c2YpX19hLCAoX192OHNmKilfX3ApOworfQorCisvKiBDcmVhdGUgdmVjdG9ycyAqLworc3RhdGljIF9faW5saW5lX18gX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl91bmRlZmluZWRfcGQodm9pZCkKK3sKKyAgcmV0dXJuIChfX20yNTZkKV9fYnVpbHRpbl9pYTMyX3VuZGVmMjU2KCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl91bmRlZmluZWRfcHModm9pZCkKK3sKKyAgcmV0dXJuIChfX20yNTYpX19idWlsdGluX2lhMzJfdW5kZWYyNTYoKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl91bmRlZmluZWRfc2kyNTYodm9pZCkKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3VuZGVmMjU2KCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX20yNTZkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3NldF9wZChkb3VibGUgX19hLCBkb3VibGUgX19iLCBkb3VibGUgX19jLCBkb3VibGUgX19kKQoreworICByZXR1cm4gKF9fbTI1NmQpeyBfX2QsIF9fYywgX19iLCBfX2EgfTsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9zZXRfcHMoZmxvYXQgX19hLCBmbG9hdCBfX2IsIGZsb2F0IF9fYywgZmxvYXQgX19kLAorICAgICAgICAgICAgICBmbG9hdCBfX2UsIGZsb2F0IF9fZiwgZmxvYXQgX19nLCBmbG9hdCBfX2gpCit7CisgIHJldHVybiAoX19tMjU2KXsgX19oLCBfX2csIF9fZiwgX19lLCBfX2QsIF9fYywgX19iLCBfX2EgfTsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfc2V0X2VwaTMyKGludCBfX2kwLCBpbnQgX19pMSwgaW50IF9faTIsIGludCBfX2kzLAorICAgICAgICAgICAgICAgICBpbnQgX19pNCwgaW50IF9faTUsIGludCBfX2k2LCBpbnQgX19pNykKK3sKKyAgcmV0dXJuIChfX20yNTZpKShfX3Y4c2kpeyBfX2k3LCBfX2k2LCBfX2k1LCBfX2k0LCBfX2kzLCBfX2kyLCBfX2kxLCBfX2kwIH07Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3NldF9lcGkxNihzaG9ydCBfX3cxNSwgc2hvcnQgX193MTQsIHNob3J0IF9fdzEzLCBzaG9ydCBfX3cxMiwKKyAgICAgICAgICAgICAgICAgc2hvcnQgX193MTEsIHNob3J0IF9fdzEwLCBzaG9ydCBfX3cwOSwgc2hvcnQgX193MDgsCisgICAgICAgICAgICAgICAgIHNob3J0IF9fdzA3LCBzaG9ydCBfX3cwNiwgc2hvcnQgX193MDUsIHNob3J0IF9fdzA0LAorICAgICAgICAgICAgICAgICBzaG9ydCBfX3cwMywgc2hvcnQgX193MDIsIHNob3J0IF9fdzAxLCBzaG9ydCBfX3cwMCkKK3sKKyAgcmV0dXJuIChfX20yNTZpKShfX3YxNmhpKXsgX193MDAsIF9fdzAxLCBfX3cwMiwgX193MDMsIF9fdzA0LCBfX3cwNSwgX193MDYsCisgICAgX193MDcsIF9fdzA4LCBfX3cwOSwgX193MTAsIF9fdzExLCBfX3cxMiwgX193MTMsIF9fdzE0LCBfX3cxNSB9OworfQorCitzdGF0aWMgX19pbmxpbmUgX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9zZXRfZXBpOChjaGFyIF9fYjMxLCBjaGFyIF9fYjMwLCBjaGFyIF9fYjI5LCBjaGFyIF9fYjI4LAorICAgICAgICAgICAgICAgIGNoYXIgX19iMjcsIGNoYXIgX19iMjYsIGNoYXIgX19iMjUsIGNoYXIgX19iMjQsCisgICAgICAgICAgICAgICAgY2hhciBfX2IyMywgY2hhciBfX2IyMiwgY2hhciBfX2IyMSwgY2hhciBfX2IyMCwKKyAgICAgICAgICAgICAgICBjaGFyIF9fYjE5LCBjaGFyIF9fYjE4LCBjaGFyIF9fYjE3LCBjaGFyIF9fYjE2LAorICAgICAgICAgICAgICAgIGNoYXIgX19iMTUsIGNoYXIgX19iMTQsIGNoYXIgX19iMTMsIGNoYXIgX19iMTIsCisgICAgICAgICAgICAgICAgY2hhciBfX2IxMSwgY2hhciBfX2IxMCwgY2hhciBfX2IwOSwgY2hhciBfX2IwOCwKKyAgICAgICAgICAgICAgICBjaGFyIF9fYjA3LCBjaGFyIF9fYjA2LCBjaGFyIF9fYjA1LCBjaGFyIF9fYjA0LAorICAgICAgICAgICAgICAgIGNoYXIgX19iMDMsIGNoYXIgX19iMDIsIGNoYXIgX19iMDEsIGNoYXIgX19iMDApCit7CisgIHJldHVybiAoX19tMjU2aSkoX192MzJxaSl7CisgICAgX19iMDAsIF9fYjAxLCBfX2IwMiwgX19iMDMsIF9fYjA0LCBfX2IwNSwgX19iMDYsIF9fYjA3LAorICAgIF9fYjA4LCBfX2IwOSwgX19iMTAsIF9fYjExLCBfX2IxMiwgX19iMTMsIF9fYjE0LCBfX2IxNSwKKyAgICBfX2IxNiwgX19iMTcsIF9fYjE4LCBfX2IxOSwgX19iMjAsIF9fYjIxLCBfX2IyMiwgX19iMjMsCisgICAgX19iMjQsIF9fYjI1LCBfX2IyNiwgX19iMjcsIF9fYjI4LCBfX2IyOSwgX19iMzAsIF9fYjMxCisgIH07Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3NldF9lcGk2NHgobG9uZyBsb25nIF9fYSwgbG9uZyBsb25nIF9fYiwgbG9uZyBsb25nIF9fYywgbG9uZyBsb25nIF9fZCkKK3sKKyAgcmV0dXJuIChfX20yNTZpKShfX3Y0ZGkpeyBfX2QsIF9fYywgX19iLCBfX2EgfTsKK30KKworLyogQ3JlYXRlIHZlY3RvcnMgd2l0aCBlbGVtZW50cyBpbiByZXZlcnNlIG9yZGVyICovCitzdGF0aWMgX19pbmxpbmUgX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9zZXRyX3BkKGRvdWJsZSBfX2EsIGRvdWJsZSBfX2IsIGRvdWJsZSBfX2MsIGRvdWJsZSBfX2QpCit7CisgIHJldHVybiAoX19tMjU2ZCl7IF9fYSwgX19iLCBfX2MsIF9fZCB9OworfQorCitzdGF0aWMgX19pbmxpbmUgX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3NldHJfcHMoZmxvYXQgX19hLCBmbG9hdCBfX2IsIGZsb2F0IF9fYywgZmxvYXQgX19kLAorICAgICAgICAgICAgICAgZmxvYXQgX19lLCBmbG9hdCBfX2YsIGZsb2F0IF9fZywgZmxvYXQgX19oKQoreworICByZXR1cm4gKF9fbTI1Nil7IF9fYSwgX19iLCBfX2MsIF9fZCwgX19lLCBfX2YsIF9fZywgX19oIH07Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3NldHJfZXBpMzIoaW50IF9faTAsIGludCBfX2kxLCBpbnQgX19pMiwgaW50IF9faTMsCisgICAgICAgICAgICAgICAgICBpbnQgX19pNCwgaW50IF9faTUsIGludCBfX2k2LCBpbnQgX19pNykKK3sKKyAgcmV0dXJuIChfX20yNTZpKShfX3Y4c2kpeyBfX2kwLCBfX2kxLCBfX2kyLCBfX2kzLCBfX2k0LCBfX2k1LCBfX2k2LCBfX2k3IH07Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3NldHJfZXBpMTYoc2hvcnQgX193MTUsIHNob3J0IF9fdzE0LCBzaG9ydCBfX3cxMywgc2hvcnQgX193MTIsCisgICAgICAgc2hvcnQgX193MTEsIHNob3J0IF9fdzEwLCBzaG9ydCBfX3cwOSwgc2hvcnQgX193MDgsCisgICAgICAgc2hvcnQgX193MDcsIHNob3J0IF9fdzA2LCBzaG9ydCBfX3cwNSwgc2hvcnQgX193MDQsCisgICAgICAgc2hvcnQgX193MDMsIHNob3J0IF9fdzAyLCBzaG9ydCBfX3cwMSwgc2hvcnQgX193MDApCit7CisgIHJldHVybiAoX19tMjU2aSkoX192MTZoaSl7IF9fdzE1LCBfX3cxNCwgX193MTMsIF9fdzEyLCBfX3cxMSwgX193MTAsIF9fdzA5LAorICAgIF9fdzA4LCBfX3cwNywgX193MDYsIF9fdzA1LCBfX3cwNCwgX193MDMsIF9fdzAyLCBfX3cwMSwgX193MDAgfTsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfc2V0cl9lcGk4KGNoYXIgX19iMzEsIGNoYXIgX19iMzAsIGNoYXIgX19iMjksIGNoYXIgX19iMjgsCisgICAgICAgICAgICAgICAgIGNoYXIgX19iMjcsIGNoYXIgX19iMjYsIGNoYXIgX19iMjUsIGNoYXIgX19iMjQsCisgICAgICAgICAgICAgICAgIGNoYXIgX19iMjMsIGNoYXIgX19iMjIsIGNoYXIgX19iMjEsIGNoYXIgX19iMjAsCisgICAgICAgICAgICAgICAgIGNoYXIgX19iMTksIGNoYXIgX19iMTgsIGNoYXIgX19iMTcsIGNoYXIgX19iMTYsCisgICAgICAgICAgICAgICAgIGNoYXIgX19iMTUsIGNoYXIgX19iMTQsIGNoYXIgX19iMTMsIGNoYXIgX19iMTIsCisgICAgICAgICAgICAgICAgIGNoYXIgX19iMTEsIGNoYXIgX19iMTAsIGNoYXIgX19iMDksIGNoYXIgX19iMDgsCisgICAgICAgICAgICAgICAgIGNoYXIgX19iMDcsIGNoYXIgX19iMDYsIGNoYXIgX19iMDUsIGNoYXIgX19iMDQsCisgICAgICAgICAgICAgICAgIGNoYXIgX19iMDMsIGNoYXIgX19iMDIsIGNoYXIgX19iMDEsIGNoYXIgX19iMDApCit7CisgIHJldHVybiAoX19tMjU2aSkoX192MzJxaSl7CisgICAgX19iMzEsIF9fYjMwLCBfX2IyOSwgX19iMjgsIF9fYjI3LCBfX2IyNiwgX19iMjUsIF9fYjI0LAorICAgIF9fYjIzLCBfX2IyMiwgX19iMjEsIF9fYjIwLCBfX2IxOSwgX19iMTgsIF9fYjE3LCBfX2IxNiwKKyAgICBfX2IxNSwgX19iMTQsIF9fYjEzLCBfX2IxMiwgX19iMTEsIF9fYjEwLCBfX2IwOSwgX19iMDgsCisgICAgX19iMDcsIF9fYjA2LCBfX2IwNSwgX19iMDQsIF9fYjAzLCBfX2IwMiwgX19iMDEsIF9fYjAwIH07Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3NldHJfZXBpNjR4KGxvbmcgbG9uZyBfX2EsIGxvbmcgbG9uZyBfX2IsIGxvbmcgbG9uZyBfX2MsIGxvbmcgbG9uZyBfX2QpCit7CisgIHJldHVybiAoX19tMjU2aSkoX192NGRpKXsgX19hLCBfX2IsIF9fYywgX19kIH07Cit9CisKKy8qIENyZWF0ZSB2ZWN0b3JzIHdpdGggcmVwZWF0ZWQgZWxlbWVudHMgKi8KK3N0YXRpYyBfX2lubGluZSBfX20yNTZkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3NldDFfcGQoZG91YmxlIF9fdykKK3sKKyAgcmV0dXJuIChfX20yNTZkKXsgX193LCBfX3csIF9fdywgX193IH07Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfc2V0MV9wcyhmbG9hdCBfX3cpCit7CisgIHJldHVybiAoX19tMjU2KXsgX193LCBfX3csIF9fdywgX193LCBfX3csIF9fdywgX193LCBfX3cgfTsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfc2V0MV9lcGkzMihpbnQgX19pKQoreworICByZXR1cm4gKF9fbTI1NmkpKF9fdjhzaSl7IF9faSwgX19pLCBfX2ksIF9faSwgX19pLCBfX2ksIF9faSwgX19pIH07Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX20yNTZpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3NldDFfZXBpMTYoc2hvcnQgX193KQoreworICByZXR1cm4gKF9fbTI1NmkpKF9fdjE2aGkpeyBfX3csIF9fdywgX193LCBfX3csIF9fdywgX193LCBfX3csIF9fdywgX193LCBfX3csCisgICAgX193LCBfX3csIF9fdywgX193LCBfX3csIF9fdyB9OworfQorCitzdGF0aWMgX19pbmxpbmUgX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9zZXQxX2VwaTgoY2hhciBfX2IpCit7CisgIHJldHVybiAoX19tMjU2aSkoX192MzJxaSl7IF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwKKyAgICBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLAorICAgIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiB9OworfQorCitzdGF0aWMgX19pbmxpbmUgX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9zZXQxX2VwaTY0eChsb25nIGxvbmcgX19xKQoreworICByZXR1cm4gKF9fbTI1NmkpKF9fdjRkaSl7IF9fcSwgX19xLCBfX3EsIF9fcSB9OworfQorCisvKiBDcmVhdGUgX196ZXJvZWQgdmVjdG9ycyAqLworc3RhdGljIF9faW5saW5lIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfc2V0emVyb19wZCh2b2lkKQoreworICByZXR1cm4gKF9fbTI1NmQpeyAwLCAwLCAwLCAwIH07Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfc2V0emVyb19wcyh2b2lkKQoreworICByZXR1cm4gKF9fbTI1Nil7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfc2V0emVyb19zaTI1Nih2b2lkKQoreworICByZXR1cm4gKF9fbTI1NmkpeyAwTEwsIDBMTCwgMExMLCAwTEwgfTsKK30KKworLyogQ2FzdCBiZXR3ZWVuIHZlY3RvciB0eXBlcyAqLworc3RhdGljIF9faW5saW5lIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9jYXN0cGRfcHMoX19tMjU2ZCBfX2EpCit7CisgIHJldHVybiAoX19tMjU2KV9fYTsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY2FzdHBkX3NpMjU2KF9fbTI1NmQgX19hKQoreworICByZXR1cm4gKF9fbTI1NmkpX19hOworfQorCitzdGF0aWMgX19pbmxpbmUgX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9jYXN0cHNfcGQoX19tMjU2IF9fYSkKK3sKKyAgcmV0dXJuIChfX20yNTZkKV9fYTsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY2FzdHBzX3NpMjU2KF9fbTI1NiBfX2EpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2E7Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY2FzdHNpMjU2X3BzKF9fbTI1NmkgX19hKQoreworICByZXR1cm4gKF9fbTI1NilfX2E7Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX20yNTZkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2Nhc3RzaTI1Nl9wZChfX20yNTZpIF9fYSkKK3sKKyAgcmV0dXJuIChfX20yNTZkKV9fYTsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY2FzdHBkMjU2X3BkMTI4KF9fbTI1NmQgX19hKQoreworICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjRkZilfX2EsIChfX3Y0ZGYpX19hLCAwLCAxKTsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9jYXN0cHMyNTZfcHMxMjgoX19tMjU2IF9fYSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3Y4c2YpX19hLCAoX192OHNmKV9fYSwgMCwgMSwgMiwgMyk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2Nhc3RzaTI1Nl9zaTEyOChfX20yNTZpIF9fYSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3Y0ZGkpX19hLCAoX192NGRpKV9fYSwgMCwgMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX20yNTZkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2Nhc3RwZDEyOF9wZDI1NihfX20xMjhkIF9fYSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3YyZGYpX19hLCAoX192MmRmKV9fYSwgMCwgMSwgLTEsIC0xKTsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9jYXN0cHMxMjhfcHMyNTYoX19tMTI4IF9fYSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3Y0c2YpX19hLCAoX192NHNmKV9fYSwgMCwgMSwgMiwgMywgLTEsIC0xLCAtMSwgLTEpOworfQorCitzdGF0aWMgX19pbmxpbmUgX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9jYXN0c2kxMjhfc2kyNTYoX19tMTI4aSBfX2EpCit7CisgIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcigoX192MmRpKV9fYSwgKF9fdjJkaSlfX2EsIDAsIDEsIC0xLCAtMSk7Cit9CisKKy8qCisgICBWZWN0b3IgaW5zZXJ0LgorICAgV2UgdXNlIG1hY3JvcyByYXRoZXIgdGhhbiBpbmxpbmVzIGJlY2F1c2Ugd2Ugb25seSB3YW50IHRvIGFjY2VwdAorICAgaW52b2NhdGlvbnMgd2hlcmUgdGhlIGltbWVkaWF0ZSBNIGlzIGEgY29uc3RhbnQgZXhwcmVzc2lvbi4KKyovCisjZGVmaW5lIF9tbTI1Nl9pbnNlcnRmMTI4X3BzKFYxLCBWMiwgTSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTYpX19idWlsdGluX3NodWZmbGV2ZWN0b3IoIFwKKyAgICAoX192OHNmKShfX20yNTYpKFYxKSwgXAorICAgIChfX3Y4c2YpX21tMjU2X2Nhc3RwczEyOF9wczI1NigoX19tMTI4KShWMikpLCBcCisgICAgKCgoTSkgJiAxKSA/ICAwIDogIDgpLCBcCisgICAgKCgoTSkgJiAxKSA/ICAxIDogIDkpLCBcCisgICAgKCgoTSkgJiAxKSA/ICAyIDogMTApLCBcCisgICAgKCgoTSkgJiAxKSA/ICAzIDogMTEpLCBcCisgICAgKCgoTSkgJiAxKSA/ICA4IDogIDQpLCBcCisgICAgKCgoTSkgJiAxKSA/ICA5IDogIDUpLCBcCisgICAgKCgoTSkgJiAxKSA/IDEwIDogIDYpLCBcCisgICAgKCgoTSkgJiAxKSA/IDExIDogIDcpICk7fSkKKworI2RlZmluZSBfbW0yNTZfaW5zZXJ0ZjEyOF9wZChWMSwgVjIsIE0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMjU2ZClfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvciggXAorICAgIChfX3Y0ZGYpKF9fbTI1NmQpKFYxKSwgXAorICAgIChfX3Y0ZGYpX21tMjU2X2Nhc3RwZDEyOF9wZDI1NigoX19tMTI4ZCkoVjIpKSwgXAorICAgICgoKE0pICYgMSkgPyAwIDogNCksIFwKKyAgICAoKChNKSAmIDEpID8gMSA6IDUpLCBcCisgICAgKCgoTSkgJiAxKSA/IDQgOiAyKSwgXAorICAgICgoKE0pICYgMSkgPyA1IDogMykgKTt9KQorCisjZGVmaW5lIF9tbTI1Nl9pbnNlcnRmMTI4X3NpMjU2KFYxLCBWMiwgTSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTZpKV9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKCBcCisgICAgKF9fdjRkaSkoX19tMjU2aSkoVjEpLCBcCisgICAgKF9fdjRkaSlfbW0yNTZfY2FzdHNpMTI4X3NpMjU2KChfX20xMjhpKShWMikpLCBcCisgICAgKCgoTSkgJiAxKSA/IDAgOiA0KSwgXAorICAgICgoKE0pICYgMSkgPyAxIDogNSksIFwKKyAgICAoKChNKSAmIDEpID8gNCA6IDIpLCBcCisgICAgKCgoTSkgJiAxKSA/IDUgOiAzKSApO30pCisKKy8qCisgICBWZWN0b3IgZXh0cmFjdC4KKyAgIFdlIHVzZSBtYWNyb3MgcmF0aGVyIHRoYW4gaW5saW5lcyBiZWNhdXNlIHdlIG9ubHkgd2FudCB0byBhY2NlcHQKKyAgIGludm9jYXRpb25zIHdoZXJlIHRoZSBpbW1lZGlhdGUgTSBpcyBhIGNvbnN0YW50IGV4cHJlc3Npb24uCisqLworI2RlZmluZSBfbW0yNTZfZXh0cmFjdGYxMjhfcHMoViwgTSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjgpX19idWlsdGluX3NodWZmbGV2ZWN0b3IoIFwKKyAgICAoX192OHNmKShfX20yNTYpKFYpLCBcCisgICAgKF9fdjhzZikoX21tMjU2X3VuZGVmaW5lZF9wcygpKSwgXAorICAgICgoKE0pICYgMSkgPyA0IDogMCksIFwKKyAgICAoKChNKSAmIDEpID8gNSA6IDEpLCBcCisgICAgKCgoTSkgJiAxKSA/IDYgOiAyKSwgXAorICAgICgoKE0pICYgMSkgPyA3IDogMykgKTt9KQorCisjZGVmaW5lIF9tbTI1Nl9leHRyYWN0ZjEyOF9wZChWLCBNKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGQpX19idWlsdGluX3NodWZmbGV2ZWN0b3IoIFwKKyAgICAoX192NGRmKShfX20yNTZkKShWKSwgXAorICAgIChfX3Y0ZGYpKF9tbTI1Nl91bmRlZmluZWRfcGQoKSksIFwKKyAgICAoKChNKSAmIDEpID8gMiA6IDApLCBcCisgICAgKCgoTSkgJiAxKSA/IDMgOiAxKSApO30pCisKKyNkZWZpbmUgX21tMjU2X2V4dHJhY3RmMTI4X3NpMjU2KFYsIE0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4aSlfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvciggXAorICAgIChfX3Y0ZGkpKF9fbTI1NmkpKFYpLCBcCisgICAgKF9fdjRkaSkoX21tMjU2X3VuZGVmaW5lZF9zaTI1NigpKSwgXAorICAgICgoKE0pICYgMSkgPyAyIDogMCksIFwKKyAgICAoKChNKSAmIDEpID8gMyA6IDEpICk7fSkKKworLyogU0lNRCBsb2FkIG9wcyAodW5hbGlnbmVkKSAqLworc3RhdGljIF9faW5saW5lIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9sb2FkdTJfbTEyOChmbG9hdCBjb25zdCAqX19hZGRyX2hpLCBmbG9hdCBjb25zdCAqX19hZGRyX2xvKQoreworICBfX20yNTYgX192MjU2ID0gX21tMjU2X2Nhc3RwczEyOF9wczI1NihfbW1fbG9hZHVfcHMoX19hZGRyX2xvKSk7CisgIHJldHVybiBfbW0yNTZfaW5zZXJ0ZjEyOF9wcyhfX3YyNTYsIF9tbV9sb2FkdV9wcyhfX2FkZHJfaGkpLCAxKTsKK30KKworc3RhdGljIF9faW5saW5lIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbG9hZHUyX20xMjhkKGRvdWJsZSBjb25zdCAqX19hZGRyX2hpLCBkb3VibGUgY29uc3QgKl9fYWRkcl9sbykKK3sKKyAgX19tMjU2ZCBfX3YyNTYgPSBfbW0yNTZfY2FzdHBkMTI4X3BkMjU2KF9tbV9sb2FkdV9wZChfX2FkZHJfbG8pKTsKKyAgcmV0dXJuIF9tbTI1Nl9pbnNlcnRmMTI4X3BkKF9fdjI1NiwgX21tX2xvYWR1X3BkKF9fYWRkcl9oaSksIDEpOworfQorCitzdGF0aWMgX19pbmxpbmUgX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9sb2FkdTJfbTEyOGkoX19tMTI4aSBjb25zdCAqX19hZGRyX2hpLCBfX20xMjhpIGNvbnN0ICpfX2FkZHJfbG8pCit7CisgIF9fbTI1NmkgX192MjU2ID0gX21tMjU2X2Nhc3RzaTEyOF9zaTI1NihfbW1fbG9hZHVfc2kxMjgoX19hZGRyX2xvKSk7CisgIHJldHVybiBfbW0yNTZfaW5zZXJ0ZjEyOF9zaTI1NihfX3YyNTYsIF9tbV9sb2FkdV9zaTEyOChfX2FkZHJfaGkpLCAxKTsKK30KKworLyogU0lNRCBzdG9yZSBvcHMgKHVuYWxpZ25lZCkgKi8KK3N0YXRpYyBfX2lubGluZSB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3N0b3JldTJfbTEyOChmbG9hdCAqX19hZGRyX2hpLCBmbG9hdCAqX19hZGRyX2xvLCBfX20yNTYgX19hKQoreworICBfX20xMjggX192MTI4OworCisgIF9fdjEyOCA9IF9tbTI1Nl9jYXN0cHMyNTZfcHMxMjgoX19hKTsKKyAgX21tX3N0b3JldV9wcyhfX2FkZHJfbG8sIF9fdjEyOCk7CisgIF9fdjEyOCA9IF9tbTI1Nl9leHRyYWN0ZjEyOF9wcyhfX2EsIDEpOworICBfbW1fc3RvcmV1X3BzKF9fYWRkcl9oaSwgX192MTI4KTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfc3RvcmV1Ml9tMTI4ZChkb3VibGUgKl9fYWRkcl9oaSwgZG91YmxlICpfX2FkZHJfbG8sIF9fbTI1NmQgX19hKQoreworICBfX20xMjhkIF9fdjEyODsKKworICBfX3YxMjggPSBfbW0yNTZfY2FzdHBkMjU2X3BkMTI4KF9fYSk7CisgIF9tbV9zdG9yZXVfcGQoX19hZGRyX2xvLCBfX3YxMjgpOworICBfX3YxMjggPSBfbW0yNTZfZXh0cmFjdGYxMjhfcGQoX19hLCAxKTsKKyAgX21tX3N0b3JldV9wZChfX2FkZHJfaGksIF9fdjEyOCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3N0b3JldTJfbTEyOGkoX19tMTI4aSAqX19hZGRyX2hpLCBfX20xMjhpICpfX2FkZHJfbG8sIF9fbTI1NmkgX19hKQoreworICBfX20xMjhpIF9fdjEyODsKKworICBfX3YxMjggPSBfbW0yNTZfY2FzdHNpMjU2X3NpMTI4KF9fYSk7CisgIF9tbV9zdG9yZXVfc2kxMjgoX19hZGRyX2xvLCBfX3YxMjgpOworICBfX3YxMjggPSBfbW0yNTZfZXh0cmFjdGYxMjhfc2kyNTYoX19hLCAxKTsKKyAgX21tX3N0b3JldV9zaTEyOChfX2FkZHJfaGksIF9fdjEyOCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfc2V0X20xMjggKF9fbTEyOCBfX2hpLCBfX20xMjggX19sbykgeworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjRzZilfX2xvLCAoX192NHNmKV9faGksIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcpOworfQorCitzdGF0aWMgX19pbmxpbmUgX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9zZXRfbTEyOGQgKF9fbTEyOGQgX19oaSwgX19tMTI4ZCBfX2xvKSB7CisgIHJldHVybiAoX19tMjU2ZClfbW0yNTZfc2V0X20xMjgoKF9fbTEyOClfX2hpLCAoX19tMTI4KV9fbG8pOworfQorCitzdGF0aWMgX19pbmxpbmUgX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9zZXRfbTEyOGkgKF9fbTEyOGkgX19oaSwgX19tMTI4aSBfX2xvKSB7CisgIHJldHVybiAoX19tMjU2aSlfbW0yNTZfc2V0X20xMjgoKF9fbTEyOClfX2hpLCAoX19tMTI4KV9fbG8pOworfQorCitzdGF0aWMgX19pbmxpbmUgX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3NldHJfbTEyOCAoX19tMTI4IF9fbG8sIF9fbTEyOCBfX2hpKSB7CisgIHJldHVybiBfbW0yNTZfc2V0X20xMjgoX19oaSwgX19sbyk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBfX20yNTZkIF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X3NldHJfbTEyOGQgKF9fbTEyOGQgX19sbywgX19tMTI4ZCBfX2hpKSB7CisgIHJldHVybiAoX19tMjU2ZClfbW0yNTZfc2V0X20xMjgoKF9fbTEyOClfX2hpLCAoX19tMTI4KV9fbG8pOworfQorCitzdGF0aWMgX19pbmxpbmUgX19tMjU2aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9zZXRyX20xMjhpIChfX20xMjhpIF9fbG8sIF9fbTEyOGkgX19oaSkgeworICByZXR1cm4gKF9fbTI1NmkpX21tMjU2X3NldF9tMTI4KChfX20xMjgpX19oaSwgKF9fbTEyOClfX2xvKTsKK30KKworI3VuZGVmIF9fREVGQVVMVF9GTl9BVFRSUworCisjZW5kaWYgLyogX19BVlhJTlRSSU5fSCAqLwpkaWZmIC0tZ2l0IGEvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvYm1pMmludHJpbi5oIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvYm1pMmludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYWU4MmMKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9ibWkyaW50cmluLmgKQEAgLTAsMCArMSw5NSBAQAorLyo9PT0tLS0tIGJtaTJpbnRyaW4uaCAtIEJNSTIgaW50cmluc2ljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqCisgKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisgKi8KKworI2lmICFkZWZpbmVkIF9fWDg2SU5UUklOX0ggJiYgIWRlZmluZWQgX19JTU1JTlRSSU5fSAorI2Vycm9yICJOZXZlciB1c2UgPGJtaTJpbnRyaW4uaD4gZGlyZWN0bHk7IGluY2x1ZGUgPHg4NmludHJpbi5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9fQk1JMklOVFJJTl9ICisjZGVmaW5lIF9fQk1JMklOVFJJTl9ICisKKy8qIERlZmluZSB0aGUgZGVmYXVsdCBhdHRyaWJ1dGVzIGZvciB0aGUgZnVuY3Rpb25zIGluIHRoaXMgZmlsZS4gKi8KKyNkZWZpbmUgX19ERUZBVUxUX0ZOX0FUVFJTIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXywgX190YXJnZXRfXygiYm1pMiIpKSkKKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50IF9fREVGQVVMVF9GTl9BVFRSUworX2J6aGlfdTMyKHVuc2lnbmVkIGludCBfX1gsIHVuc2lnbmVkIGludCBfX1kpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9iemhpX3NpKF9fWCwgX19ZKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50IF9fREVGQVVMVF9GTl9BVFRSUworX3BkZXBfdTMyKHVuc2lnbmVkIGludCBfX1gsIHVuc2lnbmVkIGludCBfX1kpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9wZGVwX3NpKF9fWCwgX19ZKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50IF9fREVGQVVMVF9GTl9BVFRSUworX3BleHRfdTMyKHVuc2lnbmVkIGludCBfX1gsIHVuc2lnbmVkIGludCBfX1kpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9wZXh0X3NpKF9fWCwgX19ZKTsKK30KKworI2lmZGVmICBfX3g4Nl82NF9fCisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcgbG9uZyBfX0RFRkFVTFRfRk5fQVRUUlMKK19iemhpX3U2NCh1bnNpZ25lZCBsb25nIGxvbmcgX19YLCB1bnNpZ25lZCBsb25nIGxvbmcgX19ZKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfYnpoaV9kaShfX1gsIF9fWSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcgbG9uZyBfX0RFRkFVTFRfRk5fQVRUUlMKK19wZGVwX3U2NCh1bnNpZ25lZCBsb25nIGxvbmcgX19YLCB1bnNpZ25lZCBsb25nIGxvbmcgX19ZKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcGRlcF9kaShfX1gsIF9fWSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcgbG9uZyBfX0RFRkFVTFRfRk5fQVRUUlMKK19wZXh0X3U2NCh1bnNpZ25lZCBsb25nIGxvbmcgX19YLCB1bnNpZ25lZCBsb25nIGxvbmcgX19ZKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcGV4dF9kaShfX1gsIF9fWSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcgbG9uZyBfX0RFRkFVTFRfRk5fQVRUUlMKK19tdWx4X3U2NCAodW5zaWduZWQgbG9uZyBsb25nIF9fWCwgdW5zaWduZWQgbG9uZyBsb25nIF9fWSwKKwkgICB1bnNpZ25lZCBsb25nIGxvbmcgKl9fUCkKK3sKKyAgdW5zaWduZWQgX19pbnQxMjggX19yZXMgPSAodW5zaWduZWQgX19pbnQxMjgpIF9fWCAqIF9fWTsKKyAgKl9fUCA9ICh1bnNpZ25lZCBsb25nIGxvbmcpIChfX3JlcyA+PiA2NCk7CisgIHJldHVybiAodW5zaWduZWQgbG9uZyBsb25nKSBfX3JlczsKK30KKworI2Vsc2UgLyogIV9feDg2XzY0X18gKi8KKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50IF9fREVGQVVMVF9GTl9BVFRSUworX211bHhfdTMyICh1bnNpZ25lZCBpbnQgX19YLCB1bnNpZ25lZCBpbnQgX19ZLCB1bnNpZ25lZCBpbnQgKl9fUCkKK3sKKyAgdW5zaWduZWQgbG9uZyBsb25nIF9fcmVzID0gKHVuc2lnbmVkIGxvbmcgbG9uZykgX19YICogX19ZOworICAqX19QID0gKHVuc2lnbmVkIGludCkgKF9fcmVzID4+IDMyKTsKKyAgcmV0dXJuICh1bnNpZ25lZCBpbnQpIF9fcmVzOworfQorCisjZW5kaWYgLyogIV9feDg2XzY0X18gICovCisKKyN1bmRlZiBfX0RFRkFVTFRfRk5fQVRUUlMKKworI2VuZGlmIC8qIF9fQk1JMklOVFJJTl9IICovCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9ibWlpbnRyaW4uaCBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL2JtaWludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYWNmYWUKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9ibWlpbnRyaW4uaApAQCAtMCwwICsxLDU0OCBAQAorLyo9PT0tLS0tIGJtaWludHJpbi5oIC0gQk1JIGludHJpbnNpY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqCisgKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisgKi8KKworI2lmICFkZWZpbmVkIF9fWDg2SU5UUklOX0ggJiYgIWRlZmluZWQgX19JTU1JTlRSSU5fSAorI2Vycm9yICJOZXZlciB1c2UgPGJtaWludHJpbi5oPiBkaXJlY3RseTsgaW5jbHVkZSA8eDg2aW50cmluLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpZm5kZWYgX19CTUlJTlRSSU5fSAorI2RlZmluZSBfX0JNSUlOVFJJTl9ICisKKy8vLyBcYnJpZWYgQ291bnRzIHRoZSBudW1iZXIgb2YgdHJhaWxpbmcgemVybyBiaXRzIGluIHRoZSBvcGVyYW5kLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gXGNvZGUKKy8vLyB1bnNpZ25lZCBzaG9ydCBfdHpjbnRfdTE2KHVuc2lnbmVkIHNob3J0IGEpOworLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVFpDTlQgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gYQorLy8vICAgIEFuIHVuc2lnbmVkIDE2LWJpdCBpbnRlZ2VyIHdob3NlIHRyYWlsaW5nIHplcm9zIGFyZSB0byBiZSBjb3VudGVkLgorLy8vIFxyZXR1cm5zIEFuIHVuc2lnbmVkIDE2LWJpdCBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIG51bWJlciBvZiB0cmFpbGluZyB6ZXJvCisvLy8gICAgYml0cyBpbiB0aGUgb3BlcmFuZC4KKyNkZWZpbmUgX3R6Y250X3UxNihhKSAgICAgKF9fdHpjbnRfdTE2KChhKSkpCisKKy8vLyBcYnJpZWYgUGVyZm9ybXMgYSBiaXR3aXNlIEFORCBvZiB0aGUgc2Vjb25kIG9wZXJhbmQgd2l0aCB0aGUgb25lJ3MKKy8vLyAgICBjb21wbGVtZW50IG9mIHRoZSBmaXJzdCBvcGVyYW5kLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gXGNvZGUKKy8vLyB1bnNpZ25lZCBpbnQgX2FuZG5fdTMyKHVuc2lnbmVkIGludCBhLCB1bnNpZ25lZCBpbnQgYik7CisvLy8gXGVuZGNvZGUKKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBBTkROIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIGEKKy8vLyAgICBBbiB1bnNpZ25lZCBpbnRlZ2VyIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBvcGVyYW5kcy4KKy8vLyBccGFyYW0gYgorLy8vICAgIEFuIHVuc2lnbmVkIGludGVnZXIgY29udGFpbmluZyBvbmUgb2YgdGhlIG9wZXJhbmRzLgorLy8vIFxyZXR1cm5zIEFuIHVuc2lnbmVkIGludGVnZXIgY29udGFpbmluZyB0aGUgYml0d2lzZSBBTkQgb2YgdGhlIHNlY29uZAorLy8vICAgIG9wZXJhbmQgd2l0aCB0aGUgb25lJ3MgY29tcGxlbWVudCBvZiB0aGUgZmlyc3Qgb3BlcmFuZC4KKyNkZWZpbmUgX2FuZG5fdTMyKGEsIGIpICAgKF9fYW5kbl91MzIoKGEpLCAoYikpKQorCisvKiBfYmV4dHJfdTMyICE9IF9fYmV4dHJfdTMyICovCisvLy8gXGJyaWVmIENsZWFycyBhbGwgYml0cyBpbiB0aGUgc291cmNlIGV4Y2VwdCBmb3IgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdAorLy8vICAgIGNvbnRhaW5pbmcgYSB2YWx1ZSBvZiAxIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBcY29kZQorLy8vIHVuc2lnbmVkIGludCBfYmxzaV91MzIodW5zaWduZWQgaW50IGEpOworLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgQkxTSSBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBhCisvLy8gICAgQW4gdW5zaWduZWQgaW50ZWdlciB3aG9zZSBiaXRzIGFyZSB0byBiZSBjbGVhcmVkLgorLy8vIFxyZXR1cm5zIEFuIHVuc2lnbmVkIGludGVnZXIgY29udGFpbmluZyB0aGUgcmVzdWx0IG9mIGNsZWFyaW5nIHRoZSBiaXRzIGZyb20KKy8vLyAgICB0aGUgc291cmNlIG9wZXJhbmQuCisjZGVmaW5lIF9ibHNpX3UzMihhKSAgICAgIChfX2Jsc2lfdTMyKChhKSkpCisKKy8vLyBcYnJpZWYgQ3JlYXRlcyBhIG1hc2sgd2hvc2UgYml0cyBhcmUgc2V0IHRvIDEsIHVzaW5nIGJpdCAwIHVwIHRvIGFuZAorLy8vICAgIGluY2x1ZGluZyB0aGUgbGVhc3Qgc2lnaW5pZmljYW50IGJpdCB0aGF0IGlzIHNldCB0byAxIGluIHRoZSBzb3VyY2UKKy8vLyAgICBvcGVyYW5kIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBcY29kZQorLy8vIHVuc2lnbmVkIGludCBfYmxzbXNrX3UzMih1bnNpZ25lZCBpbnQgYSk7CisvLy8gXGVuZGNvZGUKKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBCTFNNU0sgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gYQorLy8vICAgIEFuIHVuc2lnbmVkIGludGVnZXIgdXNlZCB0byBjcmVhdGUgdGhlIG1hc2suCisvLy8gXHJldHVybnMgQW4gdW5zaWduZWQgaW50ZWdlciBjb250YWluaW5nIHRoZSBuZXdseSBjcmVhdGVkIG1hc2suCisjZGVmaW5lIF9ibHNtc2tfdTMyKGEpICAgIChfX2Jsc21za191MzIoKGEpKSkKKworLy8vIFxicmllZiBDbGVhcnMgdGhlIGxlYXN0IHNpZ2luaWZpY2FudCBiaXQgdGhhdCBpcyBzZXQgdG8gMSBpbiB0aGUgc291cmNlCisvLy8gICAgb3BlcmFuZCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gXGNvZGUKKy8vLyB1bnNpZ25lZCBpbnQgX2Jsc3JfdTMyKHVuc2lnbmVkIGludCBhKTsKKy8vLyBcZW5kY29kZQorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIEJMU1IgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gYQorLy8vICAgIEFuIHVuc2lnbmVkIGludGVnZXIgY29udGFpbmluZyB0aGUgb3BlcmFuZCB0byBiZSBjbGVhcmVkLgorLy8vIFxyZXR1cm5zIEFuIHVuc2lnbmVkIGludGVnZXIgY29udGFpbmluZyB0aGUgcmVzdWx0IG9mIGNsZWFyaW5nIHRoZSBzb3VyY2UKKy8vLyAgICBvcGVyYW5kLgorI2RlZmluZSBfYmxzcl91MzIoYSkgICAgICAoX19ibHNyX3UzMigoYSkpKQorCisvLy8gXGJyaWVmIENvdW50cyB0aGUgbnVtYmVyIG9mIHRyYWlsaW5nIHplcm8gYml0cyBpbiB0aGUgb3BlcmFuZC4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFxjb2RlCisvLy8gdW5zaWduZWQgaW50IF90emNudF91MzIodW5zaWduZWQgaW50IGEpOworLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVFpDTlQgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gYQorLy8vICAgIEFuIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyIHdob3NlIHRyYWlsaW5nIHplcm9zIGFyZSB0byBiZSBjb3VudGVkLgorLy8vIFxyZXR1cm5zIEFuIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIG51bWJlciBvZiB0cmFpbGluZyB6ZXJvCisvLy8gICAgYml0cyBpbiB0aGUgb3BlcmFuZC4KKyNkZWZpbmUgX3R6Y250X3UzMihhKSAgICAgKF9fdHpjbnRfdTMyKChhKSkpCisKKy8qIERlZmluZSB0aGUgZGVmYXVsdCBhdHRyaWJ1dGVzIGZvciB0aGUgZnVuY3Rpb25zIGluIHRoaXMgZmlsZS4gKi8KKyNkZWZpbmUgX19ERUZBVUxUX0ZOX0FUVFJTIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXywgX190YXJnZXRfXygiYm1pIikpKQorCisvKiBBbGxvdyB1c2luZyB0aGUgdHpjbnQgaW50cmluc2ljcyBldmVuIGZvciBub24tQk1JIHRhcmdldHMuIFNpbmNlIHRoZSBUWkNOVAorICAgaW5zdHJ1Y3Rpb24gYmVoYXZlcyBhcyBCU0Ygb24gbm9uLUJNSSB0YXJnZXRzLCB0aGVyZSBpcyBjb2RlIHRoYXQgZXhwZWN0cworICAgdG8gdXNlIGl0IGFzIGEgcG90ZW50aWFsbHkgZmFzdGVyIHZlcnNpb24gb2YgQlNGLiAqLworI2RlZmluZSBfX1JFTEFYRURfRk5fQVRUUlMgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fKSkKKworLy8vIFxicmllZiBDb3VudHMgdGhlIG51bWJlciBvZiB0cmFpbGluZyB6ZXJvIGJpdHMgaW4gdGhlIG9wZXJhbmQuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVFpDTlQgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19YCisvLy8gICAgQW4gdW5zaWduZWQgMTYtYml0IGludGVnZXIgd2hvc2UgdHJhaWxpbmcgemVyb3MgYXJlIHRvIGJlIGNvdW50ZWQuCisvLy8gXHJldHVybnMgQW4gdW5zaWduZWQgMTYtYml0IGludGVnZXIgY29udGFpbmluZyB0aGUgbnVtYmVyIG9mIHRyYWlsaW5nIHplcm8KKy8vLyAgICBiaXRzIGluIHRoZSBvcGVyYW5kLgorc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgc2hvcnQgX19SRUxBWEVEX0ZOX0FUVFJTCitfX3R6Y250X3UxNih1bnNpZ25lZCBzaG9ydCBfX1gpCit7CisgIHJldHVybiBfX1ggPyBfX2J1aWx0aW5fY3R6cyhfX1gpIDogMTY7Cit9CisKKy8vLyBcYnJpZWYgUGVyZm9ybXMgYSBiaXR3aXNlIEFORCBvZiB0aGUgc2Vjb25kIG9wZXJhbmQgd2l0aCB0aGUgb25lJ3MKKy8vLyAgICBjb21wbGVtZW50IG9mIHRoZSBmaXJzdCBvcGVyYW5kLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIEFORE4gaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19YCisvLy8gICAgQW4gdW5zaWduZWQgaW50ZWdlciBjb250YWluaW5nIG9uZSBvZiB0aGUgb3BlcmFuZHMuCisvLy8gXHBhcmFtIF9fWQorLy8vICAgIEFuIHVuc2lnbmVkIGludGVnZXIgY29udGFpbmluZyBvbmUgb2YgdGhlIG9wZXJhbmRzLgorLy8vIFxyZXR1cm5zIEFuIHVuc2lnbmVkIGludGVnZXIgY29udGFpbmluZyB0aGUgYml0d2lzZSBBTkQgb2YgdGhlIHNlY29uZAorLy8vICAgIG9wZXJhbmQgd2l0aCB0aGUgb25lJ3MgY29tcGxlbWVudCBvZiB0aGUgZmlyc3Qgb3BlcmFuZC4KK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludCBfX0RFRkFVTFRfRk5fQVRUUlMKK19fYW5kbl91MzIodW5zaWduZWQgaW50IF9fWCwgdW5zaWduZWQgaW50IF9fWSkKK3sKKyAgcmV0dXJuIH5fX1ggJiBfX1k7Cit9CisKKy8qIEFNRC1zcGVjaWZpZWQsIGRvdWJsZS1sZWFkaW5nLXVuZGVyc2NvcmUgdmVyc2lvbiBvZiBCRVhUUiAqLworLy8vIFxicmllZiBFeHRyYWN0cyB0aGUgc3BlY2lmaWVkIGJpdHMgZnJvbSB0aGUgZmlyc3Qgb3BlcmFuZCBhbmQgcmV0dXJucyB0aGVtCisvLy8gICAgaW4gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIHJlc3VsdC4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBCRVhUUiBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX1gKKy8vLyAgICBBbiB1bnNpZ25lZCBpbnRlZ2VyIHdob3NlIGJpdHMgYXJlIHRvIGJlIGV4dHJhY3RlZC4KKy8vLyBccGFyYW0gX19ZCisvLy8gICAgQW4gdW5zaWduZWQgaW50ZWdlciB1c2VkIHRvIHNwZWNpZnkgd2hpY2ggYml0cyBhcmUgZXh0cmFjdGVkLiBCaXRzIFs3OjBdCisvLy8gICAgc3BlY2lmeSB0aGUgaW5kZXggb2YgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdC4gQml0cyBbMTU6OF0gc3BlY2lmeSB0aGUKKy8vLyAgICBudW1iZXIgb2YgYml0cyB0byBiZSBleHRyYWN0ZWQuCisvLy8gXHJldHVybnMgQW4gdW5zaWduZWQgaW50ZWdlciB3aG9zZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzIGNvbnRhaW4gdGhlCisvLy8gICAgZXh0cmFjdGVkIGJpdHMuCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQgX19ERUZBVUxUX0ZOX0FUVFJTCitfX2JleHRyX3UzMih1bnNpZ25lZCBpbnQgX19YLCB1bnNpZ25lZCBpbnQgX19ZKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfYmV4dHJfdTMyKF9fWCwgX19ZKTsKK30KKworLyogSW50ZWwtc3BlY2lmaWVkLCBzaW5nbGUtbGVhZGluZy11bmRlcnNjb3JlIHZlcnNpb24gb2YgQkVYVFIgKi8KKy8vLyBcYnJpZWYgRXh0cmFjdHMgdGhlIHNwZWNpZmllZCBiaXRzIGZyb20gdGhlIGZpcnN0IG9wZXJhbmQgYW5kIHJldHVybnMgdGhlbQorLy8vICAgIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSByZXN1bHQuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgQkVYVFIgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19YCisvLy8gICAgQW4gdW5zaWduZWQgaW50ZWdlciB3aG9zZSBiaXRzIGFyZSB0byBiZSBleHRyYWN0ZWQuCisvLy8gXHBhcmFtIF9fWQorLy8vICAgIEFuIHVuc2lnbmVkIGludGVnZXIgdXNlZCB0byBzcGVjaWZ5IHRoZSBpbmRleCBvZiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQKKy8vLyAgICBiaXQgZm9yIHRoZSBiaXRzIHRvIGJlIGV4dHJhY3RlZC4gQml0cyBbNzowXSBzcGVjaWZ5IHRoZSBpbmRleC4KKy8vLyBccGFyYW0gX19aCisvLy8gICAgQW4gdW5zaWduZWQgaW50ZWdlciB1c2VkIHRvIHNwZWNpZnkgdGhlIG51bWJlciBvZiBiaXRzIHRvIGJlIGV4dHJhY3RlZC4KKy8vLyAgICBCaXRzIFs3OjBdIHNwZWNpZnkgdGhlIG51bWJlciBvZiBiaXRzLgorLy8vIFxyZXR1cm5zIEFuIHVuc2lnbmVkIGludGVnZXIgd2hvc2UgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBjb250YWluIHRoZQorLy8vICAgIGV4dHJhY3RlZCBiaXRzLgorc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50IF9fREVGQVVMVF9GTl9BVFRSUworX2JleHRyX3UzMih1bnNpZ25lZCBpbnQgX19YLCB1bnNpZ25lZCBpbnQgX19ZLCB1bnNpZ25lZCBpbnQgX19aKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfYmV4dHJfdTMyIChfX1gsICgoX19ZICYgMHhmZikgfCAoKF9fWiAmIDB4ZmYpIDw8IDgpKSk7Cit9CisKKy8vLyBcYnJpZWYgQ2xlYXJzIGFsbCBiaXRzIGluIHRoZSBzb3VyY2UgZXhjZXB0IGZvciB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0CisvLy8gICAgY29udGFpbmluZyBhIHZhbHVlIG9mIDEgYW5kIHJldHVybnMgdGhlIHJlc3VsdC4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBCTFNJIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fWAorLy8vICAgIEFuIHVuc2lnbmVkIGludGVnZXIgd2hvc2UgYml0cyBhcmUgdG8gYmUgY2xlYXJlZC4KKy8vLyBccmV0dXJucyBBbiB1bnNpZ25lZCBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHJlc3VsdCBvZiBjbGVhcmluZyB0aGUgYml0cyBmcm9tCisvLy8gICAgdGhlIHNvdXJjZSBvcGVyYW5kLgorc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50IF9fREVGQVVMVF9GTl9BVFRSUworX19ibHNpX3UzMih1bnNpZ25lZCBpbnQgX19YKQoreworICByZXR1cm4gX19YICYgLV9fWDsKK30KKworLy8vIFxicmllZiBDcmVhdGVzIGEgbWFzayB3aG9zZSBiaXRzIGFyZSBzZXQgdG8gMSwgdXNpbmcgYml0IDAgdXAgdG8gYW5kCisvLy8gICAgaW5jbHVkaW5nIHRoZSBsZWFzdCBzaWdpbmlmaWNhbnQgYml0IHRoYXQgaXMgc2V0IHRvIDEgaW4gdGhlIHNvdXJjZQorLy8vICAgIG9wZXJhbmQgYW5kIHJldHVybnMgdGhlIHJlc3VsdC4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBCTFNNU0sgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19YCisvLy8gICAgQW4gdW5zaWduZWQgaW50ZWdlciB1c2VkIHRvIGNyZWF0ZSB0aGUgbWFzay4KKy8vLyBccmV0dXJucyBBbiB1bnNpZ25lZCBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIG5ld2x5IGNyZWF0ZWQgbWFzay4KK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludCBfX0RFRkFVTFRfRk5fQVRUUlMKK19fYmxzbXNrX3UzMih1bnNpZ25lZCBpbnQgX19YKQoreworICByZXR1cm4gX19YIF4gKF9fWCAtIDEpOworfQorCisvLy8gXGJyaWVmIENsZWFycyB0aGUgbGVhc3Qgc2lnaW5pZmljYW50IGJpdCB0aGF0IGlzIHNldCB0byAxIGluIHRoZSBzb3VyY2UKKy8vLyAgICBvcGVyYW5kIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgQkxTUiBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX1gKKy8vLyAgICBBbiB1bnNpZ25lZCBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIG9wZXJhbmQgdG8gYmUgY2xlYXJlZC4KKy8vLyBccmV0dXJucyBBbiB1bnNpZ25lZCBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHJlc3VsdCBvZiBjbGVhcmluZyB0aGUgc291cmNlCisvLy8gICAgb3BlcmFuZC4KK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludCBfX0RFRkFVTFRfRk5fQVRUUlMKK19fYmxzcl91MzIodW5zaWduZWQgaW50IF9fWCkKK3sKKyAgcmV0dXJuIF9fWCAmIChfX1ggLSAxKTsKK30KKworLy8vIFxicmllZiBDb3VudHMgdGhlIG51bWJlciBvZiB0cmFpbGluZyB6ZXJvIGJpdHMgaW4gdGhlIG9wZXJhbmQuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVFpDTlQgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19YCisvLy8gICAgQW4gdW5zaWduZWQgMzItYml0IGludGVnZXIgd2hvc2UgdHJhaWxpbmcgemVyb3MgYXJlIHRvIGJlIGNvdW50ZWQuCisvLy8gXHJldHVybnMgQW4gdW5zaWduZWQgMzItYml0IGludGVnZXIgY29udGFpbmluZyB0aGUgbnVtYmVyIG9mIHRyYWlsaW5nIHplcm8KKy8vLyAgICBiaXRzIGluIHRoZSBvcGVyYW5kLgorc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50IF9fUkVMQVhFRF9GTl9BVFRSUworX190emNudF91MzIodW5zaWduZWQgaW50IF9fWCkKK3sKKyAgcmV0dXJuIF9fWCA/IF9fYnVpbHRpbl9jdHooX19YKSA6IDMyOworfQorCisvLy8gXGJyaWVmIENvdW50cyB0aGUgbnVtYmVyIG9mIHRyYWlsaW5nIHplcm8gYml0cyBpbiB0aGUgb3BlcmFuZC4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBUWkNOVCBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX1gKKy8vLyAgICBBbiB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlciB3aG9zZSB0cmFpbGluZyB6ZXJvcyBhcmUgdG8gYmUgY291bnRlZC4KKy8vLyBccmV0dXJucyBBbiAzMi1iaXQgaW50ZWdlciBjb250YWluaW5nIHRoZSBudW1iZXIgb2YgdHJhaWxpbmcgemVybworLy8vICAgIGJpdHMgaW4gdGhlIG9wZXJhbmQuCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19SRUxBWEVEX0ZOX0FUVFJTCitfbW1fdHpjbnRfMzIodW5zaWduZWQgaW50IF9fWCkKK3sKKyAgcmV0dXJuIF9fWCA/IF9fYnVpbHRpbl9jdHooX19YKSA6IDMyOworfQorCisjaWZkZWYgX194ODZfNjRfXworCisvLy8gXGJyaWVmIFBlcmZvcm1zIGEgYml0d2lzZSBBTkQgb2YgdGhlIHNlY29uZCBvcGVyYW5kIHdpdGggdGhlIG9uZSdzCisvLy8gICAgY29tcGxlbWVudCBvZiB0aGUgZmlyc3Qgb3BlcmFuZC4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFxjb2RlCisvLy8gdW5zaWduZWQgbG9uZyBsb25nIF9hbmRuX3U2NCAodW5zaWduZWQgbG9uZyBsb25nIGEsIHVuc2lnbmVkIGxvbmcgbG9uZyBiKTsKKy8vLyBcZW5kY29kZQorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIEFORE4gaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gYQorLy8vICAgIEFuIHVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBvcGVyYW5kcy4KKy8vLyBccGFyYW0gYgorLy8vICAgIEFuIHVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBvcGVyYW5kcy4KKy8vLyBccmV0dXJucyBBbiB1bnNpZ25lZCA2NC1iaXQgaW50ZWdlciBjb250YWluaW5nIHRoZSBiaXR3aXNlIEFORCBvZiB0aGUgc2Vjb25kCisvLy8gICAgb3BlcmFuZCB3aXRoIHRoZSBvbmUncyBjb21wbGVtZW50IG9mIHRoZSBmaXJzdCBvcGVyYW5kLgorI2RlZmluZSBfYW5kbl91NjQoYSwgYikgICAoX19hbmRuX3U2NCgoYSksIChiKSkpCisKKy8qIF9iZXh0cl91NjQgIT0gX19iZXh0cl91NjQgKi8KKy8vLyBcYnJpZWYgQ2xlYXJzIGFsbCBiaXRzIGluIHRoZSBzb3VyY2UgZXhjZXB0IGZvciB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0CisvLy8gICAgY29udGFpbmluZyBhIHZhbHVlIG9mIDEgYW5kIHJldHVybnMgdGhlIHJlc3VsdC4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFxjb2RlCisvLy8gdW5zaWduZWQgbG9uZyBsb25nIF9ibHNpX3U2NCh1bnNpZ25lZCBsb25nIGxvbmcgYSk7CisvLy8gXGVuZGNvZGUKKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBCTFNJIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIGEKKy8vLyAgICBBbiB1bnNpZ25lZCA2NC1iaXQgaW50ZWdlciB3aG9zZSBiaXRzIGFyZSB0byBiZSBjbGVhcmVkLgorLy8vIFxyZXR1cm5zIEFuIHVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHJlc3VsdCBvZiBjbGVhcmluZyB0aGUKKy8vLyAgICBiaXRzIGZyb20gdGhlIHNvdXJjZSBvcGVyYW5kLgorI2RlZmluZSBfYmxzaV91NjQoYSkgICAgICAoX19ibHNpX3U2NCgoYSkpKQorCisvLy8gXGJyaWVmIENyZWF0ZXMgYSBtYXNrIHdob3NlIGJpdHMgYXJlIHNldCB0byAxLCB1c2luZyBiaXQgMCB1cCB0byBhbmQKKy8vLyAgICBpbmNsdWRpbmcgdGhlIGxlYXN0IHNpZ2luaWZpY2FudCBiaXQgdGhhdCBpcyBzZXQgdG8gMSBpbiB0aGUgc291cmNlCisvLy8gICAgb3BlcmFuZCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gXGNvZGUKKy8vLyB1bnNpZ25lZCBsb25nIGxvbmcgX2Jsc21za191NjQodW5zaWduZWQgbG9uZyBsb25nIGEpOworLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgQkxTTVNLIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIGEKKy8vLyAgICBBbiB1bnNpZ25lZCA2NC1iaXQgaW50ZWdlciB1c2VkIHRvIGNyZWF0ZSB0aGUgbWFzay4KKy8vLyBccmV0dXJucyBBIHVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIG5ld2x5IGNyZWF0ZWQgbWFzay4KKyNkZWZpbmUgX2Jsc21za191NjQoYSkgICAgKF9fYmxzbXNrX3U2NCgoYSkpKQorCisvLy8gXGJyaWVmIENsZWFycyB0aGUgbGVhc3Qgc2lnaW5pZmljYW50IGJpdCB0aGF0IGlzIHNldCB0byAxIGluIHRoZSBzb3VyY2UKKy8vLyAgICBvcGVyYW5kIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBcY29kZQorLy8vIHVuc2lnbmVkIGxvbmcgbG9uZyBfYmxzcl91NjQodW5zaWduZWQgbG9uZyBsb25nIGEpOworLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgQkxTUiBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBhCisvLy8gICAgQW4gdW5zaWduZWQgNjQtYml0IGludGVnZXIgY29udGFpbmluZyB0aGUgb3BlcmFuZCB0byBiZSBjbGVhcmVkLgorLy8vIFxyZXR1cm5zIEFuIHVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHJlc3VsdCBvZiBjbGVhcmluZyB0aGUKKy8vLyAgICBzb3VyY2Ugb3BlcmFuZC4KKyNkZWZpbmUgX2Jsc3JfdTY0KGEpICAgICAgKF9fYmxzcl91NjQoKGEpKSkKKworLy8vIFxicmllZiBDb3VudHMgdGhlIG51bWJlciBvZiB0cmFpbGluZyB6ZXJvIGJpdHMgaW4gdGhlIG9wZXJhbmQuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBcY29kZQorLy8vIHVuc2lnbmVkIGxvbmcgbG9uZyBfdHpjbnRfdTY0KHVuc2lnbmVkIGxvbmcgbG9uZyBhKTsKKy8vLyBcZW5kY29kZQorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFRaQ05UIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIGEKKy8vLyAgICBBbiB1bnNpZ25lZCA2NC1iaXQgaW50ZWdlciB3aG9zZSB0cmFpbGluZyB6ZXJvcyBhcmUgdG8gYmUgY291bnRlZC4KKy8vLyBccmV0dXJucyBBbiB1bnNpZ25lZCA2NC1iaXQgaW50ZWdlciBjb250YWluaW5nIHRoZSBudW1iZXIgb2YgdHJhaWxpbmcgemVybworLy8vICAgIGJpdHMgaW4gdGhlIG9wZXJhbmQuCisjZGVmaW5lIF90emNudF91NjQoYSkgICAgIChfX3R6Y250X3U2NCgoYSkpKQorCisvLy8gXGJyaWVmIFBlcmZvcm1zIGEgYml0d2lzZSBBTkQgb2YgdGhlIHNlY29uZCBvcGVyYW5kIHdpdGggdGhlIG9uZSdzCisvLy8gICAgY29tcGxlbWVudCBvZiB0aGUgZmlyc3Qgb3BlcmFuZC4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBBTkROIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fWAorLy8vICAgIEFuIHVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBvcGVyYW5kcy4KKy8vLyBccGFyYW0gX19ZCisvLy8gICAgQW4gdW5zaWduZWQgNjQtYml0IGludGVnZXIgY29udGFpbmluZyBvbmUgb2YgdGhlIG9wZXJhbmRzLgorLy8vIFxyZXR1cm5zIEFuIHVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIGJpdHdpc2UgQU5EIG9mIHRoZSBzZWNvbmQKKy8vLyAgICBvcGVyYW5kIHdpdGggdGhlIG9uZSdzIGNvbXBsZW1lbnQgb2YgdGhlIGZpcnN0IG9wZXJhbmQuCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nIGxvbmcgX19ERUZBVUxUX0ZOX0FUVFJTCitfX2FuZG5fdTY0ICh1bnNpZ25lZCBsb25nIGxvbmcgX19YLCB1bnNpZ25lZCBsb25nIGxvbmcgX19ZKQoreworICByZXR1cm4gfl9fWCAmIF9fWTsKK30KKworLyogQU1ELXNwZWNpZmllZCwgZG91YmxlLWxlYWRpbmctdW5kZXJzY29yZSB2ZXJzaW9uIG9mIEJFWFRSICovCisvLy8gXGJyaWVmIEV4dHJhY3RzIHRoZSBzcGVjaWZpZWQgYml0cyBmcm9tIHRoZSBmaXJzdCBvcGVyYW5kIGFuZCByZXR1cm5zIHRoZW0KKy8vLyAgICBpbiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiB0aGUgcmVzdWx0LgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIEJFWFRSIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fWAorLy8vICAgIEFuIHVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyIHdob3NlIGJpdHMgYXJlIHRvIGJlIGV4dHJhY3RlZC4KKy8vLyBccGFyYW0gX19ZCisvLy8gICAgQW4gdW5zaWduZWQgNjQtYml0IGludGVnZXIgdXNlZCB0byBzcGVjaWZ5IHdoaWNoIGJpdHMgYXJlIGV4dHJhY3RlZC4gQml0cworLy8vICAgIFs3OjBdIHNwZWNpZnkgdGhlIGluZGV4IG9mIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQuIEJpdHMgWzE1OjhdIHNwZWNpZnkKKy8vLyAgICB0aGUgbnVtYmVyIG9mIGJpdHMgdG8gYmUgZXh0cmFjdGVkLgorLy8vIFxyZXR1cm5zIEFuIHVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyIHdob3NlIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgY29udGFpbiB0aGUKKy8vLyAgICBleHRyYWN0ZWQgYml0cy4KK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcgbG9uZyBfX0RFRkFVTFRfRk5fQVRUUlMKK19fYmV4dHJfdTY0KHVuc2lnbmVkIGxvbmcgbG9uZyBfX1gsIHVuc2lnbmVkIGxvbmcgbG9uZyBfX1kpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9iZXh0cl91NjQoX19YLCBfX1kpOworfQorCisvKiBJbnRlbC1zcGVjaWZpZWQsIHNpbmdsZS1sZWFkaW5nLXVuZGVyc2NvcmUgdmVyc2lvbiBvZiBCRVhUUiAqLworLy8vIFxicmllZiBFeHRyYWN0cyB0aGUgc3BlY2lmaWVkIGJpdHMgZnJvbSB0aGUgZmlyc3Qgb3BlcmFuZCBhbmQgcmV0dXJucyB0aGVtCisvLy8gICAgIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSByZXN1bHQuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgQkVYVFIgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19YCisvLy8gICAgQW4gdW5zaWduZWQgNjQtYml0IGludGVnZXIgd2hvc2UgYml0cyBhcmUgdG8gYmUgZXh0cmFjdGVkLgorLy8vIFxwYXJhbSBfX1kKKy8vLyAgICBBbiB1bnNpZ25lZCBpbnRlZ2VyIHVzZWQgdG8gc3BlY2lmeSB0aGUgaW5kZXggb2YgdGhlIGxlYXN0IHNpZ25pZmljYW50CisvLy8gICAgYml0IGZvciB0aGUgYml0cyB0byBiZSBleHRyYWN0ZWQuIEJpdHMgWzc6MF0gc3BlY2lmeSB0aGUgaW5kZXguCisvLy8gXHBhcmFtIF9fWgorLy8vICAgIEFuIHVuc2lnbmVkIGludGVnZXIgdXNlZCB0byBzcGVjaWZ5IHRoZSBudW1iZXIgb2YgYml0cyB0byBiZSBleHRyYWN0ZWQuCisvLy8gICAgQml0cyBbNzowXSBzcGVjaWZ5IHRoZSBudW1iZXIgb2YgYml0cy4KKy8vLyBccmV0dXJucyBBbiB1bnNpZ25lZCA2NC1iaXQgaW50ZWdlciB3aG9zZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzIGNvbnRhaW4gdGhlCisvLy8gICAgZXh0cmFjdGVkIGJpdHMuCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nIGxvbmcgX19ERUZBVUxUX0ZOX0FUVFJTCitfYmV4dHJfdTY0KHVuc2lnbmVkIGxvbmcgbG9uZyBfX1gsIHVuc2lnbmVkIGludCBfX1ksIHVuc2lnbmVkIGludCBfX1opCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9iZXh0cl91NjQgKF9fWCwgKChfX1kgJiAweGZmKSB8ICgoX19aICYgMHhmZikgPDwgOCkpKTsKK30KKworLy8vIFxicmllZiBDbGVhcnMgYWxsIGJpdHMgaW4gdGhlIHNvdXJjZSBleGNlcHQgZm9yIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQKKy8vLyAgICBjb250YWluaW5nIGEgdmFsdWUgb2YgMSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIEJMU0kgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19YCisvLy8gICAgQW4gdW5zaWduZWQgNjQtYml0IGludGVnZXIgd2hvc2UgYml0cyBhcmUgdG8gYmUgY2xlYXJlZC4KKy8vLyBccmV0dXJucyBBbiB1bnNpZ25lZCA2NC1iaXQgaW50ZWdlciBjb250YWluaW5nIHRoZSByZXN1bHQgb2YgY2xlYXJpbmcgdGhlCisvLy8gICAgYml0cyBmcm9tIHRoZSBzb3VyY2Ugb3BlcmFuZC4KK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcgbG9uZyBfX0RFRkFVTFRfRk5fQVRUUlMKK19fYmxzaV91NjQodW5zaWduZWQgbG9uZyBsb25nIF9fWCkKK3sKKyAgcmV0dXJuIF9fWCAmIC1fX1g7Cit9CisKKy8vLyBcYnJpZWYgQ3JlYXRlcyBhIG1hc2sgd2hvc2UgYml0cyBhcmUgc2V0IHRvIDEsIHVzaW5nIGJpdCAwIHVwIHRvIGFuZAorLy8vICAgIGluY2x1ZGluZyB0aGUgbGVhc3Qgc2lnaW5pZmljYW50IGJpdCB0aGF0IGlzIHNldCB0byAxIGluIHRoZSBzb3VyY2UKKy8vLyAgICBvcGVyYW5kIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgQkxTTVNLIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fWAorLy8vICAgIEFuIHVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyIHVzZWQgdG8gY3JlYXRlIHRoZSBtYXNrLgorLy8vIFxyZXR1cm5zIEEgdW5zaWduZWQgNjQtYml0IGludGVnZXIgY29udGFpbmluZyB0aGUgbmV3bHkgY3JlYXRlZCBtYXNrLgorc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZyBsb25nIF9fREVGQVVMVF9GTl9BVFRSUworX19ibHNtc2tfdTY0KHVuc2lnbmVkIGxvbmcgbG9uZyBfX1gpCit7CisgIHJldHVybiBfX1ggXiAoX19YIC0gMSk7Cit9CisKKy8vLyBcYnJpZWYgQ2xlYXJzIHRoZSBsZWFzdCBzaWdpbmlmaWNhbnQgYml0IHRoYXQgaXMgc2V0IHRvIDEgaW4gdGhlIHNvdXJjZQorLy8vICAgIG9wZXJhbmQgYW5kIHJldHVybnMgdGhlIHJlc3VsdC4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBCTFNSIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fWAorLy8vICAgIEFuIHVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIG9wZXJhbmQgdG8gYmUgY2xlYXJlZC4KKy8vLyBccmV0dXJucyBBbiB1bnNpZ25lZCA2NC1iaXQgaW50ZWdlciBjb250YWluaW5nIHRoZSByZXN1bHQgb2YgY2xlYXJpbmcgdGhlCisvLy8gICAgc291cmNlIG9wZXJhbmQuCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nIGxvbmcgX19ERUZBVUxUX0ZOX0FUVFJTCitfX2Jsc3JfdTY0KHVuc2lnbmVkIGxvbmcgbG9uZyBfX1gpCit7CisgIHJldHVybiBfX1ggJiAoX19YIC0gMSk7Cit9CisKKy8vLyBcYnJpZWYgQ291bnRzIHRoZSBudW1iZXIgb2YgdHJhaWxpbmcgemVybyBiaXRzIGluIHRoZSBvcGVyYW5kLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFRaQ05UIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fWAorLy8vICAgIEFuIHVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyIHdob3NlIHRyYWlsaW5nIHplcm9zIGFyZSB0byBiZSBjb3VudGVkLgorLy8vIFxyZXR1cm5zIEFuIHVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIG51bWJlciBvZiB0cmFpbGluZyB6ZXJvCisvLy8gICAgYml0cyBpbiB0aGUgb3BlcmFuZC4KK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcgbG9uZyBfX1JFTEFYRURfRk5fQVRUUlMKK19fdHpjbnRfdTY0KHVuc2lnbmVkIGxvbmcgbG9uZyBfX1gpCit7CisgIHJldHVybiBfX1ggPyBfX2J1aWx0aW5fY3R6bGwoX19YKSA6IDY0OworfQorCisvLy8gXGJyaWVmIENvdW50cyB0aGUgbnVtYmVyIG9mIHRyYWlsaW5nIHplcm8gYml0cyBpbiB0aGUgb3BlcmFuZC4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBUWkNOVCBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX1gKKy8vLyAgICBBbiB1bnNpZ25lZCA2NC1iaXQgaW50ZWdlciB3aG9zZSB0cmFpbGluZyB6ZXJvcyBhcmUgdG8gYmUgY291bnRlZC4KKy8vLyBccmV0dXJucyBBbiA2NC1iaXQgaW50ZWdlciBjb250YWluaW5nIHRoZSBudW1iZXIgb2YgdHJhaWxpbmcgemVybworLy8vICAgIGJpdHMgaW4gdGhlIG9wZXJhbmQuCitzdGF0aWMgX19pbmxpbmVfXyBsb25nIGxvbmcgX19SRUxBWEVEX0ZOX0FUVFJTCitfbW1fdHpjbnRfNjQodW5zaWduZWQgbG9uZyBsb25nIF9fWCkKK3sKKyAgcmV0dXJuIF9fWCA/IF9fYnVpbHRpbl9jdHpsbChfX1gpIDogNjQ7Cit9CisKKyNlbmRpZiAvKiBfX3g4Nl82NF9fICovCisKKyN1bmRlZiBfX0RFRkFVTFRfRk5fQVRUUlMKKyN1bmRlZiBfX1JFTEFYRURfRk5fQVRUUlMKKworI2VuZGlmIC8qIF9fQk1JSU5UUklOX0ggKi8KZGlmZiAtLWdpdCBhL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL2NsZmx1c2hvcHRpbnRyaW4uaCBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL2NsZmx1c2hvcHRpbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGUwZWFkCi0tLSAvZGV2L251bGwKKysrIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvY2xmbHVzaG9wdGludHJpbi5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qPT09LS0tLSBjbGZsdXNob3B0aW50cmluLmggLSBDTEZMVVNIT1BUIGludHJpbnNpYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKgorICo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICovCisKKyNpZm5kZWYgX19JTU1JTlRSSU5fSAorI2Vycm9yICJOZXZlciB1c2UgPGNsZmx1c2hvcHRpbnRyaW4uaD4gZGlyZWN0bHk7IGluY2x1ZGUgPGltbWludHJpbi5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9fQ0xGTFVTSE9QVElOVFJJTl9ICisjZGVmaW5lIF9fQ0xGTFVTSE9QVElOVFJJTl9ICisKKy8qIERlZmluZSB0aGUgZGVmYXVsdCBhdHRyaWJ1dGVzIGZvciB0aGUgZnVuY3Rpb25zIGluIHRoaXMgZmlsZS4gKi8KKyNkZWZpbmUgX19ERUZBVUxUX0ZOX0FUVFJTIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXywgIF9fdGFyZ2V0X18oImNsZmx1c2hvcHQiKSkpCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY2xmbHVzaG9wdChjaGFyICogX19tKSB7CisgIF9fYnVpbHRpbl9pYTMyX2NsZmx1c2hvcHQoX19tKTsKK30KKworI3VuZGVmIF9fREVGQVVMVF9GTl9BVFRSUworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL2NwdWlkLmggYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9jcHVpZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkYTAyZTAKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9jcHVpZC5oCkBAIC0wLDAgKzEsMjA5IEBACisvKj09PS0tLS0gY3B1aWQuaCAtIFg4NiBjcHUgbW9kZWwgZGV0ZWN0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICoKKyAqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqLworCisjaWYgIShfX3g4Nl82NF9fIHx8IF9faTM4Nl9fKQorI2Vycm9yIHRoaXMgaGVhZGVyIGlzIGZvciB4ODYgb25seQorI2VuZGlmCisKKy8qIFJlc3BvbnNlcyBpZGVudGlmaWNhdGlvbiByZXF1ZXN0IHdpdGggJWVheCAwICovCisvKiBBTUQ6ICAgICAiQXV0aGVudGljQU1EIiAqLworI2RlZmluZSBzaWduYXR1cmVfQU1EX2VieCAweDY4NzQ3NTQxCisjZGVmaW5lIHNpZ25hdHVyZV9BTURfZWR4IDB4Njk3NDZlNjUKKyNkZWZpbmUgc2lnbmF0dXJlX0FNRF9lY3ggMHg0NDRkNDE2MworLyogQ0VOVEFVUjogIkNlbnRhdXJIYXVscyIgKi8KKyNkZWZpbmUgc2lnbmF0dXJlX0NFTlRBVVJfZWJ4IDB4NzQ2ZTY1NDMKKyNkZWZpbmUgc2lnbmF0dXJlX0NFTlRBVVJfZWR4IDB4NDg3Mjc1NjEKKyNkZWZpbmUgc2lnbmF0dXJlX0NFTlRBVVJfZWN4IDB4NzM2Yzc1NjEKKy8qIENZUklYOiAgICJDeXJpeEluc3RlYWQiICovCisjZGVmaW5lIHNpZ25hdHVyZV9DWVJJWF9lYnggMHg2OTcyNzk0MworI2RlZmluZSBzaWduYXR1cmVfQ1lSSVhfZWR4IDB4NzM2ZTQ5NzgKKyNkZWZpbmUgc2lnbmF0dXJlX0NZUklYX2VjeCAweDY0NjE2NTc0CisvKiBJTlRFTDogICAiR2VudWluZUludGVsIiAqLworI2RlZmluZSBzaWduYXR1cmVfSU5URUxfZWJ4IDB4NzU2ZTY1NDcKKyNkZWZpbmUgc2lnbmF0dXJlX0lOVEVMX2VkeCAweDQ5NjU2ZTY5CisjZGVmaW5lIHNpZ25hdHVyZV9JTlRFTF9lY3ggMHg2YzY1NzQ2ZQorLyogVE0xOiAgICAgIlRyYW5zbWV0YUNQVSIgKi8KKyNkZWZpbmUgc2lnbmF0dXJlX1RNMV9lYnggMHg2ZTYxNzI1NAorI2RlZmluZSBzaWduYXR1cmVfVE0xX2VkeCAweDc0NjU2ZDczCisjZGVmaW5lIHNpZ25hdHVyZV9UTTFfZWN4IDB4NTU1MDQzNjEKKy8qIFRNMjogICAgICJHZW51aW5lVE14ODYiICovCisjZGVmaW5lIHNpZ25hdHVyZV9UTTJfZWJ4IDB4NzU2ZTY1NDcKKyNkZWZpbmUgc2lnbmF0dXJlX1RNMl9lZHggMHg1NDY1NmU2OQorI2RlZmluZSBzaWduYXR1cmVfVE0yX2VjeCAweDM2Mzg3ODRkCisvKiBOU0M6ICAgICAiR2VvZGUgYnkgTlNDIiAqLworI2RlZmluZSBzaWduYXR1cmVfTlNDX2VieCAweDY0NmY2NTQ3CisjZGVmaW5lIHNpZ25hdHVyZV9OU0NfZWR4IDB4NDM1MzRlMjAKKyNkZWZpbmUgc2lnbmF0dXJlX05TQ19lY3ggMHg3OTYyMjA2NQorLyogTkVYR0VOOiAgIk5leEdlbkRyaXZlbiIgKi8KKyNkZWZpbmUgc2lnbmF0dXJlX05FWEdFTl9lYnggMHg0Nzc4NjU0ZQorI2RlZmluZSBzaWduYXR1cmVfTkVYR0VOX2VkeCAweDcyNDQ2ZTY1CisjZGVmaW5lIHNpZ25hdHVyZV9ORVhHRU5fZWN4IDB4NmU2NTc2NjkKKy8qIFJJU0U6ICAgICJSaXNlUmlzZVJpc2UiICovCisjZGVmaW5lIHNpZ25hdHVyZV9SSVNFX2VieCAweDY1NzM2OTUyCisjZGVmaW5lIHNpZ25hdHVyZV9SSVNFX2VkeCAweDY1NzM2OTUyCisjZGVmaW5lIHNpZ25hdHVyZV9SSVNFX2VjeCAweDY1NzM2OTUyCisvKiBTSVM6ICAgICAiU2lTIFNpUyBTaVMgIiAqLworI2RlZmluZSBzaWduYXR1cmVfU0lTX2VieCAweDIwNTM2OTUzCisjZGVmaW5lIHNpZ25hdHVyZV9TSVNfZWR4IDB4MjA1MzY5NTMKKyNkZWZpbmUgc2lnbmF0dXJlX1NJU19lY3ggMHgyMDUzNjk1MworLyogVU1DOiAgICAgIlVNQyBVTUMgVU1DICIgKi8KKyNkZWZpbmUgc2lnbmF0dXJlX1VNQ19lYnggMHgyMDQzNGQ1NQorI2RlZmluZSBzaWduYXR1cmVfVU1DX2VkeCAweDIwNDM0ZDU1CisjZGVmaW5lIHNpZ25hdHVyZV9VTUNfZWN4IDB4MjA0MzRkNTUKKy8qIFZJQTogICAgICJWSUEgVklBIFZJQSAiICovCisjZGVmaW5lIHNpZ25hdHVyZV9WSUFfZWJ4IDB4MjA0MTQ5NTYKKyNkZWZpbmUgc2lnbmF0dXJlX1ZJQV9lZHggMHgyMDQxNDk1NgorI2RlZmluZSBzaWduYXR1cmVfVklBX2VjeCAweDIwNDE0OTU2CisvKiBWT1JURVg6ICAiVm9ydGV4ODYgU29DIiAqLworI2RlZmluZSBzaWduYXR1cmVfVk9SVEVYX2VieCAweDc0NzI2ZjU2CisjZGVmaW5lIHNpZ25hdHVyZV9WT1JURVhfZWR4IDB4MzYzODc4NjUKKyNkZWZpbmUgc2lnbmF0dXJlX1ZPUlRFWF9lY3ggMHg0MzZmNTMyMAorCisvKiBGZWF0dXJlcyBpbiAlZWN4IGZvciBsZXZlbCAxICovCisjZGVmaW5lIGJpdF9TU0UzICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIGJpdF9QQ0xNVUxRRFEgICAweDAwMDAwMDAyCisjZGVmaW5lIGJpdF9EVEVTNjQgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIGJpdF9NT05JVE9SICAgICAweDAwMDAwMDA4CisjZGVmaW5lIGJpdF9EU0NQTCAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIGJpdF9WTVggICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIGJpdF9TTVggICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIGJpdF9FSVNUICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIGJpdF9UTTIgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIGJpdF9TU1NFMyAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIGJpdF9DTlhUSUQgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIGJpdF9GTUEgICAgICAgICAweDAwMDAxMDAwCisjZGVmaW5lIGJpdF9DTVBYQ0hHMTZCICAweDAwMDAyMDAwCisjZGVmaW5lIGJpdF94VFBSICAgICAgICAweDAwMDA0MDAwCisjZGVmaW5lIGJpdF9QRENNICAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lIGJpdF9QQ0lEICAgICAgICAweDAwMDIwMDAwCisjZGVmaW5lIGJpdF9EQ0EgICAgICAgICAweDAwMDQwMDAwCisjZGVmaW5lIGJpdF9TU0U0MSAgICAgICAweDAwMDgwMDAwCisjZGVmaW5lIGJpdF9TU0U0MiAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIGJpdF94MkFQSUMgICAgICAweDAwMjAwMDAwCisjZGVmaW5lIGJpdF9NT1ZCRSAgICAgICAweDAwNDAwMDAwCisjZGVmaW5lIGJpdF9QT1BDTlQgICAgICAweDAwODAwMDAwCisjZGVmaW5lIGJpdF9UU0NEZWFkbGluZSAweDAxMDAwMDAwCisjZGVmaW5lIGJpdF9BRVNOSSAgICAgICAweDAyMDAwMDAwCisjZGVmaW5lIGJpdF9YU0FWRSAgICAgICAweDA0MDAwMDAwCisjZGVmaW5lIGJpdF9PU1hTQVZFICAgICAweDA4MDAwMDAwCisjZGVmaW5lIGJpdF9BVlggICAgICAgICAweDEwMDAwMDAwCisjZGVmaW5lIGJpdF9SRFJORCAgICAgICAweDQwMDAwMDAwCisKKy8qIEZlYXR1cmVzIGluICVlZHggZm9yIGxldmVsIDEgKi8KKyNkZWZpbmUgYml0X0ZQVSAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgYml0X1ZNRSAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgYml0X0RFICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgYml0X1BTRSAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgYml0X1RTQyAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgYml0X01TUiAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgYml0X1BBRSAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgYml0X01DRSAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgYml0X0NYOCAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgYml0X0FQSUMgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgYml0X1NFUCAgICAgICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgYml0X01UUlIgICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgYml0X1BHRSAgICAgICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgYml0X01DQSAgICAgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgYml0X0NNT1YgICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgYml0X1BBVCAgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgYml0X1BTRTM2ICAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgYml0X1BTTiAgICAgICAgIDB4MDAwNDAwMDAKKyNkZWZpbmUgYml0X0NMRlNIICAgICAgIDB4MDAwODAwMDAKKyNkZWZpbmUgYml0X0RTICAgICAgICAgIDB4MDAyMDAwMDAKKyNkZWZpbmUgYml0X0FDUEkgICAgICAgIDB4MDA0MDAwMDAKKyNkZWZpbmUgYml0X01NWCAgICAgICAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgYml0X0ZYU1IgICAgICAgIDB4MDEwMDAwMDAKKyNkZWZpbmUgYml0X0ZYU0FWRSAgICAgIGJpdF9GWFNSICAgIC8qIGZvciBnY2MgY29tcGF0ICovCisjZGVmaW5lIGJpdF9TU0UgICAgICAgICAweDAyMDAwMDAwCisjZGVmaW5lIGJpdF9TU0UyICAgICAgICAweDA0MDAwMDAwCisjZGVmaW5lIGJpdF9TUyAgICAgICAgICAweDA4MDAwMDAwCisjZGVmaW5lIGJpdF9IVFQgICAgICAgICAweDEwMDAwMDAwCisjZGVmaW5lIGJpdF9UTSAgICAgICAgICAweDIwMDAwMDAwCisjZGVmaW5lIGJpdF9QQkUgICAgICAgICAweDgwMDAwMDAwCisKKy8qIEZlYXR1cmVzIGluICVlYnggZm9yIGxldmVsIDcgc3ViLWxlYWYgMCAqLworI2RlZmluZSBiaXRfRlNHU0JBU0UgICAgMHgwMDAwMDAwMQorI2RlZmluZSBiaXRfU01FUCAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBiaXRfRU5IX01PVlNCICAgMHgwMDAwMDIwMAorCisjaWYgX19pMzg2X18KKyNkZWZpbmUgX19jcHVpZChfX2xldmVsLCBfX2VheCwgX19lYngsIF9fZWN4LCBfX2VkeCkgXAorICAgIF9fYXNtKCJjcHVpZCIgOiAiPWEiKF9fZWF4KSwgIj1iIiAoX19lYngpLCAiPWMiKF9fZWN4KSwgIj1kIihfX2VkeCkgXAorICAgICAgICAgICAgICAgICAgOiAiMCIoX19sZXZlbCkpCisKKyNkZWZpbmUgX19jcHVpZF9jb3VudChfX2xldmVsLCBfX2NvdW50LCBfX2VheCwgX19lYngsIF9fZWN4LCBfX2VkeCkgXAorICAgIF9fYXNtKCJjcHVpZCIgOiAiPWEiKF9fZWF4KSwgIj1iIiAoX19lYngpLCAiPWMiKF9fZWN4KSwgIj1kIihfX2VkeCkgXAorICAgICAgICAgICAgICAgICAgOiAiMCIoX19sZXZlbCksICIyIihfX2NvdW50KSkKKyNlbHNlCisvKiB4ODYtNjQgdXNlcyAlcmJ4IGFzIHRoZSBiYXNlIHJlZ2lzdGVyLCBzbyBwcmVzZXJ2ZSBpdC4gKi8KKyNkZWZpbmUgX19jcHVpZChfX2xldmVsLCBfX2VheCwgX19lYngsIF9fZWN4LCBfX2VkeCkgXAorICAgIF9fYXNtKCIgIHhjaGdxICAlJXJieCwlcTFcbiIgXAorICAgICAgICAgICIgIGNwdWlkXG4iIFwKKyAgICAgICAgICAiICB4Y2hncSAgJSVyYngsJXExIiBcCisgICAgICAgIDogIj1hIihfX2VheCksICI9ciIgKF9fZWJ4KSwgIj1jIihfX2VjeCksICI9ZCIoX19lZHgpIFwKKyAgICAgICAgOiAiMCIoX19sZXZlbCkpCisKKyNkZWZpbmUgX19jcHVpZF9jb3VudChfX2xldmVsLCBfX2NvdW50LCBfX2VheCwgX19lYngsIF9fZWN4LCBfX2VkeCkgXAorICAgIF9fYXNtKCIgIHhjaGdxICAlJXJieCwlcTFcbiIgXAorICAgICAgICAgICIgIGNwdWlkXG4iIFwKKyAgICAgICAgICAiICB4Y2hncSAgJSVyYngsJXExIiBcCisgICAgICAgIDogIj1hIihfX2VheCksICI9ciIgKF9fZWJ4KSwgIj1jIihfX2VjeCksICI9ZCIoX19lZHgpIFwKKyAgICAgICAgOiAiMCIoX19sZXZlbCksICIyIihfX2NvdW50KSkKKyNlbmRpZgorCitzdGF0aWMgX19pbmxpbmUgaW50IF9fZ2V0X2NwdWlkICh1bnNpZ25lZCBpbnQgX19sZXZlbCwgdW5zaWduZWQgaW50ICpfX2VheCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqX19lYngsIHVuc2lnbmVkIGludCAqX19lY3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKl9fZWR4KSB7CisgICAgX19jcHVpZChfX2xldmVsLCAqX19lYXgsICpfX2VieCwgKl9fZWN4LCAqX19lZHgpOworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50IF9fZ2V0X2NwdWlkX21heCAodW5zaWduZWQgaW50IF9fbGV2ZWwsIHVuc2lnbmVkIGludCAqX19zaWcpCit7CisgICAgdW5zaWduZWQgaW50IF9fZWF4LCBfX2VieCwgX19lY3gsIF9fZWR4OworI2lmIF9faTM4Nl9fCisgICAgaW50IF9fY3B1aWRfc3VwcG9ydGVkOworCisgICAgX19hc20oIiAgcHVzaGZsXG4iCisgICAgICAgICAgIiAgcG9wbCAgICUlZWF4XG4iCisgICAgICAgICAgIiAgbW92bCAgICUlZWF4LCUlZWN4XG4iCisgICAgICAgICAgIiAgeG9ybCAgICQweDAwMjAwMDAwLCUlZWF4XG4iCisgICAgICAgICAgIiAgcHVzaGwgICUlZWF4XG4iCisgICAgICAgICAgIiAgcG9wZmxcbiIKKyAgICAgICAgICAiICBwdXNoZmxcbiIKKyAgICAgICAgICAiICBwb3BsICAgJSVlYXhcbiIKKyAgICAgICAgICAiICBtb3ZsICAgJDAsJTBcbiIKKyAgICAgICAgICAiICBjbXBsICAgJSVlYXgsJSVlY3hcbiIKKyAgICAgICAgICAiICBqZSAgICAgMWZcbiIKKyAgICAgICAgICAiICBtb3ZsICAgJDEsJTBcbiIKKyAgICAgICAgICAiMToiCisgICAgICAgIDogIj1yIiAoX19jcHVpZF9zdXBwb3J0ZWQpIDogOiAiZWF4IiwgImVjeCIpOworICAgIGlmICghX19jcHVpZF9zdXBwb3J0ZWQpCisgICAgICAgIHJldHVybiAwOworI2VuZGlmCisKKyAgICBfX2NwdWlkKF9fbGV2ZWwsIF9fZWF4LCBfX2VieCwgX19lY3gsIF9fZWR4KTsKKyAgICBpZiAoX19zaWcpCisgICAgICAgICpfX3NpZyA9IF9fZWJ4OworICAgIHJldHVybiBfX2VheDsKK30KZGlmZiAtLWdpdCBhL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL2N1ZGFfYnVpbHRpbl92YXJzLmggYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9jdWRhX2J1aWx0aW5fdmFycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNWViOWMKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9jdWRhX2J1aWx0aW5fdmFycy5oCkBAIC0wLDAgKzEsMTI2IEBACisvKj09PS0tLS0gY3VkYV9idWlsdGluX3ZhcnMuaCAtIENVREEgYnVpbHQtaW4gdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqCisgKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisgKi8KKworI2lmbmRlZiBfX0NVREFfQlVJTFRJTl9WQVJTX0gKKyNkZWZpbmUgX19DVURBX0JVSUxUSU5fVkFSU19ICisKKy8vIEZvcndhcmQgZGVjbGFyZXMgZnJvbSB2ZWN0b3JfdHlwZXMuaC4KK3N0cnVjdCB1aW50MzsKK3N0cnVjdCBkaW0zOworCisvLyBUaGUgZmlsZSBpbXBsZW1lbnRzIGJ1aWx0LWluIENVREEgdmFyaWFibGVzIHVzaW5nIF9fZGVjbHNwZWMocHJvcGVydHkpLgorLy8gaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS95aGZrMHRoZC5hc3B4CisvLyBBbGwgcmVhZCBhY2Nlc3NlcyBvZiBidWlsdC1pbiB2YXJpYWJsZSBmaWVsZHMgZ2V0IGNvbnZlcnRlZCBpbnRvIGNhbGxzIHRvIGEKKy8vIGdldHRlciBmdW5jdGlvbiB3aGljaCBpbiB0dXJuIGNhbGxzIHRoZSBhcHByb3ByaWF0ZSBidWlsdGluIHRvIGZldGNoIHRoZQorLy8gdmFsdWUuCisvLworLy8gRXhhbXBsZToKKy8vICAgIGludCB4ID0gdGhyZWFkSWR4Lng7CisvLyBJUiBvdXRwdXQ6CisvLyAgJTAgPSBjYWxsIGkzMiBAbGx2bS5udnZtLnJlYWQucHR4LnNyZWcudGlkLngoKSAjMworLy8gUFRYIG91dHB1dDoKKy8vICBtb3YudTMyICAgICAlcjIsICV0aWQueDsKKworI2RlZmluZSBfX0NVREFfREVWSUNFX0JVSUxUSU4oRklFTEQsIElOVFJJTlNJQykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19kZWNsc3BlYyhwcm9wZXJ0eShnZXQgPSBfX2ZldGNoX2J1aWx0aW5fIyNGSUVMRCkpIHVuc2lnbmVkIGludCBGSUVMRDsgICAgICBcCisgIHN0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXygoYWx3YXlzX2lubGluZSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgX19hdHRyaWJ1dGVfXygoZGV2aWNlKSkgdW5zaWduZWQgaW50IF9fZmV0Y2hfYnVpbHRpbl8jI0ZJRUxEKHZvaWQpIHsgICAgIFwKKyAgICByZXR1cm4gSU5UUklOU0lDOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyNkZWZpbmUgX19ERUxFVEUgPWRlbGV0ZQorI2Vsc2UKKyNkZWZpbmUgX19ERUxFVEUKKyNlbmRpZgorCisvLyBNYWtlIHN1cmUgbm9ib2R5IGNhbiBjcmVhdGUgaW5zdGFuY2VzIG9mIHRoZSBzcGVjaWFsIHZhcmlibGUgdHlwZXMuICBudmNjCisvLyBhbHNvIGRpc2FsbG93cyB0YWtpbmcgYWRkcmVzcyBvZiBzcGVjaWFsIHZhcmlhYmxlcywgc28gd2UgZGlzYWJsZSBhZGRyZXNzLW9mCisvLyBvcGVyYXRvciBhcyB3ZWxsLgorI2RlZmluZSBfX0NVREFfRElTQUxMT1dfQlVJTFRJTlZBUl9BQ0NFU1MoVHlwZU5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19hdHRyaWJ1dGVfXygoZGV2aWNlKSkgVHlwZU5hbWUoKSBfX0RFTEVURTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fYXR0cmlidXRlX18oKGRldmljZSkpIFR5cGVOYW1lKGNvbnN0IFR5cGVOYW1lICYpIF9fREVMRVRFOyAgICAgICAgICAgICAgICAgXAorICBfX2F0dHJpYnV0ZV9fKChkZXZpY2UpKSB2b2lkIG9wZXJhdG9yPShjb25zdCBUeXBlTmFtZSAmKSBjb25zdCBfX0RFTEVURTsgICAgIFwKKyAgX19hdHRyaWJ1dGVfXygoZGV2aWNlKSkgVHlwZU5hbWUgKm9wZXJhdG9yJigpIGNvbnN0IF9fREVMRVRFCisKK3N0cnVjdCBfX2N1ZGFfYnVpbHRpbl90aHJlYWRJZHhfdCB7CisgIF9fQ1VEQV9ERVZJQ0VfQlVJTFRJTih4LF9fbnZ2bV9yZWFkX3B0eF9zcmVnX3RpZF94KCkpOworICBfX0NVREFfREVWSUNFX0JVSUxUSU4oeSxfX252dm1fcmVhZF9wdHhfc3JlZ190aWRfeSgpKTsKKyAgX19DVURBX0RFVklDRV9CVUlMVElOKHosX19udnZtX3JlYWRfcHR4X3NyZWdfdGlkX3ooKSk7CisgIC8vIHRocmVhZElkeCBzaG91bGQgYmUgY29udmVydGlibGUgdG8gdWludDMgKGluIGZhY3QgaW4gbnZjYywgaXQgKmlzKiBhCisgIC8vIHVpbnQzKS4gIFRoaXMgZnVuY3Rpb24gaXMgZGVmaW5lZCBhZnRlciB3ZSBwdWxsIGluIHZlY3Rvcl90eXBlcy5oLgorICBfX2F0dHJpYnV0ZV9fKChkZXZpY2UpKSBvcGVyYXRvciB1aW50MygpIGNvbnN0OworcHJpdmF0ZToKKyAgX19DVURBX0RJU0FMTE9XX0JVSUxUSU5WQVJfQUNDRVNTKF9fY3VkYV9idWlsdGluX3RocmVhZElkeF90KTsKK307CisKK3N0cnVjdCBfX2N1ZGFfYnVpbHRpbl9ibG9ja0lkeF90IHsKKyAgX19DVURBX0RFVklDRV9CVUlMVElOKHgsX19udnZtX3JlYWRfcHR4X3NyZWdfY3RhaWRfeCgpKTsKKyAgX19DVURBX0RFVklDRV9CVUlMVElOKHksX19udnZtX3JlYWRfcHR4X3NyZWdfY3RhaWRfeSgpKTsKKyAgX19DVURBX0RFVklDRV9CVUlMVElOKHosX19udnZtX3JlYWRfcHR4X3NyZWdfY3RhaWRfeigpKTsKKyAgLy8gYmxvY2tJZHggc2hvdWxkIGJlIGNvbnZlcnRpYmxlIHRvIHVpbnQzIChpbiBmYWN0IGluIG52Y2MsIGl0ICppcyogYQorICAvLyB1aW50MykuICBUaGlzIGZ1bmN0aW9uIGlzIGRlZmluZWQgYWZ0ZXIgd2UgcHVsbCBpbiB2ZWN0b3JfdHlwZXMuaC4KKyAgX19hdHRyaWJ1dGVfXygoZGV2aWNlKSkgb3BlcmF0b3IgdWludDMoKSBjb25zdDsKK3ByaXZhdGU6CisgIF9fQ1VEQV9ESVNBTExPV19CVUlMVElOVkFSX0FDQ0VTUyhfX2N1ZGFfYnVpbHRpbl9ibG9ja0lkeF90KTsKK307CisKK3N0cnVjdCBfX2N1ZGFfYnVpbHRpbl9ibG9ja0RpbV90IHsKKyAgX19DVURBX0RFVklDRV9CVUlMVElOKHgsX19udnZtX3JlYWRfcHR4X3NyZWdfbnRpZF94KCkpOworICBfX0NVREFfREVWSUNFX0JVSUxUSU4oeSxfX252dm1fcmVhZF9wdHhfc3JlZ19udGlkX3koKSk7CisgIF9fQ1VEQV9ERVZJQ0VfQlVJTFRJTih6LF9fbnZ2bV9yZWFkX3B0eF9zcmVnX250aWRfeigpKTsKKyAgLy8gYmxvY2tEaW0gc2hvdWxkIGJlIGNvbnZlcnRpYmxlIHRvIGRpbTMgKGluIGZhY3QgaW4gbnZjYywgaXQgKmlzKiBhCisgIC8vIGRpbTMpLiAgVGhpcyBmdW5jdGlvbiBpcyBkZWZpbmVkIGFmdGVyIHdlIHB1bGwgaW4gdmVjdG9yX3R5cGVzLmguCisgIF9fYXR0cmlidXRlX18oKGRldmljZSkpIG9wZXJhdG9yIGRpbTMoKSBjb25zdDsKK3ByaXZhdGU6CisgIF9fQ1VEQV9ESVNBTExPV19CVUlMVElOVkFSX0FDQ0VTUyhfX2N1ZGFfYnVpbHRpbl9ibG9ja0RpbV90KTsKK307CisKK3N0cnVjdCBfX2N1ZGFfYnVpbHRpbl9ncmlkRGltX3QgeworICBfX0NVREFfREVWSUNFX0JVSUxUSU4oeCxfX252dm1fcmVhZF9wdHhfc3JlZ19uY3RhaWRfeCgpKTsKKyAgX19DVURBX0RFVklDRV9CVUlMVElOKHksX19udnZtX3JlYWRfcHR4X3NyZWdfbmN0YWlkX3koKSk7CisgIF9fQ1VEQV9ERVZJQ0VfQlVJTFRJTih6LF9fbnZ2bV9yZWFkX3B0eF9zcmVnX25jdGFpZF96KCkpOworICAvLyBncmlkRGltIHNob3VsZCBiZSBjb252ZXJ0aWJsZSB0byBkaW0zIChpbiBmYWN0IGluIG52Y2MsIGl0ICppcyogYQorICAvLyBkaW0zKS4gIFRoaXMgZnVuY3Rpb24gaXMgZGVmaW5lZCBhZnRlciB3ZSBwdWxsIGluIHZlY3Rvcl90eXBlcy5oLgorICBfX2F0dHJpYnV0ZV9fKChkZXZpY2UpKSBvcGVyYXRvciBkaW0zKCkgY29uc3Q7Citwcml2YXRlOgorICBfX0NVREFfRElTQUxMT1dfQlVJTFRJTlZBUl9BQ0NFU1MoX19jdWRhX2J1aWx0aW5fZ3JpZERpbV90KTsKK307CisKKyNkZWZpbmUgX19DVURBX0JVSUxUSU5fVkFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGV4dGVybiBjb25zdCBfX2F0dHJpYnV0ZV9fKChkZXZpY2UpKSBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkKK19fQ1VEQV9CVUlMVElOX1ZBUiBfX2N1ZGFfYnVpbHRpbl90aHJlYWRJZHhfdCB0aHJlYWRJZHg7CitfX0NVREFfQlVJTFRJTl9WQVIgX19jdWRhX2J1aWx0aW5fYmxvY2tJZHhfdCBibG9ja0lkeDsKK19fQ1VEQV9CVUlMVElOX1ZBUiBfX2N1ZGFfYnVpbHRpbl9ibG9ja0RpbV90IGJsb2NrRGltOworX19DVURBX0JVSUxUSU5fVkFSIF9fY3VkYV9idWlsdGluX2dyaWREaW1fdCBncmlkRGltOworCisvLyB3YXJwU2l6ZSBzaG91bGQgdHJhbnNsYXRlIHRvIHJlYWQgb2YgJVdBUlBfU1ogYnV0IHRoZXJlJ3MgY3VycmVudGx5IG5vCisvLyBidWlsdGluIHRvIGRvIHNvLiBBY2NvcmRpbmcgdG8gUFRYIHY0LjIgZG9jcyAndG8gZGF0ZSwgYWxsIHRhcmdldAorLy8gYXJjaGl0ZWN0dXJlcyBoYXZlIGEgV0FSUF9TWiB2YWx1ZSBvZiAzMicuCitfX2F0dHJpYnV0ZV9fKChkZXZpY2UpKSBjb25zdCBpbnQgd2FycFNpemUgPSAzMjsKKworI3VuZGVmIF9fQ1VEQV9ERVZJQ0VfQlVJTFRJTgorI3VuZGVmIF9fQ1VEQV9CVUlMVElOX1ZBUgorI3VuZGVmIF9fQ1VEQV9ESVNBTExPV19CVUlMVElOVkFSX0FDQ0VTUworCisjZW5kaWYgLyogX19DVURBX0JVSUxUSU5fVkFSU19IICovCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9lbW1pbnRyaW4uaCBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL2VtbWludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3OGQwNTkKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9lbW1pbnRyaW4uaApAQCAtMCwwICsxLDI0NTggQEAKKy8qPT09LS0tLSBlbW1pbnRyaW4uaCAtIFNTRTIgaW50cmluc2ljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKgorICo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICovCisKKyNpZm5kZWYgX19FTU1JTlRSSU5fSAorI2RlZmluZSBfX0VNTUlOVFJJTl9ICisKKyNpbmNsdWRlIDx4bW1pbnRyaW4uaD4KKwordHlwZWRlZiBkb3VibGUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oMTYpKSk7Cit0eXBlZGVmIGxvbmcgbG9uZyBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXygxNikpKTsKKworLyogVHlwZSBkZWZpbmVzLiAgKi8KK3R5cGVkZWYgZG91YmxlIF9fdjJkZiBfX2F0dHJpYnV0ZV9fICgoX192ZWN0b3Jfc2l6ZV9fICgxNikpKTsKK3R5cGVkZWYgbG9uZyBsb25nIF9fdjJkaSBfX2F0dHJpYnV0ZV9fICgoX192ZWN0b3Jfc2l6ZV9fICgxNikpKTsKK3R5cGVkZWYgc2hvcnQgX192OGhpIF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXygxNikpKTsKK3R5cGVkZWYgY2hhciBfX3YxNnFpIF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXygxNikpKTsKKworLyogVW5zaWduZWQgdHlwZXMgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIF9fdjJkdSBfX2F0dHJpYnV0ZV9fICgoX192ZWN0b3Jfc2l6ZV9fICgxNikpKTsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgX192OGh1IF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXygxNikpKTsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBfX3YxNnF1IF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXygxNikpKTsKKworLyogV2UgbmVlZCBhbiBleHBsaWNpdGx5IHNpZ25lZCB2YXJpYW50IGZvciBjaGFyLiBOb3RlIHRoYXQgdGhpcyBzaG91bGRuJ3QKKyAqIGFwcGVhciBpbiB0aGUgaW50ZXJmYWNlIHRob3VnaC4gKi8KK3R5cGVkZWYgc2lnbmVkIGNoYXIgX192MTZxcyBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oMTYpKSk7CisKKyNpbmNsdWRlIDxmMTZjaW50cmluLmg+CisKKy8qIERlZmluZSB0aGUgZGVmYXVsdCBhdHRyaWJ1dGVzIGZvciB0aGUgZnVuY3Rpb25zIGluIHRoaXMgZmlsZS4gKi8KKyNkZWZpbmUgX19ERUZBVUxUX0ZOX0FUVFJTIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXywgX190YXJnZXRfXygic3NlMiIpKSkKKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9hZGRfc2QoX19tMTI4ZCBfX2EsIF9fbTEyOGQgX19iKQoreworICBfX2FbMF0gKz0gX19iWzBdOworICByZXR1cm4gX19hOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2FkZF9wZChfX20xMjhkIF9fYSwgX19tMTI4ZCBfX2IpCit7CisgIHJldHVybiAoX19tMTI4ZCkoKF9fdjJkZilfX2EgKyAoX192MmRmKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc3ViX3NkKF9fbTEyOGQgX19hLCBfX20xMjhkIF9fYikKK3sKKyAgX19hWzBdIC09IF9fYlswXTsKKyAgcmV0dXJuIF9fYTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zdWJfcGQoX19tMTI4ZCBfX2EsIF9fbTEyOGQgX19iKQoreworICByZXR1cm4gKF9fbTEyOGQpKChfX3YyZGYpX19hIC0gKF9fdjJkZilfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX211bF9zZChfX20xMjhkIF9fYSwgX19tMTI4ZCBfX2IpCit7CisgIF9fYVswXSAqPSBfX2JbMF07CisgIHJldHVybiBfX2E7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbXVsX3BkKF9fbTEyOGQgX19hLCBfX20xMjhkIF9fYikKK3sKKyAgcmV0dXJuIChfX20xMjhkKSgoX192MmRmKV9fYSAqIChfX3YyZGYpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9kaXZfc2QoX19tMTI4ZCBfX2EsIF9fbTEyOGQgX19iKQoreworICBfX2FbMF0gLz0gX19iWzBdOworICByZXR1cm4gX19hOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2Rpdl9wZChfX20xMjhkIF9fYSwgX19tMTI4ZCBfX2IpCit7CisgIHJldHVybiAoX19tMTI4ZCkoKF9fdjJkZilfX2EgLyAoX192MmRmKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc3FydF9zZChfX20xMjhkIF9fYSwgX19tMTI4ZCBfX2IpCit7CisgIF9fbTEyOGQgX19jID0gX19idWlsdGluX2lhMzJfc3FydHNkKChfX3YyZGYpX19iKTsKKyAgcmV0dXJuIChfX20xMjhkKSB7IF9fY1swXSwgX19hWzFdIH07Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc3FydF9wZChfX20xMjhkIF9fYSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3NxcnRwZCgoX192MmRmKV9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWluX3NkKF9fbTEyOGQgX19hLCBfX20xMjhkIF9fYikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX21pbnNkKChfX3YyZGYpX19hLCAoX192MmRmKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWluX3BkKF9fbTEyOGQgX19hLCBfX20xMjhkIF9fYikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX21pbnBkKChfX3YyZGYpX19hLCAoX192MmRmKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWF4X3NkKF9fbTEyOGQgX19hLCBfX20xMjhkIF9fYikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX21heHNkKChfX3YyZGYpX19hLCAoX192MmRmKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWF4X3BkKF9fbTEyOGQgX19hLCBfX20xMjhkIF9fYikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX21heHBkKChfX3YyZGYpX19hLCAoX192MmRmKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fYW5kX3BkKF9fbTEyOGQgX19hLCBfX20xMjhkIF9fYikKK3sKKyAgcmV0dXJuIChfX20xMjhkKSgoX192NHN1KV9fYSAmIChfX3Y0c3UpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9hbmRub3RfcGQoX19tMTI4ZCBfX2EsIF9fbTEyOGQgX19iKQoreworICByZXR1cm4gKF9fbTEyOGQpKH4oX192NHN1KV9fYSAmIChfX3Y0c3UpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9vcl9wZChfX20xMjhkIF9fYSwgX19tMTI4ZCBfX2IpCit7CisgIHJldHVybiAoX19tMTI4ZCkoKF9fdjRzdSlfX2EgfCAoX192NHN1KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1feG9yX3BkKF9fbTEyOGQgX19hLCBfX20xMjhkIF9fYikKK3sKKyAgcmV0dXJuIChfX20xMjhkKSgoX192NHN1KV9fYSBeIChfX3Y0c3UpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbXBlcV9wZChfX20xMjhkIF9fYSwgX19tMTI4ZCBfX2IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9jbXBlcXBkKChfX3YyZGYpX19hLCAoX192MmRmKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY21wbHRfcGQoX19tMTI4ZCBfX2EsIF9fbTEyOGQgX19iKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfY21wbHRwZCgoX192MmRmKV9fYSwgKF9fdjJkZilfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NtcGxlX3BkKF9fbTEyOGQgX19hLCBfX20xMjhkIF9fYikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2NtcGxlcGQoKF9fdjJkZilfX2EsIChfX3YyZGYpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbXBndF9wZChfX20xMjhkIF9fYSwgX19tMTI4ZCBfX2IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9jbXBsdHBkKChfX3YyZGYpX19iLCAoX192MmRmKV9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY21wZ2VfcGQoX19tMTI4ZCBfX2EsIF9fbTEyOGQgX19iKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfY21wbGVwZCgoX192MmRmKV9fYiwgKF9fdjJkZilfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NtcG9yZF9wZChfX20xMjhkIF9fYSwgX19tMTI4ZCBfX2IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9jbXBvcmRwZCgoX192MmRmKV9fYSwgKF9fdjJkZilfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NtcHVub3JkX3BkKF9fbTEyOGQgX19hLCBfX20xMjhkIF9fYikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2NtcHVub3JkcGQoKF9fdjJkZilfX2EsIChfX3YyZGYpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbXBuZXFfcGQoX19tMTI4ZCBfX2EsIF9fbTEyOGQgX19iKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfY21wbmVxcGQoKF9fdjJkZilfX2EsIChfX3YyZGYpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbXBubHRfcGQoX19tMTI4ZCBfX2EsIF9fbTEyOGQgX19iKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfY21wbmx0cGQoKF9fdjJkZilfX2EsIChfX3YyZGYpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbXBubGVfcGQoX19tMTI4ZCBfX2EsIF9fbTEyOGQgX19iKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfY21wbmxlcGQoKF9fdjJkZilfX2EsIChfX3YyZGYpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbXBuZ3RfcGQoX19tMTI4ZCBfX2EsIF9fbTEyOGQgX19iKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfY21wbmx0cGQoKF9fdjJkZilfX2IsIChfX3YyZGYpX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbXBuZ2VfcGQoX19tMTI4ZCBfX2EsIF9fbTEyOGQgX19iKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfY21wbmxlcGQoKF9fdjJkZilfX2IsIChfX3YyZGYpX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbXBlcV9zZChfX20xMjhkIF9fYSwgX19tMTI4ZCBfX2IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9jbXBlcXNkKChfX3YyZGYpX19hLCAoX192MmRmKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY21wbHRfc2QoX19tMTI4ZCBfX2EsIF9fbTEyOGQgX19iKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfY21wbHRzZCgoX192MmRmKV9fYSwgKF9fdjJkZilfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NtcGxlX3NkKF9fbTEyOGQgX19hLCBfX20xMjhkIF9fYikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2NtcGxlc2QoKF9fdjJkZilfX2EsIChfX3YyZGYpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbXBndF9zZChfX20xMjhkIF9fYSwgX19tMTI4ZCBfX2IpCit7CisgIF9fbTEyOGQgX19jID0gX19idWlsdGluX2lhMzJfY21wbHRzZCgoX192MmRmKV9fYiwgKF9fdjJkZilfX2EpOworICByZXR1cm4gKF9fbTEyOGQpIHsgX19jWzBdLCBfX2FbMV0gfTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbXBnZV9zZChfX20xMjhkIF9fYSwgX19tMTI4ZCBfX2IpCit7CisgIF9fbTEyOGQgX19jID0gX19idWlsdGluX2lhMzJfY21wbGVzZCgoX192MmRmKV9fYiwgKF9fdjJkZilfX2EpOworICByZXR1cm4gKF9fbTEyOGQpIHsgX19jWzBdLCBfX2FbMV0gfTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbXBvcmRfc2QoX19tMTI4ZCBfX2EsIF9fbTEyOGQgX19iKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfY21wb3Jkc2QoKF9fdjJkZilfX2EsIChfX3YyZGYpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbXB1bm9yZF9zZChfX20xMjhkIF9fYSwgX19tMTI4ZCBfX2IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9jbXB1bm9yZHNkKChfX3YyZGYpX19hLCAoX192MmRmKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY21wbmVxX3NkKF9fbTEyOGQgX19hLCBfX20xMjhkIF9fYikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2NtcG5lcXNkKChfX3YyZGYpX19hLCAoX192MmRmKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY21wbmx0X3NkKF9fbTEyOGQgX19hLCBfX20xMjhkIF9fYikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2NtcG5sdHNkKChfX3YyZGYpX19hLCAoX192MmRmKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY21wbmxlX3NkKF9fbTEyOGQgX19hLCBfX20xMjhkIF9fYikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2NtcG5sZXNkKChfX3YyZGYpX19hLCAoX192MmRmKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY21wbmd0X3NkKF9fbTEyOGQgX19hLCBfX20xMjhkIF9fYikKK3sKKyAgX19tMTI4ZCBfX2MgPSBfX2J1aWx0aW5faWEzMl9jbXBubHRzZCgoX192MmRmKV9fYiwgKF9fdjJkZilfX2EpOworICByZXR1cm4gKF9fbTEyOGQpIHsgX19jWzBdLCBfX2FbMV0gfTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbXBuZ2Vfc2QoX19tMTI4ZCBfX2EsIF9fbTEyOGQgX19iKQoreworICBfX20xMjhkIF9fYyA9IF9fYnVpbHRpbl9pYTMyX2NtcG5sZXNkKChfX3YyZGYpX19iLCAoX192MmRmKV9fYSk7CisgIHJldHVybiAoX19tMTI4ZCkgeyBfX2NbMF0sIF9fYVsxXSB9OworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY29taWVxX3NkKF9fbTEyOGQgX19hLCBfX20xMjhkIF9fYikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2NvbWlzZGVxKChfX3YyZGYpX19hLCAoX192MmRmKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jb21pbHRfc2QoX19tMTI4ZCBfX2EsIF9fbTEyOGQgX19iKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfY29taXNkbHQoKF9fdjJkZilfX2EsIChfX3YyZGYpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NvbWlsZV9zZChfX20xMjhkIF9fYSwgX19tMTI4ZCBfX2IpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9jb21pc2RsZSgoX192MmRmKV9fYSwgKF9fdjJkZilfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY29taWd0X3NkKF9fbTEyOGQgX19hLCBfX20xMjhkIF9fYikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2NvbWlzZGd0KChfX3YyZGYpX19hLCAoX192MmRmKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jb21pZ2Vfc2QoX19tMTI4ZCBfX2EsIF9fbTEyOGQgX19iKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfY29taXNkZ2UoKF9fdjJkZilfX2EsIChfX3YyZGYpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NvbWluZXFfc2QoX19tMTI4ZCBfX2EsIF9fbTEyOGQgX19iKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfY29taXNkbmVxKChfX3YyZGYpX19hLCAoX192MmRmKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV91Y29taWVxX3NkKF9fbTEyOGQgX19hLCBfX20xMjhkIF9fYikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3Vjb21pc2RlcSgoX192MmRmKV9fYSwgKF9fdjJkZilfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fdWNvbWlsdF9zZChfX20xMjhkIF9fYSwgX19tMTI4ZCBfX2IpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl91Y29taXNkbHQoKF9fdjJkZilfX2EsIChfX3YyZGYpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fREVGQVVMVF9GTl9BVFRSUworX21tX3Vjb21pbGVfc2QoX19tMTI4ZCBfX2EsIF9fbTEyOGQgX19iKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfdWNvbWlzZGxlKChfX3YyZGYpX19hLCAoX192MmRmKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV91Y29taWd0X3NkKF9fbTEyOGQgX19hLCBfX20xMjhkIF9fYikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3Vjb21pc2RndCgoX192MmRmKV9fYSwgKF9fdjJkZilfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fdWNvbWlnZV9zZChfX20xMjhkIF9fYSwgX19tMTI4ZCBfX2IpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl91Y29taXNkZ2UoKF9fdjJkZilfX2EsIChfX3YyZGYpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fREVGQVVMVF9GTl9BVFRSUworX21tX3Vjb21pbmVxX3NkKF9fbTEyOGQgX19hLCBfX20xMjhkIF9fYikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3Vjb21pc2RuZXEoKF9fdjJkZilfX2EsIChfX3YyZGYpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2N2dHBkX3BzKF9fbTEyOGQgX19hKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfY3Z0cGQycHMoKF9fdjJkZilfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2N2dHBzX3BkKF9fbTEyOCBfX2EpCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2NvbnZlcnR2ZWN0b3IoCisgICAgICBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcigoX192NHNmKV9fYSwgKF9fdjRzZilfX2EsIDAsIDEpLCBfX3YyZGYpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2N2dGVwaTMyX3BkKF9fbTEyOGkgX19hKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9jb252ZXJ0dmVjdG9yKAorICAgICAgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjRzaSlfX2EsIChfX3Y0c2kpX19hLCAwLCAxKSwgX192MmRmKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jdnRwZF9lcGkzMihfX20xMjhkIF9fYSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2N2dHBkMmRxKChfX3YyZGYpX19hKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2N2dHNkX3NpMzIoX19tMTI4ZCBfX2EpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9jdnRzZDJzaSgoX192MmRmKV9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jdnRzZF9zcyhfX20xMjggX19hLCBfX20xMjhkIF9fYikKK3sKKyAgX19hWzBdID0gX19iWzBdOworICByZXR1cm4gX19hOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2N2dHNpMzJfc2QoX19tMTI4ZCBfX2EsIGludCBfX2IpCit7CisgIF9fYVswXSA9IF9fYjsKKyAgcmV0dXJuIF9fYTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jdnRzc19zZChfX20xMjhkIF9fYSwgX19tMTI4IF9fYikKK3sKKyAgX19hWzBdID0gX19iWzBdOworICByZXR1cm4gX19hOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2N2dHRwZF9lcGkzMihfX20xMjhkIF9fYSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX2N2dHRwZDJkcSgoX192MmRmKV9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jdnR0c2Rfc2kzMihfX20xMjhkIF9fYSkKK3sKKyAgcmV0dXJuIF9fYVswXTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY3Z0cGRfcGkzMihfX20xMjhkIF9fYSkKK3sKKyAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9jdnRwZDJwaSgoX192MmRmKV9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2N2dHRwZF9waTMyKF9fbTEyOGQgX19hKQoreworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX2N2dHRwZDJwaSgoX192MmRmKV9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY3Z0cGkzMl9wZChfX202NCBfX2EpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9jdnRwaTJwZCgoX192MnNpKV9fYSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGRvdWJsZSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jdnRzZF9mNjQoX19tMTI4ZCBfX2EpCit7CisgIHJldHVybiBfX2FbMF07Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbG9hZF9wZChkb3VibGUgY29uc3QgKl9fZHApCit7CisgIHJldHVybiAqKF9fbTEyOGQqKV9fZHA7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbG9hZDFfcGQoZG91YmxlIGNvbnN0ICpfX2RwKQoreworICBzdHJ1Y3QgX19tbV9sb2FkMV9wZF9zdHJ1Y3QgeworICAgIGRvdWJsZSBfX3U7CisgIH0gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXywgX19tYXlfYWxpYXNfXykpOworICBkb3VibGUgX191ID0gKChzdHJ1Y3QgX19tbV9sb2FkMV9wZF9zdHJ1Y3QqKV9fZHApLT5fX3U7CisgIHJldHVybiAoX19tMTI4ZCl7IF9fdSwgX191IH07Cit9CisKKyNkZWZpbmUgICAgICAgIF9tbV9sb2FkX3BkMShkcCkgICAgICAgIF9tbV9sb2FkMV9wZChkcCkKKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9sb2Fkcl9wZChkb3VibGUgY29uc3QgKl9fZHApCit7CisgIF9fbTEyOGQgX191ID0gKihfX20xMjhkKilfX2RwOworICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjJkZilfX3UsIChfX3YyZGYpX191LCAxLCAwKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9sb2FkdV9wZChkb3VibGUgY29uc3QgKl9fZHApCit7CisgIHN0cnVjdCBfX2xvYWR1X3BkIHsKKyAgICBfX20xMjhkIF9fdjsKKyAgfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fLCBfX21heV9hbGlhc19fKSk7CisgIHJldHVybiAoKHN0cnVjdCBfX2xvYWR1X3BkKilfX2RwKS0+X192OworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2xvYWR1X3NpNjQodm9pZCBjb25zdCAqX19hKQoreworICBzdHJ1Y3QgX19sb2FkdV9zaTY0IHsKKyAgICBsb25nIGxvbmcgX192OworICB9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18sIF9fbWF5X2FsaWFzX18pKTsKKyAgbG9uZyBsb25nIF9fdSA9ICgoc3RydWN0IF9fbG9hZHVfc2k2NCopX19hKS0+X192OworICByZXR1cm4gKF9fbTEyOGkpe19fdSwgMEx9OworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2xvYWRfc2QoZG91YmxlIGNvbnN0ICpfX2RwKQoreworICBzdHJ1Y3QgX19tbV9sb2FkX3NkX3N0cnVjdCB7CisgICAgZG91YmxlIF9fdTsKKyAgfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fLCBfX21heV9hbGlhc19fKSk7CisgIGRvdWJsZSBfX3UgPSAoKHN0cnVjdCBfX21tX2xvYWRfc2Rfc3RydWN0KilfX2RwKS0+X191OworICByZXR1cm4gKF9fbTEyOGQpeyBfX3UsIDAgfTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9sb2FkaF9wZChfX20xMjhkIF9fYSwgZG91YmxlIGNvbnN0ICpfX2RwKQoreworICBzdHJ1Y3QgX19tbV9sb2FkaF9wZF9zdHJ1Y3QgeworICAgIGRvdWJsZSBfX3U7CisgIH0gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXywgX19tYXlfYWxpYXNfXykpOworICBkb3VibGUgX191ID0gKChzdHJ1Y3QgX19tbV9sb2FkaF9wZF9zdHJ1Y3QqKV9fZHApLT5fX3U7CisgIHJldHVybiAoX19tMTI4ZCl7IF9fYVswXSwgX191IH07Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbG9hZGxfcGQoX19tMTI4ZCBfX2EsIGRvdWJsZSBjb25zdCAqX19kcCkKK3sKKyAgc3RydWN0IF9fbW1fbG9hZGxfcGRfc3RydWN0IHsKKyAgICBkb3VibGUgX191OworICB9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18sIF9fbWF5X2FsaWFzX18pKTsKKyAgZG91YmxlIF9fdSA9ICgoc3RydWN0IF9fbW1fbG9hZGxfcGRfc3RydWN0KilfX2RwKS0+X191OworICByZXR1cm4gKF9fbTEyOGQpeyBfX3UsIF9fYVsxXSB9OworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3VuZGVmaW5lZF9wZCh2b2lkKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfdW5kZWYxMjgoKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zZXRfc2QoZG91YmxlIF9fdykKK3sKKyAgcmV0dXJuIChfX20xMjhkKXsgX193LCAwIH07Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc2V0MV9wZChkb3VibGUgX193KQoreworICByZXR1cm4gKF9fbTEyOGQpeyBfX3csIF9fdyB9OworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3NldF9wZChkb3VibGUgX193LCBkb3VibGUgX194KQoreworICByZXR1cm4gKF9fbTEyOGQpeyBfX3gsIF9fdyB9OworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3NldHJfcGQoZG91YmxlIF9fdywgZG91YmxlIF9feCkKK3sKKyAgcmV0dXJuIChfX20xMjhkKXsgX193LCBfX3ggfTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zZXR6ZXJvX3BkKHZvaWQpCit7CisgIHJldHVybiAoX19tMTI4ZCl7IDAsIDAgfTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tb3ZlX3NkKF9fbTEyOGQgX19hLCBfX20xMjhkIF9fYikKK3sKKyAgcmV0dXJuIChfX20xMjhkKXsgX19iWzBdLCBfX2FbMV0gfTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zdG9yZV9zZChkb3VibGUgKl9fZHAsIF9fbTEyOGQgX19hKQoreworICBzdHJ1Y3QgX19tbV9zdG9yZV9zZF9zdHJ1Y3QgeworICAgIGRvdWJsZSBfX3U7CisgIH0gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXywgX19tYXlfYWxpYXNfXykpOworICAoKHN0cnVjdCBfX21tX3N0b3JlX3NkX3N0cnVjdCopX19kcCktPl9fdSA9IF9fYVswXTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zdG9yZV9wZChkb3VibGUgKl9fZHAsIF9fbTEyOGQgX19hKQoreworICAqKF9fbTEyOGQqKV9fZHAgPSBfX2E7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc3RvcmUxX3BkKGRvdWJsZSAqX19kcCwgX19tMTI4ZCBfX2EpCit7CisgIF9fYSA9IF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3YyZGYpX19hLCAoX192MmRmKV9fYSwgMCwgMCk7CisgIF9tbV9zdG9yZV9wZChfX2RwLCBfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3N0b3JlX3BkMShkb3VibGUgKl9fZHAsIF9fbTEyOGQgX19hKQoreworICByZXR1cm4gX21tX3N0b3JlMV9wZChfX2RwLCBfX2EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3N0b3JldV9wZChkb3VibGUgKl9fZHAsIF9fbTEyOGQgX19hKQoreworICBzdHJ1Y3QgX19zdG9yZXVfcGQgeworICAgIF9fbTEyOGQgX192OworICB9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18sIF9fbWF5X2FsaWFzX18pKTsKKyAgKChzdHJ1Y3QgX19zdG9yZXVfcGQqKV9fZHApLT5fX3YgPSBfX2E7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc3RvcmVyX3BkKGRvdWJsZSAqX19kcCwgX19tMTI4ZCBfX2EpCit7CisgIF9fYSA9IF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3YyZGYpX19hLCAoX192MmRmKV9fYSwgMSwgMCk7CisgICooX19tMTI4ZCAqKV9fZHAgPSBfX2E7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc3RvcmVoX3BkKGRvdWJsZSAqX19kcCwgX19tMTI4ZCBfX2EpCit7CisgIHN0cnVjdCBfX21tX3N0b3JlaF9wZF9zdHJ1Y3QgeworICAgIGRvdWJsZSBfX3U7CisgIH0gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXywgX19tYXlfYWxpYXNfXykpOworICAoKHN0cnVjdCBfX21tX3N0b3JlaF9wZF9zdHJ1Y3QqKV9fZHApLT5fX3UgPSBfX2FbMV07Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc3RvcmVsX3BkKGRvdWJsZSAqX19kcCwgX19tMTI4ZCBfX2EpCit7CisgIHN0cnVjdCBfX21tX3N0b3JlaF9wZF9zdHJ1Y3QgeworICAgIGRvdWJsZSBfX3U7CisgIH0gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXywgX19tYXlfYWxpYXNfXykpOworICAoKHN0cnVjdCBfX21tX3N0b3JlaF9wZF9zdHJ1Y3QqKV9fZHApLT5fX3UgPSBfX2FbMF07Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fYWRkX2VwaTgoX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKQoreworICByZXR1cm4gKF9fbTEyOGkpKChfX3YxNnF1KV9fYSArIChfX3YxNnF1KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fYWRkX2VwaTE2KF9fbTEyOGkgX19hLCBfX20xMjhpIF9fYikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSgoX192OGh1KV9fYSArIChfX3Y4aHUpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9hZGRfZXBpMzIoX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKQoreworICByZXR1cm4gKF9fbTEyOGkpKChfX3Y0c3UpX19hICsgKF9fdjRzdSlfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX202NCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9hZGRfc2k2NChfX202NCBfX2EsIF9fbTY0IF9fYikKK3sKKyAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9wYWRkcSgoX192MWRpKV9fYSwgKF9fdjFkaSlfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2FkZF9lcGk2NChfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpCit7CisgIHJldHVybiAoX19tMTI4aSkoKF9fdjJkdSlfX2EgKyAoX192MmR1KV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fYWRkc19lcGk4KF9fbTEyOGkgX19hLCBfX20xMjhpIF9fYikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BhZGRzYjEyOCgoX192MTZxaSlfX2EsIChfX3YxNnFpKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fYWRkc19lcGkxNihfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wYWRkc3cxMjgoKF9fdjhoaSlfX2EsIChfX3Y4aGkpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9hZGRzX2VwdTgoX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcGFkZHVzYjEyOCgoX192MTZxaSlfX2EsIChfX3YxNnFpKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fYWRkc19lcHUxNihfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wYWRkdXN3MTI4KChfX3Y4aGkpX19hLCAoX192OGhpKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fYXZnX2VwdTgoX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcGF2Z2IxMjgoKF9fdjE2cWkpX19hLCAoX192MTZxaSlfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2F2Z19lcHUxNihfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wYXZndzEyOCgoX192OGhpKV9fYSwgKF9fdjhoaSlfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hZGRfZXBpMTYoX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcG1hZGR3ZDEyOCgoX192OGhpKV9fYSwgKF9fdjhoaSlfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21heF9lcGkxNihfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wbWF4c3cxMjgoKF9fdjhoaSlfX2EsIChfX3Y4aGkpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXhfZXB1OChfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wbWF4dWIxMjgoKF9fdjE2cWkpX19hLCAoX192MTZxaSlfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21pbl9lcGkxNihfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wbWluc3cxMjgoKF9fdjhoaSlfX2EsIChfX3Y4aGkpX19iKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9taW5fZXB1OChfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wbWludWIxMjgoKF9fdjE2cWkpX19hLCAoX192MTZxaSlfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX211bGhpX2VwaTE2KF9fbTEyOGkgX19hLCBfX20xMjhpIF9fYikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BtdWxodzEyOCgoX192OGhpKV9fYSwgKF9fdjhoaSlfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX211bGhpX2VwdTE2KF9fbTEyOGkgX19hLCBfX20xMjhpIF9fYikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BtdWxodXcxMjgoKF9fdjhoaSlfX2EsIChfX3Y4aGkpX19iKTsKK30KKworLy8vIFxicmllZiBNdWx0aXBsaWVzIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIHR3byBbOCB4IHNob3J0XSB2ZWN0b3JzIGFuZAorLy8vICAgIHJldHVybnMgYSB2ZWN0b3IgY29udGFpbmluZyB0aGUgbG93LW9yZGVyIDE2IGJpdHMgb2YgZWFjaCAzMi1iaXQgcHJvZHVjdAorLy8vICAgIGluIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVlBNVUxMVyAvIFBNVUxMVyBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyBvbmUgb2YgdGhlIHNvdXJjZSBvcGVyYW5kcy4KKy8vLyBccGFyYW0gX19iCisvLy8gICAgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBzb3VyY2Ugb3BlcmFuZHMuCisvLy8gXHJldHVybnMgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIHByb2R1Y3RzIG9mIGJvdGggb3BlcmFuZHMuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX211bGxvX2VwaTE2KF9fbTEyOGkgX19hLCBfX20xMjhpIF9fYikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSgoX192OGh1KV9fYSAqIChfX3Y4aHUpX19iKTsKK30KKworLy8vIFxicmllZiBNdWx0aXBsaWVzIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlcyBjb250YWluZWQgaW4gdGhlIGxvd2VyIGJpdHMKKy8vLyAgICBvZiB0aGUgdHdvIDY0LWJpdCBpbnRlZ2VyIHZlY3RvcnMgYW5kIHJldHVybnMgdGhlIDY0LWJpdCB1bnNpZ25lZAorLy8vICAgIHByb2R1Y3QuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgUE1VTFVEUSBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBzb3VyY2Ugb3BlcmFuZHMuCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgNjQtYml0IGludGVnZXIgY29udGFpbmluZyBvbmUgb2YgdGhlIHNvdXJjZSBvcGVyYW5kcy4KKy8vLyBccmV0dXJucyBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIHRoZSBwcm9kdWN0IG9mIGJvdGggb3BlcmFuZHMuCitzdGF0aWMgX19pbmxpbmVfXyBfX202NCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tdWxfc3UzMihfX202NCBfX2EsIF9fbTY0IF9fYikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3BtdWx1ZHEoKF9fdjJzaSlfX2EsIChfX3Yyc2kpX19iKTsKK30KKworLy8vIFxicmllZiBNdWx0aXBsaWVzIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlcyBjb250YWluZWQgaW4gdGhlIGxvd2VyCisvLy8gICAgYml0cyBvZiB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiB0d28gWzIgeCBpNjRdIHZlY3RvcnMsIGFuZCByZXR1cm5zCisvLy8gICAgdGhlIDY0LWJpdCBwcm9kdWN0cyBpbiB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBhIFsyIHggaTY0XSB2ZWN0b3IuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVlBNVUxVRFEgLyBQTVVMVURRIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgWzIgeCBpNjRdIHZlY3RvciBjb250YWluaW5nIG9uZSBvZiB0aGUgc291cmNlIG9wZXJhbmRzLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIFsyIHggaTY0XSB2ZWN0b3IgY29udGFpbmluZyBvbmUgb2YgdGhlIHNvdXJjZSBvcGVyYW5kcy4KKy8vLyBccmV0dXJucyBBIFsyIHggaTY0XSB2ZWN0b3IgY29udGFpbmluZyB0aGUgcHJvZHVjdCBvZiBib3RoIG9wZXJhbmRzLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tdWxfZXB1MzIoX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcG11bHVkcTEyOCgoX192NHNpKV9fYSwgKF9fdjRzaSlfX2IpOworfQorCisvLy8gXGJyaWVmIENvbXB1dGVzIHRoZSBhYnNvbHV0ZSBkaWZmZXJlbmNlcyBvZiBjb3JyZXNwb25kaW5nIDgtYml0IGludGVnZXIKKy8vLyAgICB2YWx1ZXMgaW4gdHdvIDEyOC1iaXQgdmVjdG9ycy4gU3VtcyB0aGUgZmlyc3QgOCBhYnNvbHV0ZSBkaWZmZXJlbmNlcywgYW5kCisvLy8gICAgc2VwYXJhdGVseSBzdW1zIHRoZSBzZWNvbmQgOCBhYnNvbHV0ZSBkaWZmZXJlbmNlcy4gUGFja3NzIHRoZXNlIHR3bworLy8vICAgIHVuc2lnbmVkIDE2LWJpdCBpbnRlZ2VyIHN1bXMgaW50byB0aGUgdXBwZXIgYW5kIGxvd2VyIGVsZW1lbnRzIG9mIGEKKy8vLyAgICBbMiB4IGk2NF0gdmVjdG9yLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZQU0FEQlcgLyBQU0FEQlcgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBzb3VyY2Ugb3BlcmFuZHMuCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIG9uZSBvZiB0aGUgc291cmNlIG9wZXJhbmRzLgorLy8vIFxyZXR1cm5zIEEgWzIgeCBpNjRdIHZlY3RvciBjb250YWluaW5nIHRoZSBzdW1zIG9mIHRoZSBzZXRzIG9mIGFic29sdXRlCisvLy8gICAgZGlmZmVyZW5jZXMgYmV0d2VlbiBib3RoIG9wZXJhbmRzLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zYWRfZXB1OChfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9wc2FkYncxMjgoKF9fdjE2cWkpX19hLCAoX192MTZxaSlfX2IpOworfQorCisvLy8gXGJyaWVmIFN1YnRyYWN0cyB0aGUgY29ycmVzcG9uZGluZyA4LWJpdCBpbnRlZ2VyIHZhbHVlcyBpbiB0aGUgb3BlcmFuZHMuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVlBTVUJCIC8gUFNVQkIgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIG1pbnVlbmRzLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgc3VidHJhaGVuZHMuCisvLy8gXHJldHVybnMgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIGRpZmZlcmVuY2VzIG9mIHRoZSB2YWx1ZXMKKy8vLyAgICBpbiB0aGUgb3BlcmFuZHMuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3N1Yl9lcGk4KF9fbTEyOGkgX19hLCBfX20xMjhpIF9fYikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSgoX192MTZxdSlfX2EgLSAoX192MTZxdSlfX2IpOworfQorCisvLy8gXGJyaWVmIFN1YnRyYWN0cyB0aGUgY29ycmVzcG9uZGluZyAxNi1iaXQgaW50ZWdlciB2YWx1ZXMgaW4gdGhlIG9wZXJhbmRzLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZQU1VCVyAvIFBTVUJXIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIHRoZSBtaW51ZW5kcy4KKy8vLyBccGFyYW0gX19iCisvLy8gICAgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIHN1YnRyYWhlbmRzLgorLy8vIFxyZXR1cm5zIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIHRoZSBkaWZmZXJlbmNlcyBvZiB0aGUgdmFsdWVzCisvLy8gICAgaW4gdGhlIG9wZXJhbmRzLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zdWJfZXBpMTYoX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKQoreworICByZXR1cm4gKF9fbTEyOGkpKChfX3Y4aHUpX19hIC0gKF9fdjhodSlfX2IpOworfQorCisvLy8gXGJyaWVmIFN1YnRyYWN0cyB0aGUgY29ycmVzcG9uZGluZyAzMi1iaXQgaW50ZWdlciB2YWx1ZXMgaW4gdGhlIG9wZXJhbmRzLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZQU1VCRCAvIFBTVUJEIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIHRoZSBtaW51ZW5kcy4KKy8vLyBccGFyYW0gX19iCisvLy8gICAgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIHN1YnRyYWhlbmRzLgorLy8vIFxyZXR1cm5zIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIHRoZSBkaWZmZXJlbmNlcyBvZiB0aGUgdmFsdWVzCisvLy8gICAgaW4gdGhlIG9wZXJhbmRzLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zdWJfZXBpMzIoX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKQoreworICByZXR1cm4gKF9fbTEyOGkpKChfX3Y0c3UpX19hIC0gKF9fdjRzdSlfX2IpOworfQorCisvLy8gXGJyaWVmIFN1YnRyYWN0cyBzaWduZWQgb3IgdW5zaWduZWQgNjQtYml0IGludGVnZXIgdmFsdWVzIGFuZCB3cml0ZXMgdGhlCisvLy8gICAgZGlmZmVyZW5jZSB0byB0aGUgY29ycmVzcG9uZGluZyBiaXRzIGluIHRoZSBkZXN0aW5hdGlvbi4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBQU1VCUSBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIHRoZSBtaW51ZW5kLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIHRoZSBzdWJ0cmFoZW5kLgorLy8vIFxyZXR1cm5zIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIGRpZmZlcmVuY2Ugb2YgdGhlIHZhbHVlcyBpbgorLy8vICAgIHRoZSBvcGVyYW5kcy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tX3N1Yl9zaTY0KF9fbTY0IF9fYSwgX19tNjQgX19iKQoreworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BzdWJxKChfX3YxZGkpX19hLCAoX192MWRpKV9fYik7Cit9CisKKy8vLyBcYnJpZWYgU3VidHJhY3RzIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIHR3byBbMiB4IGk2NF0gdmVjdG9ycy4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWUFNVQlEgLyBQU1VCUSBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgbWludWVuZHMuCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIHRoZSBzdWJ0cmFoZW5kcy4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgZGlmZmVyZW5jZXMgb2YgdGhlIHZhbHVlcworLy8vICAgIGluIHRoZSBvcGVyYW5kcy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc3ViX2VwaTY0KF9fbTEyOGkgX19hLCBfX20xMjhpIF9fYikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSgoX192MmR1KV9fYSAtIChfX3YyZHUpX19iKTsKK30KKworLy8vIFxicmllZiBTdWJ0cmFjdHMgY29ycmVzcG9uZGluZyA4LWJpdCBzaWduZWQgaW50ZWdlciB2YWx1ZXMgaW4gdGhlIGlucHV0IGFuZAorLy8vICAgIHJldHVybnMgdGhlIGRpZmZlcmVuY2VzIGluIHRoZSBjb3JyZXNwb25kaW5nIGJ5dGVzIGluIHRoZSBkZXN0aW5hdGlvbi4KKy8vLyAgICBEaWZmZXJlbmNlcyBncmVhdGVyIHRoYW4gN0ZoIGFyZSBzYXR1cmF0ZWQgdG8gN0ZoLCBhbmQgZGlmZmVyZW5jZXMgbGVzcworLy8vICAgIHRoYW4gODBoIGFyZSBzYXR1cmF0ZWQgdG8gODBoLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZQU1VCU0IgLyBQU1VCU0IgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIG1pbnVlbmRzLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgc3VidHJhaGVuZHMuCisvLy8gXHJldHVybnMgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIGRpZmZlcmVuY2VzIG9mIHRoZSB2YWx1ZXMKKy8vLyAgICBpbiB0aGUgb3BlcmFuZHMuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3N1YnNfZXBpOChfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc3Vic2IxMjgoKF9fdjE2cWkpX19hLCAoX192MTZxaSlfX2IpOworfQorCisvLy8gXGJyaWVmIFN1YnRyYWN0cyBjb3JyZXNwb25kaW5nIDE2LWJpdCBzaWduZWQgaW50ZWdlciB2YWx1ZXMgaW4gdGhlIGlucHV0IGFuZAorLy8vICAgIHJldHVybnMgdGhlIGRpZmZlcmVuY2VzIGluIHRoZSBjb3JyZXNwb25kaW5nIGJ5dGVzIGluIHRoZSBkZXN0aW5hdGlvbi4KKy8vLyAgICBEaWZmZXJlbmNlcyBncmVhdGVyIHRoYW4gN0ZGRmggYXJlIHNhdHVyYXRlZCB0byA3RkZGaCwgYW5kIHZhbHVlcyBsZXNzCisvLy8gICAgdGhhbiA4MDAwaCBhcmUgc2F0dXJhdGVkIHRvIDgwMDBoLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZQU1VCU1cgLyBQU1VCU1cgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIG1pbnVlbmRzLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgc3VidHJhaGVuZHMuCisvLy8gXHJldHVybnMgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIGRpZmZlcmVuY2VzIG9mIHRoZSB2YWx1ZXMKKy8vLyAgICBpbiB0aGUgb3BlcmFuZHMuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3N1YnNfZXBpMTYoX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHN1YnN3MTI4KChfX3Y4aGkpX19hLCAoX192OGhpKV9fYik7Cit9CisKKy8vLyBcYnJpZWYgU3VidHJhY3RzIGNvcnJlc3BvbmRpbmcgOC1iaXQgdW5zaWduZWQgaW50ZWdlciB2YWx1ZXMgaW4gdGhlIGlucHV0CisvLy8gICAgYW5kIHJldHVybnMgdGhlIGRpZmZlcmVuY2VzIGluIHRoZSBjb3JyZXNwb25kaW5nIGJ5dGVzIGluIHRoZQorLy8vICAgIGRlc3RpbmF0aW9uLiBEaWZmZXJlbmNlcyBsZXNzIHRoYW4gMDBoIGFyZSBzYXR1cmF0ZWQgdG8gMDBoLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZQU1VCVVNCIC8gUFNVQlVTQiBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgbWludWVuZHMuCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIHRoZSBzdWJ0cmFoZW5kcy4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgdW5zaWduZWQgaW50ZWdlcgorLy8vICAgIGRpZmZlcmVuY2VzIG9mIHRoZSB2YWx1ZXMgaW4gdGhlIG9wZXJhbmRzLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zdWJzX2VwdTgoX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHN1YnVzYjEyOCgoX192MTZxaSlfX2EsIChfX3YxNnFpKV9fYik7Cit9CisKKy8vLyBcYnJpZWYgU3VidHJhY3RzIGNvcnJlc3BvbmRpbmcgMTYtYml0IHVuc2lnbmVkIGludGVnZXIgdmFsdWVzIGluIHRoZSBpbnB1dAorLy8vICAgIGFuZCByZXR1cm5zIHRoZSBkaWZmZXJlbmNlcyBpbiB0aGUgY29ycmVzcG9uZGluZyBieXRlcyBpbiB0aGUKKy8vLyAgICBkZXN0aW5hdGlvbi4gRGlmZmVyZW5jZXMgbGVzcyB0aGFuIDAwMDBoIGFyZSBzYXR1cmF0ZWQgdG8gMDAwMGguCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVlBTVUJVU1cgLyBQU1VCVVNXIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIHRoZSBtaW51ZW5kcy4KKy8vLyBccGFyYW0gX19iCisvLy8gICAgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIHN1YnRyYWhlbmRzLgorLy8vIFxyZXR1cm5zIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIHRoZSB1bnNpZ25lZCBpbnRlZ2VyCisvLy8gICAgZGlmZmVyZW5jZXMgb2YgdGhlIHZhbHVlcyBpbiB0aGUgb3BlcmFuZHMuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3N1YnNfZXB1MTYoX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHN1YnVzdzEyOCgoX192OGhpKV9fYSwgKF9fdjhoaSlfX2IpOworfQorCisvLy8gXGJyaWVmIFBlcmZvcm1zIGEgYml0d2lzZSBBTkQgb2YgdHdvIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3JzLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZQQU5EIC8gUEFORCBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyBvbmUgb2YgdGhlIHNvdXJjZSBvcGVyYW5kcy4KKy8vLyBccGFyYW0gX19iCisvLy8gICAgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBzb3VyY2Ugb3BlcmFuZHMuCisvLy8gXHJldHVybnMgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIGJpdHdpc2UgQU5EIG9mIHRoZSB2YWx1ZXMKKy8vLyAgICBpbiBib3RoIG9wZXJhbmRzLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9hbmRfc2kxMjgoX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKQoreworICByZXR1cm4gKF9fbTEyOGkpKChfX3YyZHUpX19hICYgKF9fdjJkdSlfX2IpOworfQorCisvLy8gXGJyaWVmIFBlcmZvcm1zIGEgYml0d2lzZSBBTkQgb2YgdHdvIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3JzLCB1c2luZyB0aGUKKy8vLyAgICBvbmUncyBjb21wbGVtZW50IG9mIHRoZSB2YWx1ZXMgY29udGFpbmVkIGluIHRoZSBmaXJzdCBzb3VyY2Ugb3BlcmFuZC4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWUEFORE4gLyBQQU5ETiBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIGxlZnQgc291cmNlIG9wZXJhbmQuIFRoZSBvbmUncyBjb21wbGVtZW50CisvLy8gICAgb2YgdGhpcyB2YWx1ZSBpcyB1c2VkIGluIHRoZSBiaXR3aXNlIEFORC4KKy8vLyBccGFyYW0gX19iCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBjb250YWluaW5nIHRoZSByaWdodCBzb3VyY2Ugb3BlcmFuZC4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgYml0d2lzZSBBTkQgb2YgdGhlIG9uZSdzCisvLy8gICAgY29tcGxlbWVudCBvZiB0aGUgZmlyc3Qgb3BlcmFuZCBhbmQgdGhlIHZhbHVlcyBpbiB0aGUgc2Vjb25kIG9wZXJhbmQuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2FuZG5vdF9zaTEyOChfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpCit7CisgIHJldHVybiAoX19tMTI4aSkofihfX3YyZHUpX19hICYgKF9fdjJkdSlfX2IpOworfQorLy8vIFxicmllZiBQZXJmb3JtcyBhIGJpdHdpc2UgT1Igb2YgdHdvIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3JzLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZQT1IgLyBQT1IgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBzb3VyY2Ugb3BlcmFuZHMuCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIG9uZSBvZiB0aGUgc291cmNlIG9wZXJhbmRzLgorLy8vIFxyZXR1cm5zIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIHRoZSBiaXR3aXNlIE9SIG9mIHRoZSB2YWx1ZXMKKy8vLyAgICBpbiBib3RoIG9wZXJhbmRzLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9vcl9zaTEyOChfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpCit7CisgIHJldHVybiAoX19tMTI4aSkoKF9fdjJkdSlfX2EgfCAoX192MmR1KV9fYik7Cit9CisKKy8vLyBcYnJpZWYgUGVyZm9ybXMgYSBiaXR3aXNlIGV4Y2x1c2l2ZSBPUiBvZiB0d28gMTI4LWJpdCBpbnRlZ2VyIHZlY3RvcnMuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVlBYT1IgLyBQWE9SIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIG9uZSBvZiB0aGUgc291cmNlIG9wZXJhbmRzLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyBvbmUgb2YgdGhlIHNvdXJjZSBvcGVyYW5kcy4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgYml0d2lzZSBleGNsdXNpdmUgT1Igb2YgdGhlCisvLy8gICAgdmFsdWVzIGluIGJvdGggb3BlcmFuZHMuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3hvcl9zaTEyOChfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpCit7CisgIHJldHVybiAoX19tMTI4aSkoKF9fdjJkdSlfX2EgXiAoX192MmR1KV9fYik7Cit9CisKKy8vLyBcYnJpZWYgTGVmdC1zaGlmdHMgdGhlIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3Igb3BlcmFuZCBieSB0aGUgc3BlY2lmaWVkCisvLy8gICAgbnVtYmVyIG9mIGJ5dGVzLiBMb3ctb3JkZXIgYml0cyBhcmUgY2xlYXJlZC4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFxjb2RlCisvLy8gX19tMTI4aSBfbW1fc2xsaV9zaTEyOChfX20xMjhpIGEsIGNvbnN0IGludCBpbW0pOworLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVlBTTExEUSAvIFBTTExEUSBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBhCisvLy8gICAgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIHNvdXJjZSBvcGVyYW5kLgorLy8vIFxwYXJhbSBpbW0KKy8vLyAgICBBbiBpbW1lZGlhdGUgdmFsdWUgc3BlY2lmeWluZyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGxlZnQtc2hpZnQKKy8vLyAgICBvcGVyYW5kIGEuCisvLy8gXHJldHVybnMgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIGxlZnQtc2hpZnRlZCB2YWx1ZS4KKyNkZWZpbmUgX21tX3NsbGlfc2kxMjgoYSwgaW1tKSBfX2V4dGVuc2lvbl9fICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoX19tMTI4aSlfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvciggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZxaSlfbW1fc2V0emVyb19zaTEyOCgpLCAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnFpKShfX20xMjhpKShhKSwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gIDAgOiAxNiAtIChjaGFyKShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAgMSA6IDE3IC0gKGNoYXIpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/ICAyIDogMTggLSAoY2hhcikoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gIDMgOiAxOSAtIChjaGFyKShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAgNCA6IDIwIC0gKGNoYXIpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/ICA1IDogMjEgLSAoY2hhcikoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gIDYgOiAyMiAtIChjaGFyKShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAgNyA6IDIzIC0gKGNoYXIpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/ICA4IDogMjQgLSAoY2hhcikoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gIDkgOiAyNSAtIChjaGFyKShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAxMCA6IDI2IC0gKGNoYXIpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDExIDogMjcgLSAoY2hhcikoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gMTIgOiAyOCAtIChjaGFyKShpbW0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAxMyA6IDI5IC0gKGNoYXIpKGltbSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDE0IDogMzAgLSAoY2hhcikoaW1tKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gMTUgOiAzMSAtIChjaGFyKShpbW0pKTsgfSkKKworI2RlZmluZSBfbW1fYnNsbGlfc2kxMjgoYSwgaW1tKSBcCisgIF9tbV9zbGxpX3NpMTI4KChhKSwgKGltbSkpCisKKy8vLyBcYnJpZWYgTGVmdC1zaGlmdHMgZWFjaCAxNi1iaXQgdmFsdWUgaW4gdGhlIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3Igb3BlcmFuZAorLy8vICAgIGJ5IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJpdHMuIExvdy1vcmRlciBiaXRzIGFyZSBjbGVhcmVkLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZQU0xMVyAvIFBTTExXIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIHRoZSBzb3VyY2Ugb3BlcmFuZC4KKy8vLyBccGFyYW0gX19jb3VudAorLy8vICAgIEFuIGludGVnZXIgdmFsdWUgc3BlY2lmeWluZyB0aGUgbnVtYmVyIG9mIGJpdHMgdG8gbGVmdC1zaGlmdCBlYWNoIHZhbHVlCisvLy8gICAgaW4gb3BlcmFuZCBfX2EuCisvLy8gXHJldHVybnMgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIGxlZnQtc2hpZnRlZCB2YWx1ZXMuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3NsbGlfZXBpMTYoX19tMTI4aSBfX2EsIGludCBfX2NvdW50KQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHNsbHdpMTI4KChfX3Y4aGkpX19hLCBfX2NvdW50KTsKK30KKworLy8vIFxicmllZiBMZWZ0LXNoaWZ0cyBlYWNoIDE2LWJpdCB2YWx1ZSBpbiB0aGUgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBvcGVyYW5kCisvLy8gICAgYnkgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYml0cy4gTG93LW9yZGVyIGJpdHMgYXJlIGNsZWFyZWQuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVlBTTExXIC8gUFNMTFcgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIHNvdXJjZSBvcGVyYW5kLgorLy8vIFxwYXJhbSBfX2NvdW50CisvLy8gICAgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGluIHdoaWNoIGJpdHMgWzYzOjBdIHNwZWNpZnkgdGhlIG51bWJlciBvZiBiaXRzCisvLy8gICAgdG8gbGVmdC1zaGlmdCBlYWNoIHZhbHVlIGluIG9wZXJhbmQgX19hLgorLy8vIFxyZXR1cm5zIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIHRoZSBsZWZ0LXNoaWZ0ZWQgdmFsdWVzLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zbGxfZXBpMTYoX19tMTI4aSBfX2EsIF9fbTEyOGkgX19jb3VudCkKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BzbGx3MTI4KChfX3Y4aGkpX19hLCAoX192OGhpKV9fY291bnQpOworfQorCisvLy8gXGJyaWVmIExlZnQtc2hpZnRzIGVhY2ggMzItYml0IHZhbHVlIGluIHRoZSAxMjgtYml0IGludGVnZXIgdmVjdG9yIG9wZXJhbmQKKy8vLyAgICBieSB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBiaXRzLiBMb3ctb3JkZXIgYml0cyBhcmUgY2xlYXJlZC4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWUFNMTEQgLyBQU0xMRCBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgc291cmNlIG9wZXJhbmQuCisvLy8gXHBhcmFtIF9fY291bnQKKy8vLyAgICBBbiBpbnRlZ2VyIHZhbHVlIHNwZWNpZnlpbmcgdGhlIG51bWJlciBvZiBiaXRzIHRvIGxlZnQtc2hpZnQgZWFjaCB2YWx1ZQorLy8vICAgIGluIG9wZXJhbmQgX19hLgorLy8vIFxyZXR1cm5zIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIHRoZSBsZWZ0LXNoaWZ0ZWQgdmFsdWVzLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zbGxpX2VwaTMyKF9fbTEyOGkgX19hLCBpbnQgX19jb3VudCkKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BzbGxkaTEyOCgoX192NHNpKV9fYSwgX19jb3VudCk7Cit9CisKKy8vLyBcYnJpZWYgTGVmdC1zaGlmdHMgZWFjaCAzMi1iaXQgdmFsdWUgaW4gdGhlIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3Igb3BlcmFuZAorLy8vICAgIGJ5IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJpdHMuIExvdy1vcmRlciBiaXRzIGFyZSBjbGVhcmVkLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZQU0xMRCAvIFBTTExEIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIHRoZSBzb3VyY2Ugb3BlcmFuZC4KKy8vLyBccGFyYW0gX19jb3VudAorLy8vICAgIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBpbiB3aGljaCBiaXRzIFs2MzowXSBzcGVjaWZ5IHRoZSBudW1iZXIgb2YgYml0cworLy8vICAgIHRvIGxlZnQtc2hpZnQgZWFjaCB2YWx1ZSBpbiBvcGVyYW5kIF9fYS4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgbGVmdC1zaGlmdGVkIHZhbHVlcy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc2xsX2VwaTMyKF9fbTEyOGkgX19hLCBfX20xMjhpIF9fY291bnQpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc2xsZDEyOCgoX192NHNpKV9fYSwgKF9fdjRzaSlfX2NvdW50KTsKK30KKworLy8vIFxicmllZiBMZWZ0LXNoaWZ0cyBlYWNoIDY0LWJpdCB2YWx1ZSBpbiB0aGUgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBvcGVyYW5kCisvLy8gICAgYnkgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYml0cy4gTG93LW9yZGVyIGJpdHMgYXJlIGNsZWFyZWQuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVlBTTExRIC8gUFNMTFEgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIHNvdXJjZSBvcGVyYW5kLgorLy8vIFxwYXJhbSBfX2NvdW50CisvLy8gICAgQW4gaW50ZWdlciB2YWx1ZSBzcGVjaWZ5aW5nIHRoZSBudW1iZXIgb2YgYml0cyB0byBsZWZ0LXNoaWZ0IGVhY2ggdmFsdWUKKy8vLyAgICBpbiBvcGVyYW5kIF9fYS4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgbGVmdC1zaGlmdGVkIHZhbHVlcy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc2xsaV9lcGk2NChfX20xMjhpIF9fYSwgaW50IF9fY291bnQpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9wc2xscWkxMjgoKF9fdjJkaSlfX2EsIF9fY291bnQpOworfQorCisvLy8gXGJyaWVmIExlZnQtc2hpZnRzIGVhY2ggNjQtYml0IHZhbHVlIGluIHRoZSAxMjgtYml0IGludGVnZXIgdmVjdG9yIG9wZXJhbmQKKy8vLyAgICBieSB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBiaXRzLiBMb3ctb3JkZXIgYml0cyBhcmUgY2xlYXJlZC4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWUFNMTFEgLyBQU0xMUSBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgc291cmNlIG9wZXJhbmQuCisvLy8gXHBhcmFtIF9fY291bnQKKy8vLyAgICBBIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3IgaW4gd2hpY2ggYml0cyBbNjM6MF0gc3BlY2lmeSB0aGUgbnVtYmVyIG9mIGJpdHMKKy8vLyAgICB0byBsZWZ0LXNoaWZ0IGVhY2ggdmFsdWUgaW4gb3BlcmFuZCBfX2EuCisvLy8gXHJldHVybnMgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIGxlZnQtc2hpZnRlZCB2YWx1ZXMuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3NsbF9lcGk2NChfX20xMjhpIF9fYSwgX19tMTI4aSBfX2NvdW50KQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcHNsbHExMjgoKF9fdjJkaSlfX2EsIChfX3YyZGkpX19jb3VudCk7Cit9CisKKy8vLyBcYnJpZWYgUmlnaHQtc2hpZnRzIGVhY2ggMTYtYml0IHZhbHVlIGluIHRoZSAxMjgtYml0IGludGVnZXIgdmVjdG9yIG9wZXJhbmQKKy8vLyAgICBieSB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBiaXRzLiBIaWdoLW9yZGVyIGJpdHMgYXJlIGZpbGxlZCB3aXRoIHRoZSBzaWduCisvLy8gICAgYml0IG9mIHRoZSBpbml0aWFsIHZhbHVlLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZQU1JBVyAvIFBTUkFXIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIHRoZSBzb3VyY2Ugb3BlcmFuZC4KKy8vLyBccGFyYW0gX19jb3VudAorLy8vICAgIEFuIGludGVnZXIgdmFsdWUgc3BlY2lmeWluZyB0aGUgbnVtYmVyIG9mIGJpdHMgdG8gcmlnaHQtc2hpZnQgZWFjaCB2YWx1ZQorLy8vICAgIGluIG9wZXJhbmQgX19hLgorLy8vIFxyZXR1cm5zIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIHRoZSByaWdodC1zaGlmdGVkIHZhbHVlcy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc3JhaV9lcGkxNihfX20xMjhpIF9fYSwgaW50IF9fY291bnQpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc3Jhd2kxMjgoKF9fdjhoaSlfX2EsIF9fY291bnQpOworfQorCisvLy8gXGJyaWVmIFJpZ2h0LXNoaWZ0cyBlYWNoIDE2LWJpdCB2YWx1ZSBpbiB0aGUgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBvcGVyYW5kCisvLy8gICAgYnkgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYml0cy4gSGlnaC1vcmRlciBiaXRzIGFyZSBmaWxsZWQgd2l0aCB0aGUgc2lnbgorLy8vICAgIGJpdCBvZiB0aGUgaW5pdGlhbCB2YWx1ZS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWUFNSQVcgLyBQU1JBVyBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgc291cmNlIG9wZXJhbmQuCisvLy8gXHBhcmFtIF9fY291bnQKKy8vLyAgICBBIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3IgaW4gd2hpY2ggYml0cyBbNjM6MF0gc3BlY2lmeSB0aGUgbnVtYmVyIG9mIGJpdHMKKy8vLyAgICB0byByaWdodC1zaGlmdCBlYWNoIHZhbHVlIGluIG9wZXJhbmQgX19hLgorLy8vIFxyZXR1cm5zIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIHRoZSByaWdodC1zaGlmdGVkIHZhbHVlcy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc3JhX2VwaTE2KF9fbTEyOGkgX19hLCBfX20xMjhpIF9fY291bnQpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc3JhdzEyOCgoX192OGhpKV9fYSwgKF9fdjhoaSlfX2NvdW50KTsKK30KKworLy8vIFxicmllZiBSaWdodC1zaGlmdHMgZWFjaCAzMi1iaXQgdmFsdWUgaW4gdGhlIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3Igb3BlcmFuZAorLy8vICAgIGJ5IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJpdHMuIEhpZ2gtb3JkZXIgYml0cyBhcmUgZmlsbGVkIHdpdGggdGhlIHNpZ24KKy8vLyAgICBiaXQgb2YgdGhlIGluaXRpYWwgdmFsdWUuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVlBTUkFEIC8gUFNSQUQgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIHNvdXJjZSBvcGVyYW5kLgorLy8vIFxwYXJhbSBfX2NvdW50CisvLy8gICAgQW4gaW50ZWdlciB2YWx1ZSBzcGVjaWZ5aW5nIHRoZSBudW1iZXIgb2YgYml0cyB0byByaWdodC1zaGlmdCBlYWNoIHZhbHVlCisvLy8gICAgaW4gb3BlcmFuZCBfX2EuCisvLy8gXHJldHVybnMgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIHJpZ2h0LXNoaWZ0ZWQgdmFsdWVzLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zcmFpX2VwaTMyKF9fbTEyOGkgX19hLCBpbnQgX19jb3VudCkKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BzcmFkaTEyOCgoX192NHNpKV9fYSwgX19jb3VudCk7Cit9CisKKy8vLyBcYnJpZWYgUmlnaHQtc2hpZnRzIGVhY2ggMzItYml0IHZhbHVlIGluIHRoZSAxMjgtYml0IGludGVnZXIgdmVjdG9yIG9wZXJhbmQKKy8vLyAgICBieSB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBiaXRzLiBIaWdoLW9yZGVyIGJpdHMgYXJlIGZpbGxlZCB3aXRoIHRoZSBzaWduCisvLy8gICAgYml0IG9mIHRoZSBpbml0aWFsIHZhbHVlLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZQU1JBRCAvIFBTUkFEIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIHRoZSBzb3VyY2Ugb3BlcmFuZC4KKy8vLyBccGFyYW0gX19jb3VudAorLy8vICAgIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBpbiB3aGljaCBiaXRzIFs2MzowXSBzcGVjaWZ5IHRoZSBudW1iZXIgb2YgYml0cworLy8vICAgIHRvIHJpZ2h0LXNoaWZ0IGVhY2ggdmFsdWUgaW4gb3BlcmFuZCBfX2EuCisvLy8gXHJldHVybnMgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIHJpZ2h0LXNoaWZ0ZWQgdmFsdWVzLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zcmFfZXBpMzIoX19tMTI4aSBfX2EsIF9fbTEyOGkgX19jb3VudCkKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BzcmFkMTI4KChfX3Y0c2kpX19hLCAoX192NHNpKV9fY291bnQpOworfQorCisvLy8gXGJyaWVmIFJpZ2h0LXNoaWZ0cyB0aGUgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBvcGVyYW5kIGJ5IHRoZSBzcGVjaWZpZWQKKy8vLyAgICBudW1iZXIgb2YgYnl0ZXMuIEhpZ2gtb3JkZXIgYml0cyBhcmUgY2xlYXJlZC4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFxjb2RlCisvLy8gX19tMTI4aSBfbW1fc3JsaV9zaTEyOChfX20xMjhpIGEsIGNvbnN0IGludCBpbW0pOworLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVlBTUkxEUSAvIFBTUkxEUSBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBhCisvLy8gICAgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIHNvdXJjZSBvcGVyYW5kLgorLy8vIFxwYXJhbSBpbW0KKy8vLyAgICBBbiBpbW1lZGlhdGUgdmFsdWUgc3BlY2lmeWluZyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJpZ2h0LXNoaWZ0IG9wZXJhbmQKKy8vLyAgICBhLgorLy8vIFxyZXR1cm5zIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIHRoZSByaWdodC1zaGlmdGVkIHZhbHVlLgorI2RlZmluZSBfbW1fc3JsaV9zaTEyOChhLCBpbW0pIF9fZXh0ZW5zaW9uX18gKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChfX20xMjhpKV9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnFpKShfX20xMjhpKShhKSwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2cWkpX21tX3NldHplcm9fc2kxMjgoKSwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAxNiA6IChjaGFyKShpbW0pICsgMCwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDE3IDogKGNoYXIpKGltbSkgKyAxLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gMTggOiAoY2hhcikoaW1tKSArIDIsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAxOSA6IChjaGFyKShpbW0pICsgMywgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDIwIDogKGNoYXIpKGltbSkgKyA0LCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gMjEgOiAoY2hhcikoaW1tKSArIDUsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAyMiA6IChjaGFyKShpbW0pICsgNiwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDIzIDogKGNoYXIpKGltbSkgKyA3LCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gMjQgOiAoY2hhcikoaW1tKSArIDgsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAyNSA6IChjaGFyKShpbW0pICsgOSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDI2IDogKGNoYXIpKGltbSkgKyAxMCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gMjcgOiAoY2hhcikoaW1tKSArIDExLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAyOCA6IChjaGFyKShpbW0pICsgMTIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoY2hhcikoaW1tKSYweEYwKSA/IDI5IDogKGNoYXIpKGltbSkgKyAxMywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjaGFyKShpbW0pJjB4RjApID8gMzAgOiAoY2hhcikoaW1tKSArIDE0LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGNoYXIpKGltbSkmMHhGMCkgPyAzMSA6IChjaGFyKShpbW0pICsgMTUpOyB9KQorCisjZGVmaW5lIF9tbV9ic3JsaV9zaTEyOChhLCBpbW0pIFwKKyAgX21tX3NybGlfc2kxMjgoKGEpLCAoaW1tKSkKKworLy8vIFxicmllZiBSaWdodC1zaGlmdHMgZWFjaCBvZiAxNi1iaXQgdmFsdWVzIGluIHRoZSAxMjgtYml0IGludGVnZXIgdmVjdG9yCisvLy8gICAgb3BlcmFuZCBieSB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBiaXRzLiBIaWdoLW9yZGVyIGJpdHMgYXJlIGNsZWFyZWQuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVlBTUkxXIC8gUFNSTFcgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIHNvdXJjZSBvcGVyYW5kLgorLy8vIFxwYXJhbSBfX2NvdW50CisvLy8gICAgQW4gaW50ZWdlciB2YWx1ZSBzcGVjaWZ5aW5nIHRoZSBudW1iZXIgb2YgYml0cyB0byByaWdodC1zaGlmdCBlYWNoIHZhbHVlCisvLy8gICAgaW4gb3BlcmFuZCBfX2EuCisvLy8gXHJldHVybnMgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIHJpZ2h0LXNoaWZ0ZWQgdmFsdWVzLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zcmxpX2VwaTE2KF9fbTEyOGkgX19hLCBpbnQgX19jb3VudCkKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3Bzcmx3aTEyOCgoX192OGhpKV9fYSwgX19jb3VudCk7Cit9CisKKy8vLyBcYnJpZWYgUmlnaHQtc2hpZnRzIGVhY2ggb2YgMTYtYml0IHZhbHVlcyBpbiB0aGUgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvcgorLy8vICAgIG9wZXJhbmQgYnkgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYml0cy4gSGlnaC1vcmRlciBiaXRzIGFyZSBjbGVhcmVkLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZQU1JMVyAvIFBTUkxXIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIHRoZSBzb3VyY2Ugb3BlcmFuZC4KKy8vLyBccGFyYW0gX19jb3VudAorLy8vICAgIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBpbiB3aGljaCBiaXRzIFs2MzowXSBzcGVjaWZ5IHRoZSBudW1iZXIgb2YgYml0cworLy8vICAgIHRvIHJpZ2h0LXNoaWZ0IGVhY2ggdmFsdWUgaW4gb3BlcmFuZCBfX2EuCisvLy8gXHJldHVybnMgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIHJpZ2h0LXNoaWZ0ZWQgdmFsdWVzLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zcmxfZXBpMTYoX19tMTI4aSBfX2EsIF9fbTEyOGkgX19jb3VudCkKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3Bzcmx3MTI4KChfX3Y4aGkpX19hLCAoX192OGhpKV9fY291bnQpOworfQorCisvLy8gXGJyaWVmIFJpZ2h0LXNoaWZ0cyBlYWNoIG9mIDMyLWJpdCB2YWx1ZXMgaW4gdGhlIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3IKKy8vLyAgICBvcGVyYW5kIGJ5IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJpdHMuIEhpZ2gtb3JkZXIgYml0cyBhcmUgY2xlYXJlZC4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWUFNSTEQgLyBQU1JMRCBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgc291cmNlIG9wZXJhbmQuCisvLy8gXHBhcmFtIF9fY291bnQKKy8vLyAgICBBbiBpbnRlZ2VyIHZhbHVlIHNwZWNpZnlpbmcgdGhlIG51bWJlciBvZiBiaXRzIHRvIHJpZ2h0LXNoaWZ0IGVhY2ggdmFsdWUKKy8vLyAgICBpbiBvcGVyYW5kIF9fYS4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgcmlnaHQtc2hpZnRlZCB2YWx1ZXMuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3NybGlfZXBpMzIoX19tMTI4aSBfX2EsIGludCBfX2NvdW50KQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHNybGRpMTI4KChfX3Y0c2kpX19hLCBfX2NvdW50KTsKK30KKworLy8vIFxicmllZiBSaWdodC1zaGlmdHMgZWFjaCBvZiAzMi1iaXQgdmFsdWVzIGluIHRoZSAxMjgtYml0IGludGVnZXIgdmVjdG9yCisvLy8gICAgb3BlcmFuZCBieSB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBiaXRzLiBIaWdoLW9yZGVyIGJpdHMgYXJlIGNsZWFyZWQuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVlBTUkxEIC8gUFNSTEQgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIHNvdXJjZSBvcGVyYW5kLgorLy8vIFxwYXJhbSBfX2NvdW50CisvLy8gICAgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGluIHdoaWNoIGJpdHMgWzYzOjBdIHNwZWNpZnkgdGhlIG51bWJlciBvZiBiaXRzCisvLy8gICAgdG8gcmlnaHQtc2hpZnQgZWFjaCB2YWx1ZSBpbiBvcGVyYW5kIF9fYS4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgcmlnaHQtc2hpZnRlZCB2YWx1ZXMuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3NybF9lcGkzMihfX20xMjhpIF9fYSwgX19tMTI4aSBfX2NvdW50KQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHNybGQxMjgoKF9fdjRzaSlfX2EsIChfX3Y0c2kpX19jb3VudCk7Cit9CisKKy8vLyBcYnJpZWYgUmlnaHQtc2hpZnRzIGVhY2ggb2YgNjQtYml0IHZhbHVlcyBpbiB0aGUgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvcgorLy8vICAgIG9wZXJhbmQgYnkgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYml0cy4gSGlnaC1vcmRlciBiaXRzIGFyZSBjbGVhcmVkLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZQU1JMUSAvIFBTUkxRIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIHRoZSBzb3VyY2Ugb3BlcmFuZC4KKy8vLyBccGFyYW0gX19jb3VudAorLy8vICAgIEFuIGludGVnZXIgdmFsdWUgc3BlY2lmeWluZyB0aGUgbnVtYmVyIG9mIGJpdHMgdG8gcmlnaHQtc2hpZnQgZWFjaCB2YWx1ZQorLy8vICAgIGluIG9wZXJhbmQgX19hLgorLy8vIFxyZXR1cm5zIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIHRoZSByaWdodC1zaGlmdGVkIHZhbHVlcy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc3JsaV9lcGk2NChfX20xMjhpIF9fYSwgaW50IF9fY291bnQpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9wc3JscWkxMjgoKF9fdjJkaSlfX2EsIF9fY291bnQpOworfQorCisvLy8gXGJyaWVmIFJpZ2h0LXNoaWZ0cyBlYWNoIG9mIDY0LWJpdCB2YWx1ZXMgaW4gdGhlIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3IKKy8vLyAgICBvcGVyYW5kIGJ5IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJpdHMuIEhpZ2gtb3JkZXIgYml0cyBhcmUgY2xlYXJlZC4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWUFNSTFEgLyBQU1JMUSBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgc291cmNlIG9wZXJhbmQuCisvLy8gXHBhcmFtIF9fY291bnQKKy8vLyAgICBBIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3IgaW4gd2hpY2ggYml0cyBbNjM6MF0gc3BlY2lmeSB0aGUgbnVtYmVyIG9mIGJpdHMKKy8vLyAgICB0byByaWdodC1zaGlmdCBlYWNoIHZhbHVlIGluIG9wZXJhbmQgX19hLgorLy8vIFxyZXR1cm5zIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIHRoZSByaWdodC1zaGlmdGVkIHZhbHVlcy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc3JsX2VwaTY0KF9fbTEyOGkgX19hLCBfX20xMjhpIF9fY291bnQpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9wc3JscTEyOCgoX192MmRpKV9fYSwgKF9fdjJkaSlfX2NvdW50KTsKK30KKworLy8vIFxicmllZiBDb21wYXJlcyBlYWNoIG9mIHRoZSBjb3JyZXNwb25kaW5nIDgtYml0IHZhbHVlcyBvZiB0aGUgMTI4LWJpdAorLy8vICAgIGludGVnZXIgdmVjdG9ycyBmb3IgZXF1YWxpdHkuIEVhY2ggY29tcGFyaXNvbiB5aWVsZHMgMGggZm9yIGZhbHNlLCBGRmgKKy8vLyAgICBmb3IgdHJ1ZS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWUENNUEVRQiAvIFBDTVBFUUIgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3IuCisvLy8gXHJldHVybnMgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIGNvbXBhcmlzb24gcmVzdWx0cy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY21wZXFfZXBpOChfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpCit7CisgIHJldHVybiAoX19tMTI4aSkoKF9fdjE2cWkpX19hID09IChfX3YxNnFpKV9fYik7Cit9CisKKy8vLyBcYnJpZWYgQ29tcGFyZXMgZWFjaCBvZiB0aGUgY29ycmVzcG9uZGluZyAxNi1iaXQgdmFsdWVzIG9mIHRoZSAxMjgtYml0CisvLy8gICAgaW50ZWdlciB2ZWN0b3JzIGZvciBlcXVhbGl0eS4gRWFjaCBjb21wYXJpc29uIHlpZWxkcyAwaCBmb3IgZmFsc2UsIEZGRkZoCisvLy8gICAgZm9yIHRydWUuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVlBDTVBFUVcgLyBQQ01QRVFXIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3Rvci4KKy8vLyBccGFyYW0gX19iCisvLy8gICAgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yLgorLy8vIFxyZXR1cm5zIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIHRoZSBjb21wYXJpc29uIHJlc3VsdHMuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NtcGVxX2VwaTE2KF9fbTEyOGkgX19hLCBfX20xMjhpIF9fYikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSgoX192OGhpKV9fYSA9PSAoX192OGhpKV9fYik7Cit9CisKKy8vLyBcYnJpZWYgQ29tcGFyZXMgZWFjaCBvZiB0aGUgY29ycmVzcG9uZGluZyAzMi1iaXQgdmFsdWVzIG9mIHRoZSAxMjgtYml0CisvLy8gICAgaW50ZWdlciB2ZWN0b3JzIGZvciBlcXVhbGl0eS4gRWFjaCBjb21wYXJpc29uIHlpZWxkcyAwaCBmb3IgZmFsc2UsCisvLy8gICAgRkZGRkZGRkZoIGZvciB0cnVlLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZQQ01QRVFEIC8gUENNUEVRRCBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3IuCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3Rvci4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgY29tcGFyaXNvbiByZXN1bHRzLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbXBlcV9lcGkzMihfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpCit7CisgIHJldHVybiAoX19tMTI4aSkoKF9fdjRzaSlfX2EgPT0gKF9fdjRzaSlfX2IpOworfQorCisvLy8gXGJyaWVmIENvbXBhcmVzIGVhY2ggb2YgdGhlIGNvcnJlc3BvbmRpbmcgc2lnbmVkIDgtYml0IHZhbHVlcyBvZiB0aGUgMTI4LWJpdAorLy8vICAgIGludGVnZXIgdmVjdG9ycyB0byBkZXRlcm1pbmUgaWYgdGhlIHZhbHVlcyBpbiB0aGUgZmlyc3Qgb3BlcmFuZCBhcmUKKy8vLyAgICBncmVhdGVyIHRoYW4gdGhvc2UgaW4gdGhlIHNlY29uZCBvcGVyYW5kLiBFYWNoIGNvbXBhcmlzb24geWllbGRzIDBoIGZvcgorLy8vICAgIGZhbHNlLCBGRmggZm9yIHRydWUuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVlBDTVBHVEIgLyBQQ01QR1RCIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3Rvci4KKy8vLyBccGFyYW0gX19iCisvLy8gICAgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yLgorLy8vIFxyZXR1cm5zIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIHRoZSBjb21wYXJpc29uIHJlc3VsdHMuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NtcGd0X2VwaTgoX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKQoreworICAvKiBUaGlzIGZ1bmN0aW9uIGFsd2F5cyBwZXJmb3JtcyBhIHNpZ25lZCBjb21wYXJpc29uLCBidXQgX192MTZxaSBpcyBhIGNoYXIKKyAgICAgd2hpY2ggbWF5IGJlIHNpZ25lZCBvciB1bnNpZ25lZCwgc28gdXNlIF9fdjE2cXMuICovCisgIHJldHVybiAoX19tMTI4aSkoKF9fdjE2cXMpX19hID4gKF9fdjE2cXMpX19iKTsKK30KKworLy8vIFxicmllZiBDb21wYXJlcyBlYWNoIG9mIHRoZSBjb3JyZXNwb25kaW5nIHNpZ25lZCAxNi1iaXQgdmFsdWVzIG9mIHRoZQorLy8vICAgIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3JzIHRvIGRldGVybWluZSBpZiB0aGUgdmFsdWVzIGluIHRoZSBmaXJzdCBvcGVyYW5kCisvLy8gICAgYXJlIGdyZWF0ZXIgdGhhbiB0aG9zZSBpbiB0aGUgc2Vjb25kIG9wZXJhbmQuIEVhY2ggY29tcGFyaXNvbiB5aWVsZHMgMGgKKy8vLyAgICBmb3IgZmFsc2UsIEZGRkZoIGZvciB0cnVlLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZQQ01QR1RXIC8gUENNUEdUVyBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3IuCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3Rvci4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgY29tcGFyaXNvbiByZXN1bHRzLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbXBndF9lcGkxNihfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpCit7CisgIHJldHVybiAoX19tMTI4aSkoKF9fdjhoaSlfX2EgPiAoX192OGhpKV9fYik7Cit9CisKKy8vLyBcYnJpZWYgQ29tcGFyZXMgZWFjaCBvZiB0aGUgY29ycmVzcG9uZGluZyBzaWduZWQgMzItYml0IHZhbHVlcyBvZiB0aGUKKy8vLyAgICAxMjgtYml0IGludGVnZXIgdmVjdG9ycyB0byBkZXRlcm1pbmUgaWYgdGhlIHZhbHVlcyBpbiB0aGUgZmlyc3Qgb3BlcmFuZAorLy8vICAgIGFyZSBncmVhdGVyIHRoYW4gdGhvc2UgaW4gdGhlIHNlY29uZCBvcGVyYW5kLiBFYWNoIGNvbXBhcmlzb24geWllbGRzIDBoCisvLy8gICAgZm9yIGZhbHNlLCBGRkZGRkZGRmggZm9yIHRydWUuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVlBDTVBHVEQgLyBQQ01QR1REIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3Rvci4KKy8vLyBccGFyYW0gX19iCisvLy8gICAgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yLgorLy8vIFxyZXR1cm5zIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIHRoZSBjb21wYXJpc29uIHJlc3VsdHMuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NtcGd0X2VwaTMyKF9fbTEyOGkgX19hLCBfX20xMjhpIF9fYikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSgoX192NHNpKV9fYSA+IChfX3Y0c2kpX19iKTsKK30KKworLy8vIFxicmllZiBDb21wYXJlcyBlYWNoIG9mIHRoZSBjb3JyZXNwb25kaW5nIHNpZ25lZCA4LWJpdCB2YWx1ZXMgb2YgdGhlIDEyOC1iaXQKKy8vLyAgICBpbnRlZ2VyIHZlY3RvcnMgdG8gZGV0ZXJtaW5lIGlmIHRoZSB2YWx1ZXMgaW4gdGhlIGZpcnN0IG9wZXJhbmQgYXJlIGxlc3MKKy8vLyAgICB0aGFuIHRob3NlIGluIHRoZSBzZWNvbmQgb3BlcmFuZC4gRWFjaCBjb21wYXJpc29uIHlpZWxkcyAwaCBmb3IgZmFsc2UsCisvLy8gICAgRkZoIGZvciB0cnVlLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZQQ01QR1RCIC8gUENNUEdUQiBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3IuCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3Rvci4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgY29tcGFyaXNvbiByZXN1bHRzLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbXBsdF9lcGk4KF9fbTEyOGkgX19hLCBfX20xMjhpIF9fYikKK3sKKyAgcmV0dXJuIF9tbV9jbXBndF9lcGk4KF9fYiwgX19hKTsKK30KKworLy8vIFxicmllZiBDb21wYXJlcyBlYWNoIG9mIHRoZSBjb3JyZXNwb25kaW5nIHNpZ25lZCAxNi1iaXQgdmFsdWVzIG9mIHRoZQorLy8vICAgIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3JzIHRvIGRldGVybWluZSBpZiB0aGUgdmFsdWVzIGluIHRoZSBmaXJzdCBvcGVyYW5kCisvLy8gICAgYXJlIGxlc3MgdGhhbiB0aG9zZSBpbiB0aGUgc2Vjb25kIG9wZXJhbmQuIEVhY2ggY29tcGFyaXNvbiB5aWVsZHMgMGggZm9yCisvLy8gICAgZmFsc2UsIEZGRkZoIGZvciB0cnVlLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZQQ01QR1RXIC8gUENNUEdUVyBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3IuCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3Rvci4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgY29tcGFyaXNvbiByZXN1bHRzLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbXBsdF9lcGkxNihfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpCit7CisgIHJldHVybiBfbW1fY21wZ3RfZXBpMTYoX19iLCBfX2EpOworfQorCisvLy8gXGJyaWVmIENvbXBhcmVzIGVhY2ggb2YgdGhlIGNvcnJlc3BvbmRpbmcgc2lnbmVkIDMyLWJpdCB2YWx1ZXMgb2YgdGhlCisvLy8gICAgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvcnMgdG8gZGV0ZXJtaW5lIGlmIHRoZSB2YWx1ZXMgaW4gdGhlIGZpcnN0IG9wZXJhbmQKKy8vLyAgICBhcmUgbGVzcyB0aGFuIHRob3NlIGluIHRoZSBzZWNvbmQgb3BlcmFuZC4gRWFjaCBjb21wYXJpc29uIHlpZWxkcyAwaCBmb3IKKy8vLyAgICBmYWxzZSwgRkZGRkZGRkZoIGZvciB0cnVlLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZQQ01QR1REIC8gUENNUEdURCBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3IuCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3Rvci4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgY29tcGFyaXNvbiByZXN1bHRzLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbXBsdF9lcGkzMihfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpCit7CisgIHJldHVybiBfbW1fY21wZ3RfZXBpMzIoX19iLCBfX2EpOworfQorCisjaWZkZWYgX194ODZfNjRfXworLy8vIFxicmllZiBDb252ZXJ0cyBhIDY0LWJpdCBzaWduZWQgaW50ZWdlciB2YWx1ZSBmcm9tIHRoZSBzZWNvbmQgb3BlcmFuZCBpbnRvIGEKKy8vLyAgICBkb3VibGUtcHJlY2lzaW9uIHZhbHVlIGFuZCByZXR1cm5zIGl0IGluIHRoZSBsb3dlciBlbGVtZW50IG9mIGEgWzIgeAorLy8vICAgIGRvdWJsZV0gdmVjdG9yOyB0aGUgdXBwZXIgZWxlbWVudCBvZiB0aGUgcmV0dXJuZWQgdmVjdG9yIGlzIGNvcGllZCBmcm9tCisvLy8gICAgdGhlIHVwcGVyIGVsZW1lbnQgb2YgdGhlIGZpcnN0IG9wZXJhbmQuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVkNWVFNJMlNEIC8gQ1ZUU0kyU0QgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbMiB4IGRvdWJsZV0uIFRoZSB1cHBlciA2NCBiaXRzIG9mIHRoaXMgb3BlcmFuZCBhcmUKKy8vLyAgICBjb3BpZWQgdG8gdGhlIHVwcGVyIDY0IGJpdHMgb2YgdGhlIGRlc3RpbmF0aW9uLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDY0LWJpdCBzaWduZWQgaW50ZWdlciBvcGVyYW5kIGNvbnRhaW5pbmcgdGhlIHZhbHVlIHRvIGJlIGNvbnZlcnRlZC4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgdmVjdG9yIG9mIFsyIHggZG91YmxlXSB3aG9zZSBsb3dlciA2NCBiaXRzIGNvbnRhaW4gdGhlCisvLy8gICAgY29udmVydGVkIHZhbHVlIG9mIHRoZSBzZWNvbmQgb3BlcmFuZC4gVGhlIHVwcGVyIDY0IGJpdHMgYXJlIGNvcGllZCBmcm9tCisvLy8gICAgdGhlIHVwcGVyIDY0IGJpdHMgb2YgdGhlIGZpcnN0IG9wZXJhbmQuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2N2dHNpNjRfc2QoX19tMTI4ZCBfX2EsIGxvbmcgbG9uZyBfX2IpCit7CisgIF9fYVswXSA9IF9fYjsKKyAgcmV0dXJuIF9fYTsKK30KKworLy8vIFxicmllZiBDb252ZXJ0cyB0aGUgZmlyc3QgKGxvd2VyKSBlbGVtZW50IG9mIGEgdmVjdG9yIG9mIFsyIHggZG91YmxlXSBpbnRvIGEKKy8vLyAgICA2NC1iaXQgc2lnbmVkIGludGVnZXIgdmFsdWUsIGFjY29yZGluZyB0byB0aGUgY3VycmVudCByb3VuZGluZyBtb2RlLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZDVlRTRDJTSSAvIENWVFNEMlNJIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzIgeCBkb3VibGVdLiBUaGUgbG93ZXIgNjQgYml0cyBhcmUgdXNlZCBpbiB0aGUKKy8vLyAgICBjb252ZXJzaW9uLgorLy8vIFxyZXR1cm5zIEEgNjQtYml0IHNpZ25lZCBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIGNvbnZlcnRlZCB2YWx1ZS4KK3N0YXRpYyBfX2lubGluZV9fIGxvbmcgbG9uZyBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jdnRzZF9zaTY0KF9fbTEyOGQgX19hKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfY3Z0c2Qyc2k2NCgoX192MmRmKV9fYSk7Cit9CisKKy8vLyBcYnJpZWYgQ29udmVydHMgdGhlIGZpcnN0IChsb3dlcikgZWxlbWVudCBvZiBhIHZlY3RvciBvZiBbMiB4IGRvdWJsZV0gaW50byBhCisvLy8gICAgNjQtYml0IHNpZ25lZCBpbnRlZ2VyIHZhbHVlLCB0cnVuY2F0aW5nIHRoZSByZXN1bHQgd2hlbiBpdCBpcyBpbmV4YWN0LgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZDVlRUU0QyU0kgLyBDVlRUU0QyU0kgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbMiB4IGRvdWJsZV0uIFRoZSBsb3dlciA2NCBiaXRzIGFyZSB1c2VkIGluIHRoZQorLy8vICAgIGNvbnZlcnNpb24uCisvLy8gXHJldHVybnMgQSA2NC1iaXQgc2lnbmVkIGludGVnZXIgY29udGFpbmluZyB0aGUgY29udmVydGVkIHZhbHVlLgorc3RhdGljIF9faW5saW5lX18gbG9uZyBsb25nIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2N2dHRzZF9zaTY0KF9fbTEyOGQgX19hKQoreworICByZXR1cm4gX19hWzBdOworfQorI2VuZGlmCisKKy8vLyBcYnJpZWYgQ29udmVydHMgYSB2ZWN0b3Igb2YgWzQgeCBpMzJdIGludG8gYSB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVkNWVERRMlBTIC8gQ1ZURFEyUFMgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yLgorLy8vIFxyZXR1cm5zIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0gY29udGFpbmluZyB0aGUgY29udmVydGVkIHZhbHVlcy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jdnRlcGkzMl9wcyhfX20xMjhpIF9fYSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2N2dGRxMnBzKChfX3Y0c2kpX19hKTsKK30KKworLy8vIFxicmllZiBDb252ZXJ0cyBhIHZlY3RvciBvZiBbNCB4IGZsb2F0XSBpbnRvIGEgdmVjdG9yIG9mIFs0IHggaTMyXS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWQ1ZUUFMyRFEgLyBDVlRQUzJEUSBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdLgorLy8vIFxyZXR1cm5zIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbNCB4IGkzMl0gY29udGFpbmluZyB0aGUgY29udmVydGVkCisvLy8gICAgdmFsdWVzLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jdnRwc19lcGkzMihfX20xMjggX19hKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfY3Z0cHMyZHEoKF9fdjRzZilfX2EpOworfQorCisvLy8gXGJyaWVmIENvbnZlcnRzIGEgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGludG8gYSB2ZWN0b3Igb2YgWzQgeCBpMzJdLAorLy8vICAgIHRydW5jYXRpbmcgdGhlIHJlc3VsdCB3aGVuIGl0IGlzIGluZXhhY3QuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVkNWVFRQUzJEUSAvIENWVFRQUzJEUSBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdLgorLy8vIFxyZXR1cm5zIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBpMzJdIGNvbnRhaW5pbmcgdGhlIGNvbnZlcnRlZCB2YWx1ZXMuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2N2dHRwc19lcGkzMihfX20xMjggX19hKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2NvbnZlcnR2ZWN0b3IoKF9fdjRzZilfX2EsIF9fdjRzaSk7Cit9CisKKy8vLyBcYnJpZWYgUmV0dXJucyBhIHZlY3RvciBvZiBbNCB4IGkzMl0gd2hlcmUgdGhlIGxvd2VzdCBlbGVtZW50IGlzIHRoZSBpbnB1dAorLy8vICAgIG9wZXJhbmQgYW5kIHRoZSByZW1haW5pbmcgZWxlbWVudHMgYXJlIHplcm8uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVk1PVkQgLyBNT1ZEIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMzItYml0IHNpZ25lZCBpbnRlZ2VyIG9wZXJhbmQuCisvLy8gXHJldHVybnMgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGkzMl0uCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2N2dHNpMzJfc2kxMjgoaW50IF9fYSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKShfX3Y0c2kpeyBfX2EsIDAsIDAsIDAgfTsKK30KKworI2lmZGVmIF9feDg2XzY0X18KKy8vLyBcYnJpZWYgUmV0dXJucyBhIHZlY3RvciBvZiBbMiB4IGk2NF0gd2hlcmUgdGhlIGxvd2VyIGVsZW1lbnQgaXMgdGhlIGlucHV0CisvLy8gICAgb3BlcmFuZCBhbmQgdGhlIHVwcGVyIGVsZW1lbnQgaXMgemVyby4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWTU9WUSAvIE1PVlEgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSA2NC1iaXQgc2lnbmVkIGludGVnZXIgb3BlcmFuZCBjb250YWluaW5nIHRoZSB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQuCisvLy8gXHJldHVybnMgQSAxMjgtYml0IHZlY3RvciBvZiBbMiB4IGk2NF0gY29udGFpbmluZyB0aGUgY29udmVydGVkIHZhbHVlLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jdnRzaTY0X3NpMTI4KGxvbmcgbG9uZyBfX2EpCit7CisgIHJldHVybiAoX19tMTI4aSl7IF9fYSwgMCB9OworfQorI2VuZGlmCisKKy8vLyBcYnJpZWYgTW92ZXMgdGhlIGxlYXN0IHNpZ25pZmljYW50IDMyIGJpdHMgb2YgYSB2ZWN0b3Igb2YgWzQgeCBpMzJdIHRvIGEKKy8vLyAgICAzMi1iaXQgc2lnbmVkIGludGVnZXIgdmFsdWUuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVk1PVkQgLyBNT1ZEIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgdmVjdG9yIG9mIFs0IHggaTMyXS4gVGhlIGxlYXN0IHNpZ25pZmljYW50IDMyIGJpdHMgYXJlIG1vdmVkIHRvIHRoZQorLy8vICAgIGRlc3RpbmF0aW9uLgorLy8vIFxyZXR1cm5zIEEgMzItYml0IHNpZ25lZCBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIG1vdmVkIHZhbHVlLgorc3RhdGljIF9faW5saW5lX18gaW50IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2N2dHNpMTI4X3NpMzIoX19tMTI4aSBfX2EpCit7CisgIF9fdjRzaSBfX2IgPSAoX192NHNpKV9fYTsKKyAgcmV0dXJuIF9fYlswXTsKK30KKworI2lmZGVmIF9feDg2XzY0X18KKy8vLyBcYnJpZWYgTW92ZXMgdGhlIGxlYXN0IHNpZ25pZmljYW50IDY0IGJpdHMgb2YgYSB2ZWN0b3Igb2YgWzIgeCBpNjRdIHRvIGEKKy8vLyAgICA2NC1iaXQgc2lnbmVkIGludGVnZXIgdmFsdWUuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVk1PVlEgLyBNT1ZRIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgdmVjdG9yIG9mIFsyIHggaTY0XS4gVGhlIGxlYXN0IHNpZ25pZmljYW50IDY0IGJpdHMgYXJlIG1vdmVkIHRvIHRoZQorLy8vICAgIGRlc3RpbmF0aW9uLgorLy8vIFxyZXR1cm5zIEEgNjQtYml0IHNpZ25lZCBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIG1vdmVkIHZhbHVlLgorc3RhdGljIF9faW5saW5lX18gbG9uZyBsb25nIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2N2dHNpMTI4X3NpNjQoX19tMTI4aSBfX2EpCit7CisgIHJldHVybiBfX2FbMF07Cit9CisjZW5kaWYKKworLy8vIFxicmllZiBNb3ZlcyBwYWNrZWQgaW50ZWdlciB2YWx1ZXMgZnJvbSBhbiBhbGlnbmVkIDEyOC1iaXQgbWVtb3J5IGxvY2F0aW9uCisvLy8gICAgdG8gZWxlbWVudHMgaW4gYSAxMjgtYml0IGludGVnZXIgdmVjdG9yLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZNT1ZEUUEgLyBNT1ZEUUEgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19wCisvLy8gICAgQW4gYWxpZ25lZCBwb2ludGVyIHRvIGEgbWVtb3J5IGxvY2F0aW9uIGNvbnRhaW5pbmcgaW50ZWdlciB2YWx1ZXMuCisvLy8gXHJldHVybnMgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIG1vdmVkIHZhbHVlcy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbG9hZF9zaTEyOChfX20xMjhpIGNvbnN0ICpfX3ApCit7CisgIHJldHVybiAqX19wOworfQorCisvLy8gXGJyaWVmIE1vdmVzIHBhY2tlZCBpbnRlZ2VyIHZhbHVlcyBmcm9tIGFuIHVuYWxpZ25lZCAxMjgtYml0IG1lbW9yeSBsb2NhdGlvbgorLy8vICAgIHRvIGVsZW1lbnRzIGluIGEgMTI4LWJpdCBpbnRlZ2VyIHZlY3Rvci4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWTU9WRFFVIC8gTU9WRFFVIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fcAorLy8vICAgIEEgcG9pbnRlciB0byBhIG1lbW9yeSBsb2NhdGlvbiBjb250YWluaW5nIGludGVnZXIgdmFsdWVzLgorLy8vIFxyZXR1cm5zIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIHRoZSBtb3ZlZCB2YWx1ZXMuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2xvYWR1X3NpMTI4KF9fbTEyOGkgY29uc3QgKl9fcCkKK3sKKyAgc3RydWN0IF9fbG9hZHVfc2kxMjggeworICAgIF9fbTEyOGkgX192OworICB9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18sIF9fbWF5X2FsaWFzX18pKTsKKyAgcmV0dXJuICgoc3RydWN0IF9fbG9hZHVfc2kxMjgqKV9fcCktPl9fdjsKK30KKworLy8vIFxicmllZiBSZXR1cm5zIGEgdmVjdG9yIG9mIFsyIHggaTY0XSB3aGVyZSB0aGUgbG93ZXIgZWxlbWVudCBpcyB0YWtlbiBmcm9tCisvLy8gICAgdGhlIGxvd2VyIGVsZW1lbnQgb2YgdGhlIG9wZXJhbmQsIGFuZCB0aGUgdXBwZXIgZWxlbWVudCBpcyB6ZXJvLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZNT1ZRIC8gTU9WUSBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX3AKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFsyIHggaTY0XS4gQml0cyBbNjM6MF0gYXJlIHdyaXR0ZW4gdG8gYml0cyBbNjM6MF0gb2YKKy8vLyAgICB0aGUgZGVzdGluYXRpb24uCisvLy8gXHJldHVybnMgQSAxMjgtYml0IHZlY3RvciBvZiBbMiB4IGk2NF0uIFRoZSBsb3dlciBvcmRlciBiaXRzIGNvbnRhaW4gdGhlCisvLy8gICAgbW92ZWQgdmFsdWUuIFRoZSBoaWdoZXIgb3JkZXIgYml0cyBhcmUgY2xlYXJlZC4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbG9hZGxfZXBpNjQoX19tMTI4aSBjb25zdCAqX19wKQoreworICBzdHJ1Y3QgX19tbV9sb2FkbF9lcGk2NF9zdHJ1Y3QgeworICAgIGxvbmcgbG9uZyBfX3U7CisgIH0gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXywgX19tYXlfYWxpYXNfXykpOworICByZXR1cm4gKF9fbTEyOGkpIHsgKChzdHJ1Y3QgX19tbV9sb2FkbF9lcGk2NF9zdHJ1Y3QqKV9fcCktPl9fdSwgMH07Cit9CisKKy8vLyBcYnJpZWYgR2VuZXJhdGVzIGEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBpMzJdIHdpdGggdW5zcGVjaWZpZWQgY29udGVudC4KKy8vLyAgICBUaGlzIGNvdWxkIGJlIHVzZWQgYXMgYW4gYXJndW1lbnQgdG8gYW5vdGhlciBpbnRyaW5zaWMgZnVuY3Rpb24gd2hlcmUgdGhlCisvLy8gICAgYXJndW1lbnQgaXMgcmVxdWlyZWQgYnV0IHRoZSB2YWx1ZSBpcyBub3QgYWN0dWFsbHkgdXNlZC4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGhhcyBubyBjb3JyZXNwb25kaW5nIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHJldHVybnMgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGkzMl0gd2l0aCB1bnNwZWNpZmllZCBjb250ZW50Lgorc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV91bmRlZmluZWRfc2kxMjgodm9pZCkKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3VuZGVmMTI4KCk7Cit9CisKKy8vLyBcYnJpZWYgSW5pdGlhbGl6ZXMgYm90aCA2NC1iaXQgdmFsdWVzIGluIGEgMTI4LWJpdCB2ZWN0b3Igb2YgWzIgeCBpNjRdIHdpdGgKKy8vLyAgICB0aGUgc3BlY2lmaWVkIDY0LWJpdCBpbnRlZ2VyIHZhbHVlcy4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGlzIGEgdXRpbGl0eSBmdW5jdGlvbiBhbmQgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhIHNwZWNpZmljCisvLy8gICAgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19xMQorLy8vICAgIEEgNjQtYml0IGludGVnZXIgdmFsdWUgdXNlZCB0byBpbml0aWFsaXplIHRoZSB1cHBlciA2NCBiaXRzIG9mIHRoZQorLy8vICAgIGRlc3RpbmF0aW9uIHZlY3RvciBvZiBbMiB4IGk2NF0uCisvLy8gXHBhcmFtIF9fcTAKKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIHZhbHVlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgbG93ZXIgNjQgYml0cyBvZiB0aGUKKy8vLyAgICBkZXN0aW5hdGlvbiB2ZWN0b3Igb2YgWzIgeCBpNjRdLgorLy8vIFxyZXR1cm5zIEFuIGluaXRpYWxpemVkIDEyOC1iaXQgdmVjdG9yIG9mIFsyIHggaTY0XSBjb250YWluaW5nIHRoZSB2YWx1ZXMKKy8vLyAgICBwcm92aWRlZCBpbiB0aGUgb3BlcmFuZHMuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3NldF9lcGk2NHgobG9uZyBsb25nIF9fcTEsIGxvbmcgbG9uZyBfX3EwKQoreworICByZXR1cm4gKF9fbTEyOGkpeyBfX3EwLCBfX3ExIH07Cit9CisKKy8vLyBcYnJpZWYgSW5pdGlhbGl6ZXMgYm90aCA2NC1iaXQgdmFsdWVzIGluIGEgMTI4LWJpdCB2ZWN0b3Igb2YgWzIgeCBpNjRdIHdpdGgKKy8vLyAgICB0aGUgc3BlY2lmaWVkIDY0LWJpdCBpbnRlZ2VyIHZhbHVlcy4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGlzIGEgdXRpbGl0eSBmdW5jdGlvbiBhbmQgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhIHNwZWNpZmljCisvLy8gICAgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19xMQorLy8vICAgIEEgNjQtYml0IGludGVnZXIgdmFsdWUgdXNlZCB0byBpbml0aWFsaXplIHRoZSB1cHBlciA2NCBiaXRzIG9mIHRoZQorLy8vICAgIGRlc3RpbmF0aW9uIHZlY3RvciBvZiBbMiB4IGk2NF0uCisvLy8gXHBhcmFtIF9fcTAKKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIHZhbHVlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgbG93ZXIgNjQgYml0cyBvZiB0aGUKKy8vLyAgICBkZXN0aW5hdGlvbiB2ZWN0b3Igb2YgWzIgeCBpNjRdLgorLy8vIFxyZXR1cm5zIEFuIGluaXRpYWxpemVkIDEyOC1iaXQgdmVjdG9yIG9mIFsyIHggaTY0XSBjb250YWluaW5nIHRoZSB2YWx1ZXMKKy8vLyAgICBwcm92aWRlZCBpbiB0aGUgb3BlcmFuZHMuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3NldF9lcGk2NChfX202NCBfX3ExLCBfX202NCBfX3EwKQoreworICByZXR1cm4gKF9fbTEyOGkpeyAobG9uZyBsb25nKV9fcTAsIChsb25nIGxvbmcpX19xMSB9OworfQorCisvLy8gXGJyaWVmIEluaXRpYWxpemVzIHRoZSAzMi1iaXQgdmFsdWVzIGluIGEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBpMzJdIHdpdGgKKy8vLyAgICB0aGUgc3BlY2lmaWVkIDMyLWJpdCBpbnRlZ2VyIHZhbHVlcy4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGlzIGEgdXRpbGl0eSBmdW5jdGlvbiBhbmQgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhIHNwZWNpZmljCisvLy8gICAgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19pMworLy8vICAgIEEgMzItYml0IGludGVnZXIgdmFsdWUgdXNlZCB0byBpbml0aWFsaXplIGJpdHMgWzEyNzo5Nl0gb2YgdGhlCisvLy8gICAgZGVzdGluYXRpb24gdmVjdG9yLgorLy8vIFxwYXJhbSBfX2kyCisvLy8gICAgQSAzMi1iaXQgaW50ZWdlciB2YWx1ZSB1c2VkIHRvIGluaXRpYWxpemUgYml0cyBbOTU6NjRdIG9mIHRoZSBkZXN0aW5hdGlvbgorLy8vICAgIHZlY3Rvci4KKy8vLyBccGFyYW0gX19pMQorLy8vICAgIEEgMzItYml0IGludGVnZXIgdmFsdWUgdXNlZCB0byBpbml0aWFsaXplIGJpdHMgWzYzOjMyXSBvZiB0aGUgZGVzdGluYXRpb24KKy8vLyAgICB2ZWN0b3IuCisvLy8gXHBhcmFtIF9faTAKKy8vLyAgICBBIDMyLWJpdCBpbnRlZ2VyIHZhbHVlIHVzZWQgdG8gaW5pdGlhbGl6ZSBiaXRzIFszMTowXSBvZiB0aGUgZGVzdGluYXRpb24KKy8vLyAgICB2ZWN0b3IuCisvLy8gXHJldHVybnMgQW4gaW5pdGlhbGl6ZWQgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBpMzJdIGNvbnRhaW5pbmcgdGhlIHZhbHVlcworLy8vICAgIHByb3ZpZGVkIGluIHRoZSBvcGVyYW5kcy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc2V0X2VwaTMyKGludCBfX2kzLCBpbnQgX19pMiwgaW50IF9faTEsIGludCBfX2kwKQoreworICByZXR1cm4gKF9fbTEyOGkpKF9fdjRzaSl7IF9faTAsIF9faTEsIF9faTIsIF9faTN9OworfQorCisvLy8gXGJyaWVmIEluaXRpYWxpemVzIHRoZSAxNi1iaXQgdmFsdWVzIGluIGEgMTI4LWJpdCB2ZWN0b3Igb2YgWzggeCBpMTZdIHdpdGgKKy8vLyAgICB0aGUgc3BlY2lmaWVkIDE2LWJpdCBpbnRlZ2VyIHZhbHVlcy4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGlzIGEgdXRpbGl0eSBmdW5jdGlvbiBhbmQgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhIHNwZWNpZmljCisvLy8gICAgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX193NworLy8vICAgIEEgMTYtYml0IGludGVnZXIgdmFsdWUgdXNlZCB0byBpbml0aWFsaXplIGJpdHMgWzEyNzoxMTJdIG9mIHRoZQorLy8vICAgIGRlc3RpbmF0aW9uIHZlY3Rvci4KKy8vLyBccGFyYW0gX193NgorLy8vICAgIEEgMTYtYml0IGludGVnZXIgdmFsdWUgdXNlZCB0byBpbml0aWFsaXplIGJpdHMgWzExMTo5Nl0gb2YgdGhlCisvLy8gICAgZGVzdGluYXRpb24gdmVjdG9yLgorLy8vIFxwYXJhbSBfX3c1CisvLy8gICAgQSAxNi1iaXQgaW50ZWdlciB2YWx1ZSB1c2VkIHRvIGluaXRpYWxpemUgYml0cyBbOTU6ODBdIG9mIHRoZSBkZXN0aW5hdGlvbgorLy8vICAgIHZlY3Rvci4KKy8vLyBccGFyYW0gX193NAorLy8vICAgIEEgMTYtYml0IGludGVnZXIgdmFsdWUgdXNlZCB0byBpbml0aWFsaXplIGJpdHMgWzc5OjY0XSBvZiB0aGUgZGVzdGluYXRpb24KKy8vLyAgICB2ZWN0b3IuCisvLy8gXHBhcmFtIF9fdzMKKy8vLyAgICBBIDE2LWJpdCBpbnRlZ2VyIHZhbHVlIHVzZWQgdG8gaW5pdGlhbGl6ZSBiaXRzIFs2Mzo0OF0gb2YgdGhlIGRlc3RpbmF0aW9uCisvLy8gICAgdmVjdG9yLgorLy8vIFxwYXJhbSBfX3cyCisvLy8gICAgQSAxNi1iaXQgaW50ZWdlciB2YWx1ZSB1c2VkIHRvIGluaXRpYWxpemUgYml0cyBbNDc6MzJdIG9mIHRoZSBkZXN0aW5hdGlvbgorLy8vICAgIHZlY3Rvci4KKy8vLyBccGFyYW0gX193MQorLy8vICAgIEEgMTYtYml0IGludGVnZXIgdmFsdWUgdXNlZCB0byBpbml0aWFsaXplIGJpdHMgWzMxOjE2XSBvZiB0aGUgZGVzdGluYXRpb24KKy8vLyAgICB2ZWN0b3IuCisvLy8gXHBhcmFtIF9fdzAKKy8vLyAgICBBIDE2LWJpdCBpbnRlZ2VyIHZhbHVlIHVzZWQgdG8gaW5pdGlhbGl6ZSBiaXRzIFsxNTowXSBvZiB0aGUgZGVzdGluYXRpb24KKy8vLyAgICB2ZWN0b3IuCisvLy8gXHJldHVybnMgQW4gaW5pdGlhbGl6ZWQgMTI4LWJpdCB2ZWN0b3Igb2YgWzggeCBpMTZdIGNvbnRhaW5pbmcgdGhlIHZhbHVlcworLy8vICAgIHByb3ZpZGVkIGluIHRoZSBvcGVyYW5kcy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc2V0X2VwaTE2KHNob3J0IF9fdzcsIHNob3J0IF9fdzYsIHNob3J0IF9fdzUsIHNob3J0IF9fdzQsIHNob3J0IF9fdzMsIHNob3J0IF9fdzIsIHNob3J0IF9fdzEsIHNob3J0IF9fdzApCit7CisgIHJldHVybiAoX19tMTI4aSkoX192OGhpKXsgX193MCwgX193MSwgX193MiwgX193MywgX193NCwgX193NSwgX193NiwgX193NyB9OworfQorCisvLy8gXGJyaWVmIEluaXRpYWxpemVzIHRoZSA4LWJpdCB2YWx1ZXMgaW4gYSAxMjgtYml0IHZlY3RvciBvZiBbMTYgeCBpOF0gd2l0aAorLy8vICAgIHRoZSBzcGVjaWZpZWQgOC1iaXQgaW50ZWdlciB2YWx1ZXMuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBpcyBhIHV0aWxpdHkgZnVuY3Rpb24gYW5kIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYSBzcGVjaWZpYworLy8vICAgIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYjE1CisvLy8gICAgSW5pdGlhbGl6ZXMgYml0cyBbMTI3OjEyMF0gb2YgdGhlIGRlc3RpbmF0aW9uIHZlY3Rvci4KKy8vLyBccGFyYW0gX19iMTQKKy8vLyAgICBJbml0aWFsaXplcyBiaXRzIFsxMTk6MTEyXSBvZiB0aGUgZGVzdGluYXRpb24gdmVjdG9yLgorLy8vIFxwYXJhbSBfX2IxMworLy8vICAgIEluaXRpYWxpemVzIGJpdHMgWzExMToxMDRdIG9mIHRoZSBkZXN0aW5hdGlvbiB2ZWN0b3IuCisvLy8gXHBhcmFtIF9fYjEyCisvLy8gICAgSW5pdGlhbGl6ZXMgYml0cyBbMTAzOjk2XSBvZiB0aGUgZGVzdGluYXRpb24gdmVjdG9yLgorLy8vIFxwYXJhbSBfX2IxMQorLy8vICAgIEluaXRpYWxpemVzIGJpdHMgWzk1Ojg4XSBvZiB0aGUgZGVzdGluYXRpb24gdmVjdG9yLgorLy8vIFxwYXJhbSBfX2IxMAorLy8vICAgIEluaXRpYWxpemVzIGJpdHMgWzg3OjgwXSBvZiB0aGUgZGVzdGluYXRpb24gdmVjdG9yLgorLy8vIFxwYXJhbSBfX2I5CisvLy8gICAgSW5pdGlhbGl6ZXMgYml0cyBbNzk6NzJdIG9mIHRoZSBkZXN0aW5hdGlvbiB2ZWN0b3IuCisvLy8gXHBhcmFtIF9fYjgKKy8vLyAgICBJbml0aWFsaXplcyBiaXRzIFs3MTo2NF0gb2YgdGhlIGRlc3RpbmF0aW9uIHZlY3Rvci4KKy8vLyBccGFyYW0gX19iNworLy8vICAgIEluaXRpYWxpemVzIGJpdHMgWzYzOjU2XSBvZiB0aGUgZGVzdGluYXRpb24gdmVjdG9yLgorLy8vIFxwYXJhbSBfX2I2CisvLy8gICAgSW5pdGlhbGl6ZXMgYml0cyBbNTU6NDhdIG9mIHRoZSBkZXN0aW5hdGlvbiB2ZWN0b3IuCisvLy8gXHBhcmFtIF9fYjUKKy8vLyAgICBJbml0aWFsaXplcyBiaXRzIFs0Nzo0MF0gb2YgdGhlIGRlc3RpbmF0aW9uIHZlY3Rvci4KKy8vLyBccGFyYW0gX19iNAorLy8vICAgIEluaXRpYWxpemVzIGJpdHMgWzM5OjMyXSBvZiB0aGUgZGVzdGluYXRpb24gdmVjdG9yLgorLy8vIFxwYXJhbSBfX2IzCisvLy8gICAgSW5pdGlhbGl6ZXMgYml0cyBbMzE6MjRdIG9mIHRoZSBkZXN0aW5hdGlvbiB2ZWN0b3IuCisvLy8gXHBhcmFtIF9fYjIKKy8vLyAgICBJbml0aWFsaXplcyBiaXRzIFsyMzoxNl0gb2YgdGhlIGRlc3RpbmF0aW9uIHZlY3Rvci4KKy8vLyBccGFyYW0gX19iMQorLy8vICAgIEluaXRpYWxpemVzIGJpdHMgWzE1OjhdIG9mIHRoZSBkZXN0aW5hdGlvbiB2ZWN0b3IuCisvLy8gXHBhcmFtIF9fYjAKKy8vLyAgICBJbml0aWFsaXplcyBiaXRzIFs3OjBdIG9mIHRoZSBkZXN0aW5hdGlvbiB2ZWN0b3IuCisvLy8gXHJldHVybnMgQW4gaW5pdGlhbGl6ZWQgMTI4LWJpdCB2ZWN0b3Igb2YgWzE2IHggaThdIGNvbnRhaW5pbmcgdGhlIHZhbHVlcworLy8vICAgIHByb3ZpZGVkIGluIHRoZSBvcGVyYW5kcy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc2V0X2VwaTgoY2hhciBfX2IxNSwgY2hhciBfX2IxNCwgY2hhciBfX2IxMywgY2hhciBfX2IxMiwgY2hhciBfX2IxMSwgY2hhciBfX2IxMCwgY2hhciBfX2I5LCBjaGFyIF9fYjgsIGNoYXIgX19iNywgY2hhciBfX2I2LCBjaGFyIF9fYjUsIGNoYXIgX19iNCwgY2hhciBfX2IzLCBjaGFyIF9fYjIsIGNoYXIgX19iMSwgY2hhciBfX2IwKQoreworICByZXR1cm4gKF9fbTEyOGkpKF9fdjE2cWkpeyBfX2IwLCBfX2IxLCBfX2IyLCBfX2IzLCBfX2I0LCBfX2I1LCBfX2I2LCBfX2I3LCBfX2I4LCBfX2I5LCBfX2IxMCwgX19iMTEsIF9fYjEyLCBfX2IxMywgX19iMTQsIF9fYjE1IH07Cit9CisKKy8vLyBcYnJpZWYgSW5pdGlhbGl6ZXMgYm90aCB2YWx1ZXMgaW4gYSAxMjgtYml0IGludGVnZXIgdmVjdG9yIHdpdGggdGhlCisvLy8gICAgc3BlY2lmaWVkIDY0LWJpdCBpbnRlZ2VyIHZhbHVlLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIGFuZCBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGEgc3BlY2lmaWMKKy8vLyAgICBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX3EKKy8vLyAgICBJbnRlZ2VyIHZhbHVlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZWxlbWVudHMgb2YgdGhlIGRlc3RpbmF0aW9uIGludGVnZXIKKy8vLyAgICB2ZWN0b3IuCisvLy8gXHJldHVybnMgQW4gaW5pdGlhbGl6ZWQgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbMiB4IGk2NF0gd2l0aCBib3RoCisvLy8gICAgZWxlbWVudHMgY29udGFpbmluZyB0aGUgdmFsdWUgcHJvdmlkZWQgaW4gdGhlIG9wZXJhbmQuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3NldDFfZXBpNjR4KGxvbmcgbG9uZyBfX3EpCit7CisgIHJldHVybiAoX19tMTI4aSl7IF9fcSwgX19xIH07Cit9CisKKy8vLyBcYnJpZWYgSW5pdGlhbGl6ZXMgYm90aCB2YWx1ZXMgaW4gYSAxMjgtYml0IHZlY3RvciBvZiBbMiB4IGk2NF0gd2l0aCB0aGUKKy8vLyAgICBzcGVjaWZpZWQgNjQtYml0IHZhbHVlLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIGFuZCBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGEgc3BlY2lmaWMKKy8vLyAgICBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX3EKKy8vLyAgICBBIDY0LWJpdCB2YWx1ZSB1c2VkIHRvIGluaXRpYWxpemUgdGhlIGVsZW1lbnRzIG9mIHRoZSBkZXN0aW5hdGlvbiBpbnRlZ2VyCisvLy8gICAgdmVjdG9yLgorLy8vIFxyZXR1cm5zIEFuIGluaXRpYWxpemVkIDEyOC1iaXQgdmVjdG9yIG9mIFsyIHggaTY0XSB3aXRoIGFsbCBlbGVtZW50cworLy8vICAgIGNvbnRhaW5pbmcgdGhlIHZhbHVlIHByb3ZpZGVkIGluIHRoZSBvcGVyYW5kLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zZXQxX2VwaTY0KF9fbTY0IF9fcSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKXsgKGxvbmcgbG9uZylfX3EsIChsb25nIGxvbmcpX19xIH07Cit9CisKKy8vLyBcYnJpZWYgSW5pdGlhbGl6ZXMgYWxsIHZhbHVlcyBpbiBhIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggaTMyXSB3aXRoIHRoZQorLy8vICAgIHNwZWNpZmllZCAzMi1iaXQgdmFsdWUuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBpcyBhIHV0aWxpdHkgZnVuY3Rpb24gYW5kIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYSBzcGVjaWZpYworLy8vICAgIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9faQorLy8vICAgIEEgMzItYml0IHZhbHVlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZWxlbWVudHMgb2YgdGhlIGRlc3RpbmF0aW9uIGludGVnZXIKKy8vLyAgICB2ZWN0b3IuCisvLy8gXHJldHVybnMgQW4gaW5pdGlhbGl6ZWQgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBpMzJdIHdpdGggYWxsIGVsZW1lbnRzCisvLy8gICAgY29udGFpbmluZyB0aGUgdmFsdWUgcHJvdmlkZWQgaW4gdGhlIG9wZXJhbmQuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3NldDFfZXBpMzIoaW50IF9faSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKShfX3Y0c2kpeyBfX2ksIF9faSwgX19pLCBfX2kgfTsKK30KKworLy8vIFxicmllZiBJbml0aWFsaXplcyBhbGwgdmFsdWVzIGluIGEgMTI4LWJpdCB2ZWN0b3Igb2YgWzggeCBpMTZdIHdpdGggdGhlCisvLy8gICAgc3BlY2lmaWVkIDE2LWJpdCB2YWx1ZS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGlzIGEgdXRpbGl0eSBmdW5jdGlvbiBhbmQgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhIHNwZWNpZmljCisvLy8gICAgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX193CisvLy8gICAgQSAxNi1iaXQgdmFsdWUgdXNlZCB0byBpbml0aWFsaXplIHRoZSBlbGVtZW50cyBvZiB0aGUgZGVzdGluYXRpb24gaW50ZWdlcgorLy8vICAgIHZlY3Rvci4KKy8vLyBccmV0dXJucyBBbiBpbml0aWFsaXplZCAxMjgtYml0IHZlY3RvciBvZiBbOCB4IGkxNl0gd2l0aCBhbGwgZWxlbWVudHMKKy8vLyAgICBjb250YWluaW5nIHRoZSB2YWx1ZSBwcm92aWRlZCBpbiB0aGUgb3BlcmFuZC4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc2V0MV9lcGkxNihzaG9ydCBfX3cpCit7CisgIHJldHVybiAoX19tMTI4aSkoX192OGhpKXsgX193LCBfX3csIF9fdywgX193LCBfX3csIF9fdywgX193LCBfX3cgfTsKK30KKworLy8vIFxicmllZiBJbml0aWFsaXplcyBhbGwgdmFsdWVzIGluIGEgMTI4LWJpdCB2ZWN0b3Igb2YgWzE2IHggaThdIHdpdGggdGhlCisvLy8gICAgc3BlY2lmaWVkIDgtYml0IHZhbHVlLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIGFuZCBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGEgc3BlY2lmaWMKKy8vLyAgICBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBbiA4LWJpdCB2YWx1ZSB1c2VkIHRvIGluaXRpYWxpemUgdGhlIGVsZW1lbnRzIG9mIHRoZSBkZXN0aW5hdGlvbiBpbnRlZ2VyCisvLy8gICAgdmVjdG9yLgorLy8vIFxyZXR1cm5zIEFuIGluaXRpYWxpemVkIDEyOC1iaXQgdmVjdG9yIG9mIFsxNiB4IGk4XSB3aXRoIGFsbCBlbGVtZW50cworLy8vICAgIGNvbnRhaW5pbmcgdGhlIHZhbHVlIHByb3ZpZGVkIGluIHRoZSBvcGVyYW5kLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zZXQxX2VwaTgoY2hhciBfX2IpCit7CisgIHJldHVybiAoX19tMTI4aSkoX192MTZxaSl7IF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiB9OworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3NldHJfZXBpNjQoX19tNjQgX19xMCwgX19tNjQgX19xMSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKXsgKGxvbmcgbG9uZylfX3EwLCAobG9uZyBsb25nKV9fcTEgfTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zZXRyX2VwaTMyKGludCBfX2kwLCBpbnQgX19pMSwgaW50IF9faTIsIGludCBfX2kzKQoreworICByZXR1cm4gKF9fbTEyOGkpKF9fdjRzaSl7IF9faTAsIF9faTEsIF9faTIsIF9faTN9OworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3NldHJfZXBpMTYoc2hvcnQgX193MCwgc2hvcnQgX193MSwgc2hvcnQgX193Miwgc2hvcnQgX193Mywgc2hvcnQgX193NCwgc2hvcnQgX193NSwgc2hvcnQgX193Niwgc2hvcnQgX193NykKK3sKKyAgcmV0dXJuIChfX20xMjhpKShfX3Y4aGkpeyBfX3cwLCBfX3cxLCBfX3cyLCBfX3czLCBfX3c0LCBfX3c1LCBfX3c2LCBfX3c3IH07Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc2V0cl9lcGk4KGNoYXIgX19iMCwgY2hhciBfX2IxLCBjaGFyIF9fYjIsIGNoYXIgX19iMywgY2hhciBfX2I0LCBjaGFyIF9fYjUsIGNoYXIgX19iNiwgY2hhciBfX2I3LCBjaGFyIF9fYjgsIGNoYXIgX19iOSwgY2hhciBfX2IxMCwgY2hhciBfX2IxMSwgY2hhciBfX2IxMiwgY2hhciBfX2IxMywgY2hhciBfX2IxNCwgY2hhciBfX2IxNSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKShfX3YxNnFpKXsgX19iMCwgX19iMSwgX19iMiwgX19iMywgX19iNCwgX19iNSwgX19iNiwgX19iNywgX19iOCwgX19iOSwgX19iMTAsIF9fYjExLCBfX2IxMiwgX19iMTMsIF9fYjE0LCBfX2IxNSB9OworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3NldHplcm9fc2kxMjgodm9pZCkKK3sKKyAgcmV0dXJuIChfX20xMjhpKXsgMExMLCAwTEwgfTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zdG9yZV9zaTEyOChfX20xMjhpICpfX3AsIF9fbTEyOGkgX19iKQoreworICAqX19wID0gX19iOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3N0b3JldV9zaTEyOChfX20xMjhpICpfX3AsIF9fbTEyOGkgX19iKQoreworICBzdHJ1Y3QgX19zdG9yZXVfc2kxMjggeworICAgIF9fbTEyOGkgX192OworICB9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18sIF9fbWF5X2FsaWFzX18pKTsKKyAgKChzdHJ1Y3QgX19zdG9yZXVfc2kxMjgqKV9fcCktPl9fdiA9IF9fYjsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXNrbW92ZXVfc2kxMjgoX19tMTI4aSBfX2QsIF9fbTEyOGkgX19uLCBjaGFyICpfX3ApCit7CisgIF9fYnVpbHRpbl9pYTMyX21hc2ttb3ZkcXUoKF9fdjE2cWkpX19kLCAoX192MTZxaSlfX24sIF9fcCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc3RvcmVsX2VwaTY0KF9fbTEyOGkgKl9fcCwgX19tMTI4aSBfX2EpCit7CisgIHN0cnVjdCBfX21tX3N0b3JlbF9lcGk2NF9zdHJ1Y3QgeworICAgIGxvbmcgbG9uZyBfX3U7CisgIH0gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXywgX19tYXlfYWxpYXNfXykpOworICAoKHN0cnVjdCBfX21tX3N0b3JlbF9lcGk2NF9zdHJ1Y3QqKV9fcCktPl9fdSA9IF9fYVswXTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zdHJlYW1fcGQoZG91YmxlICpfX3AsIF9fbTEyOGQgX19hKQoreworICBfX2J1aWx0aW5fbm9udGVtcG9yYWxfc3RvcmUoKF9fdjJkZilfX2EsIChfX3YyZGYqKV9fcCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc3RyZWFtX3NpMTI4KF9fbTEyOGkgKl9fcCwgX19tMTI4aSBfX2EpCit7CisgIF9fYnVpbHRpbl9ub250ZW1wb3JhbF9zdG9yZSgoX192MmRpKV9fYSwgKF9fdjJkaSopX19wKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zdHJlYW1fc2kzMihpbnQgKl9fcCwgaW50IF9fYSkKK3sKKyAgX19idWlsdGluX2lhMzJfbW92bnRpKF9fcCwgX19hKTsKK30KKworI2lmZGVmIF9feDg2XzY0X18KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc3RyZWFtX3NpNjQobG9uZyBsb25nICpfX3AsIGxvbmcgbG9uZyBfX2EpCit7CisgIF9fYnVpbHRpbl9pYTMyX21vdm50aTY0KF9fcCwgX19hKTsKK30KKyNlbmRpZgorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NsZmx1c2godm9pZCBjb25zdCAqX19wKQoreworICBfX2J1aWx0aW5faWEzMl9jbGZsdXNoKF9fcCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbGZlbmNlKHZvaWQpCit7CisgIF9fYnVpbHRpbl9pYTMyX2xmZW5jZSgpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21mZW5jZSh2b2lkKQoreworICBfX2J1aWx0aW5faWEzMl9tZmVuY2UoKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9wYWNrc19lcGkxNihfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wYWNrc3N3YjEyOCgoX192OGhpKV9fYSwgKF9fdjhoaSlfX2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3BhY2tzX2VwaTMyKF9fbTEyOGkgX19hLCBfX20xMjhpIF9fYikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BhY2tzc2R3MTI4KChfX3Y0c2kpX19hLCAoX192NHNpKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fcGFja3VzX2VwaTE2KF9fbTEyOGkgX19hLCBfX20xMjhpIF9fYikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BhY2t1c3diMTI4KChfX3Y4aGkpX19hLCAoX192OGhpKV9fYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9leHRyYWN0X2VwaTE2KF9fbTEyOGkgX19hLCBpbnQgX19pbW0pCit7CisgIF9fdjhoaSBfX2IgPSAoX192OGhpKV9fYTsKKyAgcmV0dXJuICh1bnNpZ25lZCBzaG9ydClfX2JbX19pbW0gJiA3XTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9pbnNlcnRfZXBpMTYoX19tMTI4aSBfX2EsIGludCBfX2IsIGludCBfX2ltbSkKK3sKKyAgX192OGhpIF9fYyA9IChfX3Y4aGkpX19hOworICBfX2NbX19pbW0gJiA3XSA9IF9fYjsKKyAgcmV0dXJuIChfX20xMjhpKV9fYzsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21vdmVtYXNrX2VwaTgoX19tMTI4aSBfX2EpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9wbW92bXNrYjEyOCgoX192MTZxaSlfX2EpOworfQorCisjZGVmaW5lIF9tbV9zaHVmZmxlX2VwaTMyKGEsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhpKV9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3Y0c2kpKF9fbTEyOGkpKGEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2kpX21tX3VuZGVmaW5lZF9zaTEyOCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW1tKSA+PiAwKSAmIDB4MywgKChpbW0pID4+IDIpICYgMHgzLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW1tKSA+PiA0KSAmIDB4MywgKChpbW0pID4+IDYpICYgMHgzKTsgfSkKKworI2RlZmluZSBfbW1fc2h1ZmZsZWxvX2VwaTE2KGEsIGltbSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhpKV9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3Y4aGkpKF9fbTEyOGkpKGEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4aGkpX21tX3VuZGVmaW5lZF9zaTEyOCgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW1tKSA+PiAwKSAmIDB4MywgKChpbW0pID4+IDIpICYgMHgzLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW1tKSA+PiA0KSAmIDB4MywgKChpbW0pID4+IDYpICYgMHgzLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsIDUsIDYsIDcpOyB9KQorCisjZGVmaW5lIF9tbV9zaHVmZmxlaGlfZXBpMTYoYSwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGkpX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjhoaSkoX19tMTI4aSkoYSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhoaSlfbW1fdW5kZWZpbmVkX3NpMTI4KCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgMiwgMywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ICsgKCgoaW1tKSA+PiAwKSAmIDB4MyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCArICgoKGltbSkgPj4gMikgJiAweDMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgKyAoKChpbW0pID4+IDQpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ICsgKCgoaW1tKSA+PiA2KSAmIDB4MykpOyB9KQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3VucGFja2hpX2VwaTgoX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjE2cWkpX19hLCAoX192MTZxaSlfX2IsIDgsIDE2KzgsIDksIDE2KzksIDEwLCAxNisxMCwgMTEsIDE2KzExLCAxMiwgMTYrMTIsIDEzLCAxNisxMywgMTQsIDE2KzE0LCAxNSwgMTYrMTUpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3VucGFja2hpX2VwaTE2KF9fbTEyOGkgX19hLCBfX20xMjhpIF9fYikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3Y4aGkpX19hLCAoX192OGhpKV9fYiwgNCwgOCs0LCA1LCA4KzUsIDYsIDgrNiwgNywgOCs3KTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV91bnBhY2toaV9lcGkzMihfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcigoX192NHNpKV9fYSwgKF9fdjRzaSlfX2IsIDIsIDQrMiwgMywgNCszKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV91bnBhY2toaV9lcGk2NChfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcigoX192MmRpKV9fYSwgKF9fdjJkaSlfX2IsIDEsIDIrMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fdW5wYWNrbG9fZXBpOChfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcigoX192MTZxaSlfX2EsIChfX3YxNnFpKV9fYiwgMCwgMTYrMCwgMSwgMTYrMSwgMiwgMTYrMiwgMywgMTYrMywgNCwgMTYrNCwgNSwgMTYrNSwgNiwgMTYrNiwgNywgMTYrNyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fdW5wYWNrbG9fZXBpMTYoX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjhoaSlfX2EsIChfX3Y4aGkpX19iLCAwLCA4KzAsIDEsIDgrMSwgMiwgOCsyLCAzLCA4KzMpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3VucGFja2xvX2VwaTMyKF9fbTEyOGkgX19hLCBfX20xMjhpIF9fYikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3Y0c2kpX19hLCAoX192NHNpKV9fYiwgMCwgNCswLCAxLCA0KzEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3VucGFja2xvX2VwaTY0KF9fbTEyOGkgX19hLCBfX20xMjhpIF9fYikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3YyZGkpX19hLCAoX192MmRpKV9fYiwgMCwgMiswKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbW92ZXBpNjRfcGk2NChfX20xMjhpIF9fYSkKK3sKKyAgcmV0dXJuIChfX202NClfX2FbMF07Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbW92cGk2NF9lcGk2NChfX202NCBfX2EpCit7CisgIHJldHVybiAoX19tMTI4aSl7IChsb25nIGxvbmcpX19hLCAwIH07Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbW92ZV9lcGk2NChfX20xMjhpIF9fYSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3YyZGkpX19hLCAoX19tMTI4aSl7IDAgfSwgMCwgMik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fdW5wYWNraGlfcGQoX19tMTI4ZCBfX2EsIF9fbTEyOGQgX19iKQoreworICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjJkZilfX2EsIChfX3YyZGYpX19iLCAxLCAyKzEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3VucGFja2xvX3BkKF9fbTEyOGQgX19hLCBfX20xMjhkIF9fYikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3YyZGYpX19hLCAoX192MmRmKV9fYiwgMCwgMiswKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21vdmVtYXNrX3BkKF9fbTEyOGQgX19hKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfbW92bXNrcGQoKF9fdjJkZilfX2EpOworfQorCisjZGVmaW5lIF9tbV9zaHVmZmxlX3BkKGEsIGIsIGkpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4ZClfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcigoX192MmRmKShfX20xMjhkKShhKSwgKF9fdjJkZikoX19tMTI4ZCkoYiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCArICgoKGkpID4+IDApICYgMHgxKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICsgKCgoaSkgPj4gMSkgJiAweDEpKTsgfSkKKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2Nhc3RwZF9wcyhfX20xMjhkIF9fYSkKK3sKKyAgcmV0dXJuIChfX20xMjgpX19hOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2Nhc3RwZF9zaTEyOChfX20xMjhkIF9fYSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jYXN0cHNfcGQoX19tMTI4IF9fYSkKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jYXN0cHNfc2kxMjgoX19tMTI4IF9fYSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2Nhc3RzaTEyOF9wcyhfX20xMjhpIF9fYSkKK3sKKyAgcmV0dXJuIChfX20xMjgpX19hOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2Nhc3RzaTEyOF9wZChfX20xMjhpIF9fYSkKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9wYXVzZSh2b2lkKQoreworICBfX2J1aWx0aW5faWEzMl9wYXVzZSgpOworfQorCisjdW5kZWYgX19ERUZBVUxUX0ZOX0FUVFJTCisKKyNkZWZpbmUgX01NX1NIVUZGTEUyKHgsIHkpICgoKHgpIDw8IDEpIHwgKHkpKQorCisjZW5kaWYgLyogX19FTU1JTlRSSU5fSCAqLwpkaWZmIC0tZ2l0IGEvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvZjE2Y2ludHJpbi5oIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvZjE2Y2ludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNWJmNzMKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9mMTZjaW50cmluLmgKQEAgLTAsMCArMSwxMjQgQEAKKy8qPT09LS0tLSBmMTZjaW50cmluLmggLSBGMTZDIGludHJpbnNpY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKgorICo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICovCisKKyNpZiAhZGVmaW5lZCBfX1g4NklOVFJJTl9IICYmICFkZWZpbmVkIF9fRU1NSU5UUklOX0ggJiYgIWRlZmluZWQgX19JTU1JTlRSSU5fSAorI2Vycm9yICJOZXZlciB1c2UgPGYxNmNpbnRyaW4uaD4gZGlyZWN0bHk7IGluY2x1ZGUgPGVtbWludHJpbi5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9fRjE2Q0lOVFJJTl9ICisjZGVmaW5lIF9fRjE2Q0lOVFJJTl9ICisKKy8qIERlZmluZSB0aGUgZGVmYXVsdCBhdHRyaWJ1dGVzIGZvciB0aGUgZnVuY3Rpb25zIGluIHRoaXMgZmlsZS4gKi8KKyNkZWZpbmUgX19ERUZBVUxUX0ZOX0FUVFJTIFwKKyAgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fLCBfX3RhcmdldF9fKCJmMTZjIikpKQorCisvLy8gXGJyaWVmIENvbnZlcnRzIGEgMTYtYml0IGhhbGYtcHJlY2lzaW9uIGZsb2F0IHZhbHVlIGludG8gYSAzMi1iaXQgZmxvYXQKKy8vLyAgICB2YWx1ZS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWQ1ZUUEgyUFMgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxNi1iaXQgaGFsZi1wcmVjaXNpb24gZmxvYXQgdmFsdWUuCisvLy8gXHJldHVybnMgVGhlIGNvbnZlcnRlZCAzMi1iaXQgZmxvYXQgdmFsdWUuCitzdGF0aWMgX19pbmxpbmUgZmxvYXQgX19ERUZBVUxUX0ZOX0FUVFJTCitfY3Z0c2hfc3ModW5zaWduZWQgc2hvcnQgX19hKQoreworICBfX3Y4aGkgdiA9IHsoc2hvcnQpX19hLCAwLCAwLCAwLCAwLCAwLCAwLCAwfTsKKyAgX192NHNmIHIgPSBfX2J1aWx0aW5faWEzMl92Y3Z0cGgycHModik7CisgIHJldHVybiByWzBdOworfQorCisvLy8gXGJyaWVmIENvbnZlcnRzIGEgMzItYml0IHNpbmdsZS1wcmVjaXNpb24gZmxvYXQgdmFsdWUgdG8gYSAxNi1iaXQKKy8vLyAgICBoYWxmLXByZWNpc2lvbiBmbG9hdCB2YWx1ZS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFxjb2RlCisvLy8gdW5zaWduZWQgc2hvcnQgX2N2dHNzX3NoKGZsb2F0IGEsIGNvbnN0IGludCBpbW0pOworLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVkNWVFBTMlBIIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIGEKKy8vLyAgICBBIDMyLWJpdCBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZCB0byBhIDE2LWJpdAorLy8vICAgIGhhbGYtcHJlY2lzaW9uIGZsb2F0IHZhbHVlLgorLy8vIFxwYXJhbSBpbW0KKy8vLyAgICBBbiBpbW1lZGlhdGUgdmFsdWUgY29udHJvbGxpbmcgcm91bmRpbmcgdXNpbmcgYml0cyBbMjowXToKKy8vLyAgICAwMDA6IE5lYXJlc3QKKy8vLyAgICAwMDE6IERvd24KKy8vLyAgICAwMTA6IFVwCisvLy8gICAgMDExOiBUcnVuY2F0ZQorLy8vICAgIDFYWDogVXNlIE1YQ1NSLlJDIGZvciByb3VuZGluZworLy8vIFxyZXR1cm5zIFRoZSBjb252ZXJ0ZWQgMTYtYml0IGhhbGYtcHJlY2lzaW9uIGZsb2F0IHZhbHVlLgorI2RlZmluZSBfY3Z0c3Nfc2goYSwgaW1tKSAgXAorICAoKHVuc2lnbmVkIHNob3J0KSgoKF9fdjhoaSlfX2J1aWx0aW5faWEzMl92Y3Z0cHMycGgoKF9fdjRzZil7YSwgMCwgMCwgMH0sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbW0pKSlbMF0pKQorCisvLy8gXGJyaWVmIENvbnZlcnRzIGEgMTI4LWJpdCB2ZWN0b3IgY29udGFpbmluZyAzMi1iaXQgZmxvYXQgdmFsdWVzIGludG8gYQorLy8vICAgIDEyOC1iaXQgdmVjdG9yIGNvbnRhaW5pbmcgMTYtYml0IGhhbGYtcHJlY2lzaW9uIGZsb2F0IHZhbHVlcy4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFxjb2RlCisvLy8gX19tMTI4aSBfbW1fY3Z0cHNfcGgoX19tMTI4IGEsIGNvbnN0IGludCBpbW0pOworLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVkNWVFBTMlBIIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIGEKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIGNvbnRhaW5pbmcgMzItYml0IGZsb2F0IHZhbHVlcy4KKy8vLyBccGFyYW0gaW1tCisvLy8gICAgQW4gaW1tZWRpYXRlIHZhbHVlIGNvbnRyb2xsaW5nIHJvdW5kaW5nIHVzaW5nIGJpdHMgWzI6MF06CisvLy8gICAgMDAwOiBOZWFyZXN0CisvLy8gICAgMDAxOiBEb3duCisvLy8gICAgMDEwOiBVcAorLy8vICAgIDAxMTogVHJ1bmNhdGUKKy8vLyAgICAxWFg6IFVzZSBNWENTUi5SQyBmb3Igcm91bmRpbmcKKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgdmVjdG9yIGNvbnRhaW5pbmcgY29udmVydGVkIDE2LWJpdCBoYWxmLXByZWNpc2lvbiBmbG9hdAorLy8vICAgIHZhbHVlcy4gVGhlIGxvd2VyIDY0IGJpdHMgYXJlIHVzZWQgdG8gc3RvcmUgdGhlIGNvbnZlcnRlZCAxNi1iaXQKKy8vLyAgICBoYWxmLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZXMuCisjZGVmaW5lIF9tbV9jdnRwc19waChhLCBpbW0pIFwKKyAgKChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3ZjdnRwczJwaCgoX192NHNmKShfX20xMjgpKGEpLCAoaW1tKSkpCisKKy8vLyBcYnJpZWYgQ29udmVydHMgYSAxMjgtYml0IHZlY3RvciBjb250YWluaW5nIDE2LWJpdCBoYWxmLXByZWNpc2lvbiBmbG9hdAorLy8vICAgIHZhbHVlcyBpbnRvIGEgMTI4LWJpdCB2ZWN0b3IgY29udGFpbmluZyAzMi1iaXQgZmxvYXQgdmFsdWVzLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZDVlRQSDJQUyBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIGNvbnRhaW5pbmcgMTYtYml0IGhhbGYtcHJlY2lzaW9uIGZsb2F0IHZhbHVlcy4gVGhlIGxvd2VyCisvLy8gICAgNjQgYml0cyBhcmUgdXNlZCBpbiB0aGUgY29udmVyc2lvbi4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgY29udmVydGVkIGZsb2F0IHZhbHVlcy4KK3N0YXRpYyBfX2lubGluZSBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY3Z0cGhfcHMoX19tMTI4aSBfX2EpCit7CisgIHJldHVybiAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX3ZjdnRwaDJwcygoX192OGhpKV9fYSk7Cit9CisKKyN1bmRlZiBfX0RFRkFVTFRfRk5fQVRUUlMKKworI2VuZGlmIC8qIF9fRjE2Q0lOVFJJTl9IICovCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9mbG9hdC5oIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvZmxvYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjgyNjllCi0tLSAvZGV2L251bGwKKysrIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvZmxvYXQuaApAQCAtMCwwICsxLDEzNCBAQAorLyo9PT0tLS0tIGZsb2F0LmggLSBDaGFyYWN0ZXJpc3RpY3Mgb2YgZmxvYXRpbmcgcG9pbnQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLT09PQorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqCisgKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisgKi8KKworI2lmbmRlZiBfX0ZMT0FUX0gKKyNkZWZpbmUgX19GTE9BVF9ICisKKy8qIElmIHdlJ3JlIG9uIE1pbkdXLCBmYWxsIGJhY2sgdG8gdGhlIHN5c3RlbSdzIGZsb2F0LmgsIHdoaWNoIG1pZ2h0IGhhdmUKKyAqIGFkZGl0aW9uYWwgZGVmaW5pdGlvbnMgcHJvdmlkZWQgZm9yIFdpbmRvd3MuCisgKiBGb3IgbW9yZSBkZXRhaWxzIHNlZSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkveTB5Ync5ZnkuYXNweAorICovCisjaWYgKGRlZmluZWQoX19NSU5HVzMyX18pIHx8IGRlZmluZWQoX01TQ19WRVIpKSAmJiBfX1NURENfSE9TVEVEX18gJiYgXAorICAgIF9faGFzX2luY2x1ZGVfbmV4dCg8ZmxvYXQuaD4pCisjICBpbmNsdWRlX25leHQgPGZsb2F0Lmg+CisKKy8qIFVuZGVmaW5lIGFueXRoaW5nIHRoYXQgd2UnbGwgYmUgcmVkZWZpbmluZyBiZWxvdy4gKi8KKyMgIHVuZGVmIEZMVF9FVkFMX01FVEhPRAorIyAgdW5kZWYgRkxUX1JPVU5EUworIyAgdW5kZWYgRkxUX1JBRElYCisjICB1bmRlZiBGTFRfTUFOVF9ESUcKKyMgIHVuZGVmIERCTF9NQU5UX0RJRworIyAgdW5kZWYgTERCTF9NQU5UX0RJRworIyAgaWYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMIHx8ICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykKKyMgICAgdW5kZWYgREVDSU1BTF9ESUcKKyMgIGVuZGlmCisjICB1bmRlZiBGTFRfRElHCisjICB1bmRlZiBEQkxfRElHCisjICB1bmRlZiBMREJMX0RJRworIyAgdW5kZWYgRkxUX01JTl9FWFAKKyMgIHVuZGVmIERCTF9NSU5fRVhQCisjICB1bmRlZiBMREJMX01JTl9FWFAKKyMgIHVuZGVmIEZMVF9NSU5fMTBfRVhQCisjICB1bmRlZiBEQkxfTUlOXzEwX0VYUAorIyAgdW5kZWYgTERCTF9NSU5fMTBfRVhQCisjICB1bmRlZiBGTFRfTUFYX0VYUAorIyAgdW5kZWYgREJMX01BWF9FWFAKKyMgIHVuZGVmIExEQkxfTUFYX0VYUAorIyAgdW5kZWYgRkxUX01BWF8xMF9FWFAKKyMgIHVuZGVmIERCTF9NQVhfMTBfRVhQCisjICB1bmRlZiBMREJMX01BWF8xMF9FWFAKKyMgIHVuZGVmIEZMVF9NQVgKKyMgIHVuZGVmIERCTF9NQVgKKyMgIHVuZGVmIExEQkxfTUFYCisjICB1bmRlZiBGTFRfRVBTSUxPTgorIyAgdW5kZWYgREJMX0VQU0lMT04KKyMgIHVuZGVmIExEQkxfRVBTSUxPTgorIyAgdW5kZWYgRkxUX01JTgorIyAgdW5kZWYgREJMX01JTgorIyAgdW5kZWYgTERCTF9NSU4KKyMgIGlmIF9fU1REQ19WRVJTSU9OX18gPj0gMjAxMTEyTCB8fCAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pCisjICAgIHVuZGVmIEZMVF9UUlVFX01JTgorIyAgICB1bmRlZiBEQkxfVFJVRV9NSU4KKyMgICAgdW5kZWYgTERCTF9UUlVFX01JTgorIyAgICB1bmRlZiBGTFRfREVDSU1BTF9ESUcKKyMgICAgdW5kZWYgREJMX0RFQ0lNQUxfRElHCisjICAgIHVuZGVmIExEQkxfREVDSU1BTF9ESUcKKyMgIGVuZGlmCisjZW5kaWYKKworLyogQ2hhcmFjdGVyaXN0aWNzIG9mIGZsb2F0aW5nIHBvaW50IHR5cGVzLCBDOTkgNS4yLjQuMi4yICovCisKKyNkZWZpbmUgRkxUX0VWQUxfTUVUSE9EIF9fRkxUX0VWQUxfTUVUSE9EX18KKyNkZWZpbmUgRkxUX1JPVU5EUyAoX19idWlsdGluX2ZsdF9yb3VuZHMoKSkKKyNkZWZpbmUgRkxUX1JBRElYIF9fRkxUX1JBRElYX18KKworI2RlZmluZSBGTFRfTUFOVF9ESUcgX19GTFRfTUFOVF9ESUdfXworI2RlZmluZSBEQkxfTUFOVF9ESUcgX19EQkxfTUFOVF9ESUdfXworI2RlZmluZSBMREJMX01BTlRfRElHIF9fTERCTF9NQU5UX0RJR19fCisKKyNpZiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwgfHwgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKQorIyAgZGVmaW5lIERFQ0lNQUxfRElHIF9fREVDSU1BTF9ESUdfXworI2VuZGlmCisKKyNkZWZpbmUgRkxUX0RJRyBfX0ZMVF9ESUdfXworI2RlZmluZSBEQkxfRElHIF9fREJMX0RJR19fCisjZGVmaW5lIExEQkxfRElHIF9fTERCTF9ESUdfXworCisjZGVmaW5lIEZMVF9NSU5fRVhQIF9fRkxUX01JTl9FWFBfXworI2RlZmluZSBEQkxfTUlOX0VYUCBfX0RCTF9NSU5fRVhQX18KKyNkZWZpbmUgTERCTF9NSU5fRVhQIF9fTERCTF9NSU5fRVhQX18KKworI2RlZmluZSBGTFRfTUlOXzEwX0VYUCBfX0ZMVF9NSU5fMTBfRVhQX18KKyNkZWZpbmUgREJMX01JTl8xMF9FWFAgX19EQkxfTUlOXzEwX0VYUF9fCisjZGVmaW5lIExEQkxfTUlOXzEwX0VYUCBfX0xEQkxfTUlOXzEwX0VYUF9fCisKKyNkZWZpbmUgRkxUX01BWF9FWFAgX19GTFRfTUFYX0VYUF9fCisjZGVmaW5lIERCTF9NQVhfRVhQIF9fREJMX01BWF9FWFBfXworI2RlZmluZSBMREJMX01BWF9FWFAgX19MREJMX01BWF9FWFBfXworCisjZGVmaW5lIEZMVF9NQVhfMTBfRVhQIF9fRkxUX01BWF8xMF9FWFBfXworI2RlZmluZSBEQkxfTUFYXzEwX0VYUCBfX0RCTF9NQVhfMTBfRVhQX18KKyNkZWZpbmUgTERCTF9NQVhfMTBfRVhQIF9fTERCTF9NQVhfMTBfRVhQX18KKworI2RlZmluZSBGTFRfTUFYIF9fRkxUX01BWF9fCisjZGVmaW5lIERCTF9NQVggX19EQkxfTUFYX18KKyNkZWZpbmUgTERCTF9NQVggX19MREJMX01BWF9fCisKKyNkZWZpbmUgRkxUX0VQU0lMT04gX19GTFRfRVBTSUxPTl9fCisjZGVmaW5lIERCTF9FUFNJTE9OIF9fREJMX0VQU0lMT05fXworI2RlZmluZSBMREJMX0VQU0lMT04gX19MREJMX0VQU0lMT05fXworCisjZGVmaW5lIEZMVF9NSU4gX19GTFRfTUlOX18KKyNkZWZpbmUgREJMX01JTiBfX0RCTF9NSU5fXworI2RlZmluZSBMREJMX01JTiBfX0xEQkxfTUlOX18KKworI2lmIF9fU1REQ19WRVJTSU9OX18gPj0gMjAxMTEyTCB8fCAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pCisjICBkZWZpbmUgRkxUX1RSVUVfTUlOIF9fRkxUX0RFTk9STV9NSU5fXworIyAgZGVmaW5lIERCTF9UUlVFX01JTiBfX0RCTF9ERU5PUk1fTUlOX18KKyMgIGRlZmluZSBMREJMX1RSVUVfTUlOIF9fTERCTF9ERU5PUk1fTUlOX18KKyMgIGRlZmluZSBGTFRfREVDSU1BTF9ESUcgX19GTFRfREVDSU1BTF9ESUdfXworIyAgZGVmaW5lIERCTF9ERUNJTUFMX0RJRyBfX0RCTF9ERUNJTUFMX0RJR19fCisjICBkZWZpbmUgTERCTF9ERUNJTUFMX0RJRyBfX0xEQkxfREVDSU1BTF9ESUdfXworI2VuZGlmCisKKyNlbmRpZiAvKiBfX0ZMT0FUX0ggKi8KZGlmZiAtLWdpdCBhL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL2ZtYTRpbnRyaW4uaCBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL2ZtYTRpbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWFhOGNlCi0tLSAvZGV2L251bGwKKysrIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvZm1hNGludHJpbi5oCkBAIC0wLDAgKzEsMjMwIEBACisvKj09PS0tLS0gZm1hNGludHJpbi5oIC0gRk1BNCBpbnRyaW5zaWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICoKKyAqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqLworCisjaWZuZGVmIF9fWDg2SU5UUklOX0gKKyNlcnJvciAiTmV2ZXIgdXNlIDxmbWE0aW50cmluLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDx4ODZpbnRyaW4uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmbmRlZiBfX0ZNQTRJTlRSSU5fSAorI2RlZmluZSBfX0ZNQTRJTlRSSU5fSAorCisjaW5jbHVkZSA8cG1taW50cmluLmg+CisKKy8qIERlZmluZSB0aGUgZGVmYXVsdCBhdHRyaWJ1dGVzIGZvciB0aGUgZnVuY3Rpb25zIGluIHRoaXMgZmlsZS4gKi8KKyNkZWZpbmUgX19ERUZBVUxUX0ZOX0FUVFJTIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXywgX190YXJnZXRfXygiZm1hNCIpKSkKKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hY2NfcHMoX19tMTI4IF9fQSwgX19tMTI4IF9fQiwgX19tMTI4IF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjgpX19idWlsdGluX2lhMzJfdmZtYWRkcHMoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CLCAoX192NHNmKV9fQyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFjY19wZChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IsIF9fbTEyOGQgX19DKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfdmZtYWRkcGQoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CLCAoX192MmRmKV9fQyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYWNjX3NzKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IsIF9fbTEyOCBfX0MpCit7CisgIHJldHVybiAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNzKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQiwgKF9fdjRzZilfX0MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hY2Nfc2QoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CLCBfX20xMjhkIF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNkKChfX3YyZGYpX19BLCAoX192MmRmKV9fQiwgKF9fdjJkZilfX0MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbXN1Yl9wcyhfX20xMjggX19BLCBfX20xMjggX19CLCBfX20xMjggX19DKQoreworICByZXR1cm4gKF9fbTEyOClfX2J1aWx0aW5faWEzMl92Zm1zdWJwcygoX192NHNmKV9fQSwgKF9fdjRzZilfX0IsIChfX3Y0c2YpX19DKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tc3ViX3BkKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQiwgX19tMTI4ZCBfX0MpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl92Zm1zdWJwZCgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IsIChfX3YyZGYpX19DKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21zdWJfc3MoX19tMTI4IF9fQSwgX19tMTI4IF9fQiwgX19tMTI4IF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjgpX19idWlsdGluX2lhMzJfdmZtc3Vic3MoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CLCAoX192NHNmKV9fQyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbXN1Yl9zZChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IsIF9fbTEyOGQgX19DKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfdmZtc3Vic2QoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CLCAoX192MmRmKV9fQyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9ubWFjY19wcyhfX20xMjggX19BLCBfX20xMjggX19CLCBfX20xMjggX19DKQoreworICByZXR1cm4gKF9fbTEyOClfX2J1aWx0aW5faWEzMl92Zm5tYWRkcHMoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CLCAoX192NHNmKV9fQyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbm1hY2NfcGQoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CLCBfX20xMjhkIF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX3Zmbm1hZGRwZCgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IsIChfX3YyZGYpX19DKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX25tYWNjX3NzKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IsIF9fbTEyOCBfX0MpCit7CisgIHJldHVybiAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX3Zmbm1hZGRzcygoX192NHNmKV9fQSwgKF9fdjRzZilfX0IsIChfX3Y0c2YpX19DKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9ubWFjY19zZChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IsIF9fbTEyOGQgX19DKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfdmZubWFkZHNkKChfX3YyZGYpX19BLCAoX192MmRmKV9fQiwgKF9fdjJkZilfX0MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbm1zdWJfcHMoX19tMTI4IF9fQSwgX19tMTI4IF9fQiwgX19tMTI4IF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjgpX19idWlsdGluX2lhMzJfdmZubXN1YnBzKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQiwgKF9fdjRzZilfX0MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX25tc3ViX3BkKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQiwgX19tMTI4ZCBfX0MpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl92Zm5tc3VicGQoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CLCAoX192MmRmKV9fQyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9ubXN1Yl9zcyhfX20xMjggX19BLCBfX20xMjggX19CLCBfX20xMjggX19DKQoreworICByZXR1cm4gKF9fbTEyOClfX2J1aWx0aW5faWEzMl92Zm5tc3Vic3MoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CLCAoX192NHNmKV9fQyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbm1zdWJfc2QoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CLCBfX20xMjhkIF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX3Zmbm1zdWJzZCgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IsIChfX3YyZGYpX19DKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hZGRzdWJfcHMoX19tMTI4IF9fQSwgX19tMTI4IF9fQiwgX19tMTI4IF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjgpX19idWlsdGluX2lhMzJfdmZtYWRkc3VicHMoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CLCAoX192NHNmKV9fQyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFkZHN1Yl9wZChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IsIF9fbTEyOGQgX19DKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfdmZtYWRkc3VicGQoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CLCAoX192MmRmKV9fQyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tc3ViYWRkX3BzKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IsIF9fbTEyOCBfX0MpCit7CisgIHJldHVybiAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX3ZmbXN1YmFkZHBzKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQiwgKF9fdjRzZilfX0MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21zdWJhZGRfcGQoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CLCBfX20xMjhkIF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX3ZmbXN1YmFkZHBkKChfX3YyZGYpX19BLCAoX192MmRmKV9fQiwgKF9fdjJkZilfX0MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFjY19wcyhfX20yNTYgX19BLCBfX20yNTYgX19CLCBfX20yNTYgX19DKQoreworICByZXR1cm4gKF9fbTI1NilfX2J1aWx0aW5faWEzMl92Zm1hZGRwczI1NigoX192OHNmKV9fQSwgKF9fdjhzZilfX0IsIChfX3Y4c2YpX19DKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYWNjX3BkKF9fbTI1NmQgX19BLCBfX20yNTZkIF9fQiwgX19tMjU2ZCBfX0MpCit7CisgIHJldHVybiAoX19tMjU2ZClfX2J1aWx0aW5faWEzMl92Zm1hZGRwZDI1NigoX192NGRmKV9fQSwgKF9fdjRkZilfX0IsIChfX3Y0ZGYpX19DKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21zdWJfcHMoX19tMjU2IF9fQSwgX19tMjU2IF9fQiwgX19tMjU2IF9fQykKK3sKKyAgcmV0dXJuIChfX20yNTYpX19idWlsdGluX2lhMzJfdmZtc3VicHMyNTYoKF9fdjhzZilfX0EsIChfX3Y4c2YpX19CLCAoX192OHNmKV9fQyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbXN1Yl9wZChfX20yNTZkIF9fQSwgX19tMjU2ZCBfX0IsIF9fbTI1NmQgX19DKQoreworICByZXR1cm4gKF9fbTI1NmQpX19idWlsdGluX2lhMzJfdmZtc3VicGQyNTYoKF9fdjRkZilfX0EsIChfX3Y0ZGYpX19CLCAoX192NGRmKV9fQyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9ubWFjY19wcyhfX20yNTYgX19BLCBfX20yNTYgX19CLCBfX20yNTYgX19DKQoreworICByZXR1cm4gKF9fbTI1NilfX2J1aWx0aW5faWEzMl92Zm5tYWRkcHMyNTYoKF9fdjhzZilfX0EsIChfX3Y4c2YpX19CLCAoX192OHNmKV9fQyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbm1hY2NfcGQoX19tMjU2ZCBfX0EsIF9fbTI1NmQgX19CLCBfX20yNTZkIF9fQykKK3sKKyAgcmV0dXJuIChfX20yNTZkKV9fYnVpbHRpbl9pYTMyX3Zmbm1hZGRwZDI1NigoX192NGRmKV9fQSwgKF9fdjRkZilfX0IsIChfX3Y0ZGYpX19DKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X25tc3ViX3BzKF9fbTI1NiBfX0EsIF9fbTI1NiBfX0IsIF9fbTI1NiBfX0MpCit7CisgIHJldHVybiAoX19tMjU2KV9fYnVpbHRpbl9pYTMyX3Zmbm1zdWJwczI1NigoX192OHNmKV9fQSwgKF9fdjhzZilfX0IsIChfX3Y4c2YpX19DKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9ubXN1Yl9wZChfX20yNTZkIF9fQSwgX19tMjU2ZCBfX0IsIF9fbTI1NmQgX19DKQoreworICByZXR1cm4gKF9fbTI1NmQpX19idWlsdGluX2lhMzJfdmZubXN1YnBkMjU2KChfX3Y0ZGYpX19BLCAoX192NGRmKV9fQiwgKF9fdjRkZilfX0MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbWFkZHN1Yl9wcyhfX20yNTYgX19BLCBfX20yNTYgX19CLCBfX20yNTYgX19DKQoreworICByZXR1cm4gKF9fbTI1NilfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwczI1NigoX192OHNmKV9fQSwgKF9fdjhzZilfX0IsIChfX3Y4c2YpX19DKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9tYWRkc3ViX3BkKF9fbTI1NmQgX19BLCBfX20yNTZkIF9fQiwgX19tMjU2ZCBfX0MpCit7CisgIHJldHVybiAoX19tMjU2ZClfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwZDI1NigoX192NGRmKV9fQSwgKF9fdjRkZilfX0IsIChfX3Y0ZGYpX19DKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X21zdWJhZGRfcHMoX19tMjU2IF9fQSwgX19tMjU2IF9fQiwgX19tMjU2IF9fQykKK3sKKyAgcmV0dXJuIChfX20yNTYpX19idWlsdGluX2lhMzJfdmZtc3ViYWRkcHMyNTYoKF9fdjhzZilfX0EsIChfX3Y4c2YpX19CLCAoX192OHNmKV9fQyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfbXN1YmFkZF9wZChfX20yNTZkIF9fQSwgX19tMjU2ZCBfX0IsIF9fbTI1NmQgX19DKQoreworICByZXR1cm4gKF9fbTI1NmQpX19idWlsdGluX2lhMzJfdmZtc3ViYWRkcGQyNTYoKF9fdjRkZilfX0EsIChfX3Y0ZGYpX19CLCAoX192NGRmKV9fQyk7Cit9CisKKyN1bmRlZiBfX0RFRkFVTFRfRk5fQVRUUlMKKworI2VuZGlmIC8qIF9fRk1BNElOVFJJTl9IICovCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9mbWFpbnRyaW4uaCBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL2ZtYWludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMmVmMGIKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9mbWFpbnRyaW4uaApAQCAtMCwwICsxLDIyOCBAQAorLyo9PT0tLS0tIGZtYTRpbnRyaW4uaCAtIEZNQTQgaW50cmluc2ljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqCisgKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisgKi8KKworI2lmbmRlZiBfX0lNTUlOVFJJTl9ICisjZXJyb3IgIk5ldmVyIHVzZSA8Zm1haW50cmluLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxpbW1pbnRyaW4uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmbmRlZiBfX0ZNQUlOVFJJTl9ICisjZGVmaW5lIF9fRk1BSU5UUklOX0gKKworLyogRGVmaW5lIHRoZSBkZWZhdWx0IGF0dHJpYnV0ZXMgZm9yIHRoZSBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlLiAqLworI2RlZmluZSBfX0RFRkFVTFRfRk5fQVRUUlMgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fLCBfX3RhcmdldF9fKCJmbWEiKSkpCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9mbWFkZF9wcyhfX20xMjggX19BLCBfX20xMjggX19CLCBfX20xMjggX19DKQoreworICByZXR1cm4gKF9fbTEyOClfX2J1aWx0aW5faWEzMl92Zm1hZGRwcygoX192NHNmKV9fQSwgKF9fdjRzZilfX0IsIChfX3Y0c2YpX19DKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9mbWFkZF9wZChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IsIF9fbTEyOGQgX19DKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfdmZtYWRkcGQoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CLCAoX192MmRmKV9fQyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9mbWFkZF9zcyhfX20xMjggX19BLCBfX20xMjggX19CLCBfX20xMjggX19DKQoreworICByZXR1cm4gKF9fbTEyOClfX2J1aWx0aW5faWEzMl92Zm1hZGRzcygoX192NHNmKV9fQSwgKF9fdjRzZilfX0IsIChfX3Y0c2YpX19DKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9mbWFkZF9zZChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IsIF9fbTEyOGQgX19DKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfdmZtYWRkc2QoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CLCAoX192MmRmKV9fQyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9mbXN1Yl9wcyhfX20xMjggX19BLCBfX20xMjggX19CLCBfX20xMjggX19DKQoreworICByZXR1cm4gKF9fbTEyOClfX2J1aWx0aW5faWEzMl92Zm1zdWJwcygoX192NHNmKV9fQSwgKF9fdjRzZilfX0IsIChfX3Y0c2YpX19DKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9mbXN1Yl9wZChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IsIF9fbTEyOGQgX19DKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfdmZtc3VicGQoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CLCAoX192MmRmKV9fQyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9mbXN1Yl9zcyhfX20xMjggX19BLCBfX20xMjggX19CLCBfX20xMjggX19DKQoreworICByZXR1cm4gKF9fbTEyOClfX2J1aWx0aW5faWEzMl92Zm1zdWJzcygoX192NHNmKV9fQSwgKF9fdjRzZilfX0IsIChfX3Y0c2YpX19DKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9mbXN1Yl9zZChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IsIF9fbTEyOGQgX19DKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfdmZtc3Vic2QoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CLCAoX192MmRmKV9fQyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9mbm1hZGRfcHMoX19tMTI4IF9fQSwgX19tMTI4IF9fQiwgX19tMTI4IF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjgpX19idWlsdGluX2lhMzJfdmZubWFkZHBzKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQiwgKF9fdjRzZilfX0MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2ZubWFkZF9wZChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IsIF9fbTEyOGQgX19DKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfdmZubWFkZHBkKChfX3YyZGYpX19BLCAoX192MmRmKV9fQiwgKF9fdjJkZilfX0MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fZm5tYWRkX3NzKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IsIF9fbTEyOCBfX0MpCit7CisgIHJldHVybiAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX3Zmbm1hZGRzcygoX192NHNmKV9fQSwgKF9fdjRzZilfX0IsIChfX3Y0c2YpX19DKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9mbm1hZGRfc2QoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CLCBfX20xMjhkIF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX3Zmbm1hZGRzZCgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IsIChfX3YyZGYpX19DKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2ZubXN1Yl9wcyhfX20xMjggX19BLCBfX20xMjggX19CLCBfX20xMjggX19DKQoreworICByZXR1cm4gKF9fbTEyOClfX2J1aWx0aW5faWEzMl92Zm5tc3VicHMoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CLCAoX192NHNmKV9fQyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fZm5tc3ViX3BkKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQiwgX19tMTI4ZCBfX0MpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl92Zm5tc3VicGQoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CLCAoX192MmRmKV9fQyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9mbm1zdWJfc3MoX19tMTI4IF9fQSwgX19tMTI4IF9fQiwgX19tMTI4IF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjgpX19idWlsdGluX2lhMzJfdmZubXN1YnNzKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQiwgKF9fdjRzZilfX0MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2ZubXN1Yl9zZChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IsIF9fbTEyOGQgX19DKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfdmZubXN1YnNkKChfX3YyZGYpX19BLCAoX192MmRmKV9fQiwgKF9fdjJkZilfX0MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fZm1hZGRzdWJfcHMoX19tMTI4IF9fQSwgX19tMTI4IF9fQiwgX19tMTI4IF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjgpX19idWlsdGluX2lhMzJfdmZtYWRkc3VicHMoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CLCAoX192NHNmKV9fQyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fZm1hZGRzdWJfcGQoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CLCBfX20xMjhkIF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBkKChfX3YyZGYpX19BLCAoX192MmRmKV9fQiwgKF9fdjJkZilfX0MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fZm1zdWJhZGRfcHMoX19tMTI4IF9fQSwgX19tMTI4IF9fQiwgX19tMTI4IF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjgpX19idWlsdGluX2lhMzJfdmZtc3ViYWRkcHMoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CLCAoX192NHNmKV9fQyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fZm1zdWJhZGRfcGQoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CLCBfX20xMjhkIF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX3ZmbXN1YmFkZHBkKChfX3YyZGYpX19BLCAoX192MmRmKV9fQiwgKF9fdjJkZilfX0MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfZm1hZGRfcHMoX19tMjU2IF9fQSwgX19tMjU2IF9fQiwgX19tMjU2IF9fQykKK3sKKyAgcmV0dXJuIChfX20yNTYpX19idWlsdGluX2lhMzJfdmZtYWRkcHMyNTYoKF9fdjhzZilfX0EsIChfX3Y4c2YpX19CLCAoX192OHNmKV9fQyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfZm1hZGRfcGQoX19tMjU2ZCBfX0EsIF9fbTI1NmQgX19CLCBfX20yNTZkIF9fQykKK3sKKyAgcmV0dXJuIChfX20yNTZkKV9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBkMjU2KChfX3Y0ZGYpX19BLCAoX192NGRmKV9fQiwgKF9fdjRkZilfX0MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfZm1zdWJfcHMoX19tMjU2IF9fQSwgX19tMjU2IF9fQiwgX19tMjU2IF9fQykKK3sKKyAgcmV0dXJuIChfX20yNTYpX19idWlsdGluX2lhMzJfdmZtc3VicHMyNTYoKF9fdjhzZilfX0EsIChfX3Y4c2YpX19CLCAoX192OHNmKV9fQyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfZm1zdWJfcGQoX19tMjU2ZCBfX0EsIF9fbTI1NmQgX19CLCBfX20yNTZkIF9fQykKK3sKKyAgcmV0dXJuIChfX20yNTZkKV9fYnVpbHRpbl9pYTMyX3ZmbXN1YnBkMjU2KChfX3Y0ZGYpX19BLCAoX192NGRmKV9fQiwgKF9fdjRkZilfX0MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20yNTYgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfZm5tYWRkX3BzKF9fbTI1NiBfX0EsIF9fbTI1NiBfX0IsIF9fbTI1NiBfX0MpCit7CisgIHJldHVybiAoX19tMjU2KV9fYnVpbHRpbl9pYTMyX3Zmbm1hZGRwczI1NigoX192OHNmKV9fQSwgKF9fdjhzZilfX0IsIChfX3Y4c2YpX19DKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9mbm1hZGRfcGQoX19tMjU2ZCBfX0EsIF9fbTI1NmQgX19CLCBfX20yNTZkIF9fQykKK3sKKyAgcmV0dXJuIChfX20yNTZkKV9fYnVpbHRpbl9pYTMyX3Zmbm1hZGRwZDI1NigoX192NGRmKV9fQSwgKF9fdjRkZilfX0IsIChfX3Y0ZGYpX19DKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2ZubXN1Yl9wcyhfX20yNTYgX19BLCBfX20yNTYgX19CLCBfX20yNTYgX19DKQoreworICByZXR1cm4gKF9fbTI1NilfX2J1aWx0aW5faWEzMl92Zm5tc3VicHMyNTYoKF9fdjhzZilfX0EsIChfX3Y4c2YpX19CLCAoX192OHNmKV9fQyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfZm5tc3ViX3BkKF9fbTI1NmQgX19BLCBfX20yNTZkIF9fQiwgX19tMjU2ZCBfX0MpCit7CisgIHJldHVybiAoX19tMjU2ZClfX2J1aWx0aW5faWEzMl92Zm5tc3VicGQyNTYoKF9fdjRkZilfX0EsIChfX3Y0ZGYpX19CLCAoX192NGRmKV9fQyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9mbWFkZHN1Yl9wcyhfX20yNTYgX19BLCBfX20yNTYgX19CLCBfX20yNTYgX19DKQoreworICByZXR1cm4gKF9fbTI1NilfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwczI1NigoX192OHNmKV9fQSwgKF9fdjhzZilfX0IsIChfX3Y4c2YpX19DKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9mbWFkZHN1Yl9wZChfX20yNTZkIF9fQSwgX19tMjU2ZCBfX0IsIF9fbTI1NmQgX19DKQoreworICByZXR1cm4gKF9fbTI1NmQpX19idWlsdGluX2lhMzJfdmZtYWRkc3VicGQyNTYoKF9fdjRkZilfX0EsIChfX3Y0ZGYpX19CLCAoX192NGRmKV9fQyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NiBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9mbXN1YmFkZF9wcyhfX20yNTYgX19BLCBfX20yNTYgX19CLCBfX20yNTYgX19DKQoreworICByZXR1cm4gKF9fbTI1NilfX2J1aWx0aW5faWEzMl92Zm1zdWJhZGRwczI1NigoX192OHNmKV9fQSwgKF9fdjhzZilfX0IsIChfX3Y4c2YpX19DKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbTI1Nl9mbXN1YmFkZF9wZChfX20yNTZkIF9fQSwgX19tMjU2ZCBfX0IsIF9fbTI1NmQgX19DKQoreworICByZXR1cm4gKF9fbTI1NmQpX19idWlsdGluX2lhMzJfdmZtc3ViYWRkcGQyNTYoKF9fdjRkZilfX0EsIChfX3Y0ZGYpX19CLCAoX192NGRmKV9fQyk7Cit9CisKKyN1bmRlZiBfX0RFRkFVTFRfRk5fQVRUUlMKKworI2VuZGlmIC8qIF9fRk1BSU5UUklOX0ggKi8KZGlmZiAtLWdpdCBhL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL2Z4c3JpbnRyaW4uaCBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL2Z4c3JpbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzYwMjZhCi0tLSAvZGV2L251bGwKKysrIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvZnhzcmludHJpbi5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qPT09LS0tLSBmeHNyaW50cmluLmggLSBGWFNSIGludHJpbnNpYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKgorICo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICovCisKKyNpZm5kZWYgX19JTU1JTlRSSU5fSAorI2Vycm9yICJOZXZlciB1c2UgPGZ4c3JpbnRyaW4uaD4gZGlyZWN0bHk7IGluY2x1ZGUgPGltbWludHJpbi5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9fRlhTUklOVFJJTl9ICisjZGVmaW5lIF9fRlhTUklOVFJJTl9ICisKKyNkZWZpbmUgX19ERUZBVUxUX0ZOX0FUVFJTIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXywgIF9fdGFyZ2V0X18oImZ4c3IiKSkpCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfZnhzYXZlKHZvaWQgKl9fcCkgeworICByZXR1cm4gX19idWlsdGluX2lhMzJfZnhzYXZlKF9fcCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfZnhzYXZlNjQodm9pZCAqX19wKSB7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9meHNhdmU2NChfX3ApOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX2Z4cnN0b3Iodm9pZCAqX19wKSB7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9meHJzdG9yKF9fcCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfZnhyc3RvcjY0KHZvaWQgKl9fcCkgeworICByZXR1cm4gX19idWlsdGluX2lhMzJfZnhyc3RvcjY0KF9fcCk7Cit9CisKKyN1bmRlZiBfX0RFRkFVTFRfRk5fQVRUUlMKKworI2VuZGlmCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9odG1pbnRyaW4uaCBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL2h0bWludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YzhkN2IKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9odG1pbnRyaW4uaApAQCAtMCwwICsxLDIyNiBAQAorLyo9PT0tLS0tIGh0bWludHJpbi5oIC0gU3RhbmRhcmQgaGVhZGVyIGZvciBQb3dlclBDIEhUTSAtLS0tLS0tLS0tLS0tLS09PT0qXAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqCitcKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qLworCisjaWZuZGVmIF9fSFRNSU5UUklOX0gKKyNkZWZpbmUgX19IVE1JTlRSSU5fSAorCisjaWZuZGVmIF9fSFRNX18KKyNlcnJvciAiSFRNIGluc3RydWN0aW9uIHNldCBub3QgZW5hYmxlZCIKKyNlbmRpZgorCisjaWZkZWYgX19wb3dlcnBjX18KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCit0eXBlZGVmIHVpbnQ2NF90IHRleGFzcl90OwordHlwZWRlZiB1aW50MzJfdCB0ZXhhc3J1X3Q7Cit0eXBlZGVmIHVpbnQzMl90IHRleGFzcmxfdDsKK3R5cGVkZWYgdWludHB0cl90IHRmaWFyX3Q7Cit0eXBlZGVmIHVpbnRwdHJfdCB0Zmhhcl90OworCisjZGVmaW5lIF9IVE1fU1RBVEUoQ1IwKSAoKENSMCA+PiAxKSAmIDB4MykKKyNkZWZpbmUgX0hUTV9OT05UUkFOU0FDVElPTkFMIDB4MAorI2RlZmluZSBfSFRNX1NVU1BFTkRFRCAgICAgICAgMHgxCisjZGVmaW5lIF9IVE1fVFJBTlNBQ1RJT05BTCAgICAweDIKKworI2RlZmluZSBfVEVYQVNSX0VYVFJBQ1RfQklUUyhURVhBU1IsQklUTlVNLFNJWkUpIFwKKyAgKCgoVEVYQVNSKSA+PiAoNjMtKEJJVE5VTSkpKSAmICgoMTw8KFNJWkUpKS0xKSkKKyNkZWZpbmUgX1RFWEFTUlVfRVhUUkFDVF9CSVRTKFRFWEFTUixCSVROVU0sU0laRSkgXAorICAoKChURVhBU1IpID4+ICgzMS0oQklUTlVNKSkpICYgKCgxPDwoU0laRSkpLTEpKQorCisjZGVmaW5lIF9URVhBU1JfRkFJTFVSRV9DT0RFKFRFWEFTUikgXAorICBfVEVYQVNSX0VYVFJBQ1RfQklUUyhURVhBU1IsIDcsIDgpCisjZGVmaW5lIF9URVhBU1JVX0ZBSUxVUkVfQ09ERShURVhBU1JVKSBcCisgIF9URVhBU1JVX0VYVFJBQ1RfQklUUyhURVhBU1JVLCA3LCA4KQorCisjZGVmaW5lIF9URVhBU1JfRkFJTFVSRV9QRVJTSVNURU5UKFRFWEFTUikgXAorICBfVEVYQVNSX0VYVFJBQ1RfQklUUyhURVhBU1IsIDcsIDEpCisjZGVmaW5lIF9URVhBU1JVX0ZBSUxVUkVfUEVSU0lTVEVOVChURVhBU1JVKSBcCisgIF9URVhBU1JVX0VYVFJBQ1RfQklUUyhURVhBU1JVLCA3LCAxKQorCisjZGVmaW5lIF9URVhBU1JfRElTQUxMT1dFRChURVhBU1IpIFwKKyAgX1RFWEFTUl9FWFRSQUNUX0JJVFMoVEVYQVNSLCA4LCAxKQorI2RlZmluZSBfVEVYQVNSVV9ESVNBTExPV0VEKFRFWEFTUlUpIFwKKyAgX1RFWEFTUlVfRVhUUkFDVF9CSVRTKFRFWEFTUlUsIDgsIDEpCisKKyNkZWZpbmUgX1RFWEFTUl9ORVNUSU5HX09WRVJGTE9XKFRFWEFTUikgXAorICBfVEVYQVNSX0VYVFJBQ1RfQklUUyhURVhBU1IsIDksIDEpCisjZGVmaW5lIF9URVhBU1JVX05FU1RJTkdfT1ZFUkZMT1coVEVYQVNSVSkgXAorICBfVEVYQVNSVV9FWFRSQUNUX0JJVFMoVEVYQVNSVSwgOSwgMSkKKworI2RlZmluZSBfVEVYQVNSX0ZPT1RQUklOVF9PVkVSRkxPVyhURVhBU1IpIFwKKyAgX1RFWEFTUl9FWFRSQUNUX0JJVFMoVEVYQVNSLCAxMCwgMSkKKyNkZWZpbmUgX1RFWEFTUlVfRk9PVFBSSU5UX09WRVJGTE9XKFRFWEFTUlUpIFwKKyAgX1RFWEFTUlVfRVhUUkFDVF9CSVRTKFRFWEFTUlUsIDEwLCAxKQorCisjZGVmaW5lIF9URVhBU1JfU0VMRl9JTkRVQ0VEX0NPTkZMSUNUKFRFWEFTUikgXAorICBfVEVYQVNSX0VYVFJBQ1RfQklUUyhURVhBU1IsIDExLCAxKQorI2RlZmluZSBfVEVYQVNSVV9TRUxGX0lORFVDRURfQ09ORkxJQ1QoVEVYQVNSVSkgXAorICBfVEVYQVNSVV9FWFRSQUNUX0JJVFMoVEVYQVNSVSwgMTEsIDEpCisKKyNkZWZpbmUgX1RFWEFTUl9OT05fVFJBTlNBQ1RJT05BTF9DT05GTElDVChURVhBU1IpIFwKKyAgX1RFWEFTUl9FWFRSQUNUX0JJVFMoVEVYQVNSLCAxMiwgMSkKKyNkZWZpbmUgX1RFWEFTUlVfTk9OX1RSQU5TQUNUSU9OQUxfQ09ORkxJQ1QoVEVYQVNSVSkgXAorICBfVEVYQVNSVV9FWFRSQUNUX0JJVFMoVEVYQVNSVSwgMTIsIDEpCisKKyNkZWZpbmUgX1RFWEFTUl9UUkFOU0FDVElPTl9DT05GTElDVChURVhBU1IpIFwKKyAgX1RFWEFTUl9FWFRSQUNUX0JJVFMoVEVYQVNSLCAxMywgMSkKKyNkZWZpbmUgX1RFWEFTUlVfVFJBTlNBQ1RJT05fQ09ORkxJQ1QoVEVYQVNSVSkgXAorICBfVEVYQVNSVV9FWFRSQUNUX0JJVFMoVEVYQVNSVSwgMTMsIDEpCisKKyNkZWZpbmUgX1RFWEFTUl9UUkFOU0xBVElPTl9JTlZBTElEQVRJT05fQ09ORkxJQ1QoVEVYQVNSKSBcCisgIF9URVhBU1JfRVhUUkFDVF9CSVRTKFRFWEFTUiwgMTQsIDEpCisjZGVmaW5lIF9URVhBU1JVX1RSQU5TTEFUSU9OX0lOVkFMSURBVElPTl9DT05GTElDVChURVhBU1JVKSBcCisgIF9URVhBU1JVX0VYVFJBQ1RfQklUUyhURVhBU1JVLCAxNCwgMSkKKworI2RlZmluZSBfVEVYQVNSX0lNUExFTUVOVEFJT05fU1BFQ0lGSUMoVEVYQVNSKSBcCisgIF9URVhBU1JfRVhUUkFDVF9CSVRTKFRFWEFTUiwgMTUsIDEpCisjZGVmaW5lIF9URVhBU1JVX0lNUExFTUVOVEFJT05fU1BFQ0lGSUMoVEVYQVNSVSkgXAorICBfVEVYQVNSVV9FWFRSQUNUX0JJVFMoVEVYQVNSVSwgMTUsIDEpCisKKyNkZWZpbmUgX1RFWEFTUl9JTlNUUlVDVElPTl9GRVRDSF9DT05GTElDVChURVhBU1IpIFwKKyAgX1RFWEFTUl9FWFRSQUNUX0JJVFMoVEVYQVNSLCAxNiwgMSkKKyNkZWZpbmUgX1RFWEFTUlVfSU5TVFJVQ1RJT05fRkVUQ0hfQ09ORkxJQ1QoVEVYQVNSVSkgXAorICBfVEVYQVNSVV9FWFRSQUNUX0JJVFMoVEVYQVNSVSwgMTYsIDEpCisKKyNkZWZpbmUgX1RFWEFTUl9BQk9SVChURVhBU1IpIFwKKyAgX1RFWEFTUl9FWFRSQUNUX0JJVFMoVEVYQVNSLCAzMSwgMSkKKyNkZWZpbmUgX1RFWEFTUlVfQUJPUlQoVEVYQVNSVSkgXAorICBfVEVYQVNSVV9FWFRSQUNUX0JJVFMoVEVYQVNSVSwgMzEsIDEpCisKKworI2RlZmluZSBfVEVYQVNSX1NVU1BFTkRFRChURVhBU1IpIFwKKyAgX1RFWEFTUl9FWFRSQUNUX0JJVFMoVEVYQVNSLCAzMiwgMSkKKworI2RlZmluZSBfVEVYQVNSX1BSSVZJTEVHRShURVhBU1IpIFwKKyAgX1RFWEFTUl9FWFRSQUNUX0JJVFMoVEVYQVNSLCAzNSwgMikKKworI2RlZmluZSBfVEVYQVNSX0ZBSUxVUkVfU1VNTUFSWShURVhBU1IpIFwKKyAgX1RFWEFTUl9FWFRSQUNUX0JJVFMoVEVYQVNSLCAzNiwgMSkKKworI2RlZmluZSBfVEVYQVNSX1RGSUFSX0VYQUNUKFRFWEFTUikgXAorICBfVEVYQVNSX0VYVFJBQ1RfQklUUyhURVhBU1IsIDM3LCAxKQorCisjZGVmaW5lIF9URVhBU1JfUk9UKFRFWEFTUikgXAorICBfVEVYQVNSX0VYVFJBQ1RfQklUUyhURVhBU1IsIDM4LCAxKQorCisjZGVmaW5lIF9URVhBU1JfVFJBTlNBQ1RJT05fTEVWRUwoVEVYQVNSKSBcCisgIF9URVhBU1JfRVhUUkFDVF9CSVRTKFRFWEFTUiwgNjMsIDEyKQorCisjZW5kaWYgLyogX19wb3dlcnBjICovCisKKyNpZmRlZiBfX3MzOTBfXworCisvKiBDb25kaXRpb24gY29kZXMgZ2VuZXJhdGVkIGJ5IHRiZWdpbiAgKi8KKyNkZWZpbmUgX0hUTV9UQkVHSU5fU1RBUlRFRCAgICAgICAwCisjZGVmaW5lIF9IVE1fVEJFR0lOX0lOREVURVJNSU5BVEUgMQorI2RlZmluZSBfSFRNX1RCRUdJTl9UUkFOU0lFTlQgICAgIDIKKyNkZWZpbmUgX0hUTV9UQkVHSU5fUEVSU0lTVEVOVCAgICAzCisKKy8qIFRoZSBhYm9ydCBjb2RlcyBiZWxvdyB0aGlzIHRocmVzaG9sZCBhcmUgcmVzZXJ2ZWQgZm9yIG1hY2hpbmUgdXNlLiAgKi8KKyNkZWZpbmUgX0hUTV9GSVJTVF9VU0VSX0FCT1JUX0NPREUgMjU2CisKKy8qIFRoZSB0cmFuc2FjdGlvbiBkaWFnbm9zdGljIGJsb2NrIGlzIGl0IGlzIGRlZmluZWQgaW4gdGhlIFByaW5jaXBsZXMKKyAgIG9mIE9wZXJhdGlvbiBjaGFwdGVyIDUtOTEuICAqLworCitzdHJ1Y3QgX19odG1fdGRiIHsKKyAgdW5zaWduZWQgY2hhciBmb3JtYXQ7ICAgICAgICAgICAgICAgIC8qICAgMCAqLworICB1bnNpZ25lZCBjaGFyIGZsYWdzOworICB1bnNpZ25lZCBjaGFyIHJlc2VydmVkMVs0XTsKKyAgdW5zaWduZWQgc2hvcnQgbmVzdGluZ19kZXB0aDsKKyAgdW5zaWduZWQgbG9uZyBsb25nIGFib3J0X2NvZGU7ICAgICAgIC8qICAgOCAqLworICB1bnNpZ25lZCBsb25nIGxvbmcgY29uZmxpY3RfdG9rZW47ICAgLyogIDE2ICovCisgIHVuc2lnbmVkIGxvbmcgbG9uZyBhdGlhOyAgICAgICAgICAgICAvKiAgMjQgKi8KKyAgdW5zaWduZWQgY2hhciBlYWlkOyAgICAgICAgICAgICAgICAgIC8qICAzMiAqLworICB1bnNpZ25lZCBjaGFyIGR4YzsKKyAgdW5zaWduZWQgY2hhciByZXNlcnZlZDJbMl07CisgIHVuc2lnbmVkIGludCBwcm9ncmFtX2ludF9pZDsKKyAgdW5zaWduZWQgbG9uZyBsb25nIGV4Y2VwdGlvbl9pZDsgICAgIC8qICA0MCAqLworICB1bnNpZ25lZCBsb25nIGxvbmcgYmVhOyAgICAgICAgICAgICAgLyogIDQ4ICovCisgIHVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWQzWzcyXTsgICAgICAgICAvKiAgNTYgKi8KKyAgdW5zaWduZWQgbG9uZyBsb25nIGdwcnNbMTZdOyAgICAgICAgIC8qIDEyOCAqLworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fLCBfX2FsaWduZWRfXyAoOCkpKTsKKworCisvKiBIZWxwZXIgaW50cmluc2ljcyB0byByZXRyeSB0YmVnaW4gaW4gY2FzZSBvZiB0cmFuc2llbnQgZmFpbHVyZS4gICovCisKK3N0YXRpYyBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fKSkKK19fYnVpbHRpbl90YmVnaW5fcmV0cnlfbnVsbCAoaW50IF9fcmV0cnkpCit7CisgIGludCBjYywgaSA9IDA7CisKKyAgd2hpbGUgKChjYyA9IF9fYnVpbHRpbl90YmVnaW4oMCkpID09IF9IVE1fVEJFR0lOX1RSQU5TSUVOVAorICAgICAgICAgJiYgaSsrIDwgX19yZXRyeSkKKyAgICBfX2J1aWx0aW5fdHhfYXNzaXN0KGkpOworCisgIHJldHVybiBjYzsKK30KKworc3RhdGljIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18pKQorX19idWlsdGluX3RiZWdpbl9yZXRyeV90ZGIgKHZvaWQgKl9fdGRiLCBpbnQgX19yZXRyeSkKK3sKKyAgaW50IGNjLCBpID0gMDsKKworICB3aGlsZSAoKGNjID0gX19idWlsdGluX3RiZWdpbihfX3RkYikpID09IF9IVE1fVEJFR0lOX1RSQU5TSUVOVAorICAgICAgICAgJiYgaSsrIDwgX19yZXRyeSkKKyAgICBfX2J1aWx0aW5fdHhfYXNzaXN0KGkpOworCisgIHJldHVybiBjYzsKK30KKworI2RlZmluZSBfX2J1aWx0aW5fdGJlZ2luX3JldHJ5KHRkYiwgcmV0cnkpIFwKKyAgKF9fYnVpbHRpbl9jb25zdGFudF9wKHRkYiA9PSAwKSAmJiB0ZGIgPT0gMCA/IFwKKyAgIF9fYnVpbHRpbl90YmVnaW5fcmV0cnlfbnVsbChyZXRyeSkgOiBcCisgICBfX2J1aWx0aW5fdGJlZ2luX3JldHJ5X3RkYih0ZGIsIHJldHJ5KSkKKworc3RhdGljIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18pKQorX19idWlsdGluX3RiZWdpbl9yZXRyeV9ub2Zsb2F0X251bGwgKGludCBfX3JldHJ5KQoreworICBpbnQgY2MsIGkgPSAwOworCisgIHdoaWxlICgoY2MgPSBfX2J1aWx0aW5fdGJlZ2luX25vZmxvYXQoMCkpID09IF9IVE1fVEJFR0lOX1RSQU5TSUVOVAorICAgICAgICAgJiYgaSsrIDwgX19yZXRyeSkKKyAgICBfX2J1aWx0aW5fdHhfYXNzaXN0KGkpOworCisgIHJldHVybiBjYzsKK30KKworc3RhdGljIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18pKQorX19idWlsdGluX3RiZWdpbl9yZXRyeV9ub2Zsb2F0X3RkYiAodm9pZCAqX190ZGIsIGludCBfX3JldHJ5KQoreworICBpbnQgY2MsIGkgPSAwOworCisgIHdoaWxlICgoY2MgPSBfX2J1aWx0aW5fdGJlZ2luX25vZmxvYXQoX190ZGIpKSA9PSBfSFRNX1RCRUdJTl9UUkFOU0lFTlQKKyAgICAgICAgICYmIGkrKyA8IF9fcmV0cnkpCisgICAgX19idWlsdGluX3R4X2Fzc2lzdChpKTsKKworICByZXR1cm4gY2M7Cit9CisKKyNkZWZpbmUgX19idWlsdGluX3RiZWdpbl9yZXRyeV9ub2Zsb2F0KHRkYiwgcmV0cnkpIFwKKyAgKF9fYnVpbHRpbl9jb25zdGFudF9wKHRkYiA9PSAwKSAmJiB0ZGIgPT0gMCA/IFwKKyAgIF9fYnVpbHRpbl90YmVnaW5fcmV0cnlfbm9mbG9hdF9udWxsKHJldHJ5KSA6IFwKKyAgIF9fYnVpbHRpbl90YmVnaW5fcmV0cnlfbm9mbG9hdF90ZGIodGRiLCByZXRyeSkpCisKKyNlbmRpZiAvKiBfX3MzOTBfXyAqLworCisjZW5kaWYgLyogX19IVE1JTlRSSU5fSCAqLwpkaWZmIC0tZ2l0IGEvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvaHRteGxpbnRyaW4uaCBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL2h0bXhsaW50cmluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZkYzcwNQotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL2h0bXhsaW50cmluLmgKQEAgLTAsMCArMSwzNjMgQEAKKy8qPT09LS0tLSBodG14bGludHJpbi5oIC0gWEwgY29tcGlsZXIgSFRNIGV4ZWN1dGlvbiBpbnRyaW5zaWNzLS0tLS0tLS0tLS0tLT09PSpcCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICoKK1wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisKKyNpZm5kZWYgX19IVE1YTElOVFJJTl9ICisjZGVmaW5lIF9fSFRNWExJTlRSSU5fSAorCisjaWZuZGVmIF9fSFRNX18KKyNlcnJvciAiSFRNIGluc3RydWN0aW9uIHNldCBub3QgZW5hYmxlZCIKKyNlbmRpZgorCisjaW5jbHVkZSA8aHRtaW50cmluLmg+CisKKyNpZmRlZiBfX3Bvd2VycGNfXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgX1RFWEFTUl9QVFIoVE1fQlVGKSBcCisgICgodGV4YXNyX3QgKikoKFRNX0JVRikrMCkpCisjZGVmaW5lIF9URVhBU1JVX1BUUihUTV9CVUYpIFwKKyAgKCh0ZXhhc3J1X3QgKikoKFRNX0JVRikrMCkpCisjZGVmaW5lIF9URVhBU1JMX1BUUihUTV9CVUYpIFwKKyAgKCh0ZXhhc3JsX3QgKikoKFRNX0JVRikrNCkpCisjZGVmaW5lIF9URklBUl9QVFIoVE1fQlVGKSBcCisgICgodGZpYXJfdCAqKSgoVE1fQlVGKSs4KSkKKwordHlwZWRlZiBjaGFyIFRNX2J1ZmZfdHlwZVsxNl07CisKKy8qIFRoaXMgbWFjcm8gY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSB0cmFuc2FjdGlvbiB3YXMgc3VjY2Vzc2Z1bGx5CisgICBzdGFydGVkIGZyb20gdGhlIF9fVE1fYmVnaW4oKSBhbmQgX19UTV9zaW1wbGVfYmVnaW4oKSBpbnRyaW5zaWMgZnVuY3Rpb25zCisgICBiZWxvdy4gICovCisjZGVmaW5lIF9IVE1fVEJFR0lOX1NUQVJURUQgICAgIDEKKworZXh0ZXJuIF9faW5saW5lIGxvbmcKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fVE1fc2ltcGxlX2JlZ2luICh2b2lkKQoreworICBpZiAoX19idWlsdGluX2V4cGVjdCAoX19idWlsdGluX3RiZWdpbiAoMCksIDEpKQorICAgIHJldHVybiBfSFRNX1RCRUdJTl9TVEFSVEVEOworICByZXR1cm4gMDsKK30KKworZXh0ZXJuIF9faW5saW5lIGxvbmcKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fVE1fYmVnaW4gKHZvaWQqIGNvbnN0IF9fVE1fYnVmZikKK3sKKyAgKl9URVhBU1JMX1BUUiAoX19UTV9idWZmKSA9IDA7CisgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChfX2J1aWx0aW5fdGJlZ2luICgwKSwgMSkpCisgICAgcmV0dXJuIF9IVE1fVEJFR0lOX1NUQVJURUQ7CisjaWZkZWYgX19wb3dlcnBjNjRfXworICAqX1RFWEFTUl9QVFIgKF9fVE1fYnVmZikgPSBfX2J1aWx0aW5fZ2V0X3RleGFzciAoKTsKKyNlbHNlCisgICpfVEVYQVNSVV9QVFIgKF9fVE1fYnVmZikgPSBfX2J1aWx0aW5fZ2V0X3RleGFzcnUgKCk7CisgICpfVEVYQVNSTF9QVFIgKF9fVE1fYnVmZikgPSBfX2J1aWx0aW5fZ2V0X3RleGFzciAoKTsKKyNlbmRpZgorICAqX1RGSUFSX1BUUiAoX19UTV9idWZmKSA9IF9fYnVpbHRpbl9nZXRfdGZpYXIgKCk7CisgIHJldHVybiAwOworfQorCitleHRlcm4gX19pbmxpbmUgbG9uZworX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19UTV9lbmQgKHZvaWQpCit7CisgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChfX2J1aWx0aW5fdGVuZCAoMCksIDEpKQorICAgIHJldHVybiAxOworICByZXR1cm4gMDsKK30KKworZXh0ZXJuIF9faW5saW5lIHZvaWQKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fVE1fYWJvcnQgKHZvaWQpCit7CisgIF9fYnVpbHRpbl90YWJvcnQgKDApOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZAorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19UTV9uYW1lZF9hYm9ydCAodW5zaWduZWQgY2hhciBjb25zdCBfX2NvZGUpCit7CisgIF9fYnVpbHRpbl90YWJvcnQgKF9fY29kZSk7Cit9CisKK2V4dGVybiBfX2lubGluZSB2b2lkCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX1RNX3Jlc3VtZSAodm9pZCkKK3sKKyAgX19idWlsdGluX3RyZXN1bWUgKCk7Cit9CisKK2V4dGVybiBfX2lubGluZSB2b2lkCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX1RNX3N1c3BlbmQgKHZvaWQpCit7CisgIF9fYnVpbHRpbl90c3VzcGVuZCAoKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGxvbmcKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fVE1faXNfdXNlcl9hYm9ydCAodm9pZCogY29uc3QgX19UTV9idWZmKQoreworICB0ZXhhc3J1X3QgdGV4YXNydSA9ICpfVEVYQVNSVV9QVFIgKF9fVE1fYnVmZik7CisgIHJldHVybiBfVEVYQVNSVV9BQk9SVCAodGV4YXNydSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBsb25nCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX1RNX2lzX25hbWVkX3VzZXJfYWJvcnQgKHZvaWQqIGNvbnN0IF9fVE1fYnVmZiwgdW5zaWduZWQgY2hhciAqX19jb2RlKQoreworICB0ZXhhc3J1X3QgdGV4YXNydSA9ICpfVEVYQVNSVV9QVFIgKF9fVE1fYnVmZik7CisKKyAgKl9fY29kZSA9IF9URVhBU1JVX0ZBSUxVUkVfQ09ERSAodGV4YXNydSk7CisgIHJldHVybiBfVEVYQVNSVV9BQk9SVCAodGV4YXNydSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBsb25nCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX1RNX2lzX2lsbGVnYWwgKHZvaWQqIGNvbnN0IF9fVE1fYnVmZikKK3sKKyAgdGV4YXNydV90IHRleGFzcnUgPSAqX1RFWEFTUlVfUFRSIChfX1RNX2J1ZmYpOworICByZXR1cm4gX1RFWEFTUlVfRElTQUxMT1dFRCAodGV4YXNydSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBsb25nCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX1RNX2lzX2Zvb3RwcmludF9leGNlZWRlZCAodm9pZCogY29uc3QgX19UTV9idWZmKQoreworICB0ZXhhc3J1X3QgdGV4YXNydSA9ICpfVEVYQVNSVV9QVFIgKF9fVE1fYnVmZik7CisgIHJldHVybiBfVEVYQVNSVV9GT09UUFJJTlRfT1ZFUkZMT1cgKHRleGFzcnUpOworfQorCitleHRlcm4gX19pbmxpbmUgbG9uZworX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19UTV9uZXN0aW5nX2RlcHRoICh2b2lkKiBjb25zdCBfX1RNX2J1ZmYpCit7CisgIHRleGFzcmxfdCB0ZXhhc3JsOworCisgIGlmIChfSFRNX1NUQVRFIChfX2J1aWx0aW5fdHRlc3QgKCkpID09IF9IVE1fTk9OVFJBTlNBQ1RJT05BTCkKKyAgICB7CisgICAgICB0ZXhhc3JsID0gKl9URVhBU1JMX1BUUiAoX19UTV9idWZmKTsKKyAgICAgIGlmICghX1RFWEFTUl9GQUlMVVJFX1NVTU1BUlkgKHRleGFzcmwpKQorICAgICAgICB0ZXhhc3JsID0gMDsKKyAgICB9CisgIGVsc2UKKyAgICB0ZXhhc3JsID0gKHRleGFzcmxfdCkgX19idWlsdGluX2dldF90ZXhhc3IgKCk7CisKKyAgcmV0dXJuIF9URVhBU1JfVFJBTlNBQ1RJT05fTEVWRUwgKHRleGFzcmwpOworfQorCitleHRlcm4gX19pbmxpbmUgbG9uZworX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19UTV9pc19uZXN0ZWRfdG9vX2RlZXAodm9pZCogY29uc3QgX19UTV9idWZmKQoreworICB0ZXhhc3J1X3QgdGV4YXNydSA9ICpfVEVYQVNSVV9QVFIgKF9fVE1fYnVmZik7CisgIHJldHVybiBfVEVYQVNSVV9ORVNUSU5HX09WRVJGTE9XICh0ZXhhc3J1KTsKK30KKworZXh0ZXJuIF9faW5saW5lIGxvbmcKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fVE1faXNfY29uZmxpY3Qodm9pZCogY29uc3QgX19UTV9idWZmKQoreworICB0ZXhhc3J1X3QgdGV4YXNydSA9ICpfVEVYQVNSVV9QVFIgKFRNX2J1ZmYpOworICAvKiBSZXR1cm4gVEVYQVNSIGJpdHMgMTEgKFNlbGYtSW5kdWNlZCBDb25mbGljdCkgdGhyb3VnaAorICAgICAxNCAoVHJhbnNsYXRpb24gSW52YWxpZGF0aW9uIENvbmZsaWN0KS4gICovCisgIHJldHVybiAoX1RFWEFTUlVfRVhUUkFDVF9CSVRTICh0ZXhhc3J1LCAxNCwgNCkpID8gMSA6IDA7Cit9CisKK2V4dGVybiBfX2lubGluZSBsb25nCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX1RNX2lzX2ZhaWx1cmVfcGVyc2lzdGVudCh2b2lkKiBjb25zdCBfX1RNX2J1ZmYpCit7CisgIHRleGFzcnVfdCB0ZXhhc3J1ID0gKl9URVhBU1JVX1BUUiAoX19UTV9idWZmKTsKKyAgcmV0dXJuIF9URVhBU1JVX0ZBSUxVUkVfUEVSU0lTVEVOVCAodGV4YXNydSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBsb25nCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX1RNX2ZhaWx1cmVfYWRkcmVzcyh2b2lkKiBjb25zdCBfX1RNX2J1ZmYpCit7CisgIHJldHVybiAqX1RGSUFSX1BUUiAoX19UTV9idWZmKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGxvbmcgbG9uZworX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19UTV9mYWlsdXJlX2NvZGUodm9pZCogY29uc3QgX19UTV9idWZmKQoreworICByZXR1cm4gKl9URVhBU1JfUFRSIChfX1RNX2J1ZmYpOworfQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19wb3dlcnBjX18gKi8KKworI2lmZGVmIF9fczM5MF9fCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyogVGhlc2UgaW50cmluc2ljcyBhcmUgYmVpbmcgbWFkZSBhdmFpbGFibGUgZm9yIGNvbXBhdGliaWxpdHkgd2l0aAorICAgdGhlIElCTSBYTCBjb21waWxlci4gIEZvciBkb2N1bWVudGF0aW9uIHBsZWFzZSBzZWUgdGhlICJ6L09TIFhMCisgICBDL0MrKyBQcm9ncmFtbWluZyBHdWlkZSIgcHVibGljYWxseSBhdmFpbGFibGUgb24gdGhlIHdlYi4gICovCisKK3N0YXRpYyBfX2lubGluZSBsb25nIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXykpCitfX1RNX3NpbXBsZV9iZWdpbiAoKQoreworICByZXR1cm4gX19idWlsdGluX3RiZWdpbl9ub2Zsb2F0ICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGxvbmcgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fKSkKK19fVE1fYmVnaW4gKHZvaWQqIGNvbnN0IF9fdGRiKQoreworICByZXR1cm4gX19idWlsdGluX3RiZWdpbl9ub2Zsb2F0IChfX3RkYik7Cit9CisKK3N0YXRpYyBfX2lubGluZSBsb25nIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXykpCitfX1RNX2VuZCAoKQoreworICByZXR1cm4gX19idWlsdGluX3RlbmQgKCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKK19fVE1fYWJvcnQgKCkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl90YWJvcnQgKF9IVE1fRklSU1RfVVNFUl9BQk9SVF9DT0RFKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fKSkKK19fVE1fbmFtZWRfYWJvcnQgKHVuc2lnbmVkIGNoYXIgY29uc3QgX19jb2RlKQoreworICByZXR1cm4gX19idWlsdGluX3RhYm9ydCAoKGludClfSFRNX0ZJUlNUX1VTRVJfQUJPUlRfQ09ERSArIF9fY29kZSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXykpCitfX1RNX25vbl90cmFuc2FjdGlvbmFsX3N0b3JlICh2b2lkKiBjb25zdCBfX2FkZHIsIGxvbmcgbG9uZyBjb25zdCBfX3ZhbHVlKQoreworICBfX2J1aWx0aW5fbm9uX3R4X3N0b3JlICgodWludDY0X3QqKV9fYWRkciwgKHVpbnQ2NF90KV9fdmFsdWUpOworfQorCitzdGF0aWMgX19pbmxpbmUgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18pKQorX19UTV9uZXN0aW5nX2RlcHRoICh2b2lkKiBjb25zdCBfX3RkYl9wdHIpCit7CisgIGludCBkZXB0aCA9IF9fYnVpbHRpbl90eF9uZXN0aW5nX2RlcHRoICgpOworICBzdHJ1Y3QgX19odG1fdGRiICp0ZGIgPSAoc3RydWN0IF9faHRtX3RkYiopX190ZGJfcHRyOworCisgIGlmIChkZXB0aCAhPSAwKQorICAgIHJldHVybiBkZXB0aDsKKworICBpZiAodGRiLT5mb3JtYXQgIT0gMSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIHRkYi0+bmVzdGluZ19kZXB0aDsKK30KKworLyogVHJhbnNhY3Rpb24gZmFpbHVyZSBkaWFnbm9zdGljcyAqLworCitzdGF0aWMgX19pbmxpbmUgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18pKQorX19UTV9pc191c2VyX2Fib3J0ICh2b2lkKiBjb25zdCBfX3RkYl9wdHIpCit7CisgIHN0cnVjdCBfX2h0bV90ZGIgKnRkYiA9IChzdHJ1Y3QgX19odG1fdGRiKilfX3RkYl9wdHI7CisKKyAgaWYgKHRkYi0+Zm9ybWF0ICE9IDEpCisgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuICEhKHRkYi0+YWJvcnRfY29kZSA+PSBfSFRNX0ZJUlNUX1VTRVJfQUJPUlRfQ09ERSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBsb25nIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXykpCitfX1RNX2lzX25hbWVkX3VzZXJfYWJvcnQgKHZvaWQqIGNvbnN0IF9fdGRiX3B0ciwgdW5zaWduZWQgY2hhciogX19jb2RlKQoreworICBzdHJ1Y3QgX19odG1fdGRiICp0ZGIgPSAoc3RydWN0IF9faHRtX3RkYiopX190ZGJfcHRyOworCisgIGlmICh0ZGItPmZvcm1hdCAhPSAxKQorICAgIHJldHVybiAwOworCisgIGlmICh0ZGItPmFib3J0X2NvZGUgPj0gX0hUTV9GSVJTVF9VU0VSX0FCT1JUX0NPREUpCisgICAgeworICAgICAgKl9fY29kZSA9IHRkYi0+YWJvcnRfY29kZSAtIF9IVE1fRklSU1RfVVNFUl9BQk9SVF9DT0RFOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIF9faW5saW5lIGxvbmcgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fKSkKK19fVE1faXNfaWxsZWdhbCAodm9pZCogY29uc3QgX190ZGJfcHRyKQoreworICBzdHJ1Y3QgX19odG1fdGRiICp0ZGIgPSAoc3RydWN0IF9faHRtX3RkYiopX190ZGJfcHRyOworCisgIHJldHVybiAodGRiLT5mb3JtYXQgPT0gMQorCSAgJiYgKHRkYi0+YWJvcnRfY29kZSA9PSA0IC8qIHVuZmlsdGVyZWQgcHJvZ3JhbSBpbnRlcnJ1cHRpb24gKi8KKwkgICAgICB8fCB0ZGItPmFib3J0X2NvZGUgPT0gMTEgLyogcmVzdHJpY3RlZCBpbnN0cnVjdGlvbiAqLykpOworfQorCitzdGF0aWMgX19pbmxpbmUgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18pKQorX19UTV9pc19mb290cHJpbnRfZXhjZWVkZWQgKHZvaWQqIGNvbnN0IF9fdGRiX3B0cikKK3sKKyAgc3RydWN0IF9faHRtX3RkYiAqdGRiID0gKHN0cnVjdCBfX2h0bV90ZGIqKV9fdGRiX3B0cjsKKworICByZXR1cm4gKHRkYi0+Zm9ybWF0ID09IDEKKwkgICYmICh0ZGItPmFib3J0X2NvZGUgPT0gNyAvKiBmZXRjaCBvdmVyZmxvdyAqLworCSAgICAgIHx8IHRkYi0+YWJvcnRfY29kZSA9PSA4IC8qIHN0b3JlIG92ZXJmbG93ICovKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBsb25nIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXykpCitfX1RNX2lzX25lc3RlZF90b29fZGVlcCAodm9pZCogY29uc3QgX190ZGJfcHRyKQoreworICBzdHJ1Y3QgX19odG1fdGRiICp0ZGIgPSAoc3RydWN0IF9faHRtX3RkYiopX190ZGJfcHRyOworCisgIHJldHVybiB0ZGItPmZvcm1hdCA9PSAxICYmIHRkYi0+YWJvcnRfY29kZSA9PSAxMzsgLyogZGVwdGggZXhjZWVkZWQgKi8KK30KKworc3RhdGljIF9faW5saW5lIGxvbmcgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fKSkKK19fVE1faXNfY29uZmxpY3QgKHZvaWQqIGNvbnN0IF9fdGRiX3B0cikKK3sKKyAgc3RydWN0IF9faHRtX3RkYiAqdGRiID0gKHN0cnVjdCBfX2h0bV90ZGIqKV9fdGRiX3B0cjsKKworICByZXR1cm4gKHRkYi0+Zm9ybWF0ID09IDEKKwkgICYmICh0ZGItPmFib3J0X2NvZGUgPT0gOSAvKiBmZXRjaCBjb25mbGljdCAqLworCSAgICAgIHx8IHRkYi0+YWJvcnRfY29kZSA9PSAxMCAvKiBzdG9yZSBjb25mbGljdCAqLykpOworfQorCitzdGF0aWMgX19pbmxpbmUgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18pKQorX19UTV9pc19mYWlsdXJlX3BlcnNpc3RlbnQgKGxvbmcgY29uc3QgX19yZXN1bHQpCit7CisgIHJldHVybiBfX3Jlc3VsdCA9PSBfSFRNX1RCRUdJTl9QRVJTSVNURU5UOworfQorCitzdGF0aWMgX19pbmxpbmUgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18pKQorX19UTV9mYWlsdXJlX2FkZHJlc3MgKHZvaWQqIGNvbnN0IF9fdGRiX3B0cikKK3sKKyAgc3RydWN0IF9faHRtX3RkYiAqdGRiID0gKHN0cnVjdCBfX2h0bV90ZGIqKV9fdGRiX3B0cjsKKyAgcmV0dXJuIHRkYi0+YXRpYTsKK30KKworc3RhdGljIF9faW5saW5lIGxvbmcgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fKSkKK19fVE1fZmFpbHVyZV9jb2RlICh2b2lkKiBjb25zdCBfX3RkYl9wdHIpCit7CisgIHN0cnVjdCBfX2h0bV90ZGIgKnRkYiA9IChzdHJ1Y3QgX19odG1fdGRiKilfX3RkYl9wdHI7CisKKyAgcmV0dXJuIHRkYi0+YWJvcnRfY29kZTsKK30KKworI2VuZGlmIC8qIF9fczM5MF9fICovCisKKyNlbmRpZiAvKiBfX0hUTVhMSU5UUklOX0ggICovCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9pYTMyaW50cmluLmggYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9pYTMyaW50cmluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk3ZjNmZAotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL2lhMzJpbnRyaW4uaApAQCAtMCwwICsxLDc5IEBACisvKiA9PT0tLS0tLS0tLSBpYTMyaW50cmluLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICoKKyAqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqLworCisjaWZuZGVmIF9fWDg2SU5UUklOX0gKKyNlcnJvciAiTmV2ZXIgdXNlIDxpYTMyaW50cmluLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDx4ODZpbnRyaW4uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmbmRlZiBfX0lBMzJJTlRSSU5fSAorI2RlZmluZSBfX0lBMzJJTlRSSU5fSAorCisjaWZkZWYgX194ODZfNjRfXworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZyBsb25nIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXykpCitfX3JlYWRlZmxhZ3Modm9pZCkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3JlYWRlZmxhZ3NfdTY0KCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fKSkKK19fd3JpdGVlZmxhZ3ModW5zaWduZWQgbG9uZyBsb25nIF9fZikKK3sKKyAgX19idWlsdGluX2lhMzJfd3JpdGVlZmxhZ3NfdTY0KF9fZik7Cit9CisKKyNlbHNlIC8qICFfX3g4Nl82NF9fICovCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fKSkKK19fcmVhZGVmbGFncyh2b2lkKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcmVhZGVmbGFnc191MzIoKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18pKQorX193cml0ZWVmbGFncyh1bnNpZ25lZCBpbnQgX19mKQoreworICBfX2J1aWx0aW5faWEzMl93cml0ZWVmbGFnc191MzIoX19mKTsKK30KKyNlbmRpZiAvKiAhX194ODZfNjRfXyAqLworCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nIGxvbmcgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fKSkKK19fcmRwbWMoaW50IF9fQSkgeworICByZXR1cm4gX19idWlsdGluX2lhMzJfcmRwbWMoX19BKTsKK30KKworLyogX19yZHRzYyAqLworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZyBsb25nIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXykpCitfX3JkdHNjKHZvaWQpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3JkdHNjKCk7Cit9CisKKy8qIF9fcmR0c2NwICovCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nIGxvbmcgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fKSkKK19fcmR0c2NwKHVuc2lnbmVkIGludCAqX19BKSB7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9yZHRzY3AoX19BKTsKK30KKworI2RlZmluZSBfcmR0c2MoKSBfX3JkdHNjKCkKKworI2RlZmluZSBfcmRwbWMoQSkgX19yZHBtYyhBKQorCisjZW5kaWYgLyogX19JQTMySU5UUklOX0ggKi8KZGlmZiAtLWdpdCBhL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL2ltbWludHJpbi5oIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvaW1taW50cmluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIyNzUyMwotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL2ltbWludHJpbi5oCkBAIC0wLDAgKzEsMjgzIEBACisvKj09PS0tLS0gaW1taW50cmluLmggLSBJbnRlbCBpbnRyaW5zaWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICoKKyAqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqLworCisjaWZuZGVmIF9fSU1NSU5UUklOX0gKKyNkZWZpbmUgX19JTU1JTlRSSU5fSAorCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9faGFzX2ZlYXR1cmUobW9kdWxlcykgfHwgZGVmaW5lZChfX01NWF9fKQorI2luY2x1ZGUgPG1taW50cmluLmg+CisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfX2hhc19mZWF0dXJlKG1vZHVsZXMpIHx8IGRlZmluZWQoX19TU0VfXykKKyNpbmNsdWRlIDx4bW1pbnRyaW4uaD4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9faGFzX2ZlYXR1cmUobW9kdWxlcykgfHwgZGVmaW5lZChfX1NTRTJfXykKKyNpbmNsdWRlIDxlbW1pbnRyaW4uaD4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9faGFzX2ZlYXR1cmUobW9kdWxlcykgfHwgZGVmaW5lZChfX1NTRTNfXykKKyNpbmNsdWRlIDxwbW1pbnRyaW4uaD4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9faGFzX2ZlYXR1cmUobW9kdWxlcykgfHwgZGVmaW5lZChfX1NTU0UzX18pCisjaW5jbHVkZSA8dG1taW50cmluLmg+CisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfX2hhc19mZWF0dXJlKG1vZHVsZXMpIHx8IFwKKyAgICAoZGVmaW5lZChfX1NTRTRfMl9fKSB8fCBkZWZpbmVkKF9fU1NFNF8xX18pKQorI2luY2x1ZGUgPHNtbWludHJpbi5oPgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX19oYXNfZmVhdHVyZShtb2R1bGVzKSB8fCBcCisgICAgKGRlZmluZWQoX19BRVNfXykgfHwgZGVmaW5lZChfX1BDTE1VTF9fKSkKKyNpbmNsdWRlIDx3bW1pbnRyaW4uaD4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9faGFzX2ZlYXR1cmUobW9kdWxlcykgfHwgZGVmaW5lZChfX0NMRkxVU0hPUFRfXykKKyNpbmNsdWRlIDxjbGZsdXNob3B0aW50cmluLmg+CisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfX2hhc19mZWF0dXJlKG1vZHVsZXMpIHx8IGRlZmluZWQoX19BVlhfXykKKyNpbmNsdWRlIDxhdnhpbnRyaW4uaD4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9faGFzX2ZlYXR1cmUobW9kdWxlcykgfHwgZGVmaW5lZChfX0FWWDJfXykKKyNpbmNsdWRlIDxhdngyaW50cmluLmg+CisKKy8qIFRoZSAyNTYtYml0IHZlcnNpb25zIG9mIGZ1bmN0aW9ucyBpbiBmMTZjaW50cmluLmguCisgICBJbnRlbCBkb2N1bWVudHMgdGhlc2UgYXMgYmVpbmcgaW4gaW1taW50cmluLmgsIGFuZAorICAgdGhleSBkZXBlbmQgb24gdHlwZWRlZnMgZnJvbSBhdnhpbnRyaW4uaC4gKi8KKworI2RlZmluZSBfbW0yNTZfY3Z0cHNfcGgoYSwgaW1tKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl92Y3Z0cHMycGgyNTYoKF9fdjhzZikoX19tMjU2KShhKSwgKGltbSkpOyB9KQorCitzdGF0aWMgX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXywgX190YXJnZXRfXygiZjE2YyIpKSkKK19tbTI1Nl9jdnRwaF9wcyhfX20xMjhpIF9fYSkKK3sKKyAgcmV0dXJuIChfX20yNTYpX19idWlsdGluX2lhMzJfdmN2dHBoMnBzMjU2KChfX3Y4aGkpX19hKTsKK30KKyNlbmRpZiAvKiBfX0FWWDJfXyAqLworCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9faGFzX2ZlYXR1cmUobW9kdWxlcykgfHwgZGVmaW5lZChfX0JNSV9fKQorI2luY2x1ZGUgPGJtaWludHJpbi5oPgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX19oYXNfZmVhdHVyZShtb2R1bGVzKSB8fCBkZWZpbmVkKF9fQk1JMl9fKQorI2luY2x1ZGUgPGJtaTJpbnRyaW4uaD4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9faGFzX2ZlYXR1cmUobW9kdWxlcykgfHwgZGVmaW5lZChfX0xaQ05UX18pCisjaW5jbHVkZSA8bHpjbnRpbnRyaW4uaD4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9faGFzX2ZlYXR1cmUobW9kdWxlcykgfHwgZGVmaW5lZChfX0ZNQV9fKQorI2luY2x1ZGUgPGZtYWludHJpbi5oPgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX19oYXNfZmVhdHVyZShtb2R1bGVzKSB8fCBkZWZpbmVkKF9fQVZYNTEyRl9fKQorI2luY2x1ZGUgPGF2eDUxMmZpbnRyaW4uaD4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9faGFzX2ZlYXR1cmUobW9kdWxlcykgfHwgZGVmaW5lZChfX0FWWDUxMlZMX18pCisjaW5jbHVkZSA8YXZ4NTEydmxpbnRyaW4uaD4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9faGFzX2ZlYXR1cmUobW9kdWxlcykgfHwgZGVmaW5lZChfX0FWWDUxMkJXX18pCisjaW5jbHVkZSA8YXZ4NTEyYndpbnRyaW4uaD4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9faGFzX2ZlYXR1cmUobW9kdWxlcykgfHwgZGVmaW5lZChfX0FWWDUxMkNEX18pCisjaW5jbHVkZSA8YXZ4NTEyY2RpbnRyaW4uaD4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9faGFzX2ZlYXR1cmUobW9kdWxlcykgfHwgZGVmaW5lZChfX0FWWDUxMkRRX18pCisjaW5jbHVkZSA8YXZ4NTEyZHFpbnRyaW4uaD4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9faGFzX2ZlYXR1cmUobW9kdWxlcykgfHwgXAorICAgIChkZWZpbmVkKF9fQVZYNTEyVkxfXykgJiYgZGVmaW5lZChfX0FWWDUxMkJXX18pKQorI2luY2x1ZGUgPGF2eDUxMnZsYndpbnRyaW4uaD4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9faGFzX2ZlYXR1cmUobW9kdWxlcykgfHwgXAorICAgIChkZWZpbmVkKF9fQVZYNTEyVkxfXykgJiYgZGVmaW5lZChfX0FWWDUxMkNEX18pKQorI2luY2x1ZGUgPGF2eDUxMnZsY2RpbnRyaW4uaD4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9faGFzX2ZlYXR1cmUobW9kdWxlcykgfHwgXAorICAgIChkZWZpbmVkKF9fQVZYNTEyVkxfXykgJiYgZGVmaW5lZChfX0FWWDUxMkRRX18pKQorI2luY2x1ZGUgPGF2eDUxMnZsZHFpbnRyaW4uaD4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9faGFzX2ZlYXR1cmUobW9kdWxlcykgfHwgZGVmaW5lZChfX0FWWDUxMkVSX18pCisjaW5jbHVkZSA8YXZ4NTEyZXJpbnRyaW4uaD4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9faGFzX2ZlYXR1cmUobW9kdWxlcykgfHwgZGVmaW5lZChfX0FWWDUxMklGTUFfXykKKyNpbmNsdWRlIDxhdng1MTJpZm1haW50cmluLmg+CisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfX2hhc19mZWF0dXJlKG1vZHVsZXMpIHx8IFwKKyAgICAoZGVmaW5lZChfX0FWWDUxMklGTUFfXykgJiYgZGVmaW5lZChfX0FWWDUxMlZMX18pKQorI2luY2x1ZGUgPGF2eDUxMmlmbWF2bGludHJpbi5oPgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX19oYXNfZmVhdHVyZShtb2R1bGVzKSB8fCBkZWZpbmVkKF9fQVZYNTEyVkJNSV9fKQorI2luY2x1ZGUgPGF2eDUxMnZibWlpbnRyaW4uaD4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9faGFzX2ZlYXR1cmUobW9kdWxlcykgfHwgXAorICAgIChkZWZpbmVkKF9fQVZYNTEyVkJNSV9fKSAmJiBkZWZpbmVkKF9fQVZYNTEyVkxfXykpCisjaW5jbHVkZSA8YXZ4NTEydmJtaXZsaW50cmluLmg+CisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfX2hhc19mZWF0dXJlKG1vZHVsZXMpIHx8IGRlZmluZWQoX19BVlg1MTJQRl9fKQorI2luY2x1ZGUgPGF2eDUxMnBmaW50cmluLmg+CisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfX2hhc19mZWF0dXJlKG1vZHVsZXMpIHx8IGRlZmluZWQoX19QS1VfXykKKyNpbmNsdWRlIDxwa3VpbnRyaW4uaD4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9faGFzX2ZlYXR1cmUobW9kdWxlcykgfHwgZGVmaW5lZChfX1JEUk5EX18pCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fLCBfX3RhcmdldF9fKCJyZHJuZCIpKSkKK19yZHJhbmQxNl9zdGVwKHVuc2lnbmVkIHNob3J0ICpfX3ApCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9yZHJhbmQxNl9zdGVwKF9fcCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18sIF9fdGFyZ2V0X18oInJkcm5kIikpKQorX3JkcmFuZDMyX3N0ZXAodW5zaWduZWQgaW50ICpfX3ApCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9yZHJhbmQzMl9zdGVwKF9fcCk7Cit9CisKKy8qIF9fYml0X3NjYW5fZm9yd2FyZCAqLworc3RhdGljIF9faW5saW5lX18gaW50IF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXykpCitfYml0X3NjYW5fZm9yd2FyZChpbnQgX19BKSB7CisgIHJldHVybiBfX2J1aWx0aW5fY3R6KF9fQSk7Cit9CisKKy8qIF9fYml0X3NjYW5fcmV2ZXJzZSAqLworc3RhdGljIF9faW5saW5lX18gaW50IF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXykpCitfYml0X3NjYW5fcmV2ZXJzZShpbnQgX19BKSB7CisgIHJldHVybiAzMSAtIF9fYnVpbHRpbl9jbHooX19BKTsKK30KKworI2lmZGVmIF9feDg2XzY0X18KK3N0YXRpYyBfX2lubGluZV9fIGludCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18sIF9fdGFyZ2V0X18oInJkcm5kIikpKQorX3JkcmFuZDY0X3N0ZXAodW5zaWduZWQgbG9uZyBsb25nICpfX3ApCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9yZHJhbmQ2NF9zdGVwKF9fcCk7Cit9CisjZW5kaWYKKyNlbmRpZiAvKiBfX1JEUk5EX18gKi8KKworI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfX2hhc19mZWF0dXJlKG1vZHVsZXMpIHx8IGRlZmluZWQoX19GU0dTQkFTRV9fKQorI2lmZGVmIF9feDg2XzY0X18KK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18sIF9fdGFyZ2V0X18oImZzZ3NiYXNlIikpKQorX3JlYWRmc2Jhc2VfdTMyKHZvaWQpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9yZGZzYmFzZTMyKCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18sIF9fdGFyZ2V0X18oImZzZ3NiYXNlIikpKQorX3JlYWRmc2Jhc2VfdTY0KHZvaWQpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9yZGZzYmFzZTY0KCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18sIF9fdGFyZ2V0X18oImZzZ3NiYXNlIikpKQorX3JlYWRnc2Jhc2VfdTMyKHZvaWQpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9yZGdzYmFzZTMyKCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18sIF9fdGFyZ2V0X18oImZzZ3NiYXNlIikpKQorX3JlYWRnc2Jhc2VfdTY0KHZvaWQpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9yZGdzYmFzZTY0KCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fLCBfX3RhcmdldF9fKCJmc2dzYmFzZSIpKSkKK193cml0ZWZzYmFzZV91MzIodW5zaWduZWQgaW50IF9fVikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3dyZnNiYXNlMzIoX19WKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18sIF9fdGFyZ2V0X18oImZzZ3NiYXNlIikpKQorX3dyaXRlZnNiYXNlX3U2NCh1bnNpZ25lZCBsb25nIGxvbmcgX19WKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfd3Jmc2Jhc2U2NChfX1YpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXywgX190YXJnZXRfXygiZnNnc2Jhc2UiKSkpCitfd3JpdGVnc2Jhc2VfdTMyKHVuc2lnbmVkIGludCBfX1YpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl93cmdzYmFzZTMyKF9fVik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fLCBfX3RhcmdldF9fKCJmc2dzYmFzZSIpKSkKK193cml0ZWdzYmFzZV91NjQodW5zaWduZWQgbG9uZyBsb25nIF9fVikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3dyZ3NiYXNlNjQoX19WKTsKK30KKworI2VuZGlmCisjZW5kaWYgLyogX19GU0dTQkFTRV9fICovCisKKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX19oYXNfZmVhdHVyZShtb2R1bGVzKSB8fCBkZWZpbmVkKF9fUlRNX18pCisjaW5jbHVkZSA8cnRtaW50cmluLmg+CisjaW5jbHVkZSA8eHRlc3RpbnRyaW4uaD4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9faGFzX2ZlYXR1cmUobW9kdWxlcykgfHwgZGVmaW5lZChfX1NIQV9fKQorI2luY2x1ZGUgPHNoYWludHJpbi5oPgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX19oYXNfZmVhdHVyZShtb2R1bGVzKSB8fCBkZWZpbmVkKF9fRlhTUl9fKQorI2luY2x1ZGUgPGZ4c3JpbnRyaW4uaD4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9faGFzX2ZlYXR1cmUobW9kdWxlcykgfHwgZGVmaW5lZChfX1hTQVZFX18pCisjaW5jbHVkZSA8eHNhdmVpbnRyaW4uaD4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9faGFzX2ZlYXR1cmUobW9kdWxlcykgfHwgZGVmaW5lZChfX1hTQVZFT1BUX18pCisjaW5jbHVkZSA8eHNhdmVvcHRpbnRyaW4uaD4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9faGFzX2ZlYXR1cmUobW9kdWxlcykgfHwgZGVmaW5lZChfX1hTQVZFQ19fKQorI2luY2x1ZGUgPHhzYXZlY2ludHJpbi5oPgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX19oYXNfZmVhdHVyZShtb2R1bGVzKSB8fCBkZWZpbmVkKF9fWFNBVkVTX18pCisjaW5jbHVkZSA8eHNhdmVzaW50cmluLmg+CisjZW5kaWYKKworLyogU29tZSBpbnRyaW5zaWNzIGluc2lkZSBhZHhpbnRyaW4uaCBhcmUgYXZhaWxhYmxlIG9ubHkgb24gcHJvY2Vzc29ycyB3aXRoIEFEWCwKKyAqIHdoZXJlYXMgb3RoZXJzIGFyZSBhbHNvIGF2YWlsYWJsZSBhdCBhbGwgdGltZXMuICovCisjaW5jbHVkZSA8YWR4aW50cmluLmg+CisKKyNlbmRpZiAvKiBfX0lNTUlOVFJJTl9IICovCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9pbnRyaW4uaCBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL2ludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxODcxMWEKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9pbnRyaW4uaApAQCAtMCwwICsxLDk1NyBAQAorLyogPT09LS0tLS0tLS0gaW50cmluLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICoKKyAqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqLworCisvKiBPbmx5IGluY2x1ZGUgdGhpcyBpZiB3ZSdyZSBjb21waWxpbmcgZm9yIHRoZSB3aW5kb3dzIHBsYXRmb3JtLiAqLworI2lmbmRlZiBfTVNDX1ZFUgorI2luY2x1ZGVfbmV4dCA8aW50cmluLmg+CisjZWxzZQorCisjaWZuZGVmIF9fSU5UUklOX0gKKyNkZWZpbmUgX19JTlRSSU5fSAorCisvKiBGaXJzdCBpbmNsdWRlIHRoZSBzdGFuZGFyZCBpbnRyaW5zaWNzLiAqLworI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKKyNpbmNsdWRlIDx4ODZpbnRyaW4uaD4KKyNlbmRpZgorCisvKiBGb3IgdGhlIGRlZmluaXRpb24gb2Ygam1wX2J1Zi4gKi8KKyNpZiBfX1NURENfSE9TVEVEX18KKyNpbmNsdWRlIDxzZXRqbXAuaD4KKyNlbmRpZgorCisvKiBEZWZpbmUgdGhlIGRlZmF1bHQgYXR0cmlidXRlcyBmb3IgdGhlIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUuICovCisjZGVmaW5lIF9fREVGQVVMVF9GTl9BVFRSUyBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18pKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fTU1YX18pCisvKiBBbmQgdGhlIHJhbmRvbSBvbmVzIHRoYXQgYXJlbid0IGluIHRob3NlIGZpbGVzLiAqLworX19tNjQgX21fZnJvbV9mbG9hdChmbG9hdCk7CitmbG9hdCBfbV90b19mbG9hdChfX202NCk7CisjZW5kaWYKKworLyogT3RoZXIgYXNzb3J0ZWQgaW5zdHJ1Y3Rpb24gaW50cmluc2ljcy4gKi8KK3ZvaWQgX19hZGRmc2J5dGUodW5zaWduZWQgbG9uZywgdW5zaWduZWQgY2hhcik7Cit2b2lkIF9fYWRkZnNkd29yZCh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKTsKK3ZvaWQgX19hZGRmc3dvcmQodW5zaWduZWQgbG9uZywgdW5zaWduZWQgc2hvcnQpOwordm9pZCBfX2NvZGVfc2VnKGNvbnN0IGNoYXIgKik7CitzdGF0aWMgX19pbmxpbmVfXwordm9pZCBfX2NwdWlkKGludFs0XSwgaW50KTsKK3N0YXRpYyBfX2lubGluZV9fCit2b2lkIF9fY3B1aWRleChpbnRbNF0sIGludCwgaW50KTsKK3ZvaWQgX19kZWJ1Z2JyZWFrKHZvaWQpOworX19pbnQ2NCBfX2VtdWwoaW50LCBpbnQpOwordW5zaWduZWQgX19pbnQ2NCBfX2VtdWx1KHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKK3ZvaWQgX19jZGVjbCBfX2Zhc3RmYWlsKHVuc2lnbmVkIGludCk7Cit1bnNpZ25lZCBpbnQgX19nZXRjYWxsZXJzZWZsYWdzKHZvaWQpOworc3RhdGljIF9faW5saW5lX18KK3ZvaWQgX19oYWx0KHZvaWQpOwordW5zaWduZWQgY2hhciBfX2luYnl0ZSh1bnNpZ25lZCBzaG9ydCk7Cit2b2lkIF9faW5ieXRlc3RyaW5nKHVuc2lnbmVkIHNob3J0LCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcpOwordm9pZCBfX2luY2ZzYnl0ZSh1bnNpZ25lZCBsb25nKTsKK3ZvaWQgX19pbmNmc2R3b3JkKHVuc2lnbmVkIGxvbmcpOwordm9pZCBfX2luY2Zzd29yZCh1bnNpZ25lZCBsb25nKTsKK3Vuc2lnbmVkIGxvbmcgX19pbmR3b3JkKHVuc2lnbmVkIHNob3J0KTsKK3ZvaWQgX19pbmR3b3Jkc3RyaW5nKHVuc2lnbmVkIHNob3J0LCB1bnNpZ25lZCBsb25nICosIHVuc2lnbmVkIGxvbmcpOwordm9pZCBfX2ludDJjKHZvaWQpOwordm9pZCBfX2ludmxwZyh2b2lkICopOwordW5zaWduZWQgc2hvcnQgX19pbndvcmQodW5zaWduZWQgc2hvcnQpOwordm9pZCBfX2lud29yZHN0cmluZyh1bnNpZ25lZCBzaG9ydCwgdW5zaWduZWQgc2hvcnQgKiwgdW5zaWduZWQgbG9uZyk7Cit2b2lkIF9fbGlkdCh2b2lkICopOwordW5zaWduZWQgX19pbnQ2NCBfX2xsX2xzaGlmdCh1bnNpZ25lZCBfX2ludDY0LCBpbnQpOworX19pbnQ2NCBfX2xsX3JzaGlmdChfX2ludDY0LCBpbnQpOwordm9pZCBfX2xsd3BjYih2b2lkICopOwordW5zaWduZWQgY2hhciBfX2x3cGluczMyKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOwordm9pZCBfX2x3cHZhbDMyKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOwordW5zaWduZWQgaW50IF9fbHpjbnQodW5zaWduZWQgaW50KTsKK3Vuc2lnbmVkIHNob3J0IF9fbHpjbnQxNih1bnNpZ25lZCBzaG9ydCk7CitzdGF0aWMgX19pbmxpbmVfXwordm9pZCBfX21vdnNiKHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgY2hhciBjb25zdCAqLCBzaXplX3QpOworc3RhdGljIF9faW5saW5lX18KK3ZvaWQgX19tb3ZzZCh1bnNpZ25lZCBsb25nICosIHVuc2lnbmVkIGxvbmcgY29uc3QgKiwgc2l6ZV90KTsKK3N0YXRpYyBfX2lubGluZV9fCit2b2lkIF9fbW92c3codW5zaWduZWQgc2hvcnQgKiwgdW5zaWduZWQgc2hvcnQgY29uc3QgKiwgc2l6ZV90KTsKK3ZvaWQgX19ub3Aodm9pZCk7Cit2b2lkIF9fbnZyZWdfcmVzdG9yZV9mZW5jZSh2b2lkKTsKK3ZvaWQgX19udnJlZ19zYXZlX2ZlbmNlKHZvaWQpOwordm9pZCBfX291dGJ5dGUodW5zaWduZWQgc2hvcnQsIHVuc2lnbmVkIGNoYXIpOwordm9pZCBfX291dGJ5dGVzdHJpbmcodW5zaWduZWQgc2hvcnQsIHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZyk7Cit2b2lkIF9fb3V0ZHdvcmQodW5zaWduZWQgc2hvcnQsIHVuc2lnbmVkIGxvbmcpOwordm9pZCBfX291dGR3b3Jkc3RyaW5nKHVuc2lnbmVkIHNob3J0LCB1bnNpZ25lZCBsb25nICosIHVuc2lnbmVkIGxvbmcpOwordm9pZCBfX291dHdvcmQodW5zaWduZWQgc2hvcnQsIHVuc2lnbmVkIHNob3J0KTsKK3ZvaWQgX19vdXR3b3Jkc3RyaW5nKHVuc2lnbmVkIHNob3J0LCB1bnNpZ25lZCBzaG9ydCAqLCB1bnNpZ25lZCBsb25nKTsKK3N0YXRpYyBfX2lubGluZV9fCit1bnNpZ25lZCBpbnQgX19wb3BjbnQodW5zaWduZWQgaW50KTsKK3N0YXRpYyBfX2lubGluZV9fCit1bnNpZ25lZCBzaG9ydCBfX3BvcGNudDE2KHVuc2lnbmVkIHNob3J0KTsKK3Vuc2lnbmVkIGxvbmcgX19yZWFkY3IwKHZvaWQpOwordW5zaWduZWQgbG9uZyBfX3JlYWRjcjIodm9pZCk7CitzdGF0aWMgX19pbmxpbmVfXwordW5zaWduZWQgbG9uZyBfX3JlYWRjcjModm9pZCk7Cit1bnNpZ25lZCBsb25nIF9fcmVhZGNyNCh2b2lkKTsKK3Vuc2lnbmVkIGxvbmcgX19yZWFkY3I4KHZvaWQpOwordW5zaWduZWQgaW50IF9fcmVhZGRyKHVuc2lnbmVkIGludCk7CisjaWZkZWYgX19pMzg2X18KK3N0YXRpYyBfX2lubGluZV9fCit1bnNpZ25lZCBjaGFyIF9fcmVhZGZzYnl0ZSh1bnNpZ25lZCBsb25nKTsKK3N0YXRpYyBfX2lubGluZV9fCit1bnNpZ25lZCBsb25nIF9fcmVhZGZzZHdvcmQodW5zaWduZWQgbG9uZyk7CitzdGF0aWMgX19pbmxpbmVfXwordW5zaWduZWQgX19pbnQ2NCBfX3JlYWRmc3F3b3JkKHVuc2lnbmVkIGxvbmcpOworc3RhdGljIF9faW5saW5lX18KK3Vuc2lnbmVkIHNob3J0IF9fcmVhZGZzd29yZCh1bnNpZ25lZCBsb25nKTsKKyNlbmRpZgorc3RhdGljIF9faW5saW5lX18KK3Vuc2lnbmVkIF9faW50NjQgX19yZWFkbXNyKHVuc2lnbmVkIGxvbmcpOwordW5zaWduZWQgX19pbnQ2NCBfX3JlYWRwbWModW5zaWduZWQgbG9uZyk7Cit1bnNpZ25lZCBsb25nIF9fc2VnbWVudGxpbWl0KHVuc2lnbmVkIGxvbmcpOwordm9pZCBfX3NpZHQodm9pZCAqKTsKK3ZvaWQgKl9fc2x3cGNiKHZvaWQpOworc3RhdGljIF9faW5saW5lX18KK3ZvaWQgX19zdG9zYih1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGNoYXIsIHNpemVfdCk7CitzdGF0aWMgX19pbmxpbmVfXwordm9pZCBfX3N0b3NkKHVuc2lnbmVkIGxvbmcgKiwgdW5zaWduZWQgbG9uZywgc2l6ZV90KTsKK3N0YXRpYyBfX2lubGluZV9fCit2b2lkIF9fc3Rvc3codW5zaWduZWQgc2hvcnQgKiwgdW5zaWduZWQgc2hvcnQsIHNpemVfdCk7Cit2b2lkIF9fc3ZtX2NsZ2kodm9pZCk7Cit2b2lkIF9fc3ZtX2ludmxwZ2Eodm9pZCAqLCBpbnQpOwordm9pZCBfX3N2bV9za2luaXQoaW50KTsKK3ZvaWQgX19zdm1fc3RnaSh2b2lkKTsKK3ZvaWQgX19zdm1fdm1sb2FkKHNpemVfdCk7Cit2b2lkIF9fc3ZtX3ZtcnVuKHNpemVfdCk7Cit2b2lkIF9fc3ZtX3Ztc2F2ZShzaXplX3QpOwordm9pZCBfX3VkMih2b2lkKTsKK3Vuc2lnbmVkIF9faW50NjQgX191bGxfcnNoaWZ0KHVuc2lnbmVkIF9faW50NjQsIGludCk7Cit2b2lkIF9fdm14X29mZih2b2lkKTsKK3ZvaWQgX192bXhfdm1wdHJzdCh1bnNpZ25lZCBfX2ludDY0ICopOwordm9pZCBfX3diaW52ZCh2b2lkKTsKK3ZvaWQgX193cml0ZWNyMCh1bnNpZ25lZCBpbnQpOworc3RhdGljIF9faW5saW5lX18KK3ZvaWQgX193cml0ZWNyMyh1bnNpZ25lZCBpbnQpOwordm9pZCBfX3dyaXRlY3I0KHVuc2lnbmVkIGludCk7Cit2b2lkIF9fd3JpdGVjcjgodW5zaWduZWQgaW50KTsKK3ZvaWQgX193cml0ZWRyKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKK3ZvaWQgX193cml0ZWZzYnl0ZSh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBjaGFyKTsKK3ZvaWQgX193cml0ZWZzZHdvcmQodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7Cit2b2lkIF9fd3JpdGVmc3F3b3JkKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIF9faW50NjQpOwordm9pZCBfX3dyaXRlZnN3b3JkKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIHNob3J0KTsKK3ZvaWQgX193cml0ZW1zcih1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBfX2ludDY0KTsKK3N0YXRpYyBfX2lubGluZV9fCit2b2lkICpfQWRkcmVzc09mUmV0dXJuQWRkcmVzcyh2b2lkKTsKK3N0YXRpYyBfX2lubGluZV9fCit1bnNpZ25lZCBjaGFyIF9CaXRTY2FuRm9yd2FyZCh1bnNpZ25lZCBsb25nICpfSW5kZXgsIHVuc2lnbmVkIGxvbmcgX01hc2spOworc3RhdGljIF9faW5saW5lX18KK3Vuc2lnbmVkIGNoYXIgX0JpdFNjYW5SZXZlcnNlKHVuc2lnbmVkIGxvbmcgKl9JbmRleCwgdW5zaWduZWQgbG9uZyBfTWFzayk7CitzdGF0aWMgX19pbmxpbmVfXwordW5zaWduZWQgY2hhciBfYml0dGVzdChsb25nIGNvbnN0ICosIGxvbmcpOworc3RhdGljIF9faW5saW5lX18KK3Vuc2lnbmVkIGNoYXIgX2JpdHRlc3RhbmRjb21wbGVtZW50KGxvbmcgKiwgbG9uZyk7CitzdGF0aWMgX19pbmxpbmVfXwordW5zaWduZWQgY2hhciBfYml0dGVzdGFuZHJlc2V0KGxvbmcgKiwgbG9uZyk7CitzdGF0aWMgX19pbmxpbmVfXwordW5zaWduZWQgY2hhciBfYml0dGVzdGFuZHNldChsb25nICosIGxvbmcpOwordW5zaWduZWQgX19pbnQ2NCBfX2NkZWNsIF9ieXRlc3dhcF91aW50NjQodW5zaWduZWQgX19pbnQ2NCk7Cit1bnNpZ25lZCBsb25nIF9fY2RlY2wgX2J5dGVzd2FwX3Vsb25nKHVuc2lnbmVkIGxvbmcpOwordW5zaWduZWQgc2hvcnQgX19jZGVjbCBfYnl0ZXN3YXBfdXNob3J0KHVuc2lnbmVkIHNob3J0KTsKK3ZvaWQgX19jZGVjbCBfZGlzYWJsZSh2b2lkKTsKK3ZvaWQgX19jZGVjbCBfZW5hYmxlKHZvaWQpOworbG9uZyBfSW50ZXJsb2NrZWRBZGRMYXJnZVN0YXRpc3RpYyhfX2ludDY0IHZvbGF0aWxlICpfQWRkZW5kLCBsb25nIF9WYWx1ZSk7CitzdGF0aWMgX19pbmxpbmVfXworbG9uZyBfSW50ZXJsb2NrZWRBbmQobG9uZyB2b2xhdGlsZSAqX1ZhbHVlLCBsb25nIF9NYXNrKTsKK3N0YXRpYyBfX2lubGluZV9fCitzaG9ydCBfSW50ZXJsb2NrZWRBbmQxNihzaG9ydCB2b2xhdGlsZSAqX1ZhbHVlLCBzaG9ydCBfTWFzayk7CitzdGF0aWMgX19pbmxpbmVfXworY2hhciBfSW50ZXJsb2NrZWRBbmQ4KGNoYXIgdm9sYXRpbGUgKl9WYWx1ZSwgY2hhciBfTWFzayk7Cit1bnNpZ25lZCBjaGFyIF9pbnRlcmxvY2tlZGJpdHRlc3RhbmRyZXNldChsb25nIHZvbGF0aWxlICosIGxvbmcpOworc3RhdGljIF9faW5saW5lX18KK3Vuc2lnbmVkIGNoYXIgX2ludGVybG9ja2VkYml0dGVzdGFuZHNldChsb25nIHZvbGF0aWxlICosIGxvbmcpOworc3RhdGljIF9faW5saW5lX18KK2xvbmcgX19jZGVjbCBfSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2UobG9uZyB2b2xhdGlsZSAqX0Rlc3RpbmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIF9FeGNoYW5nZSwgbG9uZyBfQ29tcGFyYW5kKTsKK2xvbmcgX0ludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlX0hMRUFjcXVpcmUobG9uZyB2b2xhdGlsZSAqLCBsb25nLCBsb25nKTsKK2xvbmcgX0ludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlX0hMRVJlbGVhc2UobG9uZyB2b2xhdGlsZSAqLCBsb25nLCBsb25nKTsKK3N0YXRpYyBfX2lubGluZV9fCitzaG9ydCBfSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2UxNihzaG9ydCB2b2xhdGlsZSAqX0Rlc3RpbmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgX0V4Y2hhbmdlLCBzaG9ydCBfQ29tcGFyYW5kKTsKK3N0YXRpYyBfX2lubGluZV9fCitfX2ludDY0IF9JbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZTY0KF9faW50NjQgdm9sYXRpbGUgKl9EZXN0aW5hdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pbnQ2NCBfRXhjaGFuZ2UsIF9faW50NjQgX0NvbXBhcmFuZCk7CitfX2ludDY0IF9JbnRlcmxvY2tlZGNvbXBhcmVFeGNoYW5nZTY0X0hMRUFjcXVpcmUoX19pbnQ2NCB2b2xhdGlsZSAqLCBfX2ludDY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faW50NjQpOworX19pbnQ2NCBfSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2U2NF9ITEVSZWxlYXNlKF9faW50NjQgdm9sYXRpbGUgKiwgX19pbnQ2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ludDY0KTsKK3N0YXRpYyBfX2lubGluZV9fCitjaGFyIF9JbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZTgoY2hhciB2b2xhdGlsZSAqX0Rlc3RpbmF0aW9uLCBjaGFyIF9FeGNoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIF9Db21wYXJhbmQpOwordm9pZCAqX0ludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlUG9pbnRlcl9ITEVBY3F1aXJlKHZvaWQgKnZvbGF0aWxlICosIHZvaWQgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopOwordm9pZCAqX0ludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlUG9pbnRlcl9ITEVSZWxlYXNlKHZvaWQgKnZvbGF0aWxlICosIHZvaWQgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopOworc3RhdGljIF9faW5saW5lX18KK2xvbmcgX19jZGVjbCBfSW50ZXJsb2NrZWREZWNyZW1lbnQobG9uZyB2b2xhdGlsZSAqX0FkZGVuZCk7CitzdGF0aWMgX19pbmxpbmVfXworc2hvcnQgX0ludGVybG9ja2VkRGVjcmVtZW50MTYoc2hvcnQgdm9sYXRpbGUgKl9BZGRlbmQpOworbG9uZyBfSW50ZXJsb2NrZWRFeGNoYW5nZShsb25nIHZvbGF0aWxlICpfVGFyZ2V0LCBsb25nIF9WYWx1ZSk7CitzdGF0aWMgX19pbmxpbmVfXworc2hvcnQgX0ludGVybG9ja2VkRXhjaGFuZ2UxNihzaG9ydCB2b2xhdGlsZSAqX1RhcmdldCwgc2hvcnQgX1ZhbHVlKTsKK3N0YXRpYyBfX2lubGluZV9fCitjaGFyIF9JbnRlcmxvY2tlZEV4Y2hhbmdlOChjaGFyIHZvbGF0aWxlICpfVGFyZ2V0LCBjaGFyIF9WYWx1ZSk7CitzdGF0aWMgX19pbmxpbmVfXworbG9uZyBfX2NkZWNsIF9JbnRlcmxvY2tlZEV4Y2hhbmdlQWRkKGxvbmcgdm9sYXRpbGUgKl9BZGRlbmQsIGxvbmcgX1ZhbHVlKTsKK2xvbmcgX0ludGVybG9ja2VkRXhjaGFuZ2VBZGRfSExFQWNxdWlyZShsb25nIHZvbGF0aWxlICosIGxvbmcpOworbG9uZyBfSW50ZXJsb2NrZWRFeGNoYW5nZUFkZF9ITEVSZWxlYXNlKGxvbmcgdm9sYXRpbGUgKiwgbG9uZyk7CitzdGF0aWMgX19pbmxpbmVfXworc2hvcnQgX0ludGVybG9ja2VkRXhjaGFuZ2VBZGQxNihzaG9ydCB2b2xhdGlsZSAqX0FkZGVuZCwgc2hvcnQgX1ZhbHVlKTsKK19faW50NjQgX0ludGVybG9ja2VkRXhjaGFuZ2VBZGQ2NF9ITEVBY3F1aXJlKF9faW50NjQgdm9sYXRpbGUgKiwgX19pbnQ2NCk7CitfX2ludDY0IF9JbnRlcmxvY2tlZEV4Y2hhbmdlQWRkNjRfSExFUmVsZWFzZShfX2ludDY0IHZvbGF0aWxlICosIF9faW50NjQpOworc3RhdGljIF9faW5saW5lX18KK2NoYXIgX0ludGVybG9ja2VkRXhjaGFuZ2VBZGQ4KGNoYXIgdm9sYXRpbGUgKl9BZGRlbmQsIGNoYXIgX1ZhbHVlKTsKK3N0YXRpYyBfX2lubGluZV9fCitsb25nIF9fY2RlY2wgX0ludGVybG9ja2VkSW5jcmVtZW50KGxvbmcgdm9sYXRpbGUgKl9BZGRlbmQpOworc3RhdGljIF9faW5saW5lX18KK3Nob3J0IF9JbnRlcmxvY2tlZEluY3JlbWVudDE2KHNob3J0IHZvbGF0aWxlICpfQWRkZW5kKTsKK3N0YXRpYyBfX2lubGluZV9fCitsb25nIF9JbnRlcmxvY2tlZE9yKGxvbmcgdm9sYXRpbGUgKl9WYWx1ZSwgbG9uZyBfTWFzayk7CitzdGF0aWMgX19pbmxpbmVfXworc2hvcnQgX0ludGVybG9ja2VkT3IxNihzaG9ydCB2b2xhdGlsZSAqX1ZhbHVlLCBzaG9ydCBfTWFzayk7CitzdGF0aWMgX19pbmxpbmVfXworY2hhciBfSW50ZXJsb2NrZWRPcjgoY2hhciB2b2xhdGlsZSAqX1ZhbHVlLCBjaGFyIF9NYXNrKTsKK3N0YXRpYyBfX2lubGluZV9fCitsb25nIF9JbnRlcmxvY2tlZFhvcihsb25nIHZvbGF0aWxlICpfVmFsdWUsIGxvbmcgX01hc2spOworc3RhdGljIF9faW5saW5lX18KK3Nob3J0IF9JbnRlcmxvY2tlZFhvcjE2KHNob3J0IHZvbGF0aWxlICpfVmFsdWUsIHNob3J0IF9NYXNrKTsKK3N0YXRpYyBfX2lubGluZV9fCitjaGFyIF9JbnRlcmxvY2tlZFhvcjgoY2hhciB2b2xhdGlsZSAqX1ZhbHVlLCBjaGFyIF9NYXNrKTsKK3ZvaWQgX19jZGVjbCBfaW52cGNpZCh1bnNpZ25lZCBpbnQsIHZvaWQgKik7CitzdGF0aWMgX19pbmxpbmVfXwordW5zaWduZWQgbG9uZyBfX2NkZWNsIF9scm90bCh1bnNpZ25lZCBsb25nLCBpbnQpOworc3RhdGljIF9faW5saW5lX18KK3Vuc2lnbmVkIGxvbmcgX19jZGVjbCBfbHJvdHIodW5zaWduZWQgbG9uZywgaW50KTsKK3N0YXRpYyBfX2lubGluZV9fCit2b2lkIF9SZWFkQmFycmllcih2b2lkKTsKK3N0YXRpYyBfX2lubGluZV9fCit2b2lkIF9SZWFkV3JpdGVCYXJyaWVyKHZvaWQpOworc3RhdGljIF9faW5saW5lX18KK3ZvaWQgKl9SZXR1cm5BZGRyZXNzKHZvaWQpOwordW5zaWduZWQgaW50IF9yb3J4X3UzMih1bnNpZ25lZCBpbnQsIGNvbnN0IHVuc2lnbmVkIGludCk7CitzdGF0aWMgX19pbmxpbmVfXwordW5zaWduZWQgaW50IF9fY2RlY2wgX3JvdGwodW5zaWduZWQgaW50IF9WYWx1ZSwgaW50IF9TaGlmdCk7CitzdGF0aWMgX19pbmxpbmVfXwordW5zaWduZWQgc2hvcnQgX3JvdGwxNih1bnNpZ25lZCBzaG9ydCBfVmFsdWUsIHVuc2lnbmVkIGNoYXIgX1NoaWZ0KTsKK3N0YXRpYyBfX2lubGluZV9fCit1bnNpZ25lZCBfX2ludDY0IF9fY2RlY2wgX3JvdGw2NCh1bnNpZ25lZCBfX2ludDY0IF9WYWx1ZSwgaW50IF9TaGlmdCk7CitzdGF0aWMgX19pbmxpbmVfXwordW5zaWduZWQgY2hhciBfcm90bDgodW5zaWduZWQgY2hhciBfVmFsdWUsIHVuc2lnbmVkIGNoYXIgX1NoaWZ0KTsKK3N0YXRpYyBfX2lubGluZV9fCit1bnNpZ25lZCBpbnQgX19jZGVjbCBfcm90cih1bnNpZ25lZCBpbnQgX1ZhbHVlLCBpbnQgX1NoaWZ0KTsKK3N0YXRpYyBfX2lubGluZV9fCit1bnNpZ25lZCBzaG9ydCBfcm90cjE2KHVuc2lnbmVkIHNob3J0IF9WYWx1ZSwgdW5zaWduZWQgY2hhciBfU2hpZnQpOworc3RhdGljIF9faW5saW5lX18KK3Vuc2lnbmVkIF9faW50NjQgX19jZGVjbCBfcm90cjY0KHVuc2lnbmVkIF9faW50NjQgX1ZhbHVlLCBpbnQgX1NoaWZ0KTsKK3N0YXRpYyBfX2lubGluZV9fCit1bnNpZ25lZCBjaGFyIF9yb3RyOCh1bnNpZ25lZCBjaGFyIF9WYWx1ZSwgdW5zaWduZWQgY2hhciBfU2hpZnQpOworaW50IF9zYXJ4X2kzMihpbnQsIHVuc2lnbmVkIGludCk7CisjaWYgX19TVERDX0hPU1RFRF9fCitpbnQgX19jZGVjbCBfc2V0am1wKGptcF9idWYpOworI2VuZGlmCit1bnNpZ25lZCBpbnQgX3NobHhfdTMyKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKK3Vuc2lnbmVkIGludCBfc2hyeF91MzIodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOwordm9pZCBfU3RvcmVfSExFUmVsZWFzZShsb25nIHZvbGF0aWxlICosIGxvbmcpOwordm9pZCBfU3RvcmU2NF9ITEVSZWxlYXNlKF9faW50NjQgdm9sYXRpbGUgKiwgX19pbnQ2NCk7Cit2b2lkIF9TdG9yZVBvaW50ZXJfSExFUmVsZWFzZSh2b2lkICp2b2xhdGlsZSAqLCB2b2lkICopOworc3RhdGljIF9faW5saW5lX18KK3ZvaWQgX1dyaXRlQmFycmllcih2b2lkKTsKK3Vuc2lnbmVkIF9faW50MzIgeGJlZ2luKHZvaWQpOwordm9pZCBfeGVuZCh2b2lkKTsKK3N0YXRpYyBfX2lubGluZV9fCisjZGVmaW5lIF9YQ1JfWEZFQVRVUkVfRU5BQkxFRF9NQVNLIDAKK3Vuc2lnbmVkIF9faW50NjQgX19jZGVjbCBfeGdldGJ2KHVuc2lnbmVkIGludCk7Cit2b2lkIF9fY2RlY2wgX3hzZXRidih1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIF9faW50NjQpOworCisvKiBUaGVzZSBhZGRpdGlvbmFsIGludHJpbnNpY3MgYXJlIHR1cm5lZCBvbiBpbiB4NjQvYW1kNjQveDg2XzY0IG1vZGUuICovCisjaWZkZWYgX194ODZfNjRfXwordm9pZCBfX2FkZGdzYnl0ZSh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBjaGFyKTsKK3ZvaWQgX19hZGRnc2R3b3JkKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpOwordm9pZCBfX2FkZGdzcXdvcmQodW5zaWduZWQgbG9uZywgdW5zaWduZWQgX19pbnQ2NCk7Cit2b2lkIF9fYWRkZ3N3b3JkKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIHNob3J0KTsKK3N0YXRpYyBfX2lubGluZV9fCit2b2lkIF9fZmFzdHN0b3JlZmVuY2Uodm9pZCk7Cit2b2lkIF9faW5jZ3NieXRlKHVuc2lnbmVkIGxvbmcpOwordm9pZCBfX2luY2dzZHdvcmQodW5zaWduZWQgbG9uZyk7Cit2b2lkIF9faW5jZ3Nxd29yZCh1bnNpZ25lZCBsb25nKTsKK3ZvaWQgX19pbmNnc3dvcmQodW5zaWduZWQgbG9uZyk7Cit1bnNpZ25lZCBjaGFyIF9fbHdwaW5zNjQodW5zaWduZWQgX19pbnQ2NCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOwordm9pZCBfX2x3cHZhbDY0KHVuc2lnbmVkIF9faW50NjQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKK3Vuc2lnbmVkIF9faW50NjQgX19semNudDY0KHVuc2lnbmVkIF9faW50NjQpOworc3RhdGljIF9faW5saW5lX18KK3ZvaWQgX19tb3ZzcSh1bnNpZ25lZCBsb25nIGxvbmcgKiwgdW5zaWduZWQgbG9uZyBsb25nIGNvbnN0ICosIHNpemVfdCk7CitfX2ludDY0IF9fbXVsaChfX2ludDY0LCBfX2ludDY0KTsKK3N0YXRpYyBfX2lubGluZV9fCit1bnNpZ25lZCBfX2ludDY0IF9fcG9wY250NjQodW5zaWduZWQgX19pbnQ2NCk7CitzdGF0aWMgX19pbmxpbmVfXwordW5zaWduZWQgY2hhciBfX3JlYWRnc2J5dGUodW5zaWduZWQgbG9uZyk7CitzdGF0aWMgX19pbmxpbmVfXwordW5zaWduZWQgbG9uZyBfX3JlYWRnc2R3b3JkKHVuc2lnbmVkIGxvbmcpOworc3RhdGljIF9faW5saW5lX18KK3Vuc2lnbmVkIF9faW50NjQgX19yZWFkZ3Nxd29yZCh1bnNpZ25lZCBsb25nKTsKK3Vuc2lnbmVkIHNob3J0IF9fcmVhZGdzd29yZCh1bnNpZ25lZCBsb25nKTsKK3Vuc2lnbmVkIF9faW50NjQgX19zaGlmdGxlZnQxMjgodW5zaWduZWQgX19pbnQ2NCBfTG93UGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgX19pbnQ2NCBfSGlnaFBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgX1NoaWZ0KTsKK3Vuc2lnbmVkIF9faW50NjQgX19zaGlmdHJpZ2h0MTI4KHVuc2lnbmVkIF9faW50NjQgX0xvd1BhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBfX2ludDY0IF9IaWdoUGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgX1NoaWZ0KTsKK3N0YXRpYyBfX2lubGluZV9fCit2b2lkIF9fc3Rvc3EodW5zaWduZWQgX19pbnQ2NCAqLCB1bnNpZ25lZCBfX2ludDY0LCBzaXplX3QpOwordW5zaWduZWQgY2hhciBfX3ZteF9vbih1bnNpZ25lZCBfX2ludDY0ICopOwordW5zaWduZWQgY2hhciBfX3ZteF92bWNsZWFyKHVuc2lnbmVkIF9faW50NjQgKik7Cit1bnNpZ25lZCBjaGFyIF9fdm14X3ZtbGF1bmNoKHZvaWQpOwordW5zaWduZWQgY2hhciBfX3ZteF92bXB0cmxkKHVuc2lnbmVkIF9faW50NjQgKik7Cit1bnNpZ25lZCBjaGFyIF9fdm14X3ZtcmVhZChzaXplX3QsIHNpemVfdCAqKTsKK3Vuc2lnbmVkIGNoYXIgX192bXhfdm1yZXN1bWUodm9pZCk7Cit1bnNpZ25lZCBjaGFyIF9fdm14X3Ztd3JpdGUoc2l6ZV90LCBzaXplX3QpOwordm9pZCBfX3dyaXRlZ3NieXRlKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGNoYXIpOwordm9pZCBfX3dyaXRlZ3Nkd29yZCh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKTsKK3ZvaWQgX193cml0ZWdzcXdvcmQodW5zaWduZWQgbG9uZywgdW5zaWduZWQgX19pbnQ2NCk7Cit2b2lkIF9fd3JpdGVnc3dvcmQodW5zaWduZWQgbG9uZywgdW5zaWduZWQgc2hvcnQpOworc3RhdGljIF9faW5saW5lX18KK3Vuc2lnbmVkIGNoYXIgX0JpdFNjYW5Gb3J3YXJkNjQodW5zaWduZWQgbG9uZyAqX0luZGV4LCB1bnNpZ25lZCBfX2ludDY0IF9NYXNrKTsKK3N0YXRpYyBfX2lubGluZV9fCit1bnNpZ25lZCBjaGFyIF9CaXRTY2FuUmV2ZXJzZTY0KHVuc2lnbmVkIGxvbmcgKl9JbmRleCwgdW5zaWduZWQgX19pbnQ2NCBfTWFzayk7CitzdGF0aWMgX19pbmxpbmVfXwordW5zaWduZWQgY2hhciBfYml0dGVzdDY0KF9faW50NjQgY29uc3QgKiwgX19pbnQ2NCk7CitzdGF0aWMgX19pbmxpbmVfXwordW5zaWduZWQgY2hhciBfYml0dGVzdGFuZGNvbXBsZW1lbnQ2NChfX2ludDY0ICosIF9faW50NjQpOworc3RhdGljIF9faW5saW5lX18KK3Vuc2lnbmVkIGNoYXIgX2JpdHRlc3RhbmRyZXNldDY0KF9faW50NjQgKiwgX19pbnQ2NCk7CitzdGF0aWMgX19pbmxpbmVfXwordW5zaWduZWQgY2hhciBfYml0dGVzdGFuZHNldDY0KF9faW50NjQgKiwgX19pbnQ2NCk7Cit1bnNpZ25lZCBfX2ludDY0IF9fY2RlY2wgX2J5dGVzd2FwX3VpbnQ2NCh1bnNpZ25lZCBfX2ludDY0KTsKK2xvbmcgX0ludGVybG9ja2VkQW5kX25wKGxvbmcgdm9sYXRpbGUgKl9WYWx1ZSwgbG9uZyBfTWFzayk7CitzaG9ydCBfSW50ZXJsb2NrZWRBbmQxNl9ucChzaG9ydCB2b2xhdGlsZSAqX1ZhbHVlLCBzaG9ydCBfTWFzayk7CitfX2ludDY0IF9JbnRlcmxvY2tlZEFuZDY0X25wKF9faW50NjQgdm9sYXRpbGUgKl9WYWx1ZSwgX19pbnQ2NCBfTWFzayk7CitjaGFyIF9JbnRlcmxvY2tlZEFuZDhfbnAoY2hhciB2b2xhdGlsZSAqX1ZhbHVlLCBjaGFyIF9NYXNrKTsKK3Vuc2lnbmVkIGNoYXIgX2ludGVybG9ja2VkYml0dGVzdGFuZHJlc2V0NjQoX19pbnQ2NCB2b2xhdGlsZSAqLCBfX2ludDY0KTsKK3N0YXRpYyBfX2lubGluZV9fCit1bnNpZ25lZCBjaGFyIF9pbnRlcmxvY2tlZGJpdHRlc3RhbmRzZXQ2NChfX2ludDY0IHZvbGF0aWxlICosIF9faW50NjQpOworbG9uZyBfSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2VfbnAobG9uZyB2b2xhdGlsZSAqX0Rlc3RpbmF0aW9uLCBsb25nIF9FeGNoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgX0NvbXBhcmFuZCk7Cit1bnNpZ25lZCBjaGFyIF9JbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZTEyOChfX2ludDY0IHZvbGF0aWxlICpfRGVzdGluYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ludDY0IF9FeGNoYW5nZUhpZ2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ludDY0IF9FeGNoYW5nZUxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faW50NjQgKl9Db21wYXJlYW5kUmVzdWx0KTsKK3Vuc2lnbmVkIGNoYXIgX0ludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlMTI4X25wKF9faW50NjQgdm9sYXRpbGUgKl9EZXN0aW5hdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faW50NjQgX0V4Y2hhbmdlSGlnaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faW50NjQgX0V4Y2hhbmdlTG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pbnQ2NCAqX0NvbXBhcmFuZFJlc3VsdCk7CitzaG9ydCBfSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2UxNl9ucChzaG9ydCB2b2xhdGlsZSAqX0Rlc3RpbmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgX0V4Y2hhbmdlLCBzaG9ydCBfQ29tcGFyYW5kKTsKK19faW50NjQgX0ludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlNjRfSExFQWNxdWlyZShfX2ludDY0IHZvbGF0aWxlICosIF9faW50NjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pbnQ2NCk7CitfX2ludDY0IF9JbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZTY0X0hMRVJlbGVhc2UoX19pbnQ2NCB2b2xhdGlsZSAqLCBfX2ludDY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faW50NjQpOworX19pbnQ2NCBfSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2U2NF9ucChfX2ludDY0IHZvbGF0aWxlICpfRGVzdGluYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faW50NjQgX0V4Y2hhbmdlLCBfX2ludDY0IF9Db21wYXJhbmQpOwordm9pZCAqX0ludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlUG9pbnRlcih2b2lkICp2b2xhdGlsZSAqX0Rlc3RpbmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpfRXhjaGFuZ2UsIHZvaWQgKl9Db21wYXJhbmQpOwordm9pZCAqX0ludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlUG9pbnRlcl9ucCh2b2lkICp2b2xhdGlsZSAqX0Rlc3RpbmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpfRXhjaGFuZ2UsIHZvaWQgKl9Db21wYXJhbmQpOworc3RhdGljIF9faW5saW5lX18KK19faW50NjQgX0ludGVybG9ja2VkRGVjcmVtZW50NjQoX19pbnQ2NCB2b2xhdGlsZSAqX0FkZGVuZCk7CitzdGF0aWMgX19pbmxpbmVfXworX19pbnQ2NCBfSW50ZXJsb2NrZWRFeGNoYW5nZTY0KF9faW50NjQgdm9sYXRpbGUgKl9UYXJnZXQsIF9faW50NjQgX1ZhbHVlKTsKK3N0YXRpYyBfX2lubGluZV9fCitfX2ludDY0IF9JbnRlcmxvY2tlZEV4Y2hhbmdlQWRkNjQoX19pbnQ2NCB2b2xhdGlsZSAqX0FkZGVuZCwgX19pbnQ2NCBfVmFsdWUpOwordm9pZCAqX0ludGVybG9ja2VkRXhjaGFuZ2VQb2ludGVyKHZvaWQgKnZvbGF0aWxlICpfVGFyZ2V0LCB2b2lkICpfVmFsdWUpOworc3RhdGljIF9faW5saW5lX18KK19faW50NjQgX0ludGVybG9ja2VkSW5jcmVtZW50NjQoX19pbnQ2NCB2b2xhdGlsZSAqX0FkZGVuZCk7Citsb25nIF9JbnRlcmxvY2tlZE9yX25wKGxvbmcgdm9sYXRpbGUgKl9WYWx1ZSwgbG9uZyBfTWFzayk7CitzaG9ydCBfSW50ZXJsb2NrZWRPcjE2X25wKHNob3J0IHZvbGF0aWxlICpfVmFsdWUsIHNob3J0IF9NYXNrKTsKK3N0YXRpYyBfX2lubGluZV9fCitfX2ludDY0IF9JbnRlcmxvY2tlZE9yNjQoX19pbnQ2NCB2b2xhdGlsZSAqX1ZhbHVlLCBfX2ludDY0IF9NYXNrKTsKK19faW50NjQgX0ludGVybG9ja2VkT3I2NF9ucChfX2ludDY0IHZvbGF0aWxlICpfVmFsdWUsIF9faW50NjQgX01hc2spOworY2hhciBfSW50ZXJsb2NrZWRPcjhfbnAoY2hhciB2b2xhdGlsZSAqX1ZhbHVlLCBjaGFyIF9NYXNrKTsKK2xvbmcgX0ludGVybG9ja2VkWG9yX25wKGxvbmcgdm9sYXRpbGUgKl9WYWx1ZSwgbG9uZyBfTWFzayk7CitzaG9ydCBfSW50ZXJsb2NrZWRYb3IxNl9ucChzaG9ydCB2b2xhdGlsZSAqX1ZhbHVlLCBzaG9ydCBfTWFzayk7CitzdGF0aWMgX19pbmxpbmVfXworX19pbnQ2NCBfSW50ZXJsb2NrZWRYb3I2NChfX2ludDY0IHZvbGF0aWxlICpfVmFsdWUsIF9faW50NjQgX01hc2spOworX19pbnQ2NCBfSW50ZXJsb2NrZWRYb3I2NF9ucChfX2ludDY0IHZvbGF0aWxlICpfVmFsdWUsIF9faW50NjQgX01hc2spOworY2hhciBfSW50ZXJsb2NrZWRYb3I4X25wKGNoYXIgdm9sYXRpbGUgKl9WYWx1ZSwgY2hhciBfTWFzayk7CitzdGF0aWMgX19pbmxpbmVfXworX19pbnQ2NCBfbXVsMTI4KF9faW50NjQgX011bHRpcGxpZXIsIF9faW50NjQgX011bHRpcGxpY2FuZCwKKyAgICAgICAgICAgICAgICBfX2ludDY0ICpfSGlnaFByb2R1Y3QpOwordW5zaWduZWQgX19pbnQ2NCBfcm9yeF91NjQodW5zaWduZWQgX19pbnQ2NCwgY29uc3QgdW5zaWduZWQgaW50KTsKK19faW50NjQgX3NhcnhfaTY0KF9faW50NjQsIHVuc2lnbmVkIGludCk7CisjaWYgX19TVERDX0hPU1RFRF9fCitpbnQgX19jZGVjbCBfc2V0am1wZXgoam1wX2J1Zik7CisjZW5kaWYKK3Vuc2lnbmVkIF9faW50NjQgX3NobHhfdTY0KHVuc2lnbmVkIF9faW50NjQsIHVuc2lnbmVkIGludCk7Cit1bnNpZ25lZCBfX2ludDY0IF9zaHJ4X3U2NCh1bnNpZ25lZCBfX2ludDY0LCB1bnNpZ25lZCBpbnQpOworLyoKKyAqIE11bHRpcGx5IHR3byA2NC1iaXQgaW50ZWdlcnMgYW5kIG9idGFpbiBhIDY0LWJpdCByZXN1bHQuCisgKiBUaGUgbG93LWhhbGYgaXMgcmV0dXJuZWQgZGlyZWN0bHkgYW5kIHRoZSBoaWdoIGhhbGYgaXMgaW4gYW4gb3V0IHBhcmFtZXRlci4KKyAqLworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgX19pbnQ2NCBfX0RFRkFVTFRfRk5fQVRUUlMKK191bXVsMTI4KHVuc2lnbmVkIF9faW50NjQgX011bHRpcGxpZXIsIHVuc2lnbmVkIF9faW50NjQgX011bHRpcGxpY2FuZCwKKyAgICAgICAgIHVuc2lnbmVkIF9faW50NjQgKl9IaWdoUHJvZHVjdCkgeworICB1bnNpZ25lZCBfX2ludDEyOCBfRnVsbFByb2R1Y3QgPQorICAgICAgKHVuc2lnbmVkIF9faW50MTI4KV9NdWx0aXBsaWVyICogKHVuc2lnbmVkIF9faW50MTI4KV9NdWx0aXBsaWNhbmQ7CisgICpfSGlnaFByb2R1Y3QgPSBfRnVsbFByb2R1Y3QgPj4gNjQ7CisgIHJldHVybiBfRnVsbFByb2R1Y3Q7Cit9CitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBfX2ludDY0IF9fREVGQVVMVF9GTl9BVFRSUworX191bXVsaCh1bnNpZ25lZCBfX2ludDY0IF9NdWx0aXBsaWVyLCB1bnNpZ25lZCBfX2ludDY0IF9NdWx0aXBsaWNhbmQpIHsKKyAgdW5zaWduZWQgX19pbnQxMjggX0Z1bGxQcm9kdWN0ID0KKyAgICAgICh1bnNpZ25lZCBfX2ludDEyOClfTXVsdGlwbGllciAqICh1bnNpZ25lZCBfX2ludDEyOClfTXVsdGlwbGljYW5kOworICByZXR1cm4gX0Z1bGxQcm9kdWN0ID4+IDY0OworfQorCisjZW5kaWYgLyogX194ODZfNjRfXyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorfCogTXVsdGlwbGljYXRpb24KK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgX19pbmxpbmVfXyBfX2ludDY0IF9fREVGQVVMVF9GTl9BVFRSUworX19lbXVsKGludCBfX2luMSwgaW50IF9faW4yKSB7CisgIHJldHVybiAoX19pbnQ2NClfX2luMSAqIChfX2ludDY0KV9faW4yOworfQorc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgX19pbnQ2NCBfX0RFRkFVTFRfRk5fQVRUUlMKK19fZW11bHUodW5zaWduZWQgaW50IF9faW4xLCB1bnNpZ25lZCBpbnQgX19pbjIpIHsKKyAgcmV0dXJuICh1bnNpZ25lZCBfX2ludDY0KV9faW4xICogKHVuc2lnbmVkIF9faW50NjQpX19pbjI7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorfCogQml0IFR3aWRkbGluZworXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGNoYXIgX19ERUZBVUxUX0ZOX0FUVFJTCitfcm90bDgodW5zaWduZWQgY2hhciBfVmFsdWUsIHVuc2lnbmVkIGNoYXIgX1NoaWZ0KSB7CisgIF9TaGlmdCAmPSAweDc7CisgIHJldHVybiBfU2hpZnQgPyAoX1ZhbHVlIDw8IF9TaGlmdCkgfCAoX1ZhbHVlID4+ICg4IC0gX1NoaWZ0KSkgOiBfVmFsdWU7Cit9CitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBjaGFyIF9fREVGQVVMVF9GTl9BVFRSUworX3JvdHI4KHVuc2lnbmVkIGNoYXIgX1ZhbHVlLCB1bnNpZ25lZCBjaGFyIF9TaGlmdCkgeworICBfU2hpZnQgJj0gMHg3OworICByZXR1cm4gX1NoaWZ0ID8gKF9WYWx1ZSA+PiBfU2hpZnQpIHwgKF9WYWx1ZSA8PCAoOCAtIF9TaGlmdCkpIDogX1ZhbHVlOworfQorc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgc2hvcnQgX19ERUZBVUxUX0ZOX0FUVFJTCitfcm90bDE2KHVuc2lnbmVkIHNob3J0IF9WYWx1ZSwgdW5zaWduZWQgY2hhciBfU2hpZnQpIHsKKyAgX1NoaWZ0ICY9IDB4ZjsKKyAgcmV0dXJuIF9TaGlmdCA/IChfVmFsdWUgPDwgX1NoaWZ0KSB8IChfVmFsdWUgPj4gKDE2IC0gX1NoaWZ0KSkgOiBfVmFsdWU7Cit9CitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBzaG9ydCBfX0RFRkFVTFRfRk5fQVRUUlMKK19yb3RyMTYodW5zaWduZWQgc2hvcnQgX1ZhbHVlLCB1bnNpZ25lZCBjaGFyIF9TaGlmdCkgeworICBfU2hpZnQgJj0gMHhmOworICByZXR1cm4gX1NoaWZ0ID8gKF9WYWx1ZSA+PiBfU2hpZnQpIHwgKF9WYWx1ZSA8PCAoMTYgLSBfU2hpZnQpKSA6IF9WYWx1ZTsKK30KK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludCBfX0RFRkFVTFRfRk5fQVRUUlMKK19yb3RsKHVuc2lnbmVkIGludCBfVmFsdWUsIGludCBfU2hpZnQpIHsKKyAgX1NoaWZ0ICY9IDB4MWY7CisgIHJldHVybiBfU2hpZnQgPyAoX1ZhbHVlIDw8IF9TaGlmdCkgfCAoX1ZhbHVlID4+ICgzMiAtIF9TaGlmdCkpIDogX1ZhbHVlOworfQorc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50IF9fREVGQVVMVF9GTl9BVFRSUworX3JvdHIodW5zaWduZWQgaW50IF9WYWx1ZSwgaW50IF9TaGlmdCkgeworICBfU2hpZnQgJj0gMHgxZjsKKyAgcmV0dXJuIF9TaGlmdCA/IChfVmFsdWUgPj4gX1NoaWZ0KSB8IChfVmFsdWUgPDwgKDMyIC0gX1NoaWZ0KSkgOiBfVmFsdWU7Cit9CitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nIF9fREVGQVVMVF9GTl9BVFRSUworX2xyb3RsKHVuc2lnbmVkIGxvbmcgX1ZhbHVlLCBpbnQgX1NoaWZ0KSB7CisgIF9TaGlmdCAmPSAweDFmOworICByZXR1cm4gX1NoaWZ0ID8gKF9WYWx1ZSA8PCBfU2hpZnQpIHwgKF9WYWx1ZSA+PiAoMzIgLSBfU2hpZnQpKSA6IF9WYWx1ZTsKK30KK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcgX19ERUZBVUxUX0ZOX0FUVFJTCitfbHJvdHIodW5zaWduZWQgbG9uZyBfVmFsdWUsIGludCBfU2hpZnQpIHsKKyAgX1NoaWZ0ICY9IDB4MWY7CisgIHJldHVybiBfU2hpZnQgPyAoX1ZhbHVlID4+IF9TaGlmdCkgfCAoX1ZhbHVlIDw8ICgzMiAtIF9TaGlmdCkpIDogX1ZhbHVlOworfQorc3RhdGljCitfX2lubGluZV9fIHVuc2lnbmVkIF9faW50NjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfcm90bDY0KHVuc2lnbmVkIF9faW50NjQgX1ZhbHVlLCBpbnQgX1NoaWZ0KSB7CisgIF9TaGlmdCAmPSAweDNmOworICByZXR1cm4gX1NoaWZ0ID8gKF9WYWx1ZSA8PCBfU2hpZnQpIHwgKF9WYWx1ZSA+PiAoNjQgLSBfU2hpZnQpKSA6IF9WYWx1ZTsKK30KK3N0YXRpYworX19pbmxpbmVfXyB1bnNpZ25lZCBfX2ludDY0IF9fREVGQVVMVF9GTl9BVFRSUworX3JvdHI2NCh1bnNpZ25lZCBfX2ludDY0IF9WYWx1ZSwgaW50IF9TaGlmdCkgeworICBfU2hpZnQgJj0gMHgzZjsKKyAgcmV0dXJuIF9TaGlmdCA/IChfVmFsdWUgPj4gX1NoaWZ0KSB8IChfVmFsdWUgPDwgKDY0IC0gX1NoaWZ0KSkgOiBfVmFsdWU7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorfCogQml0IENvdW50aW5nIGFuZCBUZXN0aW5nCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgY2hhciBfX0RFRkFVTFRfRk5fQVRUUlMKK19CaXRTY2FuRm9yd2FyZCh1bnNpZ25lZCBsb25nICpfSW5kZXgsIHVuc2lnbmVkIGxvbmcgX01hc2spIHsKKyAgaWYgKCFfTWFzaykKKyAgICByZXR1cm4gMDsKKyAgKl9JbmRleCA9IF9fYnVpbHRpbl9jdHpsKF9NYXNrKTsKKyAgcmV0dXJuIDE7Cit9CitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBjaGFyIF9fREVGQVVMVF9GTl9BVFRSUworX0JpdFNjYW5SZXZlcnNlKHVuc2lnbmVkIGxvbmcgKl9JbmRleCwgdW5zaWduZWQgbG9uZyBfTWFzaykgeworICBpZiAoIV9NYXNrKQorICAgIHJldHVybiAwOworICAqX0luZGV4ID0gMzEgLSBfX2J1aWx0aW5fY2x6bChfTWFzayk7CisgIHJldHVybiAxOworfQorc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgc2hvcnQgX19ERUZBVUxUX0ZOX0FUVFJTCitfX3BvcGNudDE2KHVuc2lnbmVkIHNob3J0IF9WYWx1ZSkgeworICByZXR1cm4gX19idWlsdGluX3BvcGNvdW50KChpbnQpX1ZhbHVlKTsKK30KK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludCBfX0RFRkFVTFRfRk5fQVRUUlMKK19fcG9wY250KHVuc2lnbmVkIGludCBfVmFsdWUpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9wb3Bjb3VudChfVmFsdWUpOworfQorc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgY2hhciBfX0RFRkFVTFRfRk5fQVRUUlMKK19iaXR0ZXN0KGxvbmcgY29uc3QgKl9CaXRCYXNlLCBsb25nIF9CaXRQb3MpIHsKKyAgcmV0dXJuICgqX0JpdEJhc2UgPj4gX0JpdFBvcykgJiAxOworfQorc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgY2hhciBfX0RFRkFVTFRfRk5fQVRUUlMKK19iaXR0ZXN0YW5kY29tcGxlbWVudChsb25nICpfQml0QmFzZSwgbG9uZyBfQml0UG9zKSB7CisgIHVuc2lnbmVkIGNoYXIgX1JlcyA9ICgqX0JpdEJhc2UgPj4gX0JpdFBvcykgJiAxOworICAqX0JpdEJhc2UgPSAqX0JpdEJhc2UgXiAoMSA8PCBfQml0UG9zKTsKKyAgcmV0dXJuIF9SZXM7Cit9CitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBjaGFyIF9fREVGQVVMVF9GTl9BVFRSUworX2JpdHRlc3RhbmRyZXNldChsb25nICpfQml0QmFzZSwgbG9uZyBfQml0UG9zKSB7CisgIHVuc2lnbmVkIGNoYXIgX1JlcyA9ICgqX0JpdEJhc2UgPj4gX0JpdFBvcykgJiAxOworICAqX0JpdEJhc2UgPSAqX0JpdEJhc2UgJiB+KDEgPDwgX0JpdFBvcyk7CisgIHJldHVybiBfUmVzOworfQorc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgY2hhciBfX0RFRkFVTFRfRk5fQVRUUlMKK19iaXR0ZXN0YW5kc2V0KGxvbmcgKl9CaXRCYXNlLCBsb25nIF9CaXRQb3MpIHsKKyAgdW5zaWduZWQgY2hhciBfUmVzID0gKCpfQml0QmFzZSA+PiBfQml0UG9zKSAmIDE7CisgICpfQml0QmFzZSA9ICpfQml0QmFzZSB8ICgxIDw8IF9CaXRQb3MpOworICByZXR1cm4gX1JlczsKK30KK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGNoYXIgX19ERUZBVUxUX0ZOX0FUVFJTCitfaW50ZXJsb2NrZWRiaXR0ZXN0YW5kc2V0KGxvbmcgdm9sYXRpbGUgKl9CaXRCYXNlLCBsb25nIF9CaXRQb3MpIHsKKyAgbG9uZyBfUHJldlZhbCA9IF9fYXRvbWljX2ZldGNoX29yKF9CaXRCYXNlLCAxbCA8PCBfQml0UG9zLCBfX0FUT01JQ19TRVFfQ1NUKTsKKyAgcmV0dXJuIChfUHJldlZhbCA+PiBfQml0UG9zKSAmIDE7Cit9CisjaWZkZWYgX194ODZfNjRfXworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgY2hhciBfX0RFRkFVTFRfRk5fQVRUUlMKK19CaXRTY2FuRm9yd2FyZDY0KHVuc2lnbmVkIGxvbmcgKl9JbmRleCwgdW5zaWduZWQgX19pbnQ2NCBfTWFzaykgeworICBpZiAoIV9NYXNrKQorICAgIHJldHVybiAwOworICAqX0luZGV4ID0gX19idWlsdGluX2N0emxsKF9NYXNrKTsKKyAgcmV0dXJuIDE7Cit9CitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBjaGFyIF9fREVGQVVMVF9GTl9BVFRSUworX0JpdFNjYW5SZXZlcnNlNjQodW5zaWduZWQgbG9uZyAqX0luZGV4LCB1bnNpZ25lZCBfX2ludDY0IF9NYXNrKSB7CisgIGlmICghX01hc2spCisgICAgcmV0dXJuIDA7CisgICpfSW5kZXggPSA2MyAtIF9fYnVpbHRpbl9jbHpsbChfTWFzayk7CisgIHJldHVybiAxOworfQorc3RhdGljIF9faW5saW5lX18KK3Vuc2lnbmVkIF9faW50NjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfX3BvcGNudDY0KHVuc2lnbmVkIF9faW50NjQgX1ZhbHVlKSB7CisgIHJldHVybiBfX2J1aWx0aW5fcG9wY291bnRsbChfVmFsdWUpOworfQorc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgY2hhciBfX0RFRkFVTFRfRk5fQVRUUlMKK19iaXR0ZXN0NjQoX19pbnQ2NCBjb25zdCAqX0JpdEJhc2UsIF9faW50NjQgX0JpdFBvcykgeworICByZXR1cm4gKCpfQml0QmFzZSA+PiBfQml0UG9zKSAmIDE7Cit9CitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBjaGFyIF9fREVGQVVMVF9GTl9BVFRSUworX2JpdHRlc3RhbmRjb21wbGVtZW50NjQoX19pbnQ2NCAqX0JpdEJhc2UsIF9faW50NjQgX0JpdFBvcykgeworICB1bnNpZ25lZCBjaGFyIF9SZXMgPSAoKl9CaXRCYXNlID4+IF9CaXRQb3MpICYgMTsKKyAgKl9CaXRCYXNlID0gKl9CaXRCYXNlIF4gKDFsbCA8PCBfQml0UG9zKTsKKyAgcmV0dXJuIF9SZXM7Cit9CitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBjaGFyIF9fREVGQVVMVF9GTl9BVFRSUworX2JpdHRlc3RhbmRyZXNldDY0KF9faW50NjQgKl9CaXRCYXNlLCBfX2ludDY0IF9CaXRQb3MpIHsKKyAgdW5zaWduZWQgY2hhciBfUmVzID0gKCpfQml0QmFzZSA+PiBfQml0UG9zKSAmIDE7CisgICpfQml0QmFzZSA9ICpfQml0QmFzZSAmIH4oMWxsIDw8IF9CaXRQb3MpOworICByZXR1cm4gX1JlczsKK30KK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGNoYXIgX19ERUZBVUxUX0ZOX0FUVFJTCitfYml0dGVzdGFuZHNldDY0KF9faW50NjQgKl9CaXRCYXNlLCBfX2ludDY0IF9CaXRQb3MpIHsKKyAgdW5zaWduZWQgY2hhciBfUmVzID0gKCpfQml0QmFzZSA+PiBfQml0UG9zKSAmIDE7CisgICpfQml0QmFzZSA9ICpfQml0QmFzZSB8ICgxbGwgPDwgX0JpdFBvcyk7CisgIHJldHVybiBfUmVzOworfQorc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgY2hhciBfX0RFRkFVTFRfRk5fQVRUUlMKK19pbnRlcmxvY2tlZGJpdHRlc3RhbmRzZXQ2NChfX2ludDY0IHZvbGF0aWxlICpfQml0QmFzZSwgX19pbnQ2NCBfQml0UG9zKSB7CisgIGxvbmcgbG9uZyBfUHJldlZhbCA9CisgICAgICBfX2F0b21pY19mZXRjaF9vcihfQml0QmFzZSwgMWxsIDw8IF9CaXRQb3MsIF9fQVRPTUlDX1NFUV9DU1QpOworICByZXR1cm4gKF9QcmV2VmFsID4+IF9CaXRQb3MpICYgMTsKK30KKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKK3wqIEludGVybG9ja2VkIEV4Y2hhbmdlIEFkZAorXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBfX2lubGluZV9fIGNoYXIgX19ERUZBVUxUX0ZOX0FUVFJTCitfSW50ZXJsb2NrZWRFeGNoYW5nZUFkZDgoY2hhciB2b2xhdGlsZSAqX0FkZGVuZCwgY2hhciBfVmFsdWUpIHsKKyAgcmV0dXJuIF9fYXRvbWljX2ZldGNoX2FkZChfQWRkZW5kLCBfVmFsdWUsIF9fQVRPTUlDX1NFUV9DU1QpOworfQorc3RhdGljIF9faW5saW5lX18gc2hvcnQgX19ERUZBVUxUX0ZOX0FUVFJTCitfSW50ZXJsb2NrZWRFeGNoYW5nZUFkZDE2KHNob3J0IHZvbGF0aWxlICpfQWRkZW5kLCBzaG9ydCBfVmFsdWUpIHsKKyAgcmV0dXJuIF9fYXRvbWljX2ZldGNoX2FkZChfQWRkZW5kLCBfVmFsdWUsIF9fQVRPTUlDX1NFUV9DU1QpOworfQorI2lmZGVmIF9feDg2XzY0X18KK3N0YXRpYyBfX2lubGluZV9fIF9faW50NjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfSW50ZXJsb2NrZWRFeGNoYW5nZUFkZDY0KF9faW50NjQgdm9sYXRpbGUgKl9BZGRlbmQsIF9faW50NjQgX1ZhbHVlKSB7CisgIHJldHVybiBfX2F0b21pY19mZXRjaF9hZGQoX0FkZGVuZCwgX1ZhbHVlLCBfX0FUT01JQ19TRVFfQ1NUKTsKK30KKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKK3wqIEludGVybG9ja2VkIEV4Y2hhbmdlIFN1YgorXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBfX2lubGluZV9fIGNoYXIgX19ERUZBVUxUX0ZOX0FUVFJTCitfSW50ZXJsb2NrZWRFeGNoYW5nZVN1YjgoY2hhciB2b2xhdGlsZSAqX1N1YmVuZCwgY2hhciBfVmFsdWUpIHsKKyAgcmV0dXJuIF9fYXRvbWljX2ZldGNoX3N1YihfU3ViZW5kLCBfVmFsdWUsIF9fQVRPTUlDX1NFUV9DU1QpOworfQorc3RhdGljIF9faW5saW5lX18gc2hvcnQgX19ERUZBVUxUX0ZOX0FUVFJTCitfSW50ZXJsb2NrZWRFeGNoYW5nZVN1YjE2KHNob3J0IHZvbGF0aWxlICpfU3ViZW5kLCBzaG9ydCBfVmFsdWUpIHsKKyAgcmV0dXJuIF9fYXRvbWljX2ZldGNoX3N1YihfU3ViZW5kLCBfVmFsdWUsIF9fQVRPTUlDX1NFUV9DU1QpOworfQorc3RhdGljIF9faW5saW5lX18gbG9uZyBfX0RFRkFVTFRfRk5fQVRUUlMKK19JbnRlcmxvY2tlZEV4Y2hhbmdlU3ViKGxvbmcgdm9sYXRpbGUgKl9TdWJlbmQsIGxvbmcgX1ZhbHVlKSB7CisgIHJldHVybiBfX2F0b21pY19mZXRjaF9zdWIoX1N1YmVuZCwgX1ZhbHVlLCBfX0FUT01JQ19TRVFfQ1NUKTsKK30KKyNpZmRlZiBfX3g4Nl82NF9fCitzdGF0aWMgX19pbmxpbmVfXyBfX2ludDY0IF9fREVGQVVMVF9GTl9BVFRSUworX0ludGVybG9ja2VkRXhjaGFuZ2VTdWI2NChfX2ludDY0IHZvbGF0aWxlICpfU3ViZW5kLCBfX2ludDY0IF9WYWx1ZSkgeworICByZXR1cm4gX19hdG9taWNfZmV0Y2hfc3ViKF9TdWJlbmQsIF9WYWx1ZSwgX19BVE9NSUNfU0VRX0NTVCk7Cit9CisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCit8KiBJbnRlcmxvY2tlZCBJbmNyZW1lbnQKK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgX19pbmxpbmVfXyBzaG9ydCBfX0RFRkFVTFRfRk5fQVRUUlMKK19JbnRlcmxvY2tlZEluY3JlbWVudDE2KHNob3J0IHZvbGF0aWxlICpfVmFsdWUpIHsKKyAgcmV0dXJuIF9fYXRvbWljX2FkZF9mZXRjaChfVmFsdWUsIDEsIF9fQVRPTUlDX1NFUV9DU1QpOworfQorI2lmZGVmIF9feDg2XzY0X18KK3N0YXRpYyBfX2lubGluZV9fIF9faW50NjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfSW50ZXJsb2NrZWRJbmNyZW1lbnQ2NChfX2ludDY0IHZvbGF0aWxlICpfVmFsdWUpIHsKKyAgcmV0dXJuIF9fYXRvbWljX2FkZF9mZXRjaChfVmFsdWUsIDEsIF9fQVRPTUlDX1NFUV9DU1QpOworfQorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorfCogSW50ZXJsb2NrZWQgRGVjcmVtZW50CitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIF9faW5saW5lX18gc2hvcnQgX19ERUZBVUxUX0ZOX0FUVFJTCitfSW50ZXJsb2NrZWREZWNyZW1lbnQxNihzaG9ydCB2b2xhdGlsZSAqX1ZhbHVlKSB7CisgIHJldHVybiBfX2F0b21pY19zdWJfZmV0Y2goX1ZhbHVlLCAxLCBfX0FUT01JQ19TRVFfQ1NUKTsKK30KKyNpZmRlZiBfX3g4Nl82NF9fCitzdGF0aWMgX19pbmxpbmVfXyBfX2ludDY0IF9fREVGQVVMVF9GTl9BVFRSUworX0ludGVybG9ja2VkRGVjcmVtZW50NjQoX19pbnQ2NCB2b2xhdGlsZSAqX1ZhbHVlKSB7CisgIHJldHVybiBfX2F0b21pY19zdWJfZmV0Y2goX1ZhbHVlLCAxLCBfX0FUT01JQ19TRVFfQ1NUKTsKK30KKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKK3wqIEludGVybG9ja2VkIEFuZAorXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBfX2lubGluZV9fIGNoYXIgX19ERUZBVUxUX0ZOX0FUVFJTCitfSW50ZXJsb2NrZWRBbmQ4KGNoYXIgdm9sYXRpbGUgKl9WYWx1ZSwgY2hhciBfTWFzaykgeworICByZXR1cm4gX19hdG9taWNfZmV0Y2hfYW5kKF9WYWx1ZSwgX01hc2ssIF9fQVRPTUlDX1NFUV9DU1QpOworfQorc3RhdGljIF9faW5saW5lX18gc2hvcnQgX19ERUZBVUxUX0ZOX0FUVFJTCitfSW50ZXJsb2NrZWRBbmQxNihzaG9ydCB2b2xhdGlsZSAqX1ZhbHVlLCBzaG9ydCBfTWFzaykgeworICByZXR1cm4gX19hdG9taWNfZmV0Y2hfYW5kKF9WYWx1ZSwgX01hc2ssIF9fQVRPTUlDX1NFUV9DU1QpOworfQorc3RhdGljIF9faW5saW5lX18gbG9uZyBfX0RFRkFVTFRfRk5fQVRUUlMKK19JbnRlcmxvY2tlZEFuZChsb25nIHZvbGF0aWxlICpfVmFsdWUsIGxvbmcgX01hc2spIHsKKyAgcmV0dXJuIF9fYXRvbWljX2ZldGNoX2FuZChfVmFsdWUsIF9NYXNrLCBfX0FUT01JQ19TRVFfQ1NUKTsKK30KKyNpZmRlZiBfX3g4Nl82NF9fCitzdGF0aWMgX19pbmxpbmVfXyBfX2ludDY0IF9fREVGQVVMVF9GTl9BVFRSUworX0ludGVybG9ja2VkQW5kNjQoX19pbnQ2NCB2b2xhdGlsZSAqX1ZhbHVlLCBfX2ludDY0IF9NYXNrKSB7CisgIHJldHVybiBfX2F0b21pY19mZXRjaF9hbmQoX1ZhbHVlLCBfTWFzaywgX19BVE9NSUNfU0VRX0NTVCk7Cit9CisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCit8KiBJbnRlcmxvY2tlZCBPcgorXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBfX2lubGluZV9fIGNoYXIgX19ERUZBVUxUX0ZOX0FUVFJTCitfSW50ZXJsb2NrZWRPcjgoY2hhciB2b2xhdGlsZSAqX1ZhbHVlLCBjaGFyIF9NYXNrKSB7CisgIHJldHVybiBfX2F0b21pY19mZXRjaF9vcihfVmFsdWUsIF9NYXNrLCBfX0FUT01JQ19TRVFfQ1NUKTsKK30KK3N0YXRpYyBfX2lubGluZV9fIHNob3J0IF9fREVGQVVMVF9GTl9BVFRSUworX0ludGVybG9ja2VkT3IxNihzaG9ydCB2b2xhdGlsZSAqX1ZhbHVlLCBzaG9ydCBfTWFzaykgeworICByZXR1cm4gX19hdG9taWNfZmV0Y2hfb3IoX1ZhbHVlLCBfTWFzaywgX19BVE9NSUNfU0VRX0NTVCk7Cit9CitzdGF0aWMgX19pbmxpbmVfXyBsb25nIF9fREVGQVVMVF9GTl9BVFRSUworX0ludGVybG9ja2VkT3IobG9uZyB2b2xhdGlsZSAqX1ZhbHVlLCBsb25nIF9NYXNrKSB7CisgIHJldHVybiBfX2F0b21pY19mZXRjaF9vcihfVmFsdWUsIF9NYXNrLCBfX0FUT01JQ19TRVFfQ1NUKTsKK30KKyNpZmRlZiBfX3g4Nl82NF9fCitzdGF0aWMgX19pbmxpbmVfXyBfX2ludDY0IF9fREVGQVVMVF9GTl9BVFRSUworX0ludGVybG9ja2VkT3I2NChfX2ludDY0IHZvbGF0aWxlICpfVmFsdWUsIF9faW50NjQgX01hc2spIHsKKyAgcmV0dXJuIF9fYXRvbWljX2ZldGNoX29yKF9WYWx1ZSwgX01hc2ssIF9fQVRPTUlDX1NFUV9DU1QpOworfQorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorfCogSW50ZXJsb2NrZWQgWG9yCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIF9faW5saW5lX18gY2hhciBfX0RFRkFVTFRfRk5fQVRUUlMKK19JbnRlcmxvY2tlZFhvcjgoY2hhciB2b2xhdGlsZSAqX1ZhbHVlLCBjaGFyIF9NYXNrKSB7CisgIHJldHVybiBfX2F0b21pY19mZXRjaF94b3IoX1ZhbHVlLCBfTWFzaywgX19BVE9NSUNfU0VRX0NTVCk7Cit9CitzdGF0aWMgX19pbmxpbmVfXyBzaG9ydCBfX0RFRkFVTFRfRk5fQVRUUlMKK19JbnRlcmxvY2tlZFhvcjE2KHNob3J0IHZvbGF0aWxlICpfVmFsdWUsIHNob3J0IF9NYXNrKSB7CisgIHJldHVybiBfX2F0b21pY19mZXRjaF94b3IoX1ZhbHVlLCBfTWFzaywgX19BVE9NSUNfU0VRX0NTVCk7Cit9CitzdGF0aWMgX19pbmxpbmVfXyBsb25nIF9fREVGQVVMVF9GTl9BVFRSUworX0ludGVybG9ja2VkWG9yKGxvbmcgdm9sYXRpbGUgKl9WYWx1ZSwgbG9uZyBfTWFzaykgeworICByZXR1cm4gX19hdG9taWNfZmV0Y2hfeG9yKF9WYWx1ZSwgX01hc2ssIF9fQVRPTUlDX1NFUV9DU1QpOworfQorI2lmZGVmIF9feDg2XzY0X18KK3N0YXRpYyBfX2lubGluZV9fIF9faW50NjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfSW50ZXJsb2NrZWRYb3I2NChfX2ludDY0IHZvbGF0aWxlICpfVmFsdWUsIF9faW50NjQgX01hc2spIHsKKyAgcmV0dXJuIF9fYXRvbWljX2ZldGNoX3hvcihfVmFsdWUsIF9NYXNrLCBfX0FUT01JQ19TRVFfQ1NUKTsKK30KKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKK3wqIEludGVybG9ja2VkIEV4Y2hhbmdlCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIF9faW5saW5lX18gY2hhciBfX0RFRkFVTFRfRk5fQVRUUlMKK19JbnRlcmxvY2tlZEV4Y2hhbmdlOChjaGFyIHZvbGF0aWxlICpfVGFyZ2V0LCBjaGFyIF9WYWx1ZSkgeworICBfX2F0b21pY19leGNoYW5nZShfVGFyZ2V0LCAmX1ZhbHVlLCAmX1ZhbHVlLCBfX0FUT01JQ19TRVFfQ1NUKTsKKyAgcmV0dXJuIF9WYWx1ZTsKK30KK3N0YXRpYyBfX2lubGluZV9fIHNob3J0IF9fREVGQVVMVF9GTl9BVFRSUworX0ludGVybG9ja2VkRXhjaGFuZ2UxNihzaG9ydCB2b2xhdGlsZSAqX1RhcmdldCwgc2hvcnQgX1ZhbHVlKSB7CisgIF9fYXRvbWljX2V4Y2hhbmdlKF9UYXJnZXQsICZfVmFsdWUsICZfVmFsdWUsIF9fQVRPTUlDX1NFUV9DU1QpOworICByZXR1cm4gX1ZhbHVlOworfQorI2lmZGVmIF9feDg2XzY0X18KK3N0YXRpYyBfX2lubGluZV9fIF9faW50NjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfSW50ZXJsb2NrZWRFeGNoYW5nZTY0KF9faW50NjQgdm9sYXRpbGUgKl9UYXJnZXQsIF9faW50NjQgX1ZhbHVlKSB7CisgIF9fYXRvbWljX2V4Y2hhbmdlKF9UYXJnZXQsICZfVmFsdWUsICZfVmFsdWUsIF9fQVRPTUlDX1NFUV9DU1QpOworICByZXR1cm4gX1ZhbHVlOworfQorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorfCogSW50ZXJsb2NrZWQgQ29tcGFyZSBFeGNoYW5nZQorXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBfX2lubGluZV9fIGNoYXIgX19ERUZBVUxUX0ZOX0FUVFJTCitfSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2U4KGNoYXIgdm9sYXRpbGUgKl9EZXN0aW5hdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBfRXhjaGFuZ2UsIGNoYXIgX0NvbXBhcmFuZCkgeworICBfX2F0b21pY19jb21wYXJlX2V4Y2hhbmdlKF9EZXN0aW5hdGlvbiwgJl9Db21wYXJhbmQsICZfRXhjaGFuZ2UsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19BVE9NSUNfU0VRX0NTVCwgX19BVE9NSUNfU0VRX0NTVCk7CisgIHJldHVybiBfQ29tcGFyYW5kOworfQorc3RhdGljIF9faW5saW5lX18gc2hvcnQgX19ERUZBVUxUX0ZOX0FUVFJTCitfSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2UxNihzaG9ydCB2b2xhdGlsZSAqX0Rlc3RpbmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgX0V4Y2hhbmdlLCBzaG9ydCBfQ29tcGFyYW5kKSB7CisgIF9fYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2UoX0Rlc3RpbmF0aW9uLCAmX0NvbXBhcmFuZCwgJl9FeGNoYW5nZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0FUT01JQ19TRVFfQ1NULCBfX0FUT01JQ19TRVFfQ1NUKTsKKyAgcmV0dXJuIF9Db21wYXJhbmQ7Cit9CitzdGF0aWMgX19pbmxpbmVfXyBfX2ludDY0IF9fREVGQVVMVF9GTl9BVFRSUworX0ludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlNjQoX19pbnQ2NCB2b2xhdGlsZSAqX0Rlc3RpbmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pbnQ2NCBfRXhjaGFuZ2UsIF9faW50NjQgX0NvbXBhcmFuZCkgeworICBfX2F0b21pY19jb21wYXJlX2V4Y2hhbmdlKF9EZXN0aW5hdGlvbiwgJl9Db21wYXJhbmQsICZfRXhjaGFuZ2UsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19BVE9NSUNfU0VRX0NTVCwgX19BVE9NSUNfU0VRX0NTVCk7CisgIHJldHVybiBfQ29tcGFyYW5kOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKK3wqIEJhcnJpZXJzCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19fYXR0cmlidXRlX18oKF9fZGVwcmVjYXRlZF9fKCJ1c2Ugb3RoZXIgaW50cmluc2ljcyBvciBDKysxMSBhdG9taWNzIGluc3RlYWQiKSkpCitfUmVhZFdyaXRlQmFycmllcih2b2lkKSB7CisgIF9fYXRvbWljX3NpZ25hbF9mZW5jZShfX0FUT01JQ19TRVFfQ1NUKTsKK30KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfX2F0dHJpYnV0ZV9fKChfX2RlcHJlY2F0ZWRfXygidXNlIG90aGVyIGludHJpbnNpY3Mgb3IgQysrMTEgYXRvbWljcyBpbnN0ZWFkIikpKQorX1JlYWRCYXJyaWVyKHZvaWQpIHsKKyAgX19hdG9taWNfc2lnbmFsX2ZlbmNlKF9fQVRPTUlDX1NFUV9DU1QpOworfQorc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19fYXR0cmlidXRlX18oKF9fZGVwcmVjYXRlZF9fKCJ1c2Ugb3RoZXIgaW50cmluc2ljcyBvciBDKysxMSBhdG9taWNzIGluc3RlYWQiKSkpCitfV3JpdGVCYXJyaWVyKHZvaWQpIHsKKyAgX19hdG9taWNfc2lnbmFsX2ZlbmNlKF9fQVRPTUlDX1NFUV9DU1QpOworfQorI2lmZGVmIF9feDg2XzY0X18KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfX2Zhc3RzdG9yZWZlbmNlKHZvaWQpIHsKKyAgX19hdG9taWNfdGhyZWFkX2ZlbmNlKF9fQVRPTUlDX1NFUV9DU1QpOworfQorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorfCogcmVhZGZzLCByZWFkZ3MKK3wqIChQb2ludGVycyBpbiBhZGRyZXNzIHNwYWNlICMyNTYgYW5kICMyNTcgYXJlIHJlbGF0aXZlIHRvIHRoZSBHUyBhbmQgRlMKK3wqIHNlZ21lbnQgcmVnaXN0ZXJzLCByZXNwZWN0aXZlbHkuKQorXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgX19wdHJfdG9fYWRkcl9zcGFjZShfX2FkZHJfc3BhY2VfbmJyLCBfX3R5cGUsIF9fb2Zmc2V0KSAgICAgICAgICAgICAgXAorICAgICgodm9sYXRpbGUgX190eXBlIF9fYXR0cmlidXRlX18oKF9fYWRkcmVzc19zcGFjZV9fKF9fYWRkcl9zcGFjZV9uYnIpKSkqKSBcCisgICAgKF9fb2Zmc2V0KSkKKworI2lmZGVmIF9faTM4Nl9fCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBjaGFyIF9fREVGQVVMVF9GTl9BVFRSUworX19yZWFkZnNieXRlKHVuc2lnbmVkIGxvbmcgX19vZmZzZXQpIHsKKyAgcmV0dXJuICpfX3B0cl90b19hZGRyX3NwYWNlKDI1NywgdW5zaWduZWQgY2hhciwgX19vZmZzZXQpOworfQorc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgc2hvcnQgX19ERUZBVUxUX0ZOX0FUVFJTCitfX3JlYWRmc3dvcmQodW5zaWduZWQgbG9uZyBfX29mZnNldCkgeworICByZXR1cm4gKl9fcHRyX3RvX2FkZHJfc3BhY2UoMjU3LCB1bnNpZ25lZCBzaG9ydCwgX19vZmZzZXQpOworfQorc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgX19pbnQ2NCBfX0RFRkFVTFRfRk5fQVRUUlMKK19fcmVhZGZzcXdvcmQodW5zaWduZWQgbG9uZyBfX29mZnNldCkgeworICByZXR1cm4gKl9fcHRyX3RvX2FkZHJfc3BhY2UoMjU3LCB1bnNpZ25lZCBfX2ludDY0LCBfX29mZnNldCk7Cit9CisjZW5kaWYKKyNpZmRlZiBfX3g4Nl82NF9fCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBjaGFyIF9fREVGQVVMVF9GTl9BVFRSUworX19yZWFkZ3NieXRlKHVuc2lnbmVkIGxvbmcgX19vZmZzZXQpIHsKKyAgcmV0dXJuICpfX3B0cl90b19hZGRyX3NwYWNlKDI1NiwgdW5zaWduZWQgY2hhciwgX19vZmZzZXQpOworfQorc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgc2hvcnQgX19ERUZBVUxUX0ZOX0FUVFJTCitfX3JlYWRnc3dvcmQodW5zaWduZWQgbG9uZyBfX29mZnNldCkgeworICByZXR1cm4gKl9fcHRyX3RvX2FkZHJfc3BhY2UoMjU2LCB1bnNpZ25lZCBzaG9ydCwgX19vZmZzZXQpOworfQorc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZyBfX0RFRkFVTFRfRk5fQVRUUlMKK19fcmVhZGdzZHdvcmQodW5zaWduZWQgbG9uZyBfX29mZnNldCkgeworICByZXR1cm4gKl9fcHRyX3RvX2FkZHJfc3BhY2UoMjU2LCB1bnNpZ25lZCBsb25nLCBfX29mZnNldCk7Cit9CitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBfX2ludDY0IF9fREVGQVVMVF9GTl9BVFRSUworX19yZWFkZ3Nxd29yZCh1bnNpZ25lZCBsb25nIF9fb2Zmc2V0KSB7CisgIHJldHVybiAqX19wdHJfdG9fYWRkcl9zcGFjZSgyNTYsIHVuc2lnbmVkIF9faW50NjQsIF9fb2Zmc2V0KTsKK30KKyNlbmRpZgorI3VuZGVmIF9fcHRyX3RvX2FkZHJfc3BhY2UKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCit8KiBtb3ZzLCBzdG9zCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfX21vdnNiKHVuc2lnbmVkIGNoYXIgKl9fZHN0LCB1bnNpZ25lZCBjaGFyIGNvbnN0ICpfX3NyYywgc2l6ZV90IF9fbikgeworICBfX2FzbV9fKCJyZXAgbW92c2IiIDogOiAiRCIoX19kc3QpLCAiUyIoX19zcmMpLCAiYyIoX19uKQorICAgICAgICAgICAgICAgICAgICAgICAgOiAiJWVkaSIsICIlZXNpIiwgIiVlY3giKTsKK30KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfX21vdnNkKHVuc2lnbmVkIGxvbmcgKl9fZHN0LCB1bnNpZ25lZCBsb25nIGNvbnN0ICpfX3NyYywgc2l6ZV90IF9fbikgeworICBfX2FzbV9fKCJyZXAgbW92c2wiIDogOiAiRCIoX19kc3QpLCAiUyIoX19zcmMpLCAiYyIoX19uKQorICAgICAgICAgICAgICAgICAgICAgICAgOiAiJWVkaSIsICIlZXNpIiwgIiVlY3giKTsKK30KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfX21vdnN3KHVuc2lnbmVkIHNob3J0ICpfX2RzdCwgdW5zaWduZWQgc2hvcnQgY29uc3QgKl9fc3JjLCBzaXplX3QgX19uKSB7CisgIF9fYXNtX18oInJlcCBtb3ZzdyIgOiA6ICJEIihfX2RzdCksICJTIihfX3NyYyksICJjIihfX24pCisgICAgICAgICAgICAgICAgICAgICAgICA6ICIlZWRpIiwgIiVlc2kiLCAiJWVjeCIpOworfQorc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19fc3Rvc2IodW5zaWduZWQgY2hhciAqX19kc3QsIHVuc2lnbmVkIGNoYXIgX194LCBzaXplX3QgX19uKSB7CisgIF9fYXNtX18oInJlcCBzdG9zYiIgOiA6ICJEIihfX2RzdCksICJhIihfX3gpLCAiYyIoX19uKQorICAgICAgICAgICAgICAgICAgICAgICAgOiAiJWVkaSIsICIlZWN4Iik7Cit9CitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX19zdG9zZCh1bnNpZ25lZCBsb25nICpfX2RzdCwgdW5zaWduZWQgbG9uZyBfX3gsIHNpemVfdCBfX24pIHsKKyAgX19hc21fXygicmVwIHN0b3NsIiA6IDogIkQiKF9fZHN0KSwgImEiKF9feCksICJjIihfX24pCisgICAgICAgICAgICAgICAgICAgICAgICA6ICIlZWRpIiwgIiVlY3giKTsKK30KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfX3N0b3N3KHVuc2lnbmVkIHNob3J0ICpfX2RzdCwgdW5zaWduZWQgc2hvcnQgX194LCBzaXplX3QgX19uKSB7CisgIF9fYXNtX18oInJlcCBzdG9zdyIgOiA6ICJEIihfX2RzdCksICJhIihfX3gpLCAiYyIoX19uKQorICAgICAgICAgICAgICAgICAgICAgICAgOiAiJWVkaSIsICIlZWN4Iik7Cit9CisjZW5kaWYKKyNpZmRlZiBfX3g4Nl82NF9fCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX19tb3ZzcSh1bnNpZ25lZCBsb25nIGxvbmcgKl9fZHN0LCB1bnNpZ25lZCBsb25nIGxvbmcgY29uc3QgKl9fc3JjLCBzaXplX3QgX19uKSB7CisgIF9fYXNtX18oInJlcCBtb3ZzcSIgOiA6ICJEIihfX2RzdCksICJTIihfX3NyYyksICJjIihfX24pCisgICAgICAgICAgICAgICAgICAgICAgICA6ICIlZWRpIiwgIiVlc2kiLCAiJWVjeCIpOworfQorc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19fc3Rvc3EodW5zaWduZWQgX19pbnQ2NCAqX19kc3QsIHVuc2lnbmVkIF9faW50NjQgX194LCBzaXplX3QgX19uKSB7CisgIF9fYXNtX18oInJlcCBzdG9zcSIgOiA6ICJEIihfX2RzdCksICJhIihfX3gpLCAiYyIoX19uKQorICAgICAgICAgICAgICAgICAgICAgICAgOiAiJWVkaSIsICIlZWN4Iik7Cit9CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKK3wqIE1pc2MKK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkICogX19ERUZBVUxUX0ZOX0FUVFJTCitfQWRkcmVzc09mUmV0dXJuQWRkcmVzcyh2b2lkKSB7CisgIHJldHVybiAodm9pZCopKChjaGFyKilfX2J1aWx0aW5fZnJhbWVfYWRkcmVzcygwKSArIHNpemVvZih2b2lkKikpOworfQorc3RhdGljIF9faW5saW5lX18gdm9pZCAqIF9fREVGQVVMVF9GTl9BVFRSUworX1JldHVybkFkZHJlc3Modm9pZCkgeworICByZXR1cm4gX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApOworfQorI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfX2NwdWlkKGludCBfX2luZm9bNF0sIGludCBfX2xldmVsKSB7CisgIF9fYXNtX18gKCJjcHVpZCIgOiAiPWEiKF9faW5mb1swXSksICI9YiIgKF9faW5mb1sxXSksICI9YyIoX19pbmZvWzJdKSwgIj1kIihfX2luZm9bM10pCisgICAgICAgICAgICAgICAgICAgOiAiYSIoX19sZXZlbCkpOworfQorc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19fY3B1aWRleChpbnQgX19pbmZvWzRdLCBpbnQgX19sZXZlbCwgaW50IF9fZWN4KSB7CisgIF9fYXNtX18gKCJjcHVpZCIgOiAiPWEiKF9faW5mb1swXSksICI9YiIgKF9faW5mb1sxXSksICI9YyIoX19pbmZvWzJdKSwgIj1kIihfX2luZm9bM10pCisgICAgICAgICAgICAgICAgICAgOiAiYSIoX19sZXZlbCksICJjIihfX2VjeCkpOworfQorc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgX19pbnQ2NCBfX2NkZWNsIF9fREVGQVVMVF9GTl9BVFRSUworX3hnZXRidih1bnNpZ25lZCBpbnQgX194Y3Jfbm8pIHsKKyAgdW5zaWduZWQgaW50IF9fZWF4LCBfX2VkeDsKKyAgX19hc21fXyAoInhnZXRidiIgOiAiPWEiIChfX2VheCksICI9ZCIgKF9fZWR4KSA6ICJjIiAoX194Y3Jfbm8pKTsKKyAgcmV0dXJuICgodW5zaWduZWQgX19pbnQ2NClfX2VkeCA8PCAzMikgfCBfX2VheDsKK30KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfX2hhbHQodm9pZCkgeworICBfX2FzbV9fIHZvbGF0aWxlICgiaGx0Iik7Cit9CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKK3wqIFByaXZpbGVnZWQgaW50cmluc2ljcworXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBfX2ludDY0IF9fREVGQVVMVF9GTl9BVFRSUworX19yZWFkbXNyKHVuc2lnbmVkIGxvbmcgX19yZWdpc3RlcikgeworICAvLyBMb2FkcyB0aGUgY29udGVudHMgb2YgYSA2NC1iaXQgbW9kZWwgc3BlY2lmaWMgcmVnaXN0ZXIgKE1TUikgc3BlY2lmaWVkIGluCisgIC8vIHRoZSBFQ1ggcmVnaXN0ZXIgaW50byByZWdpc3RlcnMgRURYOkVBWC4gVGhlIEVEWCByZWdpc3RlciBpcyBsb2FkZWQgd2l0aAorICAvLyB0aGUgaGlnaC1vcmRlciAzMiBiaXRzIG9mIHRoZSBNU1IgYW5kIHRoZSBFQVggcmVnaXN0ZXIgaXMgbG9hZGVkIHdpdGggdGhlCisgIC8vIGxvdy1vcmRlciAzMiBiaXRzLiBJZiBsZXNzIHRoYW4gNjQgYml0cyBhcmUgaW1wbGVtZW50ZWQgaW4gdGhlIE1TUiBiZWluZworICAvLyByZWFkLCB0aGUgdmFsdWVzIHJldHVybmVkIHRvIEVEWDpFQVggaW4gdW5pbXBsZW1lbnRlZCBiaXQgbG9jYXRpb25zIGFyZQorICAvLyB1bmRlZmluZWQuCisgIHVuc2lnbmVkIGxvbmcgX19lZHg7CisgIHVuc2lnbmVkIGxvbmcgX19lYXg7CisgIF9fYXNtX18gKCJyZG1zciIgOiAiPWQiKF9fZWR4KSwgIj1hIihfX2VheCkgOiAiYyIoX19yZWdpc3RlcikpOworICByZXR1cm4gKCgodW5zaWduZWQgX19pbnQ2NClfX2VkeCkgPDwgMzIpIHwgKHVuc2lnbmVkIF9faW50NjQpX19lYXg7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcgX19ERUZBVUxUX0ZOX0FUVFJTCitfX3JlYWRjcjModm9pZCkgeworICB1bnNpZ25lZCBsb25nIF9fY3IzX3ZhbDsKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3YgJSVjcjMsICUwIiA6ICI9cSIoX19jcjNfdmFsKSA6IDogIm1lbW9yeSIpOworICByZXR1cm4gX19jcjNfdmFsOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX193cml0ZWNyMyh1bnNpZ25lZCBpbnQgX19jcjNfdmFsKSB7CisgIF9fYXNtX18gKCJtb3YgJTAsICUlY3IzIiA6IDogInEiKF9fY3IzX3ZhbCkgOiAibWVtb3J5Iik7Cit9CisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI3VuZGVmIF9fREVGQVVMVF9GTl9BVFRSUworCisjZW5kaWYgLyogX19JTlRSSU5fSCAqLworI2VuZGlmIC8qIF9NU0NfVkVSICovCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9pbnR0eXBlcy5oIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvaW50dHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDhlYWJhCi0tLSAvZGV2L251bGwKKysrIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvaW50dHlwZXMuaApAQCAtMCwwICsxLDEwNiBAQAorLyo9PT0tLS0tIGludHR5cGVzLmggLSBTdGFuZGFyZCBoZWFkZXIgZm9yIGludGVnZXIgcHJpbnRmIG1hY3JvcyAtLS0tLS0tLS0tPT09KlwKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKgorXCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ki8KKworI2lmbmRlZiBfX0NMQU5HX0lOVFRZUEVTX0gKKyNkZWZpbmUgX19DTEFOR19JTlRUWVBFU19ICisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUiA8IDE4MDAKKyNlcnJvciBNU1ZDIGRvZXMgbm90IGhhdmUgaW50dHlwZXMuaCBwcmlvciB0byBWaXN1YWwgU3R1ZGlvIDIwMTMKKyNlbmRpZgorCisjaW5jbHVkZV9uZXh0IDxpbnR0eXBlcy5oPgorCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVIgPCAxOTAwCisvKiBNU1ZDIGhlYWRlcnMgZGVmaW5lIGludDMyX3QgYXMgaW50LCBidXQgUFJJeDMyIGFzICJseCIgaW5zdGVhZCBvZiAieCIuCisgKiBUaGlzIHRyaWdnZXJzIGZvcm1hdCB3YXJuaW5ncywgc28gZml4IGl0IHVwIGhlcmUuICovCisjdW5kZWYgUFJJZDMyCisjdW5kZWYgUFJJZExFQVNUMzIKKyN1bmRlZiBQUklkRkFTVDMyCisjdW5kZWYgUFJJaTMyCisjdW5kZWYgUFJJaUxFQVNUMzIKKyN1bmRlZiBQUklpRkFTVDMyCisjdW5kZWYgUFJJbzMyCisjdW5kZWYgUFJJb0xFQVNUMzIKKyN1bmRlZiBQUklvRkFTVDMyCisjdW5kZWYgUFJJdTMyCisjdW5kZWYgUFJJdUxFQVNUMzIKKyN1bmRlZiBQUkl1RkFTVDMyCisjdW5kZWYgUFJJeDMyCisjdW5kZWYgUFJJeExFQVNUMzIKKyN1bmRlZiBQUkl4RkFTVDMyCisjdW5kZWYgUFJJWDMyCisjdW5kZWYgUFJJWExFQVNUMzIKKyN1bmRlZiBQUklYRkFTVDMyCisKKyN1bmRlZiBTQ05kMzIKKyN1bmRlZiBTQ05kTEVBU1QzMgorI3VuZGVmIFNDTmRGQVNUMzIKKyN1bmRlZiBTQ05pMzIKKyN1bmRlZiBTQ05pTEVBU1QzMgorI3VuZGVmIFNDTmlGQVNUMzIKKyN1bmRlZiBTQ05vMzIKKyN1bmRlZiBTQ05vTEVBU1QzMgorI3VuZGVmIFNDTm9GQVNUMzIKKyN1bmRlZiBTQ051MzIKKyN1bmRlZiBTQ051TEVBU1QzMgorI3VuZGVmIFNDTnVGQVNUMzIKKyN1bmRlZiBTQ054MzIKKyN1bmRlZiBTQ054TEVBU1QzMgorI3VuZGVmIFNDTnhGQVNUMzIKKworI2RlZmluZSBQUklkMzIgImQiCisjZGVmaW5lIFBSSWRMRUFTVDMyICJkIgorI2RlZmluZSBQUklkRkFTVDMyICJkIgorI2RlZmluZSBQUklpMzIgImkiCisjZGVmaW5lIFBSSWlMRUFTVDMyICJpIgorI2RlZmluZSBQUklpRkFTVDMyICJpIgorI2RlZmluZSBQUklvMzIgIm8iCisjZGVmaW5lIFBSSW9MRUFTVDMyICJvIgorI2RlZmluZSBQUklvRkFTVDMyICJvIgorI2RlZmluZSBQUkl1MzIgInUiCisjZGVmaW5lIFBSSXVMRUFTVDMyICJ1IgorI2RlZmluZSBQUkl1RkFTVDMyICJ1IgorI2RlZmluZSBQUkl4MzIgIngiCisjZGVmaW5lIFBSSXhMRUFTVDMyICJ4IgorI2RlZmluZSBQUkl4RkFTVDMyICJ4IgorI2RlZmluZSBQUklYMzIgIlgiCisjZGVmaW5lIFBSSVhMRUFTVDMyICJYIgorI2RlZmluZSBQUklYRkFTVDMyICJYIgorCisjZGVmaW5lIFNDTmQzMiAiZCIKKyNkZWZpbmUgU0NOZExFQVNUMzIgImQiCisjZGVmaW5lIFNDTmRGQVNUMzIgImQiCisjZGVmaW5lIFNDTmkzMiAiaSIKKyNkZWZpbmUgU0NOaUxFQVNUMzIgImkiCisjZGVmaW5lIFNDTmlGQVNUMzIgImkiCisjZGVmaW5lIFNDTm8zMiAibyIKKyNkZWZpbmUgU0NOb0xFQVNUMzIgIm8iCisjZGVmaW5lIFNDTm9GQVNUMzIgIm8iCisjZGVmaW5lIFNDTnUzMiAidSIKKyNkZWZpbmUgU0NOdUxFQVNUMzIgInUiCisjZGVmaW5lIFNDTnVGQVNUMzIgInUiCisjZGVmaW5lIFNDTngzMiAieCIKKyNkZWZpbmUgU0NOeExFQVNUMzIgIngiCisjZGVmaW5lIFNDTnhGQVNUMzIgIngiCisjZW5kaWYKKworI2VuZGlmIC8qIF9fQ0xBTkdfSU5UVFlQRVNfSCAqLwpkaWZmIC0tZ2l0IGEvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvaXNvNjQ2LmggYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9pc282NDYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2ExM2M1Ci0tLSAvZGV2L251bGwKKysrIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvaXNvNjQ2LmgKQEAgLTAsMCArMSw0MyBAQAorLyo9PT0tLS0tIGlzbzY0Ni5oIC0gU3RhbmRhcmQgaGVhZGVyIGZvciBhbHRlcm5hdGUgc3BlbGxpbmdzIG9mIG9wZXJhdG9ycy0tLT09PQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBFbGkgRnJpZWRtYW4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKgorICo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICovCisKKyNpZm5kZWYgX19JU082NDZfSAorI2RlZmluZSBfX0lTTzY0Nl9ICisKKyNpZm5kZWYgX19jcGx1c3BsdXMKKyNkZWZpbmUgYW5kICAgICYmCisjZGVmaW5lIGFuZF9lcSAmPQorI2RlZmluZSBiaXRhbmQgJgorI2RlZmluZSBiaXRvciAgfAorI2RlZmluZSBjb21wbCAgfgorI2RlZmluZSBub3QgICAgIQorI2RlZmluZSBub3RfZXEgIT0KKyNkZWZpbmUgb3IgICAgIHx8CisjZGVmaW5lIG9yX2VxICB8PQorI2RlZmluZSB4b3IgICAgXgorI2RlZmluZSB4b3JfZXEgXj0KKyNlbmRpZgorCisjZW5kaWYgLyogX19JU082NDZfSCAqLwpkaWZmIC0tZ2l0IGEvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvbGltaXRzLmggYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9saW1pdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDQxODdjCi0tLSAvZGV2L251bGwKKysrIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvbGltaXRzLmgKQEAgLTAsMCArMSwxMTggQEAKKy8qPT09LS0tLSBsaW1pdHMuaCAtIFN0YW5kYXJkIGhlYWRlciBmb3IgaW50ZWdlciBzaXplcyAtLS0tLS0tLS0tLS0tLS0tLS0tLT09PSpcCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA5IENocmlzIExhdHRuZXIKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKgorXCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ki8KKworI2lmbmRlZiBfX0NMQU5HX0xJTUlUU19ICisjZGVmaW5lIF9fQ0xBTkdfTElNSVRTX0gKKworLyogVGhlIHN5c3RlbSdzIGxpbWl0cy5oIG1heSwgaW4gdHVybiwgdHJ5IHRvICNpbmNsdWRlX25leHQgR0NDJ3MgbGltaXRzLmguCisgICBBdmVydCB0aGlzICNpbmNsdWRlX25leHQgbWFkbmVzcy4gKi8KKyNpZiBkZWZpbmVkIF9fR05VQ19fICYmICFkZWZpbmVkIF9HQ0NfTElNSVRTX0hfCisjZGVmaW5lIF9HQ0NfTElNSVRTX0hfCisjZW5kaWYKKworLyogU3lzdGVtIGhlYWRlcnMgaW5jbHVkZSBhIG51bWJlciBvZiBjb25zdGFudHMgZnJvbSBQT1NJWCBpbiA8bGltaXRzLmg+LgorICAgSW5jbHVkZSBpdCBpZiB3ZSdyZSBob3N0ZWQuICovCisjaWYgX19TVERDX0hPU1RFRF9fICYmIF9faGFzX2luY2x1ZGVfbmV4dCg8bGltaXRzLmg+KQorI2luY2x1ZGVfbmV4dCA8bGltaXRzLmg+CisjZW5kaWYKKworLyogTWFueSBzeXN0ZW0gaGVhZGVycyB0cnkgdG8gImhlbHAgdXMgb3V0IiBieSBkZWZpbmluZyB0aGVzZS4gIE5vIHJlYWxseSwgd2UKKyAgIGtub3cgaG93IGJpZyBlYWNoIGRhdGF0eXBlIGlzLiAqLworI3VuZGVmICBTQ0hBUl9NSU4KKyN1bmRlZiAgU0NIQVJfTUFYCisjdW5kZWYgIFVDSEFSX01BWAorI3VuZGVmICBTSFJUX01JTgorI3VuZGVmICBTSFJUX01BWAorI3VuZGVmICBVU0hSVF9NQVgKKyN1bmRlZiAgSU5UX01JTgorI3VuZGVmICBJTlRfTUFYCisjdW5kZWYgIFVJTlRfTUFYCisjdW5kZWYgIExPTkdfTUlOCisjdW5kZWYgIExPTkdfTUFYCisjdW5kZWYgIFVMT05HX01BWAorCisjdW5kZWYgIENIQVJfQklUCisjdW5kZWYgIENIQVJfTUlOCisjdW5kZWYgIENIQVJfTUFYCisKKy8qIEM5MC85OSA1LjIuNC4yLjEgKi8KKyNkZWZpbmUgU0NIQVJfTUFYIF9fU0NIQVJfTUFYX18KKyNkZWZpbmUgU0hSVF9NQVggIF9fU0hSVF9NQVhfXworI2RlZmluZSBJTlRfTUFYICAgX19JTlRfTUFYX18KKyNkZWZpbmUgTE9OR19NQVggIF9fTE9OR19NQVhfXworCisjZGVmaW5lIFNDSEFSX01JTiAoLV9fU0NIQVJfTUFYX18tMSkKKyNkZWZpbmUgU0hSVF9NSU4gICgtX19TSFJUX01BWF9fIC0xKQorI2RlZmluZSBJTlRfTUlOICAgKC1fX0lOVF9NQVhfXyAgLTEpCisjZGVmaW5lIExPTkdfTUlOICAoLV9fTE9OR19NQVhfXyAtMUwpCisKKyNkZWZpbmUgVUNIQVJfTUFYIChfX1NDSEFSX01BWF9fKjIgICsxKQorI2RlZmluZSBVU0hSVF9NQVggKF9fU0hSVF9NQVhfXyAqMiAgKzEpCisjZGVmaW5lIFVJTlRfTUFYICAoX19JTlRfTUFYX18gICoyVSArMVUpCisjZGVmaW5lIFVMT05HX01BWCAoX19MT05HX01BWF9fICoyVUwrMVVMKQorCisjaWZuZGVmIE1CX0xFTl9NQVgKKyNkZWZpbmUgTUJfTEVOX01BWCAxCisjZW5kaWYKKworI2RlZmluZSBDSEFSX0JJVCAgX19DSEFSX0JJVF9fCisKKyNpZmRlZiBfX0NIQVJfVU5TSUdORURfXyAgLyogLWZ1bnNpZ25lZC1jaGFyICovCisjZGVmaW5lIENIQVJfTUlOIDAKKyNkZWZpbmUgQ0hBUl9NQVggVUNIQVJfTUFYCisjZWxzZQorI2RlZmluZSBDSEFSX01JTiBTQ0hBUl9NSU4KKyNkZWZpbmUgQ0hBUl9NQVggX19TQ0hBUl9NQVhfXworI2VuZGlmCisKKy8qIEM5OSA1LjIuNC4yLjE6IEFkZGVkIGxvbmcgbG9uZy4KKyAgIEMrKzExIDE4LjMuMy4yOiBzYW1lIGNvbnRlbnRzIGFzIHRoZSBTdGFuZGFyZCBDIExpYnJhcnkgaGVhZGVyIDxsaW1pdHMuaD4uCisgKi8KKyNpZiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwgfHwgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorCisjdW5kZWYgIExMT05HX01JTgorI3VuZGVmICBMTE9OR19NQVgKKyN1bmRlZiAgVUxMT05HX01BWAorCisjZGVmaW5lIExMT05HX01BWCAgX19MT05HX0xPTkdfTUFYX18KKyNkZWZpbmUgTExPTkdfTUlOICAoLV9fTE9OR19MT05HX01BWF9fLTFMTCkKKyNkZWZpbmUgVUxMT05HX01BWCAoX19MT05HX0xPTkdfTUFYX18qMlVMTCsxVUxMKQorI2VuZGlmCisKKy8qIExPTkdfTE9OR19NSU4vTE9OR19MT05HX01BWC9VTE9OR19MT05HX01BWCBhcmUgYSBHTlUgZXh0ZW5zaW9uLiAgSXQncyB0b28gYmFkCisgICB0aGF0IHdlIGRvbid0IGhhdmUgc29tZXRoaW5nIGxpa2UgI3ByYWdtYSBwb2lzb24gdGhhdCBjb3VsZCBiZSB1c2VkIHRvCisgICBkZXByZWNhdGUgYSBtYWNybyAtIHRoZSBjb2RlIHNob3VsZCBqdXN0IHVzZSBMTE9OR19NQVggYW5kIGZyaWVuZHMuCisgKi8KKyNpZiBkZWZpbmVkKF9fR05VX0xJQlJBUllfXykgPyBkZWZpbmVkKF9fVVNFX0dOVSkgOiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pCisKKyN1bmRlZiAgIExPTkdfTE9OR19NSU4KKyN1bmRlZiAgIExPTkdfTE9OR19NQVgKKyN1bmRlZiAgIFVMT05HX0xPTkdfTUFYCisKKyNkZWZpbmUgTE9OR19MT05HX01BWCAgX19MT05HX0xPTkdfTUFYX18KKyNkZWZpbmUgTE9OR19MT05HX01JTiAgKC1fX0xPTkdfTE9OR19NQVhfXy0xTEwpCisjZGVmaW5lIFVMT05HX0xPTkdfTUFYIChfX0xPTkdfTE9OR19NQVhfXyoyVUxMKzFVTEwpCisjZW5kaWYKKworI2VuZGlmIC8qIF9fQ0xBTkdfTElNSVRTX0ggKi8KZGlmZiAtLWdpdCBhL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL2x6Y250aW50cmluLmggYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9semNudGludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMDBlNDIKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9semNudGludHJpbi5oCkBAIC0wLDAgKzEsNjggQEAKKy8qPT09LS0tLSBsemNudGludHJpbi5oIC0gTFpDTlQgaW50cmluc2ljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKgorICo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICovCisKKyNpZiAhZGVmaW5lZCBfX1g4NklOVFJJTl9IICYmICFkZWZpbmVkIF9fSU1NSU5UUklOX0gKKyNlcnJvciAiTmV2ZXIgdXNlIDxsemNudGludHJpbi5oPiBkaXJlY3RseTsgaW5jbHVkZSA8eDg2aW50cmluLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpZm5kZWYgX19MWkNOVElOVFJJTl9ICisjZGVmaW5lIF9fTFpDTlRJTlRSSU5fSAorCisvKiBEZWZpbmUgdGhlIGRlZmF1bHQgYXR0cmlidXRlcyBmb3IgdGhlIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUuICovCisjZGVmaW5lIF9fREVGQVVMVF9GTl9BVFRSUyBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18sIF9fdGFyZ2V0X18oImx6Y250IikpKQorCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBzaG9ydCBfX0RFRkFVTFRfRk5fQVRUUlMKK19fbHpjbnQxNih1bnNpZ25lZCBzaG9ydCBfX1gpCit7CisgIHJldHVybiBfX1ggPyBfX2J1aWx0aW5fY2x6cyhfX1gpIDogMTY7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludCBfX0RFRkFVTFRfRk5fQVRUUlMKK19fbHpjbnQzMih1bnNpZ25lZCBpbnQgX19YKQoreworICByZXR1cm4gX19YID8gX19idWlsdGluX2NseihfX1gpIDogMzI7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludCBfX0RFRkFVTFRfRk5fQVRUUlMKK19semNudF91MzIodW5zaWduZWQgaW50IF9fWCkKK3sKKyAgcmV0dXJuIF9fWCA/IF9fYnVpbHRpbl9jbHooX19YKSA6IDMyOworfQorCisjaWZkZWYgX194ODZfNjRfXworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZyBsb25nIF9fREVGQVVMVF9GTl9BVFRSUworX19semNudDY0KHVuc2lnbmVkIGxvbmcgbG9uZyBfX1gpCit7CisgIHJldHVybiBfX1ggPyBfX2J1aWx0aW5fY2x6bGwoX19YKSA6IDY0OworfQorCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nIGxvbmcgX19ERUZBVUxUX0ZOX0FUVFJTCitfbHpjbnRfdTY0KHVuc2lnbmVkIGxvbmcgbG9uZyBfX1gpCit7CisgIHJldHVybiBfX1ggPyBfX2J1aWx0aW5fY2x6bGwoX19YKSA6IDY0OworfQorI2VuZGlmCisKKyN1bmRlZiBfX0RFRkFVTFRfRk5fQVRUUlMKKworI2VuZGlmIC8qIF9fTFpDTlRJTlRSSU5fSCAqLwpkaWZmIC0tZ2l0IGEvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvbW0zZG5vdy5oIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvbW0zZG5vdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NDg2NmMKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9tbTNkbm93LmgKQEAgLTAsMCArMSwxNzEgQEAKKy8qPT09LS0tLSBtbTNkbm93LmggLSAzRE5vdyEgaW50cmluc2ljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKgorICo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICovCisKKyNpZm5kZWYgX01NM0ROT1dfSF9JTkNMVURFRAorI2RlZmluZSBfTU0zRE5PV19IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxtbWludHJpbi5oPgorI2luY2x1ZGUgPHByZmNod2ludHJpbi5oPgorCit0eXBlZGVmIGZsb2F0IF9fdjJzZiBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oOCkpKTsKKworLyogRGVmaW5lIHRoZSBkZWZhdWx0IGF0dHJpYnV0ZXMgZm9yIHRoZSBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlLiAqLworI2RlZmluZSBfX0RFRkFVTFRfRk5fQVRUUlMgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fLCBfX3RhcmdldF9fKCIzZG5vdyIpKSkKKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tX2ZlbW1zKHZvaWQpIHsKKyAgX19idWlsdGluX2lhMzJfZmVtbXMoKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbV9wYXZndXNiKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpIHsKKyAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9wYXZndXNiKChfX3Y4cWkpX19tMSwgKF9fdjhxaSlfX20yKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbV9wZjJpZChfX202NCBfX20pIHsKKyAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9wZjJpZCgoX192MnNmKV9fbSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21fcGZhY2MoX19tNjQgX19tMSwgX19tNjQgX19tMikgeworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BmYWNjKChfX3Yyc2YpX19tMSwgKF9fdjJzZilfX20yKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbV9wZmFkZChfX202NCBfX20xLCBfX202NCBfX20yKSB7CisgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcGZhZGQoKF9fdjJzZilfX20xLCAoX192MnNmKV9fbTIpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX202NCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tX3BmY21wZXEoX19tNjQgX19tMSwgX19tNjQgX19tMikgeworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BmY21wZXEoKF9fdjJzZilfX20xLCAoX192MnNmKV9fbTIpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX202NCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tX3BmY21wZ2UoX19tNjQgX19tMSwgX19tNjQgX19tMikgeworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BmY21wZ2UoKF9fdjJzZilfX20xLCAoX192MnNmKV9fbTIpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX202NCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tX3BmY21wZ3QoX19tNjQgX19tMSwgX19tNjQgX19tMikgeworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BmY21wZ3QoKF9fdjJzZilfX20xLCAoX192MnNmKV9fbTIpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX202NCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tX3BmbWF4KF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpIHsKKyAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9wZm1heCgoX192MnNmKV9fbTEsIChfX3Yyc2YpX19tMik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21fcGZtaW4oX19tNjQgX19tMSwgX19tNjQgX19tMikgeworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BmbWluKChfX3Yyc2YpX19tMSwgKF9fdjJzZilfX20yKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbV9wZm11bChfX202NCBfX20xLCBfX202NCBfX20yKSB7CisgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcGZtdWwoKF9fdjJzZilfX20xLCAoX192MnNmKV9fbTIpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX202NCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tX3BmcmNwKF9fbTY0IF9fbSkgeworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BmcmNwKChfX3Yyc2YpX19tKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbV9wZnJjcGl0MShfX202NCBfX20xLCBfX202NCBfX20yKSB7CisgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcGZyY3BpdDEoKF9fdjJzZilfX20xLCAoX192MnNmKV9fbTIpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX202NCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tX3BmcmNwaXQyKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpIHsKKyAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9wZnJjcGl0MigoX192MnNmKV9fbTEsIChfX3Yyc2YpX19tMik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21fcGZyc3FydChfX202NCBfX20pIHsKKyAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9wZnJzcXJ0KChfX3Yyc2YpX19tKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbV9wZnJzcXJ0aXQxKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpIHsKKyAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9wZnJzcWl0MSgoX192MnNmKV9fbTEsIChfX3Yyc2YpX19tMik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21fcGZzdWIoX19tNjQgX19tMSwgX19tNjQgX19tMikgeworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3Bmc3ViKChfX3Yyc2YpX19tMSwgKF9fdjJzZilfX20yKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbV9wZnN1YnIoX19tNjQgX19tMSwgX19tNjQgX19tMikgeworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3Bmc3VicigoX192MnNmKV9fbTEsIChfX3Yyc2YpX19tMik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21fcGkyZmQoX19tNjQgX19tKSB7CisgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcGkyZmQoKF9fdjJzaSlfX20pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX202NCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tX3BtdWxocncoX19tNjQgX19tMSwgX19tNjQgX19tMikgeworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BtdWxocncoKF9fdjRoaSlfX20xLCAoX192NGhpKV9fbTIpOworfQorCisvKiBIYW5kbGUgdGhlIDNkbm93YSBpbnN0cnVjdGlvbnMgaGVyZS4gKi8KKyN1bmRlZiBfX0RFRkFVTFRfRk5fQVRUUlMKKyNkZWZpbmUgX19ERUZBVUxUX0ZOX0FUVFJTIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXywgX190YXJnZXRfXygiM2Rub3dhIikpKQorCitzdGF0aWMgX19pbmxpbmVfXyBfX202NCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tX3BmMml3KF9fbTY0IF9fbSkgeworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BmMml3KChfX3Yyc2YpX19tKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbV9wZm5hY2MoX19tNjQgX19tMSwgX19tNjQgX19tMikgeworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BmbmFjYygoX192MnNmKV9fbTEsIChfX3Yyc2YpX19tMik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21fcGZwbmFjYyhfX202NCBfX20xLCBfX202NCBfX20yKSB7CisgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcGZwbmFjYygoX192MnNmKV9fbTEsIChfX3Yyc2YpX19tMik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21fcGkyZncoX19tNjQgX19tKSB7CisgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcGkyZncoKF9fdjJzaSlfX20pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX202NCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tX3Bzd2FwZHNmKF9fbTY0IF9fbSkgeworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3Bzd2FwZHNmKChfX3Yyc2YpX19tKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbV9wc3dhcGRzaShfX202NCBfX20pIHsKKyAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9wc3dhcGRzaSgoX192MnNpKV9fbSk7Cit9CisKKyN1bmRlZiBfX0RFRkFVTFRfRk5fQVRUUlMKKworI2VuZGlmCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9tbV9tYWxsb2MuaCBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL21tX21hbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNWFmZDMKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9tbV9tYWxsb2MuaApAQCAtMCwwICsxLDc1IEBACisvKj09PS0tLS0gbW1fbWFsbG9jLmggLSBBbGxvY2F0aW5nIGFuZCBGcmVlaW5nIEFsaWduZWQgTWVtb3J5IEJsb2NrcyAtLS0tLS0tPT09CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICoKKyAqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqLworCisjaWZuZGVmIF9fTU1fTUFMTE9DX0gKKyNkZWZpbmUgX19NTV9NQUxMT0NfSAorCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNlbHNlCisjaWZuZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gaW50IHBvc2l4X21lbWFsaWduKHZvaWQgKipfX21lbXB0ciwgc2l6ZV90IF9fYWxpZ25tZW50LCBzaXplX3QgX19zaXplKTsKKyNlbHNlCisvLyBTb21lIHN5c3RlbXMgKGUuZy4gdGhvc2Ugd2l0aCBHTlUgbGliYykgZGVjbGFyZSBwb3NpeF9tZW1hbGlnbiB3aXRoIGFuCisvLyBleGNlcHRpb24gc3BlY2lmaWVyLiBWaWEgYW4gImVncmVnaW91cyB3b3JrYXJvdW5kIiBpbgorLy8gU2VtYTo6Q2hlY2tFcXVpdmFsZW50RXhjZXB0aW9uU3BlYywgQ2xhbmcgYWNjZXB0cyB0aGUgZm9sbG93aW5nIGFzIGEgdmFsaWQKKy8vIHJlZGVjbGFyYXRpb24gb2YgZ2xpYmMncyBkZWNsYXJhdGlvbi4KK2V4dGVybiAiQyIgaW50IHBvc2l4X21lbWFsaWduKHZvaWQgKipfX21lbXB0ciwgc2l6ZV90IF9fYWxpZ25tZW50LCBzaXplX3QgX19zaXplKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZiAhKGRlZmluZWQoX1dJTjMyKSAmJiBkZWZpbmVkKF9tbV9tYWxsb2MpKQorc3RhdGljIF9faW5saW5lX18gdm9pZCAqX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tYWxsb2NfXykpCitfbW1fbWFsbG9jKHNpemVfdCBfX3NpemUsIHNpemVfdCBfX2FsaWduKQoreworICBpZiAoX19hbGlnbiA9PSAxKSB7CisgICAgcmV0dXJuIG1hbGxvYyhfX3NpemUpOworICB9CisKKyAgaWYgKCEoX19hbGlnbiAmIChfX2FsaWduIC0gMSkpICYmIF9fYWxpZ24gPCBzaXplb2Yodm9pZCAqKSkKKyAgICBfX2FsaWduID0gc2l6ZW9mKHZvaWQgKik7CisKKyAgdm9pZCAqX19tYWxsb2NlZE1lbW9yeTsKKyNpZiBkZWZpbmVkKF9fTUlOR1czMl9fKQorICBfX21hbGxvY2VkTWVtb3J5ID0gX19taW5nd19hbGlnbmVkX21hbGxvYyhfX3NpemUsIF9fYWxpZ24pOworI2VsaWYgZGVmaW5lZChfV0lOMzIpCisgIF9fbWFsbG9jZWRNZW1vcnkgPSBfYWxpZ25lZF9tYWxsb2MoX19zaXplLCBfX2FsaWduKTsKKyNlbHNlCisgIGlmIChwb3NpeF9tZW1hbGlnbigmX19tYWxsb2NlZE1lbW9yeSwgX19hbGlnbiwgX19zaXplKSkKKyAgICByZXR1cm4gMDsKKyNlbmRpZgorCisgIHJldHVybiBfX21hbGxvY2VkTWVtb3J5OworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXykpCitfbW1fZnJlZSh2b2lkICpfX3ApCit7CisgIGZyZWUoX19wKTsKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19NTV9NQUxMT0NfSCAqLwpkaWZmIC0tZ2l0IGEvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvbW1pbnRyaW4uaCBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL21taW50cmluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VmZDYwNQotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL21taW50cmluLmgKQEAgLTAsMCArMSwxNTQ1IEBACisvKj09PS0tLS0gbW1pbnRyaW4uaCAtIE1NWCBpbnRyaW5zaWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICoKKyAqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqLworCisjaWZuZGVmIF9fTU1JTlRSSU5fSAorI2RlZmluZSBfX01NSU5UUklOX0gKKwordHlwZWRlZiBsb25nIGxvbmcgX19tNjQgX19hdHRyaWJ1dGVfXygoX192ZWN0b3Jfc2l6ZV9fKDgpKSk7CisKK3R5cGVkZWYgbG9uZyBsb25nIF9fdjFkaSBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oOCkpKTsKK3R5cGVkZWYgaW50IF9fdjJzaSBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oOCkpKTsKK3R5cGVkZWYgc2hvcnQgX192NGhpIF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXyg4KSkpOwordHlwZWRlZiBjaGFyIF9fdjhxaSBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oOCkpKTsKKworLyogRGVmaW5lIHRoZSBkZWZhdWx0IGF0dHJpYnV0ZXMgZm9yIHRoZSBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlLiAqLworI2RlZmluZSBfX0RFRkFVTFRfRk5fQVRUUlMgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fLCBfX3RhcmdldF9fKCJtbXgiKSkpCisKKy8vLyBcYnJpZWYgQ2xlYXJzIHRoZSBNTVggc3RhdGUgYnkgc2V0dGluZyB0aGUgc3RhdGUgb2YgdGhlIHg4NyBzdGFjayByZWdpc3RlcnMKKy8vLyAgICB0byBlbXB0eS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBFTU1TIGluc3RydWN0aW9uLgorLy8vCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2VtcHR5KHZvaWQpCit7CisgICAgX19idWlsdGluX2lhMzJfZW1tcygpOworfQorCisvLy8gXGJyaWVmIENvbnN0cnVjdHMgYSA2NC1iaXQgaW50ZWdlciB2ZWN0b3IsIHNldHRpbmcgdGhlIGxvd2VyIDMyIGJpdHMgdG8gdGhlCisvLy8gICAgdmFsdWUgb2YgdGhlIDMyLWJpdCBpbnRlZ2VyIHBhcmFtZXRlciBhbmQgc2V0dGluZyB0aGUgdXBwZXIgMzIgYml0cyB0byAwLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZNT1ZEIC8gTU9WRCBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2kKKy8vLyAgICBBIDMyLWJpdCBpbnRlZ2VyIHZhbHVlLgorLy8vIFxyZXR1cm5zIEEgNjQtYml0IGludGVnZXIgdmVjdG9yLiBUaGUgbG93ZXIgMzIgYml0cyBjb250YWluIHRoZSB2YWx1ZSBvZiB0aGUKKy8vLyAgICBwYXJhbWV0ZXIuIFRoZSB1cHBlciAzMiBiaXRzIGFyZSBzZXQgdG8gMC4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2N2dHNpMzJfc2k2NChpbnQgX19pKQoreworICAgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfdmVjX2luaXRfdjJzaShfX2ksIDApOworfQorCisvLy8gXGJyaWVmIFJldHVybnMgdGhlIGxvd2VyIDMyIGJpdHMgb2YgYSA2NC1iaXQgaW50ZWdlciB2ZWN0b3IgYXMgYSAzMi1iaXQKKy8vLyAgICBzaWduZWQgaW50ZWdlci4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWTU9WRCAvIE1PVkQgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19tCisvLy8gICAgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3IuCisvLy8gXHJldHVybnMgQSAzMi1iaXQgc2lnbmVkIGludGVnZXIgdmFsdWUgY29udGFpbmluZyB0aGUgbG93ZXIgMzIgYml0cyBvZiB0aGUKKy8vLyAgICBwYXJhbWV0ZXIuCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY3Z0c2k2NF9zaTMyKF9fbTY0IF9fbSkKK3sKKyAgICByZXR1cm4gX19idWlsdGluX2lhMzJfdmVjX2V4dF92MnNpKChfX3Yyc2kpX19tLCAwKTsKK30KKworLy8vIFxicmllZiBDYXN0cyBhIDY0LWJpdCBzaWduZWQgaW50ZWdlciB2YWx1ZSBpbnRvIGEgNjQtYml0IGludGVnZXIgdmVjdG9yLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZNT1ZRIC8gTU9WRCBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2kKKy8vLyAgICBBIDY0LWJpdCBzaWduZWQgaW50ZWdlci4KKy8vLyBccmV0dXJucyBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIHRoZSBzYW1lIGJpdHdpc2UgcGF0dGVybiBhcyB0aGUKKy8vLyAgICBwYXJhbWV0ZXIuCitzdGF0aWMgX19pbmxpbmVfXyBfX202NCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jdnRzaTY0X202NChsb25nIGxvbmcgX19pKQoreworICAgIHJldHVybiAoX19tNjQpX19pOworfQorCisvLy8gXGJyaWVmIENhc3RzIGEgNjQtYml0IGludGVnZXIgdmVjdG9yIGludG8gYSA2NC1iaXQgc2lnbmVkIGludGVnZXIgdmFsdWUuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVk1PVlEgLyBNT1ZEIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fbQorLy8vICAgIEEgNjQtYml0IGludGVnZXIgdmVjdG9yLgorLy8vIFxyZXR1cm5zIEEgNjQtYml0IHNpZ25lZCBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNhbWUgYml0d2lzZSBwYXR0ZXJuIGFzIHRoZQorLy8vICAgIHBhcmFtZXRlci4KK3N0YXRpYyBfX2lubGluZV9fIGxvbmcgbG9uZyBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jdnRtNjRfc2k2NChfX202NCBfX20pCit7CisgICAgcmV0dXJuIChsb25nIGxvbmcpX19tOworfQorCisvLy8gXGJyaWVmIENvbnZlcnRzIDE2LWJpdCBzaWduZWQgaW50ZWdlcnMgZnJvbSBib3RoIDY0LWJpdCBpbnRlZ2VyIHZlY3RvcgorLy8vICAgIHBhcmFtZXRlcnMgb2YgWzQgeCBpMTZdIGludG8gOC1iaXQgc2lnbmVkIGludGVnZXIgdmFsdWVzLCBhbmQgY29uc3RydWN0cworLy8vICAgIGEgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mIFs4IHggaThdIGFzIHRoZSByZXN1bHQuIFBvc2l0aXZlIHZhbHVlcworLy8vICAgIGdyZWF0ZXIgdGhhbiAweDdGIGFyZSBzYXR1cmF0ZWQgdG8gMHg3Ri4gTmVnYXRpdmUgdmFsdWVzIGxlc3MgdGhhbiAweDgwCisvLy8gICAgYXJlIHNhdHVyYXRlZCB0byAweDgwLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFBBQ0tTU1dCIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fbTEKKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbNCB4IGkxNl0uIEVhY2ggMTYtYml0IGVsZW1lbnQgaXMgdHJlYXRlZCBhcyBhCisvLy8gICAgMTYtYml0IHNpZ25lZCBpbnRlZ2VyIGFuZCBpcyBjb252ZXJ0ZWQgdG8gYW4gOC1iaXQgc2lnbmVkIGludGVnZXIgd2l0aAorLy8vICAgIHNhdHVyYXRpb24uIFBvc2l0aXZlIHZhbHVlcyBncmVhdGVyIHRoYW4gMHg3RiBhcmUgc2F0dXJhdGVkIHRvIDB4N0YuCisvLy8gICAgTmVnYXRpdmUgdmFsdWVzIGxlc3MgdGhhbiAweDgwIGFyZSBzYXR1cmF0ZWQgdG8gMHg4MC4gVGhlIGNvbnZlcnRlZAorLy8vICAgIFs0IHggaThdIHZhbHVlcyBhcmUgd3JpdHRlbiB0byB0aGUgbG93ZXIgMzIgYml0cyBvZiB0aGUgcmVzdWx0LgorLy8vIFxwYXJhbSBfX20yCisvLy8gICAgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzQgeCBpMTZdLiBFYWNoIDE2LWJpdCBlbGVtZW50IGlzIHRyZWF0ZWQgYXMgYQorLy8vICAgIDE2LWJpdCBzaWduZWQgaW50ZWdlciBhbmQgaXMgY29udmVydGVkIHRvIGFuIDgtYml0IHNpZ25lZCBpbnRlZ2VyIHdpdGgKKy8vLyAgICBzYXR1cmF0aW9uLiBQb3NpdGl2ZSB2YWx1ZXMgZ3JlYXRlciB0aGFuIDB4N0YgYXJlIHNhdHVyYXRlZCB0byAweDdGLgorLy8vICAgIE5lZ2F0aXZlIHZhbHVlcyBsZXNzIHRoYW4gMHg4MCBhcmUgc2F0dXJhdGVkIHRvIDB4ODAuIFRoZSBjb252ZXJ0ZWQKKy8vLyAgICBbNCB4IGk4XSB2YWx1ZXMgYXJlIHdyaXR0ZW4gdG8gdGhlIHVwcGVyIDMyIGJpdHMgb2YgdGhlIHJlc3VsdC4KKy8vLyBccmV0dXJucyBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbOCB4IGk4XSBjb250YWluaW5nIHRoZSBjb252ZXJ0ZWQKKy8vLyAgICB2YWx1ZXMuCitzdGF0aWMgX19pbmxpbmVfXyBfX202NCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9wYWNrc19waTE2KF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgICAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9wYWNrc3N3YigoX192NGhpKV9fbTEsIChfX3Y0aGkpX19tMik7Cit9CisKKy8vLyBcYnJpZWYgQ29udmVydHMgMzItYml0IHNpZ25lZCBpbnRlZ2VycyBmcm9tIGJvdGggNjQtYml0IGludGVnZXIgdmVjdG9yCisvLy8gICAgcGFyYW1ldGVycyBvZiBbMiB4IGkzMl0gaW50byAxNi1iaXQgc2lnbmVkIGludGVnZXIgdmFsdWVzLCBhbmQgY29uc3RydWN0cworLy8vICAgIGEgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mIFs0IHggaTE2XSBhcyB0aGUgcmVzdWx0LiBQb3NpdGl2ZSB2YWx1ZXMKKy8vLyAgICBncmVhdGVyIHRoYW4gMHg3RkZGIGFyZSBzYXR1cmF0ZWQgdG8gMHg3RkZGLiBOZWdhdGl2ZSB2YWx1ZXMgbGVzcyB0aGFuCisvLy8gICAgMHg4MDAwIGFyZSBzYXR1cmF0ZWQgdG8gMHg4MDAwLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFBBQ0tTU0RXIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fbTEKKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbMiB4IGkzMl0uIEVhY2ggMzItYml0IGVsZW1lbnQgaXMgdHJlYXRlZCBhcyBhCisvLy8gICAgMzItYml0IHNpZ25lZCBpbnRlZ2VyIGFuZCBpcyBjb252ZXJ0ZWQgdG8gYSAxNi1iaXQgc2lnbmVkIGludGVnZXIgd2l0aAorLy8vICAgIHNhdHVyYXRpb24uIFBvc2l0aXZlIHZhbHVlcyBncmVhdGVyIHRoYW4gMHg3RkZGIGFyZSBzYXR1cmF0ZWQgdG8gMHg3RkZGLgorLy8vICAgIE5lZ2F0aXZlIHZhbHVlcyBsZXNzIHRoYW4gMHg4MDAwIGFyZSBzYXR1cmF0ZWQgdG8gMHg4MDAwLiBUaGUgY29udmVydGVkCisvLy8gICAgWzIgeCBpMTZdIHZhbHVlcyBhcmUgd3JpdHRlbiB0byB0aGUgbG93ZXIgMzIgYml0cyBvZiB0aGUgcmVzdWx0LgorLy8vIFxwYXJhbSBfX20yCisvLy8gICAgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzIgeCBpMzJdLiBFYWNoIDMyLWJpdCBlbGVtZW50IGlzIHRyZWF0ZWQgYXMgYQorLy8vICAgIDMyLWJpdCBzaWduZWQgaW50ZWdlciBhbmQgaXMgY29udmVydGVkIHRvIGEgMTYtYml0IHNpZ25lZCBpbnRlZ2VyIHdpdGgKKy8vLyAgICBzYXR1cmF0aW9uLiBQb3NpdGl2ZSB2YWx1ZXMgZ3JlYXRlciB0aGFuIDB4N0ZGRiBhcmUgc2F0dXJhdGVkIHRvIDB4N0ZGRi4KKy8vLyAgICBOZWdhdGl2ZSB2YWx1ZXMgbGVzcyB0aGFuIDB4ODAwMCBhcmUgc2F0dXJhdGVkIHRvIDB4ODAwMC4gVGhlIGNvbnZlcnRlZAorLy8vICAgIFsyIHggaTE2XSB2YWx1ZXMgYXJlIHdyaXR0ZW4gdG8gdGhlIHVwcGVyIDMyIGJpdHMgb2YgdGhlIHJlc3VsdC4KKy8vLyBccmV0dXJucyBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbNCB4IGkxNl0gY29udGFpbmluZyB0aGUgY29udmVydGVkCisvLy8gICAgdmFsdWVzLgorc3RhdGljIF9faW5saW5lX18gX19tNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fcGFja3NfcGkzMihfX202NCBfX20xLCBfX202NCBfX20yKQoreworICAgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcGFja3NzZHcoKF9fdjJzaSlfX20xLCAoX192MnNpKV9fbTIpOworfQorCisvLy8gXGJyaWVmIENvbnZlcnRzIDE2LWJpdCBzaWduZWQgaW50ZWdlcnMgZnJvbSBib3RoIDY0LWJpdCBpbnRlZ2VyIHZlY3RvcgorLy8vICAgIHBhcmFtZXRlcnMgb2YgWzQgeCBpMTZdIGludG8gOC1iaXQgdW5zaWduZWQgaW50ZWdlciB2YWx1ZXMsIGFuZAorLy8vICAgIGNvbnN0cnVjdHMgYSA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzggeCBpOF0gYXMgdGhlIHJlc3VsdC4gVmFsdWVzCisvLy8gICAgZ3JlYXRlciB0aGFuIDB4RkYgYXJlIHNhdHVyYXRlZCB0byAweEZGLiBWYWx1ZXMgbGVzcyB0aGFuIDAgYXJlIHNhdHVyYXRlZAorLy8vICAgIHRvIDAuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgUEFDS1VTV0IgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19tMQorLy8vICAgIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mIFs0IHggaTE2XS4gRWFjaCAxNi1iaXQgZWxlbWVudCBpcyB0cmVhdGVkIGFzIGEKKy8vLyAgICAxNi1iaXQgc2lnbmVkIGludGVnZXIgYW5kIGlzIGNvbnZlcnRlZCB0byBhbiA4LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIHdpdGgKKy8vLyAgICBzYXR1cmF0aW9uLiBWYWx1ZXMgZ3JlYXRlciB0aGFuIDB4RkYgYXJlIHNhdHVyYXRlZCB0byAweEZGLiBWYWx1ZXMgbGVzcworLy8vICAgIHRoYW4gMCBhcmUgc2F0dXJhdGVkIHRvIDAuIFRoZSBjb252ZXJ0ZWQgWzQgeCBpOF0gdmFsdWVzIGFyZSB3cml0dGVuIHRvCisvLy8gICAgdGhlIGxvd2VyIDMyIGJpdHMgb2YgdGhlIHJlc3VsdC4KKy8vLyBccGFyYW0gX19tMgorLy8vICAgIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mIFs0IHggaTE2XS4gRWFjaCAxNi1iaXQgZWxlbWVudCBpcyB0cmVhdGVkIGFzIGEKKy8vLyAgICAxNi1iaXQgc2lnbmVkIGludGVnZXIgYW5kIGlzIGNvbnZlcnRlZCB0byBhbiA4LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIHdpdGgKKy8vLyAgICBzYXR1cmF0aW9uLiBWYWx1ZXMgZ3JlYXRlciB0aGFuIDB4RkYgYXJlIHNhdHVyYXRlZCB0byAweEZGLiBWYWx1ZXMgbGVzcworLy8vICAgIHRoYW4gMCBhcmUgc2F0dXJhdGVkIHRvIDAuIFRoZSBjb252ZXJ0ZWQgWzQgeCBpOF0gdmFsdWVzIGFyZSB3cml0dGVuIHRvCisvLy8gICAgdGhlIHVwcGVyIDMyIGJpdHMgb2YgdGhlIHJlc3VsdC4KKy8vLyBccmV0dXJucyBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbOCB4IGk4XSBjb250YWluaW5nIHRoZSBjb252ZXJ0ZWQKKy8vLyAgICB2YWx1ZXMuCitzdGF0aWMgX19pbmxpbmVfXyBfX202NCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9wYWNrc19wdTE2KF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgICAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9wYWNrdXN3YigoX192NGhpKV9fbTEsIChfX3Y0aGkpX19tMik7Cit9CisKKy8vLyBcYnJpZWYgVW5wYWNrcyB0aGUgdXBwZXIgMzIgYml0cyBmcm9tIHR3byA2NC1iaXQgaW50ZWdlciB2ZWN0b3JzIG9mIFs4IHggaThdCisvLy8gICAgYW5kIGludGVybGVhdmVzIHRoZW0gaW50byBhIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbOCB4IGk4XS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBQVU5QQ0tIQlcgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19tMQorLy8vICAgIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mIFs4IHggaThdLgorLy8vICAgIEJpdHMgWzM5OjMyXSBhcmUgd3JpdHRlbiB0byBiaXRzIFs3OjBdIG9mIHRoZSByZXN1bHQuCisvLy8gICAgQml0cyBbNDc6NDBdIGFyZSB3cml0dGVuIHRvIGJpdHMgWzIzOjE2XSBvZiB0aGUgcmVzdWx0LgorLy8vICAgIEJpdHMgWzU1OjQ4XSBhcmUgd3JpdHRlbiB0byBiaXRzIFszOTozMl0gb2YgdGhlIHJlc3VsdC4KKy8vLyAgICBCaXRzIFs2Mzo1Nl0gYXJlIHdyaXR0ZW4gdG8gYml0cyBbNTU6NDhdIG9mIHRoZSByZXN1bHQuCisvLy8gXHBhcmFtIF9fbTIKKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbOCB4IGk4XS4KKy8vLyAgICBCaXRzIFszOTozMl0gYXJlIHdyaXR0ZW4gdG8gYml0cyBbMTU6OF0gb2YgdGhlIHJlc3VsdC4KKy8vLyAgICBCaXRzIFs0Nzo0MF0gYXJlIHdyaXR0ZW4gdG8gYml0cyBbMzE6MjRdIG9mIHRoZSByZXN1bHQuCisvLy8gICAgQml0cyBbNTU6NDhdIGFyZSB3cml0dGVuIHRvIGJpdHMgWzQ3OjQwXSBvZiB0aGUgcmVzdWx0LgorLy8vICAgIEJpdHMgWzYzOjU2XSBhcmUgd3JpdHRlbiB0byBiaXRzIFs2Mzo1Nl0gb2YgdGhlIHJlc3VsdC4KKy8vLyBccmV0dXJucyBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbOCB4IGk4XSBjb250YWluaW5nIHRoZSBpbnRlcmxlYXZlZAorLy8vICAgIHZhbHVlcy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tX3VucGFja2hpX3BpOChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICAgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcHVucGNraGJ3KChfX3Y4cWkpX19tMSwgKF9fdjhxaSlfX20yKTsKK30KKworLy8vIFxicmllZiBVbnBhY2tzIHRoZSB1cHBlciAzMiBiaXRzIGZyb20gdHdvIDY0LWJpdCBpbnRlZ2VyIHZlY3RvcnMgb2YKKy8vLyAgICBbNCB4IGkxNl0gYW5kIGludGVybGVhdmVzIHRoZW0gaW50byBhIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbNCB4IGkxNl0uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgUFVOUENLSFdEIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fbTEKKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbNCB4IGkxNl0uCisvLy8gICAgQml0cyBbNDc6MzJdIGFyZSB3cml0dGVuIHRvIGJpdHMgWzE1OjBdIG9mIHRoZSByZXN1bHQuCisvLy8gICAgQml0cyBbNjM6NDhdIGFyZSB3cml0dGVuIHRvIGJpdHMgWzQ3OjMyXSBvZiB0aGUgcmVzdWx0LgorLy8vIFxwYXJhbSBfX20yCisvLy8gICAgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzQgeCBpMTZdLgorLy8vICAgIEJpdHMgWzQ3OjMyXSBhcmUgd3JpdHRlbiB0byBiaXRzIFszMToxNl0gb2YgdGhlIHJlc3VsdC4KKy8vLyAgICBCaXRzIFs2Mzo0OF0gYXJlIHdyaXR0ZW4gdG8gYml0cyBbNjM6NDhdIG9mIHRoZSByZXN1bHQuCisvLy8gXHJldHVybnMgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzQgeCBpMTZdIGNvbnRhaW5pbmcgdGhlIGludGVybGVhdmVkCisvLy8gICAgdmFsdWVzLgorc3RhdGljIF9faW5saW5lX18gX19tNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fdW5wYWNraGlfcGkxNihfX202NCBfX20xLCBfX202NCBfX20yKQoreworICAgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcHVucGNraHdkKChfX3Y0aGkpX19tMSwgKF9fdjRoaSlfX20yKTsKK30KKworLy8vIFxicmllZiBVbnBhY2tzIHRoZSB1cHBlciAzMiBiaXRzIGZyb20gdHdvIDY0LWJpdCBpbnRlZ2VyIHZlY3RvcnMgb2YKKy8vLyAgICBbMiB4IGkzMl0gYW5kIGludGVybGVhdmVzIHRoZW0gaW50byBhIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbMiB4IGkzMl0uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgUFVOUENLSERRIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fbTEKKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbMiB4IGkzMl0uIFRoZSB1cHBlciAzMiBiaXRzIGFyZSB3cml0dGVuIHRvCisvLy8gICAgdGhlIGxvd2VyIDMyIGJpdHMgb2YgdGhlIHJlc3VsdC4KKy8vLyBccGFyYW0gX19tMgorLy8vICAgIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mIFsyIHggaTMyXS4gVGhlIHVwcGVyIDMyIGJpdHMgYXJlIHdyaXR0ZW4gdG8KKy8vLyAgICB0aGUgdXBwZXIgMzIgYml0cyBvZiB0aGUgcmVzdWx0LgorLy8vIFxyZXR1cm5zIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mIFsyIHggaTMyXSBjb250YWluaW5nIHRoZSBpbnRlcmxlYXZlZAorLy8vICAgIHZhbHVlcy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tX3VucGFja2hpX3BpMzIoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3B1bnBja2hkcSgoX192MnNpKV9fbTEsIChfX3Yyc2kpX19tMik7Cit9CisKKy8vLyBcYnJpZWYgVW5wYWNrcyB0aGUgbG93ZXIgMzIgYml0cyBmcm9tIHR3byA2NC1iaXQgaW50ZWdlciB2ZWN0b3JzIG9mIFs4IHggaThdCisvLy8gICAgYW5kIGludGVybGVhdmVzIHRoZW0gaW50byBhIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbOCB4IGk4XS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBQVU5QQ0tMQlcgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19tMQorLy8vICAgIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mIFs4IHggaThdLgorLy8vICAgIEJpdHMgWzc6MF0gYXJlIHdyaXR0ZW4gdG8gYml0cyBbNzowXSBvZiB0aGUgcmVzdWx0LgorLy8vICAgIEJpdHMgWzE1OjhdIGFyZSB3cml0dGVuIHRvIGJpdHMgWzIzOjE2XSBvZiB0aGUgcmVzdWx0LgorLy8vICAgIEJpdHMgWzIzOjE2XSBhcmUgd3JpdHRlbiB0byBiaXRzIFszOTozMl0gb2YgdGhlIHJlc3VsdC4KKy8vLyAgICBCaXRzIFszMToyNF0gYXJlIHdyaXR0ZW4gdG8gYml0cyBbNTU6NDhdIG9mIHRoZSByZXN1bHQuCisvLy8gXHBhcmFtIF9fbTIKKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbOCB4IGk4XS4KKy8vLyAgICBCaXRzIFs3OjBdIGFyZSB3cml0dGVuIHRvIGJpdHMgWzE1OjhdIG9mIHRoZSByZXN1bHQuCisvLy8gICAgQml0cyBbMTU6OF0gYXJlIHdyaXR0ZW4gdG8gYml0cyBbMzE6MjRdIG9mIHRoZSByZXN1bHQuCisvLy8gICAgQml0cyBbMjM6MTZdIGFyZSB3cml0dGVuIHRvIGJpdHMgWzQ3OjQwXSBvZiB0aGUgcmVzdWx0LgorLy8vICAgIEJpdHMgWzMxOjI0XSBhcmUgd3JpdHRlbiB0byBiaXRzIFs2Mzo1Nl0gb2YgdGhlIHJlc3VsdC4KKy8vLyBccmV0dXJucyBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbOCB4IGk4XSBjb250YWluaW5nIHRoZSBpbnRlcmxlYXZlZAorLy8vICAgIHZhbHVlcy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tX3VucGFja2xvX3BpOChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICAgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcHVucGNrbGJ3KChfX3Y4cWkpX19tMSwgKF9fdjhxaSlfX20yKTsKK30KKworLy8vIFxicmllZiBVbnBhY2tzIHRoZSBsb3dlciAzMiBiaXRzIGZyb20gdHdvIDY0LWJpdCBpbnRlZ2VyIHZlY3RvcnMgb2YKKy8vLyAgICBbNCB4IGkxNl0gYW5kIGludGVybGVhdmVzIHRoZW0gaW50byBhIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbNCB4IGkxNl0uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgUFVOUENLTFdEIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fbTEKKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbNCB4IGkxNl0uCisvLy8gICAgQml0cyBbMTU6MF0gYXJlIHdyaXR0ZW4gdG8gYml0cyBbMTU6MF0gb2YgdGhlIHJlc3VsdC4KKy8vLyAgICBCaXRzIFszMToxNl0gYXJlIHdyaXR0ZW4gdG8gYml0cyBbNDc6MzJdIG9mIHRoZSByZXN1bHQuCisvLy8gXHBhcmFtIF9fbTIKKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbNCB4IGkxNl0uCisvLy8gICAgQml0cyBbMTU6MF0gYXJlIHdyaXR0ZW4gdG8gYml0cyBbMzE6MTZdIG9mIHRoZSByZXN1bHQuCisvLy8gICAgQml0cyBbMzE6MTZdIGFyZSB3cml0dGVuIHRvIGJpdHMgWzYzOjQ4XSBvZiB0aGUgcmVzdWx0LgorLy8vIFxyZXR1cm5zIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mIFs0IHggaTE2XSBjb250YWluaW5nIHRoZSBpbnRlcmxlYXZlZAorLy8vICAgIHZhbHVlcy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tX3VucGFja2xvX3BpMTYoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3B1bnBja2x3ZCgoX192NGhpKV9fbTEsIChfX3Y0aGkpX19tMik7Cit9CisKKy8vLyBcYnJpZWYgVW5wYWNrcyB0aGUgbG93ZXIgMzIgYml0cyBmcm9tIHR3byA2NC1iaXQgaW50ZWdlciB2ZWN0b3JzIG9mCisvLy8gICAgWzIgeCBpMzJdIGFuZCBpbnRlcmxlYXZlcyB0aGVtIGludG8gYSA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzIgeCBpMzJdLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFBVTlBDS0xEUSBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX20xCisvLy8gICAgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzIgeCBpMzJdLiBUaGUgbG93ZXIgMzIgYml0cyBhcmUgd3JpdHRlbiB0bworLy8vICAgIHRoZSBsb3dlciAzMiBiaXRzIG9mIHRoZSByZXN1bHQuCisvLy8gXHBhcmFtIF9fbTIKKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbMiB4IGkzMl0uIFRoZSBsb3dlciAzMiBiaXRzIGFyZSB3cml0dGVuIHRvCisvLy8gICAgdGhlIHVwcGVyIDMyIGJpdHMgb2YgdGhlIHJlc3VsdC4KKy8vLyBccmV0dXJucyBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbMiB4IGkzMl0gY29udGFpbmluZyB0aGUgaW50ZXJsZWF2ZWQKKy8vLyAgICB2YWx1ZXMuCitzdGF0aWMgX19pbmxpbmVfXyBfX202NCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV91bnBhY2tsb19waTMyKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgICAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9wdW5wY2tsZHEoKF9fdjJzaSlfX20xLCAoX192MnNpKV9fbTIpOworfQorCisvLy8gXGJyaWVmIEFkZHMgZWFjaCA4LWJpdCBpbnRlZ2VyIGVsZW1lbnQgb2YgdGhlIGZpcnN0IDY0LWJpdCBpbnRlZ2VyIHZlY3RvcgorLy8vICAgIG9mIFs4IHggaThdIHRvIHRoZSBjb3JyZXNwb25kaW5nIDgtYml0IGludGVnZXIgZWxlbWVudCBvZiB0aGUgc2Vjb25kCisvLy8gICAgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mIFs4IHggaThdLiBUaGUgbG93ZXIgOCBiaXRzIG9mIHRoZSByZXN1bHRzIGFyZQorLy8vICAgIHBhY2tlZCBpbnRvIGEgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mIFs4IHggaThdLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFBBRERCIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fbTEKKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbOCB4IGk4XS4KKy8vLyBccGFyYW0gX19tMgorLy8vICAgIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mIFs4IHggaThdLgorLy8vIFxyZXR1cm5zIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mIFs4IHggaThdIGNvbnRhaW5pbmcgdGhlIHN1bXMgb2YgYm90aAorLy8vICAgIHBhcmFtZXRlcnMuCitzdGF0aWMgX19pbmxpbmVfXyBfX202NCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9hZGRfcGk4KF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgICAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9wYWRkYigoX192OHFpKV9fbTEsIChfX3Y4cWkpX19tMik7Cit9CisKKy8vLyBcYnJpZWYgQWRkcyBlYWNoIDE2LWJpdCBpbnRlZ2VyIGVsZW1lbnQgb2YgdGhlIGZpcnN0IDY0LWJpdCBpbnRlZ2VyIHZlY3RvcgorLy8vICAgIG9mIFs0IHggaTE2XSB0byB0aGUgY29ycmVzcG9uZGluZyAxNi1iaXQgaW50ZWdlciBlbGVtZW50IG9mIHRoZSBzZWNvbmQKKy8vLyAgICA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzQgeCBpMTZdLiBUaGUgbG93ZXIgMTYgYml0cyBvZiB0aGUgcmVzdWx0cyBhcmUKKy8vLyAgICBwYWNrZWQgaW50byBhIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbNCB4IGkxNl0uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgUEFERFcgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19tMQorLy8vICAgIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mIFs0IHggaTE2XS4KKy8vLyBccGFyYW0gX19tMgorLy8vICAgIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mIFs0IHggaTE2XS4KKy8vLyBccmV0dXJucyBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbNCB4IGkxNl0gY29udGFpbmluZyB0aGUgc3VtcyBvZiBib3RoCisvLy8gICAgcGFyYW1ldGVycy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2FkZF9waTE2KF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgICAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9wYWRkdygoX192NGhpKV9fbTEsIChfX3Y0aGkpX19tMik7Cit9CisKKy8vLyBcYnJpZWYgQWRkcyBlYWNoIDMyLWJpdCBpbnRlZ2VyIGVsZW1lbnQgb2YgdGhlIGZpcnN0IDY0LWJpdCBpbnRlZ2VyIHZlY3RvcgorLy8vICAgIG9mIFsyIHggaTMyXSB0byB0aGUgY29ycmVzcG9uZGluZyAzMi1iaXQgaW50ZWdlciBlbGVtZW50IG9mIHRoZSBzZWNvbmQKKy8vLyAgICA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzIgeCBpMzJdLiBUaGUgbG93ZXIgMzIgYml0cyBvZiB0aGUgcmVzdWx0cyBhcmUKKy8vLyAgICBwYWNrZWQgaW50byBhIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbMiB4IGkzMl0uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgUEFEREQgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19tMQorLy8vICAgIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mIFsyIHggaTMyXS4KKy8vLyBccGFyYW0gX19tMgorLy8vICAgIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mIFsyIHggaTMyXS4KKy8vLyBccmV0dXJucyBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbMiB4IGkzMl0gY29udGFpbmluZyB0aGUgc3VtcyBvZiBib3RoCisvLy8gICAgcGFyYW1ldGVycy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2FkZF9waTMyKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgICAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9wYWRkZCgoX192MnNpKV9fbTEsIChfX3Yyc2kpX19tMik7Cit9CisKKy8vLyBcYnJpZWYgQWRkcyBlYWNoIDgtYml0IHNpZ25lZCBpbnRlZ2VyIGVsZW1lbnQgb2YgdGhlIGZpcnN0IDY0LWJpdCBpbnRlZ2VyCisvLy8gICAgdmVjdG9yIG9mIFs4IHggaThdIHRvIHRoZSBjb3JyZXNwb25kaW5nIDgtYml0IHNpZ25lZCBpbnRlZ2VyIGVsZW1lbnQgb2YKKy8vLyAgICB0aGUgc2Vjb25kIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbOCB4IGk4XS4gUG9zaXRpdmUgc3VtcyBncmVhdGVyIHRoYW4KKy8vLyAgICAweDdGIGFyZSBzYXR1cmF0ZWQgdG8gMHg3Ri4gTmVnYXRpdmUgc3VtcyBsZXNzIHRoYW4gMHg4MCBhcmUgc2F0dXJhdGVkIHRvCisvLy8gICAgMHg4MC4gVGhlIHJlc3VsdHMgYXJlIHBhY2tlZCBpbnRvIGEgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mIFs4IHggaThdLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFBBRERTQiBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX20xCisvLy8gICAgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzggeCBpOF0uCisvLy8gXHBhcmFtIF9fbTIKKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbOCB4IGk4XS4KKy8vLyBccmV0dXJucyBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbOCB4IGk4XSBjb250YWluaW5nIHRoZSBzYXR1cmF0ZWQgc3VtcworLy8vICAgIG9mIGJvdGggcGFyYW1ldGVycy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2FkZHNfcGk4KF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgICAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9wYWRkc2IoKF9fdjhxaSlfX20xLCAoX192OHFpKV9fbTIpOworfQorCisvLy8gXGJyaWVmIEFkZHMgZWFjaCAxNi1iaXQgc2lnbmVkIGludGVnZXIgZWxlbWVudCBvZiB0aGUgZmlyc3QgNjQtYml0IGludGVnZXIKKy8vLyAgICB2ZWN0b3Igb2YgWzQgeCBpMTZdIHRvIHRoZSBjb3JyZXNwb25kaW5nIDE2LWJpdCBzaWduZWQgaW50ZWdlciBlbGVtZW50IG9mCisvLy8gICAgdGhlIHNlY29uZCA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzQgeCBpMTZdLiBQb3NpdGl2ZSBzdW1zIGdyZWF0ZXIgdGhhbgorLy8vICAgIDB4N0ZGRiBhcmUgc2F0dXJhdGVkIHRvIDB4N0ZGRi4gTmVnYXRpdmUgc3VtcyBsZXNzIHRoYW4gMHg4MDAwIGFyZQorLy8vICAgIHNhdHVyYXRlZCB0byAweDgwMDAuIFRoZSByZXN1bHRzIGFyZSBwYWNrZWQgaW50byBhIDY0LWJpdCBpbnRlZ2VyIHZlY3RvcgorLy8vICAgIG9mIFs0IHggaTE2XS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBQQUREU1cgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19tMQorLy8vICAgIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mIFs0IHggaTE2XS4KKy8vLyBccGFyYW0gX19tMgorLy8vICAgIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mIFs0IHggaTE2XS4KKy8vLyBccmV0dXJucyBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbNCB4IGkxNl0gY29udGFpbmluZyB0aGUgc2F0dXJhdGVkIHN1bXMKKy8vLyAgICBvZiBib3RoIHBhcmFtZXRlcnMuCitzdGF0aWMgX19pbmxpbmVfXyBfX202NCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9hZGRzX3BpMTYoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BhZGRzdygoX192NGhpKV9fbTEsIChfX3Y0aGkpX19tMik7Cit9CisKKy8vLyBcYnJpZWYgQWRkcyBlYWNoIDgtYml0IHVuc2lnbmVkIGludGVnZXIgZWxlbWVudCBvZiB0aGUgZmlyc3QgNjQtYml0IGludGVnZXIKKy8vLyAgICB2ZWN0b3Igb2YgWzggeCBpOF0gdG8gdGhlIGNvcnJlc3BvbmRpbmcgOC1iaXQgdW5zaWduZWQgaW50ZWdlciBlbGVtZW50IG9mCisvLy8gICAgdGhlIHNlY29uZCA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzggeCBpOF0uIFN1bXMgZ3JlYXRlciB0aGFuIDB4RkYgYXJlCisvLy8gICAgc2F0dXJhdGVkIHRvIDB4RkYuIFRoZSByZXN1bHRzIGFyZSBwYWNrZWQgaW50byBhIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZgorLy8vICAgIFs4IHggaThdLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFBBRERVU0IgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19tMQorLy8vICAgIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mIFs4IHggaThdLgorLy8vIFxwYXJhbSBfX20yCisvLy8gICAgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzggeCBpOF0uCisvLy8gXHJldHVybnMgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzggeCBpOF0gY29udGFpbmluZyB0aGUgc2F0dXJhdGVkCisvLy8gICAgdW5zaWduZWQgc3VtcyBvZiBib3RoIHBhcmFtZXRlcnMuCitzdGF0aWMgX19pbmxpbmVfXyBfX202NCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9hZGRzX3B1OChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICAgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcGFkZHVzYigoX192OHFpKV9fbTEsIChfX3Y4cWkpX19tMik7Cit9CisKKy8vLyBcYnJpZWYgQWRkcyBlYWNoIDE2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIGVsZW1lbnQgb2YgdGhlIGZpcnN0IDY0LWJpdCBpbnRlZ2VyCisvLy8gICAgdmVjdG9yIG9mIFs0IHggaTE2XSB0byB0aGUgY29ycmVzcG9uZGluZyAxNi1iaXQgdW5zaWduZWQgaW50ZWdlciBlbGVtZW50CisvLy8gICAgb2YgdGhlIHNlY29uZCA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzQgeCBpMTZdLiBTdW1zIGdyZWF0ZXIgdGhhbgorLy8vICAgIDB4RkZGRiBhcmUgc2F0dXJhdGVkIHRvIDB4RkZGRi4gVGhlIHJlc3VsdHMgYXJlIHBhY2tlZCBpbnRvIGEgNjQtYml0CisvLy8gICAgaW50ZWdlciB2ZWN0b3Igb2YgWzQgeCBpMTZdLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFBBRERVU1cgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19tMQorLy8vICAgIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mIFs0IHggaTE2XS4KKy8vLyBccGFyYW0gX19tMgorLy8vICAgIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mIFs0IHggaTE2XS4KKy8vLyBccmV0dXJucyBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbNCB4IGkxNl0gY29udGFpbmluZyB0aGUgc2F0dXJhdGVkCisvLy8gICAgdW5zaWduZWQgc3VtcyBvZiBib3RoIHBhcmFtZXRlcnMuCitzdGF0aWMgX19pbmxpbmVfXyBfX202NCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9hZGRzX3B1MTYoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BhZGR1c3coKF9fdjRoaSlfX20xLCAoX192NGhpKV9fbTIpOworfQorCisvLy8gXGJyaWVmIFN1YnRyYWN0cyBlYWNoIDgtYml0IGludGVnZXIgZWxlbWVudCBvZiB0aGUgc2Vjb25kIDY0LWJpdCBpbnRlZ2VyCisvLy8gICAgdmVjdG9yIG9mIFs4IHggaThdIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcgOC1iaXQgaW50ZWdlciBlbGVtZW50IG9mIHRoZQorLy8vICAgIGZpcnN0IDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbOCB4IGk4XS4gVGhlIGxvd2VyIDggYml0cyBvZiB0aGUgcmVzdWx0cworLy8vICAgIGFyZSBwYWNrZWQgaW50byBhIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbOCB4IGk4XS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBQU1VCQiBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX20xCisvLy8gICAgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzggeCBpOF0gY29udGFpbmluZyB0aGUgbWludWVuZHMuCisvLy8gXHBhcmFtIF9fbTIKKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbOCB4IGk4XSBjb250YWluaW5nIHRoZSBzdWJ0cmFoZW5kcy4KKy8vLyBccmV0dXJucyBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbOCB4IGk4XSBjb250YWluaW5nIHRoZSBkaWZmZXJlbmNlcyBvZgorLy8vICAgIGJvdGggcGFyYW1ldGVycy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tX3N1Yl9waTgoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BzdWJiKChfX3Y4cWkpX19tMSwgKF9fdjhxaSlfX20yKTsKK30KKworLy8vIFxicmllZiBTdWJ0cmFjdHMgZWFjaCAxNi1iaXQgaW50ZWdlciBlbGVtZW50IG9mIHRoZSBzZWNvbmQgNjQtYml0IGludGVnZXIKKy8vLyAgICB2ZWN0b3Igb2YgWzQgeCBpMTZdIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcgMTYtYml0IGludGVnZXIgZWxlbWVudCBvZiB0aGUKKy8vLyAgICBmaXJzdCA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzQgeCBpMTZdLiBUaGUgbG93ZXIgMTYgYml0cyBvZiB0aGUKKy8vLyAgICByZXN1bHRzIGFyZSBwYWNrZWQgaW50byBhIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbNCB4IGkxNl0uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgUFNVQlcgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19tMQorLy8vICAgIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mIFs0IHggaTE2XSBjb250YWluaW5nIHRoZSBtaW51ZW5kcy4KKy8vLyBccGFyYW0gX19tMgorLy8vICAgIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mIFs0IHggaTE2XSBjb250YWluaW5nIHRoZSBzdWJ0cmFoZW5kcy4KKy8vLyBccmV0dXJucyBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbNCB4IGkxNl0gY29udGFpbmluZyB0aGUgZGlmZmVyZW5jZXMgb2YKKy8vLyAgICBib3RoIHBhcmFtZXRlcnMuCitzdGF0aWMgX19pbmxpbmVfXyBfX202NCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zdWJfcGkxNihfX202NCBfX20xLCBfX202NCBfX20yKQoreworICAgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcHN1YncoKF9fdjRoaSlfX20xLCAoX192NGhpKV9fbTIpOworfQorCisvLy8gXGJyaWVmIFN1YnRyYWN0cyBlYWNoIDMyLWJpdCBpbnRlZ2VyIGVsZW1lbnQgb2YgdGhlIHNlY29uZCA2NC1iaXQgaW50ZWdlcgorLy8vICAgIHZlY3RvciBvZiBbMiB4IGkzMl0gZnJvbSB0aGUgY29ycmVzcG9uZGluZyAzMi1iaXQgaW50ZWdlciBlbGVtZW50IG9mIHRoZQorLy8vICAgIGZpcnN0IDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbMiB4IGkzMl0uIFRoZSBsb3dlciAzMiBiaXRzIG9mIHRoZQorLy8vICAgIHJlc3VsdHMgYXJlIHBhY2tlZCBpbnRvIGEgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mIFsyIHggaTMyXS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBQU1VCRCBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX20xCisvLy8gICAgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzIgeCBpMzJdIGNvbnRhaW5pbmcgdGhlIG1pbnVlbmRzLgorLy8vIFxwYXJhbSBfX20yCisvLy8gICAgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzIgeCBpMzJdIGNvbnRhaW5pbmcgdGhlIHN1YnRyYWhlbmRzLgorLy8vIFxyZXR1cm5zIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mIFsyIHggaTMyXSBjb250YWluaW5nIHRoZSBkaWZmZXJlbmNlcyBvZgorLy8vICAgIGJvdGggcGFyYW1ldGVycy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tX3N1Yl9waTMyKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgICAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9wc3ViZCgoX192MnNpKV9fbTEsIChfX3Yyc2kpX19tMik7Cit9CisKKy8vLyBcYnJpZWYgU3VidHJhY3RzIGVhY2ggOC1iaXQgc2lnbmVkIGludGVnZXIgZWxlbWVudCBvZiB0aGUgc2Vjb25kIDY0LWJpdAorLy8vICAgIGludGVnZXIgdmVjdG9yIG9mIFs4IHggaThdIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcgOC1iaXQgc2lnbmVkIGludGVnZXIKKy8vLyAgICBlbGVtZW50IG9mIHRoZSBmaXJzdCA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzggeCBpOF0uIFBvc2l0aXZlIHJlc3VsdHMKKy8vLyAgICBncmVhdGVyIHRoYW4gMHg3RiBhcmUgc2F0dXJhdGVkIHRvIDB4N0YuIE5lZ2F0aXZlIHJlc3VsdHMgbGVzcyB0aGFuIDB4ODAKKy8vLyAgICBhcmUgc2F0dXJhdGVkIHRvIDB4ODAuIFRoZSByZXN1bHRzIGFyZSBwYWNrZWQgaW50byBhIDY0LWJpdCBpbnRlZ2VyCisvLy8gICAgdmVjdG9yIG9mIFs4IHggaThdLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFBTVUJTQiBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX20xCisvLy8gICAgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzggeCBpOF0gY29udGFpbmluZyB0aGUgbWludWVuZHMuCisvLy8gXHBhcmFtIF9fbTIKKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbOCB4IGk4XSBjb250YWluaW5nIHRoZSBzdWJ0cmFoZW5kcy4KKy8vLyBccmV0dXJucyBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbOCB4IGk4XSBjb250YWluaW5nIHRoZSBzYXR1cmF0ZWQKKy8vLyAgICBkaWZmZXJlbmNlcyBvZiBib3RoIHBhcmFtZXRlcnMuCitzdGF0aWMgX19pbmxpbmVfXyBfX202NCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zdWJzX3BpOChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICAgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcHN1YnNiKChfX3Y4cWkpX19tMSwgKF9fdjhxaSlfX20yKTsKK30KKworLy8vIFxicmllZiBTdWJ0cmFjdHMgZWFjaCAxNi1iaXQgc2lnbmVkIGludGVnZXIgZWxlbWVudCBvZiB0aGUgc2Vjb25kIDY0LWJpdAorLy8vICAgIGludGVnZXIgdmVjdG9yIG9mIFs0IHggaTE2XSBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIDE2LWJpdCBzaWduZWQgaW50ZWdlcgorLy8vICAgIGVsZW1lbnQgb2YgdGhlIGZpcnN0IDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbNCB4IGkxNl0uIFBvc2l0aXZlIHJlc3VsdHMKKy8vLyAgICBncmVhdGVyIHRoYW4gMHg3RkZGIGFyZSBzYXR1cmF0ZWQgdG8gMHg3RkZGLiBOZWdhdGl2ZSByZXN1bHRzIGxlc3MgdGhhbgorLy8vICAgIDB4ODAwMCBhcmUgc2F0dXJhdGVkIHRvIDB4ODAwMC4gVGhlIHJlc3VsdHMgYXJlIHBhY2tlZCBpbnRvIGEgNjQtYml0CisvLy8gICAgaW50ZWdlciB2ZWN0b3Igb2YgWzQgeCBpMTZdLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFBTVUJTVyBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX20xCisvLy8gICAgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzQgeCBpMTZdIGNvbnRhaW5pbmcgdGhlIG1pbnVlbmRzLgorLy8vIFxwYXJhbSBfX20yCisvLy8gICAgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzQgeCBpMTZdIGNvbnRhaW5pbmcgdGhlIHN1YnRyYWhlbmRzLgorLy8vIFxyZXR1cm5zIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mIFs0IHggaTE2XSBjb250YWluaW5nIHRoZSBzYXR1cmF0ZWQKKy8vLyAgICBkaWZmZXJlbmNlcyBvZiBib3RoIHBhcmFtZXRlcnMuCitzdGF0aWMgX19pbmxpbmVfXyBfX202NCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zdWJzX3BpMTYoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BzdWJzdygoX192NGhpKV9fbTEsIChfX3Y0aGkpX19tMik7Cit9CisKKy8vLyBcYnJpZWYgU3VidHJhY3RzIGVhY2ggOC1iaXQgdW5zaWduZWQgaW50ZWdlciBlbGVtZW50IG9mIHRoZSBzZWNvbmQgNjQtYml0CisvLy8gICAgaW50ZWdlciB2ZWN0b3Igb2YgWzggeCBpOF0gZnJvbSB0aGUgY29ycmVzcG9uZGluZyA4LWJpdCB1bnNpZ25lZCBpbnRlZ2VyCisvLy8gICAgZWxlbWVudCBvZiB0aGUgZmlyc3QgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mIFs4IHggaThdLiBJZiBhbiBlbGVtZW50IG9mCisvLy8gICAgdGhlIGZpcnN0IHZlY3RvciBpcyBsZXNzIHRoYW4gdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBvZiB0aGUgc2Vjb25kCisvLy8gICAgdmVjdG9yLCB0aGUgcmVzdWx0IGlzIHNhdHVyYXRlZCB0byAwLiBUaGUgcmVzdWx0cyBhcmUgcGFja2VkIGludG8gYQorLy8vICAgIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbOCB4IGk4XS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBQU1VCVVNCIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fbTEKKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbOCB4IGk4XSBjb250YWluaW5nIHRoZSBtaW51ZW5kcy4KKy8vLyBccGFyYW0gX19tMgorLy8vICAgIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mIFs4IHggaThdIGNvbnRhaW5pbmcgdGhlIHN1YnRyYWhlbmRzLgorLy8vIFxyZXR1cm5zIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mIFs4IHggaThdIGNvbnRhaW5pbmcgdGhlIHNhdHVyYXRlZAorLy8vICAgIGRpZmZlcmVuY2VzIG9mIGJvdGggcGFyYW1ldGVycy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tX3N1YnNfcHU4KF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgICAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9wc3VidXNiKChfX3Y4cWkpX19tMSwgKF9fdjhxaSlfX20yKTsKK30KKworLy8vIFxicmllZiBTdWJ0cmFjdHMgZWFjaCAxNi1iaXQgdW5zaWduZWQgaW50ZWdlciBlbGVtZW50IG9mIHRoZSBzZWNvbmQgNjQtYml0CisvLy8gICAgaW50ZWdlciB2ZWN0b3Igb2YgWzQgeCBpMTZdIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcgMTYtYml0IHVuc2lnbmVkCisvLy8gICAgaW50ZWdlciBlbGVtZW50IG9mIHRoZSBmaXJzdCA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzQgeCBpMTZdLiBJZiBhbgorLy8vICAgIGVsZW1lbnQgb2YgdGhlIGZpcnN0IHZlY3RvciBpcyBsZXNzIHRoYW4gdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBvZiB0aGUKKy8vLyAgICBzZWNvbmQgdmVjdG9yLCB0aGUgcmVzdWx0IGlzIHNhdHVyYXRlZCB0byAwLiBUaGUgcmVzdWx0cyBhcmUgcGFja2VkIGludG8KKy8vLyAgICBhIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbNCB4IGkxNl0uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgUFNVQlVTVyBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX20xCisvLy8gICAgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzQgeCBpMTZdIGNvbnRhaW5pbmcgdGhlIG1pbnVlbmRzLgorLy8vIFxwYXJhbSBfX20yCisvLy8gICAgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzQgeCBpMTZdIGNvbnRhaW5pbmcgdGhlIHN1YnRyYWhlbmRzLgorLy8vIFxyZXR1cm5zIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mIFs0IHggaTE2XSBjb250YWluaW5nIHRoZSBzYXR1cmF0ZWQKKy8vLyAgICBkaWZmZXJlbmNlcyBvZiBib3RoIHBhcmFtZXRlcnMuCitzdGF0aWMgX19pbmxpbmVfXyBfX202NCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zdWJzX3B1MTYoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BzdWJ1c3coKF9fdjRoaSlfX20xLCAoX192NGhpKV9fbTIpOworfQorCisvLy8gXGJyaWVmIE11bHRpcGxpZXMgZWFjaCAxNi1iaXQgc2lnbmVkIGludGVnZXIgZWxlbWVudCBvZiB0aGUgZmlyc3QgNjQtYml0CisvLy8gICAgaW50ZWdlciB2ZWN0b3Igb2YgWzQgeCBpMTZdIGJ5IHRoZSBjb3JyZXNwb25kaW5nIDE2LWJpdCBzaWduZWQgaW50ZWdlcgorLy8vICAgIGVsZW1lbnQgb2YgdGhlIHNlY29uZCA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzQgeCBpMTZdIGFuZCBnZXQgZm91cgorLy8vICAgIDMyLWJpdCBwcm9kdWN0cy4gQWRkcyBhZGphY2VudCBwYWlycyBvZiBwcm9kdWN0cyB0byBnZXQgdHdvIDMyLWJpdCBzdW1zLgorLy8vICAgIFRoZSBsb3dlciAzMiBiaXRzIG9mIHRoZXNlIHR3byBzdW1zIGFyZSBwYWNrZWQgaW50byBhIDY0LWJpdCBpbnRlZ2VyCisvLy8gICAgdmVjdG9yIG9mIFsyIHggaTMyXS4gRm9yIGV4YW1wbGUsIGJpdHMgWzE1OjBdIG9mIGJvdGggcGFyYW1ldGVycyBhcmUKKy8vLyAgICBtdWx0aXBsaWVkLCBiaXRzIFszMToxNl0gb2YgYm90aCBwYXJhbWV0ZXJzIGFyZSBtdWx0aXBsaWVkLCBhbmQgdGhlIHN1bQorLy8vICAgIG9mIGJvdGggcmVzdWx0cyBpcyB3cml0dGVuIHRvIGJpdHMgWzMxOjBdIG9mIHRoZSByZXN1bHQuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgUE1BRERXRCBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX20xCisvLy8gICAgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzQgeCBpMTZdLgorLy8vIFxwYXJhbSBfX20yCisvLy8gICAgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzQgeCBpMTZdLgorLy8vIFxyZXR1cm5zIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mIFsyIHggaTMyXSBjb250YWluaW5nIHRoZSBzdW1zIG9mCisvLy8gICAgcHJvZHVjdHMgb2YgYm90aCBwYXJhbWV0ZXJzLgorc3RhdGljIF9faW5saW5lX18gX19tNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFkZF9waTE2KF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgICAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9wbWFkZHdkKChfX3Y0aGkpX19tMSwgKF9fdjRoaSlfX20yKTsKK30KKworLy8vIFxicmllZiBNdWx0aXBsaWVzIGVhY2ggMTYtYml0IHNpZ25lZCBpbnRlZ2VyIGVsZW1lbnQgb2YgdGhlIGZpcnN0IDY0LWJpdAorLy8vICAgIGludGVnZXIgdmVjdG9yIG9mIFs0IHggaTE2XSBieSB0aGUgY29ycmVzcG9uZGluZyAxNi1iaXQgc2lnbmVkIGludGVnZXIKKy8vLyAgICBlbGVtZW50IG9mIHRoZSBzZWNvbmQgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mIFs0IHggaTE2XS4gUGFja3MgdGhlIHVwcGVyCisvLy8gICAgMTYgYml0cyBvZiB0aGUgMzItYml0IHByb2R1Y3RzIGludG8gYSA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzQgeCBpMTZdLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFBNVUxIVyBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX20xCisvLy8gICAgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzQgeCBpMTZdLgorLy8vIFxwYXJhbSBfX20yCisvLy8gICAgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzQgeCBpMTZdLgorLy8vIFxyZXR1cm5zIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mIFs0IHggaTE2XSBjb250YWluaW5nIHRoZSB1cHBlciAxNiBiaXRzCisvLy8gICAgb2YgdGhlIHByb2R1Y3RzIG9mIGJvdGggcGFyYW1ldGVycy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tX211bGhpX3BpMTYoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BtdWxodygoX192NGhpKV9fbTEsIChfX3Y0aGkpX19tMik7Cit9CisKKy8vLyBcYnJpZWYgTXVsdGlwbGllcyBlYWNoIDE2LWJpdCBzaWduZWQgaW50ZWdlciBlbGVtZW50IG9mIHRoZSBmaXJzdCA2NC1iaXQKKy8vLyAgICBpbnRlZ2VyIHZlY3RvciBvZiBbNCB4IGkxNl0gYnkgdGhlIGNvcnJlc3BvbmRpbmcgMTYtYml0IHNpZ25lZCBpbnRlZ2VyCisvLy8gICAgZWxlbWVudCBvZiB0aGUgc2Vjb25kIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbNCB4IGkxNl0uIFBhY2tzIHRoZSBsb3dlcgorLy8vICAgIDE2IGJpdHMgb2YgdGhlIDMyLWJpdCBwcm9kdWN0cyBpbnRvIGEgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mIFs0IHggaTE2XS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBQTVVMTFcgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19tMQorLy8vICAgIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mIFs0IHggaTE2XS4KKy8vLyBccGFyYW0gX19tMgorLy8vICAgIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mIFs0IHggaTE2XS4KKy8vLyBccmV0dXJucyBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbNCB4IGkxNl0gY29udGFpbmluZyB0aGUgbG93ZXIgMTYgYml0cworLy8vICAgIG9mIHRoZSBwcm9kdWN0cyBvZiBib3RoIHBhcmFtZXRlcnMuCitzdGF0aWMgX19pbmxpbmVfXyBfX202NCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tdWxsb19waTE2KF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgICAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9wbXVsbHcoKF9fdjRoaSlfX20xLCAoX192NGhpKV9fbTIpOworfQorCisvLy8gXGJyaWVmIExlZnQtc2hpZnRzIGVhY2ggMTYtYml0IHNpZ25lZCBpbnRlZ2VyIGVsZW1lbnQgb2YgdGhlIGZpcnN0CisvLy8gICAgcGFyYW1ldGVyLCB3aGljaCBpcyBhIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbNCB4IGkxNl0sIGJ5IHRoZSBudW1iZXIKKy8vLyAgICBvZiBiaXRzIHNwZWNpZmllZCBieSB0aGUgc2Vjb25kIHBhcmFtZXRlciwgd2hpY2ggaXMgYSA2NC1iaXQgaW50ZWdlci4gVGhlCisvLy8gICAgbG93ZXIgMTYgYml0cyBvZiB0aGUgcmVzdWx0cyBhcmUgcGFja2VkIGludG8gYSA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YKKy8vLyAgICBbNCB4IGkxNl0uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgUFNMTFcgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19tCisvLy8gICAgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzQgeCBpMTZdLgorLy8vIFxwYXJhbSBfX2NvdW50CisvLy8gICAgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3IgaW50ZXJwcmV0ZWQgYXMgYSBzaW5nbGUgNjQtYml0IGludGVnZXIuCisvLy8gXHJldHVybnMgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzQgeCBpMTZdIGNvbnRhaW5pbmcgdGhlIGxlZnQtc2hpZnRlZAorLy8vICAgIHZhbHVlcy4gSWYgX19jb3VudCBpcyBncmVhdGVyIG9yIGVxdWFsIHRvIDE2LCB0aGUgcmVzdWx0IGlzIHNldCB0byBhbGwgMC4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tX3NsbF9waTE2KF9fbTY0IF9fbSwgX19tNjQgX19jb3VudCkKK3sKKyAgICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BzbGx3KChfX3Y0aGkpX19tLCBfX2NvdW50KTsKK30KKworLy8vIFxicmllZiBMZWZ0LXNoaWZ0cyBlYWNoIDE2LWJpdCBzaWduZWQgaW50ZWdlciBlbGVtZW50IG9mIGEgNjQtYml0IGludGVnZXIKKy8vLyAgICB2ZWN0b3Igb2YgWzQgeCBpMTZdIGJ5IHRoZSBudW1iZXIgb2YgYml0cyBzcGVjaWZpZWQgYnkgYSAzMi1iaXQgaW50ZWdlci4KKy8vLyAgICBUaGUgbG93ZXIgMTYgYml0cyBvZiB0aGUgcmVzdWx0cyBhcmUgcGFja2VkIGludG8gYSA2NC1iaXQgaW50ZWdlciB2ZWN0b3IKKy8vLyAgICBvZiBbNCB4IGkxNl0uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgUFNMTFcgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19tCisvLy8gICAgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzQgeCBpMTZdLgorLy8vIFxwYXJhbSBfX2NvdW50CisvLy8gICAgQSAzMi1iaXQgaW50ZWdlciB2YWx1ZS4KKy8vLyBccmV0dXJucyBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbNCB4IGkxNl0gY29udGFpbmluZyB0aGUgbGVmdC1zaGlmdGVkCisvLy8gICAgdmFsdWVzLiBJZiBfX2NvdW50IGlzIGdyZWF0ZXIgb3IgZXF1YWwgdG8gMTYsIHRoZSByZXN1bHQgaXMgc2V0IHRvIGFsbCAwLgorc3RhdGljIF9faW5saW5lX18gX19tNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc2xsaV9waTE2KF9fbTY0IF9fbSwgaW50IF9fY291bnQpCit7CisgICAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9wc2xsd2koKF9fdjRoaSlfX20sIF9fY291bnQpOworfQorCisvLy8gXGJyaWVmIExlZnQtc2hpZnRzIGVhY2ggMzItYml0IHNpZ25lZCBpbnRlZ2VyIGVsZW1lbnQgb2YgdGhlIGZpcnN0CisvLy8gICAgcGFyYW1ldGVyLCB3aGljaCBpcyBhIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbMiB4IGkzMl0sIGJ5IHRoZSBudW1iZXIKKy8vLyAgICBvZiBiaXRzIHNwZWNpZmllZCBieSB0aGUgc2Vjb25kIHBhcmFtZXRlciwgd2hpY2ggaXMgYSA2NC1iaXQgaW50ZWdlci4gVGhlCisvLy8gICAgbG93ZXIgMzIgYml0cyBvZiB0aGUgcmVzdWx0cyBhcmUgcGFja2VkIGludG8gYSA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YKKy8vLyAgICBbMiB4IGkzMl0uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgUFNMTEQgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19tCisvLy8gICAgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzIgeCBpMzJdLgorLy8vIFxwYXJhbSBfX2NvdW50CisvLy8gICAgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3IgaW50ZXJwcmV0ZWQgYXMgYSBzaW5nbGUgNjQtYml0IGludGVnZXIuCisvLy8gXHJldHVybnMgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzIgeCBpMzJdIGNvbnRhaW5pbmcgdGhlIGxlZnQtc2hpZnRlZAorLy8vICAgIHZhbHVlcy4gSWYgX19jb3VudCBpcyBncmVhdGVyIG9yIGVxdWFsIHRvIDMyLCB0aGUgcmVzdWx0IGlzIHNldCB0byBhbGwgMC4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tX3NsbF9waTMyKF9fbTY0IF9fbSwgX19tNjQgX19jb3VudCkKK3sKKyAgICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BzbGxkKChfX3Yyc2kpX19tLCBfX2NvdW50KTsKK30KKworLy8vIFxicmllZiBMZWZ0LXNoaWZ0cyBlYWNoIDMyLWJpdCBzaWduZWQgaW50ZWdlciBlbGVtZW50IG9mIGEgNjQtYml0IGludGVnZXIKKy8vLyAgICB2ZWN0b3Igb2YgWzIgeCBpMzJdIGJ5IHRoZSBudW1iZXIgb2YgYml0cyBzcGVjaWZpZWQgYnkgYSAzMi1iaXQgaW50ZWdlci4KKy8vLyAgICBUaGUgbG93ZXIgMzIgYml0cyBvZiB0aGUgcmVzdWx0cyBhcmUgcGFja2VkIGludG8gYSA2NC1iaXQgaW50ZWdlciB2ZWN0b3IKKy8vLyAgICBvZiBbMiB4IGkzMl0uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgUFNMTEQgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19tCisvLy8gICAgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzIgeCBpMzJdLgorLy8vIFxwYXJhbSBfX2NvdW50CisvLy8gICAgQSAzMi1iaXQgaW50ZWdlciB2YWx1ZS4KKy8vLyBccmV0dXJucyBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbMiB4IGkzMl0gY29udGFpbmluZyB0aGUgbGVmdC1zaGlmdGVkCisvLy8gICAgdmFsdWVzLiBJZiBfX2NvdW50IGlzIGdyZWF0ZXIgb3IgZXF1YWwgdG8gMzIsIHRoZSByZXN1bHQgaXMgc2V0IHRvIGFsbCAwLgorc3RhdGljIF9faW5saW5lX18gX19tNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc2xsaV9waTMyKF9fbTY0IF9fbSwgaW50IF9fY291bnQpCit7CisgICAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9wc2xsZGkoKF9fdjJzaSlfX20sIF9fY291bnQpOworfQorCisvLy8gXGJyaWVmIExlZnQtc2hpZnRzIHRoZSBmaXJzdCA2NC1iaXQgaW50ZWdlciBwYXJhbWV0ZXIgYnkgdGhlIG51bWJlciBvZiBiaXRzCisvLy8gICAgc3BlY2lmaWVkIGJ5IHRoZSBzZWNvbmQgNjQtYml0IGludGVnZXIgcGFyYW1ldGVyLiBUaGUgbG93ZXIgNjQgYml0cyBvZgorLy8vICAgIHJlc3VsdCBhcmUgcmV0dXJuZWQuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgUFNMTFEgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19tCisvLy8gICAgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3IgaW50ZXJwcmV0ZWQgYXMgYSBzaW5nbGUgNjQtYml0IGludGVnZXIuCisvLy8gXHBhcmFtIF9fY291bnQKKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBpbnRlcnByZXRlZCBhcyBhIHNpbmdsZSA2NC1iaXQgaW50ZWdlci4KKy8vLyBccmV0dXJucyBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIHRoZSBsZWZ0LXNoaWZ0ZWQgdmFsdWUuIElmCisvLy8gICAgIF9fY291bnQgaXMgZ3JlYXRlciBvciBlcXVhbCB0byA2NCwgdGhlIHJlc3VsdCBpcyBzZXQgdG8gMC4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tX3NsbF9zaTY0KF9fbTY0IF9fbSwgX19tNjQgX19jb3VudCkKK3sKKyAgICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BzbGxxKChfX3YxZGkpX19tLCBfX2NvdW50KTsKK30KKworLy8vIFxicmllZiBMZWZ0LXNoaWZ0cyB0aGUgZmlyc3QgcGFyYW1ldGVyLCB3aGljaCBpcyBhIDY0LWJpdCBpbnRlZ2VyLCBieSB0aGUKKy8vLyAgICBudW1iZXIgb2YgYml0cyBzcGVjaWZpZWQgYnkgdGhlIHNlY29uZCBwYXJhbWV0ZXIsIHdoaWNoIGlzIGEgMzItYml0CisvLy8gICAgaW50ZWdlci4gVGhlIGxvd2VyIDY0IGJpdHMgb2YgcmVzdWx0IGFyZSByZXR1cm5lZC4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBQU0xMUSBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX20KKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBpbnRlcnByZXRlZCBhcyBhIHNpbmdsZSA2NC1iaXQgaW50ZWdlci4KKy8vLyBccGFyYW0gX19jb3VudAorLy8vICAgIEEgMzItYml0IGludGVnZXIgdmFsdWUuCisvLy8gXHJldHVybnMgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgbGVmdC1zaGlmdGVkIHZhbHVlLiBJZgorLy8vICAgICBfX2NvdW50IGlzIGdyZWF0ZXIgb3IgZXF1YWwgdG8gNjQsIHRoZSByZXN1bHQgaXMgc2V0IHRvIDAuCitzdGF0aWMgX19pbmxpbmVfXyBfX202NCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zbGxpX3NpNjQoX19tNjQgX19tLCBpbnQgX19jb3VudCkKK3sKKyAgICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BzbGxxaSgoX192MWRpKV9fbSwgX19jb3VudCk7Cit9CisKKy8vLyBcYnJpZWYgUmlnaHQtc2hpZnRzIGVhY2ggMTYtYml0IGludGVnZXIgZWxlbWVudCBvZiB0aGUgZmlyc3QgcGFyYW1ldGVyLAorLy8vICAgIHdoaWNoIGlzIGEgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mIFs0IHggaTE2XSwgYnkgdGhlIG51bWJlciBvZiBiaXRzCisvLy8gICAgc3BlY2lmaWVkIGJ5IHRoZSBzZWNvbmQgcGFyYW1ldGVyLCB3aGljaCBpcyBhIDY0LWJpdCBpbnRlZ2VyLiBIaWdoLW9yZGVyCisvLy8gICAgYml0cyBhcmUgZmlsbGVkIHdpdGggdGhlIHNpZ24gYml0IG9mIHRoZSBpbml0aWFsIHZhbHVlIG9mIGVhY2ggMTYtYml0CisvLy8gICAgZWxlbWVudC4gVGhlIDE2LWJpdCByZXN1bHRzIGFyZSBwYWNrZWQgaW50byBhIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZgorLy8vICAgIFs0IHggaTE2XS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBQU1JBVyBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX20KKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbNCB4IGkxNl0uCisvLy8gXHBhcmFtIF9fY291bnQKKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBpbnRlcnByZXRlZCBhcyBhIHNpbmdsZSA2NC1iaXQgaW50ZWdlci4KKy8vLyBccmV0dXJucyBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbNCB4IGkxNl0gY29udGFpbmluZyB0aGUgcmlnaHQtc2hpZnRlZAorLy8vICAgIHZhbHVlcy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tX3NyYV9waTE2KF9fbTY0IF9fbSwgX19tNjQgX19jb3VudCkKK3sKKyAgICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BzcmF3KChfX3Y0aGkpX19tLCBfX2NvdW50KTsKK30KKworLy8vIFxicmllZiBSaWdodC1zaGlmdHMgZWFjaCAxNi1iaXQgaW50ZWdlciBlbGVtZW50IG9mIGEgNjQtYml0IGludGVnZXIgdmVjdG9yCisvLy8gICAgb2YgWzQgeCBpMTZdIGJ5IHRoZSBudW1iZXIgb2YgYml0cyBzcGVjaWZpZWQgYnkgYSAzMi1iaXQgaW50ZWdlci4KKy8vLyAgICBIaWdoLW9yZGVyIGJpdHMgYXJlIGZpbGxlZCB3aXRoIHRoZSBzaWduIGJpdCBvZiB0aGUgaW5pdGlhbCB2YWx1ZSBvZiBlYWNoCisvLy8gICAgMTYtYml0IGVsZW1lbnQuIFRoZSAxNi1iaXQgcmVzdWx0cyBhcmUgcGFja2VkIGludG8gYSA2NC1iaXQgaW50ZWdlcgorLy8vICAgIHZlY3RvciBvZiBbNCB4IGkxNl0uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgUFNSQVcgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19tCisvLy8gICAgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzQgeCBpMTZdLgorLy8vIFxwYXJhbSBfX2NvdW50CisvLy8gICAgQSAzMi1iaXQgaW50ZWdlciB2YWx1ZS4KKy8vLyBccmV0dXJucyBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbNCB4IGkxNl0gY29udGFpbmluZyB0aGUgcmlnaHQtc2hpZnRlZAorLy8vICAgIHZhbHVlcy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tX3NyYWlfcGkxNihfX202NCBfX20sIGludCBfX2NvdW50KQoreworICAgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcHNyYXdpKChfX3Y0aGkpX19tLCBfX2NvdW50KTsKK30KKworLy8vIFxicmllZiBSaWdodC1zaGlmdHMgZWFjaCAzMi1iaXQgaW50ZWdlciBlbGVtZW50IG9mIHRoZSBmaXJzdCBwYXJhbWV0ZXIsCisvLy8gICAgd2hpY2ggaXMgYSA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzIgeCBpMzJdLCBieSB0aGUgbnVtYmVyIG9mIGJpdHMKKy8vLyAgICBzcGVjaWZpZWQgYnkgdGhlIHNlY29uZCBwYXJhbWV0ZXIsIHdoaWNoIGlzIGEgNjQtYml0IGludGVnZXIuIEhpZ2gtb3JkZXIKKy8vLyAgICBiaXRzIGFyZSBmaWxsZWQgd2l0aCB0aGUgc2lnbiBiaXQgb2YgdGhlIGluaXRpYWwgdmFsdWUgb2YgZWFjaCAzMi1iaXQKKy8vLyAgICBlbGVtZW50LiBUaGUgMzItYml0IHJlc3VsdHMgYXJlIHBhY2tlZCBpbnRvIGEgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mCisvLy8gICAgWzIgeCBpMzJdLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFBTUkFEIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fbQorLy8vICAgIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mIFsyIHggaTMyXS4KKy8vLyBccGFyYW0gX19jb3VudAorLy8vICAgIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIGludGVycHJldGVkIGFzIGEgc2luZ2xlIDY0LWJpdCBpbnRlZ2VyLgorLy8vIFxyZXR1cm5zIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mIFsyIHggaTMyXSBjb250YWluaW5nIHRoZSByaWdodC1zaGlmdGVkCisvLy8gICAgdmFsdWVzLgorc3RhdGljIF9faW5saW5lX18gX19tNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc3JhX3BpMzIoX19tNjQgX19tLCBfX202NCBfX2NvdW50KQoreworICAgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcHNyYWQoKF9fdjJzaSlfX20sIF9fY291bnQpOworfQorCisvLy8gXGJyaWVmIFJpZ2h0LXNoaWZ0cyBlYWNoIDMyLWJpdCBpbnRlZ2VyIGVsZW1lbnQgb2YgYSA2NC1iaXQgaW50ZWdlciB2ZWN0b3IKKy8vLyAgICBvZiBbMiB4IGkzMl0gYnkgdGhlIG51bWJlciBvZiBiaXRzIHNwZWNpZmllZCBieSBhIDMyLWJpdCBpbnRlZ2VyLgorLy8vICAgIEhpZ2gtb3JkZXIgYml0cyBhcmUgZmlsbGVkIHdpdGggdGhlIHNpZ24gYml0IG9mIHRoZSBpbml0aWFsIHZhbHVlIG9mIGVhY2gKKy8vLyAgICAzMi1iaXQgZWxlbWVudC4gVGhlIDMyLWJpdCByZXN1bHRzIGFyZSBwYWNrZWQgaW50byBhIDY0LWJpdCBpbnRlZ2VyCisvLy8gICAgdmVjdG9yIG9mIFsyIHggaTMyXS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBQU1JBRCBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX20KKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbMiB4IGkzMl0uCisvLy8gXHBhcmFtIF9fY291bnQKKy8vLyAgICBBIDMyLWJpdCBpbnRlZ2VyIHZhbHVlLgorLy8vIFxyZXR1cm5zIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mIFsyIHggaTMyXSBjb250YWluaW5nIHRoZSByaWdodC1zaGlmdGVkCisvLy8gICAgdmFsdWVzLgorc3RhdGljIF9faW5saW5lX18gX19tNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc3JhaV9waTMyKF9fbTY0IF9fbSwgaW50IF9fY291bnQpCit7CisgICAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9wc3JhZGkoKF9fdjJzaSlfX20sIF9fY291bnQpOworfQorCisvLy8gXGJyaWVmIFJpZ2h0LXNoaWZ0cyBlYWNoIDE2LWJpdCBpbnRlZ2VyIGVsZW1lbnQgb2YgdGhlIGZpcnN0IHBhcmFtZXRlciwKKy8vLyAgICB3aGljaCBpcyBhIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbNCB4IGkxNl0sIGJ5IHRoZSBudW1iZXIgb2YgYml0cworLy8vICAgIHNwZWNpZmllZCBieSB0aGUgc2Vjb25kIHBhcmFtZXRlciwgd2hpY2ggaXMgYSA2NC1iaXQgaW50ZWdlci4gSGlnaC1vcmRlcgorLy8vICAgIGJpdHMgYXJlIGNsZWFyZWQuIFRoZSAxNi1iaXQgcmVzdWx0cyBhcmUgcGFja2VkIGludG8gYSA2NC1iaXQgaW50ZWdlcgorLy8vICAgIHZlY3RvciBvZiBbNCB4IGkxNl0uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgUFNSTFcgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19tCisvLy8gICAgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzQgeCBpMTZdLgorLy8vIFxwYXJhbSBfX2NvdW50CisvLy8gICAgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3IgaW50ZXJwcmV0ZWQgYXMgYSBzaW5nbGUgNjQtYml0IGludGVnZXIuCisvLy8gXHJldHVybnMgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzQgeCBpMTZdIGNvbnRhaW5pbmcgdGhlIHJpZ2h0LXNoaWZ0ZWQKKy8vLyAgICB2YWx1ZXMuCitzdGF0aWMgX19pbmxpbmVfXyBfX202NCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zcmxfcGkxNihfX202NCBfX20sIF9fbTY0IF9fY291bnQpCit7CisgICAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9wc3JsdygoX192NGhpKV9fbSwgX19jb3VudCk7Cit9CisKKy8vLyBcYnJpZWYgUmlnaHQtc2hpZnRzIGVhY2ggMTYtYml0IGludGVnZXIgZWxlbWVudCBvZiBhIDY0LWJpdCBpbnRlZ2VyIHZlY3RvcgorLy8vICAgIG9mIFs0IHggaTE2XSBieSB0aGUgbnVtYmVyIG9mIGJpdHMgc3BlY2lmaWVkIGJ5IGEgMzItYml0IGludGVnZXIuCisvLy8gICAgSGlnaC1vcmRlciBiaXRzIGFyZSBjbGVhcmVkLiBUaGUgMTYtYml0IHJlc3VsdHMgYXJlIHBhY2tlZCBpbnRvIGEgNjQtYml0CisvLy8gICAgaW50ZWdlciB2ZWN0b3Igb2YgWzQgeCBpMTZdLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFBTUkxXIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fbQorLy8vICAgIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mIFs0IHggaTE2XS4KKy8vLyBccGFyYW0gX19jb3VudAorLy8vICAgIEEgMzItYml0IGludGVnZXIgdmFsdWUuCisvLy8gXHJldHVybnMgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzQgeCBpMTZdIGNvbnRhaW5pbmcgdGhlIHJpZ2h0LXNoaWZ0ZWQKKy8vLyAgICB2YWx1ZXMuCitzdGF0aWMgX19pbmxpbmVfXyBfX202NCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zcmxpX3BpMTYoX19tNjQgX19tLCBpbnQgX19jb3VudCkKK3sKKyAgICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3Bzcmx3aSgoX192NGhpKV9fbSwgX19jb3VudCk7Cit9CisKKy8vLyBcYnJpZWYgUmlnaHQtc2hpZnRzIGVhY2ggMzItYml0IGludGVnZXIgZWxlbWVudCBvZiB0aGUgZmlyc3QgcGFyYW1ldGVyLAorLy8vICAgIHdoaWNoIGlzIGEgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mIFsyIHggaTMyXSwgYnkgdGhlIG51bWJlciBvZiBiaXRzCisvLy8gICAgc3BlY2lmaWVkIGJ5IHRoZSBzZWNvbmQgcGFyYW1ldGVyLCB3aGljaCBpcyBhIDY0LWJpdCBpbnRlZ2VyLiBIaWdoLW9yZGVyCisvLy8gICAgYml0cyBhcmUgY2xlYXJlZC4gVGhlIDMyLWJpdCByZXN1bHRzIGFyZSBwYWNrZWQgaW50byBhIDY0LWJpdCBpbnRlZ2VyCisvLy8gICAgdmVjdG9yIG9mIFsyIHggaTMyXS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBQU1JMRCBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX20KKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbMiB4IGkzMl0uCisvLy8gXHBhcmFtIF9fY291bnQKKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBpbnRlcnByZXRlZCBhcyBhIHNpbmdsZSA2NC1iaXQgaW50ZWdlci4KKy8vLyBccmV0dXJucyBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbMiB4IGkzMl0gY29udGFpbmluZyB0aGUgcmlnaHQtc2hpZnRlZAorLy8vICAgIHZhbHVlcy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tX3NybF9waTMyKF9fbTY0IF9fbSwgX19tNjQgX19jb3VudCkKK3sKKyAgICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BzcmxkKChfX3Yyc2kpX19tLCBfX2NvdW50KTsKK30KKworLy8vIFxicmllZiBSaWdodC1zaGlmdHMgZWFjaCAzMi1iaXQgaW50ZWdlciBlbGVtZW50IG9mIGEgNjQtYml0IGludGVnZXIgdmVjdG9yCisvLy8gICAgb2YgWzIgeCBpMzJdIGJ5IHRoZSBudW1iZXIgb2YgYml0cyBzcGVjaWZpZWQgYnkgYSAzMi1iaXQgaW50ZWdlci4KKy8vLyAgICBIaWdoLW9yZGVyIGJpdHMgYXJlIGNsZWFyZWQuIFRoZSAzMi1iaXQgcmVzdWx0cyBhcmUgcGFja2VkIGludG8gYSA2NC1iaXQKKy8vLyAgICBpbnRlZ2VyIHZlY3RvciBvZiBbMiB4IGkzMl0uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgUFNSTEQgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19tCisvLy8gICAgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzIgeCBpMzJdLgorLy8vIFxwYXJhbSBfX2NvdW50CisvLy8gICAgQSAzMi1iaXQgaW50ZWdlciB2YWx1ZS4KKy8vLyBccmV0dXJucyBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbMiB4IGkzMl0gY29udGFpbmluZyB0aGUgcmlnaHQtc2hpZnRlZAorLy8vICAgIHZhbHVlcy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tX3NybGlfcGkzMihfX202NCBfX20sIGludCBfX2NvdW50KQoreworICAgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcHNybGRpKChfX3Yyc2kpX19tLCBfX2NvdW50KTsKK30KKworLy8vIFxicmllZiBSaWdodC1zaGlmdHMgdGhlIGZpcnN0IDY0LWJpdCBpbnRlZ2VyIHBhcmFtZXRlciBieSB0aGUgbnVtYmVyIG9mIGJpdHMKKy8vLyAgICBzcGVjaWZpZWQgYnkgdGhlIHNlY29uZCA2NC1iaXQgaW50ZWdlciBwYXJhbWV0ZXIuIEhpZ2gtb3JkZXIgYml0cyBhcmUKKy8vLyAgICBjbGVhcmVkLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFBTUkxRIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fbQorLy8vICAgIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIGludGVycHJldGVkIGFzIGEgc2luZ2xlIDY0LWJpdCBpbnRlZ2VyLgorLy8vIFxwYXJhbSBfX2NvdW50CisvLy8gICAgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3IgaW50ZXJwcmV0ZWQgYXMgYSBzaW5nbGUgNjQtYml0IGludGVnZXIuCisvLy8gXHJldHVybnMgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgcmlnaHQtc2hpZnRlZCB2YWx1ZS4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tX3NybF9zaTY0KF9fbTY0IF9fbSwgX19tNjQgX19jb3VudCkKK3sKKyAgICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BzcmxxKChfX3YxZGkpX19tLCBfX2NvdW50KTsKK30KKworLy8vIFxicmllZiBSaWdodC1zaGlmdHMgdGhlIGZpcnN0IHBhcmFtZXRlciwgd2hpY2ggaXMgYSA2NC1iaXQgaW50ZWdlciwgYnkgdGhlCisvLy8gICAgbnVtYmVyIG9mIGJpdHMgc3BlY2lmaWVkIGJ5IHRoZSBzZWNvbmQgcGFyYW1ldGVyLCB3aGljaCBpcyBhIDMyLWJpdAorLy8vICAgIGludGVnZXIuIEhpZ2gtb3JkZXIgYml0cyBhcmUgY2xlYXJlZC4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBQU1JMUSBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX20KKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBpbnRlcnByZXRlZCBhcyBhIHNpbmdsZSA2NC1iaXQgaW50ZWdlci4KKy8vLyBccGFyYW0gX19jb3VudAorLy8vICAgIEEgMzItYml0IGludGVnZXIgdmFsdWUuCisvLy8gXHJldHVybnMgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgcmlnaHQtc2hpZnRlZCB2YWx1ZS4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tX3NybGlfc2k2NChfX202NCBfX20sIGludCBfX2NvdW50KQoreworICAgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcHNybHFpKChfX3YxZGkpX19tLCBfX2NvdW50KTsKK30KKworLy8vIFxicmllZiBQZXJmb3JtcyBhIGJpdHdpc2UgQU5EIG9mIHR3byA2NC1iaXQgaW50ZWdlciB2ZWN0b3JzLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFBBTkQgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19tMQorLy8vICAgIEEgNjQtYml0IGludGVnZXIgdmVjdG9yLgorLy8vIFxwYXJhbSBfX20yCisvLy8gICAgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3IuCisvLy8gXHJldHVybnMgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgYml0d2lzZSBBTkQgb2YgYm90aAorLy8vICAgIHBhcmFtZXRlcnMuCitzdGF0aWMgX19pbmxpbmVfXyBfX202NCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9hbmRfc2k2NChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICAgIHJldHVybiBfX2J1aWx0aW5faWEzMl9wYW5kKChfX3YxZGkpX19tMSwgKF9fdjFkaSlfX20yKTsKK30KKworLy8vIFxicmllZiBQZXJmb3JtcyBhIGJpdHdpc2UgTk9UIG9mIHRoZSBmaXJzdCA2NC1iaXQgaW50ZWdlciB2ZWN0b3IsIGFuZCB0aGVuCisvLy8gICAgcGVyZm9ybXMgYSBiaXR3aXNlIEFORCBvZiB0aGUgaW50ZXJtZWRpYXRlIHJlc3VsdCBhbmQgdGhlIHNlY29uZCA2NC1iaXQKKy8vLyAgICBpbnRlZ2VyIHZlY3Rvci4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBQQU5ETiBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX20xCisvLy8gICAgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3IuIFRoZSBvbmUncyBjb21wbGVtZW50IG9mIHRoaXMgcGFyYW1ldGVyIGlzIHVzZWQKKy8vLyAgICBpbiB0aGUgYml0d2lzZSBBTkQuCisvLy8gXHBhcmFtIF9fbTIKKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIHZlY3Rvci4KKy8vLyBccmV0dXJucyBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIHRoZSBiaXR3aXNlIEFORCBvZiB0aGUgc2Vjb25kCisvLy8gICAgcGFyYW1ldGVyIGFuZCB0aGUgb25lJ3MgY29tcGxlbWVudCBvZiB0aGUgZmlyc3QgcGFyYW1ldGVyLgorc3RhdGljIF9faW5saW5lX18gX19tNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fYW5kbm90X3NpNjQoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgICByZXR1cm4gX19idWlsdGluX2lhMzJfcGFuZG4oKF9fdjFkaSlfX20xLCAoX192MWRpKV9fbTIpOworfQorCisvLy8gXGJyaWVmIFBlcmZvcm1zIGEgYml0d2lzZSBPUiBvZiB0d28gNjQtYml0IGludGVnZXIgdmVjdG9ycy4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBQT1IgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19tMQorLy8vICAgIEEgNjQtYml0IGludGVnZXIgdmVjdG9yLgorLy8vIFxwYXJhbSBfX20yCisvLy8gICAgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3IuCisvLy8gXHJldHVybnMgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgYml0d2lzZSBPUiBvZiBib3RoCisvLy8gICAgcGFyYW1ldGVycy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tX29yX3NpNjQoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgICByZXR1cm4gX19idWlsdGluX2lhMzJfcG9yKChfX3YxZGkpX19tMSwgKF9fdjFkaSlfX20yKTsKK30KKworLy8vIFxicmllZiBQZXJmb3JtcyBhIGJpdHdpc2UgZXhjbHVzaXZlIE9SIG9mIHR3byA2NC1iaXQgaW50ZWdlciB2ZWN0b3JzLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFBYT1IgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19tMQorLy8vICAgIEEgNjQtYml0IGludGVnZXIgdmVjdG9yLgorLy8vIFxwYXJhbSBfX20yCisvLy8gICAgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3IuCisvLy8gXHJldHVybnMgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgYml0d2lzZSBleGNsdXNpdmUgT1Igb2YgYm90aAorLy8vICAgIHBhcmFtZXRlcnMuCitzdGF0aWMgX19pbmxpbmVfXyBfX202NCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV94b3Jfc2k2NChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICAgIHJldHVybiBfX2J1aWx0aW5faWEzMl9weG9yKChfX3YxZGkpX19tMSwgKF9fdjFkaSlfX20yKTsKK30KKworLy8vIFxicmllZiBDb21wYXJlcyB0aGUgOC1iaXQgaW50ZWdlciBlbGVtZW50cyBvZiB0d28gNjQtYml0IGludGVnZXIgdmVjdG9ycyBvZgorLy8vICAgIFs4IHggaThdIHRvIGRldGVybWluZSBpZiB0aGUgZWxlbWVudCBvZiB0aGUgZmlyc3QgdmVjdG9yIGlzIGVxdWFsIHRvIHRoZQorLy8vICAgIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBvZiB0aGUgc2Vjb25kIHZlY3Rvci4gVGhlIGNvbXBhcmlzb24geWllbGRzIDAgZm9yCisvLy8gICAgZmFsc2UsIDB4RkYgZm9yIHRydWUuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgUENNUEVRQiBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX20xCisvLy8gICAgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzggeCBpOF0uCisvLy8gXHBhcmFtIF9fbTIKKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbOCB4IGk4XS4KKy8vLyBccmV0dXJucyBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbOCB4IGk4XSBjb250YWluaW5nIHRoZSBjb21wYXJpc29uCisvLy8gICAgcmVzdWx0cy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NtcGVxX3BpOChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICAgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcGNtcGVxYigoX192OHFpKV9fbTEsIChfX3Y4cWkpX19tMik7Cit9CisKKy8vLyBcYnJpZWYgQ29tcGFyZXMgdGhlIDE2LWJpdCBpbnRlZ2VyIGVsZW1lbnRzIG9mIHR3byA2NC1iaXQgaW50ZWdlciB2ZWN0b3JzIG9mCisvLy8gICAgWzQgeCBpMTZdIHRvIGRldGVybWluZSBpZiB0aGUgZWxlbWVudCBvZiB0aGUgZmlyc3QgdmVjdG9yIGlzIGVxdWFsIHRvIHRoZQorLy8vICAgIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBvZiB0aGUgc2Vjb25kIHZlY3Rvci4gVGhlIGNvbXBhcmlzb24geWllbGRzIDAgZm9yCisvLy8gICAgZmFsc2UsIDB4RkZGRiBmb3IgdHJ1ZS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBQQ01QRVFXIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fbTEKKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbNCB4IGkxNl0uCisvLy8gXHBhcmFtIF9fbTIKKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbNCB4IGkxNl0uCisvLy8gXHJldHVybnMgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzQgeCBpMTZdIGNvbnRhaW5pbmcgdGhlIGNvbXBhcmlzb24KKy8vLyAgICByZXN1bHRzLgorc3RhdGljIF9faW5saW5lX18gX19tNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY21wZXFfcGkxNihfX202NCBfX20xLCBfX202NCBfX20yKQoreworICAgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcGNtcGVxdygoX192NGhpKV9fbTEsIChfX3Y0aGkpX19tMik7Cit9CisKKy8vLyBcYnJpZWYgQ29tcGFyZXMgdGhlIDMyLWJpdCBpbnRlZ2VyIGVsZW1lbnRzIG9mIHR3byA2NC1iaXQgaW50ZWdlciB2ZWN0b3JzIG9mCisvLy8gICAgWzIgeCBpMzJdIHRvIGRldGVybWluZSBpZiB0aGUgZWxlbWVudCBvZiB0aGUgZmlyc3QgdmVjdG9yIGlzIGVxdWFsIHRvIHRoZQorLy8vICAgIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBvZiB0aGUgc2Vjb25kIHZlY3Rvci4gVGhlIGNvbXBhcmlzb24geWllbGRzIDAgZm9yCisvLy8gICAgZmFsc2UsIDB4RkZGRkZGRkYgZm9yIHRydWUuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgUENNUEVRRCBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX20xCisvLy8gICAgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzIgeCBpMzJdLgorLy8vIFxwYXJhbSBfX20yCisvLy8gICAgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzIgeCBpMzJdLgorLy8vIFxyZXR1cm5zIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mIFsyIHggaTMyXSBjb250YWluaW5nIHRoZSBjb21wYXJpc29uCisvLy8gICAgcmVzdWx0cy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NtcGVxX3BpMzIoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BjbXBlcWQoKF9fdjJzaSlfX20xLCAoX192MnNpKV9fbTIpOworfQorCisvLy8gXGJyaWVmIENvbXBhcmVzIHRoZSA4LWJpdCBpbnRlZ2VyIGVsZW1lbnRzIG9mIHR3byA2NC1iaXQgaW50ZWdlciB2ZWN0b3JzIG9mCisvLy8gICAgWzggeCBpOF0gdG8gZGV0ZXJtaW5lIGlmIHRoZSBlbGVtZW50IG9mIHRoZSBmaXJzdCB2ZWN0b3IgaXMgZ3JlYXRlciB0aGFuCisvLy8gICAgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBvZiB0aGUgc2Vjb25kIHZlY3Rvci4gVGhlIGNvbXBhcmlzb24geWllbGRzIDAKKy8vLyAgICBmb3IgZmFsc2UsIDB4RkYgZm9yIHRydWUuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgUENNUEdUQiBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX20xCisvLy8gICAgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzggeCBpOF0uCisvLy8gXHBhcmFtIF9fbTIKKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbOCB4IGk4XS4KKy8vLyBccmV0dXJucyBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbOCB4IGk4XSBjb250YWluaW5nIHRoZSBjb21wYXJpc29uCisvLy8gICAgcmVzdWx0cy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NtcGd0X3BpOChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICAgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcGNtcGd0YigoX192OHFpKV9fbTEsIChfX3Y4cWkpX19tMik7Cit9CisKKy8vLyBcYnJpZWYgQ29tcGFyZXMgdGhlIDE2LWJpdCBpbnRlZ2VyIGVsZW1lbnRzIG9mIHR3byA2NC1iaXQgaW50ZWdlciB2ZWN0b3JzIG9mCisvLy8gICAgWzQgeCBpMTZdIHRvIGRldGVybWluZSBpZiB0aGUgZWxlbWVudCBvZiB0aGUgZmlyc3QgdmVjdG9yIGlzIGdyZWF0ZXIgdGhhbgorLy8vICAgIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgb2YgdGhlIHNlY29uZCB2ZWN0b3IuIFRoZSBjb21wYXJpc29uIHlpZWxkcyAwCisvLy8gICAgZm9yIGZhbHNlLCAweEZGRkYgZm9yIHRydWUuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgUENNUEdUVyBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX20xCisvLy8gICAgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzQgeCBpMTZdLgorLy8vIFxwYXJhbSBfX20yCisvLy8gICAgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzQgeCBpMTZdLgorLy8vIFxyZXR1cm5zIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mIFs0IHggaTE2XSBjb250YWluaW5nIHRoZSBjb21wYXJpc29uCisvLy8gICAgcmVzdWx0cy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NtcGd0X3BpMTYoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BjbXBndHcoKF9fdjRoaSlfX20xLCAoX192NGhpKV9fbTIpOworfQorCisvLy8gXGJyaWVmIENvbXBhcmVzIHRoZSAzMi1iaXQgaW50ZWdlciBlbGVtZW50cyBvZiB0d28gNjQtYml0IGludGVnZXIgdmVjdG9ycyBvZgorLy8vICAgIFsyIHggaTMyXSB0byBkZXRlcm1pbmUgaWYgdGhlIGVsZW1lbnQgb2YgdGhlIGZpcnN0IHZlY3RvciBpcyBncmVhdGVyIHRoYW4KKy8vLyAgICB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IG9mIHRoZSBzZWNvbmQgdmVjdG9yLiBUaGUgY29tcGFyaXNvbiB5aWVsZHMgMAorLy8vICAgIGZvciBmYWxzZSwgMHhGRkZGRkZGRiBmb3IgdHJ1ZS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBQQ01QR1REIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fbTEKKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbMiB4IGkzMl0uCisvLy8gXHBhcmFtIF9fbTIKKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbMiB4IGkzMl0uCisvLy8gXHJldHVybnMgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzIgeCBpMzJdIGNvbnRhaW5pbmcgdGhlIGNvbXBhcmlzb24KKy8vLyAgICByZXN1bHRzLgorc3RhdGljIF9faW5saW5lX18gX19tNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY21wZ3RfcGkzMihfX202NCBfX20xLCBfX202NCBfX20yKQoreworICAgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcGNtcGd0ZCgoX192MnNpKV9fbTEsIChfX3Yyc2kpX19tMik7Cit9CisKKy8vLyBcYnJpZWYgQ29uc3RydWN0cyBhIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBpbml0aWFsaXplZCB0byB6ZXJvLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIHRoZSBcYyBWWE9SUFMgLyBYT1JQUyBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxyZXR1cm5zIEFuIGluaXRpYWxpemVkIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciB3aXRoIGFsbCBlbGVtZW50cyBzZXQgdG8gemVyby4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tX3NldHplcm9fc2k2NCh2b2lkKQoreworICAgIHJldHVybiAoX19tNjQpeyAwTEwgfTsKK30KKworLy8vIFxicmllZiBDb25zdHJ1Y3RzIGEgNjQtYml0IGludGVnZXIgdmVjdG9yIGluaXRpYWxpemVkIHdpdGggdGhlIHNwZWNpZmllZAorLy8vICAgIDMyLWJpdCBpbnRlZ2VyIHZhbHVlcy4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGlzIGEgdXRpbGl0eSBmdW5jdGlvbiBhbmQgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhIHNwZWNpZmljCisvLy8gICAgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19pMQorLy8vICAgIEEgMzItYml0IGludGVnZXIgdmFsdWUgdXNlZCB0byBpbml0aWFsaXplIHRoZSB1cHBlciAzMiBiaXRzIG9mIHRoZQorLy8vICAgIHJlc3VsdC4KKy8vLyBccGFyYW0gX19pMAorLy8vICAgIEEgMzItYml0IGludGVnZXIgdmFsdWUgdXNlZCB0byBpbml0aWFsaXplIHRoZSBsb3dlciAzMiBiaXRzIG9mIHRoZQorLy8vICAgIHJlc3VsdC4KKy8vLyBccmV0dXJucyBBbiBpbml0aWFsaXplZCA2NC1iaXQgaW50ZWdlciB2ZWN0b3IuCitzdGF0aWMgX19pbmxpbmVfXyBfX202NCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zZXRfcGkzMihpbnQgX19pMSwgaW50IF9faTApCit7CisgICAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl92ZWNfaW5pdF92MnNpKF9faTAsIF9faTEpOworfQorCisvLy8gXGJyaWVmIENvbnN0cnVjdHMgYSA2NC1iaXQgaW50ZWdlciB2ZWN0b3IgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgc3BlY2lmaWVkCisvLy8gICAgMTYtYml0IGludGVnZXIgdmFsdWVzLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIGFuZCBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGEgc3BlY2lmaWMKKy8vLyAgICBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX3MzCisvLy8gICAgQSAxNi1iaXQgaW50ZWdlciB2YWx1ZSB1c2VkIHRvIGluaXRpYWxpemUgYml0cyBbNjM6NDhdIG9mIHRoZSByZXN1bHQuCisvLy8gXHBhcmFtIF9fczIKKy8vLyAgICBBIDE2LWJpdCBpbnRlZ2VyIHZhbHVlIHVzZWQgdG8gaW5pdGlhbGl6ZSBiaXRzIFs0NzozMl0gb2YgdGhlIHJlc3VsdC4KKy8vLyBccGFyYW0gX19zMQorLy8vICAgIEEgMTYtYml0IGludGVnZXIgdmFsdWUgdXNlZCB0byBpbml0aWFsaXplIGJpdHMgWzMxOjE2XSBvZiB0aGUgcmVzdWx0LgorLy8vIFxwYXJhbSBfX3MwCisvLy8gICAgQSAxNi1iaXQgaW50ZWdlciB2YWx1ZSB1c2VkIHRvIGluaXRpYWxpemUgYml0cyBbMTU6MF0gb2YgdGhlIHJlc3VsdC4KKy8vLyBccmV0dXJucyBBbiBpbml0aWFsaXplZCA2NC1iaXQgaW50ZWdlciB2ZWN0b3IuCitzdGF0aWMgX19pbmxpbmVfXyBfX202NCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zZXRfcGkxNihzaG9ydCBfX3MzLCBzaG9ydCBfX3MyLCBzaG9ydCBfX3MxLCBzaG9ydCBfX3MwKQoreworICAgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfdmVjX2luaXRfdjRoaShfX3MwLCBfX3MxLCBfX3MyLCBfX3MzKTsKK30KKworLy8vIFxicmllZiBDb25zdHJ1Y3RzIGEgNjQtYml0IGludGVnZXIgdmVjdG9yIGluaXRpYWxpemVkIHdpdGggdGhlIHNwZWNpZmllZAorLy8vICAgIDgtYml0IGludGVnZXIgdmFsdWVzLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIGFuZCBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGEgc3BlY2lmaWMKKy8vLyAgICBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2I3CisvLy8gICAgQW4gOC1iaXQgaW50ZWdlciB2YWx1ZSB1c2VkIHRvIGluaXRpYWxpemUgYml0cyBbNjM6NTZdIG9mIHRoZSByZXN1bHQuCisvLy8gXHBhcmFtIF9fYjYKKy8vLyAgICBBbiA4LWJpdCBpbnRlZ2VyIHZhbHVlIHVzZWQgdG8gaW5pdGlhbGl6ZSBiaXRzIFs1NTo0OF0gb2YgdGhlIHJlc3VsdC4KKy8vLyBccGFyYW0gX19iNQorLy8vICAgIEFuIDgtYml0IGludGVnZXIgdmFsdWUgdXNlZCB0byBpbml0aWFsaXplIGJpdHMgWzQ3OjQwXSBvZiB0aGUgcmVzdWx0LgorLy8vIFxwYXJhbSBfX2I0CisvLy8gICAgQW4gOC1iaXQgaW50ZWdlciB2YWx1ZSB1c2VkIHRvIGluaXRpYWxpemUgYml0cyBbMzk6MzJdIG9mIHRoZSByZXN1bHQuCisvLy8gXHBhcmFtIF9fYjMKKy8vLyAgICBBbiA4LWJpdCBpbnRlZ2VyIHZhbHVlIHVzZWQgdG8gaW5pdGlhbGl6ZSBiaXRzIFszMToyNF0gb2YgdGhlIHJlc3VsdC4KKy8vLyBccGFyYW0gX19iMgorLy8vICAgIEFuIDgtYml0IGludGVnZXIgdmFsdWUgdXNlZCB0byBpbml0aWFsaXplIGJpdHMgWzIzOjE2XSBvZiB0aGUgcmVzdWx0LgorLy8vIFxwYXJhbSBfX2IxCisvLy8gICAgQW4gOC1iaXQgaW50ZWdlciB2YWx1ZSB1c2VkIHRvIGluaXRpYWxpemUgYml0cyBbMTU6OF0gb2YgdGhlIHJlc3VsdC4KKy8vLyBccGFyYW0gX19iMAorLy8vICAgIEFuIDgtYml0IGludGVnZXIgdmFsdWUgdXNlZCB0byBpbml0aWFsaXplIGJpdHMgWzc6MF0gb2YgdGhlIHJlc3VsdC4KKy8vLyBccmV0dXJucyBBbiBpbml0aWFsaXplZCA2NC1iaXQgaW50ZWdlciB2ZWN0b3IuCitzdGF0aWMgX19pbmxpbmVfXyBfX202NCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zZXRfcGk4KGNoYXIgX19iNywgY2hhciBfX2I2LCBjaGFyIF9fYjUsIGNoYXIgX19iNCwgY2hhciBfX2IzLCBjaGFyIF9fYjIsCisgICAgICAgICAgICBjaGFyIF9fYjEsIGNoYXIgX19iMCkKK3sKKyAgICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3ZlY19pbml0X3Y4cWkoX19iMCwgX19iMSwgX19iMiwgX19iMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19iNCwgX19iNSwgX19iNiwgX19iNyk7Cit9CisKKy8vLyBcYnJpZWYgQ29uc3RydWN0cyBhIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbMiB4IGkzMl0sIHdpdGggZWFjaCBvZiB0aGUKKy8vLyAgICAzMi1iaXQgaW50ZWdlciB2ZWN0b3IgZWxlbWVudHMgc2V0IHRvIHRoZSBzcGVjaWZpZWQgMzItYml0IGludGVnZXIKKy8vLyAgICB2YWx1ZS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWUFNIVUZEIC8gUFNIVUZEIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9faQorLy8vICAgIEEgMzItYml0IGludGVnZXIgdmFsdWUgdXNlZCB0byBpbml0aWFsaXplIGVhY2ggdmVjdG9yIGVsZW1lbnQgb2YgdGhlCisvLy8gICAgcmVzdWx0LgorLy8vIFxyZXR1cm5zIEFuIGluaXRpYWxpemVkIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbMiB4IGkzMl0uCitzdGF0aWMgX19pbmxpbmVfXyBfX202NCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zZXQxX3BpMzIoaW50IF9faSkKK3sKKyAgICByZXR1cm4gX21tX3NldF9waTMyKF9faSwgX19pKTsKK30KKworLy8vIFxicmllZiBDb25zdHJ1Y3RzIGEgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mIFs0IHggaTE2XSwgd2l0aCBlYWNoIG9mIHRoZQorLy8vICAgIDE2LWJpdCBpbnRlZ2VyIHZlY3RvciBlbGVtZW50cyBzZXQgdG8gdGhlIHNwZWNpZmllZCAxNi1iaXQgaW50ZWdlcgorLy8vICAgIHZhbHVlLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZQU0hVRkxXIC8gUFNIVUZMVyBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX3cKKy8vLyAgICBBIDE2LWJpdCBpbnRlZ2VyIHZhbHVlIHVzZWQgdG8gaW5pdGlhbGl6ZSBlYWNoIHZlY3RvciBlbGVtZW50IG9mIHRoZQorLy8vICAgIHJlc3VsdC4KKy8vLyBccmV0dXJucyBBbiBpbml0aWFsaXplZCA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb2YgWzQgeCBpMTZdLgorc3RhdGljIF9faW5saW5lX18gX19tNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc2V0MV9waTE2KHNob3J0IF9fdykKK3sKKyAgICByZXR1cm4gX21tX3NldF9waTE2KF9fdywgX193LCBfX3csIF9fdyk7Cit9CisKKy8vLyBcYnJpZWYgQ29uc3RydWN0cyBhIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbOCB4IGk4XSwgd2l0aCBlYWNoIG9mIHRoZQorLy8vICAgIDgtYml0IGludGVnZXIgdmVjdG9yIGVsZW1lbnRzIHNldCB0byB0aGUgc3BlY2lmaWVkIDgtYml0IGludGVnZXIgdmFsdWUuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVlBVTlBDS0xCVyArIFZQU0hVRkxXIC8gXGMgUFVOUENLTEJXICsKKy8vLyAgICBQU0hVRkxXIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEFuIDgtYml0IGludGVnZXIgdmFsdWUgdXNlZCB0byBpbml0aWFsaXplIGVhY2ggdmVjdG9yIGVsZW1lbnQgb2YgdGhlCisvLy8gICAgcmVzdWx0LgorLy8vIFxyZXR1cm5zIEFuIGluaXRpYWxpemVkIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbOCB4IGk4XS4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tX3NldDFfcGk4KGNoYXIgX19iKQoreworICAgIHJldHVybiBfbW1fc2V0X3BpOChfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYik7Cit9CisKKy8vLyBcYnJpZWYgQ29uc3RydWN0cyBhIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciwgaW5pdGlhbGl6ZWQgaW4gcmV2ZXJzZSBvcmRlciB3aXRoCisvLy8gICAgdGhlIHNwZWNpZmllZCAzMi1iaXQgaW50ZWdlciB2YWx1ZXMuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBpcyBhIHV0aWxpdHkgZnVuY3Rpb24gYW5kIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYSBzcGVjaWZpYworLy8vICAgIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9faTAKKy8vLyAgICBBIDMyLWJpdCBpbnRlZ2VyIHZhbHVlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgbG93ZXIgMzIgYml0cyBvZiB0aGUKKy8vLyAgICByZXN1bHQuCisvLy8gXHBhcmFtIF9faTEKKy8vLyAgICBBIDMyLWJpdCBpbnRlZ2VyIHZhbHVlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgdXBwZXIgMzIgYml0cyBvZiB0aGUKKy8vLyAgICByZXN1bHQuCisvLy8gXHJldHVybnMgQW4gaW5pdGlhbGl6ZWQgNjQtYml0IGludGVnZXIgdmVjdG9yLgorc3RhdGljIF9faW5saW5lX18gX19tNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc2V0cl9waTMyKGludCBfX2kwLCBpbnQgX19pMSkKK3sKKyAgICByZXR1cm4gX21tX3NldF9waTMyKF9faTEsIF9faTApOworfQorCisvLy8gXGJyaWVmIENvbnN0cnVjdHMgYSA2NC1iaXQgaW50ZWdlciB2ZWN0b3IsIGluaXRpYWxpemVkIGluIHJldmVyc2Ugb3JkZXIgd2l0aAorLy8vICAgIHRoZSBzcGVjaWZpZWQgMTYtYml0IGludGVnZXIgdmFsdWVzLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIGFuZCBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGEgc3BlY2lmaWMKKy8vLyAgICBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX3cwCisvLy8gICAgQSAxNi1iaXQgaW50ZWdlciB2YWx1ZSB1c2VkIHRvIGluaXRpYWxpemUgYml0cyBbMTU6MF0gb2YgdGhlIHJlc3VsdC4KKy8vLyBccGFyYW0gX193MQorLy8vICAgIEEgMTYtYml0IGludGVnZXIgdmFsdWUgdXNlZCB0byBpbml0aWFsaXplIGJpdHMgWzMxOjE2XSBvZiB0aGUgcmVzdWx0LgorLy8vIFxwYXJhbSBfX3cyCisvLy8gICAgQSAxNi1iaXQgaW50ZWdlciB2YWx1ZSB1c2VkIHRvIGluaXRpYWxpemUgYml0cyBbNDc6MzJdIG9mIHRoZSByZXN1bHQuCisvLy8gXHBhcmFtIF9fdzMKKy8vLyAgICBBIDE2LWJpdCBpbnRlZ2VyIHZhbHVlIHVzZWQgdG8gaW5pdGlhbGl6ZSBiaXRzIFs2Mzo0OF0gb2YgdGhlIHJlc3VsdC4KKy8vLyBccmV0dXJucyBBbiBpbml0aWFsaXplZCA2NC1iaXQgaW50ZWdlciB2ZWN0b3IuCitzdGF0aWMgX19pbmxpbmVfXyBfX202NCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zZXRyX3BpMTYoc2hvcnQgX193MCwgc2hvcnQgX193MSwgc2hvcnQgX193Miwgc2hvcnQgX193MykKK3sKKyAgICByZXR1cm4gX21tX3NldF9waTE2KF9fdzMsIF9fdzIsIF9fdzEsIF9fdzApOworfQorCisvLy8gXGJyaWVmIENvbnN0cnVjdHMgYSA2NC1iaXQgaW50ZWdlciB2ZWN0b3IsIGluaXRpYWxpemVkIGluIHJldmVyc2Ugb3JkZXIgd2l0aAorLy8vICAgIHRoZSBzcGVjaWZpZWQgOC1iaXQgaW50ZWdlciB2YWx1ZXMuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBpcyBhIHV0aWxpdHkgZnVuY3Rpb24gYW5kIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYSBzcGVjaWZpYworLy8vICAgIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYjAKKy8vLyAgICBBbiA4LWJpdCBpbnRlZ2VyIHZhbHVlIHVzZWQgdG8gaW5pdGlhbGl6ZSBiaXRzIFs3OjBdIG9mIHRoZSByZXN1bHQuCisvLy8gXHBhcmFtIF9fYjEKKy8vLyAgICBBbiA4LWJpdCBpbnRlZ2VyIHZhbHVlIHVzZWQgdG8gaW5pdGlhbGl6ZSBiaXRzIFsxNTo4XSBvZiB0aGUgcmVzdWx0LgorLy8vIFxwYXJhbSBfX2IyCisvLy8gICAgQW4gOC1iaXQgaW50ZWdlciB2YWx1ZSB1c2VkIHRvIGluaXRpYWxpemUgYml0cyBbMjM6MTZdIG9mIHRoZSByZXN1bHQuCisvLy8gXHBhcmFtIF9fYjMKKy8vLyAgICBBbiA4LWJpdCBpbnRlZ2VyIHZhbHVlIHVzZWQgdG8gaW5pdGlhbGl6ZSBiaXRzIFszMToyNF0gb2YgdGhlIHJlc3VsdC4KKy8vLyBccGFyYW0gX19iNAorLy8vICAgIEFuIDgtYml0IGludGVnZXIgdmFsdWUgdXNlZCB0byBpbml0aWFsaXplIGJpdHMgWzM5OjMyXSBvZiB0aGUgcmVzdWx0LgorLy8vIFxwYXJhbSBfX2I1CisvLy8gICAgQW4gOC1iaXQgaW50ZWdlciB2YWx1ZSB1c2VkIHRvIGluaXRpYWxpemUgYml0cyBbNDc6NDBdIG9mIHRoZSByZXN1bHQuCisvLy8gXHBhcmFtIF9fYjYKKy8vLyAgICBBbiA4LWJpdCBpbnRlZ2VyIHZhbHVlIHVzZWQgdG8gaW5pdGlhbGl6ZSBiaXRzIFs1NTo0OF0gb2YgdGhlIHJlc3VsdC4KKy8vLyBccGFyYW0gX19iNworLy8vICAgIEFuIDgtYml0IGludGVnZXIgdmFsdWUgdXNlZCB0byBpbml0aWFsaXplIGJpdHMgWzYzOjU2XSBvZiB0aGUgcmVzdWx0LgorLy8vIFxyZXR1cm5zIEFuIGluaXRpYWxpemVkIDY0LWJpdCBpbnRlZ2VyIHZlY3Rvci4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tX3NldHJfcGk4KGNoYXIgX19iMCwgY2hhciBfX2IxLCBjaGFyIF9fYjIsIGNoYXIgX19iMywgY2hhciBfX2I0LCBjaGFyIF9fYjUsCisgICAgICAgICAgICAgY2hhciBfX2I2LCBjaGFyIF9fYjcpCit7CisgICAgcmV0dXJuIF9tbV9zZXRfcGk4KF9fYjcsIF9fYjYsIF9fYjUsIF9fYjQsIF9fYjMsIF9fYjIsIF9fYjEsIF9fYjApOworfQorCisjdW5kZWYgX19ERUZBVUxUX0ZOX0FUVFJTCisKKy8qIEFsaWFzZXMgZm9yIGNvbXBhdGliaWxpdHkuICovCisjZGVmaW5lIF9tX2VtcHR5IF9tbV9lbXB0eQorI2RlZmluZSBfbV9mcm9tX2ludCBfbW1fY3Z0c2kzMl9zaTY0CisjZGVmaW5lIF9tX2Zyb21faW50NjQgX21tX2N2dHNpNjRfbTY0CisjZGVmaW5lIF9tX3RvX2ludCBfbW1fY3Z0c2k2NF9zaTMyCisjZGVmaW5lIF9tX3RvX2ludDY0IF9tbV9jdnRtNjRfc2k2NAorI2RlZmluZSBfbV9wYWNrc3N3YiBfbW1fcGFja3NfcGkxNgorI2RlZmluZSBfbV9wYWNrc3NkdyBfbW1fcGFja3NfcGkzMgorI2RlZmluZSBfbV9wYWNrdXN3YiBfbW1fcGFja3NfcHUxNgorI2RlZmluZSBfbV9wdW5wY2toYncgX21tX3VucGFja2hpX3BpOAorI2RlZmluZSBfbV9wdW5wY2tod2QgX21tX3VucGFja2hpX3BpMTYKKyNkZWZpbmUgX21fcHVucGNraGRxIF9tbV91bnBhY2toaV9waTMyCisjZGVmaW5lIF9tX3B1bnBja2xidyBfbW1fdW5wYWNrbG9fcGk4CisjZGVmaW5lIF9tX3B1bnBja2x3ZCBfbW1fdW5wYWNrbG9fcGkxNgorI2RlZmluZSBfbV9wdW5wY2tsZHEgX21tX3VucGFja2xvX3BpMzIKKyNkZWZpbmUgX21fcGFkZGIgX21tX2FkZF9waTgKKyNkZWZpbmUgX21fcGFkZHcgX21tX2FkZF9waTE2CisjZGVmaW5lIF9tX3BhZGRkIF9tbV9hZGRfcGkzMgorI2RlZmluZSBfbV9wYWRkc2IgX21tX2FkZHNfcGk4CisjZGVmaW5lIF9tX3BhZGRzdyBfbW1fYWRkc19waTE2CisjZGVmaW5lIF9tX3BhZGR1c2IgX21tX2FkZHNfcHU4CisjZGVmaW5lIF9tX3BhZGR1c3cgX21tX2FkZHNfcHUxNgorI2RlZmluZSBfbV9wc3ViYiBfbW1fc3ViX3BpOAorI2RlZmluZSBfbV9wc3VidyBfbW1fc3ViX3BpMTYKKyNkZWZpbmUgX21fcHN1YmQgX21tX3N1Yl9waTMyCisjZGVmaW5lIF9tX3BzdWJzYiBfbW1fc3Vic19waTgKKyNkZWZpbmUgX21fcHN1YnN3IF9tbV9zdWJzX3BpMTYKKyNkZWZpbmUgX21fcHN1YnVzYiBfbW1fc3Vic19wdTgKKyNkZWZpbmUgX21fcHN1YnVzdyBfbW1fc3Vic19wdTE2CisjZGVmaW5lIF9tX3BtYWRkd2QgX21tX21hZGRfcGkxNgorI2RlZmluZSBfbV9wbXVsaHcgX21tX211bGhpX3BpMTYKKyNkZWZpbmUgX21fcG11bGx3IF9tbV9tdWxsb19waTE2CisjZGVmaW5lIF9tX3BzbGx3IF9tbV9zbGxfcGkxNgorI2RlZmluZSBfbV9wc2xsd2kgX21tX3NsbGlfcGkxNgorI2RlZmluZSBfbV9wc2xsZCBfbW1fc2xsX3BpMzIKKyNkZWZpbmUgX21fcHNsbGRpIF9tbV9zbGxpX3BpMzIKKyNkZWZpbmUgX21fcHNsbHEgX21tX3NsbF9zaTY0CisjZGVmaW5lIF9tX3BzbGxxaSBfbW1fc2xsaV9zaTY0CisjZGVmaW5lIF9tX3BzcmF3IF9tbV9zcmFfcGkxNgorI2RlZmluZSBfbV9wc3Jhd2kgX21tX3NyYWlfcGkxNgorI2RlZmluZSBfbV9wc3JhZCBfbW1fc3JhX3BpMzIKKyNkZWZpbmUgX21fcHNyYWRpIF9tbV9zcmFpX3BpMzIKKyNkZWZpbmUgX21fcHNybHcgX21tX3NybF9waTE2CisjZGVmaW5lIF9tX3Bzcmx3aSBfbW1fc3JsaV9waTE2CisjZGVmaW5lIF9tX3BzcmxkIF9tbV9zcmxfcGkzMgorI2RlZmluZSBfbV9wc3JsZGkgX21tX3NybGlfcGkzMgorI2RlZmluZSBfbV9wc3JscSBfbW1fc3JsX3NpNjQKKyNkZWZpbmUgX21fcHNybHFpIF9tbV9zcmxpX3NpNjQKKyNkZWZpbmUgX21fcGFuZCBfbW1fYW5kX3NpNjQKKyNkZWZpbmUgX21fcGFuZG4gX21tX2FuZG5vdF9zaTY0CisjZGVmaW5lIF9tX3BvciBfbW1fb3Jfc2k2NAorI2RlZmluZSBfbV9weG9yIF9tbV94b3Jfc2k2NAorI2RlZmluZSBfbV9wY21wZXFiIF9tbV9jbXBlcV9waTgKKyNkZWZpbmUgX21fcGNtcGVxdyBfbW1fY21wZXFfcGkxNgorI2RlZmluZSBfbV9wY21wZXFkIF9tbV9jbXBlcV9waTMyCisjZGVmaW5lIF9tX3BjbXBndGIgX21tX2NtcGd0X3BpOAorI2RlZmluZSBfbV9wY21wZ3R3IF9tbV9jbXBndF9waTE2CisjZGVmaW5lIF9tX3BjbXBndGQgX21tX2NtcGd0X3BpMzIKKworI2VuZGlmIC8qIF9fTU1JTlRSSU5fSCAqLworCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9tb2R1bGUubW9kdWxlbWFwIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvbW9kdWxlLm1vZHVsZW1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTQwZDJjCi0tLSAvZGV2L251bGwKKysrIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvbW9kdWxlLm1vZHVsZW1hcApAQCAtMCwwICsxLDE2NCBAQAorLyo9PT0tLS0tIG1vZHVsZS5tb2R1bGVtYXAgLSBpbnRyaW5zaWNzIG1vZHVsZSBtYXAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqCisgKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisgKi8KKworbW9kdWxlIF9CdWlsdGluX2ludHJpbnNpY3MgW3N5c3RlbV0gW2V4dGVybl9jXSB7CisgIGV4cGxpY2l0IG1vZHVsZSBhbHRpdmVjIHsKKyAgICByZXF1aXJlcyBhbHRpdmVjCisgICAgaGVhZGVyICJhbHRpdmVjLmgiCisgIH0KKworICBleHBsaWNpdCBtb2R1bGUgYXJtIHsKKyAgICByZXF1aXJlcyBhcm0KKworICAgIGV4cGxpY2l0IG1vZHVsZSBhY2xlIHsKKyAgICAgIGhlYWRlciAiYXJtX2FjbGUuaCIKKyAgICAgIGV4cG9ydCAqCisgICAgfQorCisgICAgZXhwbGljaXQgbW9kdWxlIG5lb24geworICAgICAgcmVxdWlyZXMgbmVvbgorICAgICAgaGVhZGVyICJhcm1fbmVvbi5oIgorICAgICAgZXhwb3J0ICoKKyAgICB9CisgIH0KKworICBleHBsaWNpdCBtb2R1bGUgaW50ZWwgeworICAgIHJlcXVpcmVzIHg4NgorICAgIGV4cG9ydCAqCisKKyAgICBoZWFkZXIgImltbWludHJpbi5oIgorICAgIHRleHR1YWwgaGVhZGVyICJmMTZjaW50cmluLmgiCisgICAgdGV4dHVhbCBoZWFkZXIgImF2eGludHJpbi5oIgorICAgIHRleHR1YWwgaGVhZGVyICJhdngyaW50cmluLmgiCisgICAgdGV4dHVhbCBoZWFkZXIgImF2eDUxMmZpbnRyaW4uaCIKKyAgICB0ZXh0dWFsIGhlYWRlciAiYXZ4NTEyZXJpbnRyaW4uaCIKKyAgICB0ZXh0dWFsIGhlYWRlciAiZm1haW50cmluLmgiCisKKyAgICBoZWFkZXIgIng4NmludHJpbi5oIgorICAgIHRleHR1YWwgaGVhZGVyICJibWlpbnRyaW4uaCIKKyAgICB0ZXh0dWFsIGhlYWRlciAiYm1pMmludHJpbi5oIgorICAgIHRleHR1YWwgaGVhZGVyICJsemNudGludHJpbi5oIgorICAgIHRleHR1YWwgaGVhZGVyICJ4b3BpbnRyaW4uaCIKKyAgICB0ZXh0dWFsIGhlYWRlciAiZm1hNGludHJpbi5oIgorICAgIHRleHR1YWwgaGVhZGVyICJtd2FpdHhpbnRyaW4uaCIKKworICAgIGV4cGxpY2l0IG1vZHVsZSBtbV9tYWxsb2MgeworICAgICAgaGVhZGVyICJtbV9tYWxsb2MuaCIKKyAgICAgIGV4cG9ydCAqIC8vIG5vdGU6IGZvciA8c3RkbGliLmg+IGRlcGVuZGVuY3kKKyAgICB9CisKKyAgICBleHBsaWNpdCBtb2R1bGUgY3B1aWQgeworICAgICAgaGVhZGVyICJjcHVpZC5oIgorICAgIH0KKworICAgIGV4cGxpY2l0IG1vZHVsZSBtbXggeworICAgICAgaGVhZGVyICJtbWludHJpbi5oIgorICAgIH0KKworICAgIGV4cGxpY2l0IG1vZHVsZSBzc2UgeworICAgICAgZXhwb3J0IG1tX21hbGxvYworICAgICAgZXhwb3J0IG1teAorICAgICAgZXhwb3J0IHNzZTIgLy8gbm90ZTogZm9yIGhhY2tpc2ggPGVtbWludHJpbi5oPiBkZXBlbmRlbmN5CisgICAgICBoZWFkZXIgInhtbWludHJpbi5oIgorICAgIH0KKworICAgIGV4cGxpY2l0IG1vZHVsZSBzc2UyIHsKKyAgICAgIGV4cG9ydCBzc2UKKyAgICAgIGhlYWRlciAiZW1taW50cmluLmgiCisgICAgfQorCisgICAgZXhwbGljaXQgbW9kdWxlIHNzZTMgeworICAgICAgZXhwb3J0IHNzZTIKKyAgICAgIGhlYWRlciAicG1taW50cmluLmgiCisgICAgfQorCisgICAgZXhwbGljaXQgbW9kdWxlIHNzc2UzIHsKKyAgICAgIGV4cG9ydCBzc2UzCisgICAgICBoZWFkZXIgInRtbWludHJpbi5oIgorICAgIH0KKworICAgIGV4cGxpY2l0IG1vZHVsZSBzc2U0XzEgeworICAgICAgZXhwb3J0IHNzc2UzCisgICAgICBoZWFkZXIgInNtbWludHJpbi5oIgorICAgIH0KKworICAgIGV4cGxpY2l0IG1vZHVsZSBzc2U0XzIgeworICAgICAgZXhwb3J0IHNzZTRfMQorICAgICAgaGVhZGVyICJubW1pbnRyaW4uaCIKKyAgICB9CisKKyAgICBleHBsaWNpdCBtb2R1bGUgc3NlNGEgeworICAgICAgZXhwb3J0IHNzZTMKKyAgICAgIGhlYWRlciAiYW1taW50cmluLmgiCisgICAgfQorCisgICAgZXhwbGljaXQgbW9kdWxlIHBvcGNudCB7CisgICAgICBoZWFkZXIgInBvcGNudGludHJpbi5oIgorICAgIH0KKworICAgIGV4cGxpY2l0IG1vZHVsZSBtbTNkbm93IHsKKyAgICAgIGhlYWRlciAibW0zZG5vdy5oIgorICAgIH0KKworICAgIGV4cGxpY2l0IG1vZHVsZSBhZXNfcGNsbXVsIHsKKyAgICAgIGhlYWRlciAid21taW50cmluLmgiCisgICAgICBleHBvcnQgYWVzCisgICAgICBleHBvcnQgcGNsbXVsCisgICAgfQorCisgICAgZXhwbGljaXQgbW9kdWxlIGFlcyB7CisgICAgICBoZWFkZXIgIl9fd21taW50cmluX2Flcy5oIgorICAgIH0KKworICAgIGV4cGxpY2l0IG1vZHVsZSBwY2xtdWwgeworICAgICAgaGVhZGVyICJfX3dtbWludHJpbl9wY2xtdWwuaCIKKyAgICB9CisgIH0KKworICBleHBsaWNpdCBtb2R1bGUgc3lzdGVteiB7CisgICAgcmVxdWlyZXMgc3lzdGVtegorICAgIGV4cG9ydCAqCisKKyAgICBoZWFkZXIgInMzOTBpbnRyaW4uaCIKKworICAgIGV4cGxpY2l0IG1vZHVsZSBodG0geworICAgICAgcmVxdWlyZXMgaHRtCisgICAgICBoZWFkZXIgImh0bWludHJpbi5oIgorICAgICAgaGVhZGVyICJodG14bGludHJpbi5oIgorICAgIH0KKworICAgIGV4cGxpY2l0IG1vZHVsZSB6dmVjdG9yIHsKKyAgICAgIHJlcXVpcmVzIHp2ZWN0b3IsIHZ4CisgICAgICBoZWFkZXIgInZlY2ludHJpbi5oIgorICAgIH0KKyAgfQorfQorCittb2R1bGUgX0J1aWx0aW5fc3RkZGVmX21heF9hbGlnbl90IFtzeXN0ZW1dIFtleHRlcm5fY10geworICBoZWFkZXIgIl9fc3RkZGVmX21heF9hbGlnbl90LmgiCit9CisKK21vZHVsZSBvcGVuY2xfYyB7CisgIHJlcXVpcmVzIG9wZW5jbAorICBoZWFkZXIgIm9wZW5jbC1jLmgiCit9CmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9td2FpdHhpbnRyaW4uaCBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL213YWl0eGludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNWYyYWMKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9td2FpdHhpbnRyaW4uaApAQCAtMCwwICsxLDQ3IEBACisvKj09PS0tLS0gbXdhaXR4aW50cmluLmggLSBNT05JVE9SWC9NV0FJVFggaW50cmluc2ljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICoKKyAqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqLworCisjaWZuZGVmIF9fWDg2SU5UUklOX0gKKyNlcnJvciAiTmV2ZXIgdXNlIDxtd2FpdHhpbnRyaW4uaD4gZGlyZWN0bHk7IGluY2x1ZGUgPHg4NmludHJpbi5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9NV0FJVFhJTlRSSU5fSAorI2RlZmluZSBfTVdBSVRYSU5UUklOX0gKKworLyogRGVmaW5lIHRoZSBkZWZhdWx0IGF0dHJpYnV0ZXMgZm9yIHRoZSBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlLiAqLworI2RlZmluZSBfX0RFRkFVTFRfRk5fQVRUUlMgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fLCAgX190YXJnZXRfXygibXdhaXR4IikpKQorc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tb25pdG9yeCh2b2lkIGNvbnN0ICogX19wLCB1bnNpZ25lZCBfX2V4dGVuc2lvbnMsIHVuc2lnbmVkIF9faGludHMpCit7CisgIF9fYnVpbHRpbl9pYTMyX21vbml0b3J4KCh2b2lkICopX19wLCBfX2V4dGVuc2lvbnMsIF9faGludHMpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX213YWl0eCh1bnNpZ25lZCBfX2V4dGVuc2lvbnMsIHVuc2lnbmVkIF9faGludHMsIHVuc2lnbmVkIF9fY2xvY2spCit7CisgIF9fYnVpbHRpbl9pYTMyX213YWl0eChfX2V4dGVuc2lvbnMsIF9faGludHMsIF9fY2xvY2spOworfQorCisjdW5kZWYgX19ERUZBVUxUX0ZOX0FUVFJTCisKKyNlbmRpZiAvKiBfTVdBSVRYSU5UUklOX0ggKi8KZGlmZiAtLWdpdCBhL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL25tbWludHJpbi5oIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvbm1taW50cmluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdmZWMxNQotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL25tbWludHJpbi5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qPT09LS0tLSBubW1pbnRyaW4uaCAtIFNTRTQgaW50cmluc2ljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKgorICo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICovCisKKyNpZm5kZWYgX05NTUlOVFJJTl9ICisjZGVmaW5lIF9OTU1JTlRSSU5fSAorCisvKiBUbyBtYXRjaCBleHBlY3RhdGlvbnMgb2YgZ2NjIHdlIHB1dCB0aGUgc3NlNC4yIGRlZmluaXRpb25zIGludG8gc21taW50cmluLmgsCisgICBqdXN0IGluY2x1ZGUgaXQgbm93IHRoZW4uICAqLworI2luY2x1ZGUgPHNtbWludHJpbi5oPgorI2VuZGlmIC8qIF9OTU1JTlRSSU5fSCAqLwpkaWZmIC0tZ2l0IGEvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvb3BlbmNsLWMuaCBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL29wZW5jbC1jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAyOTI3NAotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL29wZW5jbC1jLmgKQEAgLTAsMCArMSwxNjk2MiBAQAorLy89PT0tLS0gb3BlbmNsLWMuaCAtIE9wZW5DTCBDIGxhbmd1YWdlIGJ1aWx0aW4gZnVuY3Rpb24gaGVhZGVyIC0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfT1BFTkNMX0hfCisjZGVmaW5lIF9PUEVOQ0xfSF8KKworI2lmIF9fT1BFTkNMX0NfVkVSU0lPTl9fID49IENMX1ZFUlNJT05fMl8wCisjaWZuZGVmIGNsX2tocl9kZXB0aF9pbWFnZXMKKyNkZWZpbmUgY2xfa2hyX2RlcHRoX2ltYWdlcworI2VuZGlmIC8vY2xfa2hyX2RlcHRoX2ltYWdlcworI2VuZGlmIC8vX19PUEVOQ0xfQ19WRVJTSU9OX18gPj0gQ0xfVkVSU0lPTl8yXzAKKworI2RlZmluZSBfX292bGQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKworLy8gT3B0aW1pemF0aW9ucworI2RlZmluZSBfX3B1cmVmbiBfX2F0dHJpYnV0ZV9fKChwdXJlKSkKKyNkZWZpbmUgX19jbmZuIF9fYXR0cmlidXRlX18oKGNvbnN0KSkKKworLy8gYnVpbHQtaW4gc2NhbGFyIGRhdGEgdHlwZXM6CisKKy8qKgorICogQW4gdW5zaWduZWQgOC1iaXQgaW50ZWdlci4KKyAqLwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHVjaGFyOworCisvKioKKyAqIEFuIHVuc2lnbmVkIDE2LWJpdCBpbnRlZ2VyLgorICovCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVzaG9ydDsKKworLyoqCisgKiBBbiB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlci4KKyAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgdWludDsKKworLyoqCisgKiBBbiB1bnNpZ25lZCA2NC1iaXQgaW50ZWdlci4KKyAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHVsb25nOworCisvKioKKyAqIFRoZSB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUgb2YgdGhlIHJlc3VsdCBvZiB0aGUgc2l6ZW9mIG9wZXJhdG9yLiBUaGlzCisgKiBpcyBhIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyIGlmIENMX0RFVklDRV9BRERSRVNTX0JJVFMKKyAqIGRlZmluZWQgaW4gdGFibGUgNC4zIGlzIDMyLWJpdHMgYW5kIGlzIGEgNjQtYml0IHVuc2lnbmVkIGludGVnZXIgaWYKKyAqIENMX0RFVklDRV9BRERSRVNTX0JJVFMgaXMgNjQtYml0cy4KKyAqLwordHlwZWRlZiBfX1NJWkVfVFlQRV9fIHNpemVfdDsKKworLyoqCisgKiBBIHNpZ25lZCBpbnRlZ2VyIHR5cGUgdGhhdCBpcyB0aGUgcmVzdWx0IG9mIHN1YnRyYWN0aW5nIHR3byBwb2ludGVycy4KKyAqIFRoaXMgaXMgYSAzMi1iaXQgc2lnbmVkIGludGVnZXIgaWYgQ0xfREVWSUNFX0FERFJFU1NfQklUUworICogZGVmaW5lZCBpbiB0YWJsZSA0LjMgaXMgMzItYml0cyBhbmQgaXMgYSA2NC1iaXQgc2lnbmVkIGludGVnZXIgaWYKKyAqIENMX0RFVklDRV9BRERSRVNTX0JJVFMgaXMgNjQtYml0cy4KKyAqLwordHlwZWRlZiBfX1BUUkRJRkZfVFlQRV9fIHB0cmRpZmZfdDsKKworLyoqCisqIEEgc2lnbmVkIGludGVnZXIgdHlwZSB3aXRoIHRoZSBwcm9wZXJ0eSB0aGF0IGFueSB2YWxpZCBwb2ludGVyIHRvCisqIHZvaWQgY2FuIGJlIGNvbnZlcnRlZCB0byB0aGlzIHR5cGUsIHRoZW4gY29udmVydGVkIGJhY2sgdG8gcG9pbnRlcgorKiB0byB2b2lkLCBhbmQgdGhlIHJlc3VsdCB3aWxsIGNvbXBhcmUgZXF1YWwgdG8gdGhlIG9yaWdpbmFsIHBvaW50ZXIuCisqLwordHlwZWRlZiBfX0lOVFBUUl9UWVBFX18gaW50cHRyX3Q7CisKKy8qKgorKiBBbiB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUgd2l0aCB0aGUgcHJvcGVydHkgdGhhdCBhbnkgdmFsaWQgcG9pbnRlciB0bworKiB2b2lkIGNhbiBiZSBjb252ZXJ0ZWQgdG8gdGhpcyB0eXBlLCB0aGVuIGNvbnZlcnRlZCBiYWNrIHRvIHBvaW50ZXIKKyogdG8gdm9pZCwgYW5kIHRoZSByZXN1bHQgd2lsbCBjb21wYXJlIGVxdWFsIHRvIHRoZSBvcmlnaW5hbCBwb2ludGVyLgorKi8KK3R5cGVkZWYgX19VSU5UUFRSX1RZUEVfXyB1aW50cHRyX3Q7CisKKy8vIGJ1aWx0LWluIHZlY3RvciBkYXRhIHR5cGVzOgordHlwZWRlZiBjaGFyIGNoYXIyIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgyKSkpOwordHlwZWRlZiBjaGFyIGNoYXIzIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgzKSkpOwordHlwZWRlZiBjaGFyIGNoYXI0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOwordHlwZWRlZiBjaGFyIGNoYXI4IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg4KSkpOwordHlwZWRlZiBjaGFyIGNoYXIxNiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMTYpKSk7Cit0eXBlZGVmIHVjaGFyIHVjaGFyMiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMikpKTsKK3R5cGVkZWYgdWNoYXIgdWNoYXIzIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgzKSkpOwordHlwZWRlZiB1Y2hhciB1Y2hhcjQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7Cit0eXBlZGVmIHVjaGFyIHVjaGFyOCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoOCkpKTsKK3R5cGVkZWYgdWNoYXIgdWNoYXIxNiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMTYpKSk7Cit0eXBlZGVmIHNob3J0IHNob3J0MiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMikpKTsKK3R5cGVkZWYgc2hvcnQgc2hvcnQzIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgzKSkpOwordHlwZWRlZiBzaG9ydCBzaG9ydDQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7Cit0eXBlZGVmIHNob3J0IHNob3J0OCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoOCkpKTsKK3R5cGVkZWYgc2hvcnQgc2hvcnQxNiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMTYpKSk7Cit0eXBlZGVmIHVzaG9ydCB1c2hvcnQyIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgyKSkpOwordHlwZWRlZiB1c2hvcnQgdXNob3J0MyBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMykpKTsKK3R5cGVkZWYgdXNob3J0IHVzaG9ydDQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7Cit0eXBlZGVmIHVzaG9ydCB1c2hvcnQ4IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg4KSkpOwordHlwZWRlZiB1c2hvcnQgdXNob3J0MTYgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDE2KSkpOwordHlwZWRlZiBpbnQgaW50MiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMikpKTsKK3R5cGVkZWYgaW50IGludDMgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDMpKSk7Cit0eXBlZGVmIGludCBpbnQ0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOwordHlwZWRlZiBpbnQgaW50OCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoOCkpKTsKK3R5cGVkZWYgaW50IGludDE2IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgxNikpKTsKK3R5cGVkZWYgdWludCB1aW50MiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMikpKTsKK3R5cGVkZWYgdWludCB1aW50MyBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMykpKTsKK3R5cGVkZWYgdWludCB1aW50NCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsKK3R5cGVkZWYgdWludCB1aW50OCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoOCkpKTsKK3R5cGVkZWYgdWludCB1aW50MTYgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDE2KSkpOwordHlwZWRlZiBsb25nIGxvbmcyIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgyKSkpOwordHlwZWRlZiBsb25nIGxvbmczIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgzKSkpOwordHlwZWRlZiBsb25nIGxvbmc0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOwordHlwZWRlZiBsb25nIGxvbmc4IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg4KSkpOwordHlwZWRlZiBsb25nIGxvbmcxNiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMTYpKSk7Cit0eXBlZGVmIHVsb25nIHVsb25nMiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMikpKTsKK3R5cGVkZWYgdWxvbmcgdWxvbmczIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgzKSkpOwordHlwZWRlZiB1bG9uZyB1bG9uZzQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7Cit0eXBlZGVmIHVsb25nIHVsb25nOCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoOCkpKTsKK3R5cGVkZWYgdWxvbmcgdWxvbmcxNiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMTYpKSk7Cit0eXBlZGVmIGZsb2F0IGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMikpKTsKK3R5cGVkZWYgZmxvYXQgZmxvYXQzIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgzKSkpOwordHlwZWRlZiBmbG9hdCBmbG9hdDQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7Cit0eXBlZGVmIGZsb2F0IGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoOCkpKTsKK3R5cGVkZWYgZmxvYXQgZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMTYpKSk7CisjaWZkZWYgY2xfa2hyX2ZwMTYKKyNwcmFnbWEgT1BFTkNMIEVYVEVOU0lPTiBjbF9raHJfZnAxNiA6IGVuYWJsZQordHlwZWRlZiBoYWxmIGhhbGYyIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgyKSkpOwordHlwZWRlZiBoYWxmIGhhbGYzIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgzKSkpOwordHlwZWRlZiBoYWxmIGhhbGY0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOwordHlwZWRlZiBoYWxmIGhhbGY4IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg4KSkpOwordHlwZWRlZiBoYWxmIGhhbGYxNiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMTYpKSk7CisjZW5kaWYKKyNpZmRlZiBjbF9raHJfZnA2NAorI2lmIF9fT1BFTkNMX0NfVkVSU0lPTl9fIDwgQ0xfVkVSU0lPTl8xXzIKKyNwcmFnbWEgT1BFTkNMIEVYVEVOU0lPTiBjbF9raHJfZnA2NCA6IGVuYWJsZQorI2VuZGlmCit0eXBlZGVmIGRvdWJsZSBkb3VibGUyIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgyKSkpOwordHlwZWRlZiBkb3VibGUgZG91YmxlMyBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMykpKTsKK3R5cGVkZWYgZG91YmxlIGRvdWJsZTQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7Cit0eXBlZGVmIGRvdWJsZSBkb3VibGU4IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg4KSkpOwordHlwZWRlZiBkb3VibGUgZG91YmxlMTYgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDE2KSkpOworI2VuZGlmCisKKyNpZiBfX09QRU5DTF9DX1ZFUlNJT05fXyA+PSBDTF9WRVJTSU9OXzJfMAorI2RlZmluZSBOVUxMICgodm9pZCopMCkKKyNlbmRpZgorCisvKioKKyAqIFZhbHVlIG9mIG1heGltdW0gbm9uLWluZmluaXRlIHNpbmdsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQKKyAqIG51bWJlci4KKyAqLworI2RlZmluZSBNQVhGTE9BVCAweDEuZmZmZmZlcDEyN2YKKworLyoqCisgKiBBIHBvc2l0aXZlIGZsb2F0IGNvbnN0YW50IGV4cHJlc3Npb24uIEhVR0VfVkFMRiBldmFsdWF0ZXMKKyAqIHRvICtpbmZpbml0eS4gVXNlZCBhcyBhbiBlcnJvciB2YWx1ZSByZXR1cm5lZCBieSB0aGUgYnVpbHQtaW4KKyAqIG1hdGggZnVuY3Rpb25zLgorICovCisjZGVmaW5lIEhVR0VfVkFMRiAoX19idWlsdGluX2h1Z2VfdmFsZigpKQorCisvKioKKyAqIEEgcG9zaXRpdmUgZG91YmxlIGNvbnN0YW50IGV4cHJlc3Npb24uIEhVR0VfVkFMIGV2YWx1YXRlcworICogdG8gK2luZmluaXR5LiBVc2VkIGFzIGFuIGVycm9yIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBidWlsdC1pbgorICogbWF0aCBmdW5jdGlvbnMuCisgKi8KKyNkZWZpbmUgSFVHRV9WQUwgKF9fYnVpbHRpbl9odWdlX3ZhbCgpKQorCisvKioKKyAqIEEgY29uc3RhbnQgZXhwcmVzc2lvbiBvZiB0eXBlIGZsb2F0IHJlcHJlc2VudGluZyBwb3NpdGl2ZSBvcgorICogdW5zaWduZWQgaW5maW5pdHkuCisgKi8KKyNkZWZpbmUgSU5GSU5JVFkgKF9fYnVpbHRpbl9pbmZmKCkpCisKKy8qKgorICogQSBjb25zdGFudCBleHByZXNzaW9uIG9mIHR5cGUgZmxvYXQgcmVwcmVzZW50aW5nIGEgcXVpZXQgTmFOLgorICovCisjZGVmaW5lIE5BTiBhc19mbG9hdChJTlRfTUFYKQorCisjZGVmaW5lIEZQX0lMT0dCMCAgICBJTlRfTUlOCisjZGVmaW5lIEZQX0lMT0dCTkFOICAgIElOVF9NQVgKKworI2RlZmluZSBGTFRfRElHIDYKKyNkZWZpbmUgRkxUX01BTlRfRElHIDI0CisjZGVmaW5lIEZMVF9NQVhfMTBfRVhQICszOAorI2RlZmluZSBGTFRfTUFYX0VYUCArMTI4CisjZGVmaW5lIEZMVF9NSU5fMTBfRVhQIC0zNworI2RlZmluZSBGTFRfTUlOX0VYUCAtMTI1CisjZGVmaW5lIEZMVF9SQURJWCAyCisjZGVmaW5lIEZMVF9NQVggMHgxLmZmZmZmZXAxMjdmCisjZGVmaW5lIEZMVF9NSU4gMHgxLjBwLTEyNmYKKyNkZWZpbmUgRkxUX0VQU0lMT04gMHgxLjBwLTIzZgorCisjZGVmaW5lIE1fRV9GICAgICAgICAgMi43MTgyODE4Mjg0NTkwNDUyMzUzNjAyODc0NzEzNTI2NjI1MGYKKyNkZWZpbmUgTV9MT0cyRV9GICAgICAxLjQ0MjY5NTA0MDg4ODk2MzQwNzM1OTkyNDY4MTAwMTg5MjE0ZgorI2RlZmluZSBNX0xPRzEwRV9GICAgIDAuNDM0Mjk0NDgxOTAzMjUxODI3NjUxMTI4OTE4OTE2NjA1MDgyZgorI2RlZmluZSBNX0xOMl9GICAgICAgIDAuNjkzMTQ3MTgwNTU5OTQ1MzA5NDE3MjMyMTIxNDU4MTc2NTY4ZgorI2RlZmluZSBNX0xOMTBfRiAgICAgIDIuMzAyNTg1MDkyOTk0MDQ1Njg0MDE3OTkxNDU0Njg0MzY0MjFmCisjZGVmaW5lIE1fUElfRiAgICAgICAgMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMzODMyNzk1MDI4OGYKKyNkZWZpbmUgTV9QSV8yX0YgICAgICAxLjU3MDc5NjMyNjc5NDg5NjYxOTIzMTMyMTY5MTYzOTc1MTQ0ZgorI2RlZmluZSBNX1BJXzRfRiAgICAgIDAuNzg1Mzk4MTYzMzk3NDQ4MzA5NjE1NjYwODQ1ODE5ODc1NzIxZgorI2RlZmluZSBNXzFfUElfRiAgICAgIDAuMzE4MzA5ODg2MTgzNzkwNjcxNTM3NzY3NTI2NzQ1MDI4NzI0ZgorI2RlZmluZSBNXzJfUElfRiAgICAgIDAuNjM2NjE5NzcyMzY3NTgxMzQzMDc1NTM1MDUzNDkwMDU3NDQ4ZgorI2RlZmluZSBNXzJfU1FSVFBJX0YgIDEuMTI4Mzc5MTY3MDk1NTEyNTczODk2MTU4OTAzMTIxNTQ1MTdmCisjZGVmaW5lIE1fU1FSVDJfRiAgICAgMS40MTQyMTM1NjIzNzMwOTUwNDg4MDE2ODg3MjQyMDk2OTgwOGYKKyNkZWZpbmUgTV9TUVJUMV8yX0YgICAwLjcwNzEwNjc4MTE4NjU0NzUyNDQwMDg0NDM2MjEwNDg0OTAzOWYKKworI2RlZmluZSBEQkxfRElHIDE1CisjZGVmaW5lIERCTF9NQU5UX0RJRyA1MworI2RlZmluZSBEQkxfTUFYXzEwX0VYUCArMzA4CisjZGVmaW5lIERCTF9NQVhfRVhQICsxMDI0CisjZGVmaW5lIERCTF9NSU5fMTBfRVhQIC0zMDcKKyNkZWZpbmUgREJMX01JTl9FWFAgLTEwMjEKKyNkZWZpbmUgREJMX1JBRElYIDIKKyNkZWZpbmUgREJMX01BWCAweDEuZmZmZmZmZmZmZmZmZnAxMDIzCisjZGVmaW5lIERCTF9NSU4gMHgxLjBwLTEwMjIKKyNkZWZpbmUgREJMX0VQU0lMT04gMHgxLjBwLTUyCisKKyNkZWZpbmUgTV9FICAgICAgICAgICAweDEuNWJmMGE4YjE0NTc2OXArMQorI2RlZmluZSBNX0xPRzJFICAgICAgIDB4MS43MTU0NzY1MmI4MmZlcCswCisjZGVmaW5lIE1fTE9HMTBFICAgICAgMHgxLmJjYjdiMTUyNmU1MGVwLTIKKyNkZWZpbmUgTV9MTjIgICAgICAgICAweDEuNjJlNDJmZWZhMzllZnAtMQorI2RlZmluZSBNX0xOMTAgICAgICAgIDB4MS4yNmJiMWJiYjU1NTE2cCsxCisjZGVmaW5lIE1fUEkgICAgICAgICAgMHgxLjkyMWZiNTQ0NDJkMThwKzEKKyNkZWZpbmUgTV9QSV8yICAgICAgICAweDEuOTIxZmI1NDQ0MmQxOHArMAorI2RlZmluZSBNX1BJXzQgICAgICAgIDB4MS45MjFmYjU0NDQyZDE4cC0xCisjZGVmaW5lIE1fMV9QSSAgICAgICAgMHgxLjQ1ZjMwNmRjOWM4ODNwLTIKKyNkZWZpbmUgTV8yX1BJICAgICAgICAweDEuNDVmMzA2ZGM5Yzg4M3AtMQorI2RlZmluZSBNXzJfU1FSVFBJICAgIDB4MS4yMGRkNzUwNDI5YjZkcCswCisjZGVmaW5lIE1fU1FSVDIgICAgICAgMHgxLjZhMDllNjY3ZjNiY2RwKzAKKyNkZWZpbmUgTV9TUVJUMV8yICAgICAweDEuNmEwOWU2NjdmM2JjZHAtMQorCisjaWZkZWYgY2xfa2hyX2ZwMTYKKworI2RlZmluZSBIQUxGX0RJRyAzCisjZGVmaW5lIEhBTEZfTUFOVF9ESUcgMTEKKyNkZWZpbmUgSEFMRl9NQVhfMTBfRVhQICs0CisjZGVmaW5lIEhBTEZfTUFYX0VYUCArMTYKKyNkZWZpbmUgSEFMRl9NSU5fMTBfRVhQIC00CisjZGVmaW5lIEhBTEZfTUlOX0VYUCAtMTMKKyNkZWZpbmUgSEFMRl9SQURJWCAyCisjZGVmaW5lIEhBTEZfTUFYICgoMHgxLmZmY3AxNWgpKQorI2RlZmluZSBIQUxGX01JTiAoKDB4MS4wcC0xNGgpKQorI2RlZmluZSBIQUxGX0VQU0lMT04gKCgweDEuMHAtMTBoKSkKKworI2RlZmluZSBNX0VfSCAgICAgICAgIDIuNzE4MjgxODI4NDU5MDQ1MjM1MzYwMjg3NDcxMzUyNjYyNTBoCisjZGVmaW5lIE1fTE9HMkVfSCAgICAgMS40NDI2OTUwNDA4ODg5NjM0MDczNTk5MjQ2ODEwMDE4OTIxNGgKKyNkZWZpbmUgTV9MT0cxMEVfSCAgICAwLjQzNDI5NDQ4MTkwMzI1MTgyNzY1MTEyODkxODkxNjYwNTA4MmgKKyNkZWZpbmUgTV9MTjJfSCAgICAgICAwLjY5MzE0NzE4MDU1OTk0NTMwOTQxNzIzMjEyMTQ1ODE3NjU2OGgKKyNkZWZpbmUgTV9MTjEwX0ggICAgICAyLjMwMjU4NTA5Mjk5NDA0NTY4NDAxNzk5MTQ1NDY4NDM2NDIxaAorI2RlZmluZSBNX1BJX0ggICAgICAgIDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzMzgzMjc5NTAyODhoCisjZGVmaW5lIE1fUElfMl9IICAgICAgMS41NzA3OTYzMjY3OTQ4OTY2MTkyMzEzMjE2OTE2Mzk3NTE0NGgKKyNkZWZpbmUgTV9QSV80X0ggICAgICAwLjc4NTM5ODE2MzM5NzQ0ODMwOTYxNTY2MDg0NTgxOTg3NTcyMWgKKyNkZWZpbmUgTV8xX1BJX0ggICAgICAwLjMxODMwOTg4NjE4Mzc5MDY3MTUzNzc2NzUyNjc0NTAyODcyNGgKKyNkZWZpbmUgTV8yX1BJX0ggICAgICAwLjYzNjYxOTc3MjM2NzU4MTM0MzA3NTUzNTA1MzQ5MDA1NzQ0OGgKKyNkZWZpbmUgTV8yX1NRUlRQSV9IICAxLjEyODM3OTE2NzA5NTUxMjU3Mzg5NjE1ODkwMzEyMTU0NTE3aAorI2RlZmluZSBNX1NRUlQyX0ggICAgIDEuNDE0MjEzNTYyMzczMDk1MDQ4ODAxNjg4NzI0MjA5Njk4MDhoCisjZGVmaW5lIE1fU1FSVDFfMl9IICAgMC43MDcxMDY3ODExODY1NDc1MjQ0MDA4NDQzNjIxMDQ4NDkwMzloCisKKyNlbmRpZiAvL2NsX2tocl9mcDE2CisKKyNkZWZpbmUgQ0hBUl9CSVQgICAgOAorI2RlZmluZSBTQ0hBUl9NQVggIDEyNworI2RlZmluZSBTQ0hBUl9NSU4gICgtMTI4KQorI2RlZmluZSBVQ0hBUl9NQVggIDI1NQorI2RlZmluZSBDSEFSX01BWCAgU0NIQVJfTUFYCisjZGVmaW5lIENIQVJfTUlOICBTQ0hBUl9NSU4KKyNkZWZpbmUgVVNIUlRfTUFYICA2NTUzNQorI2RlZmluZSBTSFJUX01BWCAgMzI3NjcKKyNkZWZpbmUgU0hSVF9NSU4gICgtMzI3NjgpCisjZGVmaW5lIFVJTlRfTUFYICAweGZmZmZmZmZmCisjZGVmaW5lIElOVF9NQVggICAgMjE0NzQ4MzY0NworI2RlZmluZSBJTlRfTUlOICAgICgtMjE0NzQ4MzY0Ny0xKQorI2RlZmluZSBVTE9OR19NQVggIDB4ZmZmZmZmZmZmZmZmZmZmZlVMCisjZGVmaW5lIExPTkdfTUFYICAweDdmZmZmZmZmZmZmZmZmZmZMCisjZGVmaW5lIExPTkdfTUlOICAoLTB4N2ZmZmZmZmZmZmZmZmZmZkwtMSkKKworLy8gT3BlbkNMIHYxLjEvMS4yLzIuMCBzNi4yLjMgLSBFeHBsaWNpdCBjb252ZXJzaW9ucworCitjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyX3J0ZShjaGFyKTsKK2NoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXJfc2F0X3J0ZShjaGFyKTsKK2NoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXJfcnR6KGNoYXIpOworY2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcl9zYXRfcnR6KGNoYXIpOworY2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcl9ydHAoY2hhcik7CitjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyX3NhdF9ydHAoY2hhcik7CitjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyX3J0bihjaGFyKTsKK2NoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXJfc2F0X3J0bihjaGFyKTsKK2NoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIoY2hhcik7CitjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyX3NhdChjaGFyKTsKK2NoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXJfcnRlKHVjaGFyKTsKK2NoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXJfc2F0X3J0ZSh1Y2hhcik7CitjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyX3J0eih1Y2hhcik7CitjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyX3NhdF9ydHoodWNoYXIpOworY2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcl9ydHAodWNoYXIpOworY2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcl9zYXRfcnRwKHVjaGFyKTsKK2NoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXJfcnRuKHVjaGFyKTsKK2NoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXJfc2F0X3J0bih1Y2hhcik7CitjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyKHVjaGFyKTsKK2NoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXJfc2F0KHVjaGFyKTsKK2NoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXJfcnRlKHNob3J0KTsKK2NoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXJfc2F0X3J0ZShzaG9ydCk7CitjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyX3J0eihzaG9ydCk7CitjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyX3NhdF9ydHooc2hvcnQpOworY2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcl9ydHAoc2hvcnQpOworY2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcl9zYXRfcnRwKHNob3J0KTsKK2NoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXJfcnRuKHNob3J0KTsKK2NoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXJfc2F0X3J0bihzaG9ydCk7CitjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyKHNob3J0KTsKK2NoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXJfc2F0KHNob3J0KTsKK2NoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXJfcnRlKHVzaG9ydCk7CitjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyX3NhdF9ydGUodXNob3J0KTsKK2NoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXJfcnR6KHVzaG9ydCk7CitjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyX3NhdF9ydHoodXNob3J0KTsKK2NoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXJfcnRwKHVzaG9ydCk7CitjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyX3NhdF9ydHAodXNob3J0KTsKK2NoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXJfcnRuKHVzaG9ydCk7CitjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyX3NhdF9ydG4odXNob3J0KTsKK2NoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIodXNob3J0KTsKK2NoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXJfc2F0KHVzaG9ydCk7CitjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyX3J0ZShpbnQpOworY2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcl9zYXRfcnRlKGludCk7CitjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyX3J0eihpbnQpOworY2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcl9zYXRfcnR6KGludCk7CitjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyX3J0cChpbnQpOworY2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcl9zYXRfcnRwKGludCk7CitjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyX3J0bihpbnQpOworY2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcl9zYXRfcnRuKGludCk7CitjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyKGludCk7CitjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyX3NhdChpbnQpOworY2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcl9ydGUodWludCk7CitjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyX3NhdF9ydGUodWludCk7CitjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyX3J0eih1aW50KTsKK2NoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXJfc2F0X3J0eih1aW50KTsKK2NoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXJfcnRwKHVpbnQpOworY2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcl9zYXRfcnRwKHVpbnQpOworY2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcl9ydG4odWludCk7CitjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyX3NhdF9ydG4odWludCk7CitjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyKHVpbnQpOworY2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcl9zYXQodWludCk7CitjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyX3J0ZShsb25nKTsKK2NoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXJfc2F0X3J0ZShsb25nKTsKK2NoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXJfcnR6KGxvbmcpOworY2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcl9zYXRfcnR6KGxvbmcpOworY2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcl9ydHAobG9uZyk7CitjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyX3NhdF9ydHAobG9uZyk7CitjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyX3J0bihsb25nKTsKK2NoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXJfc2F0X3J0bihsb25nKTsKK2NoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIobG9uZyk7CitjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyX3NhdChsb25nKTsKK2NoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXJfcnRlKHVsb25nKTsKK2NoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXJfc2F0X3J0ZSh1bG9uZyk7CitjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyX3J0eih1bG9uZyk7CitjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyX3NhdF9ydHoodWxvbmcpOworY2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcl9ydHAodWxvbmcpOworY2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcl9zYXRfcnRwKHVsb25nKTsKK2NoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXJfcnRuKHVsb25nKTsKK2NoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXJfc2F0X3J0bih1bG9uZyk7CitjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyKHVsb25nKTsKK2NoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXJfc2F0KHVsb25nKTsKK2NoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXJfcnRlKGZsb2F0KTsKK2NoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXJfc2F0X3J0ZShmbG9hdCk7CitjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyX3J0eihmbG9hdCk7CitjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyX3NhdF9ydHooZmxvYXQpOworY2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcl9ydHAoZmxvYXQpOworY2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcl9zYXRfcnRwKGZsb2F0KTsKK2NoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXJfcnRuKGZsb2F0KTsKK2NoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXJfc2F0X3J0bihmbG9hdCk7CitjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyKGZsb2F0KTsKK2NoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXJfc2F0KGZsb2F0KTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcl9ydGUoY2hhcik7Cit1Y2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXJfc2F0X3J0ZShjaGFyKTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcl9ydHooY2hhcik7Cit1Y2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXJfc2F0X3J0eihjaGFyKTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcl9ydHAoY2hhcik7Cit1Y2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXJfc2F0X3J0cChjaGFyKTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcl9ydG4oY2hhcik7Cit1Y2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXJfc2F0X3J0bihjaGFyKTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcihjaGFyKTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcl9zYXQoY2hhcik7Cit1Y2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXJfcnRlKHVjaGFyKTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcl9zYXRfcnRlKHVjaGFyKTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcl9ydHoodWNoYXIpOwordWNoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyX3NhdF9ydHoodWNoYXIpOwordWNoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyX3J0cCh1Y2hhcik7Cit1Y2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXJfc2F0X3J0cCh1Y2hhcik7Cit1Y2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXJfcnRuKHVjaGFyKTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcl9zYXRfcnRuKHVjaGFyKTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcih1Y2hhcik7Cit1Y2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXJfc2F0KHVjaGFyKTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcl9ydGUoc2hvcnQpOwordWNoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyX3NhdF9ydGUoc2hvcnQpOwordWNoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyX3J0eihzaG9ydCk7Cit1Y2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXJfc2F0X3J0eihzaG9ydCk7Cit1Y2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXJfcnRwKHNob3J0KTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcl9zYXRfcnRwKHNob3J0KTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcl9ydG4oc2hvcnQpOwordWNoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyX3NhdF9ydG4oc2hvcnQpOwordWNoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyKHNob3J0KTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcl9zYXQoc2hvcnQpOwordWNoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyX3J0ZSh1c2hvcnQpOwordWNoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyX3NhdF9ydGUodXNob3J0KTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcl9ydHoodXNob3J0KTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcl9zYXRfcnR6KHVzaG9ydCk7Cit1Y2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXJfcnRwKHVzaG9ydCk7Cit1Y2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXJfc2F0X3J0cCh1c2hvcnQpOwordWNoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyX3J0bih1c2hvcnQpOwordWNoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyX3NhdF9ydG4odXNob3J0KTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcih1c2hvcnQpOwordWNoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyX3NhdCh1c2hvcnQpOwordWNoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyX3J0ZShpbnQpOwordWNoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyX3NhdF9ydGUoaW50KTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcl9ydHooaW50KTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcl9zYXRfcnR6KGludCk7Cit1Y2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXJfcnRwKGludCk7Cit1Y2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXJfc2F0X3J0cChpbnQpOwordWNoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyX3J0bihpbnQpOwordWNoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyX3NhdF9ydG4oaW50KTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcihpbnQpOwordWNoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyX3NhdChpbnQpOwordWNoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyX3J0ZSh1aW50KTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcl9zYXRfcnRlKHVpbnQpOwordWNoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyX3J0eih1aW50KTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcl9zYXRfcnR6KHVpbnQpOwordWNoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyX3J0cCh1aW50KTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcl9zYXRfcnRwKHVpbnQpOwordWNoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyX3J0bih1aW50KTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcl9zYXRfcnRuKHVpbnQpOwordWNoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyKHVpbnQpOwordWNoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyX3NhdCh1aW50KTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcl9ydGUobG9uZyk7Cit1Y2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXJfc2F0X3J0ZShsb25nKTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcl9ydHoobG9uZyk7Cit1Y2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXJfc2F0X3J0eihsb25nKTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcl9ydHAobG9uZyk7Cit1Y2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXJfc2F0X3J0cChsb25nKTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcl9ydG4obG9uZyk7Cit1Y2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXJfc2F0X3J0bihsb25nKTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcihsb25nKTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcl9zYXQobG9uZyk7Cit1Y2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXJfcnRlKHVsb25nKTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcl9zYXRfcnRlKHVsb25nKTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcl9ydHoodWxvbmcpOwordWNoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyX3NhdF9ydHoodWxvbmcpOwordWNoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyX3J0cCh1bG9uZyk7Cit1Y2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXJfc2F0X3J0cCh1bG9uZyk7Cit1Y2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXJfcnRuKHVsb25nKTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcl9zYXRfcnRuKHVsb25nKTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcih1bG9uZyk7Cit1Y2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXJfc2F0KHVsb25nKTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcl9ydGUoZmxvYXQpOwordWNoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyX3NhdF9ydGUoZmxvYXQpOwordWNoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyX3J0eihmbG9hdCk7Cit1Y2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXJfc2F0X3J0eihmbG9hdCk7Cit1Y2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXJfcnRwKGZsb2F0KTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcl9zYXRfcnRwKGZsb2F0KTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcl9ydG4oZmxvYXQpOwordWNoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyX3NhdF9ydG4oZmxvYXQpOwordWNoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyKGZsb2F0KTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcl9zYXQoZmxvYXQpOworCitzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnRfcnRlKGNoYXIpOworc2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0X3NhdF9ydGUoY2hhcik7CitzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnRfcnR6KGNoYXIpOworc2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0X3NhdF9ydHooY2hhcik7CitzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnRfcnRwKGNoYXIpOworc2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0X3NhdF9ydHAoY2hhcik7CitzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnRfcnRuKGNoYXIpOworc2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0X3NhdF9ydG4oY2hhcik7CitzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQoY2hhcik7CitzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnRfc2F0KGNoYXIpOworc2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0X3J0ZSh1Y2hhcik7CitzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnRfc2F0X3J0ZSh1Y2hhcik7CitzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnRfcnR6KHVjaGFyKTsKK3Nob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydF9zYXRfcnR6KHVjaGFyKTsKK3Nob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydF9ydHAodWNoYXIpOworc2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0X3NhdF9ydHAodWNoYXIpOworc2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0X3J0bih1Y2hhcik7CitzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnRfc2F0X3J0bih1Y2hhcik7CitzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQodWNoYXIpOworc2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0X3NhdCh1Y2hhcik7CitzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnRfcnRlKHNob3J0KTsKK3Nob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydF9zYXRfcnRlKHNob3J0KTsKK3Nob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydF9ydHooc2hvcnQpOworc2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0X3NhdF9ydHooc2hvcnQpOworc2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0X3J0cChzaG9ydCk7CitzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnRfc2F0X3J0cChzaG9ydCk7CitzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnRfcnRuKHNob3J0KTsKK3Nob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydF9zYXRfcnRuKHNob3J0KTsKK3Nob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydChzaG9ydCk7CitzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnRfc2F0KHNob3J0KTsKK3Nob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydF9ydGUodXNob3J0KTsKK3Nob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydF9zYXRfcnRlKHVzaG9ydCk7CitzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnRfcnR6KHVzaG9ydCk7CitzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnRfc2F0X3J0eih1c2hvcnQpOworc2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0X3J0cCh1c2hvcnQpOworc2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0X3NhdF9ydHAodXNob3J0KTsKK3Nob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydF9ydG4odXNob3J0KTsKK3Nob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydF9zYXRfcnRuKHVzaG9ydCk7CitzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQodXNob3J0KTsKK3Nob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydF9zYXQodXNob3J0KTsKK3Nob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydF9ydGUoaW50KTsKK3Nob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydF9zYXRfcnRlKGludCk7CitzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnRfcnR6KGludCk7CitzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnRfc2F0X3J0eihpbnQpOworc2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0X3J0cChpbnQpOworc2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0X3NhdF9ydHAoaW50KTsKK3Nob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydF9ydG4oaW50KTsKK3Nob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydF9zYXRfcnRuKGludCk7CitzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQoaW50KTsKK3Nob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydF9zYXQoaW50KTsKK3Nob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydF9ydGUodWludCk7CitzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnRfc2F0X3J0ZSh1aW50KTsKK3Nob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydF9ydHoodWludCk7CitzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnRfc2F0X3J0eih1aW50KTsKK3Nob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydF9ydHAodWludCk7CitzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnRfc2F0X3J0cCh1aW50KTsKK3Nob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydF9ydG4odWludCk7CitzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnRfc2F0X3J0bih1aW50KTsKK3Nob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydCh1aW50KTsKK3Nob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydF9zYXQodWludCk7CitzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnRfcnRlKGxvbmcpOworc2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0X3NhdF9ydGUobG9uZyk7CitzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnRfcnR6KGxvbmcpOworc2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0X3NhdF9ydHoobG9uZyk7CitzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnRfcnRwKGxvbmcpOworc2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0X3NhdF9ydHAobG9uZyk7CitzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnRfcnRuKGxvbmcpOworc2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0X3NhdF9ydG4obG9uZyk7CitzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQobG9uZyk7CitzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnRfc2F0KGxvbmcpOworc2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0X3J0ZSh1bG9uZyk7CitzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnRfc2F0X3J0ZSh1bG9uZyk7CitzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnRfcnR6KHVsb25nKTsKK3Nob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydF9zYXRfcnR6KHVsb25nKTsKK3Nob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydF9ydHAodWxvbmcpOworc2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0X3NhdF9ydHAodWxvbmcpOworc2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0X3J0bih1bG9uZyk7CitzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnRfc2F0X3J0bih1bG9uZyk7CitzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQodWxvbmcpOworc2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0X3NhdCh1bG9uZyk7CitzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnRfcnRlKGZsb2F0KTsKK3Nob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydF9zYXRfcnRlKGZsb2F0KTsKK3Nob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydF9ydHooZmxvYXQpOworc2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0X3NhdF9ydHooZmxvYXQpOworc2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0X3J0cChmbG9hdCk7CitzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnRfc2F0X3J0cChmbG9hdCk7CitzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnRfcnRuKGZsb2F0KTsKK3Nob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydF9zYXRfcnRuKGZsb2F0KTsKK3Nob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydChmbG9hdCk7CitzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnRfc2F0KGZsb2F0KTsKK3VzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0X3J0ZShjaGFyKTsKK3VzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0X3NhdF9ydGUoY2hhcik7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydF9ydHooY2hhcik7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydF9zYXRfcnR6KGNoYXIpOwordXNob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnRfcnRwKGNoYXIpOwordXNob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnRfc2F0X3J0cChjaGFyKTsKK3VzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0X3J0bihjaGFyKTsKK3VzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0X3NhdF9ydG4oY2hhcik7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydChjaGFyKTsKK3VzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0X3NhdChjaGFyKTsKK3VzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0X3J0ZSh1Y2hhcik7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydF9zYXRfcnRlKHVjaGFyKTsKK3VzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0X3J0eih1Y2hhcik7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydF9zYXRfcnR6KHVjaGFyKTsKK3VzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0X3J0cCh1Y2hhcik7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydF9zYXRfcnRwKHVjaGFyKTsKK3VzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0X3J0bih1Y2hhcik7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydF9zYXRfcnRuKHVjaGFyKTsKK3VzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0KHVjaGFyKTsKK3VzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0X3NhdCh1Y2hhcik7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydF9ydGUoc2hvcnQpOwordXNob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnRfc2F0X3J0ZShzaG9ydCk7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydF9ydHooc2hvcnQpOwordXNob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnRfc2F0X3J0eihzaG9ydCk7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydF9ydHAoc2hvcnQpOwordXNob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnRfc2F0X3J0cChzaG9ydCk7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydF9ydG4oc2hvcnQpOwordXNob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnRfc2F0X3J0bihzaG9ydCk7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydChzaG9ydCk7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydF9zYXQoc2hvcnQpOwordXNob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnRfcnRlKHVzaG9ydCk7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydF9zYXRfcnRlKHVzaG9ydCk7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydF9ydHoodXNob3J0KTsKK3VzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0X3NhdF9ydHoodXNob3J0KTsKK3VzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0X3J0cCh1c2hvcnQpOwordXNob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnRfc2F0X3J0cCh1c2hvcnQpOwordXNob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnRfcnRuKHVzaG9ydCk7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydF9zYXRfcnRuKHVzaG9ydCk7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydCh1c2hvcnQpOwordXNob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnRfc2F0KHVzaG9ydCk7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydF9ydGUoaW50KTsKK3VzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0X3NhdF9ydGUoaW50KTsKK3VzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0X3J0eihpbnQpOwordXNob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnRfc2F0X3J0eihpbnQpOwordXNob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnRfcnRwKGludCk7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydF9zYXRfcnRwKGludCk7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydF9ydG4oaW50KTsKK3VzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0X3NhdF9ydG4oaW50KTsKK3VzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0KGludCk7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydF9zYXQoaW50KTsKK3VzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0X3J0ZSh1aW50KTsKK3VzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0X3NhdF9ydGUodWludCk7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydF9ydHoodWludCk7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydF9zYXRfcnR6KHVpbnQpOwordXNob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnRfcnRwKHVpbnQpOwordXNob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnRfc2F0X3J0cCh1aW50KTsKK3VzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0X3J0bih1aW50KTsKK3VzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0X3NhdF9ydG4odWludCk7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydCh1aW50KTsKK3VzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0X3NhdCh1aW50KTsKK3VzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0X3J0ZShsb25nKTsKK3VzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0X3NhdF9ydGUobG9uZyk7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydF9ydHoobG9uZyk7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydF9zYXRfcnR6KGxvbmcpOwordXNob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnRfcnRwKGxvbmcpOwordXNob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnRfc2F0X3J0cChsb25nKTsKK3VzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0X3J0bihsb25nKTsKK3VzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0X3NhdF9ydG4obG9uZyk7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydChsb25nKTsKK3VzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0X3NhdChsb25nKTsKK3VzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0X3J0ZSh1bG9uZyk7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydF9zYXRfcnRlKHVsb25nKTsKK3VzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0X3J0eih1bG9uZyk7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydF9zYXRfcnR6KHVsb25nKTsKK3VzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0X3J0cCh1bG9uZyk7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydF9zYXRfcnRwKHVsb25nKTsKK3VzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0X3J0bih1bG9uZyk7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydF9zYXRfcnRuKHVsb25nKTsKK3VzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0KHVsb25nKTsKK3VzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0X3NhdCh1bG9uZyk7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydF9ydGUoZmxvYXQpOwordXNob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnRfc2F0X3J0ZShmbG9hdCk7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydF9ydHooZmxvYXQpOwordXNob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnRfc2F0X3J0eihmbG9hdCk7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydF9ydHAoZmxvYXQpOwordXNob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnRfc2F0X3J0cChmbG9hdCk7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydF9ydG4oZmxvYXQpOwordXNob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnRfc2F0X3J0bihmbG9hdCk7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydChmbG9hdCk7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydF9zYXQoZmxvYXQpOworaW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnRfcnRlKGNoYXIpOworaW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnRfc2F0X3J0ZShjaGFyKTsKK2ludCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50X3J0eihjaGFyKTsKK2ludCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50X3NhdF9ydHooY2hhcik7CitpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludF9ydHAoY2hhcik7CitpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludF9zYXRfcnRwKGNoYXIpOworaW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnRfcnRuKGNoYXIpOworaW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnRfc2F0X3J0bihjaGFyKTsKK2ludCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50KGNoYXIpOworaW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnRfc2F0KGNoYXIpOworaW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnRfcnRlKHVjaGFyKTsKK2ludCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50X3NhdF9ydGUodWNoYXIpOworaW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnRfcnR6KHVjaGFyKTsKK2ludCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50X3NhdF9ydHoodWNoYXIpOworaW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnRfcnRwKHVjaGFyKTsKK2ludCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50X3NhdF9ydHAodWNoYXIpOworaW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnRfcnRuKHVjaGFyKTsKK2ludCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50X3NhdF9ydG4odWNoYXIpOworaW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQodWNoYXIpOworaW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnRfc2F0KHVjaGFyKTsKK2ludCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50X3J0ZShzaG9ydCk7CitpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludF9zYXRfcnRlKHNob3J0KTsKK2ludCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50X3J0eihzaG9ydCk7CitpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludF9zYXRfcnR6KHNob3J0KTsKK2ludCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50X3J0cChzaG9ydCk7CitpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludF9zYXRfcnRwKHNob3J0KTsKK2ludCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50X3J0bihzaG9ydCk7CitpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludF9zYXRfcnRuKHNob3J0KTsKK2ludCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50KHNob3J0KTsKK2ludCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50X3NhdChzaG9ydCk7CitpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludF9ydGUodXNob3J0KTsKK2ludCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50X3NhdF9ydGUodXNob3J0KTsKK2ludCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50X3J0eih1c2hvcnQpOworaW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnRfc2F0X3J0eih1c2hvcnQpOworaW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnRfcnRwKHVzaG9ydCk7CitpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludF9zYXRfcnRwKHVzaG9ydCk7CitpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludF9ydG4odXNob3J0KTsKK2ludCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50X3NhdF9ydG4odXNob3J0KTsKK2ludCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50KHVzaG9ydCk7CitpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludF9zYXQodXNob3J0KTsKK2ludCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50X3J0ZShpbnQpOworaW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnRfc2F0X3J0ZShpbnQpOworaW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnRfcnR6KGludCk7CitpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludF9zYXRfcnR6KGludCk7CitpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludF9ydHAoaW50KTsKK2ludCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50X3NhdF9ydHAoaW50KTsKK2ludCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50X3J0bihpbnQpOworaW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnRfc2F0X3J0bihpbnQpOworaW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQoaW50KTsKK2ludCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50X3NhdChpbnQpOworaW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnRfcnRlKHVpbnQpOworaW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnRfc2F0X3J0ZSh1aW50KTsKK2ludCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50X3J0eih1aW50KTsKK2ludCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50X3NhdF9ydHoodWludCk7CitpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludF9ydHAodWludCk7CitpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludF9zYXRfcnRwKHVpbnQpOworaW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnRfcnRuKHVpbnQpOworaW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnRfc2F0X3J0bih1aW50KTsKK2ludCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50KHVpbnQpOworaW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnRfc2F0KHVpbnQpOworaW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnRfcnRlKGxvbmcpOworaW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnRfc2F0X3J0ZShsb25nKTsKK2ludCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50X3J0eihsb25nKTsKK2ludCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50X3NhdF9ydHoobG9uZyk7CitpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludF9ydHAobG9uZyk7CitpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludF9zYXRfcnRwKGxvbmcpOworaW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnRfcnRuKGxvbmcpOworaW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnRfc2F0X3J0bihsb25nKTsKK2ludCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50KGxvbmcpOworaW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnRfc2F0KGxvbmcpOworaW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnRfcnRlKHVsb25nKTsKK2ludCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50X3NhdF9ydGUodWxvbmcpOworaW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnRfcnR6KHVsb25nKTsKK2ludCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50X3NhdF9ydHoodWxvbmcpOworaW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnRfcnRwKHVsb25nKTsKK2ludCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50X3NhdF9ydHAodWxvbmcpOworaW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnRfcnRuKHVsb25nKTsKK2ludCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50X3NhdF9ydG4odWxvbmcpOworaW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQodWxvbmcpOworaW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnRfc2F0KHVsb25nKTsKK2ludCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50X3J0ZShmbG9hdCk7CitpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludF9zYXRfcnRlKGZsb2F0KTsKK2ludCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50X3J0eihmbG9hdCk7CitpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludF9zYXRfcnR6KGZsb2F0KTsKK2ludCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50X3J0cChmbG9hdCk7CitpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludF9zYXRfcnRwKGZsb2F0KTsKK2ludCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50X3J0bihmbG9hdCk7CitpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludF9zYXRfcnRuKGZsb2F0KTsKK2ludCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50KGZsb2F0KTsKK2ludCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50X3NhdChmbG9hdCk7Cit1aW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50X3J0ZShjaGFyKTsKK3VpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnRfc2F0X3J0ZShjaGFyKTsKK3VpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnRfcnR6KGNoYXIpOwordWludCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludF9zYXRfcnR6KGNoYXIpOwordWludCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludF9ydHAoY2hhcik7Cit1aW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50X3NhdF9ydHAoY2hhcik7Cit1aW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50X3J0bihjaGFyKTsKK3VpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnRfc2F0X3J0bihjaGFyKTsKK3VpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQoY2hhcik7Cit1aW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50X3NhdChjaGFyKTsKK3VpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnRfcnRlKHVjaGFyKTsKK3VpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnRfc2F0X3J0ZSh1Y2hhcik7Cit1aW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50X3J0eih1Y2hhcik7Cit1aW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50X3NhdF9ydHoodWNoYXIpOwordWludCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludF9ydHAodWNoYXIpOwordWludCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludF9zYXRfcnRwKHVjaGFyKTsKK3VpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnRfcnRuKHVjaGFyKTsKK3VpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnRfc2F0X3J0bih1Y2hhcik7Cit1aW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50KHVjaGFyKTsKK3VpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnRfc2F0KHVjaGFyKTsKK3VpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnRfcnRlKHNob3J0KTsKK3VpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnRfc2F0X3J0ZShzaG9ydCk7Cit1aW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50X3J0eihzaG9ydCk7Cit1aW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50X3NhdF9ydHooc2hvcnQpOwordWludCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludF9ydHAoc2hvcnQpOwordWludCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludF9zYXRfcnRwKHNob3J0KTsKK3VpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnRfcnRuKHNob3J0KTsKK3VpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnRfc2F0X3J0bihzaG9ydCk7Cit1aW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50KHNob3J0KTsKK3VpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnRfc2F0KHNob3J0KTsKK3VpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnRfcnRlKHVzaG9ydCk7Cit1aW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50X3NhdF9ydGUodXNob3J0KTsKK3VpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnRfcnR6KHVzaG9ydCk7Cit1aW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50X3NhdF9ydHoodXNob3J0KTsKK3VpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnRfcnRwKHVzaG9ydCk7Cit1aW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50X3NhdF9ydHAodXNob3J0KTsKK3VpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnRfcnRuKHVzaG9ydCk7Cit1aW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50X3NhdF9ydG4odXNob3J0KTsKK3VpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQodXNob3J0KTsKK3VpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnRfc2F0KHVzaG9ydCk7Cit1aW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50X3J0ZShpbnQpOwordWludCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludF9zYXRfcnRlKGludCk7Cit1aW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50X3J0eihpbnQpOwordWludCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludF9zYXRfcnR6KGludCk7Cit1aW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50X3J0cChpbnQpOwordWludCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludF9zYXRfcnRwKGludCk7Cit1aW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50X3J0bihpbnQpOwordWludCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludF9zYXRfcnRuKGludCk7Cit1aW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50KGludCk7Cit1aW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50X3NhdChpbnQpOwordWludCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludF9ydGUodWludCk7Cit1aW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50X3NhdF9ydGUodWludCk7Cit1aW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50X3J0eih1aW50KTsKK3VpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnRfc2F0X3J0eih1aW50KTsKK3VpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnRfcnRwKHVpbnQpOwordWludCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludF9zYXRfcnRwKHVpbnQpOwordWludCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludF9ydG4odWludCk7Cit1aW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50X3NhdF9ydG4odWludCk7Cit1aW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50KHVpbnQpOwordWludCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludF9zYXQodWludCk7Cit1aW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50X3J0ZShsb25nKTsKK3VpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnRfc2F0X3J0ZShsb25nKTsKK3VpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnRfcnR6KGxvbmcpOwordWludCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludF9zYXRfcnR6KGxvbmcpOwordWludCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludF9ydHAobG9uZyk7Cit1aW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50X3NhdF9ydHAobG9uZyk7Cit1aW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50X3J0bihsb25nKTsKK3VpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnRfc2F0X3J0bihsb25nKTsKK3VpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQobG9uZyk7Cit1aW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50X3NhdChsb25nKTsKK3VpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnRfcnRlKHVsb25nKTsKK3VpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnRfc2F0X3J0ZSh1bG9uZyk7Cit1aW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50X3J0eih1bG9uZyk7Cit1aW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50X3NhdF9ydHoodWxvbmcpOwordWludCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludF9ydHAodWxvbmcpOwordWludCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludF9zYXRfcnRwKHVsb25nKTsKK3VpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnRfcnRuKHVsb25nKTsKK3VpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnRfc2F0X3J0bih1bG9uZyk7Cit1aW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50KHVsb25nKTsKK3VpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnRfc2F0KHVsb25nKTsKK3VpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnRfcnRlKGZsb2F0KTsKK3VpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnRfc2F0X3J0ZShmbG9hdCk7Cit1aW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50X3J0eihmbG9hdCk7Cit1aW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50X3NhdF9ydHooZmxvYXQpOwordWludCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludF9ydHAoZmxvYXQpOwordWludCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludF9zYXRfcnRwKGZsb2F0KTsKK3VpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnRfcnRuKGZsb2F0KTsKK3VpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnRfc2F0X3J0bihmbG9hdCk7Cit1aW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50KGZsb2F0KTsKK3VpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnRfc2F0KGZsb2F0KTsKK2xvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmdfcnRlKGNoYXIpOworbG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZ19zYXRfcnRlKGNoYXIpOworbG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZ19ydHooY2hhcik7Citsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nX3NhdF9ydHooY2hhcik7Citsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nX3J0cChjaGFyKTsKK2xvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmdfc2F0X3J0cChjaGFyKTsKK2xvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmdfcnRuKGNoYXIpOworbG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZ19zYXRfcnRuKGNoYXIpOworbG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZyhjaGFyKTsKK2xvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmdfc2F0KGNoYXIpOworbG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZ19ydGUodWNoYXIpOworbG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZ19zYXRfcnRlKHVjaGFyKTsKK2xvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmdfcnR6KHVjaGFyKTsKK2xvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmdfc2F0X3J0eih1Y2hhcik7Citsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nX3J0cCh1Y2hhcik7Citsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nX3NhdF9ydHAodWNoYXIpOworbG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZ19ydG4odWNoYXIpOworbG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZ19zYXRfcnRuKHVjaGFyKTsKK2xvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcodWNoYXIpOworbG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZ19zYXQodWNoYXIpOworbG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZ19ydGUoc2hvcnQpOworbG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZ19zYXRfcnRlKHNob3J0KTsKK2xvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmdfcnR6KHNob3J0KTsKK2xvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmdfc2F0X3J0eihzaG9ydCk7Citsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nX3J0cChzaG9ydCk7Citsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nX3NhdF9ydHAoc2hvcnQpOworbG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZ19ydG4oc2hvcnQpOworbG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZ19zYXRfcnRuKHNob3J0KTsKK2xvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcoc2hvcnQpOworbG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZ19zYXQoc2hvcnQpOworbG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZ19ydGUodXNob3J0KTsKK2xvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmdfc2F0X3J0ZSh1c2hvcnQpOworbG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZ19ydHoodXNob3J0KTsKK2xvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmdfc2F0X3J0eih1c2hvcnQpOworbG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZ19ydHAodXNob3J0KTsKK2xvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmdfc2F0X3J0cCh1c2hvcnQpOworbG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZ19ydG4odXNob3J0KTsKK2xvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmdfc2F0X3J0bih1c2hvcnQpOworbG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZyh1c2hvcnQpOworbG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZ19zYXQodXNob3J0KTsKK2xvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmdfcnRlKGludCk7Citsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nX3NhdF9ydGUoaW50KTsKK2xvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmdfcnR6KGludCk7Citsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nX3NhdF9ydHooaW50KTsKK2xvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmdfcnRwKGludCk7Citsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nX3NhdF9ydHAoaW50KTsKK2xvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmdfcnRuKGludCk7Citsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nX3NhdF9ydG4oaW50KTsKK2xvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcoaW50KTsKK2xvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmdfc2F0KGludCk7Citsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nX3J0ZSh1aW50KTsKK2xvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmdfc2F0X3J0ZSh1aW50KTsKK2xvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmdfcnR6KHVpbnQpOworbG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZ19zYXRfcnR6KHVpbnQpOworbG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZ19ydHAodWludCk7Citsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nX3NhdF9ydHAodWludCk7Citsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nX3J0bih1aW50KTsKK2xvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmdfc2F0X3J0bih1aW50KTsKK2xvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcodWludCk7Citsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nX3NhdCh1aW50KTsKK2xvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmdfcnRlKGxvbmcpOworbG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZ19zYXRfcnRlKGxvbmcpOworbG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZ19ydHoobG9uZyk7Citsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nX3NhdF9ydHoobG9uZyk7Citsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nX3J0cChsb25nKTsKK2xvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmdfc2F0X3J0cChsb25nKTsKK2xvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmdfcnRuKGxvbmcpOworbG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZ19zYXRfcnRuKGxvbmcpOworbG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZyhsb25nKTsKK2xvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmdfc2F0KGxvbmcpOworbG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZ19ydGUodWxvbmcpOworbG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZ19zYXRfcnRlKHVsb25nKTsKK2xvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmdfcnR6KHVsb25nKTsKK2xvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmdfc2F0X3J0eih1bG9uZyk7Citsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nX3J0cCh1bG9uZyk7Citsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nX3NhdF9ydHAodWxvbmcpOworbG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZ19ydG4odWxvbmcpOworbG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZ19zYXRfcnRuKHVsb25nKTsKK2xvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcodWxvbmcpOworbG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZ19zYXQodWxvbmcpOworbG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZ19ydGUoZmxvYXQpOworbG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZ19zYXRfcnRlKGZsb2F0KTsKK2xvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmdfcnR6KGZsb2F0KTsKK2xvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmdfc2F0X3J0eihmbG9hdCk7Citsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nX3J0cChmbG9hdCk7Citsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nX3NhdF9ydHAoZmxvYXQpOworbG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZ19ydG4oZmxvYXQpOworbG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZ19zYXRfcnRuKGZsb2F0KTsKK2xvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcoZmxvYXQpOworbG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZ19zYXQoZmxvYXQpOwordWxvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nX3J0ZShjaGFyKTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZ19zYXRfcnRlKGNoYXIpOwordWxvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nX3J0eihjaGFyKTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZ19zYXRfcnR6KGNoYXIpOwordWxvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nX3J0cChjaGFyKTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZ19zYXRfcnRwKGNoYXIpOwordWxvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nX3J0bihjaGFyKTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZ19zYXRfcnRuKGNoYXIpOwordWxvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nKGNoYXIpOwordWxvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nX3NhdChjaGFyKTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZ19ydGUodWNoYXIpOwordWxvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nX3NhdF9ydGUodWNoYXIpOwordWxvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nX3J0eih1Y2hhcik7Cit1bG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmdfc2F0X3J0eih1Y2hhcik7Cit1bG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmdfcnRwKHVjaGFyKTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZ19zYXRfcnRwKHVjaGFyKTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZ19ydG4odWNoYXIpOwordWxvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nX3NhdF9ydG4odWNoYXIpOwordWxvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nKHVjaGFyKTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZ19zYXQodWNoYXIpOwordWxvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nX3J0ZShzaG9ydCk7Cit1bG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmdfc2F0X3J0ZShzaG9ydCk7Cit1bG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmdfcnR6KHNob3J0KTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZ19zYXRfcnR6KHNob3J0KTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZ19ydHAoc2hvcnQpOwordWxvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nX3NhdF9ydHAoc2hvcnQpOwordWxvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nX3J0bihzaG9ydCk7Cit1bG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmdfc2F0X3J0bihzaG9ydCk7Cit1bG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcoc2hvcnQpOwordWxvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nX3NhdChzaG9ydCk7Cit1bG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmdfcnRlKHVzaG9ydCk7Cit1bG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmdfc2F0X3J0ZSh1c2hvcnQpOwordWxvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nX3J0eih1c2hvcnQpOwordWxvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nX3NhdF9ydHoodXNob3J0KTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZ19ydHAodXNob3J0KTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZ19zYXRfcnRwKHVzaG9ydCk7Cit1bG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmdfcnRuKHVzaG9ydCk7Cit1bG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmdfc2F0X3J0bih1c2hvcnQpOwordWxvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nKHVzaG9ydCk7Cit1bG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmdfc2F0KHVzaG9ydCk7Cit1bG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmdfcnRlKGludCk7Cit1bG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmdfc2F0X3J0ZShpbnQpOwordWxvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nX3J0eihpbnQpOwordWxvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nX3NhdF9ydHooaW50KTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZ19ydHAoaW50KTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZ19zYXRfcnRwKGludCk7Cit1bG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmdfcnRuKGludCk7Cit1bG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmdfc2F0X3J0bihpbnQpOwordWxvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nKGludCk7Cit1bG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmdfc2F0KGludCk7Cit1bG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmdfcnRlKHVpbnQpOwordWxvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nX3NhdF9ydGUodWludCk7Cit1bG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmdfcnR6KHVpbnQpOwordWxvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nX3NhdF9ydHoodWludCk7Cit1bG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmdfcnRwKHVpbnQpOwordWxvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nX3NhdF9ydHAodWludCk7Cit1bG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmdfcnRuKHVpbnQpOwordWxvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nX3NhdF9ydG4odWludCk7Cit1bG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcodWludCk7Cit1bG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmdfc2F0KHVpbnQpOwordWxvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nX3J0ZShsb25nKTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZ19zYXRfcnRlKGxvbmcpOwordWxvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nX3J0eihsb25nKTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZ19zYXRfcnR6KGxvbmcpOwordWxvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nX3J0cChsb25nKTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZ19zYXRfcnRwKGxvbmcpOwordWxvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nX3J0bihsb25nKTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZ19zYXRfcnRuKGxvbmcpOwordWxvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nKGxvbmcpOwordWxvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nX3NhdChsb25nKTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZ19ydGUodWxvbmcpOwordWxvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nX3NhdF9ydGUodWxvbmcpOwordWxvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nX3J0eih1bG9uZyk7Cit1bG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmdfc2F0X3J0eih1bG9uZyk7Cit1bG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmdfcnRwKHVsb25nKTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZ19zYXRfcnRwKHVsb25nKTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZ19ydG4odWxvbmcpOwordWxvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nX3NhdF9ydG4odWxvbmcpOwordWxvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nKHVsb25nKTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZ19zYXQodWxvbmcpOwordWxvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nX3J0ZShmbG9hdCk7Cit1bG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmdfc2F0X3J0ZShmbG9hdCk7Cit1bG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmdfcnR6KGZsb2F0KTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZ19zYXRfcnR6KGZsb2F0KTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZ19ydHAoZmxvYXQpOwordWxvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nX3NhdF9ydHAoZmxvYXQpOwordWxvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nX3J0bihmbG9hdCk7Cit1bG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmdfc2F0X3J0bihmbG9hdCk7Cit1bG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcoZmxvYXQpOwordWxvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nX3NhdChmbG9hdCk7CitmbG9hdCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXRfcnRlKGNoYXIpOworZmxvYXQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0X3J0eihjaGFyKTsKK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdF9ydHAoY2hhcik7CitmbG9hdCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXRfcnRuKGNoYXIpOworZmxvYXQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0KGNoYXIpOworZmxvYXQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0X3J0ZSh1Y2hhcik7CitmbG9hdCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXRfcnR6KHVjaGFyKTsKK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdF9ydHAodWNoYXIpOworZmxvYXQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0X3J0bih1Y2hhcik7CitmbG9hdCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQodWNoYXIpOworZmxvYXQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0X3J0ZShzaG9ydCk7CitmbG9hdCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXRfcnR6KHNob3J0KTsKK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdF9ydHAoc2hvcnQpOworZmxvYXQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0X3J0bihzaG9ydCk7CitmbG9hdCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQoc2hvcnQpOworZmxvYXQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0X3J0ZSh1c2hvcnQpOworZmxvYXQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0X3J0eih1c2hvcnQpOworZmxvYXQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0X3J0cCh1c2hvcnQpOworZmxvYXQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0X3J0bih1c2hvcnQpOworZmxvYXQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0KHVzaG9ydCk7CitmbG9hdCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXRfcnRlKGludCk7CitmbG9hdCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXRfcnR6KGludCk7CitmbG9hdCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXRfcnRwKGludCk7CitmbG9hdCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXRfcnRuKGludCk7CitmbG9hdCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQoaW50KTsKK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdF9ydGUodWludCk7CitmbG9hdCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXRfcnR6KHVpbnQpOworZmxvYXQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0X3J0cCh1aW50KTsKK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdF9ydG4odWludCk7CitmbG9hdCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQodWludCk7CitmbG9hdCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXRfcnRlKGxvbmcpOworZmxvYXQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0X3J0eihsb25nKTsKK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdF9ydHAobG9uZyk7CitmbG9hdCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXRfcnRuKGxvbmcpOworZmxvYXQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0KGxvbmcpOworZmxvYXQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0X3J0ZSh1bG9uZyk7CitmbG9hdCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXRfcnR6KHVsb25nKTsKK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdF9ydHAodWxvbmcpOworZmxvYXQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0X3J0bih1bG9uZyk7CitmbG9hdCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQodWxvbmcpOworZmxvYXQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0X3J0ZShmbG9hdCk7CitmbG9hdCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXRfcnR6KGZsb2F0KTsKK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdF9ydHAoZmxvYXQpOworZmxvYXQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0X3J0bihmbG9hdCk7CitmbG9hdCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQoZmxvYXQpOworY2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIyX3J0ZShjaGFyMik7CitjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjJfc2F0X3J0ZShjaGFyMik7CitjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjJfcnR6KGNoYXIyKTsKK2NoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMl9zYXRfcnR6KGNoYXIyKTsKK2NoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMl9ydHAoY2hhcjIpOworY2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIyX3NhdF9ydHAoY2hhcjIpOworY2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIyX3J0bihjaGFyMik7CitjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjJfc2F0X3J0bihjaGFyMik7CitjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjIoY2hhcjIpOworY2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIyX3NhdChjaGFyMik7CitjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjJfcnRlKHVjaGFyMik7CitjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjJfc2F0X3J0ZSh1Y2hhcjIpOworY2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIyX3J0eih1Y2hhcjIpOworY2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIyX3NhdF9ydHoodWNoYXIyKTsKK2NoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMl9ydHAodWNoYXIyKTsKK2NoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMl9zYXRfcnRwKHVjaGFyMik7CitjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjJfcnRuKHVjaGFyMik7CitjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjJfc2F0X3J0bih1Y2hhcjIpOworY2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIyKHVjaGFyMik7CitjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjJfc2F0KHVjaGFyMik7CitjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjJfcnRlKHNob3J0Mik7CitjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjJfc2F0X3J0ZShzaG9ydDIpOworY2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIyX3J0eihzaG9ydDIpOworY2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIyX3NhdF9ydHooc2hvcnQyKTsKK2NoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMl9ydHAoc2hvcnQyKTsKK2NoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMl9zYXRfcnRwKHNob3J0Mik7CitjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjJfcnRuKHNob3J0Mik7CitjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjJfc2F0X3J0bihzaG9ydDIpOworY2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIyKHNob3J0Mik7CitjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjJfc2F0KHNob3J0Mik7CitjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjJfcnRlKHVzaG9ydDIpOworY2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIyX3NhdF9ydGUodXNob3J0Mik7CitjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjJfcnR6KHVzaG9ydDIpOworY2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIyX3NhdF9ydHoodXNob3J0Mik7CitjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjJfcnRwKHVzaG9ydDIpOworY2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIyX3NhdF9ydHAodXNob3J0Mik7CitjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjJfcnRuKHVzaG9ydDIpOworY2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIyX3NhdF9ydG4odXNob3J0Mik7CitjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjIodXNob3J0Mik7CitjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjJfc2F0KHVzaG9ydDIpOworY2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIyX3J0ZShpbnQyKTsKK2NoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMl9zYXRfcnRlKGludDIpOworY2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIyX3J0eihpbnQyKTsKK2NoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMl9zYXRfcnR6KGludDIpOworY2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIyX3J0cChpbnQyKTsKK2NoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMl9zYXRfcnRwKGludDIpOworY2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIyX3J0bihpbnQyKTsKK2NoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMl9zYXRfcnRuKGludDIpOworY2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIyKGludDIpOworY2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIyX3NhdChpbnQyKTsKK2NoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMl9ydGUodWludDIpOworY2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIyX3NhdF9ydGUodWludDIpOworY2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIyX3J0eih1aW50Mik7CitjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjJfc2F0X3J0eih1aW50Mik7CitjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjJfcnRwKHVpbnQyKTsKK2NoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMl9zYXRfcnRwKHVpbnQyKTsKK2NoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMl9ydG4odWludDIpOworY2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIyX3NhdF9ydG4odWludDIpOworY2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIyKHVpbnQyKTsKK2NoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMl9zYXQodWludDIpOworY2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIyX3J0ZShsb25nMik7CitjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjJfc2F0X3J0ZShsb25nMik7CitjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjJfcnR6KGxvbmcyKTsKK2NoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMl9zYXRfcnR6KGxvbmcyKTsKK2NoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMl9ydHAobG9uZzIpOworY2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIyX3NhdF9ydHAobG9uZzIpOworY2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIyX3J0bihsb25nMik7CitjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjJfc2F0X3J0bihsb25nMik7CitjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjIobG9uZzIpOworY2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIyX3NhdChsb25nMik7CitjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjJfcnRlKHVsb25nMik7CitjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjJfc2F0X3J0ZSh1bG9uZzIpOworY2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIyX3J0eih1bG9uZzIpOworY2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIyX3NhdF9ydHoodWxvbmcyKTsKK2NoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMl9ydHAodWxvbmcyKTsKK2NoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMl9zYXRfcnRwKHVsb25nMik7CitjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjJfcnRuKHVsb25nMik7CitjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjJfc2F0X3J0bih1bG9uZzIpOworY2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIyKHVsb25nMik7CitjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjJfc2F0KHVsb25nMik7CitjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjJfcnRlKGZsb2F0Mik7CitjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjJfc2F0X3J0ZShmbG9hdDIpOworY2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIyX3J0eihmbG9hdDIpOworY2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIyX3NhdF9ydHooZmxvYXQyKTsKK2NoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMl9ydHAoZmxvYXQyKTsKK2NoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMl9zYXRfcnRwKGZsb2F0Mik7CitjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjJfcnRuKGZsb2F0Mik7CitjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjJfc2F0X3J0bihmbG9hdDIpOworY2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIyKGZsb2F0Mik7CitjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjJfc2F0KGZsb2F0Mik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMl9ydGUoY2hhcjIpOwordWNoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjJfc2F0X3J0ZShjaGFyMik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMl9ydHooY2hhcjIpOwordWNoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjJfc2F0X3J0eihjaGFyMik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMl9ydHAoY2hhcjIpOwordWNoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjJfc2F0X3J0cChjaGFyMik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMl9ydG4oY2hhcjIpOwordWNoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjJfc2F0X3J0bihjaGFyMik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMihjaGFyMik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMl9zYXQoY2hhcjIpOwordWNoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjJfcnRlKHVjaGFyMik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMl9zYXRfcnRlKHVjaGFyMik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMl9ydHoodWNoYXIyKTsKK3VjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIyX3NhdF9ydHoodWNoYXIyKTsKK3VjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIyX3J0cCh1Y2hhcjIpOwordWNoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjJfc2F0X3J0cCh1Y2hhcjIpOwordWNoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjJfcnRuKHVjaGFyMik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMl9zYXRfcnRuKHVjaGFyMik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMih1Y2hhcjIpOwordWNoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjJfc2F0KHVjaGFyMik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMl9ydGUoc2hvcnQyKTsKK3VjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIyX3NhdF9ydGUoc2hvcnQyKTsKK3VjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIyX3J0eihzaG9ydDIpOwordWNoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjJfc2F0X3J0eihzaG9ydDIpOwordWNoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjJfcnRwKHNob3J0Mik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMl9zYXRfcnRwKHNob3J0Mik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMl9ydG4oc2hvcnQyKTsKK3VjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIyX3NhdF9ydG4oc2hvcnQyKTsKK3VjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIyKHNob3J0Mik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMl9zYXQoc2hvcnQyKTsKK3VjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIyX3J0ZSh1c2hvcnQyKTsKK3VjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIyX3NhdF9ydGUodXNob3J0Mik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMl9ydHoodXNob3J0Mik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMl9zYXRfcnR6KHVzaG9ydDIpOwordWNoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjJfcnRwKHVzaG9ydDIpOwordWNoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjJfc2F0X3J0cCh1c2hvcnQyKTsKK3VjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIyX3J0bih1c2hvcnQyKTsKK3VjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIyX3NhdF9ydG4odXNob3J0Mik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMih1c2hvcnQyKTsKK3VjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIyX3NhdCh1c2hvcnQyKTsKK3VjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIyX3J0ZShpbnQyKTsKK3VjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIyX3NhdF9ydGUoaW50Mik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMl9ydHooaW50Mik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMl9zYXRfcnR6KGludDIpOwordWNoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjJfcnRwKGludDIpOwordWNoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjJfc2F0X3J0cChpbnQyKTsKK3VjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIyX3J0bihpbnQyKTsKK3VjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIyX3NhdF9ydG4oaW50Mik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMihpbnQyKTsKK3VjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIyX3NhdChpbnQyKTsKK3VjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIyX3J0ZSh1aW50Mik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMl9zYXRfcnRlKHVpbnQyKTsKK3VjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIyX3J0eih1aW50Mik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMl9zYXRfcnR6KHVpbnQyKTsKK3VjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIyX3J0cCh1aW50Mik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMl9zYXRfcnRwKHVpbnQyKTsKK3VjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIyX3J0bih1aW50Mik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMl9zYXRfcnRuKHVpbnQyKTsKK3VjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIyKHVpbnQyKTsKK3VjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIyX3NhdCh1aW50Mik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMl9ydGUobG9uZzIpOwordWNoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjJfc2F0X3J0ZShsb25nMik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMl9ydHoobG9uZzIpOwordWNoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjJfc2F0X3J0eihsb25nMik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMl9ydHAobG9uZzIpOwordWNoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjJfc2F0X3J0cChsb25nMik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMl9ydG4obG9uZzIpOwordWNoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjJfc2F0X3J0bihsb25nMik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMihsb25nMik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMl9zYXQobG9uZzIpOwordWNoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjJfcnRlKHVsb25nMik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMl9zYXRfcnRlKHVsb25nMik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMl9ydHoodWxvbmcyKTsKK3VjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIyX3NhdF9ydHoodWxvbmcyKTsKK3VjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIyX3J0cCh1bG9uZzIpOwordWNoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjJfc2F0X3J0cCh1bG9uZzIpOwordWNoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjJfcnRuKHVsb25nMik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMl9zYXRfcnRuKHVsb25nMik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMih1bG9uZzIpOwordWNoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjJfc2F0KHVsb25nMik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMl9ydGUoZmxvYXQyKTsKK3VjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIyX3NhdF9ydGUoZmxvYXQyKTsKK3VjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIyX3J0eihmbG9hdDIpOwordWNoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjJfc2F0X3J0eihmbG9hdDIpOwordWNoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjJfcnRwKGZsb2F0Mik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMl9zYXRfcnRwKGZsb2F0Mik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMl9ydG4oZmxvYXQyKTsKK3VjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIyX3NhdF9ydG4oZmxvYXQyKTsKK3VjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIyKGZsb2F0Mik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMl9zYXQoZmxvYXQyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyX3J0ZShjaGFyMik7CitzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0Ml9zYXRfcnRlKGNoYXIyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyX3J0eihjaGFyMik7CitzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0Ml9zYXRfcnR6KGNoYXIyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyX3J0cChjaGFyMik7CitzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0Ml9zYXRfcnRwKGNoYXIyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyX3J0bihjaGFyMik7CitzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0Ml9zYXRfcnRuKGNoYXIyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyKGNoYXIyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyX3NhdChjaGFyMik7CitzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0Ml9ydGUodWNoYXIyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyX3NhdF9ydGUodWNoYXIyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyX3J0eih1Y2hhcjIpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDJfc2F0X3J0eih1Y2hhcjIpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDJfcnRwKHVjaGFyMik7CitzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0Ml9zYXRfcnRwKHVjaGFyMik7CitzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0Ml9ydG4odWNoYXIyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyX3NhdF9ydG4odWNoYXIyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyKHVjaGFyMik7CitzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0Ml9zYXQodWNoYXIyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyX3J0ZShzaG9ydDIpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDJfc2F0X3J0ZShzaG9ydDIpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDJfcnR6KHNob3J0Mik7CitzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0Ml9zYXRfcnR6KHNob3J0Mik7CitzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0Ml9ydHAoc2hvcnQyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyX3NhdF9ydHAoc2hvcnQyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyX3J0bihzaG9ydDIpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDJfc2F0X3J0bihzaG9ydDIpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDIoc2hvcnQyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyX3NhdChzaG9ydDIpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDJfcnRlKHVzaG9ydDIpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDJfc2F0X3J0ZSh1c2hvcnQyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyX3J0eih1c2hvcnQyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyX3NhdF9ydHoodXNob3J0Mik7CitzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0Ml9ydHAodXNob3J0Mik7CitzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0Ml9zYXRfcnRwKHVzaG9ydDIpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDJfcnRuKHVzaG9ydDIpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDJfc2F0X3J0bih1c2hvcnQyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyKHVzaG9ydDIpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDJfc2F0KHVzaG9ydDIpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDJfcnRlKGludDIpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDJfc2F0X3J0ZShpbnQyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyX3J0eihpbnQyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyX3NhdF9ydHooaW50Mik7CitzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0Ml9ydHAoaW50Mik7CitzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0Ml9zYXRfcnRwKGludDIpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDJfcnRuKGludDIpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDJfc2F0X3J0bihpbnQyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyKGludDIpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDJfc2F0KGludDIpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDJfcnRlKHVpbnQyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyX3NhdF9ydGUodWludDIpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDJfcnR6KHVpbnQyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyX3NhdF9ydHoodWludDIpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDJfcnRwKHVpbnQyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyX3NhdF9ydHAodWludDIpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDJfcnRuKHVpbnQyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyX3NhdF9ydG4odWludDIpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDIodWludDIpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDJfc2F0KHVpbnQyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyX3J0ZShsb25nMik7CitzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0Ml9zYXRfcnRlKGxvbmcyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyX3J0eihsb25nMik7CitzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0Ml9zYXRfcnR6KGxvbmcyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyX3J0cChsb25nMik7CitzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0Ml9zYXRfcnRwKGxvbmcyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyX3J0bihsb25nMik7CitzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0Ml9zYXRfcnRuKGxvbmcyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyKGxvbmcyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyX3NhdChsb25nMik7CitzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0Ml9ydGUodWxvbmcyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyX3NhdF9ydGUodWxvbmcyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyX3J0eih1bG9uZzIpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDJfc2F0X3J0eih1bG9uZzIpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDJfcnRwKHVsb25nMik7CitzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0Ml9zYXRfcnRwKHVsb25nMik7CitzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0Ml9ydG4odWxvbmcyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyX3NhdF9ydG4odWxvbmcyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyKHVsb25nMik7CitzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0Ml9zYXQodWxvbmcyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyX3J0ZShmbG9hdDIpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDJfc2F0X3J0ZShmbG9hdDIpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDJfcnR6KGZsb2F0Mik7CitzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0Ml9zYXRfcnR6KGZsb2F0Mik7CitzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0Ml9ydHAoZmxvYXQyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyX3NhdF9ydHAoZmxvYXQyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyX3J0bihmbG9hdDIpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDJfc2F0X3J0bihmbG9hdDIpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDIoZmxvYXQyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyX3NhdChmbG9hdDIpOwordXNob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0Ml9ydGUoY2hhcjIpOwordXNob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0Ml9zYXRfcnRlKGNoYXIyKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDJfcnR6KGNoYXIyKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDJfc2F0X3J0eihjaGFyMik7Cit1c2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQyX3J0cChjaGFyMik7Cit1c2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQyX3NhdF9ydHAoY2hhcjIpOwordXNob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0Ml9ydG4oY2hhcjIpOwordXNob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0Ml9zYXRfcnRuKGNoYXIyKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDIoY2hhcjIpOwordXNob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0Ml9zYXQoY2hhcjIpOwordXNob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0Ml9ydGUodWNoYXIyKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDJfc2F0X3J0ZSh1Y2hhcjIpOwordXNob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0Ml9ydHoodWNoYXIyKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDJfc2F0X3J0eih1Y2hhcjIpOwordXNob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0Ml9ydHAodWNoYXIyKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDJfc2F0X3J0cCh1Y2hhcjIpOwordXNob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0Ml9ydG4odWNoYXIyKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDJfc2F0X3J0bih1Y2hhcjIpOwordXNob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0Mih1Y2hhcjIpOwordXNob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0Ml9zYXQodWNoYXIyKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDJfcnRlKHNob3J0Mik7Cit1c2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQyX3NhdF9ydGUoc2hvcnQyKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDJfcnR6KHNob3J0Mik7Cit1c2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQyX3NhdF9ydHooc2hvcnQyKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDJfcnRwKHNob3J0Mik7Cit1c2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQyX3NhdF9ydHAoc2hvcnQyKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDJfcnRuKHNob3J0Mik7Cit1c2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQyX3NhdF9ydG4oc2hvcnQyKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDIoc2hvcnQyKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDJfc2F0KHNob3J0Mik7Cit1c2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQyX3J0ZSh1c2hvcnQyKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDJfc2F0X3J0ZSh1c2hvcnQyKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDJfcnR6KHVzaG9ydDIpOwordXNob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0Ml9zYXRfcnR6KHVzaG9ydDIpOwordXNob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0Ml9ydHAodXNob3J0Mik7Cit1c2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQyX3NhdF9ydHAodXNob3J0Mik7Cit1c2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQyX3J0bih1c2hvcnQyKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDJfc2F0X3J0bih1c2hvcnQyKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDIodXNob3J0Mik7Cit1c2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQyX3NhdCh1c2hvcnQyKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDJfcnRlKGludDIpOwordXNob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0Ml9zYXRfcnRlKGludDIpOwordXNob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0Ml9ydHooaW50Mik7Cit1c2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQyX3NhdF9ydHooaW50Mik7Cit1c2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQyX3J0cChpbnQyKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDJfc2F0X3J0cChpbnQyKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDJfcnRuKGludDIpOwordXNob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0Ml9zYXRfcnRuKGludDIpOwordXNob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0MihpbnQyKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDJfc2F0KGludDIpOwordXNob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0Ml9ydGUodWludDIpOwordXNob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0Ml9zYXRfcnRlKHVpbnQyKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDJfcnR6KHVpbnQyKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDJfc2F0X3J0eih1aW50Mik7Cit1c2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQyX3J0cCh1aW50Mik7Cit1c2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQyX3NhdF9ydHAodWludDIpOwordXNob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0Ml9ydG4odWludDIpOwordXNob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0Ml9zYXRfcnRuKHVpbnQyKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDIodWludDIpOwordXNob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0Ml9zYXQodWludDIpOwordXNob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0Ml9ydGUobG9uZzIpOwordXNob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0Ml9zYXRfcnRlKGxvbmcyKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDJfcnR6KGxvbmcyKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDJfc2F0X3J0eihsb25nMik7Cit1c2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQyX3J0cChsb25nMik7Cit1c2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQyX3NhdF9ydHAobG9uZzIpOwordXNob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0Ml9ydG4obG9uZzIpOwordXNob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0Ml9zYXRfcnRuKGxvbmcyKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDIobG9uZzIpOwordXNob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0Ml9zYXQobG9uZzIpOwordXNob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0Ml9ydGUodWxvbmcyKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDJfc2F0X3J0ZSh1bG9uZzIpOwordXNob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0Ml9ydHoodWxvbmcyKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDJfc2F0X3J0eih1bG9uZzIpOwordXNob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0Ml9ydHAodWxvbmcyKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDJfc2F0X3J0cCh1bG9uZzIpOwordXNob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0Ml9ydG4odWxvbmcyKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDJfc2F0X3J0bih1bG9uZzIpOwordXNob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0Mih1bG9uZzIpOwordXNob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0Ml9zYXQodWxvbmcyKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDJfcnRlKGZsb2F0Mik7Cit1c2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQyX3NhdF9ydGUoZmxvYXQyKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDJfcnR6KGZsb2F0Mik7Cit1c2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQyX3NhdF9ydHooZmxvYXQyKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDJfcnRwKGZsb2F0Mik7Cit1c2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQyX3NhdF9ydHAoZmxvYXQyKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDJfcnRuKGZsb2F0Mik7Cit1c2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQyX3NhdF9ydG4oZmxvYXQyKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDIoZmxvYXQyKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDJfc2F0KGZsb2F0Mik7CitpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQyX3J0ZShjaGFyMik7CitpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQyX3NhdF9ydGUoY2hhcjIpOworaW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50Ml9ydHooY2hhcjIpOworaW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50Ml9zYXRfcnR6KGNoYXIyKTsKK2ludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDJfcnRwKGNoYXIyKTsKK2ludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDJfc2F0X3J0cChjaGFyMik7CitpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQyX3J0bihjaGFyMik7CitpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQyX3NhdF9ydG4oY2hhcjIpOworaW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50MihjaGFyMik7CitpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQyX3NhdChjaGFyMik7CitpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQyX3J0ZSh1Y2hhcjIpOworaW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50Ml9zYXRfcnRlKHVjaGFyMik7CitpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQyX3J0eih1Y2hhcjIpOworaW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50Ml9zYXRfcnR6KHVjaGFyMik7CitpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQyX3J0cCh1Y2hhcjIpOworaW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50Ml9zYXRfcnRwKHVjaGFyMik7CitpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQyX3J0bih1Y2hhcjIpOworaW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50Ml9zYXRfcnRuKHVjaGFyMik7CitpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQyKHVjaGFyMik7CitpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQyX3NhdCh1Y2hhcjIpOworaW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50Ml9ydGUoc2hvcnQyKTsKK2ludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDJfc2F0X3J0ZShzaG9ydDIpOworaW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50Ml9ydHooc2hvcnQyKTsKK2ludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDJfc2F0X3J0eihzaG9ydDIpOworaW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50Ml9ydHAoc2hvcnQyKTsKK2ludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDJfc2F0X3J0cChzaG9ydDIpOworaW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50Ml9ydG4oc2hvcnQyKTsKK2ludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDJfc2F0X3J0bihzaG9ydDIpOworaW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50MihzaG9ydDIpOworaW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50Ml9zYXQoc2hvcnQyKTsKK2ludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDJfcnRlKHVzaG9ydDIpOworaW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50Ml9zYXRfcnRlKHVzaG9ydDIpOworaW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50Ml9ydHoodXNob3J0Mik7CitpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQyX3NhdF9ydHoodXNob3J0Mik7CitpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQyX3J0cCh1c2hvcnQyKTsKK2ludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDJfc2F0X3J0cCh1c2hvcnQyKTsKK2ludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDJfcnRuKHVzaG9ydDIpOworaW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50Ml9zYXRfcnRuKHVzaG9ydDIpOworaW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50Mih1c2hvcnQyKTsKK2ludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDJfc2F0KHVzaG9ydDIpOworaW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50Ml9ydGUoaW50Mik7CitpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQyX3NhdF9ydGUoaW50Mik7CitpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQyX3J0eihpbnQyKTsKK2ludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDJfc2F0X3J0eihpbnQyKTsKK2ludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDJfcnRwKGludDIpOworaW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50Ml9zYXRfcnRwKGludDIpOworaW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50Ml9ydG4oaW50Mik7CitpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQyX3NhdF9ydG4oaW50Mik7CitpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQyKGludDIpOworaW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50Ml9zYXQoaW50Mik7CitpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQyX3J0ZSh1aW50Mik7CitpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQyX3NhdF9ydGUodWludDIpOworaW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50Ml9ydHoodWludDIpOworaW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50Ml9zYXRfcnR6KHVpbnQyKTsKK2ludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDJfcnRwKHVpbnQyKTsKK2ludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDJfc2F0X3J0cCh1aW50Mik7CitpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQyX3J0bih1aW50Mik7CitpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQyX3NhdF9ydG4odWludDIpOworaW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50Mih1aW50Mik7CitpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQyX3NhdCh1aW50Mik7CitpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQyX3J0ZShsb25nMik7CitpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQyX3NhdF9ydGUobG9uZzIpOworaW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50Ml9ydHoobG9uZzIpOworaW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50Ml9zYXRfcnR6KGxvbmcyKTsKK2ludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDJfcnRwKGxvbmcyKTsKK2ludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDJfc2F0X3J0cChsb25nMik7CitpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQyX3J0bihsb25nMik7CitpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQyX3NhdF9ydG4obG9uZzIpOworaW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50Mihsb25nMik7CitpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQyX3NhdChsb25nMik7CitpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQyX3J0ZSh1bG9uZzIpOworaW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50Ml9zYXRfcnRlKHVsb25nMik7CitpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQyX3J0eih1bG9uZzIpOworaW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50Ml9zYXRfcnR6KHVsb25nMik7CitpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQyX3J0cCh1bG9uZzIpOworaW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50Ml9zYXRfcnRwKHVsb25nMik7CitpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQyX3J0bih1bG9uZzIpOworaW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50Ml9zYXRfcnRuKHVsb25nMik7CitpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQyKHVsb25nMik7CitpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQyX3NhdCh1bG9uZzIpOworaW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50Ml9ydGUoZmxvYXQyKTsKK2ludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDJfc2F0X3J0ZShmbG9hdDIpOworaW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50Ml9ydHooZmxvYXQyKTsKK2ludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDJfc2F0X3J0eihmbG9hdDIpOworaW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50Ml9ydHAoZmxvYXQyKTsKK2ludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDJfc2F0X3J0cChmbG9hdDIpOworaW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50Ml9ydG4oZmxvYXQyKTsKK2ludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDJfc2F0X3J0bihmbG9hdDIpOworaW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50MihmbG9hdDIpOworaW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50Ml9zYXQoZmxvYXQyKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50Ml9ydGUoY2hhcjIpOwordWludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQyX3NhdF9ydGUoY2hhcjIpOwordWludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQyX3J0eihjaGFyMik7Cit1aW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDJfc2F0X3J0eihjaGFyMik7Cit1aW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDJfcnRwKGNoYXIyKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50Ml9zYXRfcnRwKGNoYXIyKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50Ml9ydG4oY2hhcjIpOwordWludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQyX3NhdF9ydG4oY2hhcjIpOwordWludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQyKGNoYXIyKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50Ml9zYXQoY2hhcjIpOwordWludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQyX3J0ZSh1Y2hhcjIpOwordWludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQyX3NhdF9ydGUodWNoYXIyKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50Ml9ydHoodWNoYXIyKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50Ml9zYXRfcnR6KHVjaGFyMik7Cit1aW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDJfcnRwKHVjaGFyMik7Cit1aW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDJfc2F0X3J0cCh1Y2hhcjIpOwordWludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQyX3J0bih1Y2hhcjIpOwordWludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQyX3NhdF9ydG4odWNoYXIyKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50Mih1Y2hhcjIpOwordWludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQyX3NhdCh1Y2hhcjIpOwordWludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQyX3J0ZShzaG9ydDIpOwordWludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQyX3NhdF9ydGUoc2hvcnQyKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50Ml9ydHooc2hvcnQyKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50Ml9zYXRfcnR6KHNob3J0Mik7Cit1aW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDJfcnRwKHNob3J0Mik7Cit1aW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDJfc2F0X3J0cChzaG9ydDIpOwordWludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQyX3J0bihzaG9ydDIpOwordWludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQyX3NhdF9ydG4oc2hvcnQyKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50MihzaG9ydDIpOwordWludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQyX3NhdChzaG9ydDIpOwordWludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQyX3J0ZSh1c2hvcnQyKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50Ml9zYXRfcnRlKHVzaG9ydDIpOwordWludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQyX3J0eih1c2hvcnQyKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50Ml9zYXRfcnR6KHVzaG9ydDIpOwordWludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQyX3J0cCh1c2hvcnQyKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50Ml9zYXRfcnRwKHVzaG9ydDIpOwordWludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQyX3J0bih1c2hvcnQyKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50Ml9zYXRfcnRuKHVzaG9ydDIpOwordWludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQyKHVzaG9ydDIpOwordWludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQyX3NhdCh1c2hvcnQyKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50Ml9ydGUoaW50Mik7Cit1aW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDJfc2F0X3J0ZShpbnQyKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50Ml9ydHooaW50Mik7Cit1aW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDJfc2F0X3J0eihpbnQyKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50Ml9ydHAoaW50Mik7Cit1aW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDJfc2F0X3J0cChpbnQyKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50Ml9ydG4oaW50Mik7Cit1aW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDJfc2F0X3J0bihpbnQyKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50MihpbnQyKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50Ml9zYXQoaW50Mik7Cit1aW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDJfcnRlKHVpbnQyKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50Ml9zYXRfcnRlKHVpbnQyKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50Ml9ydHoodWludDIpOwordWludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQyX3NhdF9ydHoodWludDIpOwordWludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQyX3J0cCh1aW50Mik7Cit1aW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDJfc2F0X3J0cCh1aW50Mik7Cit1aW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDJfcnRuKHVpbnQyKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50Ml9zYXRfcnRuKHVpbnQyKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50Mih1aW50Mik7Cit1aW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDJfc2F0KHVpbnQyKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50Ml9ydGUobG9uZzIpOwordWludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQyX3NhdF9ydGUobG9uZzIpOwordWludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQyX3J0eihsb25nMik7Cit1aW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDJfc2F0X3J0eihsb25nMik7Cit1aW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDJfcnRwKGxvbmcyKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50Ml9zYXRfcnRwKGxvbmcyKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50Ml9ydG4obG9uZzIpOwordWludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQyX3NhdF9ydG4obG9uZzIpOwordWludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQyKGxvbmcyKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50Ml9zYXQobG9uZzIpOwordWludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQyX3J0ZSh1bG9uZzIpOwordWludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQyX3NhdF9ydGUodWxvbmcyKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50Ml9ydHoodWxvbmcyKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50Ml9zYXRfcnR6KHVsb25nMik7Cit1aW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDJfcnRwKHVsb25nMik7Cit1aW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDJfc2F0X3J0cCh1bG9uZzIpOwordWludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQyX3J0bih1bG9uZzIpOwordWludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQyX3NhdF9ydG4odWxvbmcyKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50Mih1bG9uZzIpOwordWludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQyX3NhdCh1bG9uZzIpOwordWludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQyX3J0ZShmbG9hdDIpOwordWludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQyX3NhdF9ydGUoZmxvYXQyKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50Ml9ydHooZmxvYXQyKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50Ml9zYXRfcnR6KGZsb2F0Mik7Cit1aW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDJfcnRwKGZsb2F0Mik7Cit1aW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDJfc2F0X3J0cChmbG9hdDIpOwordWludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQyX3J0bihmbG9hdDIpOwordWludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQyX3NhdF9ydG4oZmxvYXQyKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50MihmbG9hdDIpOwordWludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQyX3NhdChmbG9hdDIpOworbG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcyX3J0ZShjaGFyMik7Citsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzJfc2F0X3J0ZShjaGFyMik7Citsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzJfcnR6KGNoYXIyKTsKK2xvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMl9zYXRfcnR6KGNoYXIyKTsKK2xvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMl9ydHAoY2hhcjIpOworbG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcyX3NhdF9ydHAoY2hhcjIpOworbG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcyX3J0bihjaGFyMik7Citsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzJfc2F0X3J0bihjaGFyMik7Citsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzIoY2hhcjIpOworbG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcyX3NhdChjaGFyMik7Citsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzJfcnRlKHVjaGFyMik7Citsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzJfc2F0X3J0ZSh1Y2hhcjIpOworbG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcyX3J0eih1Y2hhcjIpOworbG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcyX3NhdF9ydHoodWNoYXIyKTsKK2xvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMl9ydHAodWNoYXIyKTsKK2xvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMl9zYXRfcnRwKHVjaGFyMik7Citsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzJfcnRuKHVjaGFyMik7Citsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzJfc2F0X3J0bih1Y2hhcjIpOworbG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcyKHVjaGFyMik7Citsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzJfc2F0KHVjaGFyMik7Citsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzJfcnRlKHNob3J0Mik7Citsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzJfc2F0X3J0ZShzaG9ydDIpOworbG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcyX3J0eihzaG9ydDIpOworbG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcyX3NhdF9ydHooc2hvcnQyKTsKK2xvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMl9ydHAoc2hvcnQyKTsKK2xvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMl9zYXRfcnRwKHNob3J0Mik7Citsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzJfcnRuKHNob3J0Mik7Citsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzJfc2F0X3J0bihzaG9ydDIpOworbG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcyKHNob3J0Mik7Citsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzJfc2F0KHNob3J0Mik7Citsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzJfcnRlKHVzaG9ydDIpOworbG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcyX3NhdF9ydGUodXNob3J0Mik7Citsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzJfcnR6KHVzaG9ydDIpOworbG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcyX3NhdF9ydHoodXNob3J0Mik7Citsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzJfcnRwKHVzaG9ydDIpOworbG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcyX3NhdF9ydHAodXNob3J0Mik7Citsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzJfcnRuKHVzaG9ydDIpOworbG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcyX3NhdF9ydG4odXNob3J0Mik7Citsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzIodXNob3J0Mik7Citsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzJfc2F0KHVzaG9ydDIpOworbG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcyX3J0ZShpbnQyKTsKK2xvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMl9zYXRfcnRlKGludDIpOworbG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcyX3J0eihpbnQyKTsKK2xvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMl9zYXRfcnR6KGludDIpOworbG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcyX3J0cChpbnQyKTsKK2xvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMl9zYXRfcnRwKGludDIpOworbG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcyX3J0bihpbnQyKTsKK2xvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMl9zYXRfcnRuKGludDIpOworbG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcyKGludDIpOworbG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcyX3NhdChpbnQyKTsKK2xvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMl9ydGUodWludDIpOworbG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcyX3NhdF9ydGUodWludDIpOworbG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcyX3J0eih1aW50Mik7Citsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzJfc2F0X3J0eih1aW50Mik7Citsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzJfcnRwKHVpbnQyKTsKK2xvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMl9zYXRfcnRwKHVpbnQyKTsKK2xvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMl9ydG4odWludDIpOworbG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcyX3NhdF9ydG4odWludDIpOworbG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcyKHVpbnQyKTsKK2xvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMl9zYXQodWludDIpOworbG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcyX3J0ZShsb25nMik7Citsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzJfc2F0X3J0ZShsb25nMik7Citsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzJfcnR6KGxvbmcyKTsKK2xvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMl9zYXRfcnR6KGxvbmcyKTsKK2xvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMl9ydHAobG9uZzIpOworbG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcyX3NhdF9ydHAobG9uZzIpOworbG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcyX3J0bihsb25nMik7Citsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzJfc2F0X3J0bihsb25nMik7Citsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzIobG9uZzIpOworbG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcyX3NhdChsb25nMik7Citsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzJfcnRlKHVsb25nMik7Citsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzJfc2F0X3J0ZSh1bG9uZzIpOworbG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcyX3J0eih1bG9uZzIpOworbG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcyX3NhdF9ydHoodWxvbmcyKTsKK2xvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMl9ydHAodWxvbmcyKTsKK2xvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMl9zYXRfcnRwKHVsb25nMik7Citsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzJfcnRuKHVsb25nMik7Citsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzJfc2F0X3J0bih1bG9uZzIpOworbG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcyKHVsb25nMik7Citsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzJfc2F0KHVsb25nMik7Citsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzJfcnRlKGZsb2F0Mik7Citsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzJfc2F0X3J0ZShmbG9hdDIpOworbG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcyX3J0eihmbG9hdDIpOworbG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcyX3NhdF9ydHooZmxvYXQyKTsKK2xvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMl9ydHAoZmxvYXQyKTsKK2xvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMl9zYXRfcnRwKGZsb2F0Mik7Citsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzJfcnRuKGZsb2F0Mik7Citsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzJfc2F0X3J0bihmbG9hdDIpOworbG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcyKGZsb2F0Mik7Citsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzJfc2F0KGZsb2F0Mik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMl9ydGUoY2hhcjIpOwordWxvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzJfc2F0X3J0ZShjaGFyMik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMl9ydHooY2hhcjIpOwordWxvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzJfc2F0X3J0eihjaGFyMik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMl9ydHAoY2hhcjIpOwordWxvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzJfc2F0X3J0cChjaGFyMik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMl9ydG4oY2hhcjIpOwordWxvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzJfc2F0X3J0bihjaGFyMik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMihjaGFyMik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMl9zYXQoY2hhcjIpOwordWxvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzJfcnRlKHVjaGFyMik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMl9zYXRfcnRlKHVjaGFyMik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMl9ydHoodWNoYXIyKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcyX3NhdF9ydHoodWNoYXIyKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcyX3J0cCh1Y2hhcjIpOwordWxvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzJfc2F0X3J0cCh1Y2hhcjIpOwordWxvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzJfcnRuKHVjaGFyMik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMl9zYXRfcnRuKHVjaGFyMik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMih1Y2hhcjIpOwordWxvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzJfc2F0KHVjaGFyMik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMl9ydGUoc2hvcnQyKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcyX3NhdF9ydGUoc2hvcnQyKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcyX3J0eihzaG9ydDIpOwordWxvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzJfc2F0X3J0eihzaG9ydDIpOwordWxvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzJfcnRwKHNob3J0Mik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMl9zYXRfcnRwKHNob3J0Mik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMl9ydG4oc2hvcnQyKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcyX3NhdF9ydG4oc2hvcnQyKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcyKHNob3J0Mik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMl9zYXQoc2hvcnQyKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcyX3J0ZSh1c2hvcnQyKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcyX3NhdF9ydGUodXNob3J0Mik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMl9ydHoodXNob3J0Mik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMl9zYXRfcnR6KHVzaG9ydDIpOwordWxvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzJfcnRwKHVzaG9ydDIpOwordWxvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzJfc2F0X3J0cCh1c2hvcnQyKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcyX3J0bih1c2hvcnQyKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcyX3NhdF9ydG4odXNob3J0Mik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMih1c2hvcnQyKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcyX3NhdCh1c2hvcnQyKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcyX3J0ZShpbnQyKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcyX3NhdF9ydGUoaW50Mik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMl9ydHooaW50Mik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMl9zYXRfcnR6KGludDIpOwordWxvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzJfcnRwKGludDIpOwordWxvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzJfc2F0X3J0cChpbnQyKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcyX3J0bihpbnQyKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcyX3NhdF9ydG4oaW50Mik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMihpbnQyKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcyX3NhdChpbnQyKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcyX3J0ZSh1aW50Mik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMl9zYXRfcnRlKHVpbnQyKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcyX3J0eih1aW50Mik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMl9zYXRfcnR6KHVpbnQyKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcyX3J0cCh1aW50Mik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMl9zYXRfcnRwKHVpbnQyKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcyX3J0bih1aW50Mik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMl9zYXRfcnRuKHVpbnQyKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcyKHVpbnQyKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcyX3NhdCh1aW50Mik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMl9ydGUobG9uZzIpOwordWxvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzJfc2F0X3J0ZShsb25nMik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMl9ydHoobG9uZzIpOwordWxvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzJfc2F0X3J0eihsb25nMik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMl9ydHAobG9uZzIpOwordWxvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzJfc2F0X3J0cChsb25nMik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMl9ydG4obG9uZzIpOwordWxvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzJfc2F0X3J0bihsb25nMik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMihsb25nMik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMl9zYXQobG9uZzIpOwordWxvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzJfcnRlKHVsb25nMik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMl9zYXRfcnRlKHVsb25nMik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMl9ydHoodWxvbmcyKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcyX3NhdF9ydHoodWxvbmcyKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcyX3J0cCh1bG9uZzIpOwordWxvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzJfc2F0X3J0cCh1bG9uZzIpOwordWxvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzJfcnRuKHVsb25nMik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMl9zYXRfcnRuKHVsb25nMik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMih1bG9uZzIpOwordWxvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzJfc2F0KHVsb25nMik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMl9ydGUoZmxvYXQyKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcyX3NhdF9ydGUoZmxvYXQyKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcyX3J0eihmbG9hdDIpOwordWxvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzJfc2F0X3J0eihmbG9hdDIpOwordWxvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzJfcnRwKGZsb2F0Mik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMl9zYXRfcnRwKGZsb2F0Mik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMl9ydG4oZmxvYXQyKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcyX3NhdF9ydG4oZmxvYXQyKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcyKGZsb2F0Mik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMl9zYXQoZmxvYXQyKTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQyX3J0ZShjaGFyMik7CitmbG9hdDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0Ml9ydHooY2hhcjIpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDJfcnRwKGNoYXIyKTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQyX3J0bihjaGFyMik7CitmbG9hdDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0MihjaGFyMik7CitmbG9hdDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0Ml9ydGUodWNoYXIyKTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQyX3J0eih1Y2hhcjIpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDJfcnRwKHVjaGFyMik7CitmbG9hdDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0Ml9ydG4odWNoYXIyKTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQyKHVjaGFyMik7CitmbG9hdDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0Ml9ydGUoc2hvcnQyKTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQyX3J0eihzaG9ydDIpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDJfcnRwKHNob3J0Mik7CitmbG9hdDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0Ml9ydG4oc2hvcnQyKTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQyKHNob3J0Mik7CitmbG9hdDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0Ml9ydGUodXNob3J0Mik7CitmbG9hdDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0Ml9ydHoodXNob3J0Mik7CitmbG9hdDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0Ml9ydHAodXNob3J0Mik7CitmbG9hdDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0Ml9ydG4odXNob3J0Mik7CitmbG9hdDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0Mih1c2hvcnQyKTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQyX3J0ZShpbnQyKTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQyX3J0eihpbnQyKTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQyX3J0cChpbnQyKTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQyX3J0bihpbnQyKTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQyKGludDIpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDJfcnRlKHVpbnQyKTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQyX3J0eih1aW50Mik7CitmbG9hdDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0Ml9ydHAodWludDIpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDJfcnRuKHVpbnQyKTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQyKHVpbnQyKTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQyX3J0ZShsb25nMik7CitmbG9hdDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0Ml9ydHoobG9uZzIpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDJfcnRwKGxvbmcyKTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQyX3J0bihsb25nMik7CitmbG9hdDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0Mihsb25nMik7CitmbG9hdDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0Ml9ydGUodWxvbmcyKTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQyX3J0eih1bG9uZzIpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDJfcnRwKHVsb25nMik7CitmbG9hdDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0Ml9ydG4odWxvbmcyKTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQyKHVsb25nMik7CitmbG9hdDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0Ml9ydGUoZmxvYXQyKTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQyX3J0eihmbG9hdDIpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDJfcnRwKGZsb2F0Mik7CitmbG9hdDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0Ml9ydG4oZmxvYXQyKTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQyKGZsb2F0Mik7CitjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjNfcnRlKGNoYXIzKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyM19zYXRfcnRlKGNoYXIzKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyM19ydHooY2hhcjMpOworY2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIzX3NhdF9ydHooY2hhcjMpOworY2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIzX3J0cChjaGFyMyk7CitjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjNfc2F0X3J0cChjaGFyMyk7CitjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjNfcnRuKGNoYXIzKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyM19zYXRfcnRuKGNoYXIzKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMyhjaGFyMyk7CitjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjNfc2F0KGNoYXIzKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyM19ydGUodWNoYXIzKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyM19zYXRfcnRlKHVjaGFyMyk7CitjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjNfcnR6KHVjaGFyMyk7CitjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjNfc2F0X3J0eih1Y2hhcjMpOworY2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIzX3J0cCh1Y2hhcjMpOworY2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIzX3NhdF9ydHAodWNoYXIzKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyM19ydG4odWNoYXIzKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyM19zYXRfcnRuKHVjaGFyMyk7CitjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjModWNoYXIzKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyM19zYXQodWNoYXIzKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyM19ydGUoc2hvcnQzKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyM19zYXRfcnRlKHNob3J0Myk7CitjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjNfcnR6KHNob3J0Myk7CitjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjNfc2F0X3J0eihzaG9ydDMpOworY2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIzX3J0cChzaG9ydDMpOworY2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIzX3NhdF9ydHAoc2hvcnQzKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyM19ydG4oc2hvcnQzKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyM19zYXRfcnRuKHNob3J0Myk7CitjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjMoc2hvcnQzKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyM19zYXQoc2hvcnQzKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyM19ydGUodXNob3J0Myk7CitjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjNfc2F0X3J0ZSh1c2hvcnQzKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyM19ydHoodXNob3J0Myk7CitjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjNfc2F0X3J0eih1c2hvcnQzKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyM19ydHAodXNob3J0Myk7CitjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjNfc2F0X3J0cCh1c2hvcnQzKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyM19ydG4odXNob3J0Myk7CitjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjNfc2F0X3J0bih1c2hvcnQzKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMyh1c2hvcnQzKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyM19zYXQodXNob3J0Myk7CitjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjNfcnRlKGludDMpOworY2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIzX3NhdF9ydGUoaW50Myk7CitjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjNfcnR6KGludDMpOworY2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIzX3NhdF9ydHooaW50Myk7CitjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjNfcnRwKGludDMpOworY2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIzX3NhdF9ydHAoaW50Myk7CitjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjNfcnRuKGludDMpOworY2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIzX3NhdF9ydG4oaW50Myk7CitjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjMoaW50Myk7CitjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjNfc2F0KGludDMpOworY2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIzX3J0ZSh1aW50Myk7CitjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjNfc2F0X3J0ZSh1aW50Myk7CitjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjNfcnR6KHVpbnQzKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyM19zYXRfcnR6KHVpbnQzKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyM19ydHAodWludDMpOworY2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIzX3NhdF9ydHAodWludDMpOworY2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIzX3J0bih1aW50Myk7CitjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjNfc2F0X3J0bih1aW50Myk7CitjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjModWludDMpOworY2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIzX3NhdCh1aW50Myk7CitjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjNfcnRlKGxvbmczKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyM19zYXRfcnRlKGxvbmczKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyM19ydHoobG9uZzMpOworY2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIzX3NhdF9ydHoobG9uZzMpOworY2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIzX3J0cChsb25nMyk7CitjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjNfc2F0X3J0cChsb25nMyk7CitjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjNfcnRuKGxvbmczKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyM19zYXRfcnRuKGxvbmczKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMyhsb25nMyk7CitjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjNfc2F0KGxvbmczKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyM19ydGUodWxvbmczKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyM19zYXRfcnRlKHVsb25nMyk7CitjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjNfcnR6KHVsb25nMyk7CitjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjNfc2F0X3J0eih1bG9uZzMpOworY2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIzX3J0cCh1bG9uZzMpOworY2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIzX3NhdF9ydHAodWxvbmczKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyM19ydG4odWxvbmczKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyM19zYXRfcnRuKHVsb25nMyk7CitjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjModWxvbmczKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyM19zYXQodWxvbmczKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyM19ydGUoZmxvYXQzKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyM19zYXRfcnRlKGZsb2F0Myk7CitjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjNfcnR6KGZsb2F0Myk7CitjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjNfc2F0X3J0eihmbG9hdDMpOworY2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIzX3J0cChmbG9hdDMpOworY2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIzX3NhdF9ydHAoZmxvYXQzKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyM19ydG4oZmxvYXQzKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyM19zYXRfcnRuKGZsb2F0Myk7CitjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjMoZmxvYXQzKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyM19zYXQoZmxvYXQzKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIzX3J0ZShjaGFyMyk7Cit1Y2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyM19zYXRfcnRlKGNoYXIzKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIzX3J0eihjaGFyMyk7Cit1Y2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyM19zYXRfcnR6KGNoYXIzKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIzX3J0cChjaGFyMyk7Cit1Y2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyM19zYXRfcnRwKGNoYXIzKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIzX3J0bihjaGFyMyk7Cit1Y2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyM19zYXRfcnRuKGNoYXIzKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIzKGNoYXIzKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIzX3NhdChjaGFyMyk7Cit1Y2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyM19ydGUodWNoYXIzKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIzX3NhdF9ydGUodWNoYXIzKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIzX3J0eih1Y2hhcjMpOwordWNoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjNfc2F0X3J0eih1Y2hhcjMpOwordWNoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjNfcnRwKHVjaGFyMyk7Cit1Y2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyM19zYXRfcnRwKHVjaGFyMyk7Cit1Y2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyM19ydG4odWNoYXIzKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIzX3NhdF9ydG4odWNoYXIzKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIzKHVjaGFyMyk7Cit1Y2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyM19zYXQodWNoYXIzKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIzX3J0ZShzaG9ydDMpOwordWNoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjNfc2F0X3J0ZShzaG9ydDMpOwordWNoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjNfcnR6KHNob3J0Myk7Cit1Y2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyM19zYXRfcnR6KHNob3J0Myk7Cit1Y2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyM19ydHAoc2hvcnQzKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIzX3NhdF9ydHAoc2hvcnQzKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIzX3J0bihzaG9ydDMpOwordWNoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjNfc2F0X3J0bihzaG9ydDMpOwordWNoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjMoc2hvcnQzKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIzX3NhdChzaG9ydDMpOwordWNoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjNfcnRlKHVzaG9ydDMpOwordWNoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjNfc2F0X3J0ZSh1c2hvcnQzKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIzX3J0eih1c2hvcnQzKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIzX3NhdF9ydHoodXNob3J0Myk7Cit1Y2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyM19ydHAodXNob3J0Myk7Cit1Y2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyM19zYXRfcnRwKHVzaG9ydDMpOwordWNoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjNfcnRuKHVzaG9ydDMpOwordWNoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjNfc2F0X3J0bih1c2hvcnQzKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIzKHVzaG9ydDMpOwordWNoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjNfc2F0KHVzaG9ydDMpOwordWNoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjNfcnRlKGludDMpOwordWNoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjNfc2F0X3J0ZShpbnQzKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIzX3J0eihpbnQzKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIzX3NhdF9ydHooaW50Myk7Cit1Y2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyM19ydHAoaW50Myk7Cit1Y2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyM19zYXRfcnRwKGludDMpOwordWNoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjNfcnRuKGludDMpOwordWNoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjNfc2F0X3J0bihpbnQzKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIzKGludDMpOwordWNoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjNfc2F0KGludDMpOwordWNoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjNfcnRlKHVpbnQzKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIzX3NhdF9ydGUodWludDMpOwordWNoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjNfcnR6KHVpbnQzKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIzX3NhdF9ydHoodWludDMpOwordWNoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjNfcnRwKHVpbnQzKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIzX3NhdF9ydHAodWludDMpOwordWNoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjNfcnRuKHVpbnQzKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIzX3NhdF9ydG4odWludDMpOwordWNoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjModWludDMpOwordWNoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjNfc2F0KHVpbnQzKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIzX3J0ZShsb25nMyk7Cit1Y2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyM19zYXRfcnRlKGxvbmczKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIzX3J0eihsb25nMyk7Cit1Y2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyM19zYXRfcnR6KGxvbmczKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIzX3J0cChsb25nMyk7Cit1Y2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyM19zYXRfcnRwKGxvbmczKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIzX3J0bihsb25nMyk7Cit1Y2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyM19zYXRfcnRuKGxvbmczKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIzKGxvbmczKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIzX3NhdChsb25nMyk7Cit1Y2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyM19ydGUodWxvbmczKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIzX3NhdF9ydGUodWxvbmczKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIzX3J0eih1bG9uZzMpOwordWNoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjNfc2F0X3J0eih1bG9uZzMpOwordWNoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjNfcnRwKHVsb25nMyk7Cit1Y2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyM19zYXRfcnRwKHVsb25nMyk7Cit1Y2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyM19ydG4odWxvbmczKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIzX3NhdF9ydG4odWxvbmczKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIzKHVsb25nMyk7Cit1Y2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyM19zYXQodWxvbmczKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIzX3J0ZShmbG9hdDMpOwordWNoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjNfc2F0X3J0ZShmbG9hdDMpOwordWNoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjNfcnR6KGZsb2F0Myk7Cit1Y2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyM19zYXRfcnR6KGZsb2F0Myk7Cit1Y2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyM19ydHAoZmxvYXQzKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIzX3NhdF9ydHAoZmxvYXQzKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIzX3J0bihmbG9hdDMpOwordWNoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjNfc2F0X3J0bihmbG9hdDMpOwordWNoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjMoZmxvYXQzKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIzX3NhdChmbG9hdDMpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDNfcnRlKGNoYXIzKTsKK3Nob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQzX3NhdF9ydGUoY2hhcjMpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDNfcnR6KGNoYXIzKTsKK3Nob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQzX3NhdF9ydHooY2hhcjMpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDNfcnRwKGNoYXIzKTsKK3Nob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQzX3NhdF9ydHAoY2hhcjMpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDNfcnRuKGNoYXIzKTsKK3Nob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQzX3NhdF9ydG4oY2hhcjMpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDMoY2hhcjMpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDNfc2F0KGNoYXIzKTsKK3Nob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQzX3J0ZSh1Y2hhcjMpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDNfc2F0X3J0ZSh1Y2hhcjMpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDNfcnR6KHVjaGFyMyk7CitzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0M19zYXRfcnR6KHVjaGFyMyk7CitzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0M19ydHAodWNoYXIzKTsKK3Nob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQzX3NhdF9ydHAodWNoYXIzKTsKK3Nob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQzX3J0bih1Y2hhcjMpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDNfc2F0X3J0bih1Y2hhcjMpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDModWNoYXIzKTsKK3Nob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQzX3NhdCh1Y2hhcjMpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDNfcnRlKHNob3J0Myk7CitzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0M19zYXRfcnRlKHNob3J0Myk7CitzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0M19ydHooc2hvcnQzKTsKK3Nob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQzX3NhdF9ydHooc2hvcnQzKTsKK3Nob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQzX3J0cChzaG9ydDMpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDNfc2F0X3J0cChzaG9ydDMpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDNfcnRuKHNob3J0Myk7CitzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0M19zYXRfcnRuKHNob3J0Myk7CitzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0MyhzaG9ydDMpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDNfc2F0KHNob3J0Myk7CitzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0M19ydGUodXNob3J0Myk7CitzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0M19zYXRfcnRlKHVzaG9ydDMpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDNfcnR6KHVzaG9ydDMpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDNfc2F0X3J0eih1c2hvcnQzKTsKK3Nob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQzX3J0cCh1c2hvcnQzKTsKK3Nob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQzX3NhdF9ydHAodXNob3J0Myk7CitzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0M19ydG4odXNob3J0Myk7CitzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0M19zYXRfcnRuKHVzaG9ydDMpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDModXNob3J0Myk7CitzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0M19zYXQodXNob3J0Myk7CitzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0M19ydGUoaW50Myk7CitzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0M19zYXRfcnRlKGludDMpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDNfcnR6KGludDMpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDNfc2F0X3J0eihpbnQzKTsKK3Nob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQzX3J0cChpbnQzKTsKK3Nob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQzX3NhdF9ydHAoaW50Myk7CitzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0M19ydG4oaW50Myk7CitzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0M19zYXRfcnRuKGludDMpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDMoaW50Myk7CitzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0M19zYXQoaW50Myk7CitzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0M19ydGUodWludDMpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDNfc2F0X3J0ZSh1aW50Myk7CitzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0M19ydHoodWludDMpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDNfc2F0X3J0eih1aW50Myk7CitzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0M19ydHAodWludDMpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDNfc2F0X3J0cCh1aW50Myk7CitzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0M19ydG4odWludDMpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDNfc2F0X3J0bih1aW50Myk7CitzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0Myh1aW50Myk7CitzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0M19zYXQodWludDMpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDNfcnRlKGxvbmczKTsKK3Nob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQzX3NhdF9ydGUobG9uZzMpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDNfcnR6KGxvbmczKTsKK3Nob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQzX3NhdF9ydHoobG9uZzMpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDNfcnRwKGxvbmczKTsKK3Nob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQzX3NhdF9ydHAobG9uZzMpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDNfcnRuKGxvbmczKTsKK3Nob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQzX3NhdF9ydG4obG9uZzMpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDMobG9uZzMpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDNfc2F0KGxvbmczKTsKK3Nob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQzX3J0ZSh1bG9uZzMpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDNfc2F0X3J0ZSh1bG9uZzMpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDNfcnR6KHVsb25nMyk7CitzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0M19zYXRfcnR6KHVsb25nMyk7CitzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0M19ydHAodWxvbmczKTsKK3Nob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQzX3NhdF9ydHAodWxvbmczKTsKK3Nob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQzX3J0bih1bG9uZzMpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDNfc2F0X3J0bih1bG9uZzMpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDModWxvbmczKTsKK3Nob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQzX3NhdCh1bG9uZzMpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDNfcnRlKGZsb2F0Myk7CitzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0M19zYXRfcnRlKGZsb2F0Myk7CitzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0M19ydHooZmxvYXQzKTsKK3Nob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQzX3NhdF9ydHooZmxvYXQzKTsKK3Nob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQzX3J0cChmbG9hdDMpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDNfc2F0X3J0cChmbG9hdDMpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDNfcnRuKGZsb2F0Myk7CitzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0M19zYXRfcnRuKGZsb2F0Myk7CitzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0MyhmbG9hdDMpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDNfc2F0KGZsb2F0Myk7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQzX3J0ZShjaGFyMyk7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQzX3NhdF9ydGUoY2hhcjMpOwordXNob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0M19ydHooY2hhcjMpOwordXNob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0M19zYXRfcnR6KGNoYXIzKTsKK3VzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDNfcnRwKGNoYXIzKTsKK3VzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDNfc2F0X3J0cChjaGFyMyk7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQzX3J0bihjaGFyMyk7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQzX3NhdF9ydG4oY2hhcjMpOwordXNob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0MyhjaGFyMyk7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQzX3NhdChjaGFyMyk7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQzX3J0ZSh1Y2hhcjMpOwordXNob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0M19zYXRfcnRlKHVjaGFyMyk7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQzX3J0eih1Y2hhcjMpOwordXNob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0M19zYXRfcnR6KHVjaGFyMyk7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQzX3J0cCh1Y2hhcjMpOwordXNob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0M19zYXRfcnRwKHVjaGFyMyk7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQzX3J0bih1Y2hhcjMpOwordXNob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0M19zYXRfcnRuKHVjaGFyMyk7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQzKHVjaGFyMyk7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQzX3NhdCh1Y2hhcjMpOwordXNob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0M19ydGUoc2hvcnQzKTsKK3VzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDNfc2F0X3J0ZShzaG9ydDMpOwordXNob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0M19ydHooc2hvcnQzKTsKK3VzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDNfc2F0X3J0eihzaG9ydDMpOwordXNob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0M19ydHAoc2hvcnQzKTsKK3VzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDNfc2F0X3J0cChzaG9ydDMpOwordXNob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0M19ydG4oc2hvcnQzKTsKK3VzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDNfc2F0X3J0bihzaG9ydDMpOwordXNob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0MyhzaG9ydDMpOwordXNob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0M19zYXQoc2hvcnQzKTsKK3VzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDNfcnRlKHVzaG9ydDMpOwordXNob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0M19zYXRfcnRlKHVzaG9ydDMpOwordXNob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0M19ydHoodXNob3J0Myk7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQzX3NhdF9ydHoodXNob3J0Myk7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQzX3J0cCh1c2hvcnQzKTsKK3VzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDNfc2F0X3J0cCh1c2hvcnQzKTsKK3VzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDNfcnRuKHVzaG9ydDMpOwordXNob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0M19zYXRfcnRuKHVzaG9ydDMpOwordXNob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0Myh1c2hvcnQzKTsKK3VzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDNfc2F0KHVzaG9ydDMpOwordXNob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0M19ydGUoaW50Myk7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQzX3NhdF9ydGUoaW50Myk7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQzX3J0eihpbnQzKTsKK3VzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDNfc2F0X3J0eihpbnQzKTsKK3VzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDNfcnRwKGludDMpOwordXNob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0M19zYXRfcnRwKGludDMpOwordXNob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0M19ydG4oaW50Myk7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQzX3NhdF9ydG4oaW50Myk7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQzKGludDMpOwordXNob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0M19zYXQoaW50Myk7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQzX3J0ZSh1aW50Myk7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQzX3NhdF9ydGUodWludDMpOwordXNob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0M19ydHoodWludDMpOwordXNob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0M19zYXRfcnR6KHVpbnQzKTsKK3VzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDNfcnRwKHVpbnQzKTsKK3VzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDNfc2F0X3J0cCh1aW50Myk7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQzX3J0bih1aW50Myk7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQzX3NhdF9ydG4odWludDMpOwordXNob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0Myh1aW50Myk7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQzX3NhdCh1aW50Myk7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQzX3J0ZShsb25nMyk7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQzX3NhdF9ydGUobG9uZzMpOwordXNob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0M19ydHoobG9uZzMpOwordXNob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0M19zYXRfcnR6KGxvbmczKTsKK3VzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDNfcnRwKGxvbmczKTsKK3VzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDNfc2F0X3J0cChsb25nMyk7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQzX3J0bihsb25nMyk7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQzX3NhdF9ydG4obG9uZzMpOwordXNob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0Myhsb25nMyk7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQzX3NhdChsb25nMyk7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQzX3J0ZSh1bG9uZzMpOwordXNob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0M19zYXRfcnRlKHVsb25nMyk7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQzX3J0eih1bG9uZzMpOwordXNob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0M19zYXRfcnR6KHVsb25nMyk7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQzX3J0cCh1bG9uZzMpOwordXNob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0M19zYXRfcnRwKHVsb25nMyk7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQzX3J0bih1bG9uZzMpOwordXNob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0M19zYXRfcnRuKHVsb25nMyk7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQzKHVsb25nMyk7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQzX3NhdCh1bG9uZzMpOwordXNob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0M19ydGUoZmxvYXQzKTsKK3VzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDNfc2F0X3J0ZShmbG9hdDMpOwordXNob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0M19ydHooZmxvYXQzKTsKK3VzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDNfc2F0X3J0eihmbG9hdDMpOwordXNob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0M19ydHAoZmxvYXQzKTsKK3VzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDNfc2F0X3J0cChmbG9hdDMpOwordXNob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0M19ydG4oZmxvYXQzKTsKK3VzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDNfc2F0X3J0bihmbG9hdDMpOwordXNob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0MyhmbG9hdDMpOwordXNob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0M19zYXQoZmxvYXQzKTsKK2ludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDNfcnRlKGNoYXIzKTsKK2ludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDNfc2F0X3J0ZShjaGFyMyk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQzX3J0eihjaGFyMyk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQzX3NhdF9ydHooY2hhcjMpOworaW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50M19ydHAoY2hhcjMpOworaW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50M19zYXRfcnRwKGNoYXIzKTsKK2ludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDNfcnRuKGNoYXIzKTsKK2ludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDNfc2F0X3J0bihjaGFyMyk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQzKGNoYXIzKTsKK2ludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDNfc2F0KGNoYXIzKTsKK2ludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDNfcnRlKHVjaGFyMyk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQzX3NhdF9ydGUodWNoYXIzKTsKK2ludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDNfcnR6KHVjaGFyMyk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQzX3NhdF9ydHoodWNoYXIzKTsKK2ludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDNfcnRwKHVjaGFyMyk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQzX3NhdF9ydHAodWNoYXIzKTsKK2ludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDNfcnRuKHVjaGFyMyk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQzX3NhdF9ydG4odWNoYXIzKTsKK2ludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDModWNoYXIzKTsKK2ludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDNfc2F0KHVjaGFyMyk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQzX3J0ZShzaG9ydDMpOworaW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50M19zYXRfcnRlKHNob3J0Myk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQzX3J0eihzaG9ydDMpOworaW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50M19zYXRfcnR6KHNob3J0Myk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQzX3J0cChzaG9ydDMpOworaW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50M19zYXRfcnRwKHNob3J0Myk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQzX3J0bihzaG9ydDMpOworaW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50M19zYXRfcnRuKHNob3J0Myk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQzKHNob3J0Myk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQzX3NhdChzaG9ydDMpOworaW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50M19ydGUodXNob3J0Myk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQzX3NhdF9ydGUodXNob3J0Myk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQzX3J0eih1c2hvcnQzKTsKK2ludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDNfc2F0X3J0eih1c2hvcnQzKTsKK2ludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDNfcnRwKHVzaG9ydDMpOworaW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50M19zYXRfcnRwKHVzaG9ydDMpOworaW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50M19ydG4odXNob3J0Myk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQzX3NhdF9ydG4odXNob3J0Myk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQzKHVzaG9ydDMpOworaW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50M19zYXQodXNob3J0Myk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQzX3J0ZShpbnQzKTsKK2ludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDNfc2F0X3J0ZShpbnQzKTsKK2ludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDNfcnR6KGludDMpOworaW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50M19zYXRfcnR6KGludDMpOworaW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50M19ydHAoaW50Myk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQzX3NhdF9ydHAoaW50Myk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQzX3J0bihpbnQzKTsKK2ludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDNfc2F0X3J0bihpbnQzKTsKK2ludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDMoaW50Myk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQzX3NhdChpbnQzKTsKK2ludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDNfcnRlKHVpbnQzKTsKK2ludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDNfc2F0X3J0ZSh1aW50Myk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQzX3J0eih1aW50Myk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQzX3NhdF9ydHoodWludDMpOworaW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50M19ydHAodWludDMpOworaW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50M19zYXRfcnRwKHVpbnQzKTsKK2ludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDNfcnRuKHVpbnQzKTsKK2ludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDNfc2F0X3J0bih1aW50Myk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQzKHVpbnQzKTsKK2ludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDNfc2F0KHVpbnQzKTsKK2ludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDNfcnRlKGxvbmczKTsKK2ludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDNfc2F0X3J0ZShsb25nMyk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQzX3J0eihsb25nMyk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQzX3NhdF9ydHoobG9uZzMpOworaW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50M19ydHAobG9uZzMpOworaW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50M19zYXRfcnRwKGxvbmczKTsKK2ludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDNfcnRuKGxvbmczKTsKK2ludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDNfc2F0X3J0bihsb25nMyk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQzKGxvbmczKTsKK2ludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDNfc2F0KGxvbmczKTsKK2ludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDNfcnRlKHVsb25nMyk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQzX3NhdF9ydGUodWxvbmczKTsKK2ludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDNfcnR6KHVsb25nMyk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQzX3NhdF9ydHoodWxvbmczKTsKK2ludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDNfcnRwKHVsb25nMyk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQzX3NhdF9ydHAodWxvbmczKTsKK2ludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDNfcnRuKHVsb25nMyk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQzX3NhdF9ydG4odWxvbmczKTsKK2ludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDModWxvbmczKTsKK2ludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDNfc2F0KHVsb25nMyk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQzX3J0ZShmbG9hdDMpOworaW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50M19zYXRfcnRlKGZsb2F0Myk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQzX3J0eihmbG9hdDMpOworaW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50M19zYXRfcnR6KGZsb2F0Myk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQzX3J0cChmbG9hdDMpOworaW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50M19zYXRfcnRwKGZsb2F0Myk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQzX3J0bihmbG9hdDMpOworaW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50M19zYXRfcnRuKGZsb2F0Myk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQzKGZsb2F0Myk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQzX3NhdChmbG9hdDMpOwordWludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQzX3J0ZShjaGFyMyk7Cit1aW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDNfc2F0X3J0ZShjaGFyMyk7Cit1aW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDNfcnR6KGNoYXIzKTsKK3VpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50M19zYXRfcnR6KGNoYXIzKTsKK3VpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50M19ydHAoY2hhcjMpOwordWludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQzX3NhdF9ydHAoY2hhcjMpOwordWludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQzX3J0bihjaGFyMyk7Cit1aW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDNfc2F0X3J0bihjaGFyMyk7Cit1aW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDMoY2hhcjMpOwordWludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQzX3NhdChjaGFyMyk7Cit1aW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDNfcnRlKHVjaGFyMyk7Cit1aW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDNfc2F0X3J0ZSh1Y2hhcjMpOwordWludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQzX3J0eih1Y2hhcjMpOwordWludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQzX3NhdF9ydHoodWNoYXIzKTsKK3VpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50M19ydHAodWNoYXIzKTsKK3VpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50M19zYXRfcnRwKHVjaGFyMyk7Cit1aW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDNfcnRuKHVjaGFyMyk7Cit1aW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDNfc2F0X3J0bih1Y2hhcjMpOwordWludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQzKHVjaGFyMyk7Cit1aW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDNfc2F0KHVjaGFyMyk7Cit1aW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDNfcnRlKHNob3J0Myk7Cit1aW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDNfc2F0X3J0ZShzaG9ydDMpOwordWludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQzX3J0eihzaG9ydDMpOwordWludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQzX3NhdF9ydHooc2hvcnQzKTsKK3VpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50M19ydHAoc2hvcnQzKTsKK3VpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50M19zYXRfcnRwKHNob3J0Myk7Cit1aW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDNfcnRuKHNob3J0Myk7Cit1aW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDNfc2F0X3J0bihzaG9ydDMpOwordWludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQzKHNob3J0Myk7Cit1aW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDNfc2F0KHNob3J0Myk7Cit1aW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDNfcnRlKHVzaG9ydDMpOwordWludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQzX3NhdF9ydGUodXNob3J0Myk7Cit1aW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDNfcnR6KHVzaG9ydDMpOwordWludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQzX3NhdF9ydHoodXNob3J0Myk7Cit1aW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDNfcnRwKHVzaG9ydDMpOwordWludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQzX3NhdF9ydHAodXNob3J0Myk7Cit1aW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDNfcnRuKHVzaG9ydDMpOwordWludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQzX3NhdF9ydG4odXNob3J0Myk7Cit1aW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDModXNob3J0Myk7Cit1aW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDNfc2F0KHVzaG9ydDMpOwordWludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQzX3J0ZShpbnQzKTsKK3VpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50M19zYXRfcnRlKGludDMpOwordWludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQzX3J0eihpbnQzKTsKK3VpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50M19zYXRfcnR6KGludDMpOwordWludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQzX3J0cChpbnQzKTsKK3VpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50M19zYXRfcnRwKGludDMpOwordWludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQzX3J0bihpbnQzKTsKK3VpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50M19zYXRfcnRuKGludDMpOwordWludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQzKGludDMpOwordWludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQzX3NhdChpbnQzKTsKK3VpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50M19ydGUodWludDMpOwordWludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQzX3NhdF9ydGUodWludDMpOwordWludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQzX3J0eih1aW50Myk7Cit1aW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDNfc2F0X3J0eih1aW50Myk7Cit1aW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDNfcnRwKHVpbnQzKTsKK3VpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50M19zYXRfcnRwKHVpbnQzKTsKK3VpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50M19ydG4odWludDMpOwordWludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQzX3NhdF9ydG4odWludDMpOwordWludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQzKHVpbnQzKTsKK3VpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50M19zYXQodWludDMpOwordWludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQzX3J0ZShsb25nMyk7Cit1aW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDNfc2F0X3J0ZShsb25nMyk7Cit1aW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDNfcnR6KGxvbmczKTsKK3VpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50M19zYXRfcnR6KGxvbmczKTsKK3VpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50M19ydHAobG9uZzMpOwordWludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQzX3NhdF9ydHAobG9uZzMpOwordWludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQzX3J0bihsb25nMyk7Cit1aW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDNfc2F0X3J0bihsb25nMyk7Cit1aW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDMobG9uZzMpOwordWludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQzX3NhdChsb25nMyk7Cit1aW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDNfcnRlKHVsb25nMyk7Cit1aW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDNfc2F0X3J0ZSh1bG9uZzMpOwordWludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQzX3J0eih1bG9uZzMpOwordWludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQzX3NhdF9ydHoodWxvbmczKTsKK3VpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50M19ydHAodWxvbmczKTsKK3VpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50M19zYXRfcnRwKHVsb25nMyk7Cit1aW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDNfcnRuKHVsb25nMyk7Cit1aW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDNfc2F0X3J0bih1bG9uZzMpOwordWludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQzKHVsb25nMyk7Cit1aW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDNfc2F0KHVsb25nMyk7Cit1aW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDNfcnRlKGZsb2F0Myk7Cit1aW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDNfc2F0X3J0ZShmbG9hdDMpOwordWludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQzX3J0eihmbG9hdDMpOwordWludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQzX3NhdF9ydHooZmxvYXQzKTsKK3VpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50M19ydHAoZmxvYXQzKTsKK3VpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50M19zYXRfcnRwKGZsb2F0Myk7Cit1aW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDNfcnRuKGZsb2F0Myk7Cit1aW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDNfc2F0X3J0bihmbG9hdDMpOwordWludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQzKGZsb2F0Myk7Cit1aW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDNfc2F0KGZsb2F0Myk7Citsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzNfcnRlKGNoYXIzKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nM19zYXRfcnRlKGNoYXIzKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nM19ydHooY2hhcjMpOworbG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmczX3NhdF9ydHooY2hhcjMpOworbG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmczX3J0cChjaGFyMyk7Citsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzNfc2F0X3J0cChjaGFyMyk7Citsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzNfcnRuKGNoYXIzKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nM19zYXRfcnRuKGNoYXIzKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMyhjaGFyMyk7Citsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzNfc2F0KGNoYXIzKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nM19ydGUodWNoYXIzKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nM19zYXRfcnRlKHVjaGFyMyk7Citsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzNfcnR6KHVjaGFyMyk7Citsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzNfc2F0X3J0eih1Y2hhcjMpOworbG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmczX3J0cCh1Y2hhcjMpOworbG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmczX3NhdF9ydHAodWNoYXIzKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nM19ydG4odWNoYXIzKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nM19zYXRfcnRuKHVjaGFyMyk7Citsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzModWNoYXIzKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nM19zYXQodWNoYXIzKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nM19ydGUoc2hvcnQzKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nM19zYXRfcnRlKHNob3J0Myk7Citsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzNfcnR6KHNob3J0Myk7Citsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzNfc2F0X3J0eihzaG9ydDMpOworbG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmczX3J0cChzaG9ydDMpOworbG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmczX3NhdF9ydHAoc2hvcnQzKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nM19ydG4oc2hvcnQzKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nM19zYXRfcnRuKHNob3J0Myk7Citsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzMoc2hvcnQzKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nM19zYXQoc2hvcnQzKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nM19ydGUodXNob3J0Myk7Citsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzNfc2F0X3J0ZSh1c2hvcnQzKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nM19ydHoodXNob3J0Myk7Citsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzNfc2F0X3J0eih1c2hvcnQzKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nM19ydHAodXNob3J0Myk7Citsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzNfc2F0X3J0cCh1c2hvcnQzKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nM19ydG4odXNob3J0Myk7Citsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzNfc2F0X3J0bih1c2hvcnQzKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMyh1c2hvcnQzKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nM19zYXQodXNob3J0Myk7Citsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzNfcnRlKGludDMpOworbG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmczX3NhdF9ydGUoaW50Myk7Citsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzNfcnR6KGludDMpOworbG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmczX3NhdF9ydHooaW50Myk7Citsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzNfcnRwKGludDMpOworbG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmczX3NhdF9ydHAoaW50Myk7Citsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzNfcnRuKGludDMpOworbG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmczX3NhdF9ydG4oaW50Myk7Citsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzMoaW50Myk7Citsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzNfc2F0KGludDMpOworbG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmczX3J0ZSh1aW50Myk7Citsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzNfc2F0X3J0ZSh1aW50Myk7Citsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzNfcnR6KHVpbnQzKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nM19zYXRfcnR6KHVpbnQzKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nM19ydHAodWludDMpOworbG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmczX3NhdF9ydHAodWludDMpOworbG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmczX3J0bih1aW50Myk7Citsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzNfc2F0X3J0bih1aW50Myk7Citsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzModWludDMpOworbG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmczX3NhdCh1aW50Myk7Citsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzNfcnRlKGxvbmczKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nM19zYXRfcnRlKGxvbmczKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nM19ydHoobG9uZzMpOworbG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmczX3NhdF9ydHoobG9uZzMpOworbG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmczX3J0cChsb25nMyk7Citsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzNfc2F0X3J0cChsb25nMyk7Citsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzNfcnRuKGxvbmczKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nM19zYXRfcnRuKGxvbmczKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMyhsb25nMyk7Citsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzNfc2F0KGxvbmczKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nM19ydGUodWxvbmczKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nM19zYXRfcnRlKHVsb25nMyk7Citsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzNfcnR6KHVsb25nMyk7Citsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzNfc2F0X3J0eih1bG9uZzMpOworbG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmczX3J0cCh1bG9uZzMpOworbG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmczX3NhdF9ydHAodWxvbmczKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nM19ydG4odWxvbmczKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nM19zYXRfcnRuKHVsb25nMyk7Citsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzModWxvbmczKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nM19zYXQodWxvbmczKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nM19ydGUoZmxvYXQzKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nM19zYXRfcnRlKGZsb2F0Myk7Citsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzNfcnR6KGZsb2F0Myk7Citsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzNfc2F0X3J0eihmbG9hdDMpOworbG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmczX3J0cChmbG9hdDMpOworbG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmczX3NhdF9ydHAoZmxvYXQzKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nM19ydG4oZmxvYXQzKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nM19zYXRfcnRuKGZsb2F0Myk7Citsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzMoZmxvYXQzKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nM19zYXQoZmxvYXQzKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmczX3J0ZShjaGFyMyk7Cit1bG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nM19zYXRfcnRlKGNoYXIzKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmczX3J0eihjaGFyMyk7Cit1bG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nM19zYXRfcnR6KGNoYXIzKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmczX3J0cChjaGFyMyk7Cit1bG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nM19zYXRfcnRwKGNoYXIzKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmczX3J0bihjaGFyMyk7Cit1bG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nM19zYXRfcnRuKGNoYXIzKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmczKGNoYXIzKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmczX3NhdChjaGFyMyk7Cit1bG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nM19ydGUodWNoYXIzKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmczX3NhdF9ydGUodWNoYXIzKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmczX3J0eih1Y2hhcjMpOwordWxvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzNfc2F0X3J0eih1Y2hhcjMpOwordWxvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzNfcnRwKHVjaGFyMyk7Cit1bG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nM19zYXRfcnRwKHVjaGFyMyk7Cit1bG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nM19ydG4odWNoYXIzKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmczX3NhdF9ydG4odWNoYXIzKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmczKHVjaGFyMyk7Cit1bG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nM19zYXQodWNoYXIzKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmczX3J0ZShzaG9ydDMpOwordWxvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzNfc2F0X3J0ZShzaG9ydDMpOwordWxvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzNfcnR6KHNob3J0Myk7Cit1bG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nM19zYXRfcnR6KHNob3J0Myk7Cit1bG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nM19ydHAoc2hvcnQzKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmczX3NhdF9ydHAoc2hvcnQzKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmczX3J0bihzaG9ydDMpOwordWxvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzNfc2F0X3J0bihzaG9ydDMpOwordWxvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzMoc2hvcnQzKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmczX3NhdChzaG9ydDMpOwordWxvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzNfcnRlKHVzaG9ydDMpOwordWxvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzNfc2F0X3J0ZSh1c2hvcnQzKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmczX3J0eih1c2hvcnQzKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmczX3NhdF9ydHoodXNob3J0Myk7Cit1bG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nM19ydHAodXNob3J0Myk7Cit1bG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nM19zYXRfcnRwKHVzaG9ydDMpOwordWxvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzNfcnRuKHVzaG9ydDMpOwordWxvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzNfc2F0X3J0bih1c2hvcnQzKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmczKHVzaG9ydDMpOwordWxvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzNfc2F0KHVzaG9ydDMpOwordWxvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzNfcnRlKGludDMpOwordWxvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzNfc2F0X3J0ZShpbnQzKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmczX3J0eihpbnQzKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmczX3NhdF9ydHooaW50Myk7Cit1bG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nM19ydHAoaW50Myk7Cit1bG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nM19zYXRfcnRwKGludDMpOwordWxvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzNfcnRuKGludDMpOwordWxvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzNfc2F0X3J0bihpbnQzKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmczKGludDMpOwordWxvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzNfc2F0KGludDMpOwordWxvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzNfcnRlKHVpbnQzKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmczX3NhdF9ydGUodWludDMpOwordWxvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzNfcnR6KHVpbnQzKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmczX3NhdF9ydHoodWludDMpOwordWxvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzNfcnRwKHVpbnQzKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmczX3NhdF9ydHAodWludDMpOwordWxvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzNfcnRuKHVpbnQzKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmczX3NhdF9ydG4odWludDMpOwordWxvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzModWludDMpOwordWxvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzNfc2F0KHVpbnQzKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmczX3J0ZShsb25nMyk7Cit1bG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nM19zYXRfcnRlKGxvbmczKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmczX3J0eihsb25nMyk7Cit1bG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nM19zYXRfcnR6KGxvbmczKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmczX3J0cChsb25nMyk7Cit1bG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nM19zYXRfcnRwKGxvbmczKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmczX3J0bihsb25nMyk7Cit1bG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nM19zYXRfcnRuKGxvbmczKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmczKGxvbmczKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmczX3NhdChsb25nMyk7Cit1bG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nM19ydGUodWxvbmczKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmczX3NhdF9ydGUodWxvbmczKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmczX3J0eih1bG9uZzMpOwordWxvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzNfc2F0X3J0eih1bG9uZzMpOwordWxvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzNfcnRwKHVsb25nMyk7Cit1bG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nM19zYXRfcnRwKHVsb25nMyk7Cit1bG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nM19ydG4odWxvbmczKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmczX3NhdF9ydG4odWxvbmczKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmczKHVsb25nMyk7Cit1bG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nM19zYXQodWxvbmczKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmczX3J0ZShmbG9hdDMpOwordWxvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzNfc2F0X3J0ZShmbG9hdDMpOwordWxvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzNfcnR6KGZsb2F0Myk7Cit1bG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nM19zYXRfcnR6KGZsb2F0Myk7Cit1bG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nM19ydHAoZmxvYXQzKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmczX3NhdF9ydHAoZmxvYXQzKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmczX3J0bihmbG9hdDMpOwordWxvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzNfc2F0X3J0bihmbG9hdDMpOwordWxvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzMoZmxvYXQzKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmczX3NhdChmbG9hdDMpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDNfcnRlKGNoYXIzKTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQzX3J0eihjaGFyMyk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0M19ydHAoY2hhcjMpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDNfcnRuKGNoYXIzKTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQzKGNoYXIzKTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQzX3J0ZSh1Y2hhcjMpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDNfcnR6KHVjaGFyMyk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0M19ydHAodWNoYXIzKTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQzX3J0bih1Y2hhcjMpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDModWNoYXIzKTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQzX3J0ZShzaG9ydDMpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDNfcnR6KHNob3J0Myk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0M19ydHAoc2hvcnQzKTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQzX3J0bihzaG9ydDMpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDMoc2hvcnQzKTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQzX3J0ZSh1c2hvcnQzKTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQzX3J0eih1c2hvcnQzKTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQzX3J0cCh1c2hvcnQzKTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQzX3J0bih1c2hvcnQzKTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQzKHVzaG9ydDMpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDNfcnRlKGludDMpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDNfcnR6KGludDMpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDNfcnRwKGludDMpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDNfcnRuKGludDMpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDMoaW50Myk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0M19ydGUodWludDMpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDNfcnR6KHVpbnQzKTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQzX3J0cCh1aW50Myk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0M19ydG4odWludDMpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDModWludDMpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDNfcnRlKGxvbmczKTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQzX3J0eihsb25nMyk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0M19ydHAobG9uZzMpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDNfcnRuKGxvbmczKTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQzKGxvbmczKTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQzX3J0ZSh1bG9uZzMpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDNfcnR6KHVsb25nMyk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0M19ydHAodWxvbmczKTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQzX3J0bih1bG9uZzMpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDModWxvbmczKTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQzX3J0ZShmbG9hdDMpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDNfcnR6KGZsb2F0Myk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0M19ydHAoZmxvYXQzKTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQzX3J0bihmbG9hdDMpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDMoZmxvYXQzKTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyNF9ydGUoY2hhcjQpOworY2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI0X3NhdF9ydGUoY2hhcjQpOworY2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI0X3J0eihjaGFyNCk7CitjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjRfc2F0X3J0eihjaGFyNCk7CitjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjRfcnRwKGNoYXI0KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyNF9zYXRfcnRwKGNoYXI0KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyNF9ydG4oY2hhcjQpOworY2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI0X3NhdF9ydG4oY2hhcjQpOworY2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI0KGNoYXI0KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyNF9zYXQoY2hhcjQpOworY2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI0X3J0ZSh1Y2hhcjQpOworY2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI0X3NhdF9ydGUodWNoYXI0KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyNF9ydHoodWNoYXI0KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyNF9zYXRfcnR6KHVjaGFyNCk7CitjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjRfcnRwKHVjaGFyNCk7CitjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjRfc2F0X3J0cCh1Y2hhcjQpOworY2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI0X3J0bih1Y2hhcjQpOworY2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI0X3NhdF9ydG4odWNoYXI0KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyNCh1Y2hhcjQpOworY2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI0X3NhdCh1Y2hhcjQpOworY2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI0X3J0ZShzaG9ydDQpOworY2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI0X3NhdF9ydGUoc2hvcnQ0KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyNF9ydHooc2hvcnQ0KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyNF9zYXRfcnR6KHNob3J0NCk7CitjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjRfcnRwKHNob3J0NCk7CitjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjRfc2F0X3J0cChzaG9ydDQpOworY2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI0X3J0bihzaG9ydDQpOworY2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI0X3NhdF9ydG4oc2hvcnQ0KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyNChzaG9ydDQpOworY2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI0X3NhdChzaG9ydDQpOworY2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI0X3J0ZSh1c2hvcnQ0KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyNF9zYXRfcnRlKHVzaG9ydDQpOworY2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI0X3J0eih1c2hvcnQ0KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyNF9zYXRfcnR6KHVzaG9ydDQpOworY2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI0X3J0cCh1c2hvcnQ0KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyNF9zYXRfcnRwKHVzaG9ydDQpOworY2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI0X3J0bih1c2hvcnQ0KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyNF9zYXRfcnRuKHVzaG9ydDQpOworY2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI0KHVzaG9ydDQpOworY2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI0X3NhdCh1c2hvcnQ0KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyNF9ydGUoaW50NCk7CitjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjRfc2F0X3J0ZShpbnQ0KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyNF9ydHooaW50NCk7CitjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjRfc2F0X3J0eihpbnQ0KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyNF9ydHAoaW50NCk7CitjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjRfc2F0X3J0cChpbnQ0KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyNF9ydG4oaW50NCk7CitjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjRfc2F0X3J0bihpbnQ0KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyNChpbnQ0KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyNF9zYXQoaW50NCk7CitjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjRfcnRlKHVpbnQ0KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyNF9zYXRfcnRlKHVpbnQ0KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyNF9ydHoodWludDQpOworY2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI0X3NhdF9ydHoodWludDQpOworY2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI0X3J0cCh1aW50NCk7CitjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjRfc2F0X3J0cCh1aW50NCk7CitjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjRfcnRuKHVpbnQ0KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyNF9zYXRfcnRuKHVpbnQ0KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyNCh1aW50NCk7CitjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjRfc2F0KHVpbnQ0KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyNF9ydGUobG9uZzQpOworY2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI0X3NhdF9ydGUobG9uZzQpOworY2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI0X3J0eihsb25nNCk7CitjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjRfc2F0X3J0eihsb25nNCk7CitjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjRfcnRwKGxvbmc0KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyNF9zYXRfcnRwKGxvbmc0KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyNF9ydG4obG9uZzQpOworY2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI0X3NhdF9ydG4obG9uZzQpOworY2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI0KGxvbmc0KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyNF9zYXQobG9uZzQpOworY2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI0X3J0ZSh1bG9uZzQpOworY2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI0X3NhdF9ydGUodWxvbmc0KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyNF9ydHoodWxvbmc0KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyNF9zYXRfcnR6KHVsb25nNCk7CitjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjRfcnRwKHVsb25nNCk7CitjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjRfc2F0X3J0cCh1bG9uZzQpOworY2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI0X3J0bih1bG9uZzQpOworY2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI0X3NhdF9ydG4odWxvbmc0KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyNCh1bG9uZzQpOworY2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI0X3NhdCh1bG9uZzQpOworY2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI0X3J0ZShmbG9hdDQpOworY2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI0X3NhdF9ydGUoZmxvYXQ0KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyNF9ydHooZmxvYXQ0KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyNF9zYXRfcnR6KGZsb2F0NCk7CitjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjRfcnRwKGZsb2F0NCk7CitjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjRfc2F0X3J0cChmbG9hdDQpOworY2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI0X3J0bihmbG9hdDQpOworY2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI0X3NhdF9ydG4oZmxvYXQ0KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyNChmbG9hdDQpOworY2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI0X3NhdChmbG9hdDQpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjRfcnRlKGNoYXI0KTsKK3VjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI0X3NhdF9ydGUoY2hhcjQpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjRfcnR6KGNoYXI0KTsKK3VjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI0X3NhdF9ydHooY2hhcjQpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjRfcnRwKGNoYXI0KTsKK3VjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI0X3NhdF9ydHAoY2hhcjQpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjRfcnRuKGNoYXI0KTsKK3VjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI0X3NhdF9ydG4oY2hhcjQpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjQoY2hhcjQpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjRfc2F0KGNoYXI0KTsKK3VjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI0X3J0ZSh1Y2hhcjQpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjRfc2F0X3J0ZSh1Y2hhcjQpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjRfcnR6KHVjaGFyNCk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyNF9zYXRfcnR6KHVjaGFyNCk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyNF9ydHAodWNoYXI0KTsKK3VjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI0X3NhdF9ydHAodWNoYXI0KTsKK3VjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI0X3J0bih1Y2hhcjQpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjRfc2F0X3J0bih1Y2hhcjQpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjQodWNoYXI0KTsKK3VjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI0X3NhdCh1Y2hhcjQpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjRfcnRlKHNob3J0NCk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyNF9zYXRfcnRlKHNob3J0NCk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyNF9ydHooc2hvcnQ0KTsKK3VjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI0X3NhdF9ydHooc2hvcnQ0KTsKK3VjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI0X3J0cChzaG9ydDQpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjRfc2F0X3J0cChzaG9ydDQpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjRfcnRuKHNob3J0NCk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyNF9zYXRfcnRuKHNob3J0NCk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyNChzaG9ydDQpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjRfc2F0KHNob3J0NCk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyNF9ydGUodXNob3J0NCk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyNF9zYXRfcnRlKHVzaG9ydDQpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjRfcnR6KHVzaG9ydDQpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjRfc2F0X3J0eih1c2hvcnQ0KTsKK3VjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI0X3J0cCh1c2hvcnQ0KTsKK3VjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI0X3NhdF9ydHAodXNob3J0NCk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyNF9ydG4odXNob3J0NCk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyNF9zYXRfcnRuKHVzaG9ydDQpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjQodXNob3J0NCk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyNF9zYXQodXNob3J0NCk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyNF9ydGUoaW50NCk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyNF9zYXRfcnRlKGludDQpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjRfcnR6KGludDQpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjRfc2F0X3J0eihpbnQ0KTsKK3VjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI0X3J0cChpbnQ0KTsKK3VjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI0X3NhdF9ydHAoaW50NCk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyNF9ydG4oaW50NCk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyNF9zYXRfcnRuKGludDQpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjQoaW50NCk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyNF9zYXQoaW50NCk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyNF9ydGUodWludDQpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjRfc2F0X3J0ZSh1aW50NCk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyNF9ydHoodWludDQpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjRfc2F0X3J0eih1aW50NCk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyNF9ydHAodWludDQpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjRfc2F0X3J0cCh1aW50NCk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyNF9ydG4odWludDQpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjRfc2F0X3J0bih1aW50NCk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyNCh1aW50NCk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyNF9zYXQodWludDQpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjRfcnRlKGxvbmc0KTsKK3VjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI0X3NhdF9ydGUobG9uZzQpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjRfcnR6KGxvbmc0KTsKK3VjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI0X3NhdF9ydHoobG9uZzQpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjRfcnRwKGxvbmc0KTsKK3VjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI0X3NhdF9ydHAobG9uZzQpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjRfcnRuKGxvbmc0KTsKK3VjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI0X3NhdF9ydG4obG9uZzQpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjQobG9uZzQpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjRfc2F0KGxvbmc0KTsKK3VjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI0X3J0ZSh1bG9uZzQpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjRfc2F0X3J0ZSh1bG9uZzQpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjRfcnR6KHVsb25nNCk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyNF9zYXRfcnR6KHVsb25nNCk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyNF9ydHAodWxvbmc0KTsKK3VjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI0X3NhdF9ydHAodWxvbmc0KTsKK3VjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI0X3J0bih1bG9uZzQpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjRfc2F0X3J0bih1bG9uZzQpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjQodWxvbmc0KTsKK3VjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI0X3NhdCh1bG9uZzQpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjRfcnRlKGZsb2F0NCk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyNF9zYXRfcnRlKGZsb2F0NCk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyNF9ydHooZmxvYXQ0KTsKK3VjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI0X3NhdF9ydHooZmxvYXQ0KTsKK3VjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI0X3J0cChmbG9hdDQpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjRfc2F0X3J0cChmbG9hdDQpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjRfcnRuKGZsb2F0NCk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyNF9zYXRfcnRuKGZsb2F0NCk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyNChmbG9hdDQpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjRfc2F0KGZsb2F0NCk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0NF9ydGUoY2hhcjQpOworc2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDRfc2F0X3J0ZShjaGFyNCk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0NF9ydHooY2hhcjQpOworc2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDRfc2F0X3J0eihjaGFyNCk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0NF9ydHAoY2hhcjQpOworc2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDRfc2F0X3J0cChjaGFyNCk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0NF9ydG4oY2hhcjQpOworc2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDRfc2F0X3J0bihjaGFyNCk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0NChjaGFyNCk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0NF9zYXQoY2hhcjQpOworc2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDRfcnRlKHVjaGFyNCk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0NF9zYXRfcnRlKHVjaGFyNCk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0NF9ydHoodWNoYXI0KTsKK3Nob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ0X3NhdF9ydHoodWNoYXI0KTsKK3Nob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ0X3J0cCh1Y2hhcjQpOworc2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDRfc2F0X3J0cCh1Y2hhcjQpOworc2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDRfcnRuKHVjaGFyNCk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0NF9zYXRfcnRuKHVjaGFyNCk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0NCh1Y2hhcjQpOworc2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDRfc2F0KHVjaGFyNCk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0NF9ydGUoc2hvcnQ0KTsKK3Nob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ0X3NhdF9ydGUoc2hvcnQ0KTsKK3Nob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ0X3J0eihzaG9ydDQpOworc2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDRfc2F0X3J0eihzaG9ydDQpOworc2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDRfcnRwKHNob3J0NCk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0NF9zYXRfcnRwKHNob3J0NCk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0NF9ydG4oc2hvcnQ0KTsKK3Nob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ0X3NhdF9ydG4oc2hvcnQ0KTsKK3Nob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ0KHNob3J0NCk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0NF9zYXQoc2hvcnQ0KTsKK3Nob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ0X3J0ZSh1c2hvcnQ0KTsKK3Nob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ0X3NhdF9ydGUodXNob3J0NCk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0NF9ydHoodXNob3J0NCk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0NF9zYXRfcnR6KHVzaG9ydDQpOworc2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDRfcnRwKHVzaG9ydDQpOworc2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDRfc2F0X3J0cCh1c2hvcnQ0KTsKK3Nob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ0X3J0bih1c2hvcnQ0KTsKK3Nob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ0X3NhdF9ydG4odXNob3J0NCk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0NCh1c2hvcnQ0KTsKK3Nob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ0X3NhdCh1c2hvcnQ0KTsKK3Nob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ0X3J0ZShpbnQ0KTsKK3Nob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ0X3NhdF9ydGUoaW50NCk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0NF9ydHooaW50NCk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0NF9zYXRfcnR6KGludDQpOworc2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDRfcnRwKGludDQpOworc2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDRfc2F0X3J0cChpbnQ0KTsKK3Nob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ0X3J0bihpbnQ0KTsKK3Nob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ0X3NhdF9ydG4oaW50NCk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0NChpbnQ0KTsKK3Nob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ0X3NhdChpbnQ0KTsKK3Nob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ0X3J0ZSh1aW50NCk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0NF9zYXRfcnRlKHVpbnQ0KTsKK3Nob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ0X3J0eih1aW50NCk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0NF9zYXRfcnR6KHVpbnQ0KTsKK3Nob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ0X3J0cCh1aW50NCk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0NF9zYXRfcnRwKHVpbnQ0KTsKK3Nob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ0X3J0bih1aW50NCk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0NF9zYXRfcnRuKHVpbnQ0KTsKK3Nob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ0KHVpbnQ0KTsKK3Nob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ0X3NhdCh1aW50NCk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0NF9ydGUobG9uZzQpOworc2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDRfc2F0X3J0ZShsb25nNCk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0NF9ydHoobG9uZzQpOworc2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDRfc2F0X3J0eihsb25nNCk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0NF9ydHAobG9uZzQpOworc2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDRfc2F0X3J0cChsb25nNCk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0NF9ydG4obG9uZzQpOworc2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDRfc2F0X3J0bihsb25nNCk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0NChsb25nNCk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0NF9zYXQobG9uZzQpOworc2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDRfcnRlKHVsb25nNCk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0NF9zYXRfcnRlKHVsb25nNCk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0NF9ydHoodWxvbmc0KTsKK3Nob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ0X3NhdF9ydHoodWxvbmc0KTsKK3Nob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ0X3J0cCh1bG9uZzQpOworc2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDRfc2F0X3J0cCh1bG9uZzQpOworc2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDRfcnRuKHVsb25nNCk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0NF9zYXRfcnRuKHVsb25nNCk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0NCh1bG9uZzQpOworc2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDRfc2F0KHVsb25nNCk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0NF9ydGUoZmxvYXQ0KTsKK3Nob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ0X3NhdF9ydGUoZmxvYXQ0KTsKK3Nob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ0X3J0eihmbG9hdDQpOworc2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDRfc2F0X3J0eihmbG9hdDQpOworc2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDRfcnRwKGZsb2F0NCk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0NF9zYXRfcnRwKGZsb2F0NCk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0NF9ydG4oZmxvYXQ0KTsKK3Nob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ0X3NhdF9ydG4oZmxvYXQ0KTsKK3Nob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ0KGZsb2F0NCk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0NF9zYXQoZmxvYXQ0KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDRfcnRlKGNoYXI0KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDRfc2F0X3J0ZShjaGFyNCk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ0X3J0eihjaGFyNCk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ0X3NhdF9ydHooY2hhcjQpOwordXNob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0NF9ydHAoY2hhcjQpOwordXNob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0NF9zYXRfcnRwKGNoYXI0KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDRfcnRuKGNoYXI0KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDRfc2F0X3J0bihjaGFyNCk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ0KGNoYXI0KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDRfc2F0KGNoYXI0KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDRfcnRlKHVjaGFyNCk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ0X3NhdF9ydGUodWNoYXI0KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDRfcnR6KHVjaGFyNCk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ0X3NhdF9ydHoodWNoYXI0KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDRfcnRwKHVjaGFyNCk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ0X3NhdF9ydHAodWNoYXI0KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDRfcnRuKHVjaGFyNCk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ0X3NhdF9ydG4odWNoYXI0KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDQodWNoYXI0KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDRfc2F0KHVjaGFyNCk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ0X3J0ZShzaG9ydDQpOwordXNob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0NF9zYXRfcnRlKHNob3J0NCk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ0X3J0eihzaG9ydDQpOwordXNob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0NF9zYXRfcnR6KHNob3J0NCk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ0X3J0cChzaG9ydDQpOwordXNob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0NF9zYXRfcnRwKHNob3J0NCk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ0X3J0bihzaG9ydDQpOwordXNob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0NF9zYXRfcnRuKHNob3J0NCk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ0KHNob3J0NCk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ0X3NhdChzaG9ydDQpOwordXNob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0NF9ydGUodXNob3J0NCk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ0X3NhdF9ydGUodXNob3J0NCk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ0X3J0eih1c2hvcnQ0KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDRfc2F0X3J0eih1c2hvcnQ0KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDRfcnRwKHVzaG9ydDQpOwordXNob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0NF9zYXRfcnRwKHVzaG9ydDQpOwordXNob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0NF9ydG4odXNob3J0NCk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ0X3NhdF9ydG4odXNob3J0NCk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ0KHVzaG9ydDQpOwordXNob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0NF9zYXQodXNob3J0NCk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ0X3J0ZShpbnQ0KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDRfc2F0X3J0ZShpbnQ0KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDRfcnR6KGludDQpOwordXNob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0NF9zYXRfcnR6KGludDQpOwordXNob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0NF9ydHAoaW50NCk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ0X3NhdF9ydHAoaW50NCk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ0X3J0bihpbnQ0KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDRfc2F0X3J0bihpbnQ0KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDQoaW50NCk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ0X3NhdChpbnQ0KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDRfcnRlKHVpbnQ0KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDRfc2F0X3J0ZSh1aW50NCk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ0X3J0eih1aW50NCk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ0X3NhdF9ydHoodWludDQpOwordXNob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0NF9ydHAodWludDQpOwordXNob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0NF9zYXRfcnRwKHVpbnQ0KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDRfcnRuKHVpbnQ0KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDRfc2F0X3J0bih1aW50NCk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ0KHVpbnQ0KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDRfc2F0KHVpbnQ0KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDRfcnRlKGxvbmc0KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDRfc2F0X3J0ZShsb25nNCk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ0X3J0eihsb25nNCk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ0X3NhdF9ydHoobG9uZzQpOwordXNob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0NF9ydHAobG9uZzQpOwordXNob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0NF9zYXRfcnRwKGxvbmc0KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDRfcnRuKGxvbmc0KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDRfc2F0X3J0bihsb25nNCk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ0KGxvbmc0KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDRfc2F0KGxvbmc0KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDRfcnRlKHVsb25nNCk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ0X3NhdF9ydGUodWxvbmc0KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDRfcnR6KHVsb25nNCk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ0X3NhdF9ydHoodWxvbmc0KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDRfcnRwKHVsb25nNCk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ0X3NhdF9ydHAodWxvbmc0KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDRfcnRuKHVsb25nNCk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ0X3NhdF9ydG4odWxvbmc0KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDQodWxvbmc0KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDRfc2F0KHVsb25nNCk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ0X3J0ZShmbG9hdDQpOwordXNob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0NF9zYXRfcnRlKGZsb2F0NCk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ0X3J0eihmbG9hdDQpOwordXNob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0NF9zYXRfcnR6KGZsb2F0NCk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ0X3J0cChmbG9hdDQpOwordXNob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0NF9zYXRfcnRwKGZsb2F0NCk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ0X3J0bihmbG9hdDQpOwordXNob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0NF9zYXRfcnRuKGZsb2F0NCk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ0KGZsb2F0NCk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ0X3NhdChmbG9hdDQpOworaW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50NF9ydGUoY2hhcjQpOworaW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50NF9zYXRfcnRlKGNoYXI0KTsKK2ludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDRfcnR6KGNoYXI0KTsKK2ludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDRfc2F0X3J0eihjaGFyNCk7CitpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ0X3J0cChjaGFyNCk7CitpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ0X3NhdF9ydHAoY2hhcjQpOworaW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50NF9ydG4oY2hhcjQpOworaW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50NF9zYXRfcnRuKGNoYXI0KTsKK2ludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDQoY2hhcjQpOworaW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50NF9zYXQoY2hhcjQpOworaW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50NF9ydGUodWNoYXI0KTsKK2ludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDRfc2F0X3J0ZSh1Y2hhcjQpOworaW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50NF9ydHoodWNoYXI0KTsKK2ludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDRfc2F0X3J0eih1Y2hhcjQpOworaW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50NF9ydHAodWNoYXI0KTsKK2ludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDRfc2F0X3J0cCh1Y2hhcjQpOworaW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50NF9ydG4odWNoYXI0KTsKK2ludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDRfc2F0X3J0bih1Y2hhcjQpOworaW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50NCh1Y2hhcjQpOworaW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50NF9zYXQodWNoYXI0KTsKK2ludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDRfcnRlKHNob3J0NCk7CitpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ0X3NhdF9ydGUoc2hvcnQ0KTsKK2ludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDRfcnR6KHNob3J0NCk7CitpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ0X3NhdF9ydHooc2hvcnQ0KTsKK2ludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDRfcnRwKHNob3J0NCk7CitpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ0X3NhdF9ydHAoc2hvcnQ0KTsKK2ludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDRfcnRuKHNob3J0NCk7CitpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ0X3NhdF9ydG4oc2hvcnQ0KTsKK2ludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDQoc2hvcnQ0KTsKK2ludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDRfc2F0KHNob3J0NCk7CitpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ0X3J0ZSh1c2hvcnQ0KTsKK2ludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDRfc2F0X3J0ZSh1c2hvcnQ0KTsKK2ludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDRfcnR6KHVzaG9ydDQpOworaW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50NF9zYXRfcnR6KHVzaG9ydDQpOworaW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50NF9ydHAodXNob3J0NCk7CitpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ0X3NhdF9ydHAodXNob3J0NCk7CitpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ0X3J0bih1c2hvcnQ0KTsKK2ludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDRfc2F0X3J0bih1c2hvcnQ0KTsKK2ludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDQodXNob3J0NCk7CitpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ0X3NhdCh1c2hvcnQ0KTsKK2ludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDRfcnRlKGludDQpOworaW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50NF9zYXRfcnRlKGludDQpOworaW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50NF9ydHooaW50NCk7CitpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ0X3NhdF9ydHooaW50NCk7CitpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ0X3J0cChpbnQ0KTsKK2ludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDRfc2F0X3J0cChpbnQ0KTsKK2ludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDRfcnRuKGludDQpOworaW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50NF9zYXRfcnRuKGludDQpOworaW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50NChpbnQ0KTsKK2ludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDRfc2F0KGludDQpOworaW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50NF9ydGUodWludDQpOworaW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50NF9zYXRfcnRlKHVpbnQ0KTsKK2ludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDRfcnR6KHVpbnQ0KTsKK2ludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDRfc2F0X3J0eih1aW50NCk7CitpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ0X3J0cCh1aW50NCk7CitpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ0X3NhdF9ydHAodWludDQpOworaW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50NF9ydG4odWludDQpOworaW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50NF9zYXRfcnRuKHVpbnQ0KTsKK2ludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDQodWludDQpOworaW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50NF9zYXQodWludDQpOworaW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50NF9ydGUobG9uZzQpOworaW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50NF9zYXRfcnRlKGxvbmc0KTsKK2ludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDRfcnR6KGxvbmc0KTsKK2ludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDRfc2F0X3J0eihsb25nNCk7CitpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ0X3J0cChsb25nNCk7CitpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ0X3NhdF9ydHAobG9uZzQpOworaW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50NF9ydG4obG9uZzQpOworaW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50NF9zYXRfcnRuKGxvbmc0KTsKK2ludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDQobG9uZzQpOworaW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50NF9zYXQobG9uZzQpOworaW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50NF9ydGUodWxvbmc0KTsKK2ludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDRfc2F0X3J0ZSh1bG9uZzQpOworaW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50NF9ydHoodWxvbmc0KTsKK2ludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDRfc2F0X3J0eih1bG9uZzQpOworaW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50NF9ydHAodWxvbmc0KTsKK2ludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDRfc2F0X3J0cCh1bG9uZzQpOworaW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50NF9ydG4odWxvbmc0KTsKK2ludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDRfc2F0X3J0bih1bG9uZzQpOworaW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50NCh1bG9uZzQpOworaW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50NF9zYXQodWxvbmc0KTsKK2ludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDRfcnRlKGZsb2F0NCk7CitpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ0X3NhdF9ydGUoZmxvYXQ0KTsKK2ludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDRfcnR6KGZsb2F0NCk7CitpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ0X3NhdF9ydHooZmxvYXQ0KTsKK2ludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDRfcnRwKGZsb2F0NCk7CitpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ0X3NhdF9ydHAoZmxvYXQ0KTsKK2ludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDRfcnRuKGZsb2F0NCk7CitpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ0X3NhdF9ydG4oZmxvYXQ0KTsKK2ludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDQoZmxvYXQ0KTsKK2ludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDRfc2F0KGZsb2F0NCk7Cit1aW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDRfcnRlKGNoYXI0KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50NF9zYXRfcnRlKGNoYXI0KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50NF9ydHooY2hhcjQpOwordWludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ0X3NhdF9ydHooY2hhcjQpOwordWludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ0X3J0cChjaGFyNCk7Cit1aW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDRfc2F0X3J0cChjaGFyNCk7Cit1aW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDRfcnRuKGNoYXI0KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50NF9zYXRfcnRuKGNoYXI0KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50NChjaGFyNCk7Cit1aW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDRfc2F0KGNoYXI0KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50NF9ydGUodWNoYXI0KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50NF9zYXRfcnRlKHVjaGFyNCk7Cit1aW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDRfcnR6KHVjaGFyNCk7Cit1aW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDRfc2F0X3J0eih1Y2hhcjQpOwordWludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ0X3J0cCh1Y2hhcjQpOwordWludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ0X3NhdF9ydHAodWNoYXI0KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50NF9ydG4odWNoYXI0KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50NF9zYXRfcnRuKHVjaGFyNCk7Cit1aW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDQodWNoYXI0KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50NF9zYXQodWNoYXI0KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50NF9ydGUoc2hvcnQ0KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50NF9zYXRfcnRlKHNob3J0NCk7Cit1aW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDRfcnR6KHNob3J0NCk7Cit1aW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDRfc2F0X3J0eihzaG9ydDQpOwordWludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ0X3J0cChzaG9ydDQpOwordWludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ0X3NhdF9ydHAoc2hvcnQ0KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50NF9ydG4oc2hvcnQ0KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50NF9zYXRfcnRuKHNob3J0NCk7Cit1aW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDQoc2hvcnQ0KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50NF9zYXQoc2hvcnQ0KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50NF9ydGUodXNob3J0NCk7Cit1aW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDRfc2F0X3J0ZSh1c2hvcnQ0KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50NF9ydHoodXNob3J0NCk7Cit1aW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDRfc2F0X3J0eih1c2hvcnQ0KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50NF9ydHAodXNob3J0NCk7Cit1aW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDRfc2F0X3J0cCh1c2hvcnQ0KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50NF9ydG4odXNob3J0NCk7Cit1aW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDRfc2F0X3J0bih1c2hvcnQ0KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50NCh1c2hvcnQ0KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50NF9zYXQodXNob3J0NCk7Cit1aW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDRfcnRlKGludDQpOwordWludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ0X3NhdF9ydGUoaW50NCk7Cit1aW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDRfcnR6KGludDQpOwordWludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ0X3NhdF9ydHooaW50NCk7Cit1aW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDRfcnRwKGludDQpOwordWludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ0X3NhdF9ydHAoaW50NCk7Cit1aW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDRfcnRuKGludDQpOwordWludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ0X3NhdF9ydG4oaW50NCk7Cit1aW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDQoaW50NCk7Cit1aW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDRfc2F0KGludDQpOwordWludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ0X3J0ZSh1aW50NCk7Cit1aW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDRfc2F0X3J0ZSh1aW50NCk7Cit1aW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDRfcnR6KHVpbnQ0KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50NF9zYXRfcnR6KHVpbnQ0KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50NF9ydHAodWludDQpOwordWludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ0X3NhdF9ydHAodWludDQpOwordWludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ0X3J0bih1aW50NCk7Cit1aW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDRfc2F0X3J0bih1aW50NCk7Cit1aW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDQodWludDQpOwordWludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ0X3NhdCh1aW50NCk7Cit1aW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDRfcnRlKGxvbmc0KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50NF9zYXRfcnRlKGxvbmc0KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50NF9ydHoobG9uZzQpOwordWludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ0X3NhdF9ydHoobG9uZzQpOwordWludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ0X3J0cChsb25nNCk7Cit1aW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDRfc2F0X3J0cChsb25nNCk7Cit1aW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDRfcnRuKGxvbmc0KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50NF9zYXRfcnRuKGxvbmc0KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50NChsb25nNCk7Cit1aW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDRfc2F0KGxvbmc0KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50NF9ydGUodWxvbmc0KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50NF9zYXRfcnRlKHVsb25nNCk7Cit1aW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDRfcnR6KHVsb25nNCk7Cit1aW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDRfc2F0X3J0eih1bG9uZzQpOwordWludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ0X3J0cCh1bG9uZzQpOwordWludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ0X3NhdF9ydHAodWxvbmc0KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50NF9ydG4odWxvbmc0KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50NF9zYXRfcnRuKHVsb25nNCk7Cit1aW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDQodWxvbmc0KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50NF9zYXQodWxvbmc0KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50NF9ydGUoZmxvYXQ0KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50NF9zYXRfcnRlKGZsb2F0NCk7Cit1aW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDRfcnR6KGZsb2F0NCk7Cit1aW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDRfc2F0X3J0eihmbG9hdDQpOwordWludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ0X3J0cChmbG9hdDQpOwordWludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ0X3NhdF9ydHAoZmxvYXQ0KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50NF9ydG4oZmxvYXQ0KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50NF9zYXRfcnRuKGZsb2F0NCk7Cit1aW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDQoZmxvYXQ0KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50NF9zYXQoZmxvYXQ0KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nNF9ydGUoY2hhcjQpOworbG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc0X3NhdF9ydGUoY2hhcjQpOworbG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc0X3J0eihjaGFyNCk7Citsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzRfc2F0X3J0eihjaGFyNCk7Citsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzRfcnRwKGNoYXI0KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nNF9zYXRfcnRwKGNoYXI0KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nNF9ydG4oY2hhcjQpOworbG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc0X3NhdF9ydG4oY2hhcjQpOworbG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc0KGNoYXI0KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nNF9zYXQoY2hhcjQpOworbG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc0X3J0ZSh1Y2hhcjQpOworbG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc0X3NhdF9ydGUodWNoYXI0KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nNF9ydHoodWNoYXI0KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nNF9zYXRfcnR6KHVjaGFyNCk7Citsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzRfcnRwKHVjaGFyNCk7Citsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzRfc2F0X3J0cCh1Y2hhcjQpOworbG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc0X3J0bih1Y2hhcjQpOworbG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc0X3NhdF9ydG4odWNoYXI0KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nNCh1Y2hhcjQpOworbG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc0X3NhdCh1Y2hhcjQpOworbG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc0X3J0ZShzaG9ydDQpOworbG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc0X3NhdF9ydGUoc2hvcnQ0KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nNF9ydHooc2hvcnQ0KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nNF9zYXRfcnR6KHNob3J0NCk7Citsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzRfcnRwKHNob3J0NCk7Citsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzRfc2F0X3J0cChzaG9ydDQpOworbG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc0X3J0bihzaG9ydDQpOworbG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc0X3NhdF9ydG4oc2hvcnQ0KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nNChzaG9ydDQpOworbG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc0X3NhdChzaG9ydDQpOworbG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc0X3J0ZSh1c2hvcnQ0KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nNF9zYXRfcnRlKHVzaG9ydDQpOworbG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc0X3J0eih1c2hvcnQ0KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nNF9zYXRfcnR6KHVzaG9ydDQpOworbG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc0X3J0cCh1c2hvcnQ0KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nNF9zYXRfcnRwKHVzaG9ydDQpOworbG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc0X3J0bih1c2hvcnQ0KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nNF9zYXRfcnRuKHVzaG9ydDQpOworbG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc0KHVzaG9ydDQpOworbG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc0X3NhdCh1c2hvcnQ0KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nNF9ydGUoaW50NCk7Citsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzRfc2F0X3J0ZShpbnQ0KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nNF9ydHooaW50NCk7Citsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzRfc2F0X3J0eihpbnQ0KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nNF9ydHAoaW50NCk7Citsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzRfc2F0X3J0cChpbnQ0KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nNF9ydG4oaW50NCk7Citsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzRfc2F0X3J0bihpbnQ0KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nNChpbnQ0KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nNF9zYXQoaW50NCk7Citsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzRfcnRlKHVpbnQ0KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nNF9zYXRfcnRlKHVpbnQ0KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nNF9ydHoodWludDQpOworbG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc0X3NhdF9ydHoodWludDQpOworbG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc0X3J0cCh1aW50NCk7Citsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzRfc2F0X3J0cCh1aW50NCk7Citsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzRfcnRuKHVpbnQ0KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nNF9zYXRfcnRuKHVpbnQ0KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nNCh1aW50NCk7Citsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzRfc2F0KHVpbnQ0KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nNF9ydGUobG9uZzQpOworbG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc0X3NhdF9ydGUobG9uZzQpOworbG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc0X3J0eihsb25nNCk7Citsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzRfc2F0X3J0eihsb25nNCk7Citsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzRfcnRwKGxvbmc0KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nNF9zYXRfcnRwKGxvbmc0KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nNF9ydG4obG9uZzQpOworbG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc0X3NhdF9ydG4obG9uZzQpOworbG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc0KGxvbmc0KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nNF9zYXQobG9uZzQpOworbG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc0X3J0ZSh1bG9uZzQpOworbG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc0X3NhdF9ydGUodWxvbmc0KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nNF9ydHoodWxvbmc0KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nNF9zYXRfcnR6KHVsb25nNCk7Citsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzRfcnRwKHVsb25nNCk7Citsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzRfc2F0X3J0cCh1bG9uZzQpOworbG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc0X3J0bih1bG9uZzQpOworbG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc0X3NhdF9ydG4odWxvbmc0KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nNCh1bG9uZzQpOworbG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc0X3NhdCh1bG9uZzQpOworbG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc0X3J0ZShmbG9hdDQpOworbG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc0X3NhdF9ydGUoZmxvYXQ0KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nNF9ydHooZmxvYXQ0KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nNF9zYXRfcnR6KGZsb2F0NCk7Citsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzRfcnRwKGZsb2F0NCk7Citsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzRfc2F0X3J0cChmbG9hdDQpOworbG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc0X3J0bihmbG9hdDQpOworbG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc0X3NhdF9ydG4oZmxvYXQ0KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nNChmbG9hdDQpOworbG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc0X3NhdChmbG9hdDQpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzRfcnRlKGNoYXI0KTsKK3Vsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc0X3NhdF9ydGUoY2hhcjQpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzRfcnR6KGNoYXI0KTsKK3Vsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc0X3NhdF9ydHooY2hhcjQpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzRfcnRwKGNoYXI0KTsKK3Vsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc0X3NhdF9ydHAoY2hhcjQpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzRfcnRuKGNoYXI0KTsKK3Vsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc0X3NhdF9ydG4oY2hhcjQpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzQoY2hhcjQpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzRfc2F0KGNoYXI0KTsKK3Vsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc0X3J0ZSh1Y2hhcjQpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzRfc2F0X3J0ZSh1Y2hhcjQpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzRfcnR6KHVjaGFyNCk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nNF9zYXRfcnR6KHVjaGFyNCk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nNF9ydHAodWNoYXI0KTsKK3Vsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc0X3NhdF9ydHAodWNoYXI0KTsKK3Vsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc0X3J0bih1Y2hhcjQpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzRfc2F0X3J0bih1Y2hhcjQpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzQodWNoYXI0KTsKK3Vsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc0X3NhdCh1Y2hhcjQpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzRfcnRlKHNob3J0NCk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nNF9zYXRfcnRlKHNob3J0NCk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nNF9ydHooc2hvcnQ0KTsKK3Vsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc0X3NhdF9ydHooc2hvcnQ0KTsKK3Vsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc0X3J0cChzaG9ydDQpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzRfc2F0X3J0cChzaG9ydDQpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzRfcnRuKHNob3J0NCk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nNF9zYXRfcnRuKHNob3J0NCk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nNChzaG9ydDQpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzRfc2F0KHNob3J0NCk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nNF9ydGUodXNob3J0NCk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nNF9zYXRfcnRlKHVzaG9ydDQpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzRfcnR6KHVzaG9ydDQpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzRfc2F0X3J0eih1c2hvcnQ0KTsKK3Vsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc0X3J0cCh1c2hvcnQ0KTsKK3Vsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc0X3NhdF9ydHAodXNob3J0NCk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nNF9ydG4odXNob3J0NCk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nNF9zYXRfcnRuKHVzaG9ydDQpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzQodXNob3J0NCk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nNF9zYXQodXNob3J0NCk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nNF9ydGUoaW50NCk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nNF9zYXRfcnRlKGludDQpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzRfcnR6KGludDQpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzRfc2F0X3J0eihpbnQ0KTsKK3Vsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc0X3J0cChpbnQ0KTsKK3Vsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc0X3NhdF9ydHAoaW50NCk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nNF9ydG4oaW50NCk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nNF9zYXRfcnRuKGludDQpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzQoaW50NCk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nNF9zYXQoaW50NCk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nNF9ydGUodWludDQpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzRfc2F0X3J0ZSh1aW50NCk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nNF9ydHoodWludDQpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzRfc2F0X3J0eih1aW50NCk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nNF9ydHAodWludDQpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzRfc2F0X3J0cCh1aW50NCk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nNF9ydG4odWludDQpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzRfc2F0X3J0bih1aW50NCk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nNCh1aW50NCk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nNF9zYXQodWludDQpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzRfcnRlKGxvbmc0KTsKK3Vsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc0X3NhdF9ydGUobG9uZzQpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzRfcnR6KGxvbmc0KTsKK3Vsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc0X3NhdF9ydHoobG9uZzQpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzRfcnRwKGxvbmc0KTsKK3Vsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc0X3NhdF9ydHAobG9uZzQpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzRfcnRuKGxvbmc0KTsKK3Vsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc0X3NhdF9ydG4obG9uZzQpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzQobG9uZzQpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzRfc2F0KGxvbmc0KTsKK3Vsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc0X3J0ZSh1bG9uZzQpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzRfc2F0X3J0ZSh1bG9uZzQpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzRfcnR6KHVsb25nNCk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nNF9zYXRfcnR6KHVsb25nNCk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nNF9ydHAodWxvbmc0KTsKK3Vsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc0X3NhdF9ydHAodWxvbmc0KTsKK3Vsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc0X3J0bih1bG9uZzQpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzRfc2F0X3J0bih1bG9uZzQpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzQodWxvbmc0KTsKK3Vsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc0X3NhdCh1bG9uZzQpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzRfcnRlKGZsb2F0NCk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nNF9zYXRfcnRlKGZsb2F0NCk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nNF9ydHooZmxvYXQ0KTsKK3Vsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc0X3NhdF9ydHooZmxvYXQ0KTsKK3Vsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc0X3J0cChmbG9hdDQpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzRfc2F0X3J0cChmbG9hdDQpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzRfcnRuKGZsb2F0NCk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nNF9zYXRfcnRuKGZsb2F0NCk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nNChmbG9hdDQpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzRfc2F0KGZsb2F0NCk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0NF9ydGUoY2hhcjQpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDRfcnR6KGNoYXI0KTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQ0X3J0cChjaGFyNCk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0NF9ydG4oY2hhcjQpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDQoY2hhcjQpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDRfcnRlKHVjaGFyNCk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0NF9ydHoodWNoYXI0KTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQ0X3J0cCh1Y2hhcjQpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDRfcnRuKHVjaGFyNCk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0NCh1Y2hhcjQpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDRfcnRlKHNob3J0NCk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0NF9ydHooc2hvcnQ0KTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQ0X3J0cChzaG9ydDQpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDRfcnRuKHNob3J0NCk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0NChzaG9ydDQpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDRfcnRlKHVzaG9ydDQpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDRfcnR6KHVzaG9ydDQpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDRfcnRwKHVzaG9ydDQpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDRfcnRuKHVzaG9ydDQpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDQodXNob3J0NCk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0NF9ydGUoaW50NCk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0NF9ydHooaW50NCk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0NF9ydHAoaW50NCk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0NF9ydG4oaW50NCk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0NChpbnQ0KTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQ0X3J0ZSh1aW50NCk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0NF9ydHoodWludDQpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDRfcnRwKHVpbnQ0KTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQ0X3J0bih1aW50NCk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0NCh1aW50NCk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0NF9ydGUobG9uZzQpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDRfcnR6KGxvbmc0KTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQ0X3J0cChsb25nNCk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0NF9ydG4obG9uZzQpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDQobG9uZzQpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDRfcnRlKHVsb25nNCk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0NF9ydHoodWxvbmc0KTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQ0X3J0cCh1bG9uZzQpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDRfcnRuKHVsb25nNCk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0NCh1bG9uZzQpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDRfcnRlKGZsb2F0NCk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0NF9ydHooZmxvYXQ0KTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQ0X3J0cChmbG9hdDQpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDRfcnRuKGZsb2F0NCk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0NChmbG9hdDQpOworY2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI4X3J0ZShjaGFyOCk7CitjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjhfc2F0X3J0ZShjaGFyOCk7CitjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjhfcnR6KGNoYXI4KTsKK2NoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyOF9zYXRfcnR6KGNoYXI4KTsKK2NoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyOF9ydHAoY2hhcjgpOworY2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI4X3NhdF9ydHAoY2hhcjgpOworY2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI4X3J0bihjaGFyOCk7CitjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjhfc2F0X3J0bihjaGFyOCk7CitjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjgoY2hhcjgpOworY2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI4X3NhdChjaGFyOCk7CitjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjhfcnRlKHVjaGFyOCk7CitjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjhfc2F0X3J0ZSh1Y2hhcjgpOworY2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI4X3J0eih1Y2hhcjgpOworY2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI4X3NhdF9ydHoodWNoYXI4KTsKK2NoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyOF9ydHAodWNoYXI4KTsKK2NoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyOF9zYXRfcnRwKHVjaGFyOCk7CitjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjhfcnRuKHVjaGFyOCk7CitjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjhfc2F0X3J0bih1Y2hhcjgpOworY2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI4KHVjaGFyOCk7CitjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjhfc2F0KHVjaGFyOCk7CitjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjhfcnRlKHNob3J0OCk7CitjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjhfc2F0X3J0ZShzaG9ydDgpOworY2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI4X3J0eihzaG9ydDgpOworY2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI4X3NhdF9ydHooc2hvcnQ4KTsKK2NoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyOF9ydHAoc2hvcnQ4KTsKK2NoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyOF9zYXRfcnRwKHNob3J0OCk7CitjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjhfcnRuKHNob3J0OCk7CitjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjhfc2F0X3J0bihzaG9ydDgpOworY2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI4KHNob3J0OCk7CitjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjhfc2F0KHNob3J0OCk7CitjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjhfcnRlKHVzaG9ydDgpOworY2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI4X3NhdF9ydGUodXNob3J0OCk7CitjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjhfcnR6KHVzaG9ydDgpOworY2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI4X3NhdF9ydHoodXNob3J0OCk7CitjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjhfcnRwKHVzaG9ydDgpOworY2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI4X3NhdF9ydHAodXNob3J0OCk7CitjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjhfcnRuKHVzaG9ydDgpOworY2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI4X3NhdF9ydG4odXNob3J0OCk7CitjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjgodXNob3J0OCk7CitjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjhfc2F0KHVzaG9ydDgpOworY2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI4X3J0ZShpbnQ4KTsKK2NoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyOF9zYXRfcnRlKGludDgpOworY2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI4X3J0eihpbnQ4KTsKK2NoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyOF9zYXRfcnR6KGludDgpOworY2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI4X3J0cChpbnQ4KTsKK2NoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyOF9zYXRfcnRwKGludDgpOworY2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI4X3J0bihpbnQ4KTsKK2NoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyOF9zYXRfcnRuKGludDgpOworY2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI4KGludDgpOworY2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI4X3NhdChpbnQ4KTsKK2NoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyOF9ydGUodWludDgpOworY2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI4X3NhdF9ydGUodWludDgpOworY2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI4X3J0eih1aW50OCk7CitjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjhfc2F0X3J0eih1aW50OCk7CitjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjhfcnRwKHVpbnQ4KTsKK2NoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyOF9zYXRfcnRwKHVpbnQ4KTsKK2NoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyOF9ydG4odWludDgpOworY2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI4X3NhdF9ydG4odWludDgpOworY2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI4KHVpbnQ4KTsKK2NoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyOF9zYXQodWludDgpOworY2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI4X3J0ZShsb25nOCk7CitjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjhfc2F0X3J0ZShsb25nOCk7CitjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjhfcnR6KGxvbmc4KTsKK2NoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyOF9zYXRfcnR6KGxvbmc4KTsKK2NoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyOF9ydHAobG9uZzgpOworY2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI4X3NhdF9ydHAobG9uZzgpOworY2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI4X3J0bihsb25nOCk7CitjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjhfc2F0X3J0bihsb25nOCk7CitjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjgobG9uZzgpOworY2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI4X3NhdChsb25nOCk7CitjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjhfcnRlKHVsb25nOCk7CitjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjhfc2F0X3J0ZSh1bG9uZzgpOworY2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI4X3J0eih1bG9uZzgpOworY2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI4X3NhdF9ydHoodWxvbmc4KTsKK2NoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyOF9ydHAodWxvbmc4KTsKK2NoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyOF9zYXRfcnRwKHVsb25nOCk7CitjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjhfcnRuKHVsb25nOCk7CitjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjhfc2F0X3J0bih1bG9uZzgpOworY2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI4KHVsb25nOCk7CitjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjhfc2F0KHVsb25nOCk7CitjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjhfcnRlKGZsb2F0OCk7CitjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjhfc2F0X3J0ZShmbG9hdDgpOworY2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI4X3J0eihmbG9hdDgpOworY2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI4X3NhdF9ydHooZmxvYXQ4KTsKK2NoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyOF9ydHAoZmxvYXQ4KTsKK2NoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyOF9zYXRfcnRwKGZsb2F0OCk7CitjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjhfcnRuKGZsb2F0OCk7CitjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjhfc2F0X3J0bihmbG9hdDgpOworY2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI4KGZsb2F0OCk7CitjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjhfc2F0KGZsb2F0OCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOF9ydGUoY2hhcjgpOwordWNoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjhfc2F0X3J0ZShjaGFyOCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOF9ydHooY2hhcjgpOwordWNoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjhfc2F0X3J0eihjaGFyOCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOF9ydHAoY2hhcjgpOwordWNoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjhfc2F0X3J0cChjaGFyOCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOF9ydG4oY2hhcjgpOwordWNoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjhfc2F0X3J0bihjaGFyOCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOChjaGFyOCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOF9zYXQoY2hhcjgpOwordWNoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjhfcnRlKHVjaGFyOCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOF9zYXRfcnRlKHVjaGFyOCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOF9ydHoodWNoYXI4KTsKK3VjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI4X3NhdF9ydHoodWNoYXI4KTsKK3VjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI4X3J0cCh1Y2hhcjgpOwordWNoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjhfc2F0X3J0cCh1Y2hhcjgpOwordWNoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjhfcnRuKHVjaGFyOCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOF9zYXRfcnRuKHVjaGFyOCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOCh1Y2hhcjgpOwordWNoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjhfc2F0KHVjaGFyOCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOF9ydGUoc2hvcnQ4KTsKK3VjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI4X3NhdF9ydGUoc2hvcnQ4KTsKK3VjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI4X3J0eihzaG9ydDgpOwordWNoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjhfc2F0X3J0eihzaG9ydDgpOwordWNoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjhfcnRwKHNob3J0OCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOF9zYXRfcnRwKHNob3J0OCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOF9ydG4oc2hvcnQ4KTsKK3VjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI4X3NhdF9ydG4oc2hvcnQ4KTsKK3VjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI4KHNob3J0OCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOF9zYXQoc2hvcnQ4KTsKK3VjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI4X3J0ZSh1c2hvcnQ4KTsKK3VjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI4X3NhdF9ydGUodXNob3J0OCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOF9ydHoodXNob3J0OCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOF9zYXRfcnR6KHVzaG9ydDgpOwordWNoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjhfcnRwKHVzaG9ydDgpOwordWNoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjhfc2F0X3J0cCh1c2hvcnQ4KTsKK3VjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI4X3J0bih1c2hvcnQ4KTsKK3VjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI4X3NhdF9ydG4odXNob3J0OCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOCh1c2hvcnQ4KTsKK3VjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI4X3NhdCh1c2hvcnQ4KTsKK3VjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI4X3J0ZShpbnQ4KTsKK3VjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI4X3NhdF9ydGUoaW50OCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOF9ydHooaW50OCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOF9zYXRfcnR6KGludDgpOwordWNoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjhfcnRwKGludDgpOwordWNoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjhfc2F0X3J0cChpbnQ4KTsKK3VjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI4X3J0bihpbnQ4KTsKK3VjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI4X3NhdF9ydG4oaW50OCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOChpbnQ4KTsKK3VjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI4X3NhdChpbnQ4KTsKK3VjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI4X3J0ZSh1aW50OCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOF9zYXRfcnRlKHVpbnQ4KTsKK3VjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI4X3J0eih1aW50OCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOF9zYXRfcnR6KHVpbnQ4KTsKK3VjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI4X3J0cCh1aW50OCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOF9zYXRfcnRwKHVpbnQ4KTsKK3VjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI4X3J0bih1aW50OCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOF9zYXRfcnRuKHVpbnQ4KTsKK3VjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI4KHVpbnQ4KTsKK3VjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI4X3NhdCh1aW50OCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOF9ydGUobG9uZzgpOwordWNoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjhfc2F0X3J0ZShsb25nOCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOF9ydHoobG9uZzgpOwordWNoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjhfc2F0X3J0eihsb25nOCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOF9ydHAobG9uZzgpOwordWNoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjhfc2F0X3J0cChsb25nOCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOF9ydG4obG9uZzgpOwordWNoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjhfc2F0X3J0bihsb25nOCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOChsb25nOCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOF9zYXQobG9uZzgpOwordWNoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjhfcnRlKHVsb25nOCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOF9zYXRfcnRlKHVsb25nOCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOF9ydHoodWxvbmc4KTsKK3VjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI4X3NhdF9ydHoodWxvbmc4KTsKK3VjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI4X3J0cCh1bG9uZzgpOwordWNoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjhfc2F0X3J0cCh1bG9uZzgpOwordWNoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjhfcnRuKHVsb25nOCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOF9zYXRfcnRuKHVsb25nOCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOCh1bG9uZzgpOwordWNoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjhfc2F0KHVsb25nOCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOF9ydGUoZmxvYXQ4KTsKK3VjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI4X3NhdF9ydGUoZmxvYXQ4KTsKK3VjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI4X3J0eihmbG9hdDgpOwordWNoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjhfc2F0X3J0eihmbG9hdDgpOwordWNoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjhfcnRwKGZsb2F0OCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOF9zYXRfcnRwKGZsb2F0OCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOF9ydG4oZmxvYXQ4KTsKK3VjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI4X3NhdF9ydG4oZmxvYXQ4KTsKK3VjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI4KGZsb2F0OCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOF9zYXQoZmxvYXQ4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4X3J0ZShjaGFyOCk7CitzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0OF9zYXRfcnRlKGNoYXI4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4X3J0eihjaGFyOCk7CitzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0OF9zYXRfcnR6KGNoYXI4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4X3J0cChjaGFyOCk7CitzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0OF9zYXRfcnRwKGNoYXI4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4X3J0bihjaGFyOCk7CitzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0OF9zYXRfcnRuKGNoYXI4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4KGNoYXI4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4X3NhdChjaGFyOCk7CitzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0OF9ydGUodWNoYXI4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4X3NhdF9ydGUodWNoYXI4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4X3J0eih1Y2hhcjgpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDhfc2F0X3J0eih1Y2hhcjgpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDhfcnRwKHVjaGFyOCk7CitzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0OF9zYXRfcnRwKHVjaGFyOCk7CitzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0OF9ydG4odWNoYXI4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4X3NhdF9ydG4odWNoYXI4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4KHVjaGFyOCk7CitzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0OF9zYXQodWNoYXI4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4X3J0ZShzaG9ydDgpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDhfc2F0X3J0ZShzaG9ydDgpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDhfcnR6KHNob3J0OCk7CitzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0OF9zYXRfcnR6KHNob3J0OCk7CitzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0OF9ydHAoc2hvcnQ4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4X3NhdF9ydHAoc2hvcnQ4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4X3J0bihzaG9ydDgpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDhfc2F0X3J0bihzaG9ydDgpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDgoc2hvcnQ4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4X3NhdChzaG9ydDgpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDhfcnRlKHVzaG9ydDgpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDhfc2F0X3J0ZSh1c2hvcnQ4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4X3J0eih1c2hvcnQ4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4X3NhdF9ydHoodXNob3J0OCk7CitzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0OF9ydHAodXNob3J0OCk7CitzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0OF9zYXRfcnRwKHVzaG9ydDgpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDhfcnRuKHVzaG9ydDgpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDhfc2F0X3J0bih1c2hvcnQ4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4KHVzaG9ydDgpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDhfc2F0KHVzaG9ydDgpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDhfcnRlKGludDgpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDhfc2F0X3J0ZShpbnQ4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4X3J0eihpbnQ4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4X3NhdF9ydHooaW50OCk7CitzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0OF9ydHAoaW50OCk7CitzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0OF9zYXRfcnRwKGludDgpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDhfcnRuKGludDgpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDhfc2F0X3J0bihpbnQ4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4KGludDgpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDhfc2F0KGludDgpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDhfcnRlKHVpbnQ4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4X3NhdF9ydGUodWludDgpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDhfcnR6KHVpbnQ4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4X3NhdF9ydHoodWludDgpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDhfcnRwKHVpbnQ4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4X3NhdF9ydHAodWludDgpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDhfcnRuKHVpbnQ4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4X3NhdF9ydG4odWludDgpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDgodWludDgpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDhfc2F0KHVpbnQ4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4X3J0ZShsb25nOCk7CitzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0OF9zYXRfcnRlKGxvbmc4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4X3J0eihsb25nOCk7CitzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0OF9zYXRfcnR6KGxvbmc4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4X3J0cChsb25nOCk7CitzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0OF9zYXRfcnRwKGxvbmc4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4X3J0bihsb25nOCk7CitzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0OF9zYXRfcnRuKGxvbmc4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4KGxvbmc4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4X3NhdChsb25nOCk7CitzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0OF9ydGUodWxvbmc4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4X3NhdF9ydGUodWxvbmc4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4X3J0eih1bG9uZzgpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDhfc2F0X3J0eih1bG9uZzgpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDhfcnRwKHVsb25nOCk7CitzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0OF9zYXRfcnRwKHVsb25nOCk7CitzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0OF9ydG4odWxvbmc4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4X3NhdF9ydG4odWxvbmc4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4KHVsb25nOCk7CitzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0OF9zYXQodWxvbmc4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4X3J0ZShmbG9hdDgpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDhfc2F0X3J0ZShmbG9hdDgpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDhfcnR6KGZsb2F0OCk7CitzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0OF9zYXRfcnR6KGZsb2F0OCk7CitzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0OF9ydHAoZmxvYXQ4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4X3NhdF9ydHAoZmxvYXQ4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4X3J0bihmbG9hdDgpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDhfc2F0X3J0bihmbG9hdDgpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDgoZmxvYXQ4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4X3NhdChmbG9hdDgpOwordXNob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0OF9ydGUoY2hhcjgpOwordXNob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0OF9zYXRfcnRlKGNoYXI4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDhfcnR6KGNoYXI4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDhfc2F0X3J0eihjaGFyOCk7Cit1c2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ4X3J0cChjaGFyOCk7Cit1c2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ4X3NhdF9ydHAoY2hhcjgpOwordXNob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0OF9ydG4oY2hhcjgpOwordXNob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0OF9zYXRfcnRuKGNoYXI4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDgoY2hhcjgpOwordXNob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0OF9zYXQoY2hhcjgpOwordXNob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0OF9ydGUodWNoYXI4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDhfc2F0X3J0ZSh1Y2hhcjgpOwordXNob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0OF9ydHoodWNoYXI4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDhfc2F0X3J0eih1Y2hhcjgpOwordXNob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0OF9ydHAodWNoYXI4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDhfc2F0X3J0cCh1Y2hhcjgpOwordXNob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0OF9ydG4odWNoYXI4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDhfc2F0X3J0bih1Y2hhcjgpOwordXNob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0OCh1Y2hhcjgpOwordXNob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0OF9zYXQodWNoYXI4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDhfcnRlKHNob3J0OCk7Cit1c2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ4X3NhdF9ydGUoc2hvcnQ4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDhfcnR6KHNob3J0OCk7Cit1c2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ4X3NhdF9ydHooc2hvcnQ4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDhfcnRwKHNob3J0OCk7Cit1c2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ4X3NhdF9ydHAoc2hvcnQ4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDhfcnRuKHNob3J0OCk7Cit1c2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ4X3NhdF9ydG4oc2hvcnQ4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDgoc2hvcnQ4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDhfc2F0KHNob3J0OCk7Cit1c2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ4X3J0ZSh1c2hvcnQ4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDhfc2F0X3J0ZSh1c2hvcnQ4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDhfcnR6KHVzaG9ydDgpOwordXNob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0OF9zYXRfcnR6KHVzaG9ydDgpOwordXNob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0OF9ydHAodXNob3J0OCk7Cit1c2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ4X3NhdF9ydHAodXNob3J0OCk7Cit1c2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ4X3J0bih1c2hvcnQ4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDhfc2F0X3J0bih1c2hvcnQ4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDgodXNob3J0OCk7Cit1c2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ4X3NhdCh1c2hvcnQ4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDhfcnRlKGludDgpOwordXNob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0OF9zYXRfcnRlKGludDgpOwordXNob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0OF9ydHooaW50OCk7Cit1c2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ4X3NhdF9ydHooaW50OCk7Cit1c2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ4X3J0cChpbnQ4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDhfc2F0X3J0cChpbnQ4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDhfcnRuKGludDgpOwordXNob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0OF9zYXRfcnRuKGludDgpOwordXNob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0OChpbnQ4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDhfc2F0KGludDgpOwordXNob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0OF9ydGUodWludDgpOwordXNob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0OF9zYXRfcnRlKHVpbnQ4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDhfcnR6KHVpbnQ4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDhfc2F0X3J0eih1aW50OCk7Cit1c2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ4X3J0cCh1aW50OCk7Cit1c2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ4X3NhdF9ydHAodWludDgpOwordXNob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0OF9ydG4odWludDgpOwordXNob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0OF9zYXRfcnRuKHVpbnQ4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDgodWludDgpOwordXNob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0OF9zYXQodWludDgpOwordXNob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0OF9ydGUobG9uZzgpOwordXNob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0OF9zYXRfcnRlKGxvbmc4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDhfcnR6KGxvbmc4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDhfc2F0X3J0eihsb25nOCk7Cit1c2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ4X3J0cChsb25nOCk7Cit1c2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ4X3NhdF9ydHAobG9uZzgpOwordXNob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0OF9ydG4obG9uZzgpOwordXNob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0OF9zYXRfcnRuKGxvbmc4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDgobG9uZzgpOwordXNob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0OF9zYXQobG9uZzgpOwordXNob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0OF9ydGUodWxvbmc4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDhfc2F0X3J0ZSh1bG9uZzgpOwordXNob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0OF9ydHoodWxvbmc4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDhfc2F0X3J0eih1bG9uZzgpOwordXNob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0OF9ydHAodWxvbmc4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDhfc2F0X3J0cCh1bG9uZzgpOwordXNob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0OF9ydG4odWxvbmc4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDhfc2F0X3J0bih1bG9uZzgpOwordXNob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0OCh1bG9uZzgpOwordXNob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0OF9zYXQodWxvbmc4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDhfcnRlKGZsb2F0OCk7Cit1c2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ4X3NhdF9ydGUoZmxvYXQ4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDhfcnR6KGZsb2F0OCk7Cit1c2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ4X3NhdF9ydHooZmxvYXQ4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDhfcnRwKGZsb2F0OCk7Cit1c2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ4X3NhdF9ydHAoZmxvYXQ4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDhfcnRuKGZsb2F0OCk7Cit1c2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ4X3NhdF9ydG4oZmxvYXQ4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDgoZmxvYXQ4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDhfc2F0KGZsb2F0OCk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ4X3J0ZShjaGFyOCk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ4X3NhdF9ydGUoY2hhcjgpOworaW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50OF9ydHooY2hhcjgpOworaW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50OF9zYXRfcnR6KGNoYXI4KTsKK2ludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDhfcnRwKGNoYXI4KTsKK2ludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDhfc2F0X3J0cChjaGFyOCk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ4X3J0bihjaGFyOCk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ4X3NhdF9ydG4oY2hhcjgpOworaW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50OChjaGFyOCk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ4X3NhdChjaGFyOCk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ4X3J0ZSh1Y2hhcjgpOworaW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50OF9zYXRfcnRlKHVjaGFyOCk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ4X3J0eih1Y2hhcjgpOworaW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50OF9zYXRfcnR6KHVjaGFyOCk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ4X3J0cCh1Y2hhcjgpOworaW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50OF9zYXRfcnRwKHVjaGFyOCk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ4X3J0bih1Y2hhcjgpOworaW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50OF9zYXRfcnRuKHVjaGFyOCk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ4KHVjaGFyOCk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ4X3NhdCh1Y2hhcjgpOworaW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50OF9ydGUoc2hvcnQ4KTsKK2ludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDhfc2F0X3J0ZShzaG9ydDgpOworaW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50OF9ydHooc2hvcnQ4KTsKK2ludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDhfc2F0X3J0eihzaG9ydDgpOworaW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50OF9ydHAoc2hvcnQ4KTsKK2ludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDhfc2F0X3J0cChzaG9ydDgpOworaW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50OF9ydG4oc2hvcnQ4KTsKK2ludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDhfc2F0X3J0bihzaG9ydDgpOworaW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50OChzaG9ydDgpOworaW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50OF9zYXQoc2hvcnQ4KTsKK2ludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDhfcnRlKHVzaG9ydDgpOworaW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50OF9zYXRfcnRlKHVzaG9ydDgpOworaW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50OF9ydHoodXNob3J0OCk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ4X3NhdF9ydHoodXNob3J0OCk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ4X3J0cCh1c2hvcnQ4KTsKK2ludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDhfc2F0X3J0cCh1c2hvcnQ4KTsKK2ludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDhfcnRuKHVzaG9ydDgpOworaW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50OF9zYXRfcnRuKHVzaG9ydDgpOworaW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50OCh1c2hvcnQ4KTsKK2ludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDhfc2F0KHVzaG9ydDgpOworaW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50OF9ydGUoaW50OCk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ4X3NhdF9ydGUoaW50OCk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ4X3J0eihpbnQ4KTsKK2ludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDhfc2F0X3J0eihpbnQ4KTsKK2ludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDhfcnRwKGludDgpOworaW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50OF9zYXRfcnRwKGludDgpOworaW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50OF9ydG4oaW50OCk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ4X3NhdF9ydG4oaW50OCk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ4KGludDgpOworaW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50OF9zYXQoaW50OCk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ4X3J0ZSh1aW50OCk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ4X3NhdF9ydGUodWludDgpOworaW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50OF9ydHoodWludDgpOworaW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50OF9zYXRfcnR6KHVpbnQ4KTsKK2ludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDhfcnRwKHVpbnQ4KTsKK2ludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDhfc2F0X3J0cCh1aW50OCk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ4X3J0bih1aW50OCk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ4X3NhdF9ydG4odWludDgpOworaW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50OCh1aW50OCk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ4X3NhdCh1aW50OCk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ4X3J0ZShsb25nOCk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ4X3NhdF9ydGUobG9uZzgpOworaW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50OF9ydHoobG9uZzgpOworaW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50OF9zYXRfcnR6KGxvbmc4KTsKK2ludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDhfcnRwKGxvbmc4KTsKK2ludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDhfc2F0X3J0cChsb25nOCk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ4X3J0bihsb25nOCk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ4X3NhdF9ydG4obG9uZzgpOworaW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50OChsb25nOCk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ4X3NhdChsb25nOCk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ4X3J0ZSh1bG9uZzgpOworaW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50OF9zYXRfcnRlKHVsb25nOCk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ4X3J0eih1bG9uZzgpOworaW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50OF9zYXRfcnR6KHVsb25nOCk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ4X3J0cCh1bG9uZzgpOworaW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50OF9zYXRfcnRwKHVsb25nOCk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ4X3J0bih1bG9uZzgpOworaW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50OF9zYXRfcnRuKHVsb25nOCk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ4KHVsb25nOCk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ4X3NhdCh1bG9uZzgpOworaW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50OF9ydGUoZmxvYXQ4KTsKK2ludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDhfc2F0X3J0ZShmbG9hdDgpOworaW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50OF9ydHooZmxvYXQ4KTsKK2ludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDhfc2F0X3J0eihmbG9hdDgpOworaW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50OF9ydHAoZmxvYXQ4KTsKK2ludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDhfc2F0X3J0cChmbG9hdDgpOworaW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50OF9ydG4oZmxvYXQ4KTsKK2ludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDhfc2F0X3J0bihmbG9hdDgpOworaW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50OChmbG9hdDgpOworaW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50OF9zYXQoZmxvYXQ4KTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50OF9ydGUoY2hhcjgpOwordWludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ4X3NhdF9ydGUoY2hhcjgpOwordWludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ4X3J0eihjaGFyOCk7Cit1aW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDhfc2F0X3J0eihjaGFyOCk7Cit1aW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDhfcnRwKGNoYXI4KTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50OF9zYXRfcnRwKGNoYXI4KTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50OF9ydG4oY2hhcjgpOwordWludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ4X3NhdF9ydG4oY2hhcjgpOwordWludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ4KGNoYXI4KTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50OF9zYXQoY2hhcjgpOwordWludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ4X3J0ZSh1Y2hhcjgpOwordWludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ4X3NhdF9ydGUodWNoYXI4KTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50OF9ydHoodWNoYXI4KTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50OF9zYXRfcnR6KHVjaGFyOCk7Cit1aW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDhfcnRwKHVjaGFyOCk7Cit1aW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDhfc2F0X3J0cCh1Y2hhcjgpOwordWludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ4X3J0bih1Y2hhcjgpOwordWludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ4X3NhdF9ydG4odWNoYXI4KTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50OCh1Y2hhcjgpOwordWludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ4X3NhdCh1Y2hhcjgpOwordWludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ4X3J0ZShzaG9ydDgpOwordWludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ4X3NhdF9ydGUoc2hvcnQ4KTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50OF9ydHooc2hvcnQ4KTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50OF9zYXRfcnR6KHNob3J0OCk7Cit1aW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDhfcnRwKHNob3J0OCk7Cit1aW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDhfc2F0X3J0cChzaG9ydDgpOwordWludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ4X3J0bihzaG9ydDgpOwordWludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ4X3NhdF9ydG4oc2hvcnQ4KTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50OChzaG9ydDgpOwordWludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ4X3NhdChzaG9ydDgpOwordWludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ4X3J0ZSh1c2hvcnQ4KTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50OF9zYXRfcnRlKHVzaG9ydDgpOwordWludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ4X3J0eih1c2hvcnQ4KTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50OF9zYXRfcnR6KHVzaG9ydDgpOwordWludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ4X3J0cCh1c2hvcnQ4KTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50OF9zYXRfcnRwKHVzaG9ydDgpOwordWludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ4X3J0bih1c2hvcnQ4KTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50OF9zYXRfcnRuKHVzaG9ydDgpOwordWludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ4KHVzaG9ydDgpOwordWludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ4X3NhdCh1c2hvcnQ4KTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50OF9ydGUoaW50OCk7Cit1aW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDhfc2F0X3J0ZShpbnQ4KTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50OF9ydHooaW50OCk7Cit1aW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDhfc2F0X3J0eihpbnQ4KTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50OF9ydHAoaW50OCk7Cit1aW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDhfc2F0X3J0cChpbnQ4KTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50OF9ydG4oaW50OCk7Cit1aW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDhfc2F0X3J0bihpbnQ4KTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50OChpbnQ4KTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50OF9zYXQoaW50OCk7Cit1aW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDhfcnRlKHVpbnQ4KTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50OF9zYXRfcnRlKHVpbnQ4KTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50OF9ydHoodWludDgpOwordWludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ4X3NhdF9ydHoodWludDgpOwordWludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ4X3J0cCh1aW50OCk7Cit1aW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDhfc2F0X3J0cCh1aW50OCk7Cit1aW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDhfcnRuKHVpbnQ4KTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50OF9zYXRfcnRuKHVpbnQ4KTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50OCh1aW50OCk7Cit1aW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDhfc2F0KHVpbnQ4KTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50OF9ydGUobG9uZzgpOwordWludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ4X3NhdF9ydGUobG9uZzgpOwordWludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ4X3J0eihsb25nOCk7Cit1aW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDhfc2F0X3J0eihsb25nOCk7Cit1aW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDhfcnRwKGxvbmc4KTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50OF9zYXRfcnRwKGxvbmc4KTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50OF9ydG4obG9uZzgpOwordWludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ4X3NhdF9ydG4obG9uZzgpOwordWludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ4KGxvbmc4KTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50OF9zYXQobG9uZzgpOwordWludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ4X3J0ZSh1bG9uZzgpOwordWludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ4X3NhdF9ydGUodWxvbmc4KTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50OF9ydHoodWxvbmc4KTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50OF9zYXRfcnR6KHVsb25nOCk7Cit1aW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDhfcnRwKHVsb25nOCk7Cit1aW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDhfc2F0X3J0cCh1bG9uZzgpOwordWludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ4X3J0bih1bG9uZzgpOwordWludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ4X3NhdF9ydG4odWxvbmc4KTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50OCh1bG9uZzgpOwordWludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ4X3NhdCh1bG9uZzgpOwordWludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ4X3J0ZShmbG9hdDgpOwordWludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ4X3NhdF9ydGUoZmxvYXQ4KTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50OF9ydHooZmxvYXQ4KTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50OF9zYXRfcnR6KGZsb2F0OCk7Cit1aW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDhfcnRwKGZsb2F0OCk7Cit1aW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDhfc2F0X3J0cChmbG9hdDgpOwordWludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ4X3J0bihmbG9hdDgpOwordWludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ4X3NhdF9ydG4oZmxvYXQ4KTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50OChmbG9hdDgpOwordWludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ4X3NhdChmbG9hdDgpOworbG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc4X3J0ZShjaGFyOCk7Citsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzhfc2F0X3J0ZShjaGFyOCk7Citsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzhfcnR6KGNoYXI4KTsKK2xvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nOF9zYXRfcnR6KGNoYXI4KTsKK2xvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nOF9ydHAoY2hhcjgpOworbG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc4X3NhdF9ydHAoY2hhcjgpOworbG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc4X3J0bihjaGFyOCk7Citsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzhfc2F0X3J0bihjaGFyOCk7Citsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzgoY2hhcjgpOworbG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc4X3NhdChjaGFyOCk7Citsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzhfcnRlKHVjaGFyOCk7Citsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzhfc2F0X3J0ZSh1Y2hhcjgpOworbG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc4X3J0eih1Y2hhcjgpOworbG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc4X3NhdF9ydHoodWNoYXI4KTsKK2xvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nOF9ydHAodWNoYXI4KTsKK2xvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nOF9zYXRfcnRwKHVjaGFyOCk7Citsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzhfcnRuKHVjaGFyOCk7Citsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzhfc2F0X3J0bih1Y2hhcjgpOworbG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc4KHVjaGFyOCk7Citsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzhfc2F0KHVjaGFyOCk7Citsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzhfcnRlKHNob3J0OCk7Citsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzhfc2F0X3J0ZShzaG9ydDgpOworbG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc4X3J0eihzaG9ydDgpOworbG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc4X3NhdF9ydHooc2hvcnQ4KTsKK2xvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nOF9ydHAoc2hvcnQ4KTsKK2xvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nOF9zYXRfcnRwKHNob3J0OCk7Citsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzhfcnRuKHNob3J0OCk7Citsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzhfc2F0X3J0bihzaG9ydDgpOworbG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc4KHNob3J0OCk7Citsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzhfc2F0KHNob3J0OCk7Citsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzhfcnRlKHVzaG9ydDgpOworbG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc4X3NhdF9ydGUodXNob3J0OCk7Citsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzhfcnR6KHVzaG9ydDgpOworbG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc4X3NhdF9ydHoodXNob3J0OCk7Citsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzhfcnRwKHVzaG9ydDgpOworbG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc4X3NhdF9ydHAodXNob3J0OCk7Citsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzhfcnRuKHVzaG9ydDgpOworbG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc4X3NhdF9ydG4odXNob3J0OCk7Citsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzgodXNob3J0OCk7Citsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzhfc2F0KHVzaG9ydDgpOworbG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc4X3J0ZShpbnQ4KTsKK2xvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nOF9zYXRfcnRlKGludDgpOworbG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc4X3J0eihpbnQ4KTsKK2xvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nOF9zYXRfcnR6KGludDgpOworbG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc4X3J0cChpbnQ4KTsKK2xvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nOF9zYXRfcnRwKGludDgpOworbG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc4X3J0bihpbnQ4KTsKK2xvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nOF9zYXRfcnRuKGludDgpOworbG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc4KGludDgpOworbG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc4X3NhdChpbnQ4KTsKK2xvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nOF9ydGUodWludDgpOworbG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc4X3NhdF9ydGUodWludDgpOworbG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc4X3J0eih1aW50OCk7Citsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzhfc2F0X3J0eih1aW50OCk7Citsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzhfcnRwKHVpbnQ4KTsKK2xvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nOF9zYXRfcnRwKHVpbnQ4KTsKK2xvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nOF9ydG4odWludDgpOworbG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc4X3NhdF9ydG4odWludDgpOworbG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc4KHVpbnQ4KTsKK2xvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nOF9zYXQodWludDgpOworbG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc4X3J0ZShsb25nOCk7Citsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzhfc2F0X3J0ZShsb25nOCk7Citsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzhfcnR6KGxvbmc4KTsKK2xvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nOF9zYXRfcnR6KGxvbmc4KTsKK2xvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nOF9ydHAobG9uZzgpOworbG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc4X3NhdF9ydHAobG9uZzgpOworbG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc4X3J0bihsb25nOCk7Citsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzhfc2F0X3J0bihsb25nOCk7Citsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzgobG9uZzgpOworbG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc4X3NhdChsb25nOCk7Citsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzhfcnRlKHVsb25nOCk7Citsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzhfc2F0X3J0ZSh1bG9uZzgpOworbG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc4X3J0eih1bG9uZzgpOworbG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc4X3NhdF9ydHoodWxvbmc4KTsKK2xvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nOF9ydHAodWxvbmc4KTsKK2xvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nOF9zYXRfcnRwKHVsb25nOCk7Citsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzhfcnRuKHVsb25nOCk7Citsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzhfc2F0X3J0bih1bG9uZzgpOworbG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc4KHVsb25nOCk7Citsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzhfc2F0KHVsb25nOCk7Citsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzhfcnRlKGZsb2F0OCk7Citsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzhfc2F0X3J0ZShmbG9hdDgpOworbG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc4X3J0eihmbG9hdDgpOworbG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc4X3NhdF9ydHooZmxvYXQ4KTsKK2xvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nOF9ydHAoZmxvYXQ4KTsKK2xvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nOF9zYXRfcnRwKGZsb2F0OCk7Citsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzhfcnRuKGZsb2F0OCk7Citsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzhfc2F0X3J0bihmbG9hdDgpOworbG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc4KGZsb2F0OCk7Citsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzhfc2F0KGZsb2F0OCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOF9ydGUoY2hhcjgpOwordWxvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzhfc2F0X3J0ZShjaGFyOCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOF9ydHooY2hhcjgpOwordWxvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzhfc2F0X3J0eihjaGFyOCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOF9ydHAoY2hhcjgpOwordWxvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzhfc2F0X3J0cChjaGFyOCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOF9ydG4oY2hhcjgpOwordWxvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzhfc2F0X3J0bihjaGFyOCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOChjaGFyOCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOF9zYXQoY2hhcjgpOwordWxvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzhfcnRlKHVjaGFyOCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOF9zYXRfcnRlKHVjaGFyOCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOF9ydHoodWNoYXI4KTsKK3Vsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc4X3NhdF9ydHoodWNoYXI4KTsKK3Vsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc4X3J0cCh1Y2hhcjgpOwordWxvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzhfc2F0X3J0cCh1Y2hhcjgpOwordWxvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzhfcnRuKHVjaGFyOCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOF9zYXRfcnRuKHVjaGFyOCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOCh1Y2hhcjgpOwordWxvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzhfc2F0KHVjaGFyOCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOF9ydGUoc2hvcnQ4KTsKK3Vsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc4X3NhdF9ydGUoc2hvcnQ4KTsKK3Vsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc4X3J0eihzaG9ydDgpOwordWxvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzhfc2F0X3J0eihzaG9ydDgpOwordWxvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzhfcnRwKHNob3J0OCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOF9zYXRfcnRwKHNob3J0OCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOF9ydG4oc2hvcnQ4KTsKK3Vsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc4X3NhdF9ydG4oc2hvcnQ4KTsKK3Vsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc4KHNob3J0OCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOF9zYXQoc2hvcnQ4KTsKK3Vsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc4X3J0ZSh1c2hvcnQ4KTsKK3Vsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc4X3NhdF9ydGUodXNob3J0OCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOF9ydHoodXNob3J0OCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOF9zYXRfcnR6KHVzaG9ydDgpOwordWxvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzhfcnRwKHVzaG9ydDgpOwordWxvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzhfc2F0X3J0cCh1c2hvcnQ4KTsKK3Vsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc4X3J0bih1c2hvcnQ4KTsKK3Vsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc4X3NhdF9ydG4odXNob3J0OCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOCh1c2hvcnQ4KTsKK3Vsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc4X3NhdCh1c2hvcnQ4KTsKK3Vsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc4X3J0ZShpbnQ4KTsKK3Vsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc4X3NhdF9ydGUoaW50OCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOF9ydHooaW50OCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOF9zYXRfcnR6KGludDgpOwordWxvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzhfcnRwKGludDgpOwordWxvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzhfc2F0X3J0cChpbnQ4KTsKK3Vsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc4X3J0bihpbnQ4KTsKK3Vsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc4X3NhdF9ydG4oaW50OCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOChpbnQ4KTsKK3Vsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc4X3NhdChpbnQ4KTsKK3Vsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc4X3J0ZSh1aW50OCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOF9zYXRfcnRlKHVpbnQ4KTsKK3Vsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc4X3J0eih1aW50OCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOF9zYXRfcnR6KHVpbnQ4KTsKK3Vsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc4X3J0cCh1aW50OCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOF9zYXRfcnRwKHVpbnQ4KTsKK3Vsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc4X3J0bih1aW50OCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOF9zYXRfcnRuKHVpbnQ4KTsKK3Vsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc4KHVpbnQ4KTsKK3Vsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc4X3NhdCh1aW50OCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOF9ydGUobG9uZzgpOwordWxvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzhfc2F0X3J0ZShsb25nOCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOF9ydHoobG9uZzgpOwordWxvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzhfc2F0X3J0eihsb25nOCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOF9ydHAobG9uZzgpOwordWxvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzhfc2F0X3J0cChsb25nOCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOF9ydG4obG9uZzgpOwordWxvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzhfc2F0X3J0bihsb25nOCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOChsb25nOCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOF9zYXQobG9uZzgpOwordWxvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzhfcnRlKHVsb25nOCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOF9zYXRfcnRlKHVsb25nOCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOF9ydHoodWxvbmc4KTsKK3Vsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc4X3NhdF9ydHoodWxvbmc4KTsKK3Vsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc4X3J0cCh1bG9uZzgpOwordWxvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzhfc2F0X3J0cCh1bG9uZzgpOwordWxvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzhfcnRuKHVsb25nOCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOF9zYXRfcnRuKHVsb25nOCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOCh1bG9uZzgpOwordWxvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzhfc2F0KHVsb25nOCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOF9ydGUoZmxvYXQ4KTsKK3Vsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc4X3NhdF9ydGUoZmxvYXQ4KTsKK3Vsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc4X3J0eihmbG9hdDgpOwordWxvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzhfc2F0X3J0eihmbG9hdDgpOwordWxvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzhfcnRwKGZsb2F0OCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOF9zYXRfcnRwKGZsb2F0OCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOF9ydG4oZmxvYXQ4KTsKK3Vsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc4X3NhdF9ydG4oZmxvYXQ4KTsKK3Vsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc4KGZsb2F0OCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOF9zYXQoZmxvYXQ4KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQ4X3J0ZShjaGFyOCk7CitmbG9hdDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0OF9ydHooY2hhcjgpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDhfcnRwKGNoYXI4KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQ4X3J0bihjaGFyOCk7CitmbG9hdDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0OChjaGFyOCk7CitmbG9hdDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0OF9ydGUodWNoYXI4KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQ4X3J0eih1Y2hhcjgpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDhfcnRwKHVjaGFyOCk7CitmbG9hdDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0OF9ydG4odWNoYXI4KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQ4KHVjaGFyOCk7CitmbG9hdDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0OF9ydGUoc2hvcnQ4KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQ4X3J0eihzaG9ydDgpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDhfcnRwKHNob3J0OCk7CitmbG9hdDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0OF9ydG4oc2hvcnQ4KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQ4KHNob3J0OCk7CitmbG9hdDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0OF9ydGUodXNob3J0OCk7CitmbG9hdDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0OF9ydHoodXNob3J0OCk7CitmbG9hdDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0OF9ydHAodXNob3J0OCk7CitmbG9hdDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0OF9ydG4odXNob3J0OCk7CitmbG9hdDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0OCh1c2hvcnQ4KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQ4X3J0ZShpbnQ4KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQ4X3J0eihpbnQ4KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQ4X3J0cChpbnQ4KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQ4X3J0bihpbnQ4KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQ4KGludDgpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDhfcnRlKHVpbnQ4KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQ4X3J0eih1aW50OCk7CitmbG9hdDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0OF9ydHAodWludDgpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDhfcnRuKHVpbnQ4KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQ4KHVpbnQ4KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQ4X3J0ZShsb25nOCk7CitmbG9hdDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0OF9ydHoobG9uZzgpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDhfcnRwKGxvbmc4KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQ4X3J0bihsb25nOCk7CitmbG9hdDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0OChsb25nOCk7CitmbG9hdDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0OF9ydGUodWxvbmc4KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQ4X3J0eih1bG9uZzgpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDhfcnRwKHVsb25nOCk7CitmbG9hdDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0OF9ydG4odWxvbmc4KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQ4KHVsb25nOCk7CitmbG9hdDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0OF9ydGUoZmxvYXQ4KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQ4X3J0eihmbG9hdDgpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDhfcnRwKGZsb2F0OCk7CitmbG9hdDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0OF9ydG4oZmxvYXQ4KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQ4KGZsb2F0OCk7CitjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIxNl9ydGUoY2hhcjE2KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjE2X3NhdF9ydGUoY2hhcjE2KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjE2X3J0eihjaGFyMTYpOworY2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMTZfc2F0X3J0eihjaGFyMTYpOworY2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMTZfcnRwKGNoYXIxNik7CitjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIxNl9zYXRfcnRwKGNoYXIxNik7CitjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIxNl9ydG4oY2hhcjE2KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjE2X3NhdF9ydG4oY2hhcjE2KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjE2KGNoYXIxNik7CitjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIxNl9zYXQoY2hhcjE2KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjE2X3J0ZSh1Y2hhcjE2KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjE2X3NhdF9ydGUodWNoYXIxNik7CitjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIxNl9ydHoodWNoYXIxNik7CitjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIxNl9zYXRfcnR6KHVjaGFyMTYpOworY2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMTZfcnRwKHVjaGFyMTYpOworY2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMTZfc2F0X3J0cCh1Y2hhcjE2KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjE2X3J0bih1Y2hhcjE2KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjE2X3NhdF9ydG4odWNoYXIxNik7CitjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIxNih1Y2hhcjE2KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjE2X3NhdCh1Y2hhcjE2KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjE2X3J0ZShzaG9ydDE2KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjE2X3NhdF9ydGUoc2hvcnQxNik7CitjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIxNl9ydHooc2hvcnQxNik7CitjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIxNl9zYXRfcnR6KHNob3J0MTYpOworY2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMTZfcnRwKHNob3J0MTYpOworY2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMTZfc2F0X3J0cChzaG9ydDE2KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjE2X3J0bihzaG9ydDE2KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjE2X3NhdF9ydG4oc2hvcnQxNik7CitjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIxNihzaG9ydDE2KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjE2X3NhdChzaG9ydDE2KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjE2X3J0ZSh1c2hvcnQxNik7CitjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIxNl9zYXRfcnRlKHVzaG9ydDE2KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjE2X3J0eih1c2hvcnQxNik7CitjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIxNl9zYXRfcnR6KHVzaG9ydDE2KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjE2X3J0cCh1c2hvcnQxNik7CitjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIxNl9zYXRfcnRwKHVzaG9ydDE2KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjE2X3J0bih1c2hvcnQxNik7CitjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIxNl9zYXRfcnRuKHVzaG9ydDE2KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjE2KHVzaG9ydDE2KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjE2X3NhdCh1c2hvcnQxNik7CitjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIxNl9ydGUoaW50MTYpOworY2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMTZfc2F0X3J0ZShpbnQxNik7CitjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIxNl9ydHooaW50MTYpOworY2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMTZfc2F0X3J0eihpbnQxNik7CitjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIxNl9ydHAoaW50MTYpOworY2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMTZfc2F0X3J0cChpbnQxNik7CitjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIxNl9ydG4oaW50MTYpOworY2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMTZfc2F0X3J0bihpbnQxNik7CitjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIxNihpbnQxNik7CitjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIxNl9zYXQoaW50MTYpOworY2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMTZfcnRlKHVpbnQxNik7CitjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIxNl9zYXRfcnRlKHVpbnQxNik7CitjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIxNl9ydHoodWludDE2KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjE2X3NhdF9ydHoodWludDE2KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjE2X3J0cCh1aW50MTYpOworY2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMTZfc2F0X3J0cCh1aW50MTYpOworY2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMTZfcnRuKHVpbnQxNik7CitjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIxNl9zYXRfcnRuKHVpbnQxNik7CitjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIxNih1aW50MTYpOworY2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMTZfc2F0KHVpbnQxNik7CitjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIxNl9ydGUobG9uZzE2KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjE2X3NhdF9ydGUobG9uZzE2KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjE2X3J0eihsb25nMTYpOworY2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMTZfc2F0X3J0eihsb25nMTYpOworY2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMTZfcnRwKGxvbmcxNik7CitjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIxNl9zYXRfcnRwKGxvbmcxNik7CitjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIxNl9ydG4obG9uZzE2KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjE2X3NhdF9ydG4obG9uZzE2KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjE2KGxvbmcxNik7CitjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIxNl9zYXQobG9uZzE2KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjE2X3J0ZSh1bG9uZzE2KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjE2X3NhdF9ydGUodWxvbmcxNik7CitjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIxNl9ydHoodWxvbmcxNik7CitjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIxNl9zYXRfcnR6KHVsb25nMTYpOworY2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMTZfcnRwKHVsb25nMTYpOworY2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMTZfc2F0X3J0cCh1bG9uZzE2KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjE2X3J0bih1bG9uZzE2KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjE2X3NhdF9ydG4odWxvbmcxNik7CitjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIxNih1bG9uZzE2KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjE2X3NhdCh1bG9uZzE2KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjE2X3J0ZShmbG9hdDE2KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjE2X3NhdF9ydGUoZmxvYXQxNik7CitjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIxNl9ydHooZmxvYXQxNik7CitjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIxNl9zYXRfcnR6KGZsb2F0MTYpOworY2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMTZfcnRwKGZsb2F0MTYpOworY2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMTZfc2F0X3J0cChmbG9hdDE2KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjE2X3J0bihmbG9hdDE2KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjE2X3NhdF9ydG4oZmxvYXQxNik7CitjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIxNihmbG9hdDE2KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjE2X3NhdChmbG9hdDE2KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMTZfcnRlKGNoYXIxNik7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjE2X3NhdF9ydGUoY2hhcjE2KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMTZfcnR6KGNoYXIxNik7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjE2X3NhdF9ydHooY2hhcjE2KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMTZfcnRwKGNoYXIxNik7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjE2X3NhdF9ydHAoY2hhcjE2KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMTZfcnRuKGNoYXIxNik7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjE2X3NhdF9ydG4oY2hhcjE2KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMTYoY2hhcjE2KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMTZfc2F0KGNoYXIxNik7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjE2X3J0ZSh1Y2hhcjE2KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMTZfc2F0X3J0ZSh1Y2hhcjE2KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMTZfcnR6KHVjaGFyMTYpOwordWNoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIxNl9zYXRfcnR6KHVjaGFyMTYpOwordWNoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIxNl9ydHAodWNoYXIxNik7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjE2X3NhdF9ydHAodWNoYXIxNik7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjE2X3J0bih1Y2hhcjE2KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMTZfc2F0X3J0bih1Y2hhcjE2KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMTYodWNoYXIxNik7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjE2X3NhdCh1Y2hhcjE2KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMTZfcnRlKHNob3J0MTYpOwordWNoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIxNl9zYXRfcnRlKHNob3J0MTYpOwordWNoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIxNl9ydHooc2hvcnQxNik7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjE2X3NhdF9ydHooc2hvcnQxNik7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjE2X3J0cChzaG9ydDE2KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMTZfc2F0X3J0cChzaG9ydDE2KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMTZfcnRuKHNob3J0MTYpOwordWNoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIxNl9zYXRfcnRuKHNob3J0MTYpOwordWNoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIxNihzaG9ydDE2KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMTZfc2F0KHNob3J0MTYpOwordWNoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIxNl9ydGUodXNob3J0MTYpOwordWNoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIxNl9zYXRfcnRlKHVzaG9ydDE2KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMTZfcnR6KHVzaG9ydDE2KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMTZfc2F0X3J0eih1c2hvcnQxNik7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjE2X3J0cCh1c2hvcnQxNik7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjE2X3NhdF9ydHAodXNob3J0MTYpOwordWNoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIxNl9ydG4odXNob3J0MTYpOwordWNoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIxNl9zYXRfcnRuKHVzaG9ydDE2KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMTYodXNob3J0MTYpOwordWNoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIxNl9zYXQodXNob3J0MTYpOwordWNoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIxNl9ydGUoaW50MTYpOwordWNoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIxNl9zYXRfcnRlKGludDE2KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMTZfcnR6KGludDE2KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMTZfc2F0X3J0eihpbnQxNik7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjE2X3J0cChpbnQxNik7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjE2X3NhdF9ydHAoaW50MTYpOwordWNoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIxNl9ydG4oaW50MTYpOwordWNoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIxNl9zYXRfcnRuKGludDE2KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMTYoaW50MTYpOwordWNoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIxNl9zYXQoaW50MTYpOwordWNoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIxNl9ydGUodWludDE2KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMTZfc2F0X3J0ZSh1aW50MTYpOwordWNoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIxNl9ydHoodWludDE2KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMTZfc2F0X3J0eih1aW50MTYpOwordWNoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIxNl9ydHAodWludDE2KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMTZfc2F0X3J0cCh1aW50MTYpOwordWNoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIxNl9ydG4odWludDE2KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMTZfc2F0X3J0bih1aW50MTYpOwordWNoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIxNih1aW50MTYpOwordWNoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIxNl9zYXQodWludDE2KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMTZfcnRlKGxvbmcxNik7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjE2X3NhdF9ydGUobG9uZzE2KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMTZfcnR6KGxvbmcxNik7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjE2X3NhdF9ydHoobG9uZzE2KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMTZfcnRwKGxvbmcxNik7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjE2X3NhdF9ydHAobG9uZzE2KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMTZfcnRuKGxvbmcxNik7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjE2X3NhdF9ydG4obG9uZzE2KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMTYobG9uZzE2KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMTZfc2F0KGxvbmcxNik7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjE2X3J0ZSh1bG9uZzE2KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMTZfc2F0X3J0ZSh1bG9uZzE2KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMTZfcnR6KHVsb25nMTYpOwordWNoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIxNl9zYXRfcnR6KHVsb25nMTYpOwordWNoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIxNl9ydHAodWxvbmcxNik7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjE2X3NhdF9ydHAodWxvbmcxNik7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjE2X3J0bih1bG9uZzE2KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMTZfc2F0X3J0bih1bG9uZzE2KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMTYodWxvbmcxNik7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjE2X3NhdCh1bG9uZzE2KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMTZfcnRlKGZsb2F0MTYpOwordWNoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIxNl9zYXRfcnRlKGZsb2F0MTYpOwordWNoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIxNl9ydHooZmxvYXQxNik7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjE2X3NhdF9ydHooZmxvYXQxNik7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjE2X3J0cChmbG9hdDE2KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMTZfc2F0X3J0cChmbG9hdDE2KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMTZfcnRuKGZsb2F0MTYpOwordWNoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIxNl9zYXRfcnRuKGZsb2F0MTYpOwordWNoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIxNihmbG9hdDE2KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMTZfc2F0KGZsb2F0MTYpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQxNl9ydGUoY2hhcjE2KTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0MTZfc2F0X3J0ZShjaGFyMTYpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQxNl9ydHooY2hhcjE2KTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0MTZfc2F0X3J0eihjaGFyMTYpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQxNl9ydHAoY2hhcjE2KTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0MTZfc2F0X3J0cChjaGFyMTYpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQxNl9ydG4oY2hhcjE2KTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0MTZfc2F0X3J0bihjaGFyMTYpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQxNihjaGFyMTYpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQxNl9zYXQoY2hhcjE2KTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0MTZfcnRlKHVjaGFyMTYpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQxNl9zYXRfcnRlKHVjaGFyMTYpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQxNl9ydHoodWNoYXIxNik7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDE2X3NhdF9ydHoodWNoYXIxNik7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDE2X3J0cCh1Y2hhcjE2KTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0MTZfc2F0X3J0cCh1Y2hhcjE2KTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0MTZfcnRuKHVjaGFyMTYpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQxNl9zYXRfcnRuKHVjaGFyMTYpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQxNih1Y2hhcjE2KTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0MTZfc2F0KHVjaGFyMTYpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQxNl9ydGUoc2hvcnQxNik7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDE2X3NhdF9ydGUoc2hvcnQxNik7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDE2X3J0eihzaG9ydDE2KTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0MTZfc2F0X3J0eihzaG9ydDE2KTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0MTZfcnRwKHNob3J0MTYpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQxNl9zYXRfcnRwKHNob3J0MTYpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQxNl9ydG4oc2hvcnQxNik7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDE2X3NhdF9ydG4oc2hvcnQxNik7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDE2KHNob3J0MTYpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQxNl9zYXQoc2hvcnQxNik7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDE2X3J0ZSh1c2hvcnQxNik7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDE2X3NhdF9ydGUodXNob3J0MTYpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQxNl9ydHoodXNob3J0MTYpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQxNl9zYXRfcnR6KHVzaG9ydDE2KTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0MTZfcnRwKHVzaG9ydDE2KTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0MTZfc2F0X3J0cCh1c2hvcnQxNik7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDE2X3J0bih1c2hvcnQxNik7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDE2X3NhdF9ydG4odXNob3J0MTYpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQxNih1c2hvcnQxNik7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDE2X3NhdCh1c2hvcnQxNik7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDE2X3J0ZShpbnQxNik7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDE2X3NhdF9ydGUoaW50MTYpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQxNl9ydHooaW50MTYpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQxNl9zYXRfcnR6KGludDE2KTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0MTZfcnRwKGludDE2KTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0MTZfc2F0X3J0cChpbnQxNik7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDE2X3J0bihpbnQxNik7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDE2X3NhdF9ydG4oaW50MTYpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQxNihpbnQxNik7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDE2X3NhdChpbnQxNik7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDE2X3J0ZSh1aW50MTYpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQxNl9zYXRfcnRlKHVpbnQxNik7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDE2X3J0eih1aW50MTYpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQxNl9zYXRfcnR6KHVpbnQxNik7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDE2X3J0cCh1aW50MTYpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQxNl9zYXRfcnRwKHVpbnQxNik7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDE2X3J0bih1aW50MTYpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQxNl9zYXRfcnRuKHVpbnQxNik7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDE2KHVpbnQxNik7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDE2X3NhdCh1aW50MTYpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQxNl9ydGUobG9uZzE2KTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0MTZfc2F0X3J0ZShsb25nMTYpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQxNl9ydHoobG9uZzE2KTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0MTZfc2F0X3J0eihsb25nMTYpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQxNl9ydHAobG9uZzE2KTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0MTZfc2F0X3J0cChsb25nMTYpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQxNl9ydG4obG9uZzE2KTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0MTZfc2F0X3J0bihsb25nMTYpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQxNihsb25nMTYpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQxNl9zYXQobG9uZzE2KTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0MTZfcnRlKHVsb25nMTYpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQxNl9zYXRfcnRlKHVsb25nMTYpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQxNl9ydHoodWxvbmcxNik7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDE2X3NhdF9ydHoodWxvbmcxNik7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDE2X3J0cCh1bG9uZzE2KTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0MTZfc2F0X3J0cCh1bG9uZzE2KTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0MTZfcnRuKHVsb25nMTYpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQxNl9zYXRfcnRuKHVsb25nMTYpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQxNih1bG9uZzE2KTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0MTZfc2F0KHVsb25nMTYpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQxNl9ydGUoZmxvYXQxNik7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDE2X3NhdF9ydGUoZmxvYXQxNik7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDE2X3J0eihmbG9hdDE2KTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0MTZfc2F0X3J0eihmbG9hdDE2KTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0MTZfcnRwKGZsb2F0MTYpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQxNl9zYXRfcnRwKGZsb2F0MTYpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQxNl9ydG4oZmxvYXQxNik7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDE2X3NhdF9ydG4oZmxvYXQxNik7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDE2KGZsb2F0MTYpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQxNl9zYXQoZmxvYXQxNik7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0MTZfcnRlKGNoYXIxNik7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0MTZfc2F0X3J0ZShjaGFyMTYpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDE2X3J0eihjaGFyMTYpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDE2X3NhdF9ydHooY2hhcjE2KTsKK3VzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQxNl9ydHAoY2hhcjE2KTsKK3VzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQxNl9zYXRfcnRwKGNoYXIxNik7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0MTZfcnRuKGNoYXIxNik7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0MTZfc2F0X3J0bihjaGFyMTYpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDE2KGNoYXIxNik7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0MTZfc2F0KGNoYXIxNik7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0MTZfcnRlKHVjaGFyMTYpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDE2X3NhdF9ydGUodWNoYXIxNik7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0MTZfcnR6KHVjaGFyMTYpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDE2X3NhdF9ydHoodWNoYXIxNik7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0MTZfcnRwKHVjaGFyMTYpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDE2X3NhdF9ydHAodWNoYXIxNik7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0MTZfcnRuKHVjaGFyMTYpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDE2X3NhdF9ydG4odWNoYXIxNik7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0MTYodWNoYXIxNik7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0MTZfc2F0KHVjaGFyMTYpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDE2X3J0ZShzaG9ydDE2KTsKK3VzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQxNl9zYXRfcnRlKHNob3J0MTYpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDE2X3J0eihzaG9ydDE2KTsKK3VzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQxNl9zYXRfcnR6KHNob3J0MTYpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDE2X3J0cChzaG9ydDE2KTsKK3VzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQxNl9zYXRfcnRwKHNob3J0MTYpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDE2X3J0bihzaG9ydDE2KTsKK3VzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQxNl9zYXRfcnRuKHNob3J0MTYpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDE2KHNob3J0MTYpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDE2X3NhdChzaG9ydDE2KTsKK3VzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQxNl9ydGUodXNob3J0MTYpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDE2X3NhdF9ydGUodXNob3J0MTYpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDE2X3J0eih1c2hvcnQxNik7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0MTZfc2F0X3J0eih1c2hvcnQxNik7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0MTZfcnRwKHVzaG9ydDE2KTsKK3VzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQxNl9zYXRfcnRwKHVzaG9ydDE2KTsKK3VzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQxNl9ydG4odXNob3J0MTYpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDE2X3NhdF9ydG4odXNob3J0MTYpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDE2KHVzaG9ydDE2KTsKK3VzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQxNl9zYXQodXNob3J0MTYpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDE2X3J0ZShpbnQxNik7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0MTZfc2F0X3J0ZShpbnQxNik7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0MTZfcnR6KGludDE2KTsKK3VzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQxNl9zYXRfcnR6KGludDE2KTsKK3VzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQxNl9ydHAoaW50MTYpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDE2X3NhdF9ydHAoaW50MTYpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDE2X3J0bihpbnQxNik7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0MTZfc2F0X3J0bihpbnQxNik7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0MTYoaW50MTYpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDE2X3NhdChpbnQxNik7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0MTZfcnRlKHVpbnQxNik7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0MTZfc2F0X3J0ZSh1aW50MTYpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDE2X3J0eih1aW50MTYpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDE2X3NhdF9ydHoodWludDE2KTsKK3VzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQxNl9ydHAodWludDE2KTsKK3VzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQxNl9zYXRfcnRwKHVpbnQxNik7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0MTZfcnRuKHVpbnQxNik7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0MTZfc2F0X3J0bih1aW50MTYpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDE2KHVpbnQxNik7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0MTZfc2F0KHVpbnQxNik7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0MTZfcnRlKGxvbmcxNik7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0MTZfc2F0X3J0ZShsb25nMTYpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDE2X3J0eihsb25nMTYpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDE2X3NhdF9ydHoobG9uZzE2KTsKK3VzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQxNl9ydHAobG9uZzE2KTsKK3VzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQxNl9zYXRfcnRwKGxvbmcxNik7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0MTZfcnRuKGxvbmcxNik7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0MTZfc2F0X3J0bihsb25nMTYpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDE2KGxvbmcxNik7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0MTZfc2F0KGxvbmcxNik7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0MTZfcnRlKHVsb25nMTYpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDE2X3NhdF9ydGUodWxvbmcxNik7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0MTZfcnR6KHVsb25nMTYpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDE2X3NhdF9ydHoodWxvbmcxNik7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0MTZfcnRwKHVsb25nMTYpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDE2X3NhdF9ydHAodWxvbmcxNik7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0MTZfcnRuKHVsb25nMTYpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDE2X3NhdF9ydG4odWxvbmcxNik7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0MTYodWxvbmcxNik7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0MTZfc2F0KHVsb25nMTYpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDE2X3J0ZShmbG9hdDE2KTsKK3VzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQxNl9zYXRfcnRlKGZsb2F0MTYpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDE2X3J0eihmbG9hdDE2KTsKK3VzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQxNl9zYXRfcnR6KGZsb2F0MTYpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDE2X3J0cChmbG9hdDE2KTsKK3VzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQxNl9zYXRfcnRwKGZsb2F0MTYpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDE2X3J0bihmbG9hdDE2KTsKK3VzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQxNl9zYXRfcnRuKGZsb2F0MTYpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDE2KGZsb2F0MTYpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDE2X3NhdChmbG9hdDE2KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQxNl9ydGUoY2hhcjE2KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQxNl9zYXRfcnRlKGNoYXIxNik7CitpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50MTZfcnR6KGNoYXIxNik7CitpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50MTZfc2F0X3J0eihjaGFyMTYpOworaW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDE2X3J0cChjaGFyMTYpOworaW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDE2X3NhdF9ydHAoY2hhcjE2KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQxNl9ydG4oY2hhcjE2KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQxNl9zYXRfcnRuKGNoYXIxNik7CitpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50MTYoY2hhcjE2KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQxNl9zYXQoY2hhcjE2KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQxNl9ydGUodWNoYXIxNik7CitpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50MTZfc2F0X3J0ZSh1Y2hhcjE2KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQxNl9ydHoodWNoYXIxNik7CitpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50MTZfc2F0X3J0eih1Y2hhcjE2KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQxNl9ydHAodWNoYXIxNik7CitpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50MTZfc2F0X3J0cCh1Y2hhcjE2KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQxNl9ydG4odWNoYXIxNik7CitpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50MTZfc2F0X3J0bih1Y2hhcjE2KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQxNih1Y2hhcjE2KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQxNl9zYXQodWNoYXIxNik7CitpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50MTZfcnRlKHNob3J0MTYpOworaW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDE2X3NhdF9ydGUoc2hvcnQxNik7CitpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50MTZfcnR6KHNob3J0MTYpOworaW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDE2X3NhdF9ydHooc2hvcnQxNik7CitpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50MTZfcnRwKHNob3J0MTYpOworaW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDE2X3NhdF9ydHAoc2hvcnQxNik7CitpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50MTZfcnRuKHNob3J0MTYpOworaW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDE2X3NhdF9ydG4oc2hvcnQxNik7CitpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50MTYoc2hvcnQxNik7CitpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50MTZfc2F0KHNob3J0MTYpOworaW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDE2X3J0ZSh1c2hvcnQxNik7CitpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50MTZfc2F0X3J0ZSh1c2hvcnQxNik7CitpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50MTZfcnR6KHVzaG9ydDE2KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQxNl9zYXRfcnR6KHVzaG9ydDE2KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQxNl9ydHAodXNob3J0MTYpOworaW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDE2X3NhdF9ydHAodXNob3J0MTYpOworaW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDE2X3J0bih1c2hvcnQxNik7CitpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50MTZfc2F0X3J0bih1c2hvcnQxNik7CitpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50MTYodXNob3J0MTYpOworaW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDE2X3NhdCh1c2hvcnQxNik7CitpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50MTZfcnRlKGludDE2KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQxNl9zYXRfcnRlKGludDE2KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQxNl9ydHooaW50MTYpOworaW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDE2X3NhdF9ydHooaW50MTYpOworaW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDE2X3J0cChpbnQxNik7CitpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50MTZfc2F0X3J0cChpbnQxNik7CitpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50MTZfcnRuKGludDE2KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQxNl9zYXRfcnRuKGludDE2KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQxNihpbnQxNik7CitpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50MTZfc2F0KGludDE2KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQxNl9ydGUodWludDE2KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQxNl9zYXRfcnRlKHVpbnQxNik7CitpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50MTZfcnR6KHVpbnQxNik7CitpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50MTZfc2F0X3J0eih1aW50MTYpOworaW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDE2X3J0cCh1aW50MTYpOworaW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDE2X3NhdF9ydHAodWludDE2KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQxNl9ydG4odWludDE2KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQxNl9zYXRfcnRuKHVpbnQxNik7CitpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50MTYodWludDE2KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQxNl9zYXQodWludDE2KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQxNl9ydGUobG9uZzE2KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQxNl9zYXRfcnRlKGxvbmcxNik7CitpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50MTZfcnR6KGxvbmcxNik7CitpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50MTZfc2F0X3J0eihsb25nMTYpOworaW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDE2X3J0cChsb25nMTYpOworaW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDE2X3NhdF9ydHAobG9uZzE2KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQxNl9ydG4obG9uZzE2KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQxNl9zYXRfcnRuKGxvbmcxNik7CitpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50MTYobG9uZzE2KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQxNl9zYXQobG9uZzE2KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQxNl9ydGUodWxvbmcxNik7CitpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50MTZfc2F0X3J0ZSh1bG9uZzE2KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQxNl9ydHoodWxvbmcxNik7CitpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50MTZfc2F0X3J0eih1bG9uZzE2KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQxNl9ydHAodWxvbmcxNik7CitpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50MTZfc2F0X3J0cCh1bG9uZzE2KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQxNl9ydG4odWxvbmcxNik7CitpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50MTZfc2F0X3J0bih1bG9uZzE2KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQxNih1bG9uZzE2KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQxNl9zYXQodWxvbmcxNik7CitpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50MTZfcnRlKGZsb2F0MTYpOworaW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDE2X3NhdF9ydGUoZmxvYXQxNik7CitpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50MTZfcnR6KGZsb2F0MTYpOworaW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDE2X3NhdF9ydHooZmxvYXQxNik7CitpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50MTZfcnRwKGZsb2F0MTYpOworaW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDE2X3NhdF9ydHAoZmxvYXQxNik7CitpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50MTZfcnRuKGZsb2F0MTYpOworaW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDE2X3NhdF9ydG4oZmxvYXQxNik7CitpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50MTYoZmxvYXQxNik7CitpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50MTZfc2F0KGZsb2F0MTYpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50MTZfcnRlKGNoYXIxNik7Cit1aW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQxNl9zYXRfcnRlKGNoYXIxNik7Cit1aW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQxNl9ydHooY2hhcjE2KTsKK3VpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDE2X3NhdF9ydHooY2hhcjE2KTsKK3VpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDE2X3J0cChjaGFyMTYpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50MTZfc2F0X3J0cChjaGFyMTYpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50MTZfcnRuKGNoYXIxNik7Cit1aW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQxNl9zYXRfcnRuKGNoYXIxNik7Cit1aW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQxNihjaGFyMTYpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50MTZfc2F0KGNoYXIxNik7Cit1aW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQxNl9ydGUodWNoYXIxNik7Cit1aW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQxNl9zYXRfcnRlKHVjaGFyMTYpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50MTZfcnR6KHVjaGFyMTYpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50MTZfc2F0X3J0eih1Y2hhcjE2KTsKK3VpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDE2X3J0cCh1Y2hhcjE2KTsKK3VpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDE2X3NhdF9ydHAodWNoYXIxNik7Cit1aW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQxNl9ydG4odWNoYXIxNik7Cit1aW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQxNl9zYXRfcnRuKHVjaGFyMTYpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50MTYodWNoYXIxNik7Cit1aW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQxNl9zYXQodWNoYXIxNik7Cit1aW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQxNl9ydGUoc2hvcnQxNik7Cit1aW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQxNl9zYXRfcnRlKHNob3J0MTYpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50MTZfcnR6KHNob3J0MTYpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50MTZfc2F0X3J0eihzaG9ydDE2KTsKK3VpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDE2X3J0cChzaG9ydDE2KTsKK3VpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDE2X3NhdF9ydHAoc2hvcnQxNik7Cit1aW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQxNl9ydG4oc2hvcnQxNik7Cit1aW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQxNl9zYXRfcnRuKHNob3J0MTYpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50MTYoc2hvcnQxNik7Cit1aW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQxNl9zYXQoc2hvcnQxNik7Cit1aW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQxNl9ydGUodXNob3J0MTYpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50MTZfc2F0X3J0ZSh1c2hvcnQxNik7Cit1aW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQxNl9ydHoodXNob3J0MTYpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50MTZfc2F0X3J0eih1c2hvcnQxNik7Cit1aW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQxNl9ydHAodXNob3J0MTYpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50MTZfc2F0X3J0cCh1c2hvcnQxNik7Cit1aW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQxNl9ydG4odXNob3J0MTYpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50MTZfc2F0X3J0bih1c2hvcnQxNik7Cit1aW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQxNih1c2hvcnQxNik7Cit1aW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQxNl9zYXQodXNob3J0MTYpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50MTZfcnRlKGludDE2KTsKK3VpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDE2X3NhdF9ydGUoaW50MTYpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50MTZfcnR6KGludDE2KTsKK3VpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDE2X3NhdF9ydHooaW50MTYpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50MTZfcnRwKGludDE2KTsKK3VpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDE2X3NhdF9ydHAoaW50MTYpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50MTZfcnRuKGludDE2KTsKK3VpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDE2X3NhdF9ydG4oaW50MTYpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50MTYoaW50MTYpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50MTZfc2F0KGludDE2KTsKK3VpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDE2X3J0ZSh1aW50MTYpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50MTZfc2F0X3J0ZSh1aW50MTYpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50MTZfcnR6KHVpbnQxNik7Cit1aW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQxNl9zYXRfcnR6KHVpbnQxNik7Cit1aW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQxNl9ydHAodWludDE2KTsKK3VpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDE2X3NhdF9ydHAodWludDE2KTsKK3VpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDE2X3J0bih1aW50MTYpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50MTZfc2F0X3J0bih1aW50MTYpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50MTYodWludDE2KTsKK3VpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDE2X3NhdCh1aW50MTYpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50MTZfcnRlKGxvbmcxNik7Cit1aW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQxNl9zYXRfcnRlKGxvbmcxNik7Cit1aW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQxNl9ydHoobG9uZzE2KTsKK3VpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDE2X3NhdF9ydHoobG9uZzE2KTsKK3VpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDE2X3J0cChsb25nMTYpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50MTZfc2F0X3J0cChsb25nMTYpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50MTZfcnRuKGxvbmcxNik7Cit1aW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQxNl9zYXRfcnRuKGxvbmcxNik7Cit1aW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQxNihsb25nMTYpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50MTZfc2F0KGxvbmcxNik7Cit1aW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQxNl9ydGUodWxvbmcxNik7Cit1aW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQxNl9zYXRfcnRlKHVsb25nMTYpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50MTZfcnR6KHVsb25nMTYpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50MTZfc2F0X3J0eih1bG9uZzE2KTsKK3VpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDE2X3J0cCh1bG9uZzE2KTsKK3VpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDE2X3NhdF9ydHAodWxvbmcxNik7Cit1aW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQxNl9ydG4odWxvbmcxNik7Cit1aW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQxNl9zYXRfcnRuKHVsb25nMTYpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50MTYodWxvbmcxNik7Cit1aW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQxNl9zYXQodWxvbmcxNik7Cit1aW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQxNl9ydGUoZmxvYXQxNik7Cit1aW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQxNl9zYXRfcnRlKGZsb2F0MTYpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50MTZfcnR6KGZsb2F0MTYpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50MTZfc2F0X3J0eihmbG9hdDE2KTsKK3VpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDE2X3J0cChmbG9hdDE2KTsKK3VpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDE2X3NhdF9ydHAoZmxvYXQxNik7Cit1aW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQxNl9ydG4oZmxvYXQxNik7Cit1aW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQxNl9zYXRfcnRuKGZsb2F0MTYpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50MTYoZmxvYXQxNik7Cit1aW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQxNl9zYXQoZmxvYXQxNik7Citsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcxNl9ydGUoY2hhcjE2KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzE2X3NhdF9ydGUoY2hhcjE2KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzE2X3J0eihjaGFyMTYpOworbG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMTZfc2F0X3J0eihjaGFyMTYpOworbG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMTZfcnRwKGNoYXIxNik7Citsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcxNl9zYXRfcnRwKGNoYXIxNik7Citsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcxNl9ydG4oY2hhcjE2KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzE2X3NhdF9ydG4oY2hhcjE2KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzE2KGNoYXIxNik7Citsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcxNl9zYXQoY2hhcjE2KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzE2X3J0ZSh1Y2hhcjE2KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzE2X3NhdF9ydGUodWNoYXIxNik7Citsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcxNl9ydHoodWNoYXIxNik7Citsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcxNl9zYXRfcnR6KHVjaGFyMTYpOworbG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMTZfcnRwKHVjaGFyMTYpOworbG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMTZfc2F0X3J0cCh1Y2hhcjE2KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzE2X3J0bih1Y2hhcjE2KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzE2X3NhdF9ydG4odWNoYXIxNik7Citsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcxNih1Y2hhcjE2KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzE2X3NhdCh1Y2hhcjE2KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzE2X3J0ZShzaG9ydDE2KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzE2X3NhdF9ydGUoc2hvcnQxNik7Citsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcxNl9ydHooc2hvcnQxNik7Citsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcxNl9zYXRfcnR6KHNob3J0MTYpOworbG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMTZfcnRwKHNob3J0MTYpOworbG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMTZfc2F0X3J0cChzaG9ydDE2KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzE2X3J0bihzaG9ydDE2KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzE2X3NhdF9ydG4oc2hvcnQxNik7Citsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcxNihzaG9ydDE2KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzE2X3NhdChzaG9ydDE2KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzE2X3J0ZSh1c2hvcnQxNik7Citsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcxNl9zYXRfcnRlKHVzaG9ydDE2KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzE2X3J0eih1c2hvcnQxNik7Citsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcxNl9zYXRfcnR6KHVzaG9ydDE2KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzE2X3J0cCh1c2hvcnQxNik7Citsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcxNl9zYXRfcnRwKHVzaG9ydDE2KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzE2X3J0bih1c2hvcnQxNik7Citsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcxNl9zYXRfcnRuKHVzaG9ydDE2KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzE2KHVzaG9ydDE2KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzE2X3NhdCh1c2hvcnQxNik7Citsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcxNl9ydGUoaW50MTYpOworbG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMTZfc2F0X3J0ZShpbnQxNik7Citsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcxNl9ydHooaW50MTYpOworbG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMTZfc2F0X3J0eihpbnQxNik7Citsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcxNl9ydHAoaW50MTYpOworbG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMTZfc2F0X3J0cChpbnQxNik7Citsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcxNl9ydG4oaW50MTYpOworbG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMTZfc2F0X3J0bihpbnQxNik7Citsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcxNihpbnQxNik7Citsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcxNl9zYXQoaW50MTYpOworbG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMTZfcnRlKHVpbnQxNik7Citsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcxNl9zYXRfcnRlKHVpbnQxNik7Citsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcxNl9ydHoodWludDE2KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzE2X3NhdF9ydHoodWludDE2KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzE2X3J0cCh1aW50MTYpOworbG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMTZfc2F0X3J0cCh1aW50MTYpOworbG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMTZfcnRuKHVpbnQxNik7Citsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcxNl9zYXRfcnRuKHVpbnQxNik7Citsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcxNih1aW50MTYpOworbG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMTZfc2F0KHVpbnQxNik7Citsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcxNl9ydGUobG9uZzE2KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzE2X3NhdF9ydGUobG9uZzE2KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzE2X3J0eihsb25nMTYpOworbG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMTZfc2F0X3J0eihsb25nMTYpOworbG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMTZfcnRwKGxvbmcxNik7Citsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcxNl9zYXRfcnRwKGxvbmcxNik7Citsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcxNl9ydG4obG9uZzE2KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzE2X3NhdF9ydG4obG9uZzE2KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzE2KGxvbmcxNik7Citsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcxNl9zYXQobG9uZzE2KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzE2X3J0ZSh1bG9uZzE2KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzE2X3NhdF9ydGUodWxvbmcxNik7Citsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcxNl9ydHoodWxvbmcxNik7Citsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcxNl9zYXRfcnR6KHVsb25nMTYpOworbG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMTZfcnRwKHVsb25nMTYpOworbG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMTZfc2F0X3J0cCh1bG9uZzE2KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzE2X3J0bih1bG9uZzE2KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzE2X3NhdF9ydG4odWxvbmcxNik7Citsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcxNih1bG9uZzE2KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzE2X3NhdCh1bG9uZzE2KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzE2X3J0ZShmbG9hdDE2KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzE2X3NhdF9ydGUoZmxvYXQxNik7Citsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcxNl9ydHooZmxvYXQxNik7Citsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcxNl9zYXRfcnR6KGZsb2F0MTYpOworbG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMTZfcnRwKGZsb2F0MTYpOworbG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMTZfc2F0X3J0cChmbG9hdDE2KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzE2X3J0bihmbG9hdDE2KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzE2X3NhdF9ydG4oZmxvYXQxNik7Citsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcxNihmbG9hdDE2KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzE2X3NhdChmbG9hdDE2KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMTZfcnRlKGNoYXIxNik7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzE2X3NhdF9ydGUoY2hhcjE2KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMTZfcnR6KGNoYXIxNik7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzE2X3NhdF9ydHooY2hhcjE2KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMTZfcnRwKGNoYXIxNik7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzE2X3NhdF9ydHAoY2hhcjE2KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMTZfcnRuKGNoYXIxNik7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzE2X3NhdF9ydG4oY2hhcjE2KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMTYoY2hhcjE2KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMTZfc2F0KGNoYXIxNik7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzE2X3J0ZSh1Y2hhcjE2KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMTZfc2F0X3J0ZSh1Y2hhcjE2KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMTZfcnR6KHVjaGFyMTYpOwordWxvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcxNl9zYXRfcnR6KHVjaGFyMTYpOwordWxvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcxNl9ydHAodWNoYXIxNik7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzE2X3NhdF9ydHAodWNoYXIxNik7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzE2X3J0bih1Y2hhcjE2KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMTZfc2F0X3J0bih1Y2hhcjE2KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMTYodWNoYXIxNik7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzE2X3NhdCh1Y2hhcjE2KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMTZfcnRlKHNob3J0MTYpOwordWxvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcxNl9zYXRfcnRlKHNob3J0MTYpOwordWxvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcxNl9ydHooc2hvcnQxNik7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzE2X3NhdF9ydHooc2hvcnQxNik7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzE2X3J0cChzaG9ydDE2KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMTZfc2F0X3J0cChzaG9ydDE2KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMTZfcnRuKHNob3J0MTYpOwordWxvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcxNl9zYXRfcnRuKHNob3J0MTYpOwordWxvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcxNihzaG9ydDE2KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMTZfc2F0KHNob3J0MTYpOwordWxvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcxNl9ydGUodXNob3J0MTYpOwordWxvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcxNl9zYXRfcnRlKHVzaG9ydDE2KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMTZfcnR6KHVzaG9ydDE2KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMTZfc2F0X3J0eih1c2hvcnQxNik7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzE2X3J0cCh1c2hvcnQxNik7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzE2X3NhdF9ydHAodXNob3J0MTYpOwordWxvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcxNl9ydG4odXNob3J0MTYpOwordWxvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcxNl9zYXRfcnRuKHVzaG9ydDE2KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMTYodXNob3J0MTYpOwordWxvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcxNl9zYXQodXNob3J0MTYpOwordWxvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcxNl9ydGUoaW50MTYpOwordWxvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcxNl9zYXRfcnRlKGludDE2KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMTZfcnR6KGludDE2KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMTZfc2F0X3J0eihpbnQxNik7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzE2X3J0cChpbnQxNik7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzE2X3NhdF9ydHAoaW50MTYpOwordWxvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcxNl9ydG4oaW50MTYpOwordWxvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcxNl9zYXRfcnRuKGludDE2KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMTYoaW50MTYpOwordWxvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcxNl9zYXQoaW50MTYpOwordWxvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcxNl9ydGUodWludDE2KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMTZfc2F0X3J0ZSh1aW50MTYpOwordWxvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcxNl9ydHoodWludDE2KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMTZfc2F0X3J0eih1aW50MTYpOwordWxvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcxNl9ydHAodWludDE2KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMTZfc2F0X3J0cCh1aW50MTYpOwordWxvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcxNl9ydG4odWludDE2KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMTZfc2F0X3J0bih1aW50MTYpOwordWxvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcxNih1aW50MTYpOwordWxvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcxNl9zYXQodWludDE2KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMTZfcnRlKGxvbmcxNik7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzE2X3NhdF9ydGUobG9uZzE2KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMTZfcnR6KGxvbmcxNik7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzE2X3NhdF9ydHoobG9uZzE2KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMTZfcnRwKGxvbmcxNik7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzE2X3NhdF9ydHAobG9uZzE2KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMTZfcnRuKGxvbmcxNik7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzE2X3NhdF9ydG4obG9uZzE2KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMTYobG9uZzE2KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMTZfc2F0KGxvbmcxNik7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzE2X3J0ZSh1bG9uZzE2KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMTZfc2F0X3J0ZSh1bG9uZzE2KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMTZfcnR6KHVsb25nMTYpOwordWxvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcxNl9zYXRfcnR6KHVsb25nMTYpOwordWxvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcxNl9ydHAodWxvbmcxNik7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzE2X3NhdF9ydHAodWxvbmcxNik7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzE2X3J0bih1bG9uZzE2KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMTZfc2F0X3J0bih1bG9uZzE2KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMTYodWxvbmcxNik7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzE2X3NhdCh1bG9uZzE2KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMTZfcnRlKGZsb2F0MTYpOwordWxvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcxNl9zYXRfcnRlKGZsb2F0MTYpOwordWxvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcxNl9ydHooZmxvYXQxNik7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzE2X3NhdF9ydHooZmxvYXQxNik7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzE2X3J0cChmbG9hdDE2KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMTZfc2F0X3J0cChmbG9hdDE2KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMTZfcnRuKGZsb2F0MTYpOwordWxvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcxNl9zYXRfcnRuKGZsb2F0MTYpOwordWxvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcxNihmbG9hdDE2KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMTZfc2F0KGZsb2F0MTYpOworZmxvYXQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQxNl9ydGUoY2hhcjE2KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0MTZfcnR6KGNoYXIxNik7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDE2X3J0cChjaGFyMTYpOworZmxvYXQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQxNl9ydG4oY2hhcjE2KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0MTYoY2hhcjE2KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0MTZfcnRlKHVjaGFyMTYpOworZmxvYXQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQxNl9ydHoodWNoYXIxNik7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDE2X3J0cCh1Y2hhcjE2KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0MTZfcnRuKHVjaGFyMTYpOworZmxvYXQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQxNih1Y2hhcjE2KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0MTZfcnRlKHNob3J0MTYpOworZmxvYXQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQxNl9ydHooc2hvcnQxNik7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDE2X3J0cChzaG9ydDE2KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0MTZfcnRuKHNob3J0MTYpOworZmxvYXQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQxNihzaG9ydDE2KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0MTZfcnRlKHVzaG9ydDE2KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0MTZfcnR6KHVzaG9ydDE2KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0MTZfcnRwKHVzaG9ydDE2KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0MTZfcnRuKHVzaG9ydDE2KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0MTYodXNob3J0MTYpOworZmxvYXQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQxNl9ydGUoaW50MTYpOworZmxvYXQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQxNl9ydHooaW50MTYpOworZmxvYXQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQxNl9ydHAoaW50MTYpOworZmxvYXQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQxNl9ydG4oaW50MTYpOworZmxvYXQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQxNihpbnQxNik7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDE2X3J0ZSh1aW50MTYpOworZmxvYXQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQxNl9ydHoodWludDE2KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0MTZfcnRwKHVpbnQxNik7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDE2X3J0bih1aW50MTYpOworZmxvYXQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQxNih1aW50MTYpOworZmxvYXQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQxNl9ydGUobG9uZzE2KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0MTZfcnR6KGxvbmcxNik7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDE2X3J0cChsb25nMTYpOworZmxvYXQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQxNl9ydG4obG9uZzE2KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0MTYobG9uZzE2KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0MTZfcnRlKHVsb25nMTYpOworZmxvYXQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQxNl9ydHoodWxvbmcxNik7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDE2X3J0cCh1bG9uZzE2KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0MTZfcnRuKHVsb25nMTYpOworZmxvYXQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQxNih1bG9uZzE2KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0MTZfcnRlKGZsb2F0MTYpOworZmxvYXQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQxNl9ydHooZmxvYXQxNik7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDE2X3J0cChmbG9hdDE2KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0MTZfcnRuKGZsb2F0MTYpOworZmxvYXQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQxNihmbG9hdDE2KTsKKworLy8gQ29udmVyc2lvbnMgd2l0aCBkb3VibGUgZGF0YSB0eXBlIHBhcmFtZXRlcnMgb3IgcmV0dXJuIHZhbHVlLgorCisjaWZkZWYgY2xfa2hyX2ZwNjQKK2NoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIoZG91YmxlKTsKK2NoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXJfcnRlKGRvdWJsZSk7CitjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyX3J0bihkb3VibGUpOworY2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcl9ydHAoZG91YmxlKTsKK2NoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXJfcnR6KGRvdWJsZSk7CitjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyX3NhdChkb3VibGUpOworY2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcl9zYXRfcnRlKGRvdWJsZSk7CitjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyX3NhdF9ydG4oZG91YmxlKTsKK2NoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXJfc2F0X3J0cChkb3VibGUpOworY2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcl9zYXRfcnR6KGRvdWJsZSk7CitjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjIoZG91YmxlMik7CitjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjJfcnRlKGRvdWJsZTIpOworY2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIyX3J0bihkb3VibGUyKTsKK2NoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMl9ydHAoZG91YmxlMik7CitjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjJfcnR6KGRvdWJsZTIpOworY2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIyX3NhdChkb3VibGUyKTsKK2NoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMl9zYXRfcnRlKGRvdWJsZTIpOworY2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIyX3NhdF9ydG4oZG91YmxlMik7CitjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjJfc2F0X3J0cChkb3VibGUyKTsKK2NoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMl9zYXRfcnR6KGRvdWJsZTIpOworY2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIzKGRvdWJsZTMpOworY2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIzX3J0ZShkb3VibGUzKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyM19ydG4oZG91YmxlMyk7CitjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjNfcnRwKGRvdWJsZTMpOworY2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIzX3J0eihkb3VibGUzKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyM19zYXQoZG91YmxlMyk7CitjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjNfc2F0X3J0ZShkb3VibGUzKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyM19zYXRfcnRuKGRvdWJsZTMpOworY2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIzX3NhdF9ydHAoZG91YmxlMyk7CitjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjNfc2F0X3J0eihkb3VibGUzKTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyNChkb3VibGU0KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyNF9ydGUoZG91YmxlNCk7CitjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjRfcnRuKGRvdWJsZTQpOworY2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI0X3J0cChkb3VibGU0KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyNF9ydHooZG91YmxlNCk7CitjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjRfc2F0KGRvdWJsZTQpOworY2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI0X3NhdF9ydGUoZG91YmxlNCk7CitjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjRfc2F0X3J0bihkb3VibGU0KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyNF9zYXRfcnRwKGRvdWJsZTQpOworY2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI0X3NhdF9ydHooZG91YmxlNCk7CitjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjgoZG91YmxlOCk7CitjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjhfcnRlKGRvdWJsZTgpOworY2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI4X3J0bihkb3VibGU4KTsKK2NoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyOF9ydHAoZG91YmxlOCk7CitjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjhfcnR6KGRvdWJsZTgpOworY2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI4X3NhdChkb3VibGU4KTsKK2NoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyOF9zYXRfcnRlKGRvdWJsZTgpOworY2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI4X3NhdF9ydG4oZG91YmxlOCk7CitjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjhfc2F0X3J0cChkb3VibGU4KTsKK2NoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyOF9zYXRfcnR6KGRvdWJsZTgpOworY2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMTYoZG91YmxlMTYpOworY2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMTZfcnRlKGRvdWJsZTE2KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjE2X3J0bihkb3VibGUxNik7CitjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIxNl9ydHAoZG91YmxlMTYpOworY2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMTZfcnR6KGRvdWJsZTE2KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjE2X3NhdChkb3VibGUxNik7CitjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIxNl9zYXRfcnRlKGRvdWJsZTE2KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjE2X3NhdF9ydG4oZG91YmxlMTYpOworY2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMTZfc2F0X3J0cChkb3VibGUxNik7CitjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIxNl9zYXRfcnR6KGRvdWJsZTE2KTsKKwordWNoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyKGRvdWJsZSk7Cit1Y2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXJfcnRlKGRvdWJsZSk7Cit1Y2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXJfcnRuKGRvdWJsZSk7Cit1Y2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXJfcnRwKGRvdWJsZSk7Cit1Y2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXJfcnR6KGRvdWJsZSk7Cit1Y2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXJfc2F0KGRvdWJsZSk7Cit1Y2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXJfc2F0X3J0ZShkb3VibGUpOwordWNoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyX3NhdF9ydG4oZG91YmxlKTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcl9zYXRfcnRwKGRvdWJsZSk7Cit1Y2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXJfc2F0X3J0eihkb3VibGUpOwordWNoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjIoZG91YmxlMik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMl9ydGUoZG91YmxlMik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMl9ydG4oZG91YmxlMik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMl9ydHAoZG91YmxlMik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMl9ydHooZG91YmxlMik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMl9zYXQoZG91YmxlMik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMl9zYXRfcnRlKGRvdWJsZTIpOwordWNoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjJfc2F0X3J0bihkb3VibGUyKTsKK3VjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIyX3NhdF9ydHAoZG91YmxlMik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMl9zYXRfcnR6KGRvdWJsZTIpOwordWNoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjMoZG91YmxlMyk7Cit1Y2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyM19ydGUoZG91YmxlMyk7Cit1Y2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyM19ydG4oZG91YmxlMyk7Cit1Y2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyM19ydHAoZG91YmxlMyk7Cit1Y2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyM19ydHooZG91YmxlMyk7Cit1Y2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyM19zYXQoZG91YmxlMyk7Cit1Y2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyM19zYXRfcnRlKGRvdWJsZTMpOwordWNoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjNfc2F0X3J0bihkb3VibGUzKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIzX3NhdF9ydHAoZG91YmxlMyk7Cit1Y2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyM19zYXRfcnR6KGRvdWJsZTMpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjQoZG91YmxlNCk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyNF9ydGUoZG91YmxlNCk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyNF9ydG4oZG91YmxlNCk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyNF9ydHAoZG91YmxlNCk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyNF9ydHooZG91YmxlNCk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyNF9zYXQoZG91YmxlNCk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyNF9zYXRfcnRlKGRvdWJsZTQpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjRfc2F0X3J0bihkb3VibGU0KTsKK3VjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI0X3NhdF9ydHAoZG91YmxlNCk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyNF9zYXRfcnR6KGRvdWJsZTQpOwordWNoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjgoZG91YmxlOCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOF9ydGUoZG91YmxlOCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOF9ydG4oZG91YmxlOCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOF9ydHAoZG91YmxlOCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOF9ydHooZG91YmxlOCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOF9zYXQoZG91YmxlOCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOF9zYXRfcnRlKGRvdWJsZTgpOwordWNoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjhfc2F0X3J0bihkb3VibGU4KTsKK3VjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI4X3NhdF9ydHAoZG91YmxlOCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOF9zYXRfcnR6KGRvdWJsZTgpOwordWNoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIxNihkb3VibGUxNik7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjE2X3J0ZShkb3VibGUxNik7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjE2X3J0bihkb3VibGUxNik7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjE2X3J0cChkb3VibGUxNik7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjE2X3J0eihkb3VibGUxNik7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjE2X3NhdChkb3VibGUxNik7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjE2X3NhdF9ydGUoZG91YmxlMTYpOwordWNoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIxNl9zYXRfcnRuKGRvdWJsZTE2KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMTZfc2F0X3J0cChkb3VibGUxNik7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjE2X3NhdF9ydHooZG91YmxlMTYpOworCitzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQoZG91YmxlKTsKK3Nob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydF9ydGUoZG91YmxlKTsKK3Nob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydF9ydG4oZG91YmxlKTsKK3Nob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydF9ydHAoZG91YmxlKTsKK3Nob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydF9ydHooZG91YmxlKTsKK3Nob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydF9zYXQoZG91YmxlKTsKK3Nob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydF9zYXRfcnRlKGRvdWJsZSk7CitzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnRfc2F0X3J0bihkb3VibGUpOworc2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0X3NhdF9ydHAoZG91YmxlKTsKK3Nob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydF9zYXRfcnR6KGRvdWJsZSk7CitzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0Mihkb3VibGUyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyX3J0ZShkb3VibGUyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyX3J0bihkb3VibGUyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyX3J0cChkb3VibGUyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyX3J0eihkb3VibGUyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyX3NhdChkb3VibGUyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyX3NhdF9ydGUoZG91YmxlMik7CitzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0Ml9zYXRfcnRuKGRvdWJsZTIpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDJfc2F0X3J0cChkb3VibGUyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyX3NhdF9ydHooZG91YmxlMik7CitzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0Myhkb3VibGUzKTsKK3Nob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQzX3J0ZShkb3VibGUzKTsKK3Nob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQzX3J0bihkb3VibGUzKTsKK3Nob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQzX3J0cChkb3VibGUzKTsKK3Nob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQzX3J0eihkb3VibGUzKTsKK3Nob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQzX3NhdChkb3VibGUzKTsKK3Nob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQzX3NhdF9ydGUoZG91YmxlMyk7CitzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0M19zYXRfcnRuKGRvdWJsZTMpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDNfc2F0X3J0cChkb3VibGUzKTsKK3Nob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQzX3NhdF9ydHooZG91YmxlMyk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0NChkb3VibGU0KTsKK3Nob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ0X3J0ZShkb3VibGU0KTsKK3Nob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ0X3J0bihkb3VibGU0KTsKK3Nob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ0X3J0cChkb3VibGU0KTsKK3Nob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ0X3J0eihkb3VibGU0KTsKK3Nob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ0X3NhdChkb3VibGU0KTsKK3Nob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ0X3NhdF9ydGUoZG91YmxlNCk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0NF9zYXRfcnRuKGRvdWJsZTQpOworc2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDRfc2F0X3J0cChkb3VibGU0KTsKK3Nob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ0X3NhdF9ydHooZG91YmxlNCk7CitzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0OChkb3VibGU4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4X3J0ZShkb3VibGU4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4X3J0bihkb3VibGU4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4X3J0cChkb3VibGU4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4X3J0eihkb3VibGU4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4X3NhdChkb3VibGU4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4X3NhdF9ydGUoZG91YmxlOCk7CitzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0OF9zYXRfcnRuKGRvdWJsZTgpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDhfc2F0X3J0cChkb3VibGU4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4X3NhdF9ydHooZG91YmxlOCk7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDE2KGRvdWJsZTE2KTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0MTZfcnRlKGRvdWJsZTE2KTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0MTZfcnRuKGRvdWJsZTE2KTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0MTZfcnRwKGRvdWJsZTE2KTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0MTZfcnR6KGRvdWJsZTE2KTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0MTZfc2F0KGRvdWJsZTE2KTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0MTZfc2F0X3J0ZShkb3VibGUxNik7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDE2X3NhdF9ydG4oZG91YmxlMTYpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQxNl9zYXRfcnRwKGRvdWJsZTE2KTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0MTZfc2F0X3J0eihkb3VibGUxNik7CisKK3VzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0KGRvdWJsZSk7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydF9ydGUoZG91YmxlKTsKK3VzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0X3J0bihkb3VibGUpOwordXNob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnRfcnRwKGRvdWJsZSk7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydF9ydHooZG91YmxlKTsKK3VzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0X3NhdChkb3VibGUpOwordXNob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnRfc2F0X3J0ZShkb3VibGUpOwordXNob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnRfc2F0X3J0bihkb3VibGUpOwordXNob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnRfc2F0X3J0cChkb3VibGUpOwordXNob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnRfc2F0X3J0eihkb3VibGUpOwordXNob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0Mihkb3VibGUyKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDJfcnRlKGRvdWJsZTIpOwordXNob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0Ml9ydG4oZG91YmxlMik7Cit1c2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQyX3J0cChkb3VibGUyKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDJfcnR6KGRvdWJsZTIpOwordXNob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0Ml9zYXQoZG91YmxlMik7Cit1c2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQyX3NhdF9ydGUoZG91YmxlMik7Cit1c2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQyX3NhdF9ydG4oZG91YmxlMik7Cit1c2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQyX3NhdF9ydHAoZG91YmxlMik7Cit1c2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQyX3NhdF9ydHooZG91YmxlMik7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQzKGRvdWJsZTMpOwordXNob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0M19ydGUoZG91YmxlMyk7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQzX3J0bihkb3VibGUzKTsKK3VzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDNfcnRwKGRvdWJsZTMpOwordXNob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0M19ydHooZG91YmxlMyk7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQzX3NhdChkb3VibGUzKTsKK3VzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDNfc2F0X3J0ZShkb3VibGUzKTsKK3VzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDNfc2F0X3J0bihkb3VibGUzKTsKK3VzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDNfc2F0X3J0cChkb3VibGUzKTsKK3VzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDNfc2F0X3J0eihkb3VibGUzKTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDQoZG91YmxlNCk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ0X3J0ZShkb3VibGU0KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDRfcnRuKGRvdWJsZTQpOwordXNob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0NF9ydHAoZG91YmxlNCk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ0X3J0eihkb3VibGU0KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDRfc2F0KGRvdWJsZTQpOwordXNob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0NF9zYXRfcnRlKGRvdWJsZTQpOwordXNob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0NF9zYXRfcnRuKGRvdWJsZTQpOwordXNob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0NF9zYXRfcnRwKGRvdWJsZTQpOwordXNob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0NF9zYXRfcnR6KGRvdWJsZTQpOwordXNob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0OChkb3VibGU4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDhfcnRlKGRvdWJsZTgpOwordXNob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0OF9ydG4oZG91YmxlOCk7Cit1c2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ4X3J0cChkb3VibGU4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDhfcnR6KGRvdWJsZTgpOwordXNob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0OF9zYXQoZG91YmxlOCk7Cit1c2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ4X3NhdF9ydGUoZG91YmxlOCk7Cit1c2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ4X3NhdF9ydG4oZG91YmxlOCk7Cit1c2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ4X3NhdF9ydHAoZG91YmxlOCk7Cit1c2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ4X3NhdF9ydHooZG91YmxlOCk7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0MTYoZG91YmxlMTYpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDE2X3J0ZShkb3VibGUxNik7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0MTZfcnRuKGRvdWJsZTE2KTsKK3VzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQxNl9ydHAoZG91YmxlMTYpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDE2X3J0eihkb3VibGUxNik7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0MTZfc2F0KGRvdWJsZTE2KTsKK3VzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQxNl9zYXRfcnRlKGRvdWJsZTE2KTsKK3VzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQxNl9zYXRfcnRuKGRvdWJsZTE2KTsKK3VzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQxNl9zYXRfcnRwKGRvdWJsZTE2KTsKK3VzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQxNl9zYXRfcnR6KGRvdWJsZTE2KTsKKworaW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQoZG91YmxlKTsKK2ludCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50X3J0ZShkb3VibGUpOworaW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnRfcnRuKGRvdWJsZSk7CitpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludF9ydHAoZG91YmxlKTsKK2ludCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50X3J0eihkb3VibGUpOworaW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnRfc2F0KGRvdWJsZSk7CitpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludF9zYXRfcnRlKGRvdWJsZSk7CitpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludF9zYXRfcnRuKGRvdWJsZSk7CitpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludF9zYXRfcnRwKGRvdWJsZSk7CitpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludF9zYXRfcnR6KGRvdWJsZSk7CitpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQyKGRvdWJsZTIpOworaW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50Ml9ydGUoZG91YmxlMik7CitpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQyX3J0bihkb3VibGUyKTsKK2ludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDJfcnRwKGRvdWJsZTIpOworaW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50Ml9ydHooZG91YmxlMik7CitpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQyX3NhdChkb3VibGUyKTsKK2ludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDJfc2F0X3J0ZShkb3VibGUyKTsKK2ludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDJfc2F0X3J0bihkb3VibGUyKTsKK2ludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDJfc2F0X3J0cChkb3VibGUyKTsKK2ludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDJfc2F0X3J0eihkb3VibGUyKTsKK2ludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDMoZG91YmxlMyk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQzX3J0ZShkb3VibGUzKTsKK2ludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDNfcnRuKGRvdWJsZTMpOworaW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50M19ydHAoZG91YmxlMyk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQzX3J0eihkb3VibGUzKTsKK2ludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDNfc2F0KGRvdWJsZTMpOworaW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50M19zYXRfcnRlKGRvdWJsZTMpOworaW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50M19zYXRfcnRuKGRvdWJsZTMpOworaW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50M19zYXRfcnRwKGRvdWJsZTMpOworaW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50M19zYXRfcnR6KGRvdWJsZTMpOworaW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50NChkb3VibGU0KTsKK2ludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDRfcnRlKGRvdWJsZTQpOworaW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50NF9ydG4oZG91YmxlNCk7CitpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ0X3J0cChkb3VibGU0KTsKK2ludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDRfcnR6KGRvdWJsZTQpOworaW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50NF9zYXQoZG91YmxlNCk7CitpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ0X3NhdF9ydGUoZG91YmxlNCk7CitpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ0X3NhdF9ydG4oZG91YmxlNCk7CitpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ0X3NhdF9ydHAoZG91YmxlNCk7CitpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ0X3NhdF9ydHooZG91YmxlNCk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ4KGRvdWJsZTgpOworaW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50OF9ydGUoZG91YmxlOCk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ4X3J0bihkb3VibGU4KTsKK2ludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDhfcnRwKGRvdWJsZTgpOworaW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50OF9ydHooZG91YmxlOCk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ4X3NhdChkb3VibGU4KTsKK2ludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDhfc2F0X3J0ZShkb3VibGU4KTsKK2ludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDhfc2F0X3J0bihkb3VibGU4KTsKK2ludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDhfc2F0X3J0cChkb3VibGU4KTsKK2ludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDhfc2F0X3J0eihkb3VibGU4KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQxNihkb3VibGUxNik7CitpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50MTZfcnRlKGRvdWJsZTE2KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQxNl9ydG4oZG91YmxlMTYpOworaW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDE2X3J0cChkb3VibGUxNik7CitpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50MTZfcnR6KGRvdWJsZTE2KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQxNl9zYXQoZG91YmxlMTYpOworaW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDE2X3NhdF9ydGUoZG91YmxlMTYpOworaW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDE2X3NhdF9ydG4oZG91YmxlMTYpOworaW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDE2X3NhdF9ydHAoZG91YmxlMTYpOworaW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDE2X3NhdF9ydHooZG91YmxlMTYpOworCit1aW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50KGRvdWJsZSk7Cit1aW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50X3J0ZShkb3VibGUpOwordWludCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludF9ydG4oZG91YmxlKTsKK3VpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnRfcnRwKGRvdWJsZSk7Cit1aW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50X3J0eihkb3VibGUpOwordWludCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludF9zYXQoZG91YmxlKTsKK3VpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnRfc2F0X3J0ZShkb3VibGUpOwordWludCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludF9zYXRfcnRuKGRvdWJsZSk7Cit1aW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50X3NhdF9ydHAoZG91YmxlKTsKK3VpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnRfc2F0X3J0eihkb3VibGUpOwordWludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQyKGRvdWJsZTIpOwordWludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQyX3J0ZShkb3VibGUyKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50Ml9ydG4oZG91YmxlMik7Cit1aW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDJfcnRwKGRvdWJsZTIpOwordWludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQyX3J0eihkb3VibGUyKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50Ml9zYXQoZG91YmxlMik7Cit1aW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDJfc2F0X3J0ZShkb3VibGUyKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50Ml9zYXRfcnRuKGRvdWJsZTIpOwordWludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQyX3NhdF9ydHAoZG91YmxlMik7Cit1aW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDJfc2F0X3J0eihkb3VibGUyKTsKK3VpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50Myhkb3VibGUzKTsKK3VpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50M19ydGUoZG91YmxlMyk7Cit1aW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDNfcnRuKGRvdWJsZTMpOwordWludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQzX3J0cChkb3VibGUzKTsKK3VpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50M19ydHooZG91YmxlMyk7Cit1aW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDNfc2F0KGRvdWJsZTMpOwordWludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQzX3NhdF9ydGUoZG91YmxlMyk7Cit1aW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDNfc2F0X3J0bihkb3VibGUzKTsKK3VpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50M19zYXRfcnRwKGRvdWJsZTMpOwordWludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQzX3NhdF9ydHooZG91YmxlMyk7Cit1aW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDQoZG91YmxlNCk7Cit1aW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDRfcnRlKGRvdWJsZTQpOwordWludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ0X3J0bihkb3VibGU0KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50NF9ydHAoZG91YmxlNCk7Cit1aW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDRfcnR6KGRvdWJsZTQpOwordWludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ0X3NhdChkb3VibGU0KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50NF9zYXRfcnRlKGRvdWJsZTQpOwordWludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ0X3NhdF9ydG4oZG91YmxlNCk7Cit1aW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDRfc2F0X3J0cChkb3VibGU0KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50NF9zYXRfcnR6KGRvdWJsZTQpOwordWludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ4KGRvdWJsZTgpOwordWludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ4X3J0ZShkb3VibGU4KTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50OF9ydG4oZG91YmxlOCk7Cit1aW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDhfcnRwKGRvdWJsZTgpOwordWludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ4X3J0eihkb3VibGU4KTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50OF9zYXQoZG91YmxlOCk7Cit1aW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDhfc2F0X3J0ZShkb3VibGU4KTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50OF9zYXRfcnRuKGRvdWJsZTgpOwordWludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ4X3NhdF9ydHAoZG91YmxlOCk7Cit1aW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDhfc2F0X3J0eihkb3VibGU4KTsKK3VpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDE2KGRvdWJsZTE2KTsKK3VpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDE2X3J0ZShkb3VibGUxNik7Cit1aW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQxNl9ydG4oZG91YmxlMTYpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50MTZfcnRwKGRvdWJsZTE2KTsKK3VpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDE2X3J0eihkb3VibGUxNik7Cit1aW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQxNl9zYXQoZG91YmxlMTYpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50MTZfc2F0X3J0ZShkb3VibGUxNik7Cit1aW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQxNl9zYXRfcnRuKGRvdWJsZTE2KTsKK3VpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDE2X3NhdF9ydHAoZG91YmxlMTYpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50MTZfc2F0X3J0eihkb3VibGUxNik7CisKK2xvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcoZG91YmxlKTsKK2xvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmdfcnRlKGRvdWJsZSk7Citsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nX3J0bihkb3VibGUpOworbG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZ19ydHAoZG91YmxlKTsKK2xvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmdfcnR6KGRvdWJsZSk7Citsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nX3NhdChkb3VibGUpOworbG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZ19zYXRfcnRlKGRvdWJsZSk7Citsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nX3NhdF9ydG4oZG91YmxlKTsKK2xvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmdfc2F0X3J0cChkb3VibGUpOworbG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZ19zYXRfcnR6KGRvdWJsZSk7Citsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzIoZG91YmxlMik7Citsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzJfcnRlKGRvdWJsZTIpOworbG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcyX3J0bihkb3VibGUyKTsKK2xvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMl9ydHAoZG91YmxlMik7Citsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzJfcnR6KGRvdWJsZTIpOworbG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcyX3NhdChkb3VibGUyKTsKK2xvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMl9zYXRfcnRlKGRvdWJsZTIpOworbG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcyX3NhdF9ydG4oZG91YmxlMik7Citsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzJfc2F0X3J0cChkb3VibGUyKTsKK2xvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMl9zYXRfcnR6KGRvdWJsZTIpOworbG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmczKGRvdWJsZTMpOworbG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmczX3J0ZShkb3VibGUzKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nM19ydG4oZG91YmxlMyk7Citsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzNfcnRwKGRvdWJsZTMpOworbG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmczX3J0eihkb3VibGUzKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nM19zYXQoZG91YmxlMyk7Citsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzNfc2F0X3J0ZShkb3VibGUzKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nM19zYXRfcnRuKGRvdWJsZTMpOworbG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmczX3NhdF9ydHAoZG91YmxlMyk7Citsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzNfc2F0X3J0eihkb3VibGUzKTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nNChkb3VibGU0KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nNF9ydGUoZG91YmxlNCk7Citsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzRfcnRuKGRvdWJsZTQpOworbG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc0X3J0cChkb3VibGU0KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nNF9ydHooZG91YmxlNCk7Citsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzRfc2F0KGRvdWJsZTQpOworbG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc0X3NhdF9ydGUoZG91YmxlNCk7Citsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzRfc2F0X3J0bihkb3VibGU0KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nNF9zYXRfcnRwKGRvdWJsZTQpOworbG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc0X3NhdF9ydHooZG91YmxlNCk7Citsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzgoZG91YmxlOCk7Citsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzhfcnRlKGRvdWJsZTgpOworbG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc4X3J0bihkb3VibGU4KTsKK2xvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nOF9ydHAoZG91YmxlOCk7Citsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzhfcnR6KGRvdWJsZTgpOworbG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc4X3NhdChkb3VibGU4KTsKK2xvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nOF9zYXRfcnRlKGRvdWJsZTgpOworbG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc4X3NhdF9ydG4oZG91YmxlOCk7Citsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzhfc2F0X3J0cChkb3VibGU4KTsKK2xvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nOF9zYXRfcnR6KGRvdWJsZTgpOworbG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMTYoZG91YmxlMTYpOworbG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMTZfcnRlKGRvdWJsZTE2KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzE2X3J0bihkb3VibGUxNik7Citsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcxNl9ydHAoZG91YmxlMTYpOworbG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMTZfcnR6KGRvdWJsZTE2KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzE2X3NhdChkb3VibGUxNik7Citsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcxNl9zYXRfcnRlKGRvdWJsZTE2KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzE2X3NhdF9ydG4oZG91YmxlMTYpOworbG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMTZfc2F0X3J0cChkb3VibGUxNik7Citsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcxNl9zYXRfcnR6KGRvdWJsZTE2KTsKKwordWxvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nKGRvdWJsZSk7Cit1bG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmdfcnRlKGRvdWJsZSk7Cit1bG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmdfcnRuKGRvdWJsZSk7Cit1bG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmdfcnRwKGRvdWJsZSk7Cit1bG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmdfcnR6KGRvdWJsZSk7Cit1bG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmdfc2F0KGRvdWJsZSk7Cit1bG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmdfc2F0X3J0ZShkb3VibGUpOwordWxvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nX3NhdF9ydG4oZG91YmxlKTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZ19zYXRfcnRwKGRvdWJsZSk7Cit1bG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmdfc2F0X3J0eihkb3VibGUpOwordWxvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzIoZG91YmxlMik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMl9ydGUoZG91YmxlMik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMl9ydG4oZG91YmxlMik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMl9ydHAoZG91YmxlMik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMl9ydHooZG91YmxlMik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMl9zYXQoZG91YmxlMik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMl9zYXRfcnRlKGRvdWJsZTIpOwordWxvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzJfc2F0X3J0bihkb3VibGUyKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcyX3NhdF9ydHAoZG91YmxlMik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMl9zYXRfcnR6KGRvdWJsZTIpOwordWxvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzMoZG91YmxlMyk7Cit1bG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nM19ydGUoZG91YmxlMyk7Cit1bG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nM19ydG4oZG91YmxlMyk7Cit1bG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nM19ydHAoZG91YmxlMyk7Cit1bG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nM19ydHooZG91YmxlMyk7Cit1bG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nM19zYXQoZG91YmxlMyk7Cit1bG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nM19zYXRfcnRlKGRvdWJsZTMpOwordWxvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzNfc2F0X3J0bihkb3VibGUzKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmczX3NhdF9ydHAoZG91YmxlMyk7Cit1bG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nM19zYXRfcnR6KGRvdWJsZTMpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzQoZG91YmxlNCk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nNF9ydGUoZG91YmxlNCk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nNF9ydG4oZG91YmxlNCk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nNF9ydHAoZG91YmxlNCk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nNF9ydHooZG91YmxlNCk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nNF9zYXQoZG91YmxlNCk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nNF9zYXRfcnRlKGRvdWJsZTQpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzRfc2F0X3J0bihkb3VibGU0KTsKK3Vsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc0X3NhdF9ydHAoZG91YmxlNCk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nNF9zYXRfcnR6KGRvdWJsZTQpOwordWxvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzgoZG91YmxlOCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOF9ydGUoZG91YmxlOCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOF9ydG4oZG91YmxlOCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOF9ydHAoZG91YmxlOCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOF9ydHooZG91YmxlOCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOF9zYXQoZG91YmxlOCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOF9zYXRfcnRlKGRvdWJsZTgpOwordWxvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzhfc2F0X3J0bihkb3VibGU4KTsKK3Vsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc4X3NhdF9ydHAoZG91YmxlOCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOF9zYXRfcnR6KGRvdWJsZTgpOwordWxvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcxNihkb3VibGUxNik7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzE2X3J0ZShkb3VibGUxNik7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzE2X3J0bihkb3VibGUxNik7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzE2X3J0cChkb3VibGUxNik7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzE2X3J0eihkb3VibGUxNik7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzE2X3NhdChkb3VibGUxNik7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzE2X3NhdF9ydGUoZG91YmxlMTYpOwordWxvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcxNl9zYXRfcnRuKGRvdWJsZTE2KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMTZfc2F0X3J0cChkb3VibGUxNik7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzE2X3NhdF9ydHooZG91YmxlMTYpOworCitmbG9hdCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQoZG91YmxlKTsKK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdF9ydGUoZG91YmxlKTsKK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdF9ydG4oZG91YmxlKTsKK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdF9ydHAoZG91YmxlKTsKK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdF9ydHooZG91YmxlKTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQyKGRvdWJsZTIpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDJfcnRlKGRvdWJsZTIpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDJfcnRuKGRvdWJsZTIpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDJfcnRwKGRvdWJsZTIpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDJfcnR6KGRvdWJsZTIpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDMoZG91YmxlMyk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0M19ydGUoZG91YmxlMyk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0M19ydG4oZG91YmxlMyk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0M19ydHAoZG91YmxlMyk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0M19ydHooZG91YmxlMyk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0NChkb3VibGU0KTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQ0X3J0ZShkb3VibGU0KTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQ0X3J0bihkb3VibGU0KTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQ0X3J0cChkb3VibGU0KTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQ0X3J0eihkb3VibGU0KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQ4KGRvdWJsZTgpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDhfcnRlKGRvdWJsZTgpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDhfcnRuKGRvdWJsZTgpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDhfcnRwKGRvdWJsZTgpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDhfcnR6KGRvdWJsZTgpOworZmxvYXQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQxNihkb3VibGUxNik7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDE2X3J0ZShkb3VibGUxNik7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDE2X3J0bihkb3VibGUxNik7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDE2X3J0cChkb3VibGUxNik7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDE2X3J0eihkb3VibGUxNik7CisKK2RvdWJsZSBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlKGNoYXIpOworZG91YmxlIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUoZG91YmxlKTsKK2RvdWJsZSBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlKGZsb2F0KTsKK2RvdWJsZSBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlKGludCk7Citkb3VibGUgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZShsb25nKTsKK2RvdWJsZSBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlKHNob3J0KTsKK2RvdWJsZSBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlKHVjaGFyKTsKK2RvdWJsZSBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlKHVpbnQpOworZG91YmxlIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUodWxvbmcpOworZG91YmxlIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUodXNob3J0KTsKK2RvdWJsZSBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlX3J0ZShjaGFyKTsKK2RvdWJsZSBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlX3J0ZShkb3VibGUpOworZG91YmxlIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGVfcnRlKGZsb2F0KTsKK2RvdWJsZSBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlX3J0ZShpbnQpOworZG91YmxlIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGVfcnRlKGxvbmcpOworZG91YmxlIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGVfcnRlKHNob3J0KTsKK2RvdWJsZSBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlX3J0ZSh1Y2hhcik7Citkb3VibGUgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZV9ydGUodWludCk7Citkb3VibGUgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZV9ydGUodWxvbmcpOworZG91YmxlIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGVfcnRlKHVzaG9ydCk7Citkb3VibGUgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZV9ydG4oY2hhcik7Citkb3VibGUgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZV9ydG4oZG91YmxlKTsKK2RvdWJsZSBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlX3J0bihmbG9hdCk7Citkb3VibGUgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZV9ydG4oaW50KTsKK2RvdWJsZSBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlX3J0bihsb25nKTsKK2RvdWJsZSBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlX3J0bihzaG9ydCk7Citkb3VibGUgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZV9ydG4odWNoYXIpOworZG91YmxlIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGVfcnRuKHVpbnQpOworZG91YmxlIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGVfcnRuKHVsb25nKTsKK2RvdWJsZSBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlX3J0bih1c2hvcnQpOworZG91YmxlIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGVfcnRwKGNoYXIpOworZG91YmxlIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGVfcnRwKGRvdWJsZSk7Citkb3VibGUgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZV9ydHAoZmxvYXQpOworZG91YmxlIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGVfcnRwKGludCk7Citkb3VibGUgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZV9ydHAobG9uZyk7Citkb3VibGUgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZV9ydHAoc2hvcnQpOworZG91YmxlIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGVfcnRwKHVjaGFyKTsKK2RvdWJsZSBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlX3J0cCh1aW50KTsKK2RvdWJsZSBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlX3J0cCh1bG9uZyk7Citkb3VibGUgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZV9ydHAodXNob3J0KTsKK2RvdWJsZSBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlX3J0eihjaGFyKTsKK2RvdWJsZSBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlX3J0eihkb3VibGUpOworZG91YmxlIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGVfcnR6KGZsb2F0KTsKK2RvdWJsZSBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlX3J0eihpbnQpOworZG91YmxlIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGVfcnR6KGxvbmcpOworZG91YmxlIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGVfcnR6KHNob3J0KTsKK2RvdWJsZSBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlX3J0eih1Y2hhcik7Citkb3VibGUgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZV9ydHoodWludCk7Citkb3VibGUgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZV9ydHoodWxvbmcpOworZG91YmxlIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGVfcnR6KHVzaG9ydCk7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUyKGNoYXIyKTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTIoZG91YmxlMik7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUyKGZsb2F0Mik7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUyKGludDIpOworZG91YmxlMiBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlMihsb25nMik7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUyKHNob3J0Mik7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUyKHVjaGFyMik7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUyKHVpbnQyKTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTIodWxvbmcyKTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTIodXNob3J0Mik7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUyX3J0ZShjaGFyMik7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUyX3J0ZShkb3VibGUyKTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTJfcnRlKGZsb2F0Mik7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUyX3J0ZShpbnQyKTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTJfcnRlKGxvbmcyKTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTJfcnRlKHNob3J0Mik7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUyX3J0ZSh1Y2hhcjIpOworZG91YmxlMiBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlMl9ydGUodWludDIpOworZG91YmxlMiBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlMl9ydGUodWxvbmcyKTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTJfcnRlKHVzaG9ydDIpOworZG91YmxlMiBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlMl9ydG4oY2hhcjIpOworZG91YmxlMiBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlMl9ydG4oZG91YmxlMik7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUyX3J0bihmbG9hdDIpOworZG91YmxlMiBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlMl9ydG4oaW50Mik7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUyX3J0bihsb25nMik7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUyX3J0bihzaG9ydDIpOworZG91YmxlMiBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlMl9ydG4odWNoYXIyKTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTJfcnRuKHVpbnQyKTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTJfcnRuKHVsb25nMik7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUyX3J0bih1c2hvcnQyKTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTJfcnRwKGNoYXIyKTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTJfcnRwKGRvdWJsZTIpOworZG91YmxlMiBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlMl9ydHAoZmxvYXQyKTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTJfcnRwKGludDIpOworZG91YmxlMiBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlMl9ydHAobG9uZzIpOworZG91YmxlMiBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlMl9ydHAoc2hvcnQyKTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTJfcnRwKHVjaGFyMik7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUyX3J0cCh1aW50Mik7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUyX3J0cCh1bG9uZzIpOworZG91YmxlMiBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlMl9ydHAodXNob3J0Mik7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUyX3J0eihjaGFyMik7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUyX3J0eihkb3VibGUyKTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTJfcnR6KGZsb2F0Mik7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUyX3J0eihpbnQyKTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTJfcnR6KGxvbmcyKTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTJfcnR6KHNob3J0Mik7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUyX3J0eih1Y2hhcjIpOworZG91YmxlMiBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlMl9ydHoodWludDIpOworZG91YmxlMiBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlMl9ydHoodWxvbmcyKTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTJfcnR6KHVzaG9ydDIpOworZG91YmxlMyBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlMyhjaGFyMyk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUzKGRvdWJsZTMpOworZG91YmxlMyBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlMyhmbG9hdDMpOworZG91YmxlMyBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlMyhpbnQzKTsKK2RvdWJsZTMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTMobG9uZzMpOworZG91YmxlMyBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlMyhzaG9ydDMpOworZG91YmxlMyBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlMyh1Y2hhcjMpOworZG91YmxlMyBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlMyh1aW50Myk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUzKHVsb25nMyk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUzKHVzaG9ydDMpOworZG91YmxlMyBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlM19ydGUoY2hhcjMpOworZG91YmxlMyBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlM19ydGUoZG91YmxlMyk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUzX3J0ZShmbG9hdDMpOworZG91YmxlMyBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlM19ydGUoaW50Myk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUzX3J0ZShsb25nMyk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUzX3J0ZShzaG9ydDMpOworZG91YmxlMyBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlM19ydGUodWNoYXIzKTsKK2RvdWJsZTMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTNfcnRlKHVpbnQzKTsKK2RvdWJsZTMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTNfcnRlKHVsb25nMyk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUzX3J0ZSh1c2hvcnQzKTsKK2RvdWJsZTMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTNfcnRuKGNoYXIzKTsKK2RvdWJsZTMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTNfcnRuKGRvdWJsZTMpOworZG91YmxlMyBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlM19ydG4oZmxvYXQzKTsKK2RvdWJsZTMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTNfcnRuKGludDMpOworZG91YmxlMyBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlM19ydG4obG9uZzMpOworZG91YmxlMyBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlM19ydG4oc2hvcnQzKTsKK2RvdWJsZTMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTNfcnRuKHVjaGFyMyk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUzX3J0bih1aW50Myk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUzX3J0bih1bG9uZzMpOworZG91YmxlMyBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlM19ydG4odXNob3J0Myk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUzX3J0cChjaGFyMyk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUzX3J0cChkb3VibGUzKTsKK2RvdWJsZTMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTNfcnRwKGZsb2F0Myk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUzX3J0cChpbnQzKTsKK2RvdWJsZTMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTNfcnRwKGxvbmczKTsKK2RvdWJsZTMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTNfcnRwKHNob3J0Myk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUzX3J0cCh1Y2hhcjMpOworZG91YmxlMyBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlM19ydHAodWludDMpOworZG91YmxlMyBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlM19ydHAodWxvbmczKTsKK2RvdWJsZTMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTNfcnRwKHVzaG9ydDMpOworZG91YmxlMyBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlM19ydHooY2hhcjMpOworZG91YmxlMyBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlM19ydHooZG91YmxlMyk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUzX3J0eihmbG9hdDMpOworZG91YmxlMyBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlM19ydHooaW50Myk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUzX3J0eihsb25nMyk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUzX3J0eihzaG9ydDMpOworZG91YmxlMyBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlM19ydHoodWNoYXIzKTsKK2RvdWJsZTMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTNfcnR6KHVpbnQzKTsKK2RvdWJsZTMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTNfcnR6KHVsb25nMyk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUzX3J0eih1c2hvcnQzKTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTQoY2hhcjQpOworZG91YmxlNCBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlNChkb3VibGU0KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTQoZmxvYXQ0KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTQoaW50NCk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGU0KGxvbmc0KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTQoc2hvcnQ0KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTQodWNoYXI0KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTQodWludDQpOworZG91YmxlNCBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlNCh1bG9uZzQpOworZG91YmxlNCBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlNCh1c2hvcnQ0KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTRfcnRlKGNoYXI0KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTRfcnRlKGRvdWJsZTQpOworZG91YmxlNCBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlNF9ydGUoZmxvYXQ0KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTRfcnRlKGludDQpOworZG91YmxlNCBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlNF9ydGUobG9uZzQpOworZG91YmxlNCBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlNF9ydGUoc2hvcnQ0KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTRfcnRlKHVjaGFyNCk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGU0X3J0ZSh1aW50NCk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGU0X3J0ZSh1bG9uZzQpOworZG91YmxlNCBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlNF9ydGUodXNob3J0NCk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGU0X3J0bihjaGFyNCk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGU0X3J0bihkb3VibGU0KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTRfcnRuKGZsb2F0NCk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGU0X3J0bihpbnQ0KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTRfcnRuKGxvbmc0KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTRfcnRuKHNob3J0NCk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGU0X3J0bih1Y2hhcjQpOworZG91YmxlNCBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlNF9ydG4odWludDQpOworZG91YmxlNCBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlNF9ydG4odWxvbmc0KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTRfcnRuKHVzaG9ydDQpOworZG91YmxlNCBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlNF9ydHAoY2hhcjQpOworZG91YmxlNCBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlNF9ydHAoZG91YmxlNCk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGU0X3J0cChmbG9hdDQpOworZG91YmxlNCBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlNF9ydHAoaW50NCk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGU0X3J0cChsb25nNCk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGU0X3J0cChzaG9ydDQpOworZG91YmxlNCBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlNF9ydHAodWNoYXI0KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTRfcnRwKHVpbnQ0KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTRfcnRwKHVsb25nNCk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGU0X3J0cCh1c2hvcnQ0KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTRfcnR6KGNoYXI0KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTRfcnR6KGRvdWJsZTQpOworZG91YmxlNCBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlNF9ydHooZmxvYXQ0KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTRfcnR6KGludDQpOworZG91YmxlNCBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlNF9ydHoobG9uZzQpOworZG91YmxlNCBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlNF9ydHooc2hvcnQ0KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTRfcnR6KHVjaGFyNCk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGU0X3J0eih1aW50NCk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGU0X3J0eih1bG9uZzQpOworZG91YmxlNCBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlNF9ydHoodXNob3J0NCk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGU4KGNoYXI4KTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTgoZG91YmxlOCk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGU4KGZsb2F0OCk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGU4KGludDgpOworZG91YmxlOCBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlOChsb25nOCk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGU4KHNob3J0OCk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGU4KHVjaGFyOCk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGU4KHVpbnQ4KTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTgodWxvbmc4KTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTgodXNob3J0OCk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGU4X3J0ZShjaGFyOCk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGU4X3J0ZShkb3VibGU4KTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZThfcnRlKGZsb2F0OCk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGU4X3J0ZShpbnQ4KTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZThfcnRlKGxvbmc4KTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZThfcnRlKHNob3J0OCk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGU4X3J0ZSh1Y2hhcjgpOworZG91YmxlOCBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlOF9ydGUodWludDgpOworZG91YmxlOCBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlOF9ydGUodWxvbmc4KTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZThfcnRlKHVzaG9ydDgpOworZG91YmxlOCBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlOF9ydG4oY2hhcjgpOworZG91YmxlOCBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlOF9ydG4oZG91YmxlOCk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGU4X3J0bihmbG9hdDgpOworZG91YmxlOCBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlOF9ydG4oaW50OCk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGU4X3J0bihsb25nOCk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGU4X3J0bihzaG9ydDgpOworZG91YmxlOCBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlOF9ydG4odWNoYXI4KTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZThfcnRuKHVpbnQ4KTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZThfcnRuKHVsb25nOCk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGU4X3J0bih1c2hvcnQ4KTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZThfcnRwKGNoYXI4KTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZThfcnRwKGRvdWJsZTgpOworZG91YmxlOCBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlOF9ydHAoZmxvYXQ4KTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZThfcnRwKGludDgpOworZG91YmxlOCBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlOF9ydHAobG9uZzgpOworZG91YmxlOCBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlOF9ydHAoc2hvcnQ4KTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZThfcnRwKHVjaGFyOCk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGU4X3J0cCh1aW50OCk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGU4X3J0cCh1bG9uZzgpOworZG91YmxlOCBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlOF9ydHAodXNob3J0OCk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGU4X3J0eihjaGFyOCk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGU4X3J0eihkb3VibGU4KTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZThfcnR6KGZsb2F0OCk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGU4X3J0eihpbnQ4KTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZThfcnR6KGxvbmc4KTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZThfcnR6KHNob3J0OCk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGU4X3J0eih1Y2hhcjgpOworZG91YmxlOCBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlOF9ydHoodWludDgpOworZG91YmxlOCBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlOF9ydHoodWxvbmc4KTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZThfcnR6KHVzaG9ydDgpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTE2KGNoYXIxNik7Citkb3VibGUxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlMTYoZG91YmxlMTYpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTE2KGZsb2F0MTYpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTE2KGludDE2KTsKK2RvdWJsZTE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUxNihsb25nMTYpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTE2KHNob3J0MTYpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTE2KHVjaGFyMTYpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTE2KHVpbnQxNik7Citkb3VibGUxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlMTYodWxvbmcxNik7Citkb3VibGUxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlMTYodXNob3J0MTYpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTE2X3J0ZShjaGFyMTYpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTE2X3J0ZShkb3VibGUxNik7Citkb3VibGUxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlMTZfcnRlKGZsb2F0MTYpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTE2X3J0ZShpbnQxNik7Citkb3VibGUxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlMTZfcnRlKGxvbmcxNik7Citkb3VibGUxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlMTZfcnRlKHNob3J0MTYpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTE2X3J0ZSh1Y2hhcjE2KTsKK2RvdWJsZTE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUxNl9ydGUodWludDE2KTsKK2RvdWJsZTE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUxNl9ydGUodWxvbmcxNik7Citkb3VibGUxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlMTZfcnRlKHVzaG9ydDE2KTsKK2RvdWJsZTE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUxNl9ydG4oY2hhcjE2KTsKK2RvdWJsZTE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUxNl9ydG4oZG91YmxlMTYpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTE2X3J0bihmbG9hdDE2KTsKK2RvdWJsZTE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUxNl9ydG4oaW50MTYpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTE2X3J0bihsb25nMTYpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTE2X3J0bihzaG9ydDE2KTsKK2RvdWJsZTE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUxNl9ydG4odWNoYXIxNik7Citkb3VibGUxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlMTZfcnRuKHVpbnQxNik7Citkb3VibGUxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlMTZfcnRuKHVsb25nMTYpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTE2X3J0bih1c2hvcnQxNik7Citkb3VibGUxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlMTZfcnRwKGNoYXIxNik7Citkb3VibGUxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlMTZfcnRwKGRvdWJsZTE2KTsKK2RvdWJsZTE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUxNl9ydHAoZmxvYXQxNik7Citkb3VibGUxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlMTZfcnRwKGludDE2KTsKK2RvdWJsZTE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUxNl9ydHAobG9uZzE2KTsKK2RvdWJsZTE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUxNl9ydHAoc2hvcnQxNik7Citkb3VibGUxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlMTZfcnRwKHVjaGFyMTYpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTE2X3J0cCh1aW50MTYpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTE2X3J0cCh1bG9uZzE2KTsKK2RvdWJsZTE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUxNl9ydHAodXNob3J0MTYpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTE2X3J0eihjaGFyMTYpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTE2X3J0eihkb3VibGUxNik7Citkb3VibGUxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlMTZfcnR6KGZsb2F0MTYpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTE2X3J0eihpbnQxNik7Citkb3VibGUxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlMTZfcnR6KGxvbmcxNik7Citkb3VibGUxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlMTZfcnR6KHNob3J0MTYpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTE2X3J0eih1Y2hhcjE2KTsKK2RvdWJsZTE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUxNl9ydHoodWludDE2KTsKK2RvdWJsZTE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUxNl9ydHoodWxvbmcxNik7Citkb3VibGUxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlMTZfcnR6KHVzaG9ydDE2KTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisKKyNpZmRlZiBjbF9raHJfZnAxNgorLy8gQ29udmVydCBoYWxmIHR5cGVzIHRvIG5vbi1kb3VibGUgdHlwZXMuCit1Y2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIoaGFsZik7Cit1Y2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXJfcnRlKGhhbGYpOwordWNoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyX3J0cChoYWxmKTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcl9ydG4oaGFsZik7Cit1Y2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXJfcnR6KGhhbGYpOwordWNoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyX3NhdChoYWxmKTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcl9zYXRfcnRlKGhhbGYpOwordWNoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyX3NhdF9ydHAoaGFsZik7Cit1Y2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXJfc2F0X3J0bihoYWxmKTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcl9zYXRfcnR6KGhhbGYpOwordWNoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjIoaGFsZjIpOwordWNoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjJfcnRlKGhhbGYyKTsKK3VjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIyX3J0cChoYWxmMik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMl9ydG4oaGFsZjIpOwordWNoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjJfcnR6KGhhbGYyKTsKK3VjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIyX3NhdChoYWxmMik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMl9zYXRfcnRlKGhhbGYyKTsKK3VjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIyX3NhdF9ydHAoaGFsZjIpOwordWNoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjJfc2F0X3J0bihoYWxmMik7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMl9zYXRfcnR6KGhhbGYyKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIzKGhhbGYzKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIzX3J0ZShoYWxmMyk7Cit1Y2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyM19ydHAoaGFsZjMpOwordWNoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjNfcnRuKGhhbGYzKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIzX3J0eihoYWxmMyk7Cit1Y2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyM19zYXQoaGFsZjMpOwordWNoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjNfc2F0X3J0ZShoYWxmMyk7Cit1Y2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyM19zYXRfcnRwKGhhbGYzKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIzX3NhdF9ydG4oaGFsZjMpOwordWNoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjNfc2F0X3J0eihoYWxmMyk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyNChoYWxmNCk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyNF9ydGUoaGFsZjQpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjRfcnRwKGhhbGY0KTsKK3VjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI0X3J0bihoYWxmNCk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyNF9ydHooaGFsZjQpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjRfc2F0KGhhbGY0KTsKK3VjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI0X3NhdF9ydGUoaGFsZjQpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjRfc2F0X3J0cChoYWxmNCk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyNF9zYXRfcnRuKGhhbGY0KTsKK3VjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI0X3NhdF9ydHooaGFsZjQpOwordWNoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjgoaGFsZjgpOwordWNoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjhfcnRlKGhhbGY4KTsKK3VjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI4X3J0cChoYWxmOCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOF9ydG4oaGFsZjgpOwordWNoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjhfcnR6KGhhbGY4KTsKK3VjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI4X3NhdChoYWxmOCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOF9zYXRfcnRlKGhhbGY4KTsKK3VjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXI4X3NhdF9ydHAoaGFsZjgpOwordWNoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjhfc2F0X3J0bihoYWxmOCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyOF9zYXRfcnR6KGhhbGY4KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMTYoaGFsZjE2KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMTZfcnRlKGhhbGYxNik7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjE2X3J0cChoYWxmMTYpOwordWNoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIxNl9ydG4oaGFsZjE2KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMTZfcnR6KGhhbGYxNik7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjE2X3NhdChoYWxmMTYpOwordWNoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIxNl9zYXRfcnRlKGhhbGYxNik7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91Y2hhcjE2X3NhdF9ydHAoaGFsZjE2KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VjaGFyMTZfc2F0X3J0bihoYWxmMTYpOwordWNoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWNoYXIxNl9zYXRfcnR6KGhhbGYxNik7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydChoYWxmKTsKK3VzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0X3J0ZShoYWxmKTsKK3VzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0X3J0cChoYWxmKTsKK3VzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0X3J0bihoYWxmKTsKK3VzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0X3J0eihoYWxmKTsKK3VzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0X3NhdChoYWxmKTsKK3VzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0X3NhdF9ydGUoaGFsZik7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydF9zYXRfcnRwKGhhbGYpOwordXNob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnRfc2F0X3J0bihoYWxmKTsKK3VzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0X3NhdF9ydHooaGFsZik7Cit1c2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQyKGhhbGYyKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDJfcnRlKGhhbGYyKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDJfcnRwKGhhbGYyKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDJfcnRuKGhhbGYyKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDJfcnR6KGhhbGYyKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDJfc2F0KGhhbGYyKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDJfc2F0X3J0ZShoYWxmMik7Cit1c2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQyX3NhdF9ydHAoaGFsZjIpOwordXNob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0Ml9zYXRfcnRuKGhhbGYyKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDJfc2F0X3J0eihoYWxmMik7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQzKGhhbGYzKTsKK3VzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDNfcnRlKGhhbGYzKTsKK3VzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDNfcnRwKGhhbGYzKTsKK3VzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDNfcnRuKGhhbGYzKTsKK3VzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDNfcnR6KGhhbGYzKTsKK3VzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDNfc2F0KGhhbGYzKTsKK3VzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDNfc2F0X3J0ZShoYWxmMyk7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQzX3NhdF9ydHAoaGFsZjMpOwordXNob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0M19zYXRfcnRuKGhhbGYzKTsKK3VzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDNfc2F0X3J0eihoYWxmMyk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ0KGhhbGY0KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDRfcnRlKGhhbGY0KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDRfcnRwKGhhbGY0KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDRfcnRuKGhhbGY0KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDRfcnR6KGhhbGY0KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDRfc2F0KGhhbGY0KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDRfc2F0X3J0ZShoYWxmNCk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ0X3NhdF9ydHAoaGFsZjQpOwordXNob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0NF9zYXRfcnRuKGhhbGY0KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDRfc2F0X3J0eihoYWxmNCk7Cit1c2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ4KGhhbGY4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDhfcnRlKGhhbGY4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDhfcnRwKGhhbGY4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDhfcnRuKGhhbGY4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDhfcnR6KGhhbGY4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDhfc2F0KGhhbGY4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDhfc2F0X3J0ZShoYWxmOCk7Cit1c2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQ4X3NhdF9ydHAoaGFsZjgpOwordXNob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0OF9zYXRfcnRuKGhhbGY4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDhfc2F0X3J0eihoYWxmOCk7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0MTYoaGFsZjE2KTsKK3VzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQxNl9ydGUoaGFsZjE2KTsKK3VzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQxNl9ydHAoaGFsZjE2KTsKK3VzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQxNl9ydG4oaGFsZjE2KTsKK3VzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQxNl9ydHooaGFsZjE2KTsKK3VzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQxNl9zYXQoaGFsZjE2KTsKK3VzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQxNl9zYXRfcnRlKGhhbGYxNik7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdXNob3J0MTZfc2F0X3J0cChoYWxmMTYpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VzaG9ydDE2X3NhdF9ydG4oaGFsZjE2KTsKK3VzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91c2hvcnQxNl9zYXRfcnR6KGhhbGYxNik7Cit1aW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50KGhhbGYpOwordWludCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludF9ydGUoaGFsZik7Cit1aW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50X3J0cChoYWxmKTsKK3VpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnRfcnRuKGhhbGYpOwordWludCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludF9ydHooaGFsZik7Cit1aW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50X3NhdChoYWxmKTsKK3VpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnRfc2F0X3J0ZShoYWxmKTsKK3VpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnRfc2F0X3J0cChoYWxmKTsKK3VpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnRfc2F0X3J0bihoYWxmKTsKK3VpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnRfc2F0X3J0eihoYWxmKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50MihoYWxmMik7Cit1aW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDJfcnRlKGhhbGYyKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50Ml9ydHAoaGFsZjIpOwordWludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQyX3J0bihoYWxmMik7Cit1aW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDJfcnR6KGhhbGYyKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50Ml9zYXQoaGFsZjIpOwordWludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQyX3NhdF9ydGUoaGFsZjIpOwordWludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQyX3NhdF9ydHAoaGFsZjIpOwordWludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQyX3NhdF9ydG4oaGFsZjIpOwordWludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQyX3NhdF9ydHooaGFsZjIpOwordWludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQzKGhhbGYzKTsKK3VpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50M19ydGUoaGFsZjMpOwordWludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQzX3J0cChoYWxmMyk7Cit1aW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDNfcnRuKGhhbGYzKTsKK3VpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50M19ydHooaGFsZjMpOwordWludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQzX3NhdChoYWxmMyk7Cit1aW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDNfc2F0X3J0ZShoYWxmMyk7Cit1aW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDNfc2F0X3J0cChoYWxmMyk7Cit1aW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDNfc2F0X3J0bihoYWxmMyk7Cit1aW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDNfc2F0X3J0eihoYWxmMyk7Cit1aW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDQoaGFsZjQpOwordWludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ0X3J0ZShoYWxmNCk7Cit1aW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDRfcnRwKGhhbGY0KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50NF9ydG4oaGFsZjQpOwordWludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ0X3J0eihoYWxmNCk7Cit1aW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDRfc2F0KGhhbGY0KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50NF9zYXRfcnRlKGhhbGY0KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50NF9zYXRfcnRwKGhhbGY0KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50NF9zYXRfcnRuKGhhbGY0KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50NF9zYXRfcnR6KGhhbGY0KTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50OChoYWxmOCk7Cit1aW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDhfcnRlKGhhbGY4KTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50OF9ydHAoaGFsZjgpOwordWludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ4X3J0bihoYWxmOCk7Cit1aW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDhfcnR6KGhhbGY4KTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50OF9zYXQoaGFsZjgpOwordWludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ4X3NhdF9ydGUoaGFsZjgpOwordWludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ4X3NhdF9ydHAoaGFsZjgpOwordWludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ4X3NhdF9ydG4oaGFsZjgpOwordWludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQ4X3NhdF9ydHooaGFsZjgpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50MTYoaGFsZjE2KTsKK3VpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDE2X3J0ZShoYWxmMTYpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50MTZfcnRwKGhhbGYxNik7Cit1aW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQxNl9ydG4oaGFsZjE2KTsKK3VpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWludDE2X3J0eihoYWxmMTYpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91aW50MTZfc2F0KGhhbGYxNik7Cit1aW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQxNl9zYXRfcnRlKGhhbGYxNik7Cit1aW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQxNl9zYXRfcnRwKGhhbGYxNik7Cit1aW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQxNl9zYXRfcnRuKGhhbGYxNik7Cit1aW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3VpbnQxNl9zYXRfcnR6KGhhbGYxNik7Cit1bG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcoaGFsZik7Cit1bG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmdfcnRlKGhhbGYpOwordWxvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nX3J0cChoYWxmKTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZ19ydG4oaGFsZik7Cit1bG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmdfcnR6KGhhbGYpOwordWxvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nX3NhdChoYWxmKTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZ19zYXRfcnRlKGhhbGYpOwordWxvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nX3NhdF9ydHAoaGFsZik7Cit1bG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmdfc2F0X3J0bihoYWxmKTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZ19zYXRfcnR6KGhhbGYpOwordWxvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzIoaGFsZjIpOwordWxvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzJfcnRlKGhhbGYyKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcyX3J0cChoYWxmMik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMl9ydG4oaGFsZjIpOwordWxvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzJfcnR6KGhhbGYyKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcyX3NhdChoYWxmMik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMl9zYXRfcnRlKGhhbGYyKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcyX3NhdF9ydHAoaGFsZjIpOwordWxvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzJfc2F0X3J0bihoYWxmMik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMl9zYXRfcnR6KGhhbGYyKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmczKGhhbGYzKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmczX3J0ZShoYWxmMyk7Cit1bG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nM19ydHAoaGFsZjMpOwordWxvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzNfcnRuKGhhbGYzKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmczX3J0eihoYWxmMyk7Cit1bG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nM19zYXQoaGFsZjMpOwordWxvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzNfc2F0X3J0ZShoYWxmMyk7Cit1bG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nM19zYXRfcnRwKGhhbGYzKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmczX3NhdF9ydG4oaGFsZjMpOwordWxvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzNfc2F0X3J0eihoYWxmMyk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nNChoYWxmNCk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nNF9ydGUoaGFsZjQpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzRfcnRwKGhhbGY0KTsKK3Vsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc0X3J0bihoYWxmNCk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nNF9ydHooaGFsZjQpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzRfc2F0KGhhbGY0KTsKK3Vsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc0X3NhdF9ydGUoaGFsZjQpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzRfc2F0X3J0cChoYWxmNCk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nNF9zYXRfcnRuKGhhbGY0KTsKK3Vsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc0X3NhdF9ydHooaGFsZjQpOwordWxvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzgoaGFsZjgpOwordWxvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzhfcnRlKGhhbGY4KTsKK3Vsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc4X3J0cChoYWxmOCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOF9ydG4oaGFsZjgpOwordWxvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzhfcnR6KGhhbGY4KTsKK3Vsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc4X3NhdChoYWxmOCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOF9zYXRfcnRlKGhhbGY4KTsKK3Vsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmc4X3NhdF9ydHAoaGFsZjgpOwordWxvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzhfc2F0X3J0bihoYWxmOCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nOF9zYXRfcnR6KGhhbGY4KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMTYoaGFsZjE2KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMTZfcnRlKGhhbGYxNik7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzE2X3J0cChoYWxmMTYpOwordWxvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcxNl9ydG4oaGFsZjE2KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMTZfcnR6KGhhbGYxNik7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzE2X3NhdChoYWxmMTYpOwordWxvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcxNl9zYXRfcnRlKGhhbGYxNik7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF91bG9uZzE2X3NhdF9ydHAoaGFsZjE2KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Vsb25nMTZfc2F0X3J0bihoYWxmMTYpOwordWxvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfdWxvbmcxNl9zYXRfcnR6KGhhbGYxNik7CitjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyKGhhbGYpOworY2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcl9ydGUoaGFsZik7CitjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyX3J0cChoYWxmKTsKK2NoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXJfcnRuKGhhbGYpOworY2hhciBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcl9ydHooaGFsZik7CitjaGFyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyX3NhdChoYWxmKTsKK2NoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXJfc2F0X3J0ZShoYWxmKTsKK2NoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXJfc2F0X3J0cChoYWxmKTsKK2NoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXJfc2F0X3J0bihoYWxmKTsKK2NoYXIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXJfc2F0X3J0eihoYWxmKTsKK2NoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMihoYWxmMik7CitjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjJfcnRlKGhhbGYyKTsKK2NoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMl9ydHAoaGFsZjIpOworY2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIyX3J0bihoYWxmMik7CitjaGFyMiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjJfcnR6KGhhbGYyKTsKK2NoYXIyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMl9zYXQoaGFsZjIpOworY2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIyX3NhdF9ydGUoaGFsZjIpOworY2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIyX3NhdF9ydHAoaGFsZjIpOworY2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIyX3NhdF9ydG4oaGFsZjIpOworY2hhcjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIyX3NhdF9ydHooaGFsZjIpOworY2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIzKGhhbGYzKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyM19ydGUoaGFsZjMpOworY2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIzX3J0cChoYWxmMyk7CitjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjNfcnRuKGhhbGYzKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyM19ydHooaGFsZjMpOworY2hhcjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIzX3NhdChoYWxmMyk7CitjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjNfc2F0X3J0ZShoYWxmMyk7CitjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjNfc2F0X3J0cChoYWxmMyk7CitjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjNfc2F0X3J0bihoYWxmMyk7CitjaGFyMyBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjNfc2F0X3J0eihoYWxmMyk7CitjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjQoaGFsZjQpOworY2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI0X3J0ZShoYWxmNCk7CitjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjRfcnRwKGhhbGY0KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyNF9ydG4oaGFsZjQpOworY2hhcjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI0X3J0eihoYWxmNCk7CitjaGFyNCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjRfc2F0KGhhbGY0KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyNF9zYXRfcnRlKGhhbGY0KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyNF9zYXRfcnRwKGhhbGY0KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyNF9zYXRfcnRuKGhhbGY0KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyNF9zYXRfcnR6KGhhbGY0KTsKK2NoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyOChoYWxmOCk7CitjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjhfcnRlKGhhbGY4KTsKK2NoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyOF9ydHAoaGFsZjgpOworY2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI4X3J0bihoYWxmOCk7CitjaGFyOCBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjhfcnR6KGhhbGY4KTsKK2NoYXI4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyOF9zYXQoaGFsZjgpOworY2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI4X3NhdF9ydGUoaGFsZjgpOworY2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI4X3NhdF9ydHAoaGFsZjgpOworY2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI4X3NhdF9ydG4oaGFsZjgpOworY2hhcjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXI4X3NhdF9ydHooaGFsZjgpOworY2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMTYoaGFsZjE2KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjE2X3J0ZShoYWxmMTYpOworY2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMTZfcnRwKGhhbGYxNik7CitjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIxNl9ydG4oaGFsZjE2KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfY2hhcjE2X3J0eihoYWxmMTYpOworY2hhcjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9jaGFyMTZfc2F0KGhhbGYxNik7CitjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIxNl9zYXRfcnRlKGhhbGYxNik7CitjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIxNl9zYXRfcnRwKGhhbGYxNik7CitjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIxNl9zYXRfcnRuKGhhbGYxNik7CitjaGFyMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2NoYXIxNl9zYXRfcnR6KGhhbGYxNik7CitzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQoaGFsZik7CitzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnRfcnRlKGhhbGYpOworc2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0X3J0cChoYWxmKTsKK3Nob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydF9ydG4oaGFsZik7CitzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnRfcnR6KGhhbGYpOworc2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0X3NhdChoYWxmKTsKK3Nob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydF9zYXRfcnRlKGhhbGYpOworc2hvcnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0X3NhdF9ydHAoaGFsZik7CitzaG9ydCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnRfc2F0X3J0bihoYWxmKTsKK3Nob3J0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydF9zYXRfcnR6KGhhbGYpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDIoaGFsZjIpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDJfcnRlKGhhbGYyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyX3J0cChoYWxmMik7CitzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0Ml9ydG4oaGFsZjIpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDJfcnR6KGhhbGYyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyX3NhdChoYWxmMik7CitzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0Ml9zYXRfcnRlKGhhbGYyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQyX3NhdF9ydHAoaGFsZjIpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDJfc2F0X3J0bihoYWxmMik7CitzaG9ydDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0Ml9zYXRfcnR6KGhhbGYyKTsKK3Nob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQzKGhhbGYzKTsKK3Nob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQzX3J0ZShoYWxmMyk7CitzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0M19ydHAoaGFsZjMpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDNfcnRuKGhhbGYzKTsKK3Nob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQzX3J0eihoYWxmMyk7CitzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0M19zYXQoaGFsZjMpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDNfc2F0X3J0ZShoYWxmMyk7CitzaG9ydDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0M19zYXRfcnRwKGhhbGYzKTsKK3Nob3J0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQzX3NhdF9ydG4oaGFsZjMpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDNfc2F0X3J0eihoYWxmMyk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0NChoYWxmNCk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0NF9ydGUoaGFsZjQpOworc2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDRfcnRwKGhhbGY0KTsKK3Nob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ0X3J0bihoYWxmNCk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0NF9ydHooaGFsZjQpOworc2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDRfc2F0KGhhbGY0KTsKK3Nob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ0X3NhdF9ydGUoaGFsZjQpOworc2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDRfc2F0X3J0cChoYWxmNCk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0NF9zYXRfcnRuKGhhbGY0KTsKK3Nob3J0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ0X3NhdF9ydHooaGFsZjQpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDgoaGFsZjgpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDhfcnRlKGhhbGY4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4X3J0cChoYWxmOCk7CitzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0OF9ydG4oaGFsZjgpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDhfcnR6KGhhbGY4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4X3NhdChoYWxmOCk7CitzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0OF9zYXRfcnRlKGhhbGY4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQ4X3NhdF9ydHAoaGFsZjgpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDhfc2F0X3J0bihoYWxmOCk7CitzaG9ydDggX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0OF9zYXRfcnR6KGhhbGY4KTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0MTYoaGFsZjE2KTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0MTZfcnRlKGhhbGYxNik7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDE2X3J0cChoYWxmMTYpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQxNl9ydG4oaGFsZjE2KTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0MTZfcnR6KGhhbGYxNik7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDE2X3NhdChoYWxmMTYpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQxNl9zYXRfcnRlKGhhbGYxNik7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9zaG9ydDE2X3NhdF9ydHAoaGFsZjE2KTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X3Nob3J0MTZfc2F0X3J0bihoYWxmMTYpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfc2hvcnQxNl9zYXRfcnR6KGhhbGYxNik7CitpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludChoYWxmKTsKK2ludCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50X3J0ZShoYWxmKTsKK2ludCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50X3J0cChoYWxmKTsKK2ludCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50X3J0bihoYWxmKTsKK2ludCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50X3J0eihoYWxmKTsKK2ludCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50X3NhdChoYWxmKTsKK2ludCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50X3NhdF9ydGUoaGFsZik7CitpbnQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludF9zYXRfcnRwKGhhbGYpOworaW50IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnRfc2F0X3J0bihoYWxmKTsKK2ludCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50X3NhdF9ydHooaGFsZik7CitpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQyKGhhbGYyKTsKK2ludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDJfcnRlKGhhbGYyKTsKK2ludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDJfcnRwKGhhbGYyKTsKK2ludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDJfcnRuKGhhbGYyKTsKK2ludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDJfcnR6KGhhbGYyKTsKK2ludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDJfc2F0KGhhbGYyKTsKK2ludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDJfc2F0X3J0ZShoYWxmMik7CitpbnQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQyX3NhdF9ydHAoaGFsZjIpOworaW50MiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50Ml9zYXRfcnRuKGhhbGYyKTsKK2ludDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDJfc2F0X3J0eihoYWxmMik7CitpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQzKGhhbGYzKTsKK2ludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDNfcnRlKGhhbGYzKTsKK2ludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDNfcnRwKGhhbGYzKTsKK2ludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDNfcnRuKGhhbGYzKTsKK2ludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDNfcnR6KGhhbGYzKTsKK2ludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDNfc2F0KGhhbGYzKTsKK2ludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDNfc2F0X3J0ZShoYWxmMyk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQzX3NhdF9ydHAoaGFsZjMpOworaW50MyBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50M19zYXRfcnRuKGhhbGYzKTsKK2ludDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDNfc2F0X3J0eihoYWxmMyk7CitpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ0KGhhbGY0KTsKK2ludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDRfcnRlKGhhbGY0KTsKK2ludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDRfcnRwKGhhbGY0KTsKK2ludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDRfcnRuKGhhbGY0KTsKK2ludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDRfcnR6KGhhbGY0KTsKK2ludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDRfc2F0KGhhbGY0KTsKK2ludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDRfc2F0X3J0ZShoYWxmNCk7CitpbnQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ0X3NhdF9ydHAoaGFsZjQpOworaW50NCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50NF9zYXRfcnRuKGhhbGY0KTsKK2ludDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDRfc2F0X3J0eihoYWxmNCk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ4KGhhbGY4KTsKK2ludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDhfcnRlKGhhbGY4KTsKK2ludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDhfcnRwKGhhbGY4KTsKK2ludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDhfcnRuKGhhbGY4KTsKK2ludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDhfcnR6KGhhbGY4KTsKK2ludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDhfc2F0KGhhbGY4KTsKK2ludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDhfc2F0X3J0ZShoYWxmOCk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQ4X3NhdF9ydHAoaGFsZjgpOworaW50OCBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50OF9zYXRfcnRuKGhhbGY4KTsKK2ludDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDhfc2F0X3J0eihoYWxmOCk7CitpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50MTYoaGFsZjE2KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQxNl9ydGUoaGFsZjE2KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQxNl9ydHAoaGFsZjE2KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQxNl9ydG4oaGFsZjE2KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQxNl9ydHooaGFsZjE2KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQxNl9zYXQoaGFsZjE2KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQxNl9zYXRfcnRlKGhhbGYxNik7CitpbnQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaW50MTZfc2F0X3J0cChoYWxmMTYpOworaW50MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2ludDE2X3NhdF9ydG4oaGFsZjE2KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9pbnQxNl9zYXRfcnR6KGhhbGYxNik7Citsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nKGhhbGYpOworbG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZ19ydGUoaGFsZik7Citsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nX3J0cChoYWxmKTsKK2xvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmdfcnRuKGhhbGYpOworbG9uZyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZ19ydHooaGFsZik7Citsb25nIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nX3NhdChoYWxmKTsKK2xvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmdfc2F0X3J0ZShoYWxmKTsKK2xvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmdfc2F0X3J0cChoYWxmKTsKK2xvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmdfc2F0X3J0bihoYWxmKTsKK2xvbmcgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmdfc2F0X3J0eihoYWxmKTsKK2xvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMihoYWxmMik7Citsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzJfcnRlKGhhbGYyKTsKK2xvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMl9ydHAoaGFsZjIpOworbG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcyX3J0bihoYWxmMik7Citsb25nMiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzJfcnR6KGhhbGYyKTsKK2xvbmcyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMl9zYXQoaGFsZjIpOworbG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcyX3NhdF9ydGUoaGFsZjIpOworbG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcyX3NhdF9ydHAoaGFsZjIpOworbG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcyX3NhdF9ydG4oaGFsZjIpOworbG9uZzIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcyX3NhdF9ydHooaGFsZjIpOworbG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmczKGhhbGYzKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nM19ydGUoaGFsZjMpOworbG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmczX3J0cChoYWxmMyk7Citsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzNfcnRuKGhhbGYzKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nM19ydHooaGFsZjMpOworbG9uZzMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmczX3NhdChoYWxmMyk7Citsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzNfc2F0X3J0ZShoYWxmMyk7Citsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzNfc2F0X3J0cChoYWxmMyk7Citsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzNfc2F0X3J0bihoYWxmMyk7Citsb25nMyBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzNfc2F0X3J0eihoYWxmMyk7Citsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzQoaGFsZjQpOworbG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc0X3J0ZShoYWxmNCk7Citsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzRfcnRwKGhhbGY0KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nNF9ydG4oaGFsZjQpOworbG9uZzQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc0X3J0eihoYWxmNCk7Citsb25nNCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzRfc2F0KGhhbGY0KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nNF9zYXRfcnRlKGhhbGY0KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nNF9zYXRfcnRwKGhhbGY0KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nNF9zYXRfcnRuKGhhbGY0KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nNF9zYXRfcnR6KGhhbGY0KTsKK2xvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nOChoYWxmOCk7Citsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzhfcnRlKGhhbGY4KTsKK2xvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nOF9ydHAoaGFsZjgpOworbG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc4X3J0bihoYWxmOCk7Citsb25nOCBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzhfcnR6KGhhbGY4KTsKK2xvbmc4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nOF9zYXQoaGFsZjgpOworbG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc4X3NhdF9ydGUoaGFsZjgpOworbG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc4X3NhdF9ydHAoaGFsZjgpOworbG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc4X3NhdF9ydG4oaGFsZjgpOworbG9uZzggX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmc4X3NhdF9ydHooaGFsZjgpOworbG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMTYoaGFsZjE2KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzE2X3J0ZShoYWxmMTYpOworbG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMTZfcnRwKGhhbGYxNik7Citsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcxNl9ydG4oaGFsZjE2KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfbG9uZzE2X3J0eihoYWxmMTYpOworbG9uZzE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9sb25nMTZfc2F0KGhhbGYxNik7Citsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcxNl9zYXRfcnRlKGhhbGYxNik7Citsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcxNl9zYXRfcnRwKGhhbGYxNik7Citsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcxNl9zYXRfcnRuKGhhbGYxNik7Citsb25nMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2xvbmcxNl9zYXRfcnR6KGhhbGYxNik7CitmbG9hdCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQoaGFsZik7CitmbG9hdCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXRfcnRlKGhhbGYpOworZmxvYXQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0X3J0cChoYWxmKTsKK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdF9ydG4oaGFsZik7CitmbG9hdCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXRfcnR6KGhhbGYpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDIoaGFsZjIpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDJfcnRlKGhhbGYyKTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQyX3J0cChoYWxmMik7CitmbG9hdDIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0Ml9ydG4oaGFsZjIpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDJfcnR6KGhhbGYyKTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQzKGhhbGYzKTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQzX3J0ZShoYWxmMyk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0M19ydHAoaGFsZjMpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDNfcnRuKGhhbGYzKTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQzX3J0eihoYWxmMyk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0NChoYWxmNCk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0NF9ydGUoaGFsZjQpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDRfcnRwKGhhbGY0KTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQ0X3J0bihoYWxmNCk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0NF9ydHooaGFsZjQpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDgoaGFsZjgpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDhfcnRlKGhhbGY4KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQ4X3J0cChoYWxmOCk7CitmbG9hdDggX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0OF9ydG4oaGFsZjgpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDhfcnR6KGhhbGY4KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0MTYoaGFsZjE2KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0MTZfcnRlKGhhbGYxNik7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9mbG9hdDE2X3J0cChoYWxmMTYpOworZmxvYXQxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfZmxvYXQxNl9ydG4oaGFsZjE2KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2Zsb2F0MTZfcnR6KGhhbGYxNik7CisKKy8vIENvbnZlcnQgbm9uLWRvdWJsZSB0eXBlcyB0byBoYWxmIHR5cGVzLgoraGFsZiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZih1Y2hhcik7CitoYWxmIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmKHVzaG9ydCk7CitoYWxmIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmKHVpbnQpOworaGFsZiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZih1bG9uZyk7CitoYWxmIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmKGNoYXIpOworaGFsZiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZihzaG9ydCk7CitoYWxmIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmKGludCk7CitoYWxmIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmKGxvbmcpOworaGFsZiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZihmbG9hdCk7CitoYWxmIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmKGhhbGYpOworaGFsZiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZl9ydGUodWNoYXIpOworaGFsZiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZl9ydGUodXNob3J0KTsKK2hhbGYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGZfcnRlKHVpbnQpOworaGFsZiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZl9ydGUodWxvbmcpOworaGFsZiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZl9ydGUoY2hhcik7CitoYWxmIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmX3J0ZShzaG9ydCk7CitoYWxmIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmX3J0ZShpbnQpOworaGFsZiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZl9ydGUobG9uZyk7CitoYWxmIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmX3J0ZShmbG9hdCk7CitoYWxmIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmX3J0ZShoYWxmKTsKK2hhbGYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGZfcnRwKHVjaGFyKTsKK2hhbGYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGZfcnRwKHVzaG9ydCk7CitoYWxmIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmX3J0cCh1aW50KTsKK2hhbGYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGZfcnRwKHVsb25nKTsKK2hhbGYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGZfcnRwKGNoYXIpOworaGFsZiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZl9ydHAoc2hvcnQpOworaGFsZiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZl9ydHAoaW50KTsKK2hhbGYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGZfcnRwKGxvbmcpOworaGFsZiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZl9ydHAoZmxvYXQpOworaGFsZiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZl9ydHAoaGFsZik7CitoYWxmIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmX3J0bih1Y2hhcik7CitoYWxmIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmX3J0bih1c2hvcnQpOworaGFsZiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZl9ydG4odWludCk7CitoYWxmIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmX3J0bih1bG9uZyk7CitoYWxmIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmX3J0bihjaGFyKTsKK2hhbGYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGZfcnRuKHNob3J0KTsKK2hhbGYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGZfcnRuKGludCk7CitoYWxmIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmX3J0bihsb25nKTsKK2hhbGYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGZfcnRuKGZsb2F0KTsKK2hhbGYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGZfcnRuKGhhbGYpOworaGFsZiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZl9ydHoodWNoYXIpOworaGFsZiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZl9ydHoodXNob3J0KTsKK2hhbGYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGZfcnR6KHVpbnQpOworaGFsZiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZl9ydHoodWxvbmcpOworaGFsZiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZl9ydHooY2hhcik7CitoYWxmIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmX3J0eihzaG9ydCk7CitoYWxmIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmX3J0eihpbnQpOworaGFsZiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZl9ydHoobG9uZyk7CitoYWxmIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmX3J0eihmbG9hdCk7CitoYWxmIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmX3J0eihoYWxmKTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmMihjaGFyMik7CitoYWxmMiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjIodWNoYXIyKTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmMihzaG9ydDIpOworaGFsZjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYyKHVzaG9ydDIpOworaGFsZjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYyKGludDIpOworaGFsZjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYyKHVpbnQyKTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmMihsb25nMik7CitoYWxmMiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjIodWxvbmcyKTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmMihmbG9hdDIpOworaGFsZjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYyKGhhbGYyKTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmMl9ydGUoY2hhcjIpOworaGFsZjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYyX3J0ZSh1Y2hhcjIpOworaGFsZjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYyX3J0ZShzaG9ydDIpOworaGFsZjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYyX3J0ZSh1c2hvcnQyKTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmMl9ydGUoaW50Mik7CitoYWxmMiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjJfcnRlKHVpbnQyKTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmMl9ydGUobG9uZzIpOworaGFsZjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYyX3J0ZSh1bG9uZzIpOworaGFsZjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYyX3J0ZShmbG9hdDIpOworaGFsZjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYyX3J0ZShoYWxmMik7CitoYWxmMiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjJfcnRwKGNoYXIyKTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmMl9ydHAodWNoYXIyKTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmMl9ydHAoc2hvcnQyKTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmMl9ydHAodXNob3J0Mik7CitoYWxmMiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjJfcnRwKGludDIpOworaGFsZjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYyX3J0cCh1aW50Mik7CitoYWxmMiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjJfcnRwKGxvbmcyKTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmMl9ydHAodWxvbmcyKTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmMl9ydHAoZmxvYXQyKTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmMl9ydHAoaGFsZjIpOworaGFsZjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYyX3J0bihjaGFyMik7CitoYWxmMiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjJfcnRuKHVjaGFyMik7CitoYWxmMiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjJfcnRuKHNob3J0Mik7CitoYWxmMiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjJfcnRuKHVzaG9ydDIpOworaGFsZjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYyX3J0bihpbnQyKTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmMl9ydG4odWludDIpOworaGFsZjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYyX3J0bihsb25nMik7CitoYWxmMiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjJfcnRuKHVsb25nMik7CitoYWxmMiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjJfcnRuKGZsb2F0Mik7CitoYWxmMiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjJfcnRuKGhhbGYyKTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmMl9ydHooY2hhcjIpOworaGFsZjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYyX3J0eih1Y2hhcjIpOworaGFsZjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYyX3J0eihzaG9ydDIpOworaGFsZjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYyX3J0eih1c2hvcnQyKTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmMl9ydHooaW50Mik7CitoYWxmMiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjJfcnR6KHVpbnQyKTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmMl9ydHoobG9uZzIpOworaGFsZjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYyX3J0eih1bG9uZzIpOworaGFsZjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYyX3J0eihmbG9hdDIpOworaGFsZjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYyX3J0eihoYWxmMik7CitoYWxmMyBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjMoY2hhcjMpOworaGFsZjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYzKHVjaGFyMyk7CitoYWxmMyBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjMoc2hvcnQzKTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmMyh1c2hvcnQzKTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmMyhpbnQzKTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmMyh1aW50Myk7CitoYWxmMyBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjMobG9uZzMpOworaGFsZjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYzKHVsb25nMyk7CitoYWxmMyBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjMoZmxvYXQzKTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmMyhoYWxmMyk7CitoYWxmMyBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjNfcnRlKGNoYXIzKTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmM19ydGUodWNoYXIzKTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmM19ydGUoc2hvcnQzKTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmM19ydGUodXNob3J0Myk7CitoYWxmMyBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjNfcnRlKGludDMpOworaGFsZjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYzX3J0ZSh1aW50Myk7CitoYWxmMyBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjNfcnRlKGxvbmczKTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmM19ydGUodWxvbmczKTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmM19ydGUoZmxvYXQzKTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmM19ydGUoaGFsZjMpOworaGFsZjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYzX3J0cChjaGFyMyk7CitoYWxmMyBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjNfcnRwKHVjaGFyMyk7CitoYWxmMyBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjNfcnRwKHNob3J0Myk7CitoYWxmMyBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjNfcnRwKHVzaG9ydDMpOworaGFsZjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYzX3J0cChpbnQzKTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmM19ydHAodWludDMpOworaGFsZjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYzX3J0cChsb25nMyk7CitoYWxmMyBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjNfcnRwKHVsb25nMyk7CitoYWxmMyBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjNfcnRwKGZsb2F0Myk7CitoYWxmMyBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjNfcnRwKGhhbGYzKTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmM19ydG4oY2hhcjMpOworaGFsZjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYzX3J0bih1Y2hhcjMpOworaGFsZjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYzX3J0bihzaG9ydDMpOworaGFsZjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYzX3J0bih1c2hvcnQzKTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmM19ydG4oaW50Myk7CitoYWxmMyBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjNfcnRuKHVpbnQzKTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmM19ydG4obG9uZzMpOworaGFsZjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYzX3J0bih1bG9uZzMpOworaGFsZjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYzX3J0bihmbG9hdDMpOworaGFsZjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYzX3J0bihoYWxmMyk7CitoYWxmMyBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjNfcnR6KGNoYXIzKTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmM19ydHoodWNoYXIzKTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmM19ydHooc2hvcnQzKTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmM19ydHoodXNob3J0Myk7CitoYWxmMyBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjNfcnR6KGludDMpOworaGFsZjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYzX3J0eih1aW50Myk7CitoYWxmMyBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjNfcnR6KGxvbmczKTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmM19ydHoodWxvbmczKTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmM19ydHooZmxvYXQzKTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmM19ydHooaGFsZjMpOworaGFsZjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGY0KGNoYXI0KTsKK2hhbGY0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmNCh1Y2hhcjQpOworaGFsZjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGY0KHNob3J0NCk7CitoYWxmNCBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjQodXNob3J0NCk7CitoYWxmNCBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjQoaW50NCk7CitoYWxmNCBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjQodWludDQpOworaGFsZjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGY0KGxvbmc0KTsKK2hhbGY0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmNCh1bG9uZzQpOworaGFsZjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGY0KGZsb2F0NCk7CitoYWxmNCBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjQoaGFsZjQpOworaGFsZjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGY0X3J0ZShjaGFyNCk7CitoYWxmNCBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjRfcnRlKHVjaGFyNCk7CitoYWxmNCBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjRfcnRlKHNob3J0NCk7CitoYWxmNCBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjRfcnRlKHVzaG9ydDQpOworaGFsZjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGY0X3J0ZShpbnQ0KTsKK2hhbGY0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmNF9ydGUodWludDQpOworaGFsZjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGY0X3J0ZShsb25nNCk7CitoYWxmNCBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjRfcnRlKHVsb25nNCk7CitoYWxmNCBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjRfcnRlKGZsb2F0NCk7CitoYWxmNCBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjRfcnRlKGhhbGY0KTsKK2hhbGY0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmNF9ydHAoY2hhcjQpOworaGFsZjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGY0X3J0cCh1Y2hhcjQpOworaGFsZjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGY0X3J0cChzaG9ydDQpOworaGFsZjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGY0X3J0cCh1c2hvcnQ0KTsKK2hhbGY0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmNF9ydHAoaW50NCk7CitoYWxmNCBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjRfcnRwKHVpbnQ0KTsKK2hhbGY0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmNF9ydHAobG9uZzQpOworaGFsZjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGY0X3J0cCh1bG9uZzQpOworaGFsZjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGY0X3J0cChmbG9hdDQpOworaGFsZjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGY0X3J0cChoYWxmNCk7CitoYWxmNCBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjRfcnRuKGNoYXI0KTsKK2hhbGY0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmNF9ydG4odWNoYXI0KTsKK2hhbGY0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmNF9ydG4oc2hvcnQ0KTsKK2hhbGY0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmNF9ydG4odXNob3J0NCk7CitoYWxmNCBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjRfcnRuKGludDQpOworaGFsZjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGY0X3J0bih1aW50NCk7CitoYWxmNCBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjRfcnRuKGxvbmc0KTsKK2hhbGY0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmNF9ydG4odWxvbmc0KTsKK2hhbGY0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmNF9ydG4oZmxvYXQ0KTsKK2hhbGY0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmNF9ydG4oaGFsZjQpOworaGFsZjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGY0X3J0eihjaGFyNCk7CitoYWxmNCBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjRfcnR6KHVjaGFyNCk7CitoYWxmNCBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjRfcnR6KHNob3J0NCk7CitoYWxmNCBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjRfcnR6KHVzaG9ydDQpOworaGFsZjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGY0X3J0eihpbnQ0KTsKK2hhbGY0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmNF9ydHoodWludDQpOworaGFsZjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGY0X3J0eihsb25nNCk7CitoYWxmNCBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjRfcnR6KHVsb25nNCk7CitoYWxmNCBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjRfcnR6KGZsb2F0NCk7CitoYWxmNCBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjRfcnR6KGhhbGY0KTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmOChjaGFyOCk7CitoYWxmOCBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjgodWNoYXI4KTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmOChzaG9ydDgpOworaGFsZjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGY4KHVzaG9ydDgpOworaGFsZjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGY4KGludDgpOworaGFsZjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGY4KHVpbnQ4KTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmOChsb25nOCk7CitoYWxmOCBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjgodWxvbmc4KTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmOChmbG9hdDgpOworaGFsZjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGY4KGhhbGY4KTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmOF9ydGUoY2hhcjgpOworaGFsZjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGY4X3J0ZSh1Y2hhcjgpOworaGFsZjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGY4X3J0ZShzaG9ydDgpOworaGFsZjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGY4X3J0ZSh1c2hvcnQ4KTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmOF9ydGUoaW50OCk7CitoYWxmOCBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjhfcnRlKHVpbnQ4KTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmOF9ydGUobG9uZzgpOworaGFsZjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGY4X3J0ZSh1bG9uZzgpOworaGFsZjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGY4X3J0ZShmbG9hdDgpOworaGFsZjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGY4X3J0ZShoYWxmOCk7CitoYWxmOCBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjhfcnRwKGNoYXI4KTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmOF9ydHAodWNoYXI4KTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmOF9ydHAoc2hvcnQ4KTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmOF9ydHAodXNob3J0OCk7CitoYWxmOCBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjhfcnRwKGludDgpOworaGFsZjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGY4X3J0cCh1aW50OCk7CitoYWxmOCBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjhfcnRwKGxvbmc4KTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmOF9ydHAodWxvbmc4KTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmOF9ydHAoZmxvYXQ4KTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmOF9ydHAoaGFsZjgpOworaGFsZjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGY4X3J0bihjaGFyOCk7CitoYWxmOCBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjhfcnRuKHVjaGFyOCk7CitoYWxmOCBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjhfcnRuKHNob3J0OCk7CitoYWxmOCBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjhfcnRuKHVzaG9ydDgpOworaGFsZjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGY4X3J0bihpbnQ4KTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmOF9ydG4odWludDgpOworaGFsZjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGY4X3J0bihsb25nOCk7CitoYWxmOCBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjhfcnRuKHVsb25nOCk7CitoYWxmOCBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjhfcnRuKGZsb2F0OCk7CitoYWxmOCBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjhfcnRuKGhhbGY4KTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmOF9ydHooY2hhcjgpOworaGFsZjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGY4X3J0eih1Y2hhcjgpOworaGFsZjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGY4X3J0eihzaG9ydDgpOworaGFsZjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGY4X3J0eih1c2hvcnQ4KTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmOF9ydHooaW50OCk7CitoYWxmOCBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjhfcnR6KHVpbnQ4KTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmOF9ydHoobG9uZzgpOworaGFsZjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGY4X3J0eih1bG9uZzgpOworaGFsZjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGY4X3J0eihmbG9hdDgpOworaGFsZjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGY4X3J0eihoYWxmOCk7CitoYWxmMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYxNihjaGFyMTYpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmMTYodWNoYXIxNik7CitoYWxmMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYxNihzaG9ydDE2KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjE2KHVzaG9ydDE2KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjE2KGludDE2KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjE2KHVpbnQxNik7CitoYWxmMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYxNihsb25nMTYpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmMTYodWxvbmcxNik7CitoYWxmMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYxNihmbG9hdDE2KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjE2KGhhbGYxNik7CitoYWxmMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYxNl9ydGUoY2hhcjE2KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjE2X3J0ZSh1Y2hhcjE2KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjE2X3J0ZShzaG9ydDE2KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjE2X3J0ZSh1c2hvcnQxNik7CitoYWxmMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYxNl9ydGUoaW50MTYpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmMTZfcnRlKHVpbnQxNik7CitoYWxmMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYxNl9ydGUobG9uZzE2KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjE2X3J0ZSh1bG9uZzE2KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjE2X3J0ZShmbG9hdDE2KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjE2X3J0ZShoYWxmMTYpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmMTZfcnRwKGNoYXIxNik7CitoYWxmMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYxNl9ydHAodWNoYXIxNik7CitoYWxmMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYxNl9ydHAoc2hvcnQxNik7CitoYWxmMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYxNl9ydHAodXNob3J0MTYpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmMTZfcnRwKGludDE2KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjE2X3J0cCh1aW50MTYpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmMTZfcnRwKGxvbmcxNik7CitoYWxmMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYxNl9ydHAodWxvbmcxNik7CitoYWxmMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYxNl9ydHAoZmxvYXQxNik7CitoYWxmMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYxNl9ydHAoaGFsZjE2KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjE2X3J0bihjaGFyMTYpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmMTZfcnRuKHVjaGFyMTYpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmMTZfcnRuKHNob3J0MTYpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmMTZfcnRuKHVzaG9ydDE2KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjE2X3J0bihpbnQxNik7CitoYWxmMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYxNl9ydG4odWludDE2KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjE2X3J0bihsb25nMTYpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmMTZfcnRuKHVsb25nMTYpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmMTZfcnRuKGZsb2F0MTYpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmMTZfcnRuKGhhbGYxNik7CitoYWxmMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYxNl9ydHooY2hhcjE2KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjE2X3J0eih1Y2hhcjE2KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjE2X3J0eihzaG9ydDE2KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjE2X3J0eih1c2hvcnQxNik7CitoYWxmMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYxNl9ydHooaW50MTYpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmMTZfcnR6KHVpbnQxNik7CitoYWxmMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYxNl9ydHoobG9uZzE2KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjE2X3J0eih1bG9uZzE2KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjE2X3J0eihmbG9hdDE2KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjE2X3J0eihoYWxmMTYpOworCisvLyBDb252ZXJ0IGhhbGYgdHlwZXMgdG8gZG91YmxlIHR5cGVzLgorI2lmZGVmIGNsX2tocl9mcDY0Citkb3VibGUgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZShoYWxmKTsKK2RvdWJsZSBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlX3J0ZShoYWxmKTsKK2RvdWJsZSBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlX3J0cChoYWxmKTsKK2RvdWJsZSBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlX3J0bihoYWxmKTsKK2RvdWJsZSBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlX3J0eihoYWxmKTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTIoaGFsZjIpOworZG91YmxlMiBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlMl9ydGUoaGFsZjIpOworZG91YmxlMiBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlMl9ydHAoaGFsZjIpOworZG91YmxlMiBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlMl9ydG4oaGFsZjIpOworZG91YmxlMiBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlMl9ydHooaGFsZjIpOworZG91YmxlMyBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlMyhoYWxmMyk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUzX3J0ZShoYWxmMyk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUzX3J0cChoYWxmMyk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUzX3J0bihoYWxmMyk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGUzX3J0eihoYWxmMyk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9kb3VibGU0KGhhbGY0KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTRfcnRlKGhhbGY0KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTRfcnRwKGhhbGY0KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTRfcnRuKGhhbGY0KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTRfcnR6KGhhbGY0KTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTgoaGFsZjgpOworZG91YmxlOCBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlOF9ydGUoaGFsZjgpOworZG91YmxlOCBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlOF9ydHAoaGFsZjgpOworZG91YmxlOCBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlOF9ydG4oaGFsZjgpOworZG91YmxlOCBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlOF9ydHooaGFsZjgpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2RvdWJsZTE2KGhhbGYxNik7Citkb3VibGUxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlMTZfcnRlKGhhbGYxNik7Citkb3VibGUxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlMTZfcnRwKGhhbGYxNik7Citkb3VibGUxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlMTZfcnRuKGhhbGYxNik7Citkb3VibGUxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfZG91YmxlMTZfcnR6KGhhbGYxNik7CisKKy8vIENvbnZlcnQgZG91YmxlIHR5cGVzIHRvIGhhbGYgdHlwZXMuCitoYWxmIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmKGRvdWJsZSk7CitoYWxmIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmX3J0ZShkb3VibGUpOworaGFsZiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZl9ydHAoZG91YmxlKTsKK2hhbGYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGZfcnRuKGRvdWJsZSk7CitoYWxmIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmX3J0eihkb3VibGUpOworaGFsZjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYyKGRvdWJsZTIpOworaGFsZjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYyX3J0ZShkb3VibGUyKTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmMl9ydHAoZG91YmxlMik7CitoYWxmMiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjJfcnRuKGRvdWJsZTIpOworaGFsZjIgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYyX3J0eihkb3VibGUyKTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmMyhkb3VibGUzKTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmM19ydGUoZG91YmxlMyk7CitoYWxmMyBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjNfcnRwKGRvdWJsZTMpOworaGFsZjMgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYzX3J0bihkb3VibGUzKTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmM19ydHooZG91YmxlMyk7CitoYWxmNCBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjQoZG91YmxlNCk7CitoYWxmNCBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjRfcnRlKGRvdWJsZTQpOworaGFsZjQgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGY0X3J0cChkb3VibGU0KTsKK2hhbGY0IF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmNF9ydG4oZG91YmxlNCk7CitoYWxmNCBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjRfcnR6KGRvdWJsZTQpOworaGFsZjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGY4KGRvdWJsZTgpOworaGFsZjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGY4X3J0ZShkb3VibGU4KTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmOF9ydHAoZG91YmxlOCk7CitoYWxmOCBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjhfcnRuKGRvdWJsZTgpOworaGFsZjggX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGY4X3J0eihkb3VibGU4KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjE2KGRvdWJsZTE2KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjE2X3J0ZShkb3VibGUxNik7CitoYWxmMTYgX19vdmxkIF9fY25mbiBjb252ZXJ0X2hhbGYxNl9ydHAoZG91YmxlMTYpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gY29udmVydF9oYWxmMTZfcnRuKGRvdWJsZTE2KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIGNvbnZlcnRfaGFsZjE2X3J0eihkb3VibGUxNik7CisjZW5kaWYgLy9jbF9raHJfZnA2NAorCisjZW5kaWYgLy8gY2xfa2hyX2ZwMTYKKworLyoqCisgKiBPcGVuQ0wgdjEuMS8xLjIvMi4wIHM2LjIuNC4yIC0gYXNfdHlwZSBvcGVyYXRvcnMKKyAqIFJlaW50ZXJwcmV0cyBhIGRhdGEgdHlwZSBhcyBhbm90aGVyIGRhdGEgdHlwZSBvZiB0aGUgc2FtZSBzaXplCisgKi8KK2NoYXIgX19vdmxkIF9fY25mbiBhc19jaGFyKGNoYXIpOworY2hhciBfX292bGQgX19jbmZuIGFzX2NoYXIodWNoYXIpOworCitjaGFyMiBfX292bGQgX19jbmZuIGFzX2NoYXIyKGNoYXIyKTsKK2NoYXIyIF9fb3ZsZCBfX2NuZm4gYXNfY2hhcjIodWNoYXIyKTsKK2NoYXIyIF9fb3ZsZCBfX2NuZm4gYXNfY2hhcjIoc2hvcnQpOworY2hhcjIgX19vdmxkIF9fY25mbiBhc19jaGFyMih1c2hvcnQpOworCitjaGFyMyBfX292bGQgX19jbmZuIGFzX2NoYXIzKGNoYXIzKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gYXNfY2hhcjMoY2hhcjQpOworY2hhcjMgX19vdmxkIF9fY25mbiBhc19jaGFyMyh1Y2hhcjMpOworY2hhcjMgX19vdmxkIF9fY25mbiBhc19jaGFyMyh1Y2hhcjQpOworY2hhcjMgX19vdmxkIF9fY25mbiBhc19jaGFyMyhzaG9ydDIpOworY2hhcjMgX19vdmxkIF9fY25mbiBhc19jaGFyMyh1c2hvcnQyKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gYXNfY2hhcjMoaW50KTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gYXNfY2hhcjModWludCk7CitjaGFyMyBfX292bGQgX19jbmZuIGFzX2NoYXIzKGZsb2F0KTsKKworY2hhcjQgX19vdmxkIF9fY25mbiBhc19jaGFyNChjaGFyMyk7CitjaGFyNCBfX292bGQgX19jbmZuIGFzX2NoYXI0KGNoYXI0KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gYXNfY2hhcjQodWNoYXIzKTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gYXNfY2hhcjQodWNoYXI0KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gYXNfY2hhcjQoc2hvcnQyKTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gYXNfY2hhcjQodXNob3J0Mik7CitjaGFyNCBfX292bGQgX19jbmZuIGFzX2NoYXI0KGludCk7CitjaGFyNCBfX292bGQgX19jbmZuIGFzX2NoYXI0KHVpbnQpOworY2hhcjQgX19vdmxkIF9fY25mbiBhc19jaGFyNChmbG9hdCk7CisKK2NoYXI4IF9fb3ZsZCBfX2NuZm4gYXNfY2hhcjgoY2hhcjgpOworY2hhcjggX19vdmxkIF9fY25mbiBhc19jaGFyOCh1Y2hhcjgpOworY2hhcjggX19vdmxkIF9fY25mbiBhc19jaGFyOChzaG9ydDMpOworY2hhcjggX19vdmxkIF9fY25mbiBhc19jaGFyOChzaG9ydDQpOworY2hhcjggX19vdmxkIF9fY25mbiBhc19jaGFyOCh1c2hvcnQzKTsKK2NoYXI4IF9fb3ZsZCBfX2NuZm4gYXNfY2hhcjgodXNob3J0NCk7CitjaGFyOCBfX292bGQgX19jbmZuIGFzX2NoYXI4KGludDIpOworY2hhcjggX19vdmxkIF9fY25mbiBhc19jaGFyOCh1aW50Mik7CitjaGFyOCBfX292bGQgX19jbmZuIGFzX2NoYXI4KGxvbmcpOworY2hhcjggX19vdmxkIF9fY25mbiBhc19jaGFyOCh1bG9uZyk7CitjaGFyOCBfX292bGQgX19jbmZuIGFzX2NoYXI4KGZsb2F0Mik7CisKK2NoYXIxNiBfX292bGQgX19jbmZuIGFzX2NoYXIxNihjaGFyMTYpOworY2hhcjE2IF9fb3ZsZCBfX2NuZm4gYXNfY2hhcjE2KHVjaGFyMTYpOworY2hhcjE2IF9fb3ZsZCBfX2NuZm4gYXNfY2hhcjE2KHNob3J0OCk7CitjaGFyMTYgX19vdmxkIF9fY25mbiBhc19jaGFyMTYodXNob3J0OCk7CitjaGFyMTYgX19vdmxkIF9fY25mbiBhc19jaGFyMTYoaW50Myk7CitjaGFyMTYgX19vdmxkIF9fY25mbiBhc19jaGFyMTYoaW50NCk7CitjaGFyMTYgX19vdmxkIF9fY25mbiBhc19jaGFyMTYodWludDMpOworY2hhcjE2IF9fb3ZsZCBfX2NuZm4gYXNfY2hhcjE2KHVpbnQ0KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGFzX2NoYXIxNihsb25nMik7CitjaGFyMTYgX19vdmxkIF9fY25mbiBhc19jaGFyMTYodWxvbmcyKTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGFzX2NoYXIxNihmbG9hdDMpOworY2hhcjE2IF9fb3ZsZCBfX2NuZm4gYXNfY2hhcjE2KGZsb2F0NCk7CisKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gYXNfdWNoYXIoY2hhcik7Cit1Y2hhciBfX292bGQgX19jbmZuIGFzX3VjaGFyKHVjaGFyKTsKKwordWNoYXIyIF9fb3ZsZCBfX2NuZm4gYXNfdWNoYXIyKGNoYXIyKTsKK3VjaGFyMiBfX292bGQgX19jbmZuIGFzX3VjaGFyMih1Y2hhcjIpOwordWNoYXIyIF9fb3ZsZCBfX2NuZm4gYXNfdWNoYXIyKHNob3J0KTsKK3VjaGFyMiBfX292bGQgX19jbmZuIGFzX3VjaGFyMih1c2hvcnQpOworCit1Y2hhcjMgX19vdmxkIF9fY25mbiBhc191Y2hhcjMoY2hhcjMpOwordWNoYXIzIF9fb3ZsZCBfX2NuZm4gYXNfdWNoYXIzKGNoYXI0KTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGFzX3VjaGFyMyh1Y2hhcjMpOwordWNoYXIzIF9fb3ZsZCBfX2NuZm4gYXNfdWNoYXIzKHVjaGFyNCk7Cit1Y2hhcjMgX19vdmxkIF9fY25mbiBhc191Y2hhcjMoc2hvcnQyKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGFzX3VjaGFyMyh1c2hvcnQyKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGFzX3VjaGFyMyhpbnQpOwordWNoYXIzIF9fb3ZsZCBfX2NuZm4gYXNfdWNoYXIzKHVpbnQpOwordWNoYXIzIF9fb3ZsZCBfX2NuZm4gYXNfdWNoYXIzKGZsb2F0KTsKKwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gYXNfdWNoYXI0KGNoYXIzKTsKK3VjaGFyNCBfX292bGQgX19jbmZuIGFzX3VjaGFyNChjaGFyNCk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBhc191Y2hhcjQodWNoYXIzKTsKK3VjaGFyNCBfX292bGQgX19jbmZuIGFzX3VjaGFyNCh1Y2hhcjQpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gYXNfdWNoYXI0KHNob3J0Mik7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBhc191Y2hhcjQodXNob3J0Mik7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBhc191Y2hhcjQoaW50KTsKK3VjaGFyNCBfX292bGQgX19jbmZuIGFzX3VjaGFyNCh1aW50KTsKK3VjaGFyNCBfX292bGQgX19jbmZuIGFzX3VjaGFyNChmbG9hdCk7CisKK3VjaGFyOCBfX292bGQgX19jbmZuIGFzX3VjaGFyOChjaGFyOCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBhc191Y2hhcjgodWNoYXI4KTsKK3VjaGFyOCBfX292bGQgX19jbmZuIGFzX3VjaGFyOChzaG9ydDMpOwordWNoYXI4IF9fb3ZsZCBfX2NuZm4gYXNfdWNoYXI4KHNob3J0NCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBhc191Y2hhcjgodXNob3J0Myk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBhc191Y2hhcjgodXNob3J0NCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBhc191Y2hhcjgoaW50Mik7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBhc191Y2hhcjgodWludDIpOwordWNoYXI4IF9fb3ZsZCBfX2NuZm4gYXNfdWNoYXI4KGxvbmcpOwordWNoYXI4IF9fb3ZsZCBfX2NuZm4gYXNfdWNoYXI4KHVsb25nKTsKK3VjaGFyOCBfX292bGQgX19jbmZuIGFzX3VjaGFyOChmbG9hdDIpOworCit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gYXNfdWNoYXIxNihjaGFyMTYpOwordWNoYXIxNiBfX292bGQgX19jbmZuIGFzX3VjaGFyMTYodWNoYXIxNik7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gYXNfdWNoYXIxNihzaG9ydDgpOwordWNoYXIxNiBfX292bGQgX19jbmZuIGFzX3VjaGFyMTYodXNob3J0OCk7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gYXNfdWNoYXIxNihpbnQzKTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBhc191Y2hhcjE2KGludDQpOwordWNoYXIxNiBfX292bGQgX19jbmZuIGFzX3VjaGFyMTYodWludDMpOwordWNoYXIxNiBfX292bGQgX19jbmZuIGFzX3VjaGFyMTYodWludDQpOwordWNoYXIxNiBfX292bGQgX19jbmZuIGFzX3VjaGFyMTYobG9uZzIpOwordWNoYXIxNiBfX292bGQgX19jbmZuIGFzX3VjaGFyMTYodWxvbmcyKTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBhc191Y2hhcjE2KGZsb2F0Myk7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gYXNfdWNoYXIxNihmbG9hdDQpOworCitzaG9ydCBfX292bGQgX19jbmZuIGFzX3Nob3J0KGNoYXIyKTsKK3Nob3J0IF9fb3ZsZCBfX2NuZm4gYXNfc2hvcnQodWNoYXIyKTsKK3Nob3J0IF9fb3ZsZCBfX2NuZm4gYXNfc2hvcnQoc2hvcnQpOworc2hvcnQgX19vdmxkIF9fY25mbiBhc19zaG9ydCh1c2hvcnQpOworCitzaG9ydDIgX19vdmxkIF9fY25mbiBhc19zaG9ydDIoY2hhcjMpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gYXNfc2hvcnQyKGNoYXI0KTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGFzX3Nob3J0Mih1Y2hhcjMpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gYXNfc2hvcnQyKHVjaGFyNCk7CitzaG9ydDIgX19vdmxkIF9fY25mbiBhc19zaG9ydDIoc2hvcnQyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGFzX3Nob3J0Mih1c2hvcnQyKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGFzX3Nob3J0MihpbnQpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gYXNfc2hvcnQyKHVpbnQpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gYXNfc2hvcnQyKGZsb2F0KTsKKworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gYXNfc2hvcnQzKGNoYXI4KTsKK3Nob3J0MyBfX292bGQgX19jbmZuIGFzX3Nob3J0Myh1Y2hhcjgpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gYXNfc2hvcnQzKHNob3J0Myk7CitzaG9ydDMgX19vdmxkIF9fY25mbiBhc19zaG9ydDMoc2hvcnQ0KTsKK3Nob3J0MyBfX292bGQgX19jbmZuIGFzX3Nob3J0Myh1c2hvcnQzKTsKK3Nob3J0MyBfX292bGQgX19jbmZuIGFzX3Nob3J0Myh1c2hvcnQ0KTsKK3Nob3J0MyBfX292bGQgX19jbmZuIGFzX3Nob3J0MyhpbnQyKTsKK3Nob3J0MyBfX292bGQgX19jbmZuIGFzX3Nob3J0Myh1aW50Mik7CitzaG9ydDMgX19vdmxkIF9fY25mbiBhc19zaG9ydDMobG9uZyk7CitzaG9ydDMgX19vdmxkIF9fY25mbiBhc19zaG9ydDModWxvbmcpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gYXNfc2hvcnQzKGZsb2F0Mik7CisKK3Nob3J0NCBfX292bGQgX19jbmZuIGFzX3Nob3J0NChjaGFyOCk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBhc19zaG9ydDQodWNoYXI4KTsKK3Nob3J0NCBfX292bGQgX19jbmZuIGFzX3Nob3J0NChzaG9ydDMpOworc2hvcnQ0IF9fb3ZsZCBfX2NuZm4gYXNfc2hvcnQ0KHNob3J0NCk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBhc19zaG9ydDQodXNob3J0Myk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBhc19zaG9ydDQodXNob3J0NCk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBhc19zaG9ydDQoaW50Mik7CitzaG9ydDQgX19vdmxkIF9fY25mbiBhc19zaG9ydDQodWludDIpOworc2hvcnQ0IF9fb3ZsZCBfX2NuZm4gYXNfc2hvcnQ0KGxvbmcpOworc2hvcnQ0IF9fb3ZsZCBfX2NuZm4gYXNfc2hvcnQ0KHVsb25nKTsKK3Nob3J0NCBfX292bGQgX19jbmZuIGFzX3Nob3J0NChmbG9hdDIpOworCitzaG9ydDggX19vdmxkIF9fY25mbiBhc19zaG9ydDgoY2hhcjE2KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGFzX3Nob3J0OCh1Y2hhcjE2KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGFzX3Nob3J0OChzaG9ydDgpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gYXNfc2hvcnQ4KHVzaG9ydDgpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gYXNfc2hvcnQ4KGludDMpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gYXNfc2hvcnQ4KGludDQpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gYXNfc2hvcnQ4KHVpbnQzKTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGFzX3Nob3J0OCh1aW50NCk7CitzaG9ydDggX19vdmxkIF9fY25mbiBhc19zaG9ydDgobG9uZzIpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gYXNfc2hvcnQ4KHVsb25nMik7CitzaG9ydDggX19vdmxkIF9fY25mbiBhc19zaG9ydDgoZmxvYXQzKTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGFzX3Nob3J0OChmbG9hdDQpOworCitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gYXNfc2hvcnQxNihzaG9ydDE2KTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBhc19zaG9ydDE2KHVzaG9ydDE2KTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBhc19zaG9ydDE2KGludDgpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGFzX3Nob3J0MTYodWludDgpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGFzX3Nob3J0MTYobG9uZzMpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGFzX3Nob3J0MTYobG9uZzQpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGFzX3Nob3J0MTYodWxvbmczKTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBhc19zaG9ydDE2KHVsb25nNCk7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gYXNfc2hvcnQxNihmbG9hdDgpOworCit1c2hvcnQgX19vdmxkIF9fY25mbiBhc191c2hvcnQoY2hhcjIpOwordXNob3J0IF9fb3ZsZCBfX2NuZm4gYXNfdXNob3J0KHVjaGFyMik7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBhc191c2hvcnQoc2hvcnQpOwordXNob3J0IF9fb3ZsZCBfX2NuZm4gYXNfdXNob3J0KHVzaG9ydCk7CisKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBhc191c2hvcnQyKGNoYXIzKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBhc191c2hvcnQyKGNoYXI0KTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBhc191c2hvcnQyKHVjaGFyMyk7Cit1c2hvcnQyIF9fb3ZsZCBfX2NuZm4gYXNfdXNob3J0Mih1Y2hhcjQpOwordXNob3J0MiBfX292bGQgX19jbmZuIGFzX3VzaG9ydDIoc2hvcnQyKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBhc191c2hvcnQyKHVzaG9ydDIpOwordXNob3J0MiBfX292bGQgX19jbmZuIGFzX3VzaG9ydDIoaW50KTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBhc191c2hvcnQyKHVpbnQpOwordXNob3J0MiBfX292bGQgX19jbmZuIGFzX3VzaG9ydDIoZmxvYXQpOworCit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gYXNfdXNob3J0MyhjaGFyOCk7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gYXNfdXNob3J0Myh1Y2hhcjgpOwordXNob3J0MyBfX292bGQgX19jbmZuIGFzX3VzaG9ydDMoc2hvcnQzKTsKK3VzaG9ydDMgX19vdmxkIF9fY25mbiBhc191c2hvcnQzKHNob3J0NCk7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gYXNfdXNob3J0Myh1c2hvcnQzKTsKK3VzaG9ydDMgX19vdmxkIF9fY25mbiBhc191c2hvcnQzKHVzaG9ydDQpOwordXNob3J0MyBfX292bGQgX19jbmZuIGFzX3VzaG9ydDMoaW50Mik7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gYXNfdXNob3J0Myh1aW50Mik7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gYXNfdXNob3J0Myhsb25nKTsKK3VzaG9ydDMgX19vdmxkIF9fY25mbiBhc191c2hvcnQzKHVsb25nKTsKK3VzaG9ydDMgX19vdmxkIF9fY25mbiBhc191c2hvcnQzKGZsb2F0Mik7CisKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBhc191c2hvcnQ0KGNoYXI4KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBhc191c2hvcnQ0KHVjaGFyOCk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gYXNfdXNob3J0NChzaG9ydDMpOwordXNob3J0NCBfX292bGQgX19jbmZuIGFzX3VzaG9ydDQoc2hvcnQ0KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBhc191c2hvcnQ0KHVzaG9ydDMpOwordXNob3J0NCBfX292bGQgX19jbmZuIGFzX3VzaG9ydDQodXNob3J0NCk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gYXNfdXNob3J0NChpbnQyKTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBhc191c2hvcnQ0KHVpbnQyKTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBhc191c2hvcnQ0KGxvbmcpOwordXNob3J0NCBfX292bGQgX19jbmZuIGFzX3VzaG9ydDQodWxvbmcpOwordXNob3J0NCBfX292bGQgX19jbmZuIGFzX3VzaG9ydDQoZmxvYXQyKTsKKwordXNob3J0OCBfX292bGQgX19jbmZuIGFzX3VzaG9ydDgoY2hhcjE2KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBhc191c2hvcnQ4KHVjaGFyMTYpOwordXNob3J0OCBfX292bGQgX19jbmZuIGFzX3VzaG9ydDgoc2hvcnQ4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBhc191c2hvcnQ4KHVzaG9ydDgpOwordXNob3J0OCBfX292bGQgX19jbmZuIGFzX3VzaG9ydDgoaW50Myk7Cit1c2hvcnQ4IF9fb3ZsZCBfX2NuZm4gYXNfdXNob3J0OChpbnQ0KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBhc191c2hvcnQ4KHVpbnQzKTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBhc191c2hvcnQ4KHVpbnQ0KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBhc191c2hvcnQ4KGxvbmcyKTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBhc191c2hvcnQ4KHVsb25nMik7Cit1c2hvcnQ4IF9fb3ZsZCBfX2NuZm4gYXNfdXNob3J0OChmbG9hdDMpOwordXNob3J0OCBfX292bGQgX19jbmZuIGFzX3VzaG9ydDgoZmxvYXQ0KTsKKwordXNob3J0MTYgX19vdmxkIF9fY25mbiBhc191c2hvcnQxNihzaG9ydDE2KTsKK3VzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gYXNfdXNob3J0MTYodXNob3J0MTYpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBhc191c2hvcnQxNihpbnQ4KTsKK3VzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gYXNfdXNob3J0MTYodWludDgpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBhc191c2hvcnQxNihsb25nMyk7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIGFzX3VzaG9ydDE2KGxvbmc0KTsKK3VzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gYXNfdXNob3J0MTYodWxvbmczKTsKK3VzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gYXNfdXNob3J0MTYodWxvbmc0KTsKK3VzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gYXNfdXNob3J0MTYoZmxvYXQ4KTsKKworaW50IF9fb3ZsZCBfX2NuZm4gYXNfaW50KGNoYXIzKTsKK2ludCBfX292bGQgX19jbmZuIGFzX2ludChjaGFyNCk7CitpbnQgX19vdmxkIF9fY25mbiBhc19pbnQodWNoYXIzKTsKK2ludCBfX292bGQgX19jbmZuIGFzX2ludCh1Y2hhcjQpOworaW50IF9fb3ZsZCBfX2NuZm4gYXNfaW50KHNob3J0Mik7CitpbnQgX19vdmxkIF9fY25mbiBhc19pbnQodXNob3J0Mik7CitpbnQgX19vdmxkIF9fY25mbiBhc19pbnQoaW50KTsKK2ludCBfX292bGQgX19jbmZuIGFzX2ludCh1aW50KTsKK2ludCBfX292bGQgX19jbmZuIGFzX2ludChmbG9hdCk7CisKK2ludDIgX19vdmxkIF9fY25mbiBhc19pbnQyKGNoYXI4KTsKK2ludDIgX19vdmxkIF9fY25mbiBhc19pbnQyKHVjaGFyOCk7CitpbnQyIF9fb3ZsZCBfX2NuZm4gYXNfaW50MihzaG9ydDMpOworaW50MiBfX292bGQgX19jbmZuIGFzX2ludDIoc2hvcnQ0KTsKK2ludDIgX19vdmxkIF9fY25mbiBhc19pbnQyKHVzaG9ydDMpOworaW50MiBfX292bGQgX19jbmZuIGFzX2ludDIodXNob3J0NCk7CitpbnQyIF9fb3ZsZCBfX2NuZm4gYXNfaW50MihpbnQyKTsKK2ludDIgX19vdmxkIF9fY25mbiBhc19pbnQyKHVpbnQyKTsKK2ludDIgX19vdmxkIF9fY25mbiBhc19pbnQyKGxvbmcpOworaW50MiBfX292bGQgX19jbmZuIGFzX2ludDIodWxvbmcpOworaW50MiBfX292bGQgX19jbmZuIGFzX2ludDIoZmxvYXQyKTsKKworaW50MyBfX292bGQgX19jbmZuIGFzX2ludDMoY2hhcjE2KTsKK2ludDMgX19vdmxkIF9fY25mbiBhc19pbnQzKHVjaGFyMTYpOworaW50MyBfX292bGQgX19jbmZuIGFzX2ludDMoc2hvcnQ4KTsKK2ludDMgX19vdmxkIF9fY25mbiBhc19pbnQzKHVzaG9ydDgpOworaW50MyBfX292bGQgX19jbmZuIGFzX2ludDMoaW50Myk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gYXNfaW50MyhpbnQ0KTsKK2ludDMgX19vdmxkIF9fY25mbiBhc19pbnQzKHVpbnQzKTsKK2ludDMgX19vdmxkIF9fY25mbiBhc19pbnQzKHVpbnQ0KTsKK2ludDMgX19vdmxkIF9fY25mbiBhc19pbnQzKGxvbmcyKTsKK2ludDMgX19vdmxkIF9fY25mbiBhc19pbnQzKHVsb25nMik7CitpbnQzIF9fb3ZsZCBfX2NuZm4gYXNfaW50MyhmbG9hdDMpOworaW50MyBfX292bGQgX19jbmZuIGFzX2ludDMoZmxvYXQ0KTsKKworaW50NCBfX292bGQgX19jbmZuIGFzX2ludDQoY2hhcjE2KTsKK2ludDQgX19vdmxkIF9fY25mbiBhc19pbnQ0KHVjaGFyMTYpOworaW50NCBfX292bGQgX19jbmZuIGFzX2ludDQoc2hvcnQ4KTsKK2ludDQgX19vdmxkIF9fY25mbiBhc19pbnQ0KHVzaG9ydDgpOworaW50NCBfX292bGQgX19jbmZuIGFzX2ludDQoaW50Myk7CitpbnQ0IF9fb3ZsZCBfX2NuZm4gYXNfaW50NChpbnQ0KTsKK2ludDQgX19vdmxkIF9fY25mbiBhc19pbnQ0KHVpbnQzKTsKK2ludDQgX19vdmxkIF9fY25mbiBhc19pbnQ0KHVpbnQ0KTsKK2ludDQgX19vdmxkIF9fY25mbiBhc19pbnQ0KGxvbmcyKTsKK2ludDQgX19vdmxkIF9fY25mbiBhc19pbnQ0KHVsb25nMik7CitpbnQ0IF9fb3ZsZCBfX2NuZm4gYXNfaW50NChmbG9hdDMpOworaW50NCBfX292bGQgX19jbmZuIGFzX2ludDQoZmxvYXQ0KTsKKworaW50OCBfX292bGQgX19jbmZuIGFzX2ludDgoc2hvcnQxNik7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gYXNfaW50OCh1c2hvcnQxNik7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gYXNfaW50OChpbnQ4KTsKK2ludDggX19vdmxkIF9fY25mbiBhc19pbnQ4KHVpbnQ4KTsKK2ludDggX19vdmxkIF9fY25mbiBhc19pbnQ4KGxvbmczKTsKK2ludDggX19vdmxkIF9fY25mbiBhc19pbnQ4KGxvbmc0KTsKK2ludDggX19vdmxkIF9fY25mbiBhc19pbnQ4KHVsb25nMyk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gYXNfaW50OCh1bG9uZzQpOworaW50OCBfX292bGQgX19jbmZuIGFzX2ludDgoZmxvYXQ4KTsKKworaW50MTYgX19vdmxkIF9fY25mbiBhc19pbnQxNihpbnQxNik7CitpbnQxNiBfX292bGQgX19jbmZuIGFzX2ludDE2KHVpbnQxNik7CitpbnQxNiBfX292bGQgX19jbmZuIGFzX2ludDE2KGxvbmc4KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gYXNfaW50MTYodWxvbmc4KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gYXNfaW50MTYoZmxvYXQxNik7CisKK3VpbnQgX19vdmxkIF9fY25mbiBhc191aW50KGNoYXIzKTsKK3VpbnQgX19vdmxkIF9fY25mbiBhc191aW50KGNoYXI0KTsKK3VpbnQgX19vdmxkIF9fY25mbiBhc191aW50KHVjaGFyMyk7Cit1aW50IF9fb3ZsZCBfX2NuZm4gYXNfdWludCh1Y2hhcjQpOwordWludCBfX292bGQgX19jbmZuIGFzX3VpbnQoc2hvcnQyKTsKK3VpbnQgX19vdmxkIF9fY25mbiBhc191aW50KHVzaG9ydDIpOwordWludCBfX292bGQgX19jbmZuIGFzX3VpbnQoaW50KTsKK3VpbnQgX19vdmxkIF9fY25mbiBhc191aW50KHVpbnQpOwordWludCBfX292bGQgX19jbmZuIGFzX3VpbnQoZmxvYXQpOworCit1aW50MiBfX292bGQgX19jbmZuIGFzX3VpbnQyKGNoYXI4KTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gYXNfdWludDIodWNoYXI4KTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gYXNfdWludDIoc2hvcnQzKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gYXNfdWludDIoc2hvcnQ0KTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gYXNfdWludDIodXNob3J0Myk7Cit1aW50MiBfX292bGQgX19jbmZuIGFzX3VpbnQyKHVzaG9ydDQpOwordWludDIgX19vdmxkIF9fY25mbiBhc191aW50MihpbnQyKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gYXNfdWludDIodWludDIpOwordWludDIgX19vdmxkIF9fY25mbiBhc191aW50Mihsb25nKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gYXNfdWludDIodWxvbmcpOwordWludDIgX19vdmxkIF9fY25mbiBhc191aW50MihmbG9hdDIpOworCit1aW50MyBfX292bGQgX19jbmZuIGFzX3VpbnQzKGNoYXIxNik7Cit1aW50MyBfX292bGQgX19jbmZuIGFzX3VpbnQzKHVjaGFyMTYpOwordWludDMgX19vdmxkIF9fY25mbiBhc191aW50MyhzaG9ydDgpOwordWludDMgX19vdmxkIF9fY25mbiBhc191aW50Myh1c2hvcnQ4KTsKK3VpbnQzIF9fb3ZsZCBfX2NuZm4gYXNfdWludDMoaW50Myk7Cit1aW50MyBfX292bGQgX19jbmZuIGFzX3VpbnQzKGludDQpOwordWludDMgX19vdmxkIF9fY25mbiBhc191aW50Myh1aW50Myk7Cit1aW50MyBfX292bGQgX19jbmZuIGFzX3VpbnQzKHVpbnQ0KTsKK3VpbnQzIF9fb3ZsZCBfX2NuZm4gYXNfdWludDMobG9uZzIpOwordWludDMgX19vdmxkIF9fY25mbiBhc191aW50Myh1bG9uZzIpOwordWludDMgX19vdmxkIF9fY25mbiBhc191aW50MyhmbG9hdDMpOwordWludDMgX19vdmxkIF9fY25mbiBhc191aW50MyhmbG9hdDQpOworCit1aW50NCBfX292bGQgX19jbmZuIGFzX3VpbnQ0KGNoYXIxNik7Cit1aW50NCBfX292bGQgX19jbmZuIGFzX3VpbnQ0KHVjaGFyMTYpOwordWludDQgX19vdmxkIF9fY25mbiBhc191aW50NChzaG9ydDgpOwordWludDQgX19vdmxkIF9fY25mbiBhc191aW50NCh1c2hvcnQ4KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gYXNfdWludDQoaW50Myk7Cit1aW50NCBfX292bGQgX19jbmZuIGFzX3VpbnQ0KGludDQpOwordWludDQgX19vdmxkIF9fY25mbiBhc191aW50NCh1aW50Myk7Cit1aW50NCBfX292bGQgX19jbmZuIGFzX3VpbnQ0KHVpbnQ0KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gYXNfdWludDQobG9uZzIpOwordWludDQgX19vdmxkIF9fY25mbiBhc191aW50NCh1bG9uZzIpOwordWludDQgX19vdmxkIF9fY25mbiBhc191aW50NChmbG9hdDMpOwordWludDQgX19vdmxkIF9fY25mbiBhc191aW50NChmbG9hdDQpOworCit1aW50OCBfX292bGQgX19jbmZuIGFzX3VpbnQ4KHNob3J0MTYpOwordWludDggX19vdmxkIF9fY25mbiBhc191aW50OCh1c2hvcnQxNik7Cit1aW50OCBfX292bGQgX19jbmZuIGFzX3VpbnQ4KGludDgpOwordWludDggX19vdmxkIF9fY25mbiBhc191aW50OCh1aW50OCk7Cit1aW50OCBfX292bGQgX19jbmZuIGFzX3VpbnQ4KGxvbmczKTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gYXNfdWludDgobG9uZzQpOwordWludDggX19vdmxkIF9fY25mbiBhc191aW50OCh1bG9uZzMpOwordWludDggX19vdmxkIF9fY25mbiBhc191aW50OCh1bG9uZzQpOwordWludDggX19vdmxkIF9fY25mbiBhc191aW50OChmbG9hdDgpOworCit1aW50MTYgX19vdmxkIF9fY25mbiBhc191aW50MTYoaW50MTYpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gYXNfdWludDE2KHVpbnQxNik7Cit1aW50MTYgX19vdmxkIF9fY25mbiBhc191aW50MTYobG9uZzgpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gYXNfdWludDE2KHVsb25nOCk7Cit1aW50MTYgX19vdmxkIF9fY25mbiBhc191aW50MTYoZmxvYXQxNik7CisKK2xvbmcgX19vdmxkIF9fY25mbiBhc19sb25nKGNoYXI4KTsKK2xvbmcgX19vdmxkIF9fY25mbiBhc19sb25nKHVjaGFyOCk7Citsb25nIF9fb3ZsZCBfX2NuZm4gYXNfbG9uZyhzaG9ydDMpOworbG9uZyBfX292bGQgX19jbmZuIGFzX2xvbmcoc2hvcnQ0KTsKK2xvbmcgX19vdmxkIF9fY25mbiBhc19sb25nKHVzaG9ydDMpOworbG9uZyBfX292bGQgX19jbmZuIGFzX2xvbmcodXNob3J0NCk7Citsb25nIF9fb3ZsZCBfX2NuZm4gYXNfbG9uZyhpbnQyKTsKK2xvbmcgX19vdmxkIF9fY25mbiBhc19sb25nKHVpbnQyKTsKK2xvbmcgX19vdmxkIF9fY25mbiBhc19sb25nKGxvbmcpOworbG9uZyBfX292bGQgX19jbmZuIGFzX2xvbmcodWxvbmcpOworbG9uZyBfX292bGQgX19jbmZuIGFzX2xvbmcoZmxvYXQyKTsKKworbG9uZzIgX19vdmxkIF9fY25mbiBhc19sb25nMihjaGFyMTYpOworbG9uZzIgX19vdmxkIF9fY25mbiBhc19sb25nMih1Y2hhcjE2KTsKK2xvbmcyIF9fb3ZsZCBfX2NuZm4gYXNfbG9uZzIoc2hvcnQ4KTsKK2xvbmcyIF9fb3ZsZCBfX2NuZm4gYXNfbG9uZzIodXNob3J0OCk7Citsb25nMiBfX292bGQgX19jbmZuIGFzX2xvbmcyKGludDMpOworbG9uZzIgX19vdmxkIF9fY25mbiBhc19sb25nMihpbnQ0KTsKK2xvbmcyIF9fb3ZsZCBfX2NuZm4gYXNfbG9uZzIodWludDMpOworbG9uZzIgX19vdmxkIF9fY25mbiBhc19sb25nMih1aW50NCk7Citsb25nMiBfX292bGQgX19jbmZuIGFzX2xvbmcyKGxvbmcyKTsKK2xvbmcyIF9fb3ZsZCBfX2NuZm4gYXNfbG9uZzIodWxvbmcyKTsKK2xvbmcyIF9fb3ZsZCBfX2NuZm4gYXNfbG9uZzIoZmxvYXQzKTsKK2xvbmcyIF9fb3ZsZCBfX2NuZm4gYXNfbG9uZzIoZmxvYXQ0KTsKKworbG9uZzMgX19vdmxkIF9fY25mbiBhc19sb25nMyhzaG9ydDE2KTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gYXNfbG9uZzModXNob3J0MTYpOworbG9uZzMgX19vdmxkIF9fY25mbiBhc19sb25nMyhpbnQ4KTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gYXNfbG9uZzModWludDgpOworbG9uZzMgX19vdmxkIF9fY25mbiBhc19sb25nMyhsb25nMyk7Citsb25nMyBfX292bGQgX19jbmZuIGFzX2xvbmczKGxvbmc0KTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gYXNfbG9uZzModWxvbmczKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gYXNfbG9uZzModWxvbmc0KTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gYXNfbG9uZzMoZmxvYXQ4KTsKKworbG9uZzQgX19vdmxkIF9fY25mbiBhc19sb25nNChzaG9ydDE2KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gYXNfbG9uZzQodXNob3J0MTYpOworbG9uZzQgX19vdmxkIF9fY25mbiBhc19sb25nNChpbnQ4KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gYXNfbG9uZzQodWludDgpOworbG9uZzQgX19vdmxkIF9fY25mbiBhc19sb25nNChsb25nMyk7Citsb25nNCBfX292bGQgX19jbmZuIGFzX2xvbmc0KGxvbmc0KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gYXNfbG9uZzQodWxvbmczKTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gYXNfbG9uZzQodWxvbmc0KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gYXNfbG9uZzQoZmxvYXQ4KTsKKworbG9uZzggX19vdmxkIF9fY25mbiBhc19sb25nOChpbnQxNik7Citsb25nOCBfX292bGQgX19jbmZuIGFzX2xvbmc4KHVpbnQxNik7Citsb25nOCBfX292bGQgX19jbmZuIGFzX2xvbmc4KGxvbmc4KTsKK2xvbmc4IF9fb3ZsZCBfX2NuZm4gYXNfbG9uZzgodWxvbmc4KTsKK2xvbmc4IF9fb3ZsZCBfX2NuZm4gYXNfbG9uZzgoZmxvYXQxNik7CisKK2xvbmcxNiBfX292bGQgX19jbmZuIGFzX2xvbmcxNihsb25nMTYpOworbG9uZzE2IF9fb3ZsZCBfX2NuZm4gYXNfbG9uZzE2KHVsb25nMTYpOworCit1bG9uZyBfX292bGQgX19jbmZuIGFzX3Vsb25nKGNoYXI4KTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gYXNfdWxvbmcodWNoYXI4KTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gYXNfdWxvbmcoc2hvcnQzKTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gYXNfdWxvbmcoc2hvcnQ0KTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gYXNfdWxvbmcodXNob3J0Myk7Cit1bG9uZyBfX292bGQgX19jbmZuIGFzX3Vsb25nKHVzaG9ydDQpOwordWxvbmcgX19vdmxkIF9fY25mbiBhc191bG9uZyhpbnQyKTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gYXNfdWxvbmcodWludDIpOwordWxvbmcgX19vdmxkIF9fY25mbiBhc191bG9uZyhsb25nKTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gYXNfdWxvbmcodWxvbmcpOwordWxvbmcgX19vdmxkIF9fY25mbiBhc191bG9uZyhmbG9hdDIpOworCit1bG9uZzIgX19vdmxkIF9fY25mbiBhc191bG9uZzIoY2hhcjE2KTsKK3Vsb25nMiBfX292bGQgX19jbmZuIGFzX3Vsb25nMih1Y2hhcjE2KTsKK3Vsb25nMiBfX292bGQgX19jbmZuIGFzX3Vsb25nMihzaG9ydDgpOwordWxvbmcyIF9fb3ZsZCBfX2NuZm4gYXNfdWxvbmcyKHVzaG9ydDgpOwordWxvbmcyIF9fb3ZsZCBfX2NuZm4gYXNfdWxvbmcyKGludDMpOwordWxvbmcyIF9fb3ZsZCBfX2NuZm4gYXNfdWxvbmcyKGludDQpOwordWxvbmcyIF9fb3ZsZCBfX2NuZm4gYXNfdWxvbmcyKHVpbnQzKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIGFzX3Vsb25nMih1aW50NCk7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBhc191bG9uZzIobG9uZzIpOwordWxvbmcyIF9fb3ZsZCBfX2NuZm4gYXNfdWxvbmcyKHVsb25nMik7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBhc191bG9uZzIoZmxvYXQzKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIGFzX3Vsb25nMihmbG9hdDQpOworCit1bG9uZzMgX19vdmxkIF9fY25mbiBhc191bG9uZzMoc2hvcnQxNik7Cit1bG9uZzMgX19vdmxkIF9fY25mbiBhc191bG9uZzModXNob3J0MTYpOwordWxvbmczIF9fb3ZsZCBfX2NuZm4gYXNfdWxvbmczKGludDgpOwordWxvbmczIF9fb3ZsZCBfX2NuZm4gYXNfdWxvbmczKHVpbnQ4KTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGFzX3Vsb25nMyhsb25nMyk7Cit1bG9uZzMgX19vdmxkIF9fY25mbiBhc191bG9uZzMobG9uZzQpOwordWxvbmczIF9fb3ZsZCBfX2NuZm4gYXNfdWxvbmczKHVsb25nMyk7Cit1bG9uZzMgX19vdmxkIF9fY25mbiBhc191bG9uZzModWxvbmc0KTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGFzX3Vsb25nMyhmbG9hdDgpOworCit1bG9uZzQgX19vdmxkIF9fY25mbiBhc191bG9uZzQoc2hvcnQxNik7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBhc191bG9uZzQodXNob3J0MTYpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gYXNfdWxvbmc0KGludDgpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gYXNfdWxvbmc0KHVpbnQ4KTsKK3Vsb25nNCBfX292bGQgX19jbmZuIGFzX3Vsb25nNChsb25nMyk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBhc191bG9uZzQobG9uZzQpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gYXNfdWxvbmc0KHVsb25nMyk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBhc191bG9uZzQodWxvbmc0KTsKK3Vsb25nNCBfX292bGQgX19jbmZuIGFzX3Vsb25nNChmbG9hdDgpOworCit1bG9uZzggX19vdmxkIF9fY25mbiBhc191bG9uZzgoaW50MTYpOwordWxvbmc4IF9fb3ZsZCBfX2NuZm4gYXNfdWxvbmc4KHVpbnQxNik7Cit1bG9uZzggX19vdmxkIF9fY25mbiBhc191bG9uZzgobG9uZzgpOwordWxvbmc4IF9fb3ZsZCBfX2NuZm4gYXNfdWxvbmc4KHVsb25nOCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBhc191bG9uZzgoZmxvYXQxNik7CisKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBhc191bG9uZzE2KGxvbmcxNik7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gYXNfdWxvbmcxNih1bG9uZzE2KTsKKworZmxvYXQgX19vdmxkIF9fY25mbiBhc19mbG9hdChjaGFyMyk7CitmbG9hdCBfX292bGQgX19jbmZuIGFzX2Zsb2F0KGNoYXI0KTsKK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gYXNfZmxvYXQodWNoYXIzKTsKK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gYXNfZmxvYXQodWNoYXI0KTsKK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gYXNfZmxvYXQoc2hvcnQyKTsKK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gYXNfZmxvYXQodXNob3J0Mik7CitmbG9hdCBfX292bGQgX19jbmZuIGFzX2Zsb2F0KGludCk7CitmbG9hdCBfX292bGQgX19jbmZuIGFzX2Zsb2F0KHVpbnQpOworZmxvYXQgX19vdmxkIF9fY25mbiBhc19mbG9hdChmbG9hdCk7CisKK2Zsb2F0MiBfX292bGQgX19jbmZuIGFzX2Zsb2F0MihjaGFyOCk7CitmbG9hdDIgX19vdmxkIF9fY25mbiBhc19mbG9hdDIodWNoYXI4KTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIGFzX2Zsb2F0MihzaG9ydDMpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gYXNfZmxvYXQyKHNob3J0NCk7CitmbG9hdDIgX19vdmxkIF9fY25mbiBhc19mbG9hdDIodXNob3J0Myk7CitmbG9hdDIgX19vdmxkIF9fY25mbiBhc19mbG9hdDIodXNob3J0NCk7CitmbG9hdDIgX19vdmxkIF9fY25mbiBhc19mbG9hdDIoaW50Mik7CitmbG9hdDIgX19vdmxkIF9fY25mbiBhc19mbG9hdDIodWludDIpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gYXNfZmxvYXQyKGxvbmcpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gYXNfZmxvYXQyKHVsb25nKTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIGFzX2Zsb2F0MihmbG9hdDIpOworCitmbG9hdDMgX19vdmxkIF9fY25mbiBhc19mbG9hdDMoY2hhcjE2KTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGFzX2Zsb2F0Myh1Y2hhcjE2KTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGFzX2Zsb2F0MyhzaG9ydDgpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gYXNfZmxvYXQzKHVzaG9ydDgpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gYXNfZmxvYXQzKGludDMpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gYXNfZmxvYXQzKGludDQpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gYXNfZmxvYXQzKHVpbnQzKTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGFzX2Zsb2F0Myh1aW50NCk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBhc19mbG9hdDMobG9uZzIpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gYXNfZmxvYXQzKHVsb25nMik7CitmbG9hdDMgX19vdmxkIF9fY25mbiBhc19mbG9hdDMoZmxvYXQzKTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGFzX2Zsb2F0MyhmbG9hdDQpOworCitmbG9hdDQgX19vdmxkIF9fY25mbiBhc19mbG9hdDQoY2hhcjE2KTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIGFzX2Zsb2F0NCh1Y2hhcjE2KTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIGFzX2Zsb2F0NChzaG9ydDgpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gYXNfZmxvYXQ0KHVzaG9ydDgpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gYXNfZmxvYXQ0KGludDMpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gYXNfZmxvYXQ0KGludDQpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gYXNfZmxvYXQ0KHVpbnQzKTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIGFzX2Zsb2F0NCh1aW50NCk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBhc19mbG9hdDQobG9uZzIpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gYXNfZmxvYXQ0KHVsb25nMik7CitmbG9hdDQgX19vdmxkIF9fY25mbiBhc19mbG9hdDQoZmxvYXQzKTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIGFzX2Zsb2F0NChmbG9hdDQpOworCitmbG9hdDggX19vdmxkIF9fY25mbiBhc19mbG9hdDgoc2hvcnQxNik7CitmbG9hdDggX19vdmxkIF9fY25mbiBhc19mbG9hdDgodXNob3J0MTYpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gYXNfZmxvYXQ4KGludDgpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gYXNfZmxvYXQ4KHVpbnQ4KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIGFzX2Zsb2F0OChsb25nMyk7CitmbG9hdDggX19vdmxkIF9fY25mbiBhc19mbG9hdDgobG9uZzQpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gYXNfZmxvYXQ4KHVsb25nMyk7CitmbG9hdDggX19vdmxkIF9fY25mbiBhc19mbG9hdDgodWxvbmc0KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIGFzX2Zsb2F0OChmbG9hdDgpOworCitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gYXNfZmxvYXQxNihpbnQxNik7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gYXNfZmxvYXQxNih1aW50MTYpOworZmxvYXQxNiBfX292bGQgX19jbmZuIGFzX2Zsb2F0MTYobG9uZzgpOworZmxvYXQxNiBfX292bGQgX19jbmZuIGFzX2Zsb2F0MTYodWxvbmc4KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBhc19mbG9hdDE2KGZsb2F0MTYpOworCisjaWZkZWYgY2xfa2hyX2ZwNjQKK2NoYXI4IF9fb3ZsZCBfX2NuZm4gYXNfY2hhcjgoZG91YmxlKTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGFzX2NoYXIxNihkb3VibGUyKTsKK3VjaGFyOCBfX292bGQgX19jbmZuIGFzX3VjaGFyOChkb3VibGUpOwordWNoYXIxNiBfX292bGQgX19jbmZuIGFzX3VjaGFyMTYoZG91YmxlMik7CitzaG9ydDMgX19vdmxkIF9fY25mbiBhc19zaG9ydDMoZG91YmxlKTsKK3Nob3J0NCBfX292bGQgX19jbmZuIGFzX3Nob3J0NChkb3VibGUpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gYXNfc2hvcnQ4KGRvdWJsZTIpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGFzX3Nob3J0MTYoZG91YmxlMyk7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gYXNfc2hvcnQxNihkb3VibGU0KTsKK3VzaG9ydDMgX19vdmxkIF9fY25mbiBhc191c2hvcnQzKGRvdWJsZSk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gYXNfdXNob3J0NChkb3VibGUpOwordXNob3J0OCBfX292bGQgX19jbmZuIGFzX3VzaG9ydDgoZG91YmxlMik7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIGFzX3VzaG9ydDE2KGRvdWJsZTMpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBhc191c2hvcnQxNihkb3VibGU0KTsKK2ludDIgX19vdmxkIF9fY25mbiBhc19pbnQyKGRvdWJsZSk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gYXNfaW50Myhkb3VibGUyKTsKK2ludDQgX19vdmxkIF9fY25mbiBhc19pbnQ0KGRvdWJsZTIpOworaW50OCBfX292bGQgX19jbmZuIGFzX2ludDgoZG91YmxlMyk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gYXNfaW50OChkb3VibGU0KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gYXNfaW50MTYoZG91YmxlOCk7Cit1aW50MiBfX292bGQgX19jbmZuIGFzX3VpbnQyKGRvdWJsZSk7Cit1aW50MyBfX292bGQgX19jbmZuIGFzX3VpbnQzKGRvdWJsZTIpOwordWludDQgX19vdmxkIF9fY25mbiBhc191aW50NChkb3VibGUyKTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gYXNfdWludDgoZG91YmxlMyk7Cit1aW50OCBfX292bGQgX19jbmZuIGFzX3VpbnQ4KGRvdWJsZTQpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gYXNfdWludDE2KGRvdWJsZTgpOworbG9uZyBfX292bGQgX19jbmZuIGFzX2xvbmcoZG91YmxlKTsKK2xvbmcyIF9fb3ZsZCBfX2NuZm4gYXNfbG9uZzIoZG91YmxlMik7Citsb25nMyBfX292bGQgX19jbmZuIGFzX2xvbmczKGRvdWJsZTMpOworbG9uZzMgX19vdmxkIF9fY25mbiBhc19sb25nMyhkb3VibGU0KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gYXNfbG9uZzQoZG91YmxlMyk7Citsb25nNCBfX292bGQgX19jbmZuIGFzX2xvbmc0KGRvdWJsZTQpOworbG9uZzggX19vdmxkIF9fY25mbiBhc19sb25nOChkb3VibGU4KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGFzX2xvbmcxNihkb3VibGUxNik7Cit1bG9uZyBfX292bGQgX19jbmZuIGFzX3Vsb25nKGRvdWJsZSk7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBhc191bG9uZzIoZG91YmxlMik7Cit1bG9uZzMgX19vdmxkIF9fY25mbiBhc191bG9uZzMoZG91YmxlMyk7Cit1bG9uZzMgX19vdmxkIF9fY25mbiBhc191bG9uZzMoZG91YmxlNCk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBhc191bG9uZzQoZG91YmxlMyk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBhc191bG9uZzQoZG91YmxlNCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBhc191bG9uZzgoZG91YmxlOCk7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gYXNfdWxvbmcxNihkb3VibGUxNik7CitmbG9hdDIgX19vdmxkIF9fY25mbiBhc19mbG9hdDIoZG91YmxlKTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGFzX2Zsb2F0Myhkb3VibGUyKTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIGFzX2Zsb2F0NChkb3VibGUyKTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIGFzX2Zsb2F0OChkb3VibGUzKTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIGFzX2Zsb2F0OChkb3VibGU0KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBhc19mbG9hdDE2KGRvdWJsZTgpOworZG91YmxlIF9fb3ZsZCBfX2NuZm4gYXNfZG91YmxlKGNoYXI4KTsKK2RvdWJsZSBfX292bGQgX19jbmZuIGFzX2RvdWJsZSh1Y2hhcjgpOworZG91YmxlIF9fb3ZsZCBfX2NuZm4gYXNfZG91YmxlKHNob3J0Myk7Citkb3VibGUgX19vdmxkIF9fY25mbiBhc19kb3VibGUoc2hvcnQ0KTsKK2RvdWJsZSBfX292bGQgX19jbmZuIGFzX2RvdWJsZSh1c2hvcnQzKTsKK2RvdWJsZSBfX292bGQgX19jbmZuIGFzX2RvdWJsZSh1c2hvcnQ0KTsKK2RvdWJsZSBfX292bGQgX19jbmZuIGFzX2RvdWJsZShpbnQyKTsKK2RvdWJsZSBfX292bGQgX19jbmZuIGFzX2RvdWJsZSh1aW50Mik7Citkb3VibGUgX19vdmxkIF9fY25mbiBhc19kb3VibGUobG9uZyk7Citkb3VibGUgX19vdmxkIF9fY25mbiBhc19kb3VibGUodWxvbmcpOworZG91YmxlIF9fb3ZsZCBfX2NuZm4gYXNfZG91YmxlKGZsb2F0Mik7Citkb3VibGUgX19vdmxkIF9fY25mbiBhc19kb3VibGUoZG91YmxlKTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBhc19kb3VibGUyKGNoYXIxNik7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gYXNfZG91YmxlMih1Y2hhcjE2KTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBhc19kb3VibGUyKHNob3J0OCk7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gYXNfZG91YmxlMih1c2hvcnQ4KTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBhc19kb3VibGUyKGludDMpOworZG91YmxlMiBfX292bGQgX19jbmZuIGFzX2RvdWJsZTIoaW50NCk7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gYXNfZG91YmxlMih1aW50Myk7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gYXNfZG91YmxlMih1aW50NCk7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gYXNfZG91YmxlMihsb25nMik7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gYXNfZG91YmxlMih1bG9uZzIpOworZG91YmxlMiBfX292bGQgX19jbmZuIGFzX2RvdWJsZTIoZmxvYXQzKTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBhc19kb3VibGUyKGZsb2F0NCk7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gYXNfZG91YmxlMihkb3VibGUyKTsKK2RvdWJsZTMgX19vdmxkIF9fY25mbiBhc19kb3VibGUzKHNob3J0MTYpOworZG91YmxlMyBfX292bGQgX19jbmZuIGFzX2RvdWJsZTModXNob3J0MTYpOworZG91YmxlMyBfX292bGQgX19jbmZuIGFzX2RvdWJsZTMoaW50OCk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gYXNfZG91YmxlMyh1aW50OCk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gYXNfZG91YmxlMyhsb25nMyk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gYXNfZG91YmxlMyhsb25nNCk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gYXNfZG91YmxlMyh1bG9uZzMpOworZG91YmxlMyBfX292bGQgX19jbmZuIGFzX2RvdWJsZTModWxvbmc0KTsKK2RvdWJsZTMgX19vdmxkIF9fY25mbiBhc19kb3VibGUzKGZsb2F0OCk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gYXNfZG91YmxlMyhkb3VibGUzKTsKK2RvdWJsZTMgX19vdmxkIF9fY25mbiBhc19kb3VibGUzKGRvdWJsZTQpOworZG91YmxlNCBfX292bGQgX19jbmZuIGFzX2RvdWJsZTQoc2hvcnQxNik7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gYXNfZG91YmxlNCh1c2hvcnQxNik7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gYXNfZG91YmxlNChpbnQ4KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBhc19kb3VibGU0KHVpbnQ4KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBhc19kb3VibGU0KGxvbmczKTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBhc19kb3VibGU0KGxvbmc0KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBhc19kb3VibGU0KHVsb25nMyk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gYXNfZG91YmxlNCh1bG9uZzQpOworZG91YmxlNCBfX292bGQgX19jbmZuIGFzX2RvdWJsZTQoZmxvYXQ4KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBhc19kb3VibGU0KGRvdWJsZTMpOworZG91YmxlNCBfX292bGQgX19jbmZuIGFzX2RvdWJsZTQoZG91YmxlNCk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gYXNfZG91YmxlOChpbnQxNik7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gYXNfZG91YmxlOCh1aW50MTYpOworZG91YmxlOCBfX292bGQgX19jbmZuIGFzX2RvdWJsZTgobG9uZzgpOworZG91YmxlOCBfX292bGQgX19jbmZuIGFzX2RvdWJsZTgodWxvbmc4KTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBhc19kb3VibGU4KGZsb2F0MTYpOworZG91YmxlOCBfX292bGQgX19jbmZuIGFzX2RvdWJsZTgoZG91YmxlOCk7Citkb3VibGUxNiBfX292bGQgX19jbmZuIGFzX2RvdWJsZTE2KGxvbmcxNik7Citkb3VibGUxNiBfX292bGQgX19jbmZuIGFzX2RvdWJsZTE2KHVsb25nMTYpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBhc19kb3VibGUxNihkb3VibGUxNik7CisjZW5kaWYgLy9jbF9raHJfZnA2NAorCisjaWZkZWYgY2xfa2hyX2ZwMTYKK2NoYXIyIF9fb3ZsZCBfX2NuZm4gYXNfY2hhcjIoaGFsZik7CitjaGFyMyBfX292bGQgX19jbmZuIGFzX2NoYXIzKGhhbGYyKTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gYXNfY2hhcjQoaGFsZjIpOworY2hhcjggX19vdmxkIF9fY25mbiBhc19jaGFyOChoYWxmMyk7CitjaGFyOCBfX292bGQgX19jbmZuIGFzX2NoYXI4KGhhbGY0KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGFzX2NoYXIxNihoYWxmOCk7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBhc191Y2hhcjIoaGFsZik7Cit1Y2hhcjMgX19vdmxkIF9fY25mbiBhc191Y2hhcjMoaGFsZjIpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gYXNfdWNoYXI0KGhhbGYyKTsKK3VjaGFyOCBfX292bGQgX19jbmZuIGFzX3VjaGFyOChoYWxmMyk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBhc191Y2hhcjgoaGFsZjQpOwordWNoYXIxNiBfX292bGQgX19jbmZuIGFzX3VjaGFyMTYoaGFsZjgpOworc2hvcnQgX19vdmxkIF9fY25mbiBhc19zaG9ydChoYWxmKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGFzX3Nob3J0MihoYWxmMik7CitzaG9ydDMgX19vdmxkIF9fY25mbiBhc19zaG9ydDMoaGFsZjMpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gYXNfc2hvcnQzKGhhbGY0KTsKK3Nob3J0NCBfX292bGQgX19jbmZuIGFzX3Nob3J0NChoYWxmMyk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBhc19zaG9ydDQoaGFsZjQpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gYXNfc2hvcnQ4KGhhbGY4KTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBhc19zaG9ydDE2KGhhbGYxNik7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBhc191c2hvcnQoaGFsZik7Cit1c2hvcnQyIF9fb3ZsZCBfX2NuZm4gYXNfdXNob3J0MihoYWxmMik7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gYXNfdXNob3J0MyhoYWxmMyk7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gYXNfdXNob3J0MyhoYWxmNCk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gYXNfdXNob3J0NChoYWxmMyk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gYXNfdXNob3J0NChoYWxmNCk7Cit1c2hvcnQ4IF9fb3ZsZCBfX2NuZm4gYXNfdXNob3J0OChoYWxmOCk7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIGFzX3VzaG9ydDE2KGhhbGYxNik7CitpbnQgX19vdmxkIF9fY25mbiBhc19pbnQoaGFsZjIpOworaW50MiBfX292bGQgX19jbmZuIGFzX2ludDIoaGFsZjMpOworaW50MiBfX292bGQgX19jbmZuIGFzX2ludDIoaGFsZjQpOworaW50MyBfX292bGQgX19jbmZuIGFzX2ludDMoaGFsZjgpOworaW50NCBfX292bGQgX19jbmZuIGFzX2ludDQoaGFsZjgpOworaW50OCBfX292bGQgX19jbmZuIGFzX2ludDgoaGFsZjE2KTsKK3VpbnQgX19vdmxkIF9fY25mbiBhc191aW50KGhhbGYyKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gYXNfdWludDIoaGFsZjMpOwordWludDIgX19vdmxkIF9fY25mbiBhc191aW50MihoYWxmNCk7Cit1aW50MyBfX292bGQgX19jbmZuIGFzX3VpbnQzKGhhbGY4KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gYXNfdWludDQoaGFsZjgpOwordWludDggX19vdmxkIF9fY25mbiBhc191aW50OChoYWxmMTYpOworbG9uZyBfX292bGQgX19jbmZuIGFzX2xvbmcoaGFsZjMpOworbG9uZyBfX292bGQgX19jbmZuIGFzX2xvbmcoaGFsZjQpOworbG9uZzIgX19vdmxkIF9fY25mbiBhc19sb25nMihoYWxmOCk7Citsb25nMyBfX292bGQgX19jbmZuIGFzX2xvbmczKGhhbGYxNik7Citsb25nNCBfX292bGQgX19jbmZuIGFzX2xvbmc0KGhhbGYxNik7Cit1bG9uZyBfX292bGQgX19jbmZuIGFzX3Vsb25nKGhhbGYzKTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gYXNfdWxvbmcoaGFsZjQpOwordWxvbmcyIF9fb3ZsZCBfX2NuZm4gYXNfdWxvbmcyKGhhbGY4KTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGFzX3Vsb25nMyhoYWxmMTYpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gYXNfdWxvbmc0KGhhbGYxNik7CitoYWxmIF9fb3ZsZCBfX2NuZm4gYXNfaGFsZihjaGFyMik7CitoYWxmIF9fb3ZsZCBfX2NuZm4gYXNfaGFsZih1Y2hhcjIpOworaGFsZiBfX292bGQgX19jbmZuIGFzX2hhbGYoc2hvcnQpOworaGFsZiBfX292bGQgX19jbmZuIGFzX2hhbGYodXNob3J0KTsKK2hhbGYgX19vdmxkIF9fY25mbiBhc19oYWxmKGhhbGYpOworaGFsZjIgX19vdmxkIF9fY25mbiBhc19oYWxmMihjaGFyMyk7CitoYWxmMiBfX292bGQgX19jbmZuIGFzX2hhbGYyKGNoYXI0KTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gYXNfaGFsZjIodWNoYXIzKTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gYXNfaGFsZjIodWNoYXI0KTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gYXNfaGFsZjIoc2hvcnQyKTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gYXNfaGFsZjIodXNob3J0Mik7CitoYWxmMiBfX292bGQgX19jbmZuIGFzX2hhbGYyKGludCk7CitoYWxmMiBfX292bGQgX19jbmZuIGFzX2hhbGYyKHVpbnQpOworaGFsZjIgX19vdmxkIF9fY25mbiBhc19oYWxmMihoYWxmMik7CitoYWxmMiBfX292bGQgX19jbmZuIGFzX2hhbGYyKGZsb2F0KTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gYXNfaGFsZjMoY2hhcjgpOworaGFsZjMgX19vdmxkIF9fY25mbiBhc19oYWxmMyh1Y2hhcjgpOworaGFsZjMgX19vdmxkIF9fY25mbiBhc19oYWxmMyhzaG9ydDMpOworaGFsZjMgX19vdmxkIF9fY25mbiBhc19oYWxmMyhzaG9ydDQpOworaGFsZjMgX19vdmxkIF9fY25mbiBhc19oYWxmMyh1c2hvcnQzKTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gYXNfaGFsZjModXNob3J0NCk7CitoYWxmMyBfX292bGQgX19jbmZuIGFzX2hhbGYzKGludDIpOworaGFsZjMgX19vdmxkIF9fY25mbiBhc19oYWxmMyh1aW50Mik7CitoYWxmMyBfX292bGQgX19jbmZuIGFzX2hhbGYzKGxvbmcpOworaGFsZjMgX19vdmxkIF9fY25mbiBhc19oYWxmMyh1bG9uZyk7CitoYWxmMyBfX292bGQgX19jbmZuIGFzX2hhbGYzKGhhbGYzKTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gYXNfaGFsZjMoaGFsZjQpOworaGFsZjMgX19vdmxkIF9fY25mbiBhc19oYWxmMyhmbG9hdDIpOworaGFsZjQgX19vdmxkIF9fY25mbiBhc19oYWxmNChjaGFyOCk7CitoYWxmNCBfX292bGQgX19jbmZuIGFzX2hhbGY0KHVjaGFyOCk7CitoYWxmNCBfX292bGQgX19jbmZuIGFzX2hhbGY0KHNob3J0Myk7CitoYWxmNCBfX292bGQgX19jbmZuIGFzX2hhbGY0KHNob3J0NCk7CitoYWxmNCBfX292bGQgX19jbmZuIGFzX2hhbGY0KHVzaG9ydDMpOworaGFsZjQgX19vdmxkIF9fY25mbiBhc19oYWxmNCh1c2hvcnQ0KTsKK2hhbGY0IF9fb3ZsZCBfX2NuZm4gYXNfaGFsZjQoaW50Mik7CitoYWxmNCBfX292bGQgX19jbmZuIGFzX2hhbGY0KHVpbnQyKTsKK2hhbGY0IF9fb3ZsZCBfX2NuZm4gYXNfaGFsZjQobG9uZyk7CitoYWxmNCBfX292bGQgX19jbmZuIGFzX2hhbGY0KHVsb25nKTsKK2hhbGY0IF9fb3ZsZCBfX2NuZm4gYXNfaGFsZjQoaGFsZjMpOworaGFsZjQgX19vdmxkIF9fY25mbiBhc19oYWxmNChoYWxmNCk7CitoYWxmNCBfX292bGQgX19jbmZuIGFzX2hhbGY0KGZsb2F0Mik7CitoYWxmOCBfX292bGQgX19jbmZuIGFzX2hhbGY4KGNoYXIxNik7CitoYWxmOCBfX292bGQgX19jbmZuIGFzX2hhbGY4KHVjaGFyMTYpOworaGFsZjggX19vdmxkIF9fY25mbiBhc19oYWxmOChzaG9ydDgpOworaGFsZjggX19vdmxkIF9fY25mbiBhc19oYWxmOCh1c2hvcnQ4KTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gYXNfaGFsZjgoaW50Myk7CitoYWxmOCBfX292bGQgX19jbmZuIGFzX2hhbGY4KGludDQpOworaGFsZjggX19vdmxkIF9fY25mbiBhc19oYWxmOCh1aW50Myk7CitoYWxmOCBfX292bGQgX19jbmZuIGFzX2hhbGY4KHVpbnQ0KTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gYXNfaGFsZjgobG9uZzIpOworaGFsZjggX19vdmxkIF9fY25mbiBhc19oYWxmOCh1bG9uZzIpOworaGFsZjggX19vdmxkIF9fY25mbiBhc19oYWxmOChoYWxmOCk7CitoYWxmOCBfX292bGQgX19jbmZuIGFzX2hhbGY4KGZsb2F0Myk7CitoYWxmOCBfX292bGQgX19jbmZuIGFzX2hhbGY4KGZsb2F0NCk7CitoYWxmMTYgX19vdmxkIF9fY25mbiBhc19oYWxmMTYoc2hvcnQxNik7CitoYWxmMTYgX19vdmxkIF9fY25mbiBhc19oYWxmMTYodXNob3J0MTYpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gYXNfaGFsZjE2KGludDgpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gYXNfaGFsZjE2KHVpbnQ4KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIGFzX2hhbGYxNihsb25nMyk7CitoYWxmMTYgX19vdmxkIF9fY25mbiBhc19oYWxmMTYobG9uZzQpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gYXNfaGFsZjE2KHVsb25nMyk7CitoYWxmMTYgX19vdmxkIF9fY25mbiBhc19oYWxmMTYodWxvbmc0KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIGFzX2hhbGYxNihoYWxmMTYpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gYXNfaGFsZjE2KGZsb2F0OCk7CitmbG9hdCBfX292bGQgX19jbmZuIGFzX2Zsb2F0KGhhbGYyKTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIGFzX2Zsb2F0MihoYWxmMyk7CitmbG9hdDIgX19vdmxkIF9fY25mbiBhc19mbG9hdDIoaGFsZjQpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gYXNfZmxvYXQzKGhhbGY4KTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIGFzX2Zsb2F0NChoYWxmOCk7CitmbG9hdDggX19vdmxkIF9fY25mbiBhc19mbG9hdDgoaGFsZjE2KTsKKworI2lmZGVmIGNsX2tocl9mcDY0CitoYWxmMyBfX292bGQgX19jbmZuIGFzX2hhbGYzKGRvdWJsZSk7CitoYWxmNCBfX292bGQgX19jbmZuIGFzX2hhbGY0KGRvdWJsZSk7CitoYWxmOCBfX292bGQgX19jbmZuIGFzX2hhbGY4KGRvdWJsZTIpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gYXNfaGFsZjE2KGRvdWJsZTMpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gYXNfaGFsZjE2KGRvdWJsZTQpOworZG91YmxlIF9fb3ZsZCBfX2NuZm4gYXNfZG91YmxlKGhhbGYzKTsKK2RvdWJsZSBfX292bGQgX19jbmZuIGFzX2RvdWJsZShoYWxmNCk7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gYXNfZG91YmxlMihoYWxmOCk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gYXNfZG91YmxlMyhoYWxmMTYpOworZG91YmxlNCBfX292bGQgX19jbmZuIGFzX2RvdWJsZTQoaGFsZjE2KTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjZW5kaWYgLy9jbF9raHJfZnAxNgorCisvLyBPcGVuQ0wgdjEuMSBzNi45LCB2MS4yLzIuMCBzNi4xMCAtIEZ1bmN0aW9uIHF1YWxpZmllcnMKKworI2RlZmluZSBfX2tlcm5lbF9leGVjKFgsIHR5cGVuKSBfX2tlcm5lbCBcCisJX19hdHRyaWJ1dGVfXygod29ya19ncm91cF9zaXplX2hpbnQoWCwgMSwgMSkpKSBcCisJX19hdHRyaWJ1dGVfXygodmVjX3R5cGVfaGludCh0eXBlbikpKQorCisjZGVmaW5lIGtlcm5lbF9leGVjKFgsIHR5cGVuKSBfX2tlcm5lbCBcCisJX19hdHRyaWJ1dGVfXygod29ya19ncm91cF9zaXplX2hpbnQoWCwgMSwgMSkpKSBcCisJX19hdHRyaWJ1dGVfXygodmVjX3R5cGVfaGludCh0eXBlbikpKQorCisvLyBPcGVuQ0wgdjEuMSBzNi4xMS4xLCB2MS4yIHM2LjEyLjEsIHYyLjAgczYuMTMuMSAtIFdvcmstaXRlbSBGdW5jdGlvbnMKKworLyoqCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucyBpbiB1c2UuIFRoaXMgaXMgdGhlCisgKiB2YWx1ZSBnaXZlbiB0byB0aGUgd29ya19kaW0gYXJndW1lbnQgc3BlY2lmaWVkIGluCisgKiBjbEVucXVldWVORFJhbmdlS2VybmVsLgorICogRm9yIGNsRW5xdWV1ZVRhc2ssIHRoaXMgcmV0dXJucyAxLgorICovCit1aW50IF9fb3ZsZCBfX2NuZm4gZ2V0X3dvcmtfZGltKHZvaWQpOworCisvKioKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBnbG9iYWwgd29yay1pdGVtcyBzcGVjaWZpZWQgZm9yCisgKiBkaW1lbnNpb24gaWRlbnRpZmllZCBieSBkaW1pbmR4LiBUaGlzIHZhbHVlIGlzIGdpdmVuIGJ5CisgKiB0aGUgZ2xvYmFsX3dvcmtfc2l6ZSBhcmd1bWVudCB0bworICogY2xFbnF1ZXVlTkRSYW5nZUtlcm5lbC4gVmFsaWQgdmFsdWVzIG9mIGRpbWluZHgKKyAqIGFyZSAwIHRvIGdldF93b3JrX2RpbSgpIC0gMS4gRm9yIG90aGVyIHZhbHVlcyBvZgorICogZGltaW5keCwgZ2V0X2dsb2JhbF9zaXplKCkgcmV0dXJucyAxLgorICogRm9yIGNsRW5xdWV1ZVRhc2ssIHRoaXMgYWx3YXlzIHJldHVybnMgMS4KKyAqLworc2l6ZV90IF9fb3ZsZCBfX2NuZm4gZ2V0X2dsb2JhbF9zaXplKHVpbnQgZGltaW5keCk7CisKKy8qKgorICogUmV0dXJucyB0aGUgdW5pcXVlIGdsb2JhbCB3b3JrLWl0ZW0gSUQgdmFsdWUgZm9yCisgKiBkaW1lbnNpb24gaWRlbnRpZmllZCBieSBkaW1pbmR4LiBUaGUgZ2xvYmFsIHdvcmstaXRlbQorICogSUQgc3BlY2lmaWVzIHRoZSB3b3JrLWl0ZW0gSUQgYmFzZWQgb24gdGhlIG51bWJlciBvZgorICogZ2xvYmFsIHdvcmstaXRlbXMgc3BlY2lmaWVkIHRvIGV4ZWN1dGUgdGhlIGtlcm5lbC4gVmFsaWQKKyAqIHZhbHVlcyBvZiBkaW1pbmR4IGFyZSAwIHRvIGdldF93b3JrX2RpbSgpIC0gMS4gRm9yCisgKiBvdGhlciB2YWx1ZXMgb2YgZGltaW5keCwgZ2V0X2dsb2JhbF9pZCgpIHJldHVybnMgMC4KKyAqIEZvciBjbEVucXVldWVUYXNrLCB0aGlzIHJldHVybnMgMC4KKyAqLworc2l6ZV90IF9fb3ZsZCBfX2NuZm4gZ2V0X2dsb2JhbF9pZCh1aW50IGRpbWluZHgpOworCisvKioKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBsb2NhbCB3b3JrLWl0ZW1zIHNwZWNpZmllZCBpbgorICogZGltZW5zaW9uIGlkZW50aWZpZWQgYnkgZGltaW5keC4gVGhpcyB2YWx1ZSBpcyBnaXZlbiBieQorICogdGhlIGxvY2FsX3dvcmtfc2l6ZSBhcmd1bWVudCB0bworICogY2xFbnF1ZXVlTkRSYW5nZUtlcm5lbCBpZiBsb2NhbF93b3JrX3NpemUgaXMgbm90CisgKiBOVUxMOyBvdGhlcndpc2UgdGhlIE9wZW5DTCBpbXBsZW1lbnRhdGlvbiBjaG9vc2VzCisgKiBhbiBhcHByb3ByaWF0ZSBsb2NhbF93b3JrX3NpemUgdmFsdWUgd2hpY2ggaXMgcmV0dXJuZWQKKyAqIGJ5IHRoaXMgZnVuY3Rpb24uIFZhbGlkIHZhbHVlcyBvZiBkaW1pbmR4IGFyZSAwIHRvCisgKiBnZXRfd29ya19kaW0oKSAtIDEuIEZvciBvdGhlciB2YWx1ZXMgb2YgZGltaW5keCwKKyAqIGdldF9sb2NhbF9zaXplKCkgcmV0dXJucyAxLgorICogRm9yIGNsRW5xdWV1ZVRhc2ssIHRoaXMgYWx3YXlzIHJldHVybnMgMS4KKyAqLworc2l6ZV90IF9fb3ZsZCBfX2NuZm4gZ2V0X2xvY2FsX3NpemUodWludCBkaW1pbmR4KTsKKworLyoqCisgKiBSZXR1cm5zIHRoZSB1bmlxdWUgbG9jYWwgd29yay1pdGVtIElEIGkuZS4gYSB3b3JrLWl0ZW0KKyAqIHdpdGhpbiBhIHNwZWNpZmljIHdvcmstZ3JvdXAgZm9yIGRpbWVuc2lvbiBpZGVudGlmaWVkIGJ5CisgKiBkaW1pbmR4LiBWYWxpZCB2YWx1ZXMgb2YgZGltaW5keCBhcmUgMCB0bworICogZ2V0X3dvcmtfZGltKCkgLSAxLiBGb3Igb3RoZXIgdmFsdWVzIG9mIGRpbWluZHgsCisgKiBnZXRfbG9jYWxfaWQoKSByZXR1cm5zIDAuCisgKiBGb3IgY2xFbnF1ZXVlVGFzaywgdGhpcyByZXR1cm5zIDAuCisgKi8KK3NpemVfdCBfX292bGQgX19jbmZuIGdldF9sb2NhbF9pZCh1aW50IGRpbWluZHgpOworCisvKioKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiB3b3JrLWdyb3VwcyB0aGF0IHdpbGwgZXhlY3V0ZSBhCisgKiBrZXJuZWwgZm9yIGRpbWVuc2lvbiBpZGVudGlmaWVkIGJ5IGRpbWluZHguCisgKiBWYWxpZCB2YWx1ZXMgb2YgZGltaW5keCBhcmUgMCB0byBnZXRfd29ya19kaW0oKSAtIDEuCisgKiBGb3Igb3RoZXIgdmFsdWVzIG9mIGRpbWluZHgsIGdldF9udW1fZ3JvdXBzICgpIHJldHVybnMKKyAqIDEuCisgKiBGb3IgY2xFbnF1ZXVlVGFzaywgdGhpcyBhbHdheXMgcmV0dXJucyAxLgorICovCitzaXplX3QgX19vdmxkIF9fY25mbiBnZXRfbnVtX2dyb3Vwcyh1aW50IGRpbWluZHgpOworCisvKioKKyAqIGdldF9ncm91cF9pZCByZXR1cm5zIHRoZSB3b3JrLWdyb3VwIElEIHdoaWNoIGlzIGEKKyAqIG51bWJlciBmcm9tIDAgLi4gZ2V0X251bV9ncm91cHMoZGltaW5keCkgLSAxLgorICogVmFsaWQgdmFsdWVzIG9mIGRpbWluZHggYXJlIDAgdG8gZ2V0X3dvcmtfZGltKCkgLSAxLgorICogRm9yIG90aGVyIHZhbHVlcywgZ2V0X2dyb3VwX2lkKCkgcmV0dXJucyAwLgorICogRm9yIGNsRW5xdWV1ZVRhc2ssIHRoaXMgcmV0dXJucyAwLgorICovCitzaXplX3QgX19vdmxkIF9fY25mbiBnZXRfZ3JvdXBfaWQodWludCBkaW1pbmR4KTsKKworLyoqCisgKiBnZXRfZ2xvYmFsX29mZnNldCByZXR1cm5zIHRoZSBvZmZzZXQgdmFsdWVzIHNwZWNpZmllZCBpbgorICogZ2xvYmFsX3dvcmtfb2Zmc2V0IGFyZ3VtZW50IHRvCisgKiBjbEVucXVldWVORFJhbmdlS2VybmVsLgorICogVmFsaWQgdmFsdWVzIG9mIGRpbWluZHggYXJlIDAgdG8gZ2V0X3dvcmtfZGltKCkgLSAxLgorICogRm9yIG90aGVyIHZhbHVlcywgZ2V0X2dsb2JhbF9vZmZzZXQoKSByZXR1cm5zIDAuCisgKiBGb3IgY2xFbnF1ZXVlVGFzaywgdGhpcyByZXR1cm5zIDAuCisgKi8KK3NpemVfdCBfX292bGQgX19jbmZuIGdldF9nbG9iYWxfb2Zmc2V0KHVpbnQgZGltaW5keCk7CisKKyNpZiBfX09QRU5DTF9DX1ZFUlNJT05fXyA+PSBDTF9WRVJTSU9OXzJfMAorc2l6ZV90IF9fb3ZsZCBnZXRfZW5xdWV1ZWRfbG9jYWxfc2l6ZSh1aW50IGRpbWluZHgpOworc2l6ZV90IF9fb3ZsZCBnZXRfZ2xvYmFsX2xpbmVhcl9pZCh2b2lkKTsKK3NpemVfdCBfX292bGQgZ2V0X2xvY2FsX2xpbmVhcl9pZCh2b2lkKTsKKyNlbmRpZiAvL19fT1BFTkNMX0NfVkVSU0lPTl9fID49IENMX1ZFUlNJT05fMl8wCisKKy8vIE9wZW5DTCB2MS4xIHM2LjExLjIsIHYxLjIgczYuMTIuMiwgdjIuMCBzNi4xMy4yIC0gTWF0aCBmdW5jdGlvbnMKKworLyoqCisgKiBBcmMgY29zaW5lIGZ1bmN0aW9uLgorICovCitmbG9hdCBfX292bGQgX19jbmZuIGFjb3MoZmxvYXQpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gYWNvcyhmbG9hdDIpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gYWNvcyhmbG9hdDMpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gYWNvcyhmbG9hdDQpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gYWNvcyhmbG9hdDgpOworZmxvYXQxNiBfX292bGQgX19jbmZuIGFjb3MoZmxvYXQxNik7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2RvdWJsZSBfX292bGQgX19jbmZuIGFjb3MoZG91YmxlKTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBhY29zKGRvdWJsZTIpOworZG91YmxlMyBfX292bGQgX19jbmZuIGFjb3MoZG91YmxlMyk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gYWNvcyhkb3VibGU0KTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBhY29zKGRvdWJsZTgpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBhY29zKGRvdWJsZTE2KTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2hhbGYgX19vdmxkIF9fY25mbiBhY29zKGhhbGYpOworaGFsZjIgX19vdmxkIF9fY25mbiBhY29zKGhhbGYyKTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gYWNvcyhoYWxmMyk7CitoYWxmNCBfX292bGQgX19jbmZuIGFjb3MoaGFsZjQpOworaGFsZjggX19vdmxkIF9fY25mbiBhY29zKGhhbGY4KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIGFjb3MoaGFsZjE2KTsKKyNlbmRpZiAvL2NsX2tocl9mcDE2CisKKy8qKgorICogSW52ZXJzZSBoeXBlcmJvbGljIGNvc2luZS4KKyAqLworZmxvYXQgX19vdmxkIF9fY25mbiBhY29zaChmbG9hdCk7CitmbG9hdDIgX19vdmxkIF9fY25mbiBhY29zaChmbG9hdDIpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gYWNvc2goZmxvYXQzKTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIGFjb3NoKGZsb2F0NCk7CitmbG9hdDggX19vdmxkIF9fY25mbiBhY29zaChmbG9hdDgpOworZmxvYXQxNiBfX292bGQgX19jbmZuIGFjb3NoKGZsb2F0MTYpOworI2lmZGVmIGNsX2tocl9mcDY0Citkb3VibGUgX19vdmxkIF9fY25mbiBhY29zaChkb3VibGUpOworZG91YmxlMiBfX292bGQgX19jbmZuIGFjb3NoKGRvdWJsZTIpOworZG91YmxlMyBfX292bGQgX19jbmZuIGFjb3NoKGRvdWJsZTMpOworZG91YmxlNCBfX292bGQgX19jbmZuIGFjb3NoKGRvdWJsZTQpOworZG91YmxlOCBfX292bGQgX19jbmZuIGFjb3NoKGRvdWJsZTgpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBhY29zaChkb3VibGUxNik7CisjZW5kaWYgLy9jbF9raHJfZnA2NAorI2lmZGVmIGNsX2tocl9mcDE2CitoYWxmIF9fb3ZsZCBfX2NuZm4gYWNvc2goaGFsZik7CitoYWxmMiBfX292bGQgX19jbmZuIGFjb3NoKGhhbGYyKTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gYWNvc2goaGFsZjMpOworaGFsZjQgX19vdmxkIF9fY25mbiBhY29zaChoYWxmNCk7CitoYWxmOCBfX292bGQgX19jbmZuIGFjb3NoKGhhbGY4KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIGFjb3NoKGhhbGYxNik7CisjZW5kaWYgLy9jbF9raHJfZnAxNgorCisvKioKKyAqIENvbXB1dGUgYWNvcyAoeCkgLyBQSS4KKyAqLworZmxvYXQgX19vdmxkIF9fY25mbiBhY29zcGkoZmxvYXQgeCk7CitmbG9hdDIgX19vdmxkIF9fY25mbiBhY29zcGkoZmxvYXQyIHgpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gYWNvc3BpKGZsb2F0MyB4KTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIGFjb3NwaShmbG9hdDQgeCk7CitmbG9hdDggX19vdmxkIF9fY25mbiBhY29zcGkoZmxvYXQ4IHgpOworZmxvYXQxNiBfX292bGQgX19jbmZuIGFjb3NwaShmbG9hdDE2IHgpOworI2lmZGVmIGNsX2tocl9mcDY0Citkb3VibGUgX19vdmxkIF9fY25mbiBhY29zcGkoZG91YmxlIHgpOworZG91YmxlMiBfX292bGQgX19jbmZuIGFjb3NwaShkb3VibGUyIHgpOworZG91YmxlMyBfX292bGQgX19jbmZuIGFjb3NwaShkb3VibGUzIHgpOworZG91YmxlNCBfX292bGQgX19jbmZuIGFjb3NwaShkb3VibGU0IHgpOworZG91YmxlOCBfX292bGQgX19jbmZuIGFjb3NwaShkb3VibGU4IHgpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBhY29zcGkoZG91YmxlMTYgeCk7CisjZW5kaWYgLy9jbF9raHJfZnA2NAorI2lmZGVmIGNsX2tocl9mcDE2CitoYWxmIF9fb3ZsZCBfX2NuZm4gYWNvc3BpKGhhbGYgeCk7CitoYWxmMiBfX292bGQgX19jbmZuIGFjb3NwaShoYWxmMiB4KTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gYWNvc3BpKGhhbGYzIHgpOworaGFsZjQgX19vdmxkIF9fY25mbiBhY29zcGkoaGFsZjQgeCk7CitoYWxmOCBfX292bGQgX19jbmZuIGFjb3NwaShoYWxmOCB4KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIGFjb3NwaShoYWxmMTYgeCk7CisjZW5kaWYgLy9jbF9raHJfZnAxNgorCisvKioKKyAqIEFyYyBzaW5lIGZ1bmN0aW9uLgorICovCitmbG9hdCBfX292bGQgX19jbmZuIGFzaW4oZmxvYXQpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gYXNpbihmbG9hdDIpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gYXNpbihmbG9hdDMpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gYXNpbihmbG9hdDQpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gYXNpbihmbG9hdDgpOworZmxvYXQxNiBfX292bGQgX19jbmZuIGFzaW4oZmxvYXQxNik7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2RvdWJsZSBfX292bGQgX19jbmZuIGFzaW4oZG91YmxlKTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBhc2luKGRvdWJsZTIpOworZG91YmxlMyBfX292bGQgX19jbmZuIGFzaW4oZG91YmxlMyk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gYXNpbihkb3VibGU0KTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBhc2luKGRvdWJsZTgpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBhc2luKGRvdWJsZTE2KTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2hhbGYgX19vdmxkIF9fY25mbiBhc2luKGhhbGYpOworaGFsZjIgX19vdmxkIF9fY25mbiBhc2luKGhhbGYyKTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gYXNpbihoYWxmMyk7CitoYWxmNCBfX292bGQgX19jbmZuIGFzaW4oaGFsZjQpOworaGFsZjggX19vdmxkIF9fY25mbiBhc2luKGhhbGY4KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIGFzaW4oaGFsZjE2KTsKKyNlbmRpZiAvL2NsX2tocl9mcDE2CisKKy8qKgorICogSW52ZXJzZSBoeXBlcmJvbGljIHNpbmUuCisgKi8KK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gYXNpbmgoZmxvYXQpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gYXNpbmgoZmxvYXQyKTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGFzaW5oKGZsb2F0Myk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBhc2luaChmbG9hdDQpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gYXNpbmgoZmxvYXQ4KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBhc2luaChmbG9hdDE2KTsKKyNpZmRlZiBjbF9raHJfZnA2NAorZG91YmxlIF9fb3ZsZCBfX2NuZm4gYXNpbmgoZG91YmxlKTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBhc2luaChkb3VibGUyKTsKK2RvdWJsZTMgX19vdmxkIF9fY25mbiBhc2luaChkb3VibGUzKTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBhc2luaChkb3VibGU0KTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBhc2luaChkb3VibGU4KTsKK2RvdWJsZTE2IF9fb3ZsZCBfX2NuZm4gYXNpbmgoZG91YmxlMTYpOworI2VuZGlmIC8vY2xfa2hyX2ZwNjQKKyNpZmRlZiBjbF9raHJfZnAxNgoraGFsZiBfX292bGQgX19jbmZuIGFzaW5oKGhhbGYpOworaGFsZjIgX19vdmxkIF9fY25mbiBhc2luaChoYWxmMik7CitoYWxmMyBfX292bGQgX19jbmZuIGFzaW5oKGhhbGYzKTsKK2hhbGY0IF9fb3ZsZCBfX2NuZm4gYXNpbmgoaGFsZjQpOworaGFsZjggX19vdmxkIF9fY25mbiBhc2luaChoYWxmOCk7CitoYWxmMTYgX19vdmxkIF9fY25mbiBhc2luaChoYWxmMTYpOworI2VuZGlmIC8vY2xfa2hyX2ZwMTYKKworLyoqCisgKiBDb21wdXRlIGFzaW4gKHgpIC8gUEkuCisgKi8KK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gYXNpbnBpKGZsb2F0IHgpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gYXNpbnBpKGZsb2F0MiB4KTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGFzaW5waShmbG9hdDMgeCk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBhc2lucGkoZmxvYXQ0IHgpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gYXNpbnBpKGZsb2F0OCB4KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBhc2lucGkoZmxvYXQxNiB4KTsKKyNpZmRlZiBjbF9raHJfZnA2NAorZG91YmxlIF9fb3ZsZCBfX2NuZm4gYXNpbnBpKGRvdWJsZSB4KTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBhc2lucGkoZG91YmxlMiB4KTsKK2RvdWJsZTMgX19vdmxkIF9fY25mbiBhc2lucGkoZG91YmxlMyB4KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBhc2lucGkoZG91YmxlNCB4KTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBhc2lucGkoZG91YmxlOCB4KTsKK2RvdWJsZTE2IF9fb3ZsZCBfX2NuZm4gYXNpbnBpKGRvdWJsZTE2IHgpOworI2VuZGlmIC8vY2xfa2hyX2ZwNjQKKyNpZmRlZiBjbF9raHJfZnAxNgoraGFsZiBfX292bGQgX19jbmZuIGFzaW5waShoYWxmIHgpOworaGFsZjIgX19vdmxkIF9fY25mbiBhc2lucGkoaGFsZjIgeCk7CitoYWxmMyBfX292bGQgX19jbmZuIGFzaW5waShoYWxmMyB4KTsKK2hhbGY0IF9fb3ZsZCBfX2NuZm4gYXNpbnBpKGhhbGY0IHgpOworaGFsZjggX19vdmxkIF9fY25mbiBhc2lucGkoaGFsZjggeCk7CitoYWxmMTYgX19vdmxkIF9fY25mbiBhc2lucGkoaGFsZjE2IHgpOworI2VuZGlmIC8vY2xfa2hyX2ZwMTYKKworLyoqCisgKiBBcmMgdGFuZ2VudCBmdW5jdGlvbi4KKyAqLworZmxvYXQgX19vdmxkIF9fY25mbiBhdGFuKGZsb2F0IHlfb3Zlcl94KTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIGF0YW4oZmxvYXQyIHlfb3Zlcl94KTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGF0YW4oZmxvYXQzIHlfb3Zlcl94KTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIGF0YW4oZmxvYXQ0IHlfb3Zlcl94KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIGF0YW4oZmxvYXQ4IHlfb3Zlcl94KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBhdGFuKGZsb2F0MTYgeV9vdmVyX3gpOworI2lmZGVmIGNsX2tocl9mcDY0Citkb3VibGUgX19vdmxkIF9fY25mbiBhdGFuKGRvdWJsZSB5X292ZXJfeCk7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gYXRhbihkb3VibGUyIHlfb3Zlcl94KTsKK2RvdWJsZTMgX19vdmxkIF9fY25mbiBhdGFuKGRvdWJsZTMgeV9vdmVyX3gpOworZG91YmxlNCBfX292bGQgX19jbmZuIGF0YW4oZG91YmxlNCB5X292ZXJfeCk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gYXRhbihkb3VibGU4IHlfb3Zlcl94KTsKK2RvdWJsZTE2IF9fb3ZsZCBfX2NuZm4gYXRhbihkb3VibGUxNiB5X292ZXJfeCk7CisjZW5kaWYgLy9jbF9raHJfZnA2NAorI2lmZGVmIGNsX2tocl9mcDE2CitoYWxmIF9fb3ZsZCBfX2NuZm4gYXRhbihoYWxmIHlfb3Zlcl94KTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gYXRhbihoYWxmMiB5X292ZXJfeCk7CitoYWxmMyBfX292bGQgX19jbmZuIGF0YW4oaGFsZjMgeV9vdmVyX3gpOworaGFsZjQgX19vdmxkIF9fY25mbiBhdGFuKGhhbGY0IHlfb3Zlcl94KTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gYXRhbihoYWxmOCB5X292ZXJfeCk7CitoYWxmMTYgX19vdmxkIF9fY25mbiBhdGFuKGhhbGYxNiB5X292ZXJfeCk7CisjZW5kaWYgLy9jbF9raHJfZnAxNgorCisvKioKKyAqIEFyYyB0YW5nZW50IG9mIHkgLyB4LgorICovCitmbG9hdCBfX292bGQgX19jbmZuIGF0YW4yKGZsb2F0IHksIGZsb2F0IHgpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gYXRhbjIoZmxvYXQyIHksIGZsb2F0MiB4KTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGF0YW4yKGZsb2F0MyB5LCBmbG9hdDMgeCk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBhdGFuMihmbG9hdDQgeSwgZmxvYXQ0IHgpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gYXRhbjIoZmxvYXQ4IHksIGZsb2F0OCB4KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBhdGFuMihmbG9hdDE2IHksIGZsb2F0MTYgeCk7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2RvdWJsZSBfX292bGQgX19jbmZuIGF0YW4yKGRvdWJsZSB5LCBkb3VibGUgeCk7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gYXRhbjIoZG91YmxlMiB5LCBkb3VibGUyIHgpOworZG91YmxlMyBfX292bGQgX19jbmZuIGF0YW4yKGRvdWJsZTMgeSwgZG91YmxlMyB4KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBhdGFuMihkb3VibGU0IHksIGRvdWJsZTQgeCk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gYXRhbjIoZG91YmxlOCB5LCBkb3VibGU4IHgpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBhdGFuMihkb3VibGUxNiB5LCBkb3VibGUxNiB4KTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2hhbGYgX19vdmxkIF9fY25mbiBhdGFuMihoYWxmIHksIGhhbGYgeCk7CitoYWxmMiBfX292bGQgX19jbmZuIGF0YW4yKGhhbGYyIHksIGhhbGYyIHgpOworaGFsZjMgX19vdmxkIF9fY25mbiBhdGFuMihoYWxmMyB5LCBoYWxmMyB4KTsKK2hhbGY0IF9fb3ZsZCBfX2NuZm4gYXRhbjIoaGFsZjQgeSwgaGFsZjQgeCk7CitoYWxmOCBfX292bGQgX19jbmZuIGF0YW4yKGhhbGY4IHksIGhhbGY4IHgpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gYXRhbjIoaGFsZjE2IHksIGhhbGYxNiB4KTsKKyNlbmRpZiAvL2NsX2tocl9mcDE2CisKKy8qKgorICogSHlwZXJib2xpYyBhcmMgdGFuZ2VudC4KKyAqLworZmxvYXQgX19vdmxkIF9fY25mbiBhdGFuaChmbG9hdCk7CitmbG9hdDIgX19vdmxkIF9fY25mbiBhdGFuaChmbG9hdDIpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gYXRhbmgoZmxvYXQzKTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIGF0YW5oKGZsb2F0NCk7CitmbG9hdDggX19vdmxkIF9fY25mbiBhdGFuaChmbG9hdDgpOworZmxvYXQxNiBfX292bGQgX19jbmZuIGF0YW5oKGZsb2F0MTYpOworI2lmZGVmIGNsX2tocl9mcDY0Citkb3VibGUgX19vdmxkIF9fY25mbiBhdGFuaChkb3VibGUpOworZG91YmxlMiBfX292bGQgX19jbmZuIGF0YW5oKGRvdWJsZTIpOworZG91YmxlMyBfX292bGQgX19jbmZuIGF0YW5oKGRvdWJsZTMpOworZG91YmxlNCBfX292bGQgX19jbmZuIGF0YW5oKGRvdWJsZTQpOworZG91YmxlOCBfX292bGQgX19jbmZuIGF0YW5oKGRvdWJsZTgpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBhdGFuaChkb3VibGUxNik7CisjZW5kaWYgLy9jbF9raHJfZnA2NAorI2lmZGVmIGNsX2tocl9mcDE2CitoYWxmIF9fb3ZsZCBfX2NuZm4gYXRhbmgoaGFsZik7CitoYWxmMiBfX292bGQgX19jbmZuIGF0YW5oKGhhbGYyKTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gYXRhbmgoaGFsZjMpOworaGFsZjQgX19vdmxkIF9fY25mbiBhdGFuaChoYWxmNCk7CitoYWxmOCBfX292bGQgX19jbmZuIGF0YW5oKGhhbGY4KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIGF0YW5oKGhhbGYxNik7CisjZW5kaWYgLy9jbF9raHJfZnAxNgorCisvKioKKyAqIENvbXB1dGUgYXRhbiAoeCkgLyBQSS4KKyAqLworZmxvYXQgX19vdmxkIF9fY25mbiBhdGFucGkoZmxvYXQgeCk7CitmbG9hdDIgX19vdmxkIF9fY25mbiBhdGFucGkoZmxvYXQyIHgpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gYXRhbnBpKGZsb2F0MyB4KTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIGF0YW5waShmbG9hdDQgeCk7CitmbG9hdDggX19vdmxkIF9fY25mbiBhdGFucGkoZmxvYXQ4IHgpOworZmxvYXQxNiBfX292bGQgX19jbmZuIGF0YW5waShmbG9hdDE2IHgpOworI2lmZGVmIGNsX2tocl9mcDY0Citkb3VibGUgX19vdmxkIF9fY25mbiBhdGFucGkoZG91YmxlIHgpOworZG91YmxlMiBfX292bGQgX19jbmZuIGF0YW5waShkb3VibGUyIHgpOworZG91YmxlMyBfX292bGQgX19jbmZuIGF0YW5waShkb3VibGUzIHgpOworZG91YmxlNCBfX292bGQgX19jbmZuIGF0YW5waShkb3VibGU0IHgpOworZG91YmxlOCBfX292bGQgX19jbmZuIGF0YW5waShkb3VibGU4IHgpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBhdGFucGkoZG91YmxlMTYgeCk7CisjZW5kaWYgLy9jbF9raHJfZnA2NAorI2lmZGVmIGNsX2tocl9mcDE2CitoYWxmIF9fb3ZsZCBfX2NuZm4gYXRhbnBpKGhhbGYgeCk7CitoYWxmMiBfX292bGQgX19jbmZuIGF0YW5waShoYWxmMiB4KTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gYXRhbnBpKGhhbGYzIHgpOworaGFsZjQgX19vdmxkIF9fY25mbiBhdGFucGkoaGFsZjQgeCk7CitoYWxmOCBfX292bGQgX19jbmZuIGF0YW5waShoYWxmOCB4KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIGF0YW5waShoYWxmMTYgeCk7CisjZW5kaWYgLy9jbF9raHJfZnAxNgorCisvKioKKyAqIENvbXB1dGUgYXRhbjIgKHksIHgpIC8gUEkuCisgKi8KK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gYXRhbjJwaShmbG9hdCB5LCBmbG9hdCB4KTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIGF0YW4ycGkoZmxvYXQyIHksIGZsb2F0MiB4KTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGF0YW4ycGkoZmxvYXQzIHksIGZsb2F0MyB4KTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIGF0YW4ycGkoZmxvYXQ0IHksIGZsb2F0NCB4KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIGF0YW4ycGkoZmxvYXQ4IHksIGZsb2F0OCB4KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBhdGFuMnBpKGZsb2F0MTYgeSwgZmxvYXQxNiB4KTsKKyNpZmRlZiBjbF9raHJfZnA2NAorZG91YmxlIF9fb3ZsZCBfX2NuZm4gYXRhbjJwaShkb3VibGUgeSwgZG91YmxlIHgpOworZG91YmxlMiBfX292bGQgX19jbmZuIGF0YW4ycGkoZG91YmxlMiB5LCBkb3VibGUyIHgpOworZG91YmxlMyBfX292bGQgX19jbmZuIGF0YW4ycGkoZG91YmxlMyB5LCBkb3VibGUzIHgpOworZG91YmxlNCBfX292bGQgX19jbmZuIGF0YW4ycGkoZG91YmxlNCB5LCBkb3VibGU0IHgpOworZG91YmxlOCBfX292bGQgX19jbmZuIGF0YW4ycGkoZG91YmxlOCB5LCBkb3VibGU4IHgpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBhdGFuMnBpKGRvdWJsZTE2IHksIGRvdWJsZTE2IHgpOworI2VuZGlmIC8vY2xfa2hyX2ZwNjQKKyNpZmRlZiBjbF9raHJfZnAxNgoraGFsZiBfX292bGQgX19jbmZuIGF0YW4ycGkoaGFsZiB5LCBoYWxmIHgpOworaGFsZjIgX19vdmxkIF9fY25mbiBhdGFuMnBpKGhhbGYyIHksIGhhbGYyIHgpOworaGFsZjMgX19vdmxkIF9fY25mbiBhdGFuMnBpKGhhbGYzIHksIGhhbGYzIHgpOworaGFsZjQgX19vdmxkIF9fY25mbiBhdGFuMnBpKGhhbGY0IHksIGhhbGY0IHgpOworaGFsZjggX19vdmxkIF9fY25mbiBhdGFuMnBpKGhhbGY4IHksIGhhbGY4IHgpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gYXRhbjJwaShoYWxmMTYgeSwgaGFsZjE2IHgpOworI2VuZGlmIC8vY2xfa2hyX2ZwMTYKKworLyoqCisgKiBDb21wdXRlIGN1YmUtcm9vdC4KKyAqLworZmxvYXQgX19vdmxkIF9fY25mbiBjYnJ0KGZsb2F0KTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIGNicnQoZmxvYXQyKTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGNicnQoZmxvYXQzKTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIGNicnQoZmxvYXQ0KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIGNicnQoZmxvYXQ4KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBjYnJ0KGZsb2F0MTYpOworI2lmZGVmIGNsX2tocl9mcDY0Citkb3VibGUgX19vdmxkIF9fY25mbiBjYnJ0KGRvdWJsZSk7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gY2JydChkb3VibGUyKTsKK2RvdWJsZTMgX19vdmxkIF9fY25mbiBjYnJ0KGRvdWJsZTMpOworZG91YmxlNCBfX292bGQgX19jbmZuIGNicnQoZG91YmxlNCk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gY2JydChkb3VibGU4KTsKK2RvdWJsZTE2IF9fb3ZsZCBfX2NuZm4gY2JydChkb3VibGUxNik7CisjZW5kaWYgLy9jbF9raHJfZnA2NAorI2lmZGVmIGNsX2tocl9mcDE2CitoYWxmIF9fb3ZsZCBfX2NuZm4gY2JydChoYWxmKTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gY2JydChoYWxmMik7CitoYWxmMyBfX292bGQgX19jbmZuIGNicnQoaGFsZjMpOworaGFsZjQgX19vdmxkIF9fY25mbiBjYnJ0KGhhbGY0KTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gY2JydChoYWxmOCk7CitoYWxmMTYgX19vdmxkIF9fY25mbiBjYnJ0KGhhbGYxNik7CisjZW5kaWYgLy9jbF9raHJfZnAxNgorCisvKioKKyAqIFJvdW5kIHRvIGludGVncmFsIHZhbHVlIHVzaW5nIHRoZSByb3VuZCB0byBwb3NpdGl2ZQorICogaW5maW5pdHkgcm91bmRpbmcgbW9kZS4KKyAqLworZmxvYXQgX19vdmxkIF9fY25mbiBjZWlsKGZsb2F0KTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIGNlaWwoZmxvYXQyKTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGNlaWwoZmxvYXQzKTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIGNlaWwoZmxvYXQ0KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIGNlaWwoZmxvYXQ4KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBjZWlsKGZsb2F0MTYpOworI2lmZGVmIGNsX2tocl9mcDY0Citkb3VibGUgX19vdmxkIF9fY25mbiBjZWlsKGRvdWJsZSk7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gY2VpbChkb3VibGUyKTsKK2RvdWJsZTMgX19vdmxkIF9fY25mbiBjZWlsKGRvdWJsZTMpOworZG91YmxlNCBfX292bGQgX19jbmZuIGNlaWwoZG91YmxlNCk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gY2VpbChkb3VibGU4KTsKK2RvdWJsZTE2IF9fb3ZsZCBfX2NuZm4gY2VpbChkb3VibGUxNik7CisjZW5kaWYgLy9jbF9raHJfZnA2NAorI2lmZGVmIGNsX2tocl9mcDE2CitoYWxmIF9fb3ZsZCBfX2NuZm4gY2VpbChoYWxmKTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gY2VpbChoYWxmMik7CitoYWxmMyBfX292bGQgX19jbmZuIGNlaWwoaGFsZjMpOworaGFsZjQgX19vdmxkIF9fY25mbiBjZWlsKGhhbGY0KTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gY2VpbChoYWxmOCk7CitoYWxmMTYgX19vdmxkIF9fY25mbiBjZWlsKGhhbGYxNik7CisjZW5kaWYgLy9jbF9raHJfZnAxNgorCisvKioKKyAqIFJldHVybnMgeCB3aXRoIGl0cyBzaWduIGNoYW5nZWQgdG8gbWF0Y2ggdGhlIHNpZ24gb2YgeS4KKyAqLworZmxvYXQgX19vdmxkIF9fY25mbiBjb3B5c2lnbihmbG9hdCB4LCBmbG9hdCB5KTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIGNvcHlzaWduKGZsb2F0MiB4LCBmbG9hdDIgeSk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBjb3B5c2lnbihmbG9hdDMgeCwgZmxvYXQzIHkpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gY29weXNpZ24oZmxvYXQ0IHgsIGZsb2F0NCB5KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIGNvcHlzaWduKGZsb2F0OCB4LCBmbG9hdDggeSk7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gY29weXNpZ24oZmxvYXQxNiB4LCBmbG9hdDE2IHkpOworI2lmZGVmIGNsX2tocl9mcDY0Citkb3VibGUgX19vdmxkIF9fY25mbiBjb3B5c2lnbihkb3VibGUgeCwgZG91YmxlIHkpOworZG91YmxlMiBfX292bGQgX19jbmZuIGNvcHlzaWduKGRvdWJsZTIgeCwgZG91YmxlMiB5KTsKK2RvdWJsZTMgX19vdmxkIF9fY25mbiBjb3B5c2lnbihkb3VibGUzIHgsIGRvdWJsZTMgeSk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gY29weXNpZ24oZG91YmxlNCB4LCBkb3VibGU0IHkpOworZG91YmxlOCBfX292bGQgX19jbmZuIGNvcHlzaWduKGRvdWJsZTggeCwgZG91YmxlOCB5KTsKK2RvdWJsZTE2IF9fb3ZsZCBfX2NuZm4gY29weXNpZ24oZG91YmxlMTYgeCwgZG91YmxlMTYgeSk7CisjZW5kaWYgLy9jbF9raHJfZnA2NAorI2lmZGVmIGNsX2tocl9mcDE2CitoYWxmIF9fb3ZsZCBfX2NuZm4gY29weXNpZ24oaGFsZiB4LCBoYWxmIHkpOworaGFsZjIgX19vdmxkIF9fY25mbiBjb3B5c2lnbihoYWxmMiB4LCBoYWxmMiB5KTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gY29weXNpZ24oaGFsZjMgeCwgaGFsZjMgeSk7CitoYWxmNCBfX292bGQgX19jbmZuIGNvcHlzaWduKGhhbGY0IHgsIGhhbGY0IHkpOworaGFsZjggX19vdmxkIF9fY25mbiBjb3B5c2lnbihoYWxmOCB4LCBoYWxmOCB5KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIGNvcHlzaWduKGhhbGYxNiB4LCBoYWxmMTYgeSk7CisjZW5kaWYgLy9jbF9raHJfZnAxNgorCisvKioKKyAqIENvbXB1dGUgY29zaW5lLgorICovCitmbG9hdCBfX292bGQgX19jbmZuIGNvcyhmbG9hdCk7CitmbG9hdDIgX19vdmxkIF9fY25mbiBjb3MoZmxvYXQyKTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGNvcyhmbG9hdDMpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gY29zKGZsb2F0NCk7CitmbG9hdDggX19vdmxkIF9fY25mbiBjb3MoZmxvYXQ4KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBjb3MoZmxvYXQxNik7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2RvdWJsZSBfX292bGQgX19jbmZuIGNvcyhkb3VibGUpOworZG91YmxlMiBfX292bGQgX19jbmZuIGNvcyhkb3VibGUyKTsKK2RvdWJsZTMgX19vdmxkIF9fY25mbiBjb3MoZG91YmxlMyk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gY29zKGRvdWJsZTQpOworZG91YmxlOCBfX292bGQgX19jbmZuIGNvcyhkb3VibGU4KTsKK2RvdWJsZTE2IF9fb3ZsZCBfX2NuZm4gY29zKGRvdWJsZTE2KTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2hhbGYgX19vdmxkIF9fY25mbiBjb3MoaGFsZik7CitoYWxmMiBfX292bGQgX19jbmZuIGNvcyhoYWxmMik7CitoYWxmMyBfX292bGQgX19jbmZuIGNvcyhoYWxmMyk7CitoYWxmNCBfX292bGQgX19jbmZuIGNvcyhoYWxmNCk7CitoYWxmOCBfX292bGQgX19jbmZuIGNvcyhoYWxmOCk7CitoYWxmMTYgX19vdmxkIF9fY25mbiBjb3MoaGFsZjE2KTsKKyNlbmRpZiAvL2NsX2tocl9mcDE2CisKKy8qKgorICogQ29tcHV0ZSBoeXBlcmJvbGljIGNvc2luZS4KKyAqLworZmxvYXQgX19vdmxkIF9fY25mbiBjb3NoKGZsb2F0KTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIGNvc2goZmxvYXQyKTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGNvc2goZmxvYXQzKTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIGNvc2goZmxvYXQ0KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIGNvc2goZmxvYXQ4KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBjb3NoKGZsb2F0MTYpOworI2lmZGVmIGNsX2tocl9mcDY0Citkb3VibGUgX19vdmxkIF9fY25mbiBjb3NoKGRvdWJsZSk7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gY29zaChkb3VibGUyKTsKK2RvdWJsZTMgX19vdmxkIF9fY25mbiBjb3NoKGRvdWJsZTMpOworZG91YmxlNCBfX292bGQgX19jbmZuIGNvc2goZG91YmxlNCk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gY29zaChkb3VibGU4KTsKK2RvdWJsZTE2IF9fb3ZsZCBfX2NuZm4gY29zaChkb3VibGUxNik7CisjZW5kaWYgLy9jbF9raHJfZnA2NAorI2lmZGVmIGNsX2tocl9mcDE2CitoYWxmIF9fb3ZsZCBfX2NuZm4gY29zaChoYWxmKTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gY29zaChoYWxmMik7CitoYWxmMyBfX292bGQgX19jbmZuIGNvc2goaGFsZjMpOworaGFsZjQgX19vdmxkIF9fY25mbiBjb3NoKGhhbGY0KTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gY29zaChoYWxmOCk7CitoYWxmMTYgX19vdmxkIF9fY25mbiBjb3NoKGhhbGYxNik7CisjZW5kaWYgLy9jbF9raHJfZnAxNgorCisvKioKKyAqIENvbXB1dGUgY29zIChQSSAqIHgpLgorICovCitmbG9hdCBfX292bGQgX19jbmZuIGNvc3BpKGZsb2F0IHgpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gY29zcGkoZmxvYXQyIHgpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gY29zcGkoZmxvYXQzIHgpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gY29zcGkoZmxvYXQ0IHgpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gY29zcGkoZmxvYXQ4IHgpOworZmxvYXQxNiBfX292bGQgX19jbmZuIGNvc3BpKGZsb2F0MTYgeCk7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2RvdWJsZSBfX292bGQgX19jbmZuIGNvc3BpKGRvdWJsZSB4KTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBjb3NwaShkb3VibGUyIHgpOworZG91YmxlMyBfX292bGQgX19jbmZuIGNvc3BpKGRvdWJsZTMgeCk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gY29zcGkoZG91YmxlNCB4KTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBjb3NwaShkb3VibGU4IHgpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBjb3NwaShkb3VibGUxNiB4KTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2hhbGYgX19vdmxkIF9fY25mbiBjb3NwaShoYWxmIHgpOworaGFsZjIgX19vdmxkIF9fY25mbiBjb3NwaShoYWxmMiB4KTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gY29zcGkoaGFsZjMgeCk7CitoYWxmNCBfX292bGQgX19jbmZuIGNvc3BpKGhhbGY0IHgpOworaGFsZjggX19vdmxkIF9fY25mbiBjb3NwaShoYWxmOCB4KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIGNvc3BpKGhhbGYxNiB4KTsKKyNlbmRpZiAvL2NsX2tocl9mcDE2CisKKy8qKgorICogQ29tcGxlbWVudGFyeSBlcnJvciBmdW5jdGlvbi4KKyAqLworZmxvYXQgX19vdmxkIF9fY25mbiBlcmZjKGZsb2F0KTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIGVyZmMoZmxvYXQyKTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGVyZmMoZmxvYXQzKTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIGVyZmMoZmxvYXQ0KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIGVyZmMoZmxvYXQ4KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBlcmZjKGZsb2F0MTYpOworI2lmZGVmIGNsX2tocl9mcDY0Citkb3VibGUgX19vdmxkIF9fY25mbiBlcmZjKGRvdWJsZSk7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gZXJmYyhkb3VibGUyKTsKK2RvdWJsZTMgX19vdmxkIF9fY25mbiBlcmZjKGRvdWJsZTMpOworZG91YmxlNCBfX292bGQgX19jbmZuIGVyZmMoZG91YmxlNCk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gZXJmYyhkb3VibGU4KTsKK2RvdWJsZTE2IF9fb3ZsZCBfX2NuZm4gZXJmYyhkb3VibGUxNik7CisjZW5kaWYgLy9jbF9raHJfZnA2NAorI2lmZGVmIGNsX2tocl9mcDE2CitoYWxmIF9fb3ZsZCBfX2NuZm4gZXJmYyhoYWxmKTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gZXJmYyhoYWxmMik7CitoYWxmMyBfX292bGQgX19jbmZuIGVyZmMoaGFsZjMpOworaGFsZjQgX19vdmxkIF9fY25mbiBlcmZjKGhhbGY0KTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gZXJmYyhoYWxmOCk7CitoYWxmMTYgX19vdmxkIF9fY25mbiBlcmZjKGhhbGYxNik7CisjZW5kaWYgLy9jbF9raHJfZnAxNgorCisvKioKKyAqIEVycm9yIGZ1bmN0aW9uIGVuY291bnRlcmVkIGluIGludGVncmF0aW5nIHRoZQorICogbm9ybWFsIGRpc3RyaWJ1dGlvbi4KKyAqLworZmxvYXQgX19vdmxkIF9fY25mbiBlcmYoZmxvYXQpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gZXJmKGZsb2F0Mik7CitmbG9hdDMgX19vdmxkIF9fY25mbiBlcmYoZmxvYXQzKTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIGVyZihmbG9hdDQpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gZXJmKGZsb2F0OCk7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gZXJmKGZsb2F0MTYpOworI2lmZGVmIGNsX2tocl9mcDY0Citkb3VibGUgX19vdmxkIF9fY25mbiBlcmYoZG91YmxlKTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBlcmYoZG91YmxlMik7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gZXJmKGRvdWJsZTMpOworZG91YmxlNCBfX292bGQgX19jbmZuIGVyZihkb3VibGU0KTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBlcmYoZG91YmxlOCk7Citkb3VibGUxNiBfX292bGQgX19jbmZuIGVyZihkb3VibGUxNik7CisjZW5kaWYgLy9jbF9raHJfZnA2NAorI2lmZGVmIGNsX2tocl9mcDE2CitoYWxmIF9fb3ZsZCBfX2NuZm4gZXJmKGhhbGYpOworaGFsZjIgX19vdmxkIF9fY25mbiBlcmYoaGFsZjIpOworaGFsZjMgX19vdmxkIF9fY25mbiBlcmYoaGFsZjMpOworaGFsZjQgX19vdmxkIF9fY25mbiBlcmYoaGFsZjQpOworaGFsZjggX19vdmxkIF9fY25mbiBlcmYoaGFsZjgpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gZXJmKGhhbGYxNik7CisjZW5kaWYgLy9jbF9raHJfZnAxNgorCisvKioKKyAqIENvbXB1dGUgdGhlIGJhc2UgZSBleHBvbmVudGlhbCBmdW5jdGlvbiBvZiB4LgorICovCitmbG9hdCBfX292bGQgX19jbmZuIGV4cChmbG9hdCB4KTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIGV4cChmbG9hdDIgeCk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBleHAoZmxvYXQzIHgpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gZXhwKGZsb2F0NCB4KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIGV4cChmbG9hdDggeCk7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gZXhwKGZsb2F0MTYgeCk7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2RvdWJsZSBfX292bGQgX19jbmZuIGV4cChkb3VibGUgeCk7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gZXhwKGRvdWJsZTIgeCk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gZXhwKGRvdWJsZTMgeCk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gZXhwKGRvdWJsZTQgeCk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gZXhwKGRvdWJsZTggeCk7Citkb3VibGUxNiBfX292bGQgX19jbmZuIGV4cChkb3VibGUxNiB4KTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2hhbGYgX19vdmxkIF9fY25mbiBleHAoaGFsZiB4KTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gZXhwKGhhbGYyIHgpOworaGFsZjMgX19vdmxkIF9fY25mbiBleHAoaGFsZjMgeCk7CitoYWxmNCBfX292bGQgX19jbmZuIGV4cChoYWxmNCB4KTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gZXhwKGhhbGY4IHgpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gZXhwKGhhbGYxNiB4KTsKKyNlbmRpZiAvL2NsX2tocl9mcDE2CisKKy8qKgorICogRXhwb25lbnRpYWwgYmFzZSAyIGZ1bmN0aW9uLgorICovCitmbG9hdCBfX292bGQgX19jbmZuIGV4cDIoZmxvYXQpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gZXhwMihmbG9hdDIpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gZXhwMihmbG9hdDMpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gZXhwMihmbG9hdDQpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gZXhwMihmbG9hdDgpOworZmxvYXQxNiBfX292bGQgX19jbmZuIGV4cDIoZmxvYXQxNik7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2RvdWJsZSBfX292bGQgX19jbmZuIGV4cDIoZG91YmxlKTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBleHAyKGRvdWJsZTIpOworZG91YmxlMyBfX292bGQgX19jbmZuIGV4cDIoZG91YmxlMyk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gZXhwMihkb3VibGU0KTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBleHAyKGRvdWJsZTgpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBleHAyKGRvdWJsZTE2KTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2hhbGYgX19vdmxkIF9fY25mbiBleHAyKGhhbGYpOworaGFsZjIgX19vdmxkIF9fY25mbiBleHAyKGhhbGYyKTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gZXhwMihoYWxmMyk7CitoYWxmNCBfX292bGQgX19jbmZuIGV4cDIoaGFsZjQpOworaGFsZjggX19vdmxkIF9fY25mbiBleHAyKGhhbGY4KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIGV4cDIoaGFsZjE2KTsKKyNlbmRpZiAvL2NsX2tocl9mcDE2CisKKy8qKgorICogRXhwb25lbnRpYWwgYmFzZSAxMCBmdW5jdGlvbi4KKyAqLworZmxvYXQgX19vdmxkIF9fY25mbiBleHAxMChmbG9hdCk7CitmbG9hdDIgX19vdmxkIF9fY25mbiBleHAxMChmbG9hdDIpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gZXhwMTAoZmxvYXQzKTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIGV4cDEwKGZsb2F0NCk7CitmbG9hdDggX19vdmxkIF9fY25mbiBleHAxMChmbG9hdDgpOworZmxvYXQxNiBfX292bGQgX19jbmZuIGV4cDEwKGZsb2F0MTYpOworI2lmZGVmIGNsX2tocl9mcDY0Citkb3VibGUgX19vdmxkIF9fY25mbiBleHAxMChkb3VibGUpOworZG91YmxlMiBfX292bGQgX19jbmZuIGV4cDEwKGRvdWJsZTIpOworZG91YmxlMyBfX292bGQgX19jbmZuIGV4cDEwKGRvdWJsZTMpOworZG91YmxlNCBfX292bGQgX19jbmZuIGV4cDEwKGRvdWJsZTQpOworZG91YmxlOCBfX292bGQgX19jbmZuIGV4cDEwKGRvdWJsZTgpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBleHAxMChkb3VibGUxNik7CisjZW5kaWYgLy9jbF9raHJfZnA2NAorI2lmZGVmIGNsX2tocl9mcDE2CitoYWxmIF9fb3ZsZCBfX2NuZm4gZXhwMTAoaGFsZik7CitoYWxmMiBfX292bGQgX19jbmZuIGV4cDEwKGhhbGYyKTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gZXhwMTAoaGFsZjMpOworaGFsZjQgX19vdmxkIF9fY25mbiBleHAxMChoYWxmNCk7CitoYWxmOCBfX292bGQgX19jbmZuIGV4cDEwKGhhbGY4KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIGV4cDEwKGhhbGYxNik7CisjZW5kaWYgLy9jbF9raHJfZnAxNgorCisvKioKKyAqIENvbXB1dGUgZV54LSAxLjAuCisgKi8KK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gZXhwbTEoZmxvYXQgeCk7CitmbG9hdDIgX19vdmxkIF9fY25mbiBleHBtMShmbG9hdDIgeCk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBleHBtMShmbG9hdDMgeCk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBleHBtMShmbG9hdDQgeCk7CitmbG9hdDggX19vdmxkIF9fY25mbiBleHBtMShmbG9hdDggeCk7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gZXhwbTEoZmxvYXQxNiB4KTsKKyNpZmRlZiBjbF9raHJfZnA2NAorZG91YmxlIF9fb3ZsZCBfX2NuZm4gZXhwbTEoZG91YmxlIHgpOworZG91YmxlMiBfX292bGQgX19jbmZuIGV4cG0xKGRvdWJsZTIgeCk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gZXhwbTEoZG91YmxlMyB4KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBleHBtMShkb3VibGU0IHgpOworZG91YmxlOCBfX292bGQgX19jbmZuIGV4cG0xKGRvdWJsZTggeCk7Citkb3VibGUxNiBfX292bGQgX19jbmZuIGV4cG0xKGRvdWJsZTE2IHgpOworI2VuZGlmIC8vY2xfa2hyX2ZwNjQKKyNpZmRlZiBjbF9raHJfZnAxNgoraGFsZiBfX292bGQgX19jbmZuIGV4cG0xKGhhbGYgeCk7CitoYWxmMiBfX292bGQgX19jbmZuIGV4cG0xKGhhbGYyIHgpOworaGFsZjMgX19vdmxkIF9fY25mbiBleHBtMShoYWxmMyB4KTsKK2hhbGY0IF9fb3ZsZCBfX2NuZm4gZXhwbTEoaGFsZjQgeCk7CitoYWxmOCBfX292bGQgX19jbmZuIGV4cG0xKGhhbGY4IHgpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gZXhwbTEoaGFsZjE2IHgpOworI2VuZGlmIC8vY2xfa2hyX2ZwMTYKKworLyoqCisgKiBDb21wdXRlIGFic29sdXRlIHZhbHVlIG9mIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyLgorICovCitmbG9hdCBfX292bGQgX19jbmZuIGZhYnMoZmxvYXQpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gZmFicyhmbG9hdDIpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gZmFicyhmbG9hdDMpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gZmFicyhmbG9hdDQpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gZmFicyhmbG9hdDgpOworZmxvYXQxNiBfX292bGQgX19jbmZuIGZhYnMoZmxvYXQxNik7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2RvdWJsZSBfX292bGQgX19jbmZuIGZhYnMoZG91YmxlKTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBmYWJzKGRvdWJsZTIpOworZG91YmxlMyBfX292bGQgX19jbmZuIGZhYnMoZG91YmxlMyk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gZmFicyhkb3VibGU0KTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBmYWJzKGRvdWJsZTgpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBmYWJzKGRvdWJsZTE2KTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2hhbGYgX19vdmxkIF9fY25mbiBmYWJzKGhhbGYpOworaGFsZjIgX19vdmxkIF9fY25mbiBmYWJzKGhhbGYyKTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gZmFicyhoYWxmMyk7CitoYWxmNCBfX292bGQgX19jbmZuIGZhYnMoaGFsZjQpOworaGFsZjggX19vdmxkIF9fY25mbiBmYWJzKGhhbGY4KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIGZhYnMoaGFsZjE2KTsKKyNlbmRpZiAvL2NsX2tocl9mcDE2CisKKy8qKgorICogeCAtIHkgaWYgeCA+IHksICswIGlmIHggaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHkuCisgKi8KK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gZmRpbShmbG9hdCB4LCBmbG9hdCB5KTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIGZkaW0oZmxvYXQyIHgsIGZsb2F0MiB5KTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGZkaW0oZmxvYXQzIHgsIGZsb2F0MyB5KTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIGZkaW0oZmxvYXQ0IHgsIGZsb2F0NCB5KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIGZkaW0oZmxvYXQ4IHgsIGZsb2F0OCB5KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBmZGltKGZsb2F0MTYgeCwgZmxvYXQxNiB5KTsKKyNpZmRlZiBjbF9raHJfZnA2NAorZG91YmxlIF9fb3ZsZCBfX2NuZm4gZmRpbShkb3VibGUgeCwgZG91YmxlIHkpOworZG91YmxlMiBfX292bGQgX19jbmZuIGZkaW0oZG91YmxlMiB4LCBkb3VibGUyIHkpOworZG91YmxlMyBfX292bGQgX19jbmZuIGZkaW0oZG91YmxlMyB4LCBkb3VibGUzIHkpOworZG91YmxlNCBfX292bGQgX19jbmZuIGZkaW0oZG91YmxlNCB4LCBkb3VibGU0IHkpOworZG91YmxlOCBfX292bGQgX19jbmZuIGZkaW0oZG91YmxlOCB4LCBkb3VibGU4IHkpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBmZGltKGRvdWJsZTE2IHgsIGRvdWJsZTE2IHkpOworI2VuZGlmIC8vY2xfa2hyX2ZwNjQKKyNpZmRlZiBjbF9raHJfZnAxNgoraGFsZiBfX292bGQgX19jbmZuIGZkaW0oaGFsZiB4LCBoYWxmIHkpOworaGFsZjIgX19vdmxkIF9fY25mbiBmZGltKGhhbGYyIHgsIGhhbGYyIHkpOworaGFsZjMgX19vdmxkIF9fY25mbiBmZGltKGhhbGYzIHgsIGhhbGYzIHkpOworaGFsZjQgX19vdmxkIF9fY25mbiBmZGltKGhhbGY0IHgsIGhhbGY0IHkpOworaGFsZjggX19vdmxkIF9fY25mbiBmZGltKGhhbGY4IHgsIGhhbGY4IHkpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gZmRpbShoYWxmMTYgeCwgaGFsZjE2IHkpOworI2VuZGlmIC8vY2xfa2hyX2ZwMTYKKworLyoqCisgKiBSb3VuZCB0byBpbnRlZ3JhbCB2YWx1ZSB1c2luZyB0aGUgcm91bmQgdG8gLXZlCisgKiBpbmZpbml0eSByb3VuZGluZyBtb2RlLgorICovCitmbG9hdCBfX292bGQgX19jbmZuIGZsb29yKGZsb2F0KTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIGZsb29yKGZsb2F0Mik7CitmbG9hdDMgX19vdmxkIF9fY25mbiBmbG9vcihmbG9hdDMpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gZmxvb3IoZmxvYXQ0KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIGZsb29yKGZsb2F0OCk7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gZmxvb3IoZmxvYXQxNik7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2RvdWJsZSBfX292bGQgX19jbmZuIGZsb29yKGRvdWJsZSk7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gZmxvb3IoZG91YmxlMik7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gZmxvb3IoZG91YmxlMyk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gZmxvb3IoZG91YmxlNCk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gZmxvb3IoZG91YmxlOCk7Citkb3VibGUxNiBfX292bGQgX19jbmZuIGZsb29yKGRvdWJsZTE2KTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2hhbGYgX19vdmxkIF9fY25mbiBmbG9vcihoYWxmKTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gZmxvb3IoaGFsZjIpOworaGFsZjMgX19vdmxkIF9fY25mbiBmbG9vcihoYWxmMyk7CitoYWxmNCBfX292bGQgX19jbmZuIGZsb29yKGhhbGY0KTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gZmxvb3IoaGFsZjgpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gZmxvb3IoaGFsZjE2KTsKKyNlbmRpZiAvL2NsX2tocl9mcDE2CisKKy8qKgorICogUmV0dXJucyB0aGUgY29ycmVjdGx5IHJvdW5kZWQgZmxvYXRpbmctcG9pbnQKKyAqIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzdW0gb2YgYyB3aXRoIHRoZSBpbmZpbml0ZWx5CisgKiBwcmVjaXNlIHByb2R1Y3Qgb2YgYSBhbmQgYi4gUm91bmRpbmcgb2YKKyAqIGludGVybWVkaWF0ZSBwcm9kdWN0cyBzaGFsbCBub3Qgb2NjdXIuIEVkZ2UgY2FzZQorICogYmVoYXZpb3IgaXMgcGVyIHRoZSBJRUVFIDc1NC0yMDA4IHN0YW5kYXJkLgorICovCitmbG9hdCBfX292bGQgX19jbmZuIGZtYShmbG9hdCBhLCBmbG9hdCBiLCBmbG9hdCBjKTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIGZtYShmbG9hdDIgYSwgZmxvYXQyIGIsIGZsb2F0MiBjKTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGZtYShmbG9hdDMgYSwgZmxvYXQzIGIsIGZsb2F0MyBjKTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIGZtYShmbG9hdDQgYSwgZmxvYXQ0IGIsIGZsb2F0NCBjKTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIGZtYShmbG9hdDggYSwgZmxvYXQ4IGIsIGZsb2F0OCBjKTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBmbWEoZmxvYXQxNiBhLCBmbG9hdDE2IGIsIGZsb2F0MTYgYyk7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2RvdWJsZSBfX292bGQgX19jbmZuIGZtYShkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSBjKTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBmbWEoZG91YmxlMiBhLCBkb3VibGUyIGIsIGRvdWJsZTIgYyk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gZm1hKGRvdWJsZTMgYSwgZG91YmxlMyBiLCBkb3VibGUzIGMpOworZG91YmxlNCBfX292bGQgX19jbmZuIGZtYShkb3VibGU0IGEsIGRvdWJsZTQgYiwgZG91YmxlNCBjKTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBmbWEoZG91YmxlOCBhLCBkb3VibGU4IGIsIGRvdWJsZTggYyk7Citkb3VibGUxNiBfX292bGQgX19jbmZuIGZtYShkb3VibGUxNiBhLCBkb3VibGUxNiBiLCBkb3VibGUxNiBjKTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2hhbGYgX19vdmxkIF9fY25mbiBmbWEoaGFsZiBhLCBoYWxmIGIsIGhhbGYgYyk7CitoYWxmMiBfX292bGQgX19jbmZuIGZtYShoYWxmMiBhLCBoYWxmMiBiLCBoYWxmMiBjKTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gZm1hKGhhbGYzIGEsIGhhbGYzIGIsIGhhbGYzIGMpOworaGFsZjQgX19vdmxkIF9fY25mbiBmbWEoaGFsZjQgYSwgaGFsZjQgYiwgaGFsZjQgYyk7CitoYWxmOCBfX292bGQgX19jbmZuIGZtYShoYWxmOCBhLCBoYWxmOCBiLCBoYWxmOCBjKTsKK2hhbGYxNiBfX292bGQgX19jbmZuIGZtYShoYWxmMTYgYSwgaGFsZjE2IGIsIGhhbGYxNiBjKTsKKyNlbmRpZiAvL2NsX2tocl9mcDE2CisKKy8qKgorICogUmV0dXJucyB5IGlmIHggPCB5LCBvdGhlcndpc2UgaXQgcmV0dXJucyB4LiBJZiBvbmUKKyAqIGFyZ3VtZW50IGlzIGEgTmFOLCBmbWF4KCkgcmV0dXJucyB0aGUgb3RoZXIKKyAqIGFyZ3VtZW50LiBJZiBib3RoIGFyZ3VtZW50cyBhcmUgTmFOcywgZm1heCgpCisgKiByZXR1cm5zIGEgTmFOLgorICovCitmbG9hdCBfX292bGQgX19jbmZuIGZtYXgoZmxvYXQgeCwgZmxvYXQgeSk7CitmbG9hdDIgX19vdmxkIF9fY25mbiBmbWF4KGZsb2F0MiB4LCBmbG9hdDIgeSk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBmbWF4KGZsb2F0MyB4LCBmbG9hdDMgeSk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBmbWF4KGZsb2F0NCB4LCBmbG9hdDQgeSk7CitmbG9hdDggX19vdmxkIF9fY25mbiBmbWF4KGZsb2F0OCB4LCBmbG9hdDggeSk7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gZm1heChmbG9hdDE2IHgsIGZsb2F0MTYgeSk7CitmbG9hdDIgX19vdmxkIF9fY25mbiBmbWF4KGZsb2F0MiB4LCBmbG9hdCB5KTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGZtYXgoZmxvYXQzIHgsIGZsb2F0IHkpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gZm1heChmbG9hdDQgeCwgZmxvYXQgeSk7CitmbG9hdDggX19vdmxkIF9fY25mbiBmbWF4KGZsb2F0OCB4LCBmbG9hdCB5KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBmbWF4KGZsb2F0MTYgeCwgZmxvYXQgeSk7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2RvdWJsZSBfX292bGQgX19jbmZuIGZtYXgoZG91YmxlIHgsIGRvdWJsZSB5KTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBmbWF4KGRvdWJsZTIgeCwgZG91YmxlMiB5KTsKK2RvdWJsZTMgX19vdmxkIF9fY25mbiBmbWF4KGRvdWJsZTMgeCwgZG91YmxlMyB5KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBmbWF4KGRvdWJsZTQgeCwgZG91YmxlNCB5KTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBmbWF4KGRvdWJsZTggeCwgZG91YmxlOCB5KTsKK2RvdWJsZTE2IF9fb3ZsZCBfX2NuZm4gZm1heChkb3VibGUxNiB4LCBkb3VibGUxNiB5KTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBmbWF4KGRvdWJsZTIgeCwgZG91YmxlIHkpOworZG91YmxlMyBfX292bGQgX19jbmZuIGZtYXgoZG91YmxlMyB4LCBkb3VibGUgeSk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gZm1heChkb3VibGU0IHgsIGRvdWJsZSB5KTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBmbWF4KGRvdWJsZTggeCwgZG91YmxlIHkpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBmbWF4KGRvdWJsZTE2IHgsIGRvdWJsZSB5KTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2hhbGYgX19vdmxkIF9fY25mbiBmbWF4KGhhbGYgeCwgaGFsZiB5KTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gZm1heChoYWxmMiB4LCBoYWxmMiB5KTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gZm1heChoYWxmMyB4LCBoYWxmMyB5KTsKK2hhbGY0IF9fb3ZsZCBfX2NuZm4gZm1heChoYWxmNCB4LCBoYWxmNCB5KTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gZm1heChoYWxmOCB4LCBoYWxmOCB5KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIGZtYXgoaGFsZjE2IHgsIGhhbGYxNiB5KTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gZm1heChoYWxmMiB4LCBoYWxmIHkpOworaGFsZjMgX19vdmxkIF9fY25mbiBmbWF4KGhhbGYzIHgsIGhhbGYgeSk7CitoYWxmNCBfX292bGQgX19jbmZuIGZtYXgoaGFsZjQgeCwgaGFsZiB5KTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gZm1heChoYWxmOCB4LCBoYWxmIHkpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gZm1heChoYWxmMTYgeCwgaGFsZiB5KTsKKyNlbmRpZiAvL2NsX2tocl9mcDE2CisKKy8qKgorICogUmV0dXJucyB5IGlmIHkgPCB4LCBvdGhlcndpc2UgaXQgcmV0dXJucyB4LiBJZiBvbmUKKyAqIGFyZ3VtZW50IGlzIGEgTmFOLCBmbWluKCkgcmV0dXJucyB0aGUgb3RoZXIKKyAqIGFyZ3VtZW50LiBJZiBib3RoIGFyZ3VtZW50cyBhcmUgTmFOcywgZm1pbigpCisgKiByZXR1cm5zIGEgTmFOLgorICovCitmbG9hdCBfX292bGQgX19jbmZuIGZtaW4oZmxvYXQgeCwgZmxvYXQgeSk7CitmbG9hdDIgX19vdmxkIF9fY25mbiBmbWluKGZsb2F0MiB4LCBmbG9hdDIgeSk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBmbWluKGZsb2F0MyB4LCBmbG9hdDMgeSk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBmbWluKGZsb2F0NCB4LCBmbG9hdDQgeSk7CitmbG9hdDggX19vdmxkIF9fY25mbiBmbWluKGZsb2F0OCB4LCBmbG9hdDggeSk7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gZm1pbihmbG9hdDE2IHgsIGZsb2F0MTYgeSk7CitmbG9hdDIgX19vdmxkIF9fY25mbiBmbWluKGZsb2F0MiB4LCBmbG9hdCB5KTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGZtaW4oZmxvYXQzIHgsIGZsb2F0IHkpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gZm1pbihmbG9hdDQgeCwgZmxvYXQgeSk7CitmbG9hdDggX19vdmxkIF9fY25mbiBmbWluKGZsb2F0OCB4LCBmbG9hdCB5KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBmbWluKGZsb2F0MTYgeCwgZmxvYXQgeSk7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2RvdWJsZSBfX292bGQgX19jbmZuIGZtaW4oZG91YmxlIHgsIGRvdWJsZSB5KTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBmbWluKGRvdWJsZTIgeCwgZG91YmxlMiB5KTsKK2RvdWJsZTMgX19vdmxkIF9fY25mbiBmbWluKGRvdWJsZTMgeCwgZG91YmxlMyB5KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBmbWluKGRvdWJsZTQgeCwgZG91YmxlNCB5KTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBmbWluKGRvdWJsZTggeCwgZG91YmxlOCB5KTsKK2RvdWJsZTE2IF9fb3ZsZCBfX2NuZm4gZm1pbihkb3VibGUxNiB4LCBkb3VibGUxNiB5KTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBmbWluKGRvdWJsZTIgeCwgZG91YmxlIHkpOworZG91YmxlMyBfX292bGQgX19jbmZuIGZtaW4oZG91YmxlMyB4LCBkb3VibGUgeSk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gZm1pbihkb3VibGU0IHgsIGRvdWJsZSB5KTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBmbWluKGRvdWJsZTggeCwgZG91YmxlIHkpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBmbWluKGRvdWJsZTE2IHgsIGRvdWJsZSB5KTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2hhbGYgX19vdmxkIF9fY25mbiBmbWluKGhhbGYgeCwgaGFsZiB5KTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gZm1pbihoYWxmMiB4LCBoYWxmMiB5KTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gZm1pbihoYWxmMyB4LCBoYWxmMyB5KTsKK2hhbGY0IF9fb3ZsZCBfX2NuZm4gZm1pbihoYWxmNCB4LCBoYWxmNCB5KTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gZm1pbihoYWxmOCB4LCBoYWxmOCB5KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIGZtaW4oaGFsZjE2IHgsIGhhbGYxNiB5KTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gZm1pbihoYWxmMiB4LCBoYWxmIHkpOworaGFsZjMgX19vdmxkIF9fY25mbiBmbWluKGhhbGYzIHgsIGhhbGYgeSk7CitoYWxmNCBfX292bGQgX19jbmZuIGZtaW4oaGFsZjQgeCwgaGFsZiB5KTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gZm1pbihoYWxmOCB4LCBoYWxmIHkpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gZm1pbihoYWxmMTYgeCwgaGFsZiB5KTsKKyNlbmRpZiAvL2NsX2tocl9mcDE2CisKKy8qKgorICogTW9kdWx1cy4gUmV0dXJucyB4IC0geSAqIHRydW5jICh4L3kpLgorICovCitmbG9hdCBfX292bGQgX19jbmZuIGZtb2QoZmxvYXQgeCwgZmxvYXQgeSk7CitmbG9hdDIgX19vdmxkIF9fY25mbiBmbW9kKGZsb2F0MiB4LCBmbG9hdDIgeSk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBmbW9kKGZsb2F0MyB4LCBmbG9hdDMgeSk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBmbW9kKGZsb2F0NCB4LCBmbG9hdDQgeSk7CitmbG9hdDggX19vdmxkIF9fY25mbiBmbW9kKGZsb2F0OCB4LCBmbG9hdDggeSk7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gZm1vZChmbG9hdDE2IHgsIGZsb2F0MTYgeSk7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2RvdWJsZSBfX292bGQgX19jbmZuIGZtb2QoZG91YmxlIHgsIGRvdWJsZSB5KTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBmbW9kKGRvdWJsZTIgeCwgZG91YmxlMiB5KTsKK2RvdWJsZTMgX19vdmxkIF9fY25mbiBmbW9kKGRvdWJsZTMgeCwgZG91YmxlMyB5KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBmbW9kKGRvdWJsZTQgeCwgZG91YmxlNCB5KTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBmbW9kKGRvdWJsZTggeCwgZG91YmxlOCB5KTsKK2RvdWJsZTE2IF9fb3ZsZCBfX2NuZm4gZm1vZChkb3VibGUxNiB4LCBkb3VibGUxNiB5KTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2hhbGYgX19vdmxkIF9fY25mbiBmbW9kKGhhbGYgeCwgaGFsZiB5KTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gZm1vZChoYWxmMiB4LCBoYWxmMiB5KTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gZm1vZChoYWxmMyB4LCBoYWxmMyB5KTsKK2hhbGY0IF9fb3ZsZCBfX2NuZm4gZm1vZChoYWxmNCB4LCBoYWxmNCB5KTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gZm1vZChoYWxmOCB4LCBoYWxmOCB5KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIGZtb2QoaGFsZjE2IHgsIGhhbGYxNiB5KTsKKyNlbmRpZiAvL2NsX2tocl9mcDE2CisKKy8qKgorICogUmV0dXJucyBmbWluKHggLSBmbG9vciAoeCksIDB4MS5mZmZmZmVwLTFmICkuCisgKiBmbG9vcih4KSBpcyByZXR1cm5lZCBpbiBpcHRyLgorICovCisjaWYgX19PUEVOQ0xfQ19WRVJTSU9OX18gPj0gQ0xfVkVSU0lPTl8yXzAKK2Zsb2F0IF9fb3ZsZCBmcmFjdChmbG9hdCB4LCBmbG9hdCAqaXB0cik7CitmbG9hdDIgX19vdmxkIGZyYWN0KGZsb2F0MiB4LCBmbG9hdDIgKmlwdHIpOworZmxvYXQzIF9fb3ZsZCBmcmFjdChmbG9hdDMgeCwgZmxvYXQzICppcHRyKTsKK2Zsb2F0NCBfX292bGQgZnJhY3QoZmxvYXQ0IHgsIGZsb2F0NCAqaXB0cik7CitmbG9hdDggX19vdmxkIGZyYWN0KGZsb2F0OCB4LCBmbG9hdDggKmlwdHIpOworZmxvYXQxNiBfX292bGQgZnJhY3QoZmxvYXQxNiB4LCBmbG9hdDE2ICppcHRyKTsKKyNpZmRlZiBjbF9raHJfZnA2NAorZG91YmxlIF9fb3ZsZCBmcmFjdChkb3VibGUgeCwgZG91YmxlICppcHRyKTsKK2RvdWJsZTIgX19vdmxkIGZyYWN0KGRvdWJsZTIgeCwgZG91YmxlMiAqaXB0cik7Citkb3VibGUzIF9fb3ZsZCBmcmFjdChkb3VibGUzIHgsIGRvdWJsZTMgKmlwdHIpOworZG91YmxlNCBfX292bGQgZnJhY3QoZG91YmxlNCB4LCBkb3VibGU0ICppcHRyKTsKK2RvdWJsZTggX19vdmxkIGZyYWN0KGRvdWJsZTggeCwgZG91YmxlOCAqaXB0cik7Citkb3VibGUxNiBfX292bGQgZnJhY3QoZG91YmxlMTYgeCwgZG91YmxlMTYgKmlwdHIpOworI2VuZGlmIC8vY2xfa2hyX2ZwNjQKKyNpZmRlZiBjbF9raHJfZnAxNgoraGFsZiBfX292bGQgZnJhY3QoaGFsZiB4LCBoYWxmICppcHRyKTsKK2hhbGYyIF9fb3ZsZCBmcmFjdChoYWxmMiB4LCBoYWxmMiAqaXB0cik7CitoYWxmMyBfX292bGQgZnJhY3QoaGFsZjMgeCwgaGFsZjMgKmlwdHIpOworaGFsZjQgX19vdmxkIGZyYWN0KGhhbGY0IHgsIGhhbGY0ICppcHRyKTsKK2hhbGY4IF9fb3ZsZCBmcmFjdChoYWxmOCB4LCBoYWxmOCAqaXB0cik7CitoYWxmMTYgX19vdmxkIGZyYWN0KGhhbGYxNiB4LCBoYWxmMTYgKmlwdHIpOworI2VuZGlmIC8vY2xfa2hyX2ZwMTYKKyNlbHNlCitmbG9hdCBfX292bGQgZnJhY3QoZmxvYXQgeCwgX19nbG9iYWwgZmxvYXQgKmlwdHIpOworZmxvYXQyIF9fb3ZsZCBmcmFjdChmbG9hdDIgeCwgX19nbG9iYWwgZmxvYXQyICppcHRyKTsKK2Zsb2F0MyBfX292bGQgZnJhY3QoZmxvYXQzIHgsIF9fZ2xvYmFsIGZsb2F0MyAqaXB0cik7CitmbG9hdDQgX19vdmxkIGZyYWN0KGZsb2F0NCB4LCBfX2dsb2JhbCBmbG9hdDQgKmlwdHIpOworZmxvYXQ4IF9fb3ZsZCBmcmFjdChmbG9hdDggeCwgX19nbG9iYWwgZmxvYXQ4ICppcHRyKTsKK2Zsb2F0MTYgX19vdmxkIGZyYWN0KGZsb2F0MTYgeCwgX19nbG9iYWwgZmxvYXQxNiAqaXB0cik7CitmbG9hdCBfX292bGQgZnJhY3QoZmxvYXQgeCwgX19sb2NhbCBmbG9hdCAqaXB0cik7CitmbG9hdDIgX19vdmxkIGZyYWN0KGZsb2F0MiB4LCBfX2xvY2FsIGZsb2F0MiAqaXB0cik7CitmbG9hdDMgX19vdmxkIGZyYWN0KGZsb2F0MyB4LCBfX2xvY2FsIGZsb2F0MyAqaXB0cik7CitmbG9hdDQgX19vdmxkIGZyYWN0KGZsb2F0NCB4LCBfX2xvY2FsIGZsb2F0NCAqaXB0cik7CitmbG9hdDggX19vdmxkIGZyYWN0KGZsb2F0OCB4LCBfX2xvY2FsIGZsb2F0OCAqaXB0cik7CitmbG9hdDE2IF9fb3ZsZCBmcmFjdChmbG9hdDE2IHgsIF9fbG9jYWwgZmxvYXQxNiAqaXB0cik7CitmbG9hdCBfX292bGQgZnJhY3QoZmxvYXQgeCwgX19wcml2YXRlIGZsb2F0ICppcHRyKTsKK2Zsb2F0MiBfX292bGQgZnJhY3QoZmxvYXQyIHgsIF9fcHJpdmF0ZSBmbG9hdDIgKmlwdHIpOworZmxvYXQzIF9fb3ZsZCBmcmFjdChmbG9hdDMgeCwgX19wcml2YXRlIGZsb2F0MyAqaXB0cik7CitmbG9hdDQgX19vdmxkIGZyYWN0KGZsb2F0NCB4LCBfX3ByaXZhdGUgZmxvYXQ0ICppcHRyKTsKK2Zsb2F0OCBfX292bGQgZnJhY3QoZmxvYXQ4IHgsIF9fcHJpdmF0ZSBmbG9hdDggKmlwdHIpOworZmxvYXQxNiBfX292bGQgZnJhY3QoZmxvYXQxNiB4LCBfX3ByaXZhdGUgZmxvYXQxNiAqaXB0cik7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2RvdWJsZSBfX292bGQgZnJhY3QoZG91YmxlIHgsIF9fZ2xvYmFsIGRvdWJsZSAqaXB0cik7Citkb3VibGUyIF9fb3ZsZCBmcmFjdChkb3VibGUyIHgsIF9fZ2xvYmFsIGRvdWJsZTIgKmlwdHIpOworZG91YmxlMyBfX292bGQgZnJhY3QoZG91YmxlMyB4LCBfX2dsb2JhbCBkb3VibGUzICppcHRyKTsKK2RvdWJsZTQgX19vdmxkIGZyYWN0KGRvdWJsZTQgeCwgX19nbG9iYWwgZG91YmxlNCAqaXB0cik7Citkb3VibGU4IF9fb3ZsZCBmcmFjdChkb3VibGU4IHgsIF9fZ2xvYmFsIGRvdWJsZTggKmlwdHIpOworZG91YmxlMTYgX19vdmxkIGZyYWN0KGRvdWJsZTE2IHgsIF9fZ2xvYmFsIGRvdWJsZTE2ICppcHRyKTsKK2RvdWJsZSBfX292bGQgZnJhY3QoZG91YmxlIHgsIF9fbG9jYWwgZG91YmxlICppcHRyKTsKK2RvdWJsZTIgX19vdmxkIGZyYWN0KGRvdWJsZTIgeCwgX19sb2NhbCBkb3VibGUyICppcHRyKTsKK2RvdWJsZTMgX19vdmxkIGZyYWN0KGRvdWJsZTMgeCwgX19sb2NhbCBkb3VibGUzICppcHRyKTsKK2RvdWJsZTQgX19vdmxkIGZyYWN0KGRvdWJsZTQgeCwgX19sb2NhbCBkb3VibGU0ICppcHRyKTsKK2RvdWJsZTggX19vdmxkIGZyYWN0KGRvdWJsZTggeCwgX19sb2NhbCBkb3VibGU4ICppcHRyKTsKK2RvdWJsZTE2IF9fb3ZsZCBmcmFjdChkb3VibGUxNiB4LCBfX2xvY2FsIGRvdWJsZTE2ICppcHRyKTsKK2RvdWJsZSBfX292bGQgZnJhY3QoZG91YmxlIHgsIF9fcHJpdmF0ZSBkb3VibGUgKmlwdHIpOworZG91YmxlMiBfX292bGQgZnJhY3QoZG91YmxlMiB4LCBfX3ByaXZhdGUgZG91YmxlMiAqaXB0cik7Citkb3VibGUzIF9fb3ZsZCBmcmFjdChkb3VibGUzIHgsIF9fcHJpdmF0ZSBkb3VibGUzICppcHRyKTsKK2RvdWJsZTQgX19vdmxkIGZyYWN0KGRvdWJsZTQgeCwgX19wcml2YXRlIGRvdWJsZTQgKmlwdHIpOworZG91YmxlOCBfX292bGQgZnJhY3QoZG91YmxlOCB4LCBfX3ByaXZhdGUgZG91YmxlOCAqaXB0cik7Citkb3VibGUxNiBfX292bGQgZnJhY3QoZG91YmxlMTYgeCwgX19wcml2YXRlIGRvdWJsZTE2ICppcHRyKTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2hhbGYgX19vdmxkIGZyYWN0KGhhbGYgeCwgX19nbG9iYWwgaGFsZiAqaXB0cik7CitoYWxmMiBfX292bGQgZnJhY3QoaGFsZjIgeCwgX19nbG9iYWwgaGFsZjIgKmlwdHIpOworaGFsZjMgX19vdmxkIGZyYWN0KGhhbGYzIHgsIF9fZ2xvYmFsIGhhbGYzICppcHRyKTsKK2hhbGY0IF9fb3ZsZCBmcmFjdChoYWxmNCB4LCBfX2dsb2JhbCBoYWxmNCAqaXB0cik7CitoYWxmOCBfX292bGQgZnJhY3QoaGFsZjggeCwgX19nbG9iYWwgaGFsZjggKmlwdHIpOworaGFsZjE2IF9fb3ZsZCBmcmFjdChoYWxmMTYgeCwgX19nbG9iYWwgaGFsZjE2ICppcHRyKTsKK2hhbGYgX19vdmxkIGZyYWN0KGhhbGYgeCwgX19sb2NhbCBoYWxmICppcHRyKTsKK2hhbGYyIF9fb3ZsZCBmcmFjdChoYWxmMiB4LCBfX2xvY2FsIGhhbGYyICppcHRyKTsKK2hhbGYzIF9fb3ZsZCBmcmFjdChoYWxmMyB4LCBfX2xvY2FsIGhhbGYzICppcHRyKTsKK2hhbGY0IF9fb3ZsZCBmcmFjdChoYWxmNCB4LCBfX2xvY2FsIGhhbGY0ICppcHRyKTsKK2hhbGY4IF9fb3ZsZCBmcmFjdChoYWxmOCB4LCBfX2xvY2FsIGhhbGY4ICppcHRyKTsKK2hhbGYxNiBfX292bGQgZnJhY3QoaGFsZjE2IHgsIF9fbG9jYWwgaGFsZjE2ICppcHRyKTsKK2hhbGYgX19vdmxkIGZyYWN0KGhhbGYgeCwgX19wcml2YXRlIGhhbGYgKmlwdHIpOworaGFsZjIgX19vdmxkIGZyYWN0KGhhbGYyIHgsIF9fcHJpdmF0ZSBoYWxmMiAqaXB0cik7CitoYWxmMyBfX292bGQgZnJhY3QoaGFsZjMgeCwgX19wcml2YXRlIGhhbGYzICppcHRyKTsKK2hhbGY0IF9fb3ZsZCBmcmFjdChoYWxmNCB4LCBfX3ByaXZhdGUgaGFsZjQgKmlwdHIpOworaGFsZjggX19vdmxkIGZyYWN0KGhhbGY4IHgsIF9fcHJpdmF0ZSBoYWxmOCAqaXB0cik7CitoYWxmMTYgX19vdmxkIGZyYWN0KGhhbGYxNiB4LCBfX3ByaXZhdGUgaGFsZjE2ICppcHRyKTsKKyNlbmRpZiAvL2NsX2tocl9mcDE2CisjZW5kaWYgLy9fX09QRU5DTF9DX1ZFUlNJT05fXyA+PSBDTF9WRVJTSU9OXzJfMAorCisvKioKKyAqIEV4dHJhY3QgbWFudGlzc2EgYW5kIGV4cG9uZW50IGZyb20geC4gRm9yIGVhY2gKKyAqIGNvbXBvbmVudCB0aGUgbWFudGlzc2EgcmV0dXJuZWQgaXMgYSBmbG9hdCB3aXRoCisgKiBtYWduaXR1ZGUgaW4gdGhlIGludGVydmFsIFsxLzIsIDEpIG9yIDAuIEVhY2gKKyAqIGNvbXBvbmVudCBvZiB4IGVxdWFscyBtYW50aXNzYSByZXR1cm5lZCAqIDJeZXhwLgorICovCisjaWYgX19PUEVOQ0xfQ19WRVJTSU9OX18gPj0gQ0xfVkVSU0lPTl8yXzAKK2Zsb2F0IF9fb3ZsZCBmcmV4cChmbG9hdCB4LCBpbnQgKmV4cCk7CitmbG9hdDIgX19vdmxkIGZyZXhwKGZsb2F0MiB4LCBpbnQyICpleHApOworZmxvYXQzIF9fb3ZsZCBmcmV4cChmbG9hdDMgeCwgaW50MyAqZXhwKTsKK2Zsb2F0NCBfX292bGQgZnJleHAoZmxvYXQ0IHgsIGludDQgKmV4cCk7CitmbG9hdDggX19vdmxkIGZyZXhwKGZsb2F0OCB4LCBpbnQ4ICpleHApOworZmxvYXQxNiBfX292bGQgZnJleHAoZmxvYXQxNiB4LCBpbnQxNiAqZXhwKTsKKyNpZmRlZiBjbF9raHJfZnA2NAorZG91YmxlIF9fb3ZsZCBmcmV4cChkb3VibGUgeCwgaW50ICpleHApOworZG91YmxlMiBfX292bGQgZnJleHAoZG91YmxlMiB4LCBpbnQyICpleHApOworZG91YmxlMyBfX292bGQgZnJleHAoZG91YmxlMyB4LCBpbnQzICpleHApOworZG91YmxlNCBfX292bGQgZnJleHAoZG91YmxlNCB4LCBpbnQ0ICpleHApOworZG91YmxlOCBfX292bGQgZnJleHAoZG91YmxlOCB4LCBpbnQ4ICpleHApOworZG91YmxlMTYgX19vdmxkIGZyZXhwKGRvdWJsZTE2IHgsIGludDE2ICpleHApOworI2VuZGlmIC8vY2xfa2hyX2ZwNjQKKyNpZmRlZiBjbF9raHJfZnAxNgoraGFsZiBfX292bGQgZnJleHAoaGFsZiB4LCBpbnQgKmV4cCk7CitoYWxmMiBfX292bGQgZnJleHAoaGFsZjIgeCwgaW50MiAqZXhwKTsKK2hhbGYzIF9fb3ZsZCBmcmV4cChoYWxmMyB4LCBpbnQzICpleHApOworaGFsZjQgX19vdmxkIGZyZXhwKGhhbGY0IHgsIGludDQgKmV4cCk7CitoYWxmOCBfX292bGQgZnJleHAoaGFsZjggeCwgaW50OCAqZXhwKTsKK2hhbGYxNiBfX292bGQgZnJleHAoaGFsZjE2IHgsIGludDE2ICpleHApOworI2VuZGlmIC8vY2xfa2hyX2ZwMTYKKyNlbHNlCitmbG9hdCBfX292bGQgZnJleHAoZmxvYXQgeCwgX19nbG9iYWwgaW50ICpleHApOworZmxvYXQyIF9fb3ZsZCBmcmV4cChmbG9hdDIgeCwgX19nbG9iYWwgaW50MiAqZXhwKTsKK2Zsb2F0MyBfX292bGQgZnJleHAoZmxvYXQzIHgsIF9fZ2xvYmFsIGludDMgKmV4cCk7CitmbG9hdDQgX19vdmxkIGZyZXhwKGZsb2F0NCB4LCBfX2dsb2JhbCBpbnQ0ICpleHApOworZmxvYXQ4IF9fb3ZsZCBmcmV4cChmbG9hdDggeCwgX19nbG9iYWwgaW50OCAqZXhwKTsKK2Zsb2F0MTYgX19vdmxkIGZyZXhwKGZsb2F0MTYgeCwgX19nbG9iYWwgaW50MTYgKmV4cCk7CitmbG9hdCBfX292bGQgZnJleHAoZmxvYXQgeCwgX19sb2NhbCBpbnQgKmV4cCk7CitmbG9hdDIgX19vdmxkIGZyZXhwKGZsb2F0MiB4LCBfX2xvY2FsIGludDIgKmV4cCk7CitmbG9hdDMgX19vdmxkIGZyZXhwKGZsb2F0MyB4LCBfX2xvY2FsIGludDMgKmV4cCk7CitmbG9hdDQgX19vdmxkIGZyZXhwKGZsb2F0NCB4LCBfX2xvY2FsIGludDQgKmV4cCk7CitmbG9hdDggX19vdmxkIGZyZXhwKGZsb2F0OCB4LCBfX2xvY2FsIGludDggKmV4cCk7CitmbG9hdDE2IF9fb3ZsZCBmcmV4cChmbG9hdDE2IHgsIF9fbG9jYWwgaW50MTYgKmV4cCk7CitmbG9hdCBfX292bGQgZnJleHAoZmxvYXQgeCwgX19wcml2YXRlIGludCAqZXhwKTsKK2Zsb2F0MiBfX292bGQgZnJleHAoZmxvYXQyIHgsIF9fcHJpdmF0ZSBpbnQyICpleHApOworZmxvYXQzIF9fb3ZsZCBmcmV4cChmbG9hdDMgeCwgX19wcml2YXRlIGludDMgKmV4cCk7CitmbG9hdDQgX19vdmxkIGZyZXhwKGZsb2F0NCB4LCBfX3ByaXZhdGUgaW50NCAqZXhwKTsKK2Zsb2F0OCBfX292bGQgZnJleHAoZmxvYXQ4IHgsIF9fcHJpdmF0ZSBpbnQ4ICpleHApOworZmxvYXQxNiBfX292bGQgZnJleHAoZmxvYXQxNiB4LCBfX3ByaXZhdGUgaW50MTYgKmV4cCk7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2RvdWJsZSBfX292bGQgZnJleHAoZG91YmxlIHgsIF9fZ2xvYmFsIGludCAqZXhwKTsKK2RvdWJsZTIgX19vdmxkIGZyZXhwKGRvdWJsZTIgeCwgX19nbG9iYWwgaW50MiAqZXhwKTsKK2RvdWJsZTMgX19vdmxkIGZyZXhwKGRvdWJsZTMgeCwgX19nbG9iYWwgaW50MyAqZXhwKTsKK2RvdWJsZTQgX19vdmxkIGZyZXhwKGRvdWJsZTQgeCwgX19nbG9iYWwgaW50NCAqZXhwKTsKK2RvdWJsZTggX19vdmxkIGZyZXhwKGRvdWJsZTggeCwgX19nbG9iYWwgaW50OCAqZXhwKTsKK2RvdWJsZTE2IF9fb3ZsZCBmcmV4cChkb3VibGUxNiB4LCBfX2dsb2JhbCBpbnQxNiAqZXhwKTsKK2RvdWJsZSBfX292bGQgZnJleHAoZG91YmxlIHgsIF9fbG9jYWwgaW50ICpleHApOworZG91YmxlMiBfX292bGQgZnJleHAoZG91YmxlMiB4LCBfX2xvY2FsIGludDIgKmV4cCk7Citkb3VibGUzIF9fb3ZsZCBmcmV4cChkb3VibGUzIHgsIF9fbG9jYWwgaW50MyAqZXhwKTsKK2RvdWJsZTQgX19vdmxkIGZyZXhwKGRvdWJsZTQgeCwgX19sb2NhbCBpbnQ0ICpleHApOworZG91YmxlOCBfX292bGQgZnJleHAoZG91YmxlOCB4LCBfX2xvY2FsIGludDggKmV4cCk7Citkb3VibGUxNiBfX292bGQgZnJleHAoZG91YmxlMTYgeCwgX19sb2NhbCBpbnQxNiAqZXhwKTsKK2RvdWJsZSBfX292bGQgZnJleHAoZG91YmxlIHgsIF9fcHJpdmF0ZSBpbnQgKmV4cCk7Citkb3VibGUyIF9fb3ZsZCBmcmV4cChkb3VibGUyIHgsIF9fcHJpdmF0ZSBpbnQyICpleHApOworZG91YmxlMyBfX292bGQgZnJleHAoZG91YmxlMyB4LCBfX3ByaXZhdGUgaW50MyAqZXhwKTsKK2RvdWJsZTQgX19vdmxkIGZyZXhwKGRvdWJsZTQgeCwgX19wcml2YXRlIGludDQgKmV4cCk7Citkb3VibGU4IF9fb3ZsZCBmcmV4cChkb3VibGU4IHgsIF9fcHJpdmF0ZSBpbnQ4ICpleHApOworZG91YmxlMTYgX19vdmxkIGZyZXhwKGRvdWJsZTE2IHgsIF9fcHJpdmF0ZSBpbnQxNiAqZXhwKTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2hhbGYgX19vdmxkIGZyZXhwKGhhbGYgeCwgX19nbG9iYWwgaW50ICpleHApOworaGFsZjIgX19vdmxkIGZyZXhwKGhhbGYyIHgsIF9fZ2xvYmFsIGludDIgKmV4cCk7CitoYWxmMyBfX292bGQgZnJleHAoaGFsZjMgeCwgX19nbG9iYWwgaW50MyAqZXhwKTsKK2hhbGY0IF9fb3ZsZCBmcmV4cChoYWxmNCB4LCBfX2dsb2JhbCBpbnQ0ICpleHApOworaGFsZjggX19vdmxkIGZyZXhwKGhhbGY4IHgsIF9fZ2xvYmFsIGludDggKmV4cCk7CitoYWxmMTYgX19vdmxkIGZyZXhwKGhhbGYxNiB4LCBfX2dsb2JhbCBpbnQxNiAqZXhwKTsKK2hhbGYgX19vdmxkIGZyZXhwKGhhbGYgeCwgX19sb2NhbCBpbnQgKmV4cCk7CitoYWxmMiBfX292bGQgZnJleHAoaGFsZjIgeCwgX19sb2NhbCBpbnQyICpleHApOworaGFsZjMgX19vdmxkIGZyZXhwKGhhbGYzIHgsIF9fbG9jYWwgaW50MyAqZXhwKTsKK2hhbGY0IF9fb3ZsZCBmcmV4cChoYWxmNCB4LCBfX2xvY2FsIGludDQgKmV4cCk7CitoYWxmOCBfX292bGQgZnJleHAoaGFsZjggeCwgX19sb2NhbCBpbnQ4ICpleHApOworaGFsZjE2IF9fb3ZsZCBmcmV4cChoYWxmMTYgeCwgX19sb2NhbCBpbnQxNiAqZXhwKTsKK2hhbGYgX19vdmxkIGZyZXhwKGhhbGYgeCwgX19wcml2YXRlIGludCAqZXhwKTsKK2hhbGYyIF9fb3ZsZCBmcmV4cChoYWxmMiB4LCBfX3ByaXZhdGUgaW50MiAqZXhwKTsKK2hhbGYzIF9fb3ZsZCBmcmV4cChoYWxmMyB4LCBfX3ByaXZhdGUgaW50MyAqZXhwKTsKK2hhbGY0IF9fb3ZsZCBmcmV4cChoYWxmNCB4LCBfX3ByaXZhdGUgaW50NCAqZXhwKTsKK2hhbGY4IF9fb3ZsZCBmcmV4cChoYWxmOCB4LCBfX3ByaXZhdGUgaW50OCAqZXhwKTsKK2hhbGYxNiBfX292bGQgZnJleHAoaGFsZjE2IHgsIF9fcHJpdmF0ZSBpbnQxNiAqZXhwKTsKKyNlbmRpZiAvL2NsX2tocl9mcDE2CisjZW5kaWYgLy9fX09QRU5DTF9DX1ZFUlNJT05fXyA+PSBDTF9WRVJTSU9OXzJfMAorCisvKioKKyAqIENvbXB1dGUgdGhlIHZhbHVlIG9mIHRoZSBzcXVhcmUgcm9vdCBvZiB4XjIgKyB5XjIKKyAqIHdpdGhvdXQgdW5kdWUgb3ZlcmZsb3cgb3IgdW5kZXJmbG93LgorICovCitmbG9hdCBfX292bGQgX19jbmZuIGh5cG90KGZsb2F0IHgsIGZsb2F0IHkpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gaHlwb3QoZmxvYXQyIHgsIGZsb2F0MiB5KTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGh5cG90KGZsb2F0MyB4LCBmbG9hdDMgeSk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBoeXBvdChmbG9hdDQgeCwgZmxvYXQ0IHkpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gaHlwb3QoZmxvYXQ4IHgsIGZsb2F0OCB5KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBoeXBvdChmbG9hdDE2IHgsIGZsb2F0MTYgeSk7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2RvdWJsZSBfX292bGQgX19jbmZuIGh5cG90KGRvdWJsZSB4LCBkb3VibGUgeSk7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gaHlwb3QoZG91YmxlMiB4LCBkb3VibGUyIHkpOworZG91YmxlMyBfX292bGQgX19jbmZuIGh5cG90KGRvdWJsZTMgeCwgZG91YmxlMyB5KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBoeXBvdChkb3VibGU0IHgsIGRvdWJsZTQgeSk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gaHlwb3QoZG91YmxlOCB4LCBkb3VibGU4IHkpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBoeXBvdChkb3VibGUxNiB4LCBkb3VibGUxNiB5KTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2hhbGYgX19vdmxkIF9fY25mbiBoeXBvdChoYWxmIHgsIGhhbGYgeSk7CitoYWxmMiBfX292bGQgX19jbmZuIGh5cG90KGhhbGYyIHgsIGhhbGYyIHkpOworaGFsZjMgX19vdmxkIF9fY25mbiBoeXBvdChoYWxmMyB4LCBoYWxmMyB5KTsKK2hhbGY0IF9fb3ZsZCBfX2NuZm4gaHlwb3QoaGFsZjQgeCwgaGFsZjQgeSk7CitoYWxmOCBfX292bGQgX19jbmZuIGh5cG90KGhhbGY4IHgsIGhhbGY4IHkpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gaHlwb3QoaGFsZjE2IHgsIGhhbGYxNiB5KTsKKyNlbmRpZiAvL2NsX2tocl9mcDE2CisKKy8qKgorICogUmV0dXJuIHRoZSBleHBvbmVudCBhcyBhbiBpbnRlZ2VyIHZhbHVlLgorICovCitpbnQgX19vdmxkIF9fY25mbiBpbG9nYihmbG9hdCB4KTsKK2ludDIgX19vdmxkIF9fY25mbiBpbG9nYihmbG9hdDIgeCk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gaWxvZ2IoZmxvYXQzIHgpOworaW50NCBfX292bGQgX19jbmZuIGlsb2diKGZsb2F0NCB4KTsKK2ludDggX19vdmxkIF9fY25mbiBpbG9nYihmbG9hdDggeCk7CitpbnQxNiBfX292bGQgX19jbmZuIGlsb2diKGZsb2F0MTYgeCk7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2ludCBfX292bGQgX19jbmZuIGlsb2diKGRvdWJsZSB4KTsKK2ludDIgX19vdmxkIF9fY25mbiBpbG9nYihkb3VibGUyIHgpOworaW50MyBfX292bGQgX19jbmZuIGlsb2diKGRvdWJsZTMgeCk7CitpbnQ0IF9fb3ZsZCBfX2NuZm4gaWxvZ2IoZG91YmxlNCB4KTsKK2ludDggX19vdmxkIF9fY25mbiBpbG9nYihkb3VibGU4IHgpOworaW50MTYgX19vdmxkIF9fY25mbiBpbG9nYihkb3VibGUxNiB4KTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2ludCBfX292bGQgX19jbmZuIGlsb2diKGhhbGYgeCk7CitpbnQyIF9fb3ZsZCBfX2NuZm4gaWxvZ2IoaGFsZjIgeCk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gaWxvZ2IoaGFsZjMgeCk7CitpbnQ0IF9fb3ZsZCBfX2NuZm4gaWxvZ2IoaGFsZjQgeCk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gaWxvZ2IoaGFsZjggeCk7CitpbnQxNiBfX292bGQgX19jbmZuIGlsb2diKGhhbGYxNiB4KTsKKyNlbmRpZiAvL2NsX2tocl9mcDE2CisKKy8qKgorICogTXVsdGlwbHkgeCBieSAyIHRvIHRoZSBwb3dlciBuLgorICovCitmbG9hdCBfX292bGQgX19jbmZuIGxkZXhwKGZsb2F0IHgsIGludCBuKTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIGxkZXhwKGZsb2F0MiB4LCBpbnQyIG4pOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gbGRleHAoZmxvYXQzIHgsIGludDMgbik7CitmbG9hdDQgX19vdmxkIF9fY25mbiBsZGV4cChmbG9hdDQgeCwgaW50NCBuKTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIGxkZXhwKGZsb2F0OCB4LCBpbnQ4IG4pOworZmxvYXQxNiBfX292bGQgX19jbmZuIGxkZXhwKGZsb2F0MTYgeCwgaW50MTYgbik7CitmbG9hdDIgX19vdmxkIF9fY25mbiBsZGV4cChmbG9hdDIgeCwgaW50IG4pOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gbGRleHAoZmxvYXQzIHgsIGludCBuKTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIGxkZXhwKGZsb2F0NCB4LCBpbnQgbik7CitmbG9hdDggX19vdmxkIF9fY25mbiBsZGV4cChmbG9hdDggeCwgaW50IG4pOworZmxvYXQxNiBfX292bGQgX19jbmZuIGxkZXhwKGZsb2F0MTYgeCwgaW50IG4pOworI2lmZGVmIGNsX2tocl9mcDY0Citkb3VibGUgX19vdmxkIF9fY25mbiBsZGV4cChkb3VibGUgeCwgaW50IG4pOworZG91YmxlMiBfX292bGQgX19jbmZuIGxkZXhwKGRvdWJsZTIgeCwgaW50MiBuKTsKK2RvdWJsZTMgX19vdmxkIF9fY25mbiBsZGV4cChkb3VibGUzIHgsIGludDMgbik7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gbGRleHAoZG91YmxlNCB4LCBpbnQ0IG4pOworZG91YmxlOCBfX292bGQgX19jbmZuIGxkZXhwKGRvdWJsZTggeCwgaW50OCBuKTsKK2RvdWJsZTE2IF9fb3ZsZCBfX2NuZm4gbGRleHAoZG91YmxlMTYgeCwgaW50MTYgbik7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gbGRleHAoZG91YmxlMiB4LCBpbnQgbik7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gbGRleHAoZG91YmxlMyB4LCBpbnQgbik7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gbGRleHAoZG91YmxlNCB4LCBpbnQgbik7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gbGRleHAoZG91YmxlOCB4LCBpbnQgbik7Citkb3VibGUxNiBfX292bGQgX19jbmZuIGxkZXhwKGRvdWJsZTE2IHgsIGludCBuKTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2hhbGYgX19vdmxkIF9fY25mbiBsZGV4cChoYWxmIHgsIGludCBuKTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gbGRleHAoaGFsZjIgeCwgaW50MiBuKTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gbGRleHAoaGFsZjMgeCwgaW50MyBuKTsKK2hhbGY0IF9fb3ZsZCBfX2NuZm4gbGRleHAoaGFsZjQgeCwgaW50NCBuKTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gbGRleHAoaGFsZjggeCwgaW50OCBuKTsKK2hhbGYxNiBfX292bGQgX19jbmZuIGxkZXhwKGhhbGYxNiB4LCBpbnQxNiBuKTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gbGRleHAoaGFsZjIgeCwgaW50IG4pOworaGFsZjMgX19vdmxkIF9fY25mbiBsZGV4cChoYWxmMyB4LCBpbnQgbik7CitoYWxmNCBfX292bGQgX19jbmZuIGxkZXhwKGhhbGY0IHgsIGludCBuKTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gbGRleHAoaGFsZjggeCwgaW50IG4pOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gbGRleHAoaGFsZjE2IHgsIGludCBuKTsKKyNlbmRpZiAvL2NsX2tocl9mcDE2CisKKy8qKgorICogTG9nIGdhbW1hIGZ1bmN0aW9uLiBSZXR1cm5zIHRoZSBuYXR1cmFsCisgKiBsb2dhcml0aG0gb2YgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBnYW1tYQorICogZnVuY3Rpb24uIFRoZSBzaWduIG9mIHRoZSBnYW1tYSBmdW5jdGlvbiBpcworICogcmV0dXJuZWQgaW4gdGhlIHNpZ25wIGFyZ3VtZW50IG9mIGxnYW1tYV9yLgorICovCitmbG9hdCBfX292bGQgX19jbmZuIGxnYW1tYShmbG9hdCB4KTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIGxnYW1tYShmbG9hdDIgeCk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBsZ2FtbWEoZmxvYXQzIHgpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gbGdhbW1hKGZsb2F0NCB4KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIGxnYW1tYShmbG9hdDggeCk7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gbGdhbW1hKGZsb2F0MTYgeCk7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2RvdWJsZSBfX292bGQgX19jbmZuIGxnYW1tYShkb3VibGUgeCk7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gbGdhbW1hKGRvdWJsZTIgeCk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gbGdhbW1hKGRvdWJsZTMgeCk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gbGdhbW1hKGRvdWJsZTQgeCk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gbGdhbW1hKGRvdWJsZTggeCk7Citkb3VibGUxNiBfX292bGQgX19jbmZuIGxnYW1tYShkb3VibGUxNiB4KTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2hhbGYgX19vdmxkIF9fY25mbiBsZ2FtbWEoaGFsZiB4KTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gbGdhbW1hKGhhbGYyIHgpOworaGFsZjMgX19vdmxkIF9fY25mbiBsZ2FtbWEoaGFsZjMgeCk7CitoYWxmNCBfX292bGQgX19jbmZuIGxnYW1tYShoYWxmNCB4KTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gbGdhbW1hKGhhbGY4IHgpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gbGdhbW1hKGhhbGYxNiB4KTsKKyNlbmRpZiAvL2NsX2tocl9mcDE2CisKKyNpZiBfX09QRU5DTF9DX1ZFUlNJT05fXyA+PSBDTF9WRVJTSU9OXzJfMAorZmxvYXQgX19vdmxkIGxnYW1tYV9yKGZsb2F0IHgsIGludCAqc2lnbnApOworZmxvYXQyIF9fb3ZsZCBsZ2FtbWFfcihmbG9hdDIgeCwgaW50MiAqc2lnbnApOworZmxvYXQzIF9fb3ZsZCBsZ2FtbWFfcihmbG9hdDMgeCwgaW50MyAqc2lnbnApOworZmxvYXQ0IF9fb3ZsZCBsZ2FtbWFfcihmbG9hdDQgeCwgaW50NCAqc2lnbnApOworZmxvYXQ4IF9fb3ZsZCBsZ2FtbWFfcihmbG9hdDggeCwgaW50OCAqc2lnbnApOworZmxvYXQxNiBfX292bGQgbGdhbW1hX3IoZmxvYXQxNiB4LCBpbnQxNiAqc2lnbnApOworI2lmZGVmIGNsX2tocl9mcDY0Citkb3VibGUgX19vdmxkIGxnYW1tYV9yKGRvdWJsZSB4LCBpbnQgKnNpZ25wKTsKK2RvdWJsZTIgX19vdmxkIGxnYW1tYV9yKGRvdWJsZTIgeCwgaW50MiAqc2lnbnApOworZG91YmxlMyBfX292bGQgbGdhbW1hX3IoZG91YmxlMyB4LCBpbnQzICpzaWducCk7Citkb3VibGU0IF9fb3ZsZCBsZ2FtbWFfcihkb3VibGU0IHgsIGludDQgKnNpZ25wKTsKK2RvdWJsZTggX19vdmxkIGxnYW1tYV9yKGRvdWJsZTggeCwgaW50OCAqc2lnbnApOworZG91YmxlMTYgX19vdmxkIGxnYW1tYV9yKGRvdWJsZTE2IHgsIGludDE2ICpzaWducCk7CisjZW5kaWYgLy9jbF9raHJfZnA2NAorI2lmZGVmIGNsX2tocl9mcDE2CitoYWxmIF9fb3ZsZCBsZ2FtbWFfcihoYWxmIHgsIGludCAqc2lnbnApOworaGFsZjIgX19vdmxkIGxnYW1tYV9yKGhhbGYyIHgsIGludDIgKnNpZ25wKTsKK2hhbGYzIF9fb3ZsZCBsZ2FtbWFfcihoYWxmMyB4LCBpbnQzICpzaWducCk7CitoYWxmNCBfX292bGQgbGdhbW1hX3IoaGFsZjQgeCwgaW50NCAqc2lnbnApOworaGFsZjggX19vdmxkIGxnYW1tYV9yKGhhbGY4IHgsIGludDggKnNpZ25wKTsKK2hhbGYxNiBfX292bGQgbGdhbW1hX3IoaGFsZjE2IHgsIGludDE2ICpzaWducCk7CisjZW5kaWYgLy9jbF9raHJfZnAxNgorI2Vsc2UKK2Zsb2F0IF9fb3ZsZCBsZ2FtbWFfcihmbG9hdCB4LCBfX2dsb2JhbCBpbnQgKnNpZ25wKTsKK2Zsb2F0MiBfX292bGQgbGdhbW1hX3IoZmxvYXQyIHgsIF9fZ2xvYmFsIGludDIgKnNpZ25wKTsKK2Zsb2F0MyBfX292bGQgbGdhbW1hX3IoZmxvYXQzIHgsIF9fZ2xvYmFsIGludDMgKnNpZ25wKTsKK2Zsb2F0NCBfX292bGQgbGdhbW1hX3IoZmxvYXQ0IHgsIF9fZ2xvYmFsIGludDQgKnNpZ25wKTsKK2Zsb2F0OCBfX292bGQgbGdhbW1hX3IoZmxvYXQ4IHgsIF9fZ2xvYmFsIGludDggKnNpZ25wKTsKK2Zsb2F0MTYgX19vdmxkIGxnYW1tYV9yKGZsb2F0MTYgeCwgX19nbG9iYWwgaW50MTYgKnNpZ25wKTsKK2Zsb2F0IF9fb3ZsZCBsZ2FtbWFfcihmbG9hdCB4LCBfX2xvY2FsIGludCAqc2lnbnApOworZmxvYXQyIF9fb3ZsZCBsZ2FtbWFfcihmbG9hdDIgeCwgX19sb2NhbCBpbnQyICpzaWducCk7CitmbG9hdDMgX19vdmxkIGxnYW1tYV9yKGZsb2F0MyB4LCBfX2xvY2FsIGludDMgKnNpZ25wKTsKK2Zsb2F0NCBfX292bGQgbGdhbW1hX3IoZmxvYXQ0IHgsIF9fbG9jYWwgaW50NCAqc2lnbnApOworZmxvYXQ4IF9fb3ZsZCBsZ2FtbWFfcihmbG9hdDggeCwgX19sb2NhbCBpbnQ4ICpzaWducCk7CitmbG9hdDE2IF9fb3ZsZCBsZ2FtbWFfcihmbG9hdDE2IHgsIF9fbG9jYWwgaW50MTYgKnNpZ25wKTsKK2Zsb2F0IF9fb3ZsZCBsZ2FtbWFfcihmbG9hdCB4LCBfX3ByaXZhdGUgaW50ICpzaWducCk7CitmbG9hdDIgX19vdmxkIGxnYW1tYV9yKGZsb2F0MiB4LCBfX3ByaXZhdGUgaW50MiAqc2lnbnApOworZmxvYXQzIF9fb3ZsZCBsZ2FtbWFfcihmbG9hdDMgeCwgX19wcml2YXRlIGludDMgKnNpZ25wKTsKK2Zsb2F0NCBfX292bGQgbGdhbW1hX3IoZmxvYXQ0IHgsIF9fcHJpdmF0ZSBpbnQ0ICpzaWducCk7CitmbG9hdDggX19vdmxkIGxnYW1tYV9yKGZsb2F0OCB4LCBfX3ByaXZhdGUgaW50OCAqc2lnbnApOworZmxvYXQxNiBfX292bGQgbGdhbW1hX3IoZmxvYXQxNiB4LCBfX3ByaXZhdGUgaW50MTYgKnNpZ25wKTsKKyNpZmRlZiBjbF9raHJfZnA2NAorZG91YmxlIF9fb3ZsZCBsZ2FtbWFfcihkb3VibGUgeCwgX19nbG9iYWwgaW50ICpzaWducCk7Citkb3VibGUyIF9fb3ZsZCBsZ2FtbWFfcihkb3VibGUyIHgsIF9fZ2xvYmFsIGludDIgKnNpZ25wKTsKK2RvdWJsZTMgX19vdmxkIGxnYW1tYV9yKGRvdWJsZTMgeCwgX19nbG9iYWwgaW50MyAqc2lnbnApOworZG91YmxlNCBfX292bGQgbGdhbW1hX3IoZG91YmxlNCB4LCBfX2dsb2JhbCBpbnQ0ICpzaWducCk7Citkb3VibGU4IF9fb3ZsZCBsZ2FtbWFfcihkb3VibGU4IHgsIF9fZ2xvYmFsIGludDggKnNpZ25wKTsKK2RvdWJsZTE2IF9fb3ZsZCBsZ2FtbWFfcihkb3VibGUxNiB4LCBfX2dsb2JhbCBpbnQxNiAqc2lnbnApOworZG91YmxlIF9fb3ZsZCBsZ2FtbWFfcihkb3VibGUgeCwgX19sb2NhbCBpbnQgKnNpZ25wKTsKK2RvdWJsZTIgX19vdmxkIGxnYW1tYV9yKGRvdWJsZTIgeCwgX19sb2NhbCBpbnQyICpzaWducCk7Citkb3VibGUzIF9fb3ZsZCBsZ2FtbWFfcihkb3VibGUzIHgsIF9fbG9jYWwgaW50MyAqc2lnbnApOworZG91YmxlNCBfX292bGQgbGdhbW1hX3IoZG91YmxlNCB4LCBfX2xvY2FsIGludDQgKnNpZ25wKTsKK2RvdWJsZTggX19vdmxkIGxnYW1tYV9yKGRvdWJsZTggeCwgX19sb2NhbCBpbnQ4ICpzaWducCk7Citkb3VibGUxNiBfX292bGQgbGdhbW1hX3IoZG91YmxlMTYgeCwgX19sb2NhbCBpbnQxNiAqc2lnbnApOworZG91YmxlIF9fb3ZsZCBsZ2FtbWFfcihkb3VibGUgeCwgX19wcml2YXRlIGludCAqc2lnbnApOworZG91YmxlMiBfX292bGQgbGdhbW1hX3IoZG91YmxlMiB4LCBfX3ByaXZhdGUgaW50MiAqc2lnbnApOworZG91YmxlMyBfX292bGQgbGdhbW1hX3IoZG91YmxlMyB4LCBfX3ByaXZhdGUgaW50MyAqc2lnbnApOworZG91YmxlNCBfX292bGQgbGdhbW1hX3IoZG91YmxlNCB4LCBfX3ByaXZhdGUgaW50NCAqc2lnbnApOworZG91YmxlOCBfX292bGQgbGdhbW1hX3IoZG91YmxlOCB4LCBfX3ByaXZhdGUgaW50OCAqc2lnbnApOworZG91YmxlMTYgX19vdmxkIGxnYW1tYV9yKGRvdWJsZTE2IHgsIF9fcHJpdmF0ZSBpbnQxNiAqc2lnbnApOworI2VuZGlmIC8vY2xfa2hyX2ZwNjQKKyNpZmRlZiBjbF9raHJfZnAxNgoraGFsZiBfX292bGQgbGdhbW1hX3IoaGFsZiB4LCBfX2dsb2JhbCBpbnQgKnNpZ25wKTsKK2hhbGYyIF9fb3ZsZCBsZ2FtbWFfcihoYWxmMiB4LCBfX2dsb2JhbCBpbnQyICpzaWducCk7CitoYWxmMyBfX292bGQgbGdhbW1hX3IoaGFsZjMgeCwgX19nbG9iYWwgaW50MyAqc2lnbnApOworaGFsZjQgX19vdmxkIGxnYW1tYV9yKGhhbGY0IHgsIF9fZ2xvYmFsIGludDQgKnNpZ25wKTsKK2hhbGY4IF9fb3ZsZCBsZ2FtbWFfcihoYWxmOCB4LCBfX2dsb2JhbCBpbnQ4ICpzaWducCk7CitoYWxmMTYgX19vdmxkIGxnYW1tYV9yKGhhbGYxNiB4LCBfX2dsb2JhbCBpbnQxNiAqc2lnbnApOworaGFsZiBfX292bGQgbGdhbW1hX3IoaGFsZiB4LCBfX2xvY2FsIGludCAqc2lnbnApOworaGFsZjIgX19vdmxkIGxnYW1tYV9yKGhhbGYyIHgsIF9fbG9jYWwgaW50MiAqc2lnbnApOworaGFsZjMgX19vdmxkIGxnYW1tYV9yKGhhbGYzIHgsIF9fbG9jYWwgaW50MyAqc2lnbnApOworaGFsZjQgX19vdmxkIGxnYW1tYV9yKGhhbGY0IHgsIF9fbG9jYWwgaW50NCAqc2lnbnApOworaGFsZjggX19vdmxkIGxnYW1tYV9yKGhhbGY4IHgsIF9fbG9jYWwgaW50OCAqc2lnbnApOworaGFsZjE2IF9fb3ZsZCBsZ2FtbWFfcihoYWxmMTYgeCwgX19sb2NhbCBpbnQxNiAqc2lnbnApOworaGFsZiBfX292bGQgbGdhbW1hX3IoaGFsZiB4LCBfX3ByaXZhdGUgaW50ICpzaWducCk7CitoYWxmMiBfX292bGQgbGdhbW1hX3IoaGFsZjIgeCwgX19wcml2YXRlIGludDIgKnNpZ25wKTsKK2hhbGYzIF9fb3ZsZCBsZ2FtbWFfcihoYWxmMyB4LCBfX3ByaXZhdGUgaW50MyAqc2lnbnApOworaGFsZjQgX19vdmxkIGxnYW1tYV9yKGhhbGY0IHgsIF9fcHJpdmF0ZSBpbnQ0ICpzaWducCk7CitoYWxmOCBfX292bGQgbGdhbW1hX3IoaGFsZjggeCwgX19wcml2YXRlIGludDggKnNpZ25wKTsKK2hhbGYxNiBfX292bGQgbGdhbW1hX3IoaGFsZjE2IHgsIF9fcHJpdmF0ZSBpbnQxNiAqc2lnbnApOworI2VuZGlmIC8vY2xfa2hyX2ZwMTYKKyNlbmRpZiAvL19fT1BFTkNMX0NfVkVSU0lPTl9fID49IENMX1ZFUlNJT05fMl8wCisKKy8qKgorICogQ29tcHV0ZSBuYXR1cmFsIGxvZ2FyaXRobS4KKyAqLworZmxvYXQgX19vdmxkIF9fY25mbiBsb2coZmxvYXQpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gbG9nKGZsb2F0Mik7CitmbG9hdDMgX19vdmxkIF9fY25mbiBsb2coZmxvYXQzKTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIGxvZyhmbG9hdDQpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gbG9nKGZsb2F0OCk7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gbG9nKGZsb2F0MTYpOworI2lmZGVmIGNsX2tocl9mcDY0Citkb3VibGUgX19vdmxkIF9fY25mbiBsb2coZG91YmxlKTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBsb2coZG91YmxlMik7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gbG9nKGRvdWJsZTMpOworZG91YmxlNCBfX292bGQgX19jbmZuIGxvZyhkb3VibGU0KTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBsb2coZG91YmxlOCk7Citkb3VibGUxNiBfX292bGQgX19jbmZuIGxvZyhkb3VibGUxNik7CisjZW5kaWYgLy9jbF9raHJfZnA2NAorI2lmZGVmIGNsX2tocl9mcDE2CitoYWxmIF9fb3ZsZCBfX2NuZm4gbG9nKGhhbGYpOworaGFsZjIgX19vdmxkIF9fY25mbiBsb2coaGFsZjIpOworaGFsZjMgX19vdmxkIF9fY25mbiBsb2coaGFsZjMpOworaGFsZjQgX19vdmxkIF9fY25mbiBsb2coaGFsZjQpOworaGFsZjggX19vdmxkIF9fY25mbiBsb2coaGFsZjgpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gbG9nKGhhbGYxNik7CisjZW5kaWYgLy9jbF9raHJfZnAxNgorCisvKioKKyAqIENvbXB1dGUgYSBiYXNlIDIgbG9nYXJpdGhtLgorICovCitmbG9hdCBfX292bGQgX19jbmZuIGxvZzIoZmxvYXQpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gbG9nMihmbG9hdDIpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gbG9nMihmbG9hdDMpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gbG9nMihmbG9hdDQpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gbG9nMihmbG9hdDgpOworZmxvYXQxNiBfX292bGQgX19jbmZuIGxvZzIoZmxvYXQxNik7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2RvdWJsZSBfX292bGQgX19jbmZuIGxvZzIoZG91YmxlKTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBsb2cyKGRvdWJsZTIpOworZG91YmxlMyBfX292bGQgX19jbmZuIGxvZzIoZG91YmxlMyk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gbG9nMihkb3VibGU0KTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBsb2cyKGRvdWJsZTgpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBsb2cyKGRvdWJsZTE2KTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2hhbGYgX19vdmxkIF9fY25mbiBsb2cyKGhhbGYpOworaGFsZjIgX19vdmxkIF9fY25mbiBsb2cyKGhhbGYyKTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gbG9nMihoYWxmMyk7CitoYWxmNCBfX292bGQgX19jbmZuIGxvZzIoaGFsZjQpOworaGFsZjggX19vdmxkIF9fY25mbiBsb2cyKGhhbGY4KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIGxvZzIoaGFsZjE2KTsKKyNlbmRpZiAvL2NsX2tocl9mcDE2CisKKy8qKgorICogQ29tcHV0ZSBhIGJhc2UgMTAgbG9nYXJpdGhtLgorICovCitmbG9hdCBfX292bGQgX19jbmZuIGxvZzEwKGZsb2F0KTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIGxvZzEwKGZsb2F0Mik7CitmbG9hdDMgX19vdmxkIF9fY25mbiBsb2cxMChmbG9hdDMpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gbG9nMTAoZmxvYXQ0KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIGxvZzEwKGZsb2F0OCk7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gbG9nMTAoZmxvYXQxNik7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2RvdWJsZSBfX292bGQgX19jbmZuIGxvZzEwKGRvdWJsZSk7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gbG9nMTAoZG91YmxlMik7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gbG9nMTAoZG91YmxlMyk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gbG9nMTAoZG91YmxlNCk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gbG9nMTAoZG91YmxlOCk7Citkb3VibGUxNiBfX292bGQgX19jbmZuIGxvZzEwKGRvdWJsZTE2KTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2hhbGYgX19vdmxkIF9fY25mbiBsb2cxMChoYWxmKTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gbG9nMTAoaGFsZjIpOworaGFsZjMgX19vdmxkIF9fY25mbiBsb2cxMChoYWxmMyk7CitoYWxmNCBfX292bGQgX19jbmZuIGxvZzEwKGhhbGY0KTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gbG9nMTAoaGFsZjgpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gbG9nMTAoaGFsZjE2KTsKKyNlbmRpZiAvL2NsX2tocl9mcDE2CisKKy8qKgorICogQ29tcHV0ZSBhIGJhc2UgZSBsb2dhcml0aG0gb2YgKDEuMCArIHgpLgorICovCitmbG9hdCBfX292bGQgX19jbmZuIGxvZzFwKGZsb2F0IHgpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gbG9nMXAoZmxvYXQyIHgpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gbG9nMXAoZmxvYXQzIHgpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gbG9nMXAoZmxvYXQ0IHgpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gbG9nMXAoZmxvYXQ4IHgpOworZmxvYXQxNiBfX292bGQgX19jbmZuIGxvZzFwKGZsb2F0MTYgeCk7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2RvdWJsZSBfX292bGQgX19jbmZuIGxvZzFwKGRvdWJsZSB4KTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBsb2cxcChkb3VibGUyIHgpOworZG91YmxlMyBfX292bGQgX19jbmZuIGxvZzFwKGRvdWJsZTMgeCk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gbG9nMXAoZG91YmxlNCB4KTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBsb2cxcChkb3VibGU4IHgpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBsb2cxcChkb3VibGUxNiB4KTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2hhbGYgX19vdmxkIF9fY25mbiBsb2cxcChoYWxmIHgpOworaGFsZjIgX19vdmxkIF9fY25mbiBsb2cxcChoYWxmMiB4KTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gbG9nMXAoaGFsZjMgeCk7CitoYWxmNCBfX292bGQgX19jbmZuIGxvZzFwKGhhbGY0IHgpOworaGFsZjggX19vdmxkIF9fY25mbiBsb2cxcChoYWxmOCB4KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIGxvZzFwKGhhbGYxNiB4KTsKKyNlbmRpZiAvL2NsX2tocl9mcDE2CisKKy8qKgorICogQ29tcHV0ZSB0aGUgZXhwb25lbnQgb2YgeCwgd2hpY2ggaXMgdGhlIGludGVncmFsCisgKiBwYXJ0IG9mIGxvZ3IgfCB4IHwuCisgKi8KK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gbG9nYihmbG9hdCB4KTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIGxvZ2IoZmxvYXQyIHgpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gbG9nYihmbG9hdDMgeCk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBsb2diKGZsb2F0NCB4KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIGxvZ2IoZmxvYXQ4IHgpOworZmxvYXQxNiBfX292bGQgX19jbmZuIGxvZ2IoZmxvYXQxNiB4KTsKKyNpZmRlZiBjbF9raHJfZnA2NAorZG91YmxlIF9fb3ZsZCBfX2NuZm4gbG9nYihkb3VibGUgeCk7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gbG9nYihkb3VibGUyIHgpOworZG91YmxlMyBfX292bGQgX19jbmZuIGxvZ2IoZG91YmxlMyB4KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBsb2diKGRvdWJsZTQgeCk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gbG9nYihkb3VibGU4IHgpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBsb2diKGRvdWJsZTE2IHgpOworI2VuZGlmIC8vY2xfa2hyX2ZwNjQKKyNpZmRlZiBjbF9raHJfZnAxNgoraGFsZiBfX292bGQgX19jbmZuIGxvZ2IoaGFsZiB4KTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gbG9nYihoYWxmMiB4KTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gbG9nYihoYWxmMyB4KTsKK2hhbGY0IF9fb3ZsZCBfX2NuZm4gbG9nYihoYWxmNCB4KTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gbG9nYihoYWxmOCB4KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIGxvZ2IoaGFsZjE2IHgpOworI2VuZGlmIC8vY2xfa2hyX2ZwMTYKKworLyoqCisgKiBtYWQgYXBwcm94aW1hdGVzIGEgKiBiICsgYy4gV2hldGhlciBvciBob3cgdGhlCisgKiBwcm9kdWN0IG9mIGEgKiBiIGlzIHJvdW5kZWQgYW5kIGhvdyBzdXBlcm5vcm1hbCBvcgorICogc3Vibm9ybWFsIGludGVybWVkaWF0ZSBwcm9kdWN0cyBhcmUgaGFuZGxlZCBpcyBub3QKKyAqIGRlZmluZWQuIG1hZCBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdoZXJlIHNwZWVkIGlzCisgKiBwcmVmZXJyZWQgb3ZlciBhY2N1cmFjeS4KKyAqLworZmxvYXQgX19vdmxkIF9fY25mbiBtYWQoZmxvYXQgYSwgZmxvYXQgYiwgZmxvYXQgYyk7CitmbG9hdDIgX19vdmxkIF9fY25mbiBtYWQoZmxvYXQyIGEsIGZsb2F0MiBiLCBmbG9hdDIgYyk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBtYWQoZmxvYXQzIGEsIGZsb2F0MyBiLCBmbG9hdDMgYyk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBtYWQoZmxvYXQ0IGEsIGZsb2F0NCBiLCBmbG9hdDQgYyk7CitmbG9hdDggX19vdmxkIF9fY25mbiBtYWQoZmxvYXQ4IGEsIGZsb2F0OCBiLCBmbG9hdDggYyk7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gbWFkKGZsb2F0MTYgYSwgZmxvYXQxNiBiLCBmbG9hdDE2IGMpOworI2lmZGVmIGNsX2tocl9mcDY0Citkb3VibGUgX19vdmxkIF9fY25mbiBtYWQoZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgYyk7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gbWFkKGRvdWJsZTIgYSwgZG91YmxlMiBiLCBkb3VibGUyIGMpOworZG91YmxlMyBfX292bGQgX19jbmZuIG1hZChkb3VibGUzIGEsIGRvdWJsZTMgYiwgZG91YmxlMyBjKTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBtYWQoZG91YmxlNCBhLCBkb3VibGU0IGIsIGRvdWJsZTQgYyk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gbWFkKGRvdWJsZTggYSwgZG91YmxlOCBiLCBkb3VibGU4IGMpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBtYWQoZG91YmxlMTYgYSwgZG91YmxlMTYgYiwgZG91YmxlMTYgYyk7CisjZW5kaWYgLy9jbF9raHJfZnA2NAorI2lmZGVmIGNsX2tocl9mcDE2CitoYWxmIF9fb3ZsZCBfX2NuZm4gbWFkKGhhbGYgYSwgaGFsZiBiLCBoYWxmIGMpOworaGFsZjIgX19vdmxkIF9fY25mbiBtYWQoaGFsZjIgYSwgaGFsZjIgYiwgaGFsZjIgYyk7CitoYWxmMyBfX292bGQgX19jbmZuIG1hZChoYWxmMyBhLCBoYWxmMyBiLCBoYWxmMyBjKTsKK2hhbGY0IF9fb3ZsZCBfX2NuZm4gbWFkKGhhbGY0IGEsIGhhbGY0IGIsIGhhbGY0IGMpOworaGFsZjggX19vdmxkIF9fY25mbiBtYWQoaGFsZjggYSwgaGFsZjggYiwgaGFsZjggYyk7CitoYWxmMTYgX19vdmxkIF9fY25mbiBtYWQoaGFsZjE2IGEsIGhhbGYxNiBiLCBoYWxmMTYgYyk7CisjZW5kaWYgLy9jbF9raHJfZnAxNgorCisvKioKKyAqIFJldHVybnMgeCBpZiB8IHggfCA+IHwgeSB8LCB5IGlmIHwgeSB8ID4gfCB4IHwsIG90aGVyd2lzZQorICogZm1heCh4LCB5KS4KKyAqLworZmxvYXQgX19vdmxkIF9fY25mbiBtYXhtYWcoZmxvYXQgeCwgZmxvYXQgeSk7CitmbG9hdDIgX19vdmxkIF9fY25mbiBtYXhtYWcoZmxvYXQyIHgsIGZsb2F0MiB5KTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIG1heG1hZyhmbG9hdDMgeCwgZmxvYXQzIHkpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gbWF4bWFnKGZsb2F0NCB4LCBmbG9hdDQgeSk7CitmbG9hdDggX19vdmxkIF9fY25mbiBtYXhtYWcoZmxvYXQ4IHgsIGZsb2F0OCB5KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBtYXhtYWcoZmxvYXQxNiB4LCBmbG9hdDE2IHkpOworI2lmZGVmIGNsX2tocl9mcDY0Citkb3VibGUgX19vdmxkIF9fY25mbiBtYXhtYWcoZG91YmxlIHgsIGRvdWJsZSB5KTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBtYXhtYWcoZG91YmxlMiB4LCBkb3VibGUyIHkpOworZG91YmxlMyBfX292bGQgX19jbmZuIG1heG1hZyhkb3VibGUzIHgsIGRvdWJsZTMgeSk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gbWF4bWFnKGRvdWJsZTQgeCwgZG91YmxlNCB5KTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBtYXhtYWcoZG91YmxlOCB4LCBkb3VibGU4IHkpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBtYXhtYWcoZG91YmxlMTYgeCwgZG91YmxlMTYgeSk7CisjZW5kaWYgLy9jbF9raHJfZnA2NAorI2lmZGVmIGNsX2tocl9mcDE2CitoYWxmIF9fb3ZsZCBfX2NuZm4gbWF4bWFnKGhhbGYgeCwgaGFsZiB5KTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gbWF4bWFnKGhhbGYyIHgsIGhhbGYyIHkpOworaGFsZjMgX19vdmxkIF9fY25mbiBtYXhtYWcoaGFsZjMgeCwgaGFsZjMgeSk7CitoYWxmNCBfX292bGQgX19jbmZuIG1heG1hZyhoYWxmNCB4LCBoYWxmNCB5KTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gbWF4bWFnKGhhbGY4IHgsIGhhbGY4IHkpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gbWF4bWFnKGhhbGYxNiB4LCBoYWxmMTYgeSk7CisjZW5kaWYgLy9jbF9raHJfZnAxNgorCisvKioKKyAqIFJldHVybnMgeCBpZiB8IHggfCA8IHwgeSB8LCB5IGlmIHwgeSB8IDwgfCB4IHwsIG90aGVyd2lzZQorICogZm1pbih4LCB5KS4KKyAqLworZmxvYXQgX19vdmxkIF9fY25mbiBtaW5tYWcoZmxvYXQgeCwgZmxvYXQgeSk7CitmbG9hdDIgX19vdmxkIF9fY25mbiBtaW5tYWcoZmxvYXQyIHgsIGZsb2F0MiB5KTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIG1pbm1hZyhmbG9hdDMgeCwgZmxvYXQzIHkpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gbWlubWFnKGZsb2F0NCB4LCBmbG9hdDQgeSk7CitmbG9hdDggX19vdmxkIF9fY25mbiBtaW5tYWcoZmxvYXQ4IHgsIGZsb2F0OCB5KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBtaW5tYWcoZmxvYXQxNiB4LCBmbG9hdDE2IHkpOworI2lmZGVmIGNsX2tocl9mcDY0Citkb3VibGUgX19vdmxkIF9fY25mbiBtaW5tYWcoZG91YmxlIHgsIGRvdWJsZSB5KTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBtaW5tYWcoZG91YmxlMiB4LCBkb3VibGUyIHkpOworZG91YmxlMyBfX292bGQgX19jbmZuIG1pbm1hZyhkb3VibGUzIHgsIGRvdWJsZTMgeSk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gbWlubWFnKGRvdWJsZTQgeCwgZG91YmxlNCB5KTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBtaW5tYWcoZG91YmxlOCB4LCBkb3VibGU4IHkpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBtaW5tYWcoZG91YmxlMTYgeCwgZG91YmxlMTYgeSk7CisjZW5kaWYgLy9jbF9raHJfZnA2NAorI2lmZGVmIGNsX2tocl9mcDE2CitoYWxmIF9fb3ZsZCBfX2NuZm4gbWlubWFnKGhhbGYgeCwgaGFsZiB5KTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gbWlubWFnKGhhbGYyIHgsIGhhbGYyIHkpOworaGFsZjMgX19vdmxkIF9fY25mbiBtaW5tYWcoaGFsZjMgeCwgaGFsZjMgeSk7CitoYWxmNCBfX292bGQgX19jbmZuIG1pbm1hZyhoYWxmNCB4LCBoYWxmNCB5KTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gbWlubWFnKGhhbGY4IHgsIGhhbGY4IHkpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gbWlubWFnKGhhbGYxNiB4LCBoYWxmMTYgeSk7CisjZW5kaWYgLy9jbF9raHJfZnAxNgorCisvKioKKyAqIERlY29tcG9zZSBhIGZsb2F0aW5nLXBvaW50IG51bWJlci4gVGhlIG1vZGYKKyAqIGZ1bmN0aW9uIGJyZWFrcyB0aGUgYXJndW1lbnQgeCBpbnRvIGludGVncmFsIGFuZAorICogZnJhY3Rpb25hbCBwYXJ0cywgZWFjaCBvZiB3aGljaCBoYXMgdGhlIHNhbWUgc2lnbiBhcworICogdGhlIGFyZ3VtZW50LiBJdCBzdG9yZXMgdGhlIGludGVncmFsIHBhcnQgaW4gdGhlIG9iamVjdAorICogcG9pbnRlZCB0byBieSBpcHRyLgorICovCisjaWYgX19PUEVOQ0xfQ19WRVJTSU9OX18gPj0gQ0xfVkVSU0lPTl8yXzAKK2Zsb2F0IF9fb3ZsZCBtb2RmKGZsb2F0IHgsIGZsb2F0ICppcHRyKTsKK2Zsb2F0MiBfX292bGQgbW9kZihmbG9hdDIgeCwgZmxvYXQyICppcHRyKTsKK2Zsb2F0MyBfX292bGQgbW9kZihmbG9hdDMgeCwgZmxvYXQzICppcHRyKTsKK2Zsb2F0NCBfX292bGQgbW9kZihmbG9hdDQgeCwgZmxvYXQ0ICppcHRyKTsKK2Zsb2F0OCBfX292bGQgbW9kZihmbG9hdDggeCwgZmxvYXQ4ICppcHRyKTsKK2Zsb2F0MTYgX19vdmxkIG1vZGYoZmxvYXQxNiB4LCBmbG9hdDE2ICppcHRyKTsKKyNpZmRlZiBjbF9raHJfZnA2NAorZG91YmxlIF9fb3ZsZCBtb2RmKGRvdWJsZSB4LCBkb3VibGUgKmlwdHIpOworZG91YmxlMiBfX292bGQgbW9kZihkb3VibGUyIHgsIGRvdWJsZTIgKmlwdHIpOworZG91YmxlMyBfX292bGQgbW9kZihkb3VibGUzIHgsIGRvdWJsZTMgKmlwdHIpOworZG91YmxlNCBfX292bGQgbW9kZihkb3VibGU0IHgsIGRvdWJsZTQgKmlwdHIpOworZG91YmxlOCBfX292bGQgbW9kZihkb3VibGU4IHgsIGRvdWJsZTggKmlwdHIpOworZG91YmxlMTYgX19vdmxkIG1vZGYoZG91YmxlMTYgeCwgZG91YmxlMTYgKmlwdHIpOworI2VuZGlmIC8vY2xfa2hyX2ZwNjQKKyNpZmRlZiBjbF9raHJfZnAxNgoraGFsZiBfX292bGQgbW9kZihoYWxmIHgsIGhhbGYgKmlwdHIpOworaGFsZjIgX19vdmxkIG1vZGYoaGFsZjIgeCwgaGFsZjIgKmlwdHIpOworaGFsZjMgX19vdmxkIG1vZGYoaGFsZjMgeCwgaGFsZjMgKmlwdHIpOworaGFsZjQgX19vdmxkIG1vZGYoaGFsZjQgeCwgaGFsZjQgKmlwdHIpOworaGFsZjggX19vdmxkIG1vZGYoaGFsZjggeCwgaGFsZjggKmlwdHIpOworaGFsZjE2IF9fb3ZsZCBtb2RmKGhhbGYxNiB4LCBoYWxmMTYgKmlwdHIpOworI2VuZGlmIC8vY2xfa2hyX2ZwMTYKKyNlbHNlCitmbG9hdCBfX292bGQgbW9kZihmbG9hdCB4LCBfX2dsb2JhbCBmbG9hdCAqaXB0cik7CitmbG9hdDIgX19vdmxkIG1vZGYoZmxvYXQyIHgsIF9fZ2xvYmFsIGZsb2F0MiAqaXB0cik7CitmbG9hdDMgX19vdmxkIG1vZGYoZmxvYXQzIHgsIF9fZ2xvYmFsIGZsb2F0MyAqaXB0cik7CitmbG9hdDQgX19vdmxkIG1vZGYoZmxvYXQ0IHgsIF9fZ2xvYmFsIGZsb2F0NCAqaXB0cik7CitmbG9hdDggX19vdmxkIG1vZGYoZmxvYXQ4IHgsIF9fZ2xvYmFsIGZsb2F0OCAqaXB0cik7CitmbG9hdDE2IF9fb3ZsZCBtb2RmKGZsb2F0MTYgeCwgX19nbG9iYWwgZmxvYXQxNiAqaXB0cik7CitmbG9hdCBfX292bGQgbW9kZihmbG9hdCB4LCBfX2xvY2FsIGZsb2F0ICppcHRyKTsKK2Zsb2F0MiBfX292bGQgbW9kZihmbG9hdDIgeCwgX19sb2NhbCBmbG9hdDIgKmlwdHIpOworZmxvYXQzIF9fb3ZsZCBtb2RmKGZsb2F0MyB4LCBfX2xvY2FsIGZsb2F0MyAqaXB0cik7CitmbG9hdDQgX19vdmxkIG1vZGYoZmxvYXQ0IHgsIF9fbG9jYWwgZmxvYXQ0ICppcHRyKTsKK2Zsb2F0OCBfX292bGQgbW9kZihmbG9hdDggeCwgX19sb2NhbCBmbG9hdDggKmlwdHIpOworZmxvYXQxNiBfX292bGQgbW9kZihmbG9hdDE2IHgsIF9fbG9jYWwgZmxvYXQxNiAqaXB0cik7CitmbG9hdCBfX292bGQgbW9kZihmbG9hdCB4LCBfX3ByaXZhdGUgZmxvYXQgKmlwdHIpOworZmxvYXQyIF9fb3ZsZCBtb2RmKGZsb2F0MiB4LCBfX3ByaXZhdGUgZmxvYXQyICppcHRyKTsKK2Zsb2F0MyBfX292bGQgbW9kZihmbG9hdDMgeCwgX19wcml2YXRlIGZsb2F0MyAqaXB0cik7CitmbG9hdDQgX19vdmxkIG1vZGYoZmxvYXQ0IHgsIF9fcHJpdmF0ZSBmbG9hdDQgKmlwdHIpOworZmxvYXQ4IF9fb3ZsZCBtb2RmKGZsb2F0OCB4LCBfX3ByaXZhdGUgZmxvYXQ4ICppcHRyKTsKK2Zsb2F0MTYgX19vdmxkIG1vZGYoZmxvYXQxNiB4LCBfX3ByaXZhdGUgZmxvYXQxNiAqaXB0cik7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2RvdWJsZSBfX292bGQgbW9kZihkb3VibGUgeCwgX19nbG9iYWwgZG91YmxlICppcHRyKTsKK2RvdWJsZTIgX19vdmxkIG1vZGYoZG91YmxlMiB4LCBfX2dsb2JhbCBkb3VibGUyICppcHRyKTsKK2RvdWJsZTMgX19vdmxkIG1vZGYoZG91YmxlMyB4LCBfX2dsb2JhbCBkb3VibGUzICppcHRyKTsKK2RvdWJsZTQgX19vdmxkIG1vZGYoZG91YmxlNCB4LCBfX2dsb2JhbCBkb3VibGU0ICppcHRyKTsKK2RvdWJsZTggX19vdmxkIG1vZGYoZG91YmxlOCB4LCBfX2dsb2JhbCBkb3VibGU4ICppcHRyKTsKK2RvdWJsZTE2IF9fb3ZsZCBtb2RmKGRvdWJsZTE2IHgsIF9fZ2xvYmFsIGRvdWJsZTE2ICppcHRyKTsKK2RvdWJsZSBfX292bGQgbW9kZihkb3VibGUgeCwgX19sb2NhbCBkb3VibGUgKmlwdHIpOworZG91YmxlMiBfX292bGQgbW9kZihkb3VibGUyIHgsIF9fbG9jYWwgZG91YmxlMiAqaXB0cik7Citkb3VibGUzIF9fb3ZsZCBtb2RmKGRvdWJsZTMgeCwgX19sb2NhbCBkb3VibGUzICppcHRyKTsKK2RvdWJsZTQgX19vdmxkIG1vZGYoZG91YmxlNCB4LCBfX2xvY2FsIGRvdWJsZTQgKmlwdHIpOworZG91YmxlOCBfX292bGQgbW9kZihkb3VibGU4IHgsIF9fbG9jYWwgZG91YmxlOCAqaXB0cik7Citkb3VibGUxNiBfX292bGQgbW9kZihkb3VibGUxNiB4LCBfX2xvY2FsIGRvdWJsZTE2ICppcHRyKTsKK2RvdWJsZSBfX292bGQgbW9kZihkb3VibGUgeCwgX19wcml2YXRlIGRvdWJsZSAqaXB0cik7Citkb3VibGUyIF9fb3ZsZCBtb2RmKGRvdWJsZTIgeCwgX19wcml2YXRlIGRvdWJsZTIgKmlwdHIpOworZG91YmxlMyBfX292bGQgbW9kZihkb3VibGUzIHgsIF9fcHJpdmF0ZSBkb3VibGUzICppcHRyKTsKK2RvdWJsZTQgX19vdmxkIG1vZGYoZG91YmxlNCB4LCBfX3ByaXZhdGUgZG91YmxlNCAqaXB0cik7Citkb3VibGU4IF9fb3ZsZCBtb2RmKGRvdWJsZTggeCwgX19wcml2YXRlIGRvdWJsZTggKmlwdHIpOworZG91YmxlMTYgX19vdmxkIG1vZGYoZG91YmxlMTYgeCwgX19wcml2YXRlIGRvdWJsZTE2ICppcHRyKTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2hhbGYgX19vdmxkIG1vZGYoaGFsZiB4LCBfX2dsb2JhbCBoYWxmICppcHRyKTsKK2hhbGYyIF9fb3ZsZCBtb2RmKGhhbGYyIHgsIF9fZ2xvYmFsIGhhbGYyICppcHRyKTsKK2hhbGYzIF9fb3ZsZCBtb2RmKGhhbGYzIHgsIF9fZ2xvYmFsIGhhbGYzICppcHRyKTsKK2hhbGY0IF9fb3ZsZCBtb2RmKGhhbGY0IHgsIF9fZ2xvYmFsIGhhbGY0ICppcHRyKTsKK2hhbGY4IF9fb3ZsZCBtb2RmKGhhbGY4IHgsIF9fZ2xvYmFsIGhhbGY4ICppcHRyKTsKK2hhbGYxNiBfX292bGQgbW9kZihoYWxmMTYgeCwgX19nbG9iYWwgaGFsZjE2ICppcHRyKTsKK2hhbGYgX19vdmxkIG1vZGYoaGFsZiB4LCBfX2xvY2FsIGhhbGYgKmlwdHIpOworaGFsZjIgX19vdmxkIG1vZGYoaGFsZjIgeCwgX19sb2NhbCBoYWxmMiAqaXB0cik7CitoYWxmMyBfX292bGQgbW9kZihoYWxmMyB4LCBfX2xvY2FsIGhhbGYzICppcHRyKTsKK2hhbGY0IF9fb3ZsZCBtb2RmKGhhbGY0IHgsIF9fbG9jYWwgaGFsZjQgKmlwdHIpOworaGFsZjggX19vdmxkIG1vZGYoaGFsZjggeCwgX19sb2NhbCBoYWxmOCAqaXB0cik7CitoYWxmMTYgX19vdmxkIG1vZGYoaGFsZjE2IHgsIF9fbG9jYWwgaGFsZjE2ICppcHRyKTsKK2hhbGYgX19vdmxkIG1vZGYoaGFsZiB4LCBfX3ByaXZhdGUgaGFsZiAqaXB0cik7CitoYWxmMiBfX292bGQgbW9kZihoYWxmMiB4LCBfX3ByaXZhdGUgaGFsZjIgKmlwdHIpOworaGFsZjMgX19vdmxkIG1vZGYoaGFsZjMgeCwgX19wcml2YXRlIGhhbGYzICppcHRyKTsKK2hhbGY0IF9fb3ZsZCBtb2RmKGhhbGY0IHgsIF9fcHJpdmF0ZSBoYWxmNCAqaXB0cik7CitoYWxmOCBfX292bGQgbW9kZihoYWxmOCB4LCBfX3ByaXZhdGUgaGFsZjggKmlwdHIpOworaGFsZjE2IF9fb3ZsZCBtb2RmKGhhbGYxNiB4LCBfX3ByaXZhdGUgaGFsZjE2ICppcHRyKTsKKyNlbmRpZiAvL2NsX2tocl9mcDE2CisjZW5kaWYgLy9fX09QRU5DTF9DX1ZFUlNJT05fXyA+PSBDTF9WRVJTSU9OXzJfMAorCisvKioKKyAqIFJldHVybnMgYSBxdWlldCBOYU4uIFRoZSBuYW5jb2RlIG1heSBiZSBwbGFjZWQKKyAqIGluIHRoZSBzaWduaWZpY2FuZCBvZiB0aGUgcmVzdWx0aW5nIE5hTi4KKyAqLworZmxvYXQgX19vdmxkIF9fY25mbiBuYW4odWludCBuYW5jb2RlKTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIG5hbih1aW50MiBuYW5jb2RlKTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIG5hbih1aW50MyBuYW5jb2RlKTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIG5hbih1aW50NCBuYW5jb2RlKTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIG5hbih1aW50OCBuYW5jb2RlKTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBuYW4odWludDE2IG5hbmNvZGUpOworI2lmZGVmIGNsX2tocl9mcDY0Citkb3VibGUgX19vdmxkIF9fY25mbiBuYW4odWxvbmcgbmFuY29kZSk7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gbmFuKHVsb25nMiBuYW5jb2RlKTsKK2RvdWJsZTMgX19vdmxkIF9fY25mbiBuYW4odWxvbmczIG5hbmNvZGUpOworZG91YmxlNCBfX292bGQgX19jbmZuIG5hbih1bG9uZzQgbmFuY29kZSk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gbmFuKHVsb25nOCBuYW5jb2RlKTsKK2RvdWJsZTE2IF9fb3ZsZCBfX2NuZm4gbmFuKHVsb25nMTYgbmFuY29kZSk7CisjZW5kaWYgLy9jbF9raHJfZnA2NAorI2lmZGVmIGNsX2tocl9mcDE2CitoYWxmIF9fb3ZsZCBfX2NuZm4gbmFuKHVzaG9ydCBuYW5jb2RlKTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gbmFuKHVzaG9ydDIgbmFuY29kZSk7CitoYWxmMyBfX292bGQgX19jbmZuIG5hbih1c2hvcnQzIG5hbmNvZGUpOworaGFsZjQgX19vdmxkIF9fY25mbiBuYW4odXNob3J0NCBuYW5jb2RlKTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gbmFuKHVzaG9ydDggbmFuY29kZSk7CitoYWxmMTYgX19vdmxkIF9fY25mbiBuYW4odXNob3J0MTYgbmFuY29kZSk7CisjZW5kaWYgLy9jbF9raHJfZnAxNgorCisvKioKKyAqIENvbXB1dGVzIHRoZSBuZXh0IHJlcHJlc2VudGFibGUgc2luZ2xlLXByZWNpc2lvbgorICogZmxvYXRpbmctcG9pbnQgdmFsdWUgZm9sbG93aW5nIHggaW4gdGhlIGRpcmVjdGlvbiBvZgorICogeS4gVGh1cywgaWYgeSBpcyBsZXNzIHRoYW4geCwgbmV4dGFmdGVyKCkgcmV0dXJucyB0aGUKKyAqIGxhcmdlc3QgcmVwcmVzZW50YWJsZSBmbG9hdGluZy1wb2ludCBudW1iZXIgbGVzcworICogdGhhbiB4LgorICovCitmbG9hdCBfX292bGQgX19jbmZuIG5leHRhZnRlcihmbG9hdCB4LCBmbG9hdCB5KTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIG5leHRhZnRlcihmbG9hdDIgeCwgZmxvYXQyIHkpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gbmV4dGFmdGVyKGZsb2F0MyB4LCBmbG9hdDMgeSk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBuZXh0YWZ0ZXIoZmxvYXQ0IHgsIGZsb2F0NCB5KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIG5leHRhZnRlcihmbG9hdDggeCwgZmxvYXQ4IHkpOworZmxvYXQxNiBfX292bGQgX19jbmZuIG5leHRhZnRlcihmbG9hdDE2IHgsIGZsb2F0MTYgeSk7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2RvdWJsZSBfX292bGQgX19jbmZuIG5leHRhZnRlcihkb3VibGUgeCwgZG91YmxlIHkpOworZG91YmxlMiBfX292bGQgX19jbmZuIG5leHRhZnRlcihkb3VibGUyIHgsIGRvdWJsZTIgeSk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gbmV4dGFmdGVyKGRvdWJsZTMgeCwgZG91YmxlMyB5KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBuZXh0YWZ0ZXIoZG91YmxlNCB4LCBkb3VibGU0IHkpOworZG91YmxlOCBfX292bGQgX19jbmZuIG5leHRhZnRlcihkb3VibGU4IHgsIGRvdWJsZTggeSk7Citkb3VibGUxNiBfX292bGQgX19jbmZuIG5leHRhZnRlcihkb3VibGUxNiB4LCBkb3VibGUxNiB5KTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2hhbGYgX19vdmxkIF9fY25mbiBuZXh0YWZ0ZXIoaGFsZiB4LCBoYWxmIHkpOworaGFsZjIgX19vdmxkIF9fY25mbiBuZXh0YWZ0ZXIoaGFsZjIgeCwgaGFsZjIgeSk7CitoYWxmMyBfX292bGQgX19jbmZuIG5leHRhZnRlcihoYWxmMyB4LCBoYWxmMyB5KTsKK2hhbGY0IF9fb3ZsZCBfX2NuZm4gbmV4dGFmdGVyKGhhbGY0IHgsIGhhbGY0IHkpOworaGFsZjggX19vdmxkIF9fY25mbiBuZXh0YWZ0ZXIoaGFsZjggeCwgaGFsZjggeSk7CitoYWxmMTYgX19vdmxkIF9fY25mbiBuZXh0YWZ0ZXIoaGFsZjE2IHgsIGhhbGYxNiB5KTsKKyNlbmRpZiAvL2NsX2tocl9mcDE2CisKKy8qKgorICogQ29tcHV0ZSB4IHRvIHRoZSBwb3dlciB5LgorICovCitmbG9hdCBfX292bGQgX19jbmZuIHBvdyhmbG9hdCB4LCBmbG9hdCB5KTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIHBvdyhmbG9hdDIgeCwgZmxvYXQyIHkpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gcG93KGZsb2F0MyB4LCBmbG9hdDMgeSk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBwb3coZmxvYXQ0IHgsIGZsb2F0NCB5KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIHBvdyhmbG9hdDggeCwgZmxvYXQ4IHkpOworZmxvYXQxNiBfX292bGQgX19jbmZuIHBvdyhmbG9hdDE2IHgsIGZsb2F0MTYgeSk7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2RvdWJsZSBfX292bGQgX19jbmZuIHBvdyhkb3VibGUgeCwgZG91YmxlIHkpOworZG91YmxlMiBfX292bGQgX19jbmZuIHBvdyhkb3VibGUyIHgsIGRvdWJsZTIgeSk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gcG93KGRvdWJsZTMgeCwgZG91YmxlMyB5KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBwb3coZG91YmxlNCB4LCBkb3VibGU0IHkpOworZG91YmxlOCBfX292bGQgX19jbmZuIHBvdyhkb3VibGU4IHgsIGRvdWJsZTggeSk7Citkb3VibGUxNiBfX292bGQgX19jbmZuIHBvdyhkb3VibGUxNiB4LCBkb3VibGUxNiB5KTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2hhbGYgX19vdmxkIF9fY25mbiBwb3coaGFsZiB4LCBoYWxmIHkpOworaGFsZjIgX19vdmxkIF9fY25mbiBwb3coaGFsZjIgeCwgaGFsZjIgeSk7CitoYWxmMyBfX292bGQgX19jbmZuIHBvdyhoYWxmMyB4LCBoYWxmMyB5KTsKK2hhbGY0IF9fb3ZsZCBfX2NuZm4gcG93KGhhbGY0IHgsIGhhbGY0IHkpOworaGFsZjggX19vdmxkIF9fY25mbiBwb3coaGFsZjggeCwgaGFsZjggeSk7CitoYWxmMTYgX19vdmxkIF9fY25mbiBwb3coaGFsZjE2IHgsIGhhbGYxNiB5KTsKKyNlbmRpZiAvL2NsX2tocl9mcDE2CisKKy8qKgorICogQ29tcHV0ZSB4IHRvIHRoZSBwb3dlciB5LCB3aGVyZSB5IGlzIGFuIGludGVnZXIuCisgKi8KK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gcG93bihmbG9hdCB4LCBpbnQgeSk7CitmbG9hdDIgX19vdmxkIF9fY25mbiBwb3duKGZsb2F0MiB4LCBpbnQyIHkpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gcG93bihmbG9hdDMgeCwgaW50MyB5KTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIHBvd24oZmxvYXQ0IHgsIGludDQgeSk7CitmbG9hdDggX19vdmxkIF9fY25mbiBwb3duKGZsb2F0OCB4LCBpbnQ4IHkpOworZmxvYXQxNiBfX292bGQgX19jbmZuIHBvd24oZmxvYXQxNiB4LCBpbnQxNiB5KTsKKyNpZmRlZiBjbF9raHJfZnA2NAorZG91YmxlIF9fb3ZsZCBfX2NuZm4gcG93bihkb3VibGUgeCwgaW50IHkpOworZG91YmxlMiBfX292bGQgX19jbmZuIHBvd24oZG91YmxlMiB4LCBpbnQyIHkpOworZG91YmxlMyBfX292bGQgX19jbmZuIHBvd24oZG91YmxlMyB4LCBpbnQzIHkpOworZG91YmxlNCBfX292bGQgX19jbmZuIHBvd24oZG91YmxlNCB4LCBpbnQ0IHkpOworZG91YmxlOCBfX292bGQgX19jbmZuIHBvd24oZG91YmxlOCB4LCBpbnQ4IHkpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBwb3duKGRvdWJsZTE2IHgsIGludDE2IHkpOworI2VuZGlmIC8vY2xfa2hyX2ZwNjQKKyNpZmRlZiBjbF9raHJfZnAxNgoraGFsZiBfX292bGQgX19jbmZuIHBvd24oaGFsZiB4LCBpbnQgeSk7CitoYWxmMiBfX292bGQgX19jbmZuIHBvd24oaGFsZjIgeCwgaW50MiB5KTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gcG93bihoYWxmMyB4LCBpbnQzIHkpOworaGFsZjQgX19vdmxkIF9fY25mbiBwb3duKGhhbGY0IHgsIGludDQgeSk7CitoYWxmOCBfX292bGQgX19jbmZuIHBvd24oaGFsZjggeCwgaW50OCB5KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIHBvd24oaGFsZjE2IHgsIGludDE2IHkpOworI2VuZGlmIC8vY2xfa2hyX2ZwMTYKKworLyoqCisgKiBDb21wdXRlIHggdG8gdGhlIHBvd2VyIHksIHdoZXJlIHggaXMgPj0gMC4KKyAqLworZmxvYXQgX19vdmxkIF9fY25mbiBwb3dyKGZsb2F0IHgsIGZsb2F0IHkpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gcG93cihmbG9hdDIgeCwgZmxvYXQyIHkpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gcG93cihmbG9hdDMgeCwgZmxvYXQzIHkpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gcG93cihmbG9hdDQgeCwgZmxvYXQ0IHkpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gcG93cihmbG9hdDggeCwgZmxvYXQ4IHkpOworZmxvYXQxNiBfX292bGQgX19jbmZuIHBvd3IoZmxvYXQxNiB4LCBmbG9hdDE2IHkpOworI2lmZGVmIGNsX2tocl9mcDY0Citkb3VibGUgX19vdmxkIF9fY25mbiBwb3dyKGRvdWJsZSB4LCBkb3VibGUgeSk7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gcG93cihkb3VibGUyIHgsIGRvdWJsZTIgeSk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gcG93cihkb3VibGUzIHgsIGRvdWJsZTMgeSk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gcG93cihkb3VibGU0IHgsIGRvdWJsZTQgeSk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gcG93cihkb3VibGU4IHgsIGRvdWJsZTggeSk7Citkb3VibGUxNiBfX292bGQgX19jbmZuIHBvd3IoZG91YmxlMTYgeCwgZG91YmxlMTYgeSk7CisjZW5kaWYgLy9jbF9raHJfZnA2NAorI2lmZGVmIGNsX2tocl9mcDE2CitoYWxmIF9fb3ZsZCBfX2NuZm4gcG93cihoYWxmIHgsIGhhbGYgeSk7CitoYWxmMiBfX292bGQgX19jbmZuIHBvd3IoaGFsZjIgeCwgaGFsZjIgeSk7CitoYWxmMyBfX292bGQgX19jbmZuIHBvd3IoaGFsZjMgeCwgaGFsZjMgeSk7CitoYWxmNCBfX292bGQgX19jbmZuIHBvd3IoaGFsZjQgeCwgaGFsZjQgeSk7CitoYWxmOCBfX292bGQgX19jbmZuIHBvd3IoaGFsZjggeCwgaGFsZjggeSk7CitoYWxmMTYgX19vdmxkIF9fY25mbiBwb3dyKGhhbGYxNiB4LCBoYWxmMTYgeSk7CisjZW5kaWYgLy9jbF9raHJfZnAxNgorCisvKioKKyAqIENvbXB1dGUgdGhlIHZhbHVlIHIgc3VjaCB0aGF0IHIgPSB4IC0gbip5LCB3aGVyZSBuCisgKiBpcyB0aGUgaW50ZWdlciBuZWFyZXN0IHRoZSBleGFjdCB2YWx1ZSBvZiB4L3kuIElmIHRoZXJlCisgKiBhcmUgdHdvIGludGVnZXJzIGNsb3Nlc3QgdG8geC95LCBuIHNoYWxsIGJlIHRoZSBldmVuCisgKiBvbmUuIElmIHIgaXMgemVybywgaXQgaXMgZ2l2ZW4gdGhlIHNhbWUgc2lnbiBhcyB4LgorICovCitmbG9hdCBfX292bGQgX19jbmZuIHJlbWFpbmRlcihmbG9hdCB4LCBmbG9hdCB5KTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIHJlbWFpbmRlcihmbG9hdDIgeCwgZmxvYXQyIHkpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gcmVtYWluZGVyKGZsb2F0MyB4LCBmbG9hdDMgeSk7CitmbG9hdDQgX19vdmxkIF9fY25mbiByZW1haW5kZXIoZmxvYXQ0IHgsIGZsb2F0NCB5KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIHJlbWFpbmRlcihmbG9hdDggeCwgZmxvYXQ4IHkpOworZmxvYXQxNiBfX292bGQgX19jbmZuIHJlbWFpbmRlcihmbG9hdDE2IHgsIGZsb2F0MTYgeSk7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2RvdWJsZSBfX292bGQgX19jbmZuIHJlbWFpbmRlcihkb3VibGUgeCwgZG91YmxlIHkpOworZG91YmxlMiBfX292bGQgX19jbmZuIHJlbWFpbmRlcihkb3VibGUyIHgsIGRvdWJsZTIgeSk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gcmVtYWluZGVyKGRvdWJsZTMgeCwgZG91YmxlMyB5KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiByZW1haW5kZXIoZG91YmxlNCB4LCBkb3VibGU0IHkpOworZG91YmxlOCBfX292bGQgX19jbmZuIHJlbWFpbmRlcihkb3VibGU4IHgsIGRvdWJsZTggeSk7Citkb3VibGUxNiBfX292bGQgX19jbmZuIHJlbWFpbmRlcihkb3VibGUxNiB4LCBkb3VibGUxNiB5KTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2hhbGYgX19vdmxkIF9fY25mbiByZW1haW5kZXIoaGFsZiB4LCBoYWxmIHkpOworaGFsZjIgX19vdmxkIF9fY25mbiByZW1haW5kZXIoaGFsZjIgeCwgaGFsZjIgeSk7CitoYWxmMyBfX292bGQgX19jbmZuIHJlbWFpbmRlcihoYWxmMyB4LCBoYWxmMyB5KTsKK2hhbGY0IF9fb3ZsZCBfX2NuZm4gcmVtYWluZGVyKGhhbGY0IHgsIGhhbGY0IHkpOworaGFsZjggX19vdmxkIF9fY25mbiByZW1haW5kZXIoaGFsZjggeCwgaGFsZjggeSk7CitoYWxmMTYgX19vdmxkIF9fY25mbiByZW1haW5kZXIoaGFsZjE2IHgsIGhhbGYxNiB5KTsKKyNlbmRpZiAvL2NsX2tocl9mcDE2CisKKy8qKgorICogVGhlIHJlbXF1byBmdW5jdGlvbiBjb21wdXRlcyB0aGUgdmFsdWUgciBzdWNoCisgKiB0aGF0IHIgPSB4IC0gbip5LCB3aGVyZSBuIGlzIHRoZSBpbnRlZ2VyIG5lYXJlc3QgdGhlCisgKiBleGFjdCB2YWx1ZSBvZiB4L3kuIElmIHRoZXJlIGFyZSB0d28gaW50ZWdlcnMgY2xvc2VzdAorICogdG8geC95LCBuIHNoYWxsIGJlIHRoZSBldmVuIG9uZS4gSWYgciBpcyB6ZXJvLCBpdCBpcworICogZ2l2ZW4gdGhlIHNhbWUgc2lnbiBhcyB4LiBUaGlzIGlzIHRoZSBzYW1lIHZhbHVlCisgKiB0aGF0IGlzIHJldHVybmVkIGJ5IHRoZSByZW1haW5kZXIgZnVuY3Rpb24uCisgKiByZW1xdW8gYWxzbyBjYWxjdWxhdGVzIHRoZSBsb3dlciBzZXZlbiBiaXRzIG9mIHRoZQorICogaW50ZWdyYWwgcXVvdGllbnQgeC95LCBhbmQgZ2l2ZXMgdGhhdCB2YWx1ZSB0aGUgc2FtZQorICogc2lnbiBhcyB4L3kuIEl0IHN0b3JlcyB0aGlzIHNpZ25lZCB2YWx1ZSBpbiB0aGUgb2JqZWN0CisgKiBwb2ludGVkIHRvIGJ5IHF1by4KKyAqLworI2lmIF9fT1BFTkNMX0NfVkVSU0lPTl9fID49IENMX1ZFUlNJT05fMl8wCitmbG9hdCBfX292bGQgcmVtcXVvKGZsb2F0IHgsIGZsb2F0IHksIGludCAqcXVvKTsKK2Zsb2F0MiBfX292bGQgcmVtcXVvKGZsb2F0MiB4LCBmbG9hdDIgeSwgaW50MiAqcXVvKTsKK2Zsb2F0MyBfX292bGQgcmVtcXVvKGZsb2F0MyB4LCBmbG9hdDMgeSwgaW50MyAqcXVvKTsKK2Zsb2F0NCBfX292bGQgcmVtcXVvKGZsb2F0NCB4LCBmbG9hdDQgeSwgaW50NCAqcXVvKTsKK2Zsb2F0OCBfX292bGQgcmVtcXVvKGZsb2F0OCB4LCBmbG9hdDggeSwgaW50OCAqcXVvKTsKK2Zsb2F0MTYgX19vdmxkIHJlbXF1byhmbG9hdDE2IHgsIGZsb2F0MTYgeSwgaW50MTYgKnF1byk7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2RvdWJsZSBfX292bGQgcmVtcXVvKGRvdWJsZSB4LCBkb3VibGUgeSwgaW50ICpxdW8pOworZG91YmxlMiBfX292bGQgcmVtcXVvKGRvdWJsZTIgeCwgZG91YmxlMiB5LCBpbnQyICpxdW8pOworZG91YmxlMyBfX292bGQgcmVtcXVvKGRvdWJsZTMgeCwgZG91YmxlMyB5LCBpbnQzICpxdW8pOworZG91YmxlNCBfX292bGQgcmVtcXVvKGRvdWJsZTQgeCwgZG91YmxlNCB5LCBpbnQ0ICpxdW8pOworZG91YmxlOCBfX292bGQgcmVtcXVvKGRvdWJsZTggeCwgZG91YmxlOCB5LCBpbnQ4ICpxdW8pOworZG91YmxlMTYgX19vdmxkIHJlbXF1byhkb3VibGUxNiB4LCBkb3VibGUxNiB5LCBpbnQxNiAqcXVvKTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2hhbGYgX19vdmxkIHJlbXF1byhoYWxmIHgsIGhhbGYgeSwgaW50ICpxdW8pOworaGFsZjIgX19vdmxkIHJlbXF1byhoYWxmMiB4LCBoYWxmMiB5LCBpbnQyICpxdW8pOworaGFsZjMgX19vdmxkIHJlbXF1byhoYWxmMyB4LCBoYWxmMyB5LCBpbnQzICpxdW8pOworaGFsZjQgX19vdmxkIHJlbXF1byhoYWxmNCB4LCBoYWxmNCB5LCBpbnQ0ICpxdW8pOworaGFsZjggX19vdmxkIHJlbXF1byhoYWxmOCB4LCBoYWxmOCB5LCBpbnQ4ICpxdW8pOworaGFsZjE2IF9fb3ZsZCByZW1xdW8oaGFsZjE2IHgsIGhhbGYxNiB5LCBpbnQxNiAqcXVvKTsKKworI2VuZGlmIC8vY2xfa2hyX2ZwMTYKKyNlbHNlCitmbG9hdCBfX292bGQgcmVtcXVvKGZsb2F0IHgsIGZsb2F0IHksIF9fZ2xvYmFsIGludCAqcXVvKTsKK2Zsb2F0MiBfX292bGQgcmVtcXVvKGZsb2F0MiB4LCBmbG9hdDIgeSwgX19nbG9iYWwgaW50MiAqcXVvKTsKK2Zsb2F0MyBfX292bGQgcmVtcXVvKGZsb2F0MyB4LCBmbG9hdDMgeSwgX19nbG9iYWwgaW50MyAqcXVvKTsKK2Zsb2F0NCBfX292bGQgcmVtcXVvKGZsb2F0NCB4LCBmbG9hdDQgeSwgX19nbG9iYWwgaW50NCAqcXVvKTsKK2Zsb2F0OCBfX292bGQgcmVtcXVvKGZsb2F0OCB4LCBmbG9hdDggeSwgX19nbG9iYWwgaW50OCAqcXVvKTsKK2Zsb2F0MTYgX19vdmxkIHJlbXF1byhmbG9hdDE2IHgsIGZsb2F0MTYgeSwgX19nbG9iYWwgaW50MTYgKnF1byk7CitmbG9hdCBfX292bGQgcmVtcXVvKGZsb2F0IHgsIGZsb2F0IHksIF9fbG9jYWwgaW50ICpxdW8pOworZmxvYXQyIF9fb3ZsZCByZW1xdW8oZmxvYXQyIHgsIGZsb2F0MiB5LCBfX2xvY2FsIGludDIgKnF1byk7CitmbG9hdDMgX19vdmxkIHJlbXF1byhmbG9hdDMgeCwgZmxvYXQzIHksIF9fbG9jYWwgaW50MyAqcXVvKTsKK2Zsb2F0NCBfX292bGQgcmVtcXVvKGZsb2F0NCB4LCBmbG9hdDQgeSwgX19sb2NhbCBpbnQ0ICpxdW8pOworZmxvYXQ4IF9fb3ZsZCByZW1xdW8oZmxvYXQ4IHgsIGZsb2F0OCB5LCBfX2xvY2FsIGludDggKnF1byk7CitmbG9hdDE2IF9fb3ZsZCByZW1xdW8oZmxvYXQxNiB4LCBmbG9hdDE2IHksIF9fbG9jYWwgaW50MTYgKnF1byk7CitmbG9hdCBfX292bGQgcmVtcXVvKGZsb2F0IHgsIGZsb2F0IHksIF9fcHJpdmF0ZSBpbnQgKnF1byk7CitmbG9hdDIgX19vdmxkIHJlbXF1byhmbG9hdDIgeCwgZmxvYXQyIHksIF9fcHJpdmF0ZSBpbnQyICpxdW8pOworZmxvYXQzIF9fb3ZsZCByZW1xdW8oZmxvYXQzIHgsIGZsb2F0MyB5LCBfX3ByaXZhdGUgaW50MyAqcXVvKTsKK2Zsb2F0NCBfX292bGQgcmVtcXVvKGZsb2F0NCB4LCBmbG9hdDQgeSwgX19wcml2YXRlIGludDQgKnF1byk7CitmbG9hdDggX19vdmxkIHJlbXF1byhmbG9hdDggeCwgZmxvYXQ4IHksIF9fcHJpdmF0ZSBpbnQ4ICpxdW8pOworZmxvYXQxNiBfX292bGQgcmVtcXVvKGZsb2F0MTYgeCwgZmxvYXQxNiB5LCBfX3ByaXZhdGUgaW50MTYgKnF1byk7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2RvdWJsZSBfX292bGQgcmVtcXVvKGRvdWJsZSB4LCBkb3VibGUgeSwgX19nbG9iYWwgaW50ICpxdW8pOworZG91YmxlMiBfX292bGQgcmVtcXVvKGRvdWJsZTIgeCwgZG91YmxlMiB5LCBfX2dsb2JhbCBpbnQyICpxdW8pOworZG91YmxlMyBfX292bGQgcmVtcXVvKGRvdWJsZTMgeCwgZG91YmxlMyB5LCBfX2dsb2JhbCBpbnQzICpxdW8pOworZG91YmxlNCBfX292bGQgcmVtcXVvKGRvdWJsZTQgeCwgZG91YmxlNCB5LCBfX2dsb2JhbCBpbnQ0ICpxdW8pOworZG91YmxlOCBfX292bGQgcmVtcXVvKGRvdWJsZTggeCwgZG91YmxlOCB5LCBfX2dsb2JhbCBpbnQ4ICpxdW8pOworZG91YmxlMTYgX19vdmxkIHJlbXF1byhkb3VibGUxNiB4LCBkb3VibGUxNiB5LCBfX2dsb2JhbCBpbnQxNiAqcXVvKTsKK2RvdWJsZSBfX292bGQgcmVtcXVvKGRvdWJsZSB4LCBkb3VibGUgeSwgX19sb2NhbCBpbnQgKnF1byk7Citkb3VibGUyIF9fb3ZsZCByZW1xdW8oZG91YmxlMiB4LCBkb3VibGUyIHksIF9fbG9jYWwgaW50MiAqcXVvKTsKK2RvdWJsZTMgX19vdmxkIHJlbXF1byhkb3VibGUzIHgsIGRvdWJsZTMgeSwgX19sb2NhbCBpbnQzICpxdW8pOworZG91YmxlNCBfX292bGQgcmVtcXVvKGRvdWJsZTQgeCwgZG91YmxlNCB5LCBfX2xvY2FsIGludDQgKnF1byk7Citkb3VibGU4IF9fb3ZsZCByZW1xdW8oZG91YmxlOCB4LCBkb3VibGU4IHksIF9fbG9jYWwgaW50OCAqcXVvKTsKK2RvdWJsZTE2IF9fb3ZsZCByZW1xdW8oZG91YmxlMTYgeCwgZG91YmxlMTYgeSwgX19sb2NhbCBpbnQxNiAqcXVvKTsKK2RvdWJsZSBfX292bGQgcmVtcXVvKGRvdWJsZSB4LCBkb3VibGUgeSwgX19wcml2YXRlIGludCAqcXVvKTsKK2RvdWJsZTIgX19vdmxkIHJlbXF1byhkb3VibGUyIHgsIGRvdWJsZTIgeSwgX19wcml2YXRlIGludDIgKnF1byk7Citkb3VibGUzIF9fb3ZsZCByZW1xdW8oZG91YmxlMyB4LCBkb3VibGUzIHksIF9fcHJpdmF0ZSBpbnQzICpxdW8pOworZG91YmxlNCBfX292bGQgcmVtcXVvKGRvdWJsZTQgeCwgZG91YmxlNCB5LCBfX3ByaXZhdGUgaW50NCAqcXVvKTsKK2RvdWJsZTggX19vdmxkIHJlbXF1byhkb3VibGU4IHgsIGRvdWJsZTggeSwgX19wcml2YXRlIGludDggKnF1byk7Citkb3VibGUxNiBfX292bGQgcmVtcXVvKGRvdWJsZTE2IHgsIGRvdWJsZTE2IHksIF9fcHJpdmF0ZSBpbnQxNiAqcXVvKTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2hhbGYgX19vdmxkIHJlbXF1byhoYWxmIHgsIGhhbGYgeSwgX19nbG9iYWwgaW50ICpxdW8pOworaGFsZjIgX19vdmxkIHJlbXF1byhoYWxmMiB4LCBoYWxmMiB5LCBfX2dsb2JhbCBpbnQyICpxdW8pOworaGFsZjMgX19vdmxkIHJlbXF1byhoYWxmMyB4LCBoYWxmMyB5LCBfX2dsb2JhbCBpbnQzICpxdW8pOworaGFsZjQgX19vdmxkIHJlbXF1byhoYWxmNCB4LCBoYWxmNCB5LCBfX2dsb2JhbCBpbnQ0ICpxdW8pOworaGFsZjggX19vdmxkIHJlbXF1byhoYWxmOCB4LCBoYWxmOCB5LCBfX2dsb2JhbCBpbnQ4ICpxdW8pOworaGFsZjE2IF9fb3ZsZCByZW1xdW8oaGFsZjE2IHgsIGhhbGYxNiB5LCBfX2dsb2JhbCBpbnQxNiAqcXVvKTsKK2hhbGYgX19vdmxkIHJlbXF1byhoYWxmIHgsIGhhbGYgeSwgX19sb2NhbCBpbnQgKnF1byk7CitoYWxmMiBfX292bGQgcmVtcXVvKGhhbGYyIHgsIGhhbGYyIHksIF9fbG9jYWwgaW50MiAqcXVvKTsKK2hhbGYzIF9fb3ZsZCByZW1xdW8oaGFsZjMgeCwgaGFsZjMgeSwgX19sb2NhbCBpbnQzICpxdW8pOworaGFsZjQgX19vdmxkIHJlbXF1byhoYWxmNCB4LCBoYWxmNCB5LCBfX2xvY2FsIGludDQgKnF1byk7CitoYWxmOCBfX292bGQgcmVtcXVvKGhhbGY4IHgsIGhhbGY4IHksIF9fbG9jYWwgaW50OCAqcXVvKTsKK2hhbGYxNiBfX292bGQgcmVtcXVvKGhhbGYxNiB4LCBoYWxmMTYgeSwgX19sb2NhbCBpbnQxNiAqcXVvKTsKK2hhbGYgX19vdmxkIHJlbXF1byhoYWxmIHgsIGhhbGYgeSwgX19wcml2YXRlIGludCAqcXVvKTsKK2hhbGYyIF9fb3ZsZCByZW1xdW8oaGFsZjIgeCwgaGFsZjIgeSwgX19wcml2YXRlIGludDIgKnF1byk7CitoYWxmMyBfX292bGQgcmVtcXVvKGhhbGYzIHgsIGhhbGYzIHksIF9fcHJpdmF0ZSBpbnQzICpxdW8pOworaGFsZjQgX19vdmxkIHJlbXF1byhoYWxmNCB4LCBoYWxmNCB5LCBfX3ByaXZhdGUgaW50NCAqcXVvKTsKK2hhbGY4IF9fb3ZsZCByZW1xdW8oaGFsZjggeCwgaGFsZjggeSwgX19wcml2YXRlIGludDggKnF1byk7CitoYWxmMTYgX19vdmxkIHJlbXF1byhoYWxmMTYgeCwgaGFsZjE2IHksIF9fcHJpdmF0ZSBpbnQxNiAqcXVvKTsKKyNlbmRpZiAvL2NsX2tocl9mcDE2CisjZW5kaWYgLy9fX09QRU5DTF9DX1ZFUlNJT05fXyA+PSBDTF9WRVJTSU9OXzJfMAorLyoqCisgKiBSb3VuZCB0byBpbnRlZ3JhbCB2YWx1ZSAodXNpbmcgcm91bmQgdG8gbmVhcmVzdAorICogZXZlbiByb3VuZGluZyBtb2RlKSBpbiBmbG9hdGluZy1wb2ludCBmb3JtYXQuCisgKiBSZWZlciB0byBzZWN0aW9uIDcuMSBmb3IgZGVzY3JpcHRpb24gb2Ygcm91bmRpbmcKKyAqIG1vZGVzLgorICovCitmbG9hdCBfX292bGQgX19jbmZuIHJpbnQoZmxvYXQpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gcmludChmbG9hdDIpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gcmludChmbG9hdDMpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gcmludChmbG9hdDQpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gcmludChmbG9hdDgpOworZmxvYXQxNiBfX292bGQgX19jbmZuIHJpbnQoZmxvYXQxNik7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2RvdWJsZSBfX292bGQgX19jbmZuIHJpbnQoZG91YmxlKTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiByaW50KGRvdWJsZTIpOworZG91YmxlMyBfX292bGQgX19jbmZuIHJpbnQoZG91YmxlMyk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gcmludChkb3VibGU0KTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiByaW50KGRvdWJsZTgpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiByaW50KGRvdWJsZTE2KTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2hhbGYgX19vdmxkIF9fY25mbiByaW50KGhhbGYpOworaGFsZjIgX19vdmxkIF9fY25mbiByaW50KGhhbGYyKTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gcmludChoYWxmMyk7CitoYWxmNCBfX292bGQgX19jbmZuIHJpbnQoaGFsZjQpOworaGFsZjggX19vdmxkIF9fY25mbiByaW50KGhhbGY4KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIHJpbnQoaGFsZjE2KTsKKyNlbmRpZiAvL2NsX2tocl9mcDE2CisKKy8qKgorICogQ29tcHV0ZSB4IHRvIHRoZSBwb3dlciAxL3kuCisgKi8KK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gcm9vdG4oZmxvYXQgeCwgaW50IHkpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gcm9vdG4oZmxvYXQyIHgsIGludDIgeSk7CitmbG9hdDMgX19vdmxkIF9fY25mbiByb290bihmbG9hdDMgeCwgaW50MyB5KTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIHJvb3RuKGZsb2F0NCB4LCBpbnQ0IHkpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gcm9vdG4oZmxvYXQ4IHgsIGludDggeSk7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gcm9vdG4oZmxvYXQxNiB4LCBpbnQxNiB5KTsKKyNpZmRlZiBjbF9raHJfZnA2NAorZG91YmxlIF9fb3ZsZCBfX2NuZm4gcm9vdG4oZG91YmxlIHgsIGludCB5KTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiByb290bihkb3VibGUyIHgsIGludDIgeSk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gcm9vdG4oZG91YmxlMyB4LCBpbnQzIHkpOworZG91YmxlNCBfX292bGQgX19jbmZuIHJvb3RuKGRvdWJsZTQgeCwgaW50NCB5KTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiByb290bihkb3VibGU4IHgsIGludDggeSk7Citkb3VibGUxNiBfX292bGQgX19jbmZuIHJvb3RuKGRvdWJsZTE2IHgsIGludDE2IHkpOworI2VuZGlmIC8vY2xfa2hyX2ZwNjQKKyNpZmRlZiBjbF9raHJfZnAxNgoraGFsZiBfX292bGQgX19jbmZuIHJvb3RuKGhhbGYgeCwgaW50IHkpOworaGFsZjIgX19vdmxkIF9fY25mbiByb290bihoYWxmMiB4LCBpbnQyIHkpOworaGFsZjMgX19vdmxkIF9fY25mbiByb290bihoYWxmMyB4LCBpbnQzIHkpOworaGFsZjQgX19vdmxkIF9fY25mbiByb290bihoYWxmNCB4LCBpbnQ0IHkpOworaGFsZjggX19vdmxkIF9fY25mbiByb290bihoYWxmOCB4LCBpbnQ4IHkpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gcm9vdG4oaGFsZjE2IHgsIGludDE2IHkpOworI2VuZGlmIC8vY2xfa2hyX2ZwMTYKKworLyoqCisgKiBSZXR1cm4gdGhlIGludGVncmFsIHZhbHVlIG5lYXJlc3QgdG8geCByb3VuZGluZworICogaGFsZndheSBjYXNlcyBhd2F5IGZyb20gemVybywgcmVnYXJkbGVzcyBvZiB0aGUKKyAqIGN1cnJlbnQgcm91bmRpbmcgZGlyZWN0aW9uLgorICovCitmbG9hdCBfX292bGQgX19jbmZuIHJvdW5kKGZsb2F0IHgpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gcm91bmQoZmxvYXQyIHgpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gcm91bmQoZmxvYXQzIHgpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gcm91bmQoZmxvYXQ0IHgpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gcm91bmQoZmxvYXQ4IHgpOworZmxvYXQxNiBfX292bGQgX19jbmZuIHJvdW5kKGZsb2F0MTYgeCk7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2RvdWJsZSBfX292bGQgX19jbmZuIHJvdW5kKGRvdWJsZSB4KTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiByb3VuZChkb3VibGUyIHgpOworZG91YmxlMyBfX292bGQgX19jbmZuIHJvdW5kKGRvdWJsZTMgeCk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gcm91bmQoZG91YmxlNCB4KTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiByb3VuZChkb3VibGU4IHgpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiByb3VuZChkb3VibGUxNiB4KTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2hhbGYgX19vdmxkIF9fY25mbiByb3VuZChoYWxmIHgpOworaGFsZjIgX19vdmxkIF9fY25mbiByb3VuZChoYWxmMiB4KTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gcm91bmQoaGFsZjMgeCk7CitoYWxmNCBfX292bGQgX19jbmZuIHJvdW5kKGhhbGY0IHgpOworaGFsZjggX19vdmxkIF9fY25mbiByb3VuZChoYWxmOCB4KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIHJvdW5kKGhhbGYxNiB4KTsKKyNlbmRpZiAvL2NsX2tocl9mcDE2CisKKy8qKgorICogQ29tcHV0ZSBpbnZlcnNlIHNxdWFyZSByb290LgorICovCitmbG9hdCBfX292bGQgX19jbmZuIHJzcXJ0KGZsb2F0KTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIHJzcXJ0KGZsb2F0Mik7CitmbG9hdDMgX19vdmxkIF9fY25mbiByc3FydChmbG9hdDMpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gcnNxcnQoZmxvYXQ0KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIHJzcXJ0KGZsb2F0OCk7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gcnNxcnQoZmxvYXQxNik7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2RvdWJsZSBfX292bGQgX19jbmZuIHJzcXJ0KGRvdWJsZSk7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gcnNxcnQoZG91YmxlMik7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gcnNxcnQoZG91YmxlMyk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gcnNxcnQoZG91YmxlNCk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gcnNxcnQoZG91YmxlOCk7Citkb3VibGUxNiBfX292bGQgX19jbmZuIHJzcXJ0KGRvdWJsZTE2KTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2hhbGYgX19vdmxkIF9fY25mbiByc3FydChoYWxmKTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gcnNxcnQoaGFsZjIpOworaGFsZjMgX19vdmxkIF9fY25mbiByc3FydChoYWxmMyk7CitoYWxmNCBfX292bGQgX19jbmZuIHJzcXJ0KGhhbGY0KTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gcnNxcnQoaGFsZjgpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gcnNxcnQoaGFsZjE2KTsKKyNlbmRpZiAvL2NsX2tocl9mcDE2CisKKy8qKgorICogQ29tcHV0ZSBzaW5lLgorICovCitmbG9hdCBfX292bGQgX19jbmZuIHNpbihmbG9hdCk7CitmbG9hdDIgX19vdmxkIF9fY25mbiBzaW4oZmxvYXQyKTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIHNpbihmbG9hdDMpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gc2luKGZsb2F0NCk7CitmbG9hdDggX19vdmxkIF9fY25mbiBzaW4oZmxvYXQ4KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBzaW4oZmxvYXQxNik7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2RvdWJsZSBfX292bGQgX19jbmZuIHNpbihkb3VibGUpOworZG91YmxlMiBfX292bGQgX19jbmZuIHNpbihkb3VibGUyKTsKK2RvdWJsZTMgX19vdmxkIF9fY25mbiBzaW4oZG91YmxlMyk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gc2luKGRvdWJsZTQpOworZG91YmxlOCBfX292bGQgX19jbmZuIHNpbihkb3VibGU4KTsKK2RvdWJsZTE2IF9fb3ZsZCBfX2NuZm4gc2luKGRvdWJsZTE2KTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2hhbGYgX19vdmxkIF9fY25mbiBzaW4oaGFsZik7CitoYWxmMiBfX292bGQgX19jbmZuIHNpbihoYWxmMik7CitoYWxmMyBfX292bGQgX19jbmZuIHNpbihoYWxmMyk7CitoYWxmNCBfX292bGQgX19jbmZuIHNpbihoYWxmNCk7CitoYWxmOCBfX292bGQgX19jbmZuIHNpbihoYWxmOCk7CitoYWxmMTYgX19vdmxkIF9fY25mbiBzaW4oaGFsZjE2KTsKKyNlbmRpZiAvL2NsX2tocl9mcDE2CisKKy8qKgorICogQ29tcHV0ZSBzaW5lIGFuZCBjb3NpbmUgb2YgeC4gVGhlIGNvbXB1dGVkIHNpbmUKKyAqIGlzIHRoZSByZXR1cm4gdmFsdWUgYW5kIGNvbXB1dGVkIGNvc2luZSBpcyByZXR1cm5lZAorICogaW4gY29zdmFsLgorICovCisjaWYgX19PUEVOQ0xfQ19WRVJTSU9OX18gPj0gQ0xfVkVSU0lPTl8yXzAKK2Zsb2F0IF9fb3ZsZCBzaW5jb3MoZmxvYXQgeCwgZmxvYXQgKmNvc3ZhbCk7CitmbG9hdDIgX19vdmxkIHNpbmNvcyhmbG9hdDIgeCwgZmxvYXQyICpjb3N2YWwpOworZmxvYXQzIF9fb3ZsZCBzaW5jb3MoZmxvYXQzIHgsIGZsb2F0MyAqY29zdmFsKTsKK2Zsb2F0NCBfX292bGQgc2luY29zKGZsb2F0NCB4LCBmbG9hdDQgKmNvc3ZhbCk7CitmbG9hdDggX19vdmxkIHNpbmNvcyhmbG9hdDggeCwgZmxvYXQ4ICpjb3N2YWwpOworZmxvYXQxNiBfX292bGQgc2luY29zKGZsb2F0MTYgeCwgZmxvYXQxNiAqY29zdmFsKTsKKyNpZmRlZiBjbF9raHJfZnA2NAorZG91YmxlIF9fb3ZsZCBzaW5jb3MoZG91YmxlIHgsIGRvdWJsZSAqY29zdmFsKTsKK2RvdWJsZTIgX19vdmxkIHNpbmNvcyhkb3VibGUyIHgsIGRvdWJsZTIgKmNvc3ZhbCk7Citkb3VibGUzIF9fb3ZsZCBzaW5jb3MoZG91YmxlMyB4LCBkb3VibGUzICpjb3N2YWwpOworZG91YmxlNCBfX292bGQgc2luY29zKGRvdWJsZTQgeCwgZG91YmxlNCAqY29zdmFsKTsKK2RvdWJsZTggX19vdmxkIHNpbmNvcyhkb3VibGU4IHgsIGRvdWJsZTggKmNvc3ZhbCk7Citkb3VibGUxNiBfX292bGQgc2luY29zKGRvdWJsZTE2IHgsIGRvdWJsZTE2ICpjb3N2YWwpOworI2VuZGlmIC8vY2xfa2hyX2ZwNjQKKyNpZmRlZiBjbF9raHJfZnAxNgoraGFsZiBfX292bGQgc2luY29zKGhhbGYgeCwgaGFsZiAqY29zdmFsKTsKK2hhbGYyIF9fb3ZsZCBzaW5jb3MoaGFsZjIgeCwgaGFsZjIgKmNvc3ZhbCk7CitoYWxmMyBfX292bGQgc2luY29zKGhhbGYzIHgsIGhhbGYzICpjb3N2YWwpOworaGFsZjQgX19vdmxkIHNpbmNvcyhoYWxmNCB4LCBoYWxmNCAqY29zdmFsKTsKK2hhbGY4IF9fb3ZsZCBzaW5jb3MoaGFsZjggeCwgaGFsZjggKmNvc3ZhbCk7CitoYWxmMTYgX19vdmxkIHNpbmNvcyhoYWxmMTYgeCwgaGFsZjE2ICpjb3N2YWwpOworI2VuZGlmIC8vY2xfa2hyX2ZwMTYKKyNlbHNlCitmbG9hdCBfX292bGQgc2luY29zKGZsb2F0IHgsIF9fZ2xvYmFsIGZsb2F0ICpjb3N2YWwpOworZmxvYXQyIF9fb3ZsZCBzaW5jb3MoZmxvYXQyIHgsIF9fZ2xvYmFsIGZsb2F0MiAqY29zdmFsKTsKK2Zsb2F0MyBfX292bGQgc2luY29zKGZsb2F0MyB4LCBfX2dsb2JhbCBmbG9hdDMgKmNvc3ZhbCk7CitmbG9hdDQgX19vdmxkIHNpbmNvcyhmbG9hdDQgeCwgX19nbG9iYWwgZmxvYXQ0ICpjb3N2YWwpOworZmxvYXQ4IF9fb3ZsZCBzaW5jb3MoZmxvYXQ4IHgsIF9fZ2xvYmFsIGZsb2F0OCAqY29zdmFsKTsKK2Zsb2F0MTYgX19vdmxkIHNpbmNvcyhmbG9hdDE2IHgsIF9fZ2xvYmFsIGZsb2F0MTYgKmNvc3ZhbCk7CitmbG9hdCBfX292bGQgc2luY29zKGZsb2F0IHgsIF9fbG9jYWwgZmxvYXQgKmNvc3ZhbCk7CitmbG9hdDIgX19vdmxkIHNpbmNvcyhmbG9hdDIgeCwgX19sb2NhbCBmbG9hdDIgKmNvc3ZhbCk7CitmbG9hdDMgX19vdmxkIHNpbmNvcyhmbG9hdDMgeCwgX19sb2NhbCBmbG9hdDMgKmNvc3ZhbCk7CitmbG9hdDQgX19vdmxkIHNpbmNvcyhmbG9hdDQgeCwgX19sb2NhbCBmbG9hdDQgKmNvc3ZhbCk7CitmbG9hdDggX19vdmxkIHNpbmNvcyhmbG9hdDggeCwgX19sb2NhbCBmbG9hdDggKmNvc3ZhbCk7CitmbG9hdDE2IF9fb3ZsZCBzaW5jb3MoZmxvYXQxNiB4LCBfX2xvY2FsIGZsb2F0MTYgKmNvc3ZhbCk7CitmbG9hdCBfX292bGQgc2luY29zKGZsb2F0IHgsIF9fcHJpdmF0ZSBmbG9hdCAqY29zdmFsKTsKK2Zsb2F0MiBfX292bGQgc2luY29zKGZsb2F0MiB4LCBfX3ByaXZhdGUgZmxvYXQyICpjb3N2YWwpOworZmxvYXQzIF9fb3ZsZCBzaW5jb3MoZmxvYXQzIHgsIF9fcHJpdmF0ZSBmbG9hdDMgKmNvc3ZhbCk7CitmbG9hdDQgX19vdmxkIHNpbmNvcyhmbG9hdDQgeCwgX19wcml2YXRlIGZsb2F0NCAqY29zdmFsKTsKK2Zsb2F0OCBfX292bGQgc2luY29zKGZsb2F0OCB4LCBfX3ByaXZhdGUgZmxvYXQ4ICpjb3N2YWwpOworZmxvYXQxNiBfX292bGQgc2luY29zKGZsb2F0MTYgeCwgX19wcml2YXRlIGZsb2F0MTYgKmNvc3ZhbCk7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2RvdWJsZSBfX292bGQgc2luY29zKGRvdWJsZSB4LCBfX2dsb2JhbCBkb3VibGUgKmNvc3ZhbCk7Citkb3VibGUyIF9fb3ZsZCBzaW5jb3MoZG91YmxlMiB4LCBfX2dsb2JhbCBkb3VibGUyICpjb3N2YWwpOworZG91YmxlMyBfX292bGQgc2luY29zKGRvdWJsZTMgeCwgX19nbG9iYWwgZG91YmxlMyAqY29zdmFsKTsKK2RvdWJsZTQgX19vdmxkIHNpbmNvcyhkb3VibGU0IHgsIF9fZ2xvYmFsIGRvdWJsZTQgKmNvc3ZhbCk7Citkb3VibGU4IF9fb3ZsZCBzaW5jb3MoZG91YmxlOCB4LCBfX2dsb2JhbCBkb3VibGU4ICpjb3N2YWwpOworZG91YmxlMTYgX19vdmxkIHNpbmNvcyhkb3VibGUxNiB4LCBfX2dsb2JhbCBkb3VibGUxNiAqY29zdmFsKTsKK2RvdWJsZSBfX292bGQgc2luY29zKGRvdWJsZSB4LCBfX2xvY2FsIGRvdWJsZSAqY29zdmFsKTsKK2RvdWJsZTIgX19vdmxkIHNpbmNvcyhkb3VibGUyIHgsIF9fbG9jYWwgZG91YmxlMiAqY29zdmFsKTsKK2RvdWJsZTMgX19vdmxkIHNpbmNvcyhkb3VibGUzIHgsIF9fbG9jYWwgZG91YmxlMyAqY29zdmFsKTsKK2RvdWJsZTQgX19vdmxkIHNpbmNvcyhkb3VibGU0IHgsIF9fbG9jYWwgZG91YmxlNCAqY29zdmFsKTsKK2RvdWJsZTggX19vdmxkIHNpbmNvcyhkb3VibGU4IHgsIF9fbG9jYWwgZG91YmxlOCAqY29zdmFsKTsKK2RvdWJsZTE2IF9fb3ZsZCBzaW5jb3MoZG91YmxlMTYgeCwgX19sb2NhbCBkb3VibGUxNiAqY29zdmFsKTsKK2RvdWJsZSBfX292bGQgc2luY29zKGRvdWJsZSB4LCBfX3ByaXZhdGUgZG91YmxlICpjb3N2YWwpOworZG91YmxlMiBfX292bGQgc2luY29zKGRvdWJsZTIgeCwgX19wcml2YXRlIGRvdWJsZTIgKmNvc3ZhbCk7Citkb3VibGUzIF9fb3ZsZCBzaW5jb3MoZG91YmxlMyB4LCBfX3ByaXZhdGUgZG91YmxlMyAqY29zdmFsKTsKK2RvdWJsZTQgX19vdmxkIHNpbmNvcyhkb3VibGU0IHgsIF9fcHJpdmF0ZSBkb3VibGU0ICpjb3N2YWwpOworZG91YmxlOCBfX292bGQgc2luY29zKGRvdWJsZTggeCwgX19wcml2YXRlIGRvdWJsZTggKmNvc3ZhbCk7Citkb3VibGUxNiBfX292bGQgc2luY29zKGRvdWJsZTE2IHgsIF9fcHJpdmF0ZSBkb3VibGUxNiAqY29zdmFsKTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2hhbGYgX19vdmxkIHNpbmNvcyhoYWxmIHgsIF9fZ2xvYmFsIGhhbGYgKmNvc3ZhbCk7CitoYWxmMiBfX292bGQgc2luY29zKGhhbGYyIHgsIF9fZ2xvYmFsIGhhbGYyICpjb3N2YWwpOworaGFsZjMgX19vdmxkIHNpbmNvcyhoYWxmMyB4LCBfX2dsb2JhbCBoYWxmMyAqY29zdmFsKTsKK2hhbGY0IF9fb3ZsZCBzaW5jb3MoaGFsZjQgeCwgX19nbG9iYWwgaGFsZjQgKmNvc3ZhbCk7CitoYWxmOCBfX292bGQgc2luY29zKGhhbGY4IHgsIF9fZ2xvYmFsIGhhbGY4ICpjb3N2YWwpOworaGFsZjE2IF9fb3ZsZCBzaW5jb3MoaGFsZjE2IHgsIF9fZ2xvYmFsIGhhbGYxNiAqY29zdmFsKTsKK2hhbGYgX19vdmxkIHNpbmNvcyhoYWxmIHgsIF9fbG9jYWwgaGFsZiAqY29zdmFsKTsKK2hhbGYyIF9fb3ZsZCBzaW5jb3MoaGFsZjIgeCwgX19sb2NhbCBoYWxmMiAqY29zdmFsKTsKK2hhbGYzIF9fb3ZsZCBzaW5jb3MoaGFsZjMgeCwgX19sb2NhbCBoYWxmMyAqY29zdmFsKTsKK2hhbGY0IF9fb3ZsZCBzaW5jb3MoaGFsZjQgeCwgX19sb2NhbCBoYWxmNCAqY29zdmFsKTsKK2hhbGY4IF9fb3ZsZCBzaW5jb3MoaGFsZjggeCwgX19sb2NhbCBoYWxmOCAqY29zdmFsKTsKK2hhbGYxNiBfX292bGQgc2luY29zKGhhbGYxNiB4LCBfX2xvY2FsIGhhbGYxNiAqY29zdmFsKTsKK2hhbGYgX19vdmxkIHNpbmNvcyhoYWxmIHgsIF9fcHJpdmF0ZSBoYWxmICpjb3N2YWwpOworaGFsZjIgX19vdmxkIHNpbmNvcyhoYWxmMiB4LCBfX3ByaXZhdGUgaGFsZjIgKmNvc3ZhbCk7CitoYWxmMyBfX292bGQgc2luY29zKGhhbGYzIHgsIF9fcHJpdmF0ZSBoYWxmMyAqY29zdmFsKTsKK2hhbGY0IF9fb3ZsZCBzaW5jb3MoaGFsZjQgeCwgX19wcml2YXRlIGhhbGY0ICpjb3N2YWwpOworaGFsZjggX19vdmxkIHNpbmNvcyhoYWxmOCB4LCBfX3ByaXZhdGUgaGFsZjggKmNvc3ZhbCk7CitoYWxmMTYgX19vdmxkIHNpbmNvcyhoYWxmMTYgeCwgX19wcml2YXRlIGhhbGYxNiAqY29zdmFsKTsKKyNlbmRpZiAvL2NsX2tocl9mcDE2CisjZW5kaWYgLy9fX09QRU5DTF9DX1ZFUlNJT05fXyA+PSBDTF9WRVJTSU9OXzJfMAorCisvKioKKyAqIENvbXB1dGUgaHlwZXJib2xpYyBzaW5lLgorICovCitmbG9hdCBfX292bGQgX19jbmZuIHNpbmgoZmxvYXQpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gc2luaChmbG9hdDIpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gc2luaChmbG9hdDMpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gc2luaChmbG9hdDQpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gc2luaChmbG9hdDgpOworZmxvYXQxNiBfX292bGQgX19jbmZuIHNpbmgoZmxvYXQxNik7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2RvdWJsZSBfX292bGQgX19jbmZuIHNpbmgoZG91YmxlKTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBzaW5oKGRvdWJsZTIpOworZG91YmxlMyBfX292bGQgX19jbmZuIHNpbmgoZG91YmxlMyk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gc2luaChkb3VibGU0KTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBzaW5oKGRvdWJsZTgpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBzaW5oKGRvdWJsZTE2KTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2hhbGYgX19vdmxkIF9fY25mbiBzaW5oKGhhbGYpOworaGFsZjIgX19vdmxkIF9fY25mbiBzaW5oKGhhbGYyKTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gc2luaChoYWxmMyk7CitoYWxmNCBfX292bGQgX19jbmZuIHNpbmgoaGFsZjQpOworaGFsZjggX19vdmxkIF9fY25mbiBzaW5oKGhhbGY4KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIHNpbmgoaGFsZjE2KTsKKyNlbmRpZiAvL2NsX2tocl9mcDE2CisKKy8qKgorICogQ29tcHV0ZSBzaW4gKFBJICogeCkuCisgKi8KK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gc2lucGkoZmxvYXQgeCk7CitmbG9hdDIgX19vdmxkIF9fY25mbiBzaW5waShmbG9hdDIgeCk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBzaW5waShmbG9hdDMgeCk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBzaW5waShmbG9hdDQgeCk7CitmbG9hdDggX19vdmxkIF9fY25mbiBzaW5waShmbG9hdDggeCk7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gc2lucGkoZmxvYXQxNiB4KTsKKyNpZmRlZiBjbF9raHJfZnA2NAorZG91YmxlIF9fb3ZsZCBfX2NuZm4gc2lucGkoZG91YmxlIHgpOworZG91YmxlMiBfX292bGQgX19jbmZuIHNpbnBpKGRvdWJsZTIgeCk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gc2lucGkoZG91YmxlMyB4KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBzaW5waShkb3VibGU0IHgpOworZG91YmxlOCBfX292bGQgX19jbmZuIHNpbnBpKGRvdWJsZTggeCk7Citkb3VibGUxNiBfX292bGQgX19jbmZuIHNpbnBpKGRvdWJsZTE2IHgpOworI2VuZGlmIC8vY2xfa2hyX2ZwNjQKKyNpZmRlZiBjbF9raHJfZnAxNgoraGFsZiBfX292bGQgX19jbmZuIHNpbnBpKGhhbGYgeCk7CitoYWxmMiBfX292bGQgX19jbmZuIHNpbnBpKGhhbGYyIHgpOworaGFsZjMgX19vdmxkIF9fY25mbiBzaW5waShoYWxmMyB4KTsKK2hhbGY0IF9fb3ZsZCBfX2NuZm4gc2lucGkoaGFsZjQgeCk7CitoYWxmOCBfX292bGQgX19jbmZuIHNpbnBpKGhhbGY4IHgpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gc2lucGkoaGFsZjE2IHgpOworI2VuZGlmIC8vY2xfa2hyX2ZwMTYKKworLyoqCisgKiBDb21wdXRlIHNxdWFyZSByb290LgorICovCitmbG9hdCBfX292bGQgX19jbmZuIHNxcnQoZmxvYXQpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gc3FydChmbG9hdDIpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gc3FydChmbG9hdDMpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gc3FydChmbG9hdDQpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gc3FydChmbG9hdDgpOworZmxvYXQxNiBfX292bGQgX19jbmZuIHNxcnQoZmxvYXQxNik7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2RvdWJsZSBfX292bGQgX19jbmZuIHNxcnQoZG91YmxlKTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBzcXJ0KGRvdWJsZTIpOworZG91YmxlMyBfX292bGQgX19jbmZuIHNxcnQoZG91YmxlMyk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gc3FydChkb3VibGU0KTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBzcXJ0KGRvdWJsZTgpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBzcXJ0KGRvdWJsZTE2KTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2hhbGYgX19vdmxkIF9fY25mbiBzcXJ0KGhhbGYpOworaGFsZjIgX19vdmxkIF9fY25mbiBzcXJ0KGhhbGYyKTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gc3FydChoYWxmMyk7CitoYWxmNCBfX292bGQgX19jbmZuIHNxcnQoaGFsZjQpOworaGFsZjggX19vdmxkIF9fY25mbiBzcXJ0KGhhbGY4KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIHNxcnQoaGFsZjE2KTsKKyNlbmRpZiAvL2NsX2tocl9mcDE2CisKKy8qKgorICogQ29tcHV0ZSB0YW5nZW50LgorICovCitmbG9hdCBfX292bGQgX19jbmZuIHRhbihmbG9hdCk7CitmbG9hdDIgX19vdmxkIF9fY25mbiB0YW4oZmxvYXQyKTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIHRhbihmbG9hdDMpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gdGFuKGZsb2F0NCk7CitmbG9hdDggX19vdmxkIF9fY25mbiB0YW4oZmxvYXQ4KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiB0YW4oZmxvYXQxNik7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2RvdWJsZSBfX292bGQgX19jbmZuIHRhbihkb3VibGUpOworZG91YmxlMiBfX292bGQgX19jbmZuIHRhbihkb3VibGUyKTsKK2RvdWJsZTMgX19vdmxkIF9fY25mbiB0YW4oZG91YmxlMyk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gdGFuKGRvdWJsZTQpOworZG91YmxlOCBfX292bGQgX19jbmZuIHRhbihkb3VibGU4KTsKK2RvdWJsZTE2IF9fb3ZsZCBfX2NuZm4gdGFuKGRvdWJsZTE2KTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2hhbGYgX19vdmxkIF9fY25mbiB0YW4oaGFsZik7CitoYWxmMiBfX292bGQgX19jbmZuIHRhbihoYWxmMik7CitoYWxmMyBfX292bGQgX19jbmZuIHRhbihoYWxmMyk7CitoYWxmNCBfX292bGQgX19jbmZuIHRhbihoYWxmNCk7CitoYWxmOCBfX292bGQgX19jbmZuIHRhbihoYWxmOCk7CitoYWxmMTYgX19vdmxkIF9fY25mbiB0YW4oaGFsZjE2KTsKKyNlbmRpZiAvL2NsX2tocl9mcDE2CisKKy8qKgorICogQ29tcHV0ZSBoeXBlcmJvbGljIHRhbmdlbnQuCisgKi8KK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gdGFuaChmbG9hdCk7CitmbG9hdDIgX19vdmxkIF9fY25mbiB0YW5oKGZsb2F0Mik7CitmbG9hdDMgX19vdmxkIF9fY25mbiB0YW5oKGZsb2F0Myk7CitmbG9hdDQgX19vdmxkIF9fY25mbiB0YW5oKGZsb2F0NCk7CitmbG9hdDggX19vdmxkIF9fY25mbiB0YW5oKGZsb2F0OCk7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gdGFuaChmbG9hdDE2KTsKKyNpZmRlZiBjbF9raHJfZnA2NAorZG91YmxlIF9fb3ZsZCBfX2NuZm4gdGFuaChkb3VibGUpOworZG91YmxlMiBfX292bGQgX19jbmZuIHRhbmgoZG91YmxlMik7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gdGFuaChkb3VibGUzKTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiB0YW5oKGRvdWJsZTQpOworZG91YmxlOCBfX292bGQgX19jbmZuIHRhbmgoZG91YmxlOCk7Citkb3VibGUxNiBfX292bGQgX19jbmZuIHRhbmgoZG91YmxlMTYpOworI2VuZGlmIC8vY2xfa2hyX2ZwNjQKKyNpZmRlZiBjbF9raHJfZnAxNgoraGFsZiBfX292bGQgX19jbmZuIHRhbmgoaGFsZik7CitoYWxmMiBfX292bGQgX19jbmZuIHRhbmgoaGFsZjIpOworaGFsZjMgX19vdmxkIF9fY25mbiB0YW5oKGhhbGYzKTsKK2hhbGY0IF9fb3ZsZCBfX2NuZm4gdGFuaChoYWxmNCk7CitoYWxmOCBfX292bGQgX19jbmZuIHRhbmgoaGFsZjgpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gdGFuaChoYWxmMTYpOworI2VuZGlmIC8vY2xfa2hyX2ZwMTYKKworLyoqCisgKiBDb21wdXRlIHRhbiAoUEkgKiB4KS4KKyAqLworZmxvYXQgX19vdmxkIF9fY25mbiB0YW5waShmbG9hdCB4KTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIHRhbnBpKGZsb2F0MiB4KTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIHRhbnBpKGZsb2F0MyB4KTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIHRhbnBpKGZsb2F0NCB4KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIHRhbnBpKGZsb2F0OCB4KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiB0YW5waShmbG9hdDE2IHgpOworI2lmZGVmIGNsX2tocl9mcDY0Citkb3VibGUgX19vdmxkIF9fY25mbiB0YW5waShkb3VibGUgeCk7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gdGFucGkoZG91YmxlMiB4KTsKK2RvdWJsZTMgX19vdmxkIF9fY25mbiB0YW5waShkb3VibGUzIHgpOworZG91YmxlNCBfX292bGQgX19jbmZuIHRhbnBpKGRvdWJsZTQgeCk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gdGFucGkoZG91YmxlOCB4KTsKK2RvdWJsZTE2IF9fb3ZsZCBfX2NuZm4gdGFucGkoZG91YmxlMTYgeCk7CisjZW5kaWYgLy9jbF9raHJfZnA2NAorI2lmZGVmIGNsX2tocl9mcDE2CitoYWxmIF9fb3ZsZCBfX2NuZm4gdGFucGkoaGFsZiB4KTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gdGFucGkoaGFsZjIgeCk7CitoYWxmMyBfX292bGQgX19jbmZuIHRhbnBpKGhhbGYzIHgpOworaGFsZjQgX19vdmxkIF9fY25mbiB0YW5waShoYWxmNCB4KTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gdGFucGkoaGFsZjggeCk7CitoYWxmMTYgX19vdmxkIF9fY25mbiB0YW5waShoYWxmMTYgeCk7CisjZW5kaWYgLy9jbF9raHJfZnAxNgorCisvKioKKyAqIENvbXB1dGUgdGhlIGdhbW1hIGZ1bmN0aW9uLgorICovCitmbG9hdCBfX292bGQgX19jbmZuIHRnYW1tYShmbG9hdCk7CitmbG9hdDIgX19vdmxkIF9fY25mbiB0Z2FtbWEoZmxvYXQyKTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIHRnYW1tYShmbG9hdDMpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gdGdhbW1hKGZsb2F0NCk7CitmbG9hdDggX19vdmxkIF9fY25mbiB0Z2FtbWEoZmxvYXQ4KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiB0Z2FtbWEoZmxvYXQxNik7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2RvdWJsZSBfX292bGQgX19jbmZuIHRnYW1tYShkb3VibGUpOworZG91YmxlMiBfX292bGQgX19jbmZuIHRnYW1tYShkb3VibGUyKTsKK2RvdWJsZTMgX19vdmxkIF9fY25mbiB0Z2FtbWEoZG91YmxlMyk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gdGdhbW1hKGRvdWJsZTQpOworZG91YmxlOCBfX292bGQgX19jbmZuIHRnYW1tYShkb3VibGU4KTsKK2RvdWJsZTE2IF9fb3ZsZCBfX2NuZm4gdGdhbW1hKGRvdWJsZTE2KTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2hhbGYgX19vdmxkIF9fY25mbiB0Z2FtbWEoaGFsZik7CitoYWxmMiBfX292bGQgX19jbmZuIHRnYW1tYShoYWxmMik7CitoYWxmMyBfX292bGQgX19jbmZuIHRnYW1tYShoYWxmMyk7CitoYWxmNCBfX292bGQgX19jbmZuIHRnYW1tYShoYWxmNCk7CitoYWxmOCBfX292bGQgX19jbmZuIHRnYW1tYShoYWxmOCk7CitoYWxmMTYgX19vdmxkIF9fY25mbiB0Z2FtbWEoaGFsZjE2KTsKKyNlbmRpZiAvL2NsX2tocl9mcDE2CisKKy8qKgorICogUm91bmQgdG8gaW50ZWdyYWwgdmFsdWUgdXNpbmcgdGhlIHJvdW5kIHRvIHplcm8KKyAqIHJvdW5kaW5nIG1vZGUuCisgKi8KK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gdHJ1bmMoZmxvYXQpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gdHJ1bmMoZmxvYXQyKTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIHRydW5jKGZsb2F0Myk7CitmbG9hdDQgX19vdmxkIF9fY25mbiB0cnVuYyhmbG9hdDQpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gdHJ1bmMoZmxvYXQ4KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiB0cnVuYyhmbG9hdDE2KTsKKyNpZmRlZiBjbF9raHJfZnA2NAorZG91YmxlIF9fb3ZsZCBfX2NuZm4gdHJ1bmMoZG91YmxlKTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiB0cnVuYyhkb3VibGUyKTsKK2RvdWJsZTMgX19vdmxkIF9fY25mbiB0cnVuYyhkb3VibGUzKTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiB0cnVuYyhkb3VibGU0KTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiB0cnVuYyhkb3VibGU4KTsKK2RvdWJsZTE2IF9fb3ZsZCBfX2NuZm4gdHJ1bmMoZG91YmxlMTYpOworI2VuZGlmIC8vY2xfa2hyX2ZwNjQKKyNpZmRlZiBjbF9raHJfZnAxNgoraGFsZiBfX292bGQgX19jbmZuIHRydW5jKGhhbGYpOworaGFsZjIgX19vdmxkIF9fY25mbiB0cnVuYyhoYWxmMik7CitoYWxmMyBfX292bGQgX19jbmZuIHRydW5jKGhhbGYzKTsKK2hhbGY0IF9fb3ZsZCBfX2NuZm4gdHJ1bmMoaGFsZjQpOworaGFsZjggX19vdmxkIF9fY25mbiB0cnVuYyhoYWxmOCk7CitoYWxmMTYgX19vdmxkIF9fY25mbiB0cnVuYyhoYWxmMTYpOworI2VuZGlmIC8vY2xfa2hyX2ZwMTYKKworLyoqCisgKiBDb21wdXRlIGNvc2luZS4geCBtdXN0IGJlIGluIHRoZSByYW5nZSAtMl4xNiAuLi4gKzJeMTYuCisgKi8KK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gaGFsZl9jb3MoZmxvYXQgeCk7CitmbG9hdDIgX19vdmxkIF9fY25mbiBoYWxmX2NvcyhmbG9hdDIgeCk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBoYWxmX2NvcyhmbG9hdDMgeCk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBoYWxmX2NvcyhmbG9hdDQgeCk7CitmbG9hdDggX19vdmxkIF9fY25mbiBoYWxmX2NvcyhmbG9hdDggeCk7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gaGFsZl9jb3MoZmxvYXQxNiB4KTsKKworLyoqCisgKiBDb21wdXRlIHggLyB5LgorICovCitmbG9hdCBfX292bGQgX19jbmZuIGhhbGZfZGl2aWRlKGZsb2F0IHgsIGZsb2F0IHkpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gaGFsZl9kaXZpZGUoZmxvYXQyIHgsIGZsb2F0MiB5KTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGhhbGZfZGl2aWRlKGZsb2F0MyB4LCBmbG9hdDMgeSk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBoYWxmX2RpdmlkZShmbG9hdDQgeCwgZmxvYXQ0IHkpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gaGFsZl9kaXZpZGUoZmxvYXQ4IHgsIGZsb2F0OCB5KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBoYWxmX2RpdmlkZShmbG9hdDE2IHgsIGZsb2F0MTYgeSk7CisKKy8qKgorICogQ29tcHV0ZSB0aGUgYmFzZS0gZSBleHBvbmVudGlhbCBvZiB4LgorICovCitmbG9hdCBfX292bGQgX19jbmZuIGhhbGZfZXhwKGZsb2F0IHgpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gaGFsZl9leHAoZmxvYXQyIHgpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gaGFsZl9leHAoZmxvYXQzIHgpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gaGFsZl9leHAoZmxvYXQ0IHgpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gaGFsZl9leHAoZmxvYXQ4IHgpOworZmxvYXQxNiBfX292bGQgX19jbmZuIGhhbGZfZXhwKGZsb2F0MTYgeCk7CisKKy8qKgorICogQ29tcHV0ZSB0aGUgYmFzZS0gMiBleHBvbmVudGlhbCBvZiB4LgorICovCitmbG9hdCBfX292bGQgX19jbmZuIGhhbGZfZXhwMihmbG9hdCB4KTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIGhhbGZfZXhwMihmbG9hdDIgeCk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBoYWxmX2V4cDIoZmxvYXQzIHgpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gaGFsZl9leHAyKGZsb2F0NCB4KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIGhhbGZfZXhwMihmbG9hdDggeCk7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gaGFsZl9leHAyKGZsb2F0MTYgeCk7CisKKy8qKgorICogQ29tcHV0ZSB0aGUgYmFzZS0gMTAgZXhwb25lbnRpYWwgb2YgeC4KKyAqLworZmxvYXQgX19vdmxkIF9fY25mbiBoYWxmX2V4cDEwKGZsb2F0IHgpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gaGFsZl9leHAxMChmbG9hdDIgeCk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBoYWxmX2V4cDEwKGZsb2F0MyB4KTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIGhhbGZfZXhwMTAoZmxvYXQ0IHgpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gaGFsZl9leHAxMChmbG9hdDggeCk7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gaGFsZl9leHAxMChmbG9hdDE2IHgpOworCisvKioKKyAqIENvbXB1dGUgbmF0dXJhbCBsb2dhcml0aG0uCisgKi8KK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gaGFsZl9sb2coZmxvYXQgeCk7CitmbG9hdDIgX19vdmxkIF9fY25mbiBoYWxmX2xvZyhmbG9hdDIgeCk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBoYWxmX2xvZyhmbG9hdDMgeCk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBoYWxmX2xvZyhmbG9hdDQgeCk7CitmbG9hdDggX19vdmxkIF9fY25mbiBoYWxmX2xvZyhmbG9hdDggeCk7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gaGFsZl9sb2coZmxvYXQxNiB4KTsKKworLyoqCisgKiBDb21wdXRlIGEgYmFzZSAyIGxvZ2FyaXRobS4KKyAqLworZmxvYXQgX19vdmxkIF9fY25mbiBoYWxmX2xvZzIoZmxvYXQgeCk7CitmbG9hdDIgX19vdmxkIF9fY25mbiBoYWxmX2xvZzIoZmxvYXQyIHgpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gaGFsZl9sb2cyKGZsb2F0MyB4KTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIGhhbGZfbG9nMihmbG9hdDQgeCk7CitmbG9hdDggX19vdmxkIF9fY25mbiBoYWxmX2xvZzIoZmxvYXQ4IHgpOworZmxvYXQxNiBfX292bGQgX19jbmZuIGhhbGZfbG9nMihmbG9hdDE2IHgpOworCisvKioKKyAqIENvbXB1dGUgYSBiYXNlIDEwIGxvZ2FyaXRobS4KKyAqLworZmxvYXQgX19vdmxkIF9fY25mbiBoYWxmX2xvZzEwKGZsb2F0IHgpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gaGFsZl9sb2cxMChmbG9hdDIgeCk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBoYWxmX2xvZzEwKGZsb2F0MyB4KTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIGhhbGZfbG9nMTAoZmxvYXQ0IHgpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gaGFsZl9sb2cxMChmbG9hdDggeCk7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gaGFsZl9sb2cxMChmbG9hdDE2IHgpOworCisvKioKKyAqIENvbXB1dGUgeCB0byB0aGUgcG93ZXIgeSwgd2hlcmUgeCBpcyA+PSAwLgorICovCitmbG9hdCBfX292bGQgX19jbmZuIGhhbGZfcG93cihmbG9hdCB4LCBmbG9hdCB5KTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIGhhbGZfcG93cihmbG9hdDIgeCwgZmxvYXQyIHkpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gaGFsZl9wb3dyKGZsb2F0MyB4LCBmbG9hdDMgeSk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBoYWxmX3Bvd3IoZmxvYXQ0IHgsIGZsb2F0NCB5KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIGhhbGZfcG93cihmbG9hdDggeCwgZmxvYXQ4IHkpOworZmxvYXQxNiBfX292bGQgX19jbmZuIGhhbGZfcG93cihmbG9hdDE2IHgsIGZsb2F0MTYgeSk7CisKKy8qKgorICogQ29tcHV0ZSByZWNpcHJvY2FsLgorICovCitmbG9hdCBfX292bGQgX19jbmZuIGhhbGZfcmVjaXAoZmxvYXQgeCk7CitmbG9hdDIgX19vdmxkIF9fY25mbiBoYWxmX3JlY2lwKGZsb2F0MiB4KTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGhhbGZfcmVjaXAoZmxvYXQzIHgpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gaGFsZl9yZWNpcChmbG9hdDQgeCk7CitmbG9hdDggX19vdmxkIF9fY25mbiBoYWxmX3JlY2lwKGZsb2F0OCB4KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBoYWxmX3JlY2lwKGZsb2F0MTYgeCk7CisKKy8qKgorICogQ29tcHV0ZSBpbnZlcnNlIHNxdWFyZSByb290LgorICovCitmbG9hdCBfX292bGQgX19jbmZuIGhhbGZfcnNxcnQoZmxvYXQgeCk7CitmbG9hdDIgX19vdmxkIF9fY25mbiBoYWxmX3JzcXJ0KGZsb2F0MiB4KTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGhhbGZfcnNxcnQoZmxvYXQzIHgpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gaGFsZl9yc3FydChmbG9hdDQgeCk7CitmbG9hdDggX19vdmxkIF9fY25mbiBoYWxmX3JzcXJ0KGZsb2F0OCB4KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBoYWxmX3JzcXJ0KGZsb2F0MTYgeCk7CisKKy8qKgorICogQ29tcHV0ZSBzaW5lLiB4IG11c3QgYmUgaW4gdGhlIHJhbmdlIC0yXjE2IC4uLiArMl4xNi4KKyAqLworZmxvYXQgX19vdmxkIF9fY25mbiBoYWxmX3NpbihmbG9hdCB4KTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIGhhbGZfc2luKGZsb2F0MiB4KTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGhhbGZfc2luKGZsb2F0MyB4KTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIGhhbGZfc2luKGZsb2F0NCB4KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIGhhbGZfc2luKGZsb2F0OCB4KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBoYWxmX3NpbihmbG9hdDE2IHgpOworCisvKioKKyAqIENvbXB1dGUgc3F1YXJlIHJvb3QuCisgKi8KK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gaGFsZl9zcXJ0KGZsb2F0IHgpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gaGFsZl9zcXJ0KGZsb2F0MiB4KTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGhhbGZfc3FydChmbG9hdDMgeCk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBoYWxmX3NxcnQoZmxvYXQ0IHgpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gaGFsZl9zcXJ0KGZsb2F0OCB4KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBoYWxmX3NxcnQoZmxvYXQxNiB4KTsKKworLyoqCisgKiBDb21wdXRlIHRhbmdlbnQuIHggbXVzdCBiZSBpbiB0aGUgcmFuZ2UgLTIxNiAuLi4gKzIxNi4KKyAqLworZmxvYXQgX19vdmxkIF9fY25mbiBoYWxmX3RhbihmbG9hdCB4KTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIGhhbGZfdGFuKGZsb2F0MiB4KTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGhhbGZfdGFuKGZsb2F0MyB4KTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIGhhbGZfdGFuKGZsb2F0NCB4KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIGhhbGZfdGFuKGZsb2F0OCB4KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBoYWxmX3RhbihmbG9hdDE2IHgpOworCisvKioKKyAqIENvbXB1dGUgY29zaW5lIG92ZXIgYW4gaW1wbGVtZW50YXRpb24tZGVmaW5lZCByYW5nZS4KKyAqIFRoZSBtYXhpbXVtIGVycm9yIGlzIGltcGxlbWVudGF0aW9uLWRlZmluZWQuCisgKi8KK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gbmF0aXZlX2NvcyhmbG9hdCB4KTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIG5hdGl2ZV9jb3MoZmxvYXQyIHgpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gbmF0aXZlX2NvcyhmbG9hdDMgeCk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBuYXRpdmVfY29zKGZsb2F0NCB4KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIG5hdGl2ZV9jb3MoZmxvYXQ4IHgpOworZmxvYXQxNiBfX292bGQgX19jbmZuIG5hdGl2ZV9jb3MoZmxvYXQxNiB4KTsKKyNpZmRlZiBjbF9raHJfZnA2NAorZG91YmxlIF9fb3ZsZCBfX2NuZm4gbmF0aXZlX2Nvcyhkb3VibGUgeCk7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gbmF0aXZlX2Nvcyhkb3VibGUyIHgpOworZG91YmxlMyBfX292bGQgX19jbmZuIG5hdGl2ZV9jb3MoZG91YmxlMyB4KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBuYXRpdmVfY29zKGRvdWJsZTQgeCk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gbmF0aXZlX2Nvcyhkb3VibGU4IHgpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBuYXRpdmVfY29zKGRvdWJsZTE2IHgpOworI2VuZGlmIC8vY2xfa2hyX2ZwNjQKKworLyoqCisgKiBDb21wdXRlIHggLyB5IG92ZXIgYW4gaW1wbGVtZW50YXRpb24tZGVmaW5lZCByYW5nZS4KKyAqIFRoZSBtYXhpbXVtIGVycm9yIGlzIGltcGxlbWVudGF0aW9uLWRlZmluZWQuCisgKi8KK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gbmF0aXZlX2RpdmlkZShmbG9hdCB4LCBmbG9hdCB5KTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIG5hdGl2ZV9kaXZpZGUoZmxvYXQyIHgsIGZsb2F0MiB5KTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIG5hdGl2ZV9kaXZpZGUoZmxvYXQzIHgsIGZsb2F0MyB5KTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIG5hdGl2ZV9kaXZpZGUoZmxvYXQ0IHgsIGZsb2F0NCB5KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIG5hdGl2ZV9kaXZpZGUoZmxvYXQ4IHgsIGZsb2F0OCB5KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBuYXRpdmVfZGl2aWRlKGZsb2F0MTYgeCwgZmxvYXQxNiB5KTsKKyNpZmRlZiBjbF9raHJfZnA2NAorZG91YmxlIF9fb3ZsZCBfX2NuZm4gbmF0aXZlX2RpdmlkZShkb3VibGUgeCwgZG91YmxlIHkpOworZG91YmxlMiBfX292bGQgX19jbmZuIG5hdGl2ZV9kaXZpZGUoZG91YmxlMiB4LCBkb3VibGUyIHkpOworZG91YmxlMyBfX292bGQgX19jbmZuIG5hdGl2ZV9kaXZpZGUoZG91YmxlMyB4LCBkb3VibGUzIHkpOworZG91YmxlNCBfX292bGQgX19jbmZuIG5hdGl2ZV9kaXZpZGUoZG91YmxlNCB4LCBkb3VibGU0IHkpOworZG91YmxlOCBfX292bGQgX19jbmZuIG5hdGl2ZV9kaXZpZGUoZG91YmxlOCB4LCBkb3VibGU4IHkpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBuYXRpdmVfZGl2aWRlKGRvdWJsZTE2IHgsIGRvdWJsZTE2IHkpOworI2VuZGlmIC8vY2xfa2hyX2ZwNjQKKworLyoqCisgKiBDb21wdXRlIHRoZSBiYXNlLSBlIGV4cG9uZW50aWFsIG9mIHggb3ZlciBhbgorICogaW1wbGVtZW50YXRpb24tZGVmaW5lZCByYW5nZS4gVGhlIG1heGltdW0gZXJyb3IgaXMKKyAqIGltcGxlbWVudGF0aW9uLWRlZmluZWQuCisgKi8KK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gbmF0aXZlX2V4cChmbG9hdCB4KTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIG5hdGl2ZV9leHAoZmxvYXQyIHgpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gbmF0aXZlX2V4cChmbG9hdDMgeCk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBuYXRpdmVfZXhwKGZsb2F0NCB4KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIG5hdGl2ZV9leHAoZmxvYXQ4IHgpOworZmxvYXQxNiBfX292bGQgX19jbmZuIG5hdGl2ZV9leHAoZmxvYXQxNiB4KTsKKyNpZmRlZiBjbF9raHJfZnA2NAorZG91YmxlIF9fb3ZsZCBfX2NuZm4gbmF0aXZlX2V4cChkb3VibGUgeCk7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gbmF0aXZlX2V4cChkb3VibGUyIHgpOworZG91YmxlMyBfX292bGQgX19jbmZuIG5hdGl2ZV9leHAoZG91YmxlMyB4KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBuYXRpdmVfZXhwKGRvdWJsZTQgeCk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gbmF0aXZlX2V4cChkb3VibGU4IHgpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBuYXRpdmVfZXhwKGRvdWJsZTE2IHgpOworI2VuZGlmIC8vY2xfa2hyX2ZwNjQKKworLyoqCisgKiBDb21wdXRlIHRoZSBiYXNlLSAyIGV4cG9uZW50aWFsIG9mIHggb3ZlciBhbgorICogaW1wbGVtZW50YXRpb24tZGVmaW5lZCByYW5nZS4gVGhlIG1heGltdW0gZXJyb3IgaXMKKyAqIGltcGxlbWVudGF0aW9uLWRlZmluZWQuCisgKi8KK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gbmF0aXZlX2V4cDIoZmxvYXQgeCk7CitmbG9hdDIgX19vdmxkIF9fY25mbiBuYXRpdmVfZXhwMihmbG9hdDIgeCk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBuYXRpdmVfZXhwMihmbG9hdDMgeCk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBuYXRpdmVfZXhwMihmbG9hdDQgeCk7CitmbG9hdDggX19vdmxkIF9fY25mbiBuYXRpdmVfZXhwMihmbG9hdDggeCk7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gbmF0aXZlX2V4cDIoZmxvYXQxNiB4KTsKKyNpZmRlZiBjbF9raHJfZnA2NAorZG91YmxlIF9fb3ZsZCBfX2NuZm4gbmF0aXZlX2V4cDIoZG91YmxlIHgpOworZG91YmxlMiBfX292bGQgX19jbmZuIG5hdGl2ZV9leHAyKGRvdWJsZTIgeCk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gbmF0aXZlX2V4cDIoZG91YmxlMyB4KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBuYXRpdmVfZXhwMihkb3VibGU0IHgpOworZG91YmxlOCBfX292bGQgX19jbmZuIG5hdGl2ZV9leHAyKGRvdWJsZTggeCk7Citkb3VibGUxNiBfX292bGQgX19jbmZuIG5hdGl2ZV9leHAyKGRvdWJsZTE2IHgpOworI2VuZGlmIC8vY2xfa2hyX2ZwNjQKKworLyoqCisgKiBDb21wdXRlIHRoZSBiYXNlLSAxMCBleHBvbmVudGlhbCBvZiB4IG92ZXIgYW4KKyAqIGltcGxlbWVudGF0aW9uLWRlZmluZWQgcmFuZ2UuIFRoZSBtYXhpbXVtIGVycm9yIGlzCisgKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkLgorICovCitmbG9hdCBfX292bGQgX19jbmZuIG5hdGl2ZV9leHAxMChmbG9hdCB4KTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIG5hdGl2ZV9leHAxMChmbG9hdDIgeCk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBuYXRpdmVfZXhwMTAoZmxvYXQzIHgpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gbmF0aXZlX2V4cDEwKGZsb2F0NCB4KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIG5hdGl2ZV9leHAxMChmbG9hdDggeCk7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gbmF0aXZlX2V4cDEwKGZsb2F0MTYgeCk7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2RvdWJsZSBfX292bGQgX19jbmZuIG5hdGl2ZV9leHAxMChkb3VibGUgeCk7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gbmF0aXZlX2V4cDEwKGRvdWJsZTIgeCk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gbmF0aXZlX2V4cDEwKGRvdWJsZTMgeCk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gbmF0aXZlX2V4cDEwKGRvdWJsZTQgeCk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gbmF0aXZlX2V4cDEwKGRvdWJsZTggeCk7Citkb3VibGUxNiBfX292bGQgX19jbmZuIG5hdGl2ZV9leHAxMChkb3VibGUxNiB4KTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisKKy8qKgorICogQ29tcHV0ZSBuYXR1cmFsIGxvZ2FyaXRobSBvdmVyIGFuIGltcGxlbWVudGF0aW9uZGVmaW5lZAorICogcmFuZ2UuIFRoZSBtYXhpbXVtIGVycm9yIGlzIGltcGxlbWVudGF0aW9uCisgKiBkZWZpbmVkLgorICovCitmbG9hdCBfX292bGQgX19jbmZuIG5hdGl2ZV9sb2coZmxvYXQgeCk7CitmbG9hdDIgX19vdmxkIF9fY25mbiBuYXRpdmVfbG9nKGZsb2F0MiB4KTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIG5hdGl2ZV9sb2coZmxvYXQzIHgpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gbmF0aXZlX2xvZyhmbG9hdDQgeCk7CitmbG9hdDggX19vdmxkIF9fY25mbiBuYXRpdmVfbG9nKGZsb2F0OCB4KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBuYXRpdmVfbG9nKGZsb2F0MTYgeCk7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2RvdWJsZSBfX292bGQgX19jbmZuIG5hdGl2ZV9sb2coZG91YmxlIHgpOworZG91YmxlMiBfX292bGQgX19jbmZuIG5hdGl2ZV9sb2coZG91YmxlMiB4KTsKK2RvdWJsZTMgX19vdmxkIF9fY25mbiBuYXRpdmVfbG9nKGRvdWJsZTMgeCk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gbmF0aXZlX2xvZyhkb3VibGU0IHgpOworZG91YmxlOCBfX292bGQgX19jbmZuIG5hdGl2ZV9sb2coZG91YmxlOCB4KTsKK2RvdWJsZTE2IF9fb3ZsZCBfX2NuZm4gbmF0aXZlX2xvZyhkb3VibGUxNiB4KTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisKKy8qKgorICogQ29tcHV0ZSBhIGJhc2UgMiBsb2dhcml0aG0gb3ZlciBhbiBpbXBsZW1lbnRhdGlvbmRlZmluZWQKKyAqIHJhbmdlLiBUaGUgbWF4aW11bSBlcnJvciBpcyBpbXBsZW1lbnRhdGlvbmRlZmluZWQuCisgKi8KK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gbmF0aXZlX2xvZzIoZmxvYXQgeCk7CitmbG9hdDIgX19vdmxkIF9fY25mbiBuYXRpdmVfbG9nMihmbG9hdDIgeCk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBuYXRpdmVfbG9nMihmbG9hdDMgeCk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBuYXRpdmVfbG9nMihmbG9hdDQgeCk7CitmbG9hdDggX19vdmxkIF9fY25mbiBuYXRpdmVfbG9nMihmbG9hdDggeCk7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gbmF0aXZlX2xvZzIoZmxvYXQxNiB4KTsKKyNpZmRlZiBjbF9raHJfZnA2NAorZG91YmxlIF9fb3ZsZCBfX2NuZm4gbmF0aXZlX2xvZzIoZG91YmxlIHgpOworZG91YmxlMiBfX292bGQgX19jbmZuIG5hdGl2ZV9sb2cyKGRvdWJsZTIgeCk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gbmF0aXZlX2xvZzIoZG91YmxlMyB4KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBuYXRpdmVfbG9nMihkb3VibGU0IHgpOworZG91YmxlOCBfX292bGQgX19jbmZuIG5hdGl2ZV9sb2cyKGRvdWJsZTggeCk7Citkb3VibGUxNiBfX292bGQgX19jbmZuIG5hdGl2ZV9sb2cyKGRvdWJsZTE2IHgpOworI2VuZGlmIC8vY2xfa2hyX2ZwNjQKKworLyoqCisgKiBDb21wdXRlIGEgYmFzZSAxMCBsb2dhcml0aG0gb3ZlciBhbiBpbXBsZW1lbnRhdGlvbmRlZmluZWQKKyAqIHJhbmdlLiBUaGUgbWF4aW11bSBlcnJvciBpcyBpbXBsZW1lbnRhdGlvbmRlZmluZWQuCisgKi8KK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gbmF0aXZlX2xvZzEwKGZsb2F0IHgpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gbmF0aXZlX2xvZzEwKGZsb2F0MiB4KTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIG5hdGl2ZV9sb2cxMChmbG9hdDMgeCk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBuYXRpdmVfbG9nMTAoZmxvYXQ0IHgpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gbmF0aXZlX2xvZzEwKGZsb2F0OCB4KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBuYXRpdmVfbG9nMTAoZmxvYXQxNiB4KTsKKyNpZmRlZiBjbF9raHJfZnA2NAorZG91YmxlIF9fb3ZsZCBfX2NuZm4gbmF0aXZlX2xvZzEwKGRvdWJsZSB4KTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBuYXRpdmVfbG9nMTAoZG91YmxlMiB4KTsKK2RvdWJsZTMgX19vdmxkIF9fY25mbiBuYXRpdmVfbG9nMTAoZG91YmxlMyB4KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBuYXRpdmVfbG9nMTAoZG91YmxlNCB4KTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBuYXRpdmVfbG9nMTAoZG91YmxlOCB4KTsKK2RvdWJsZTE2IF9fb3ZsZCBfX2NuZm4gbmF0aXZlX2xvZzEwKGRvdWJsZTE2IHgpOworI2VuZGlmIC8vY2xfa2hyX2ZwNjQKKworLyoqCisgKiBDb21wdXRlIHggdG8gdGhlIHBvd2VyIHksIHdoZXJlIHggaXMgPj0gMC4gVGhlIHJhbmdlIG9mCisgKiB4IGFuZCB5IGFyZSBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkLiBUaGUgbWF4aW11bSBlcnJvcgorICogaXMgaW1wbGVtZW50YXRpb24tZGVmaW5lZC4KKyAqLworZmxvYXQgX19vdmxkIF9fY25mbiBuYXRpdmVfcG93cihmbG9hdCB4LCBmbG9hdCB5KTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIG5hdGl2ZV9wb3dyKGZsb2F0MiB4LCBmbG9hdDIgeSk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBuYXRpdmVfcG93cihmbG9hdDMgeCwgZmxvYXQzIHkpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gbmF0aXZlX3Bvd3IoZmxvYXQ0IHgsIGZsb2F0NCB5KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIG5hdGl2ZV9wb3dyKGZsb2F0OCB4LCBmbG9hdDggeSk7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gbmF0aXZlX3Bvd3IoZmxvYXQxNiB4LCBmbG9hdDE2IHkpOworI2lmZGVmIGNsX2tocl9mcDY0Citkb3VibGUgX19vdmxkIF9fY25mbiBuYXRpdmVfcG93cihkb3VibGUgeCwgZG91YmxlIHkpOworZG91YmxlMiBfX292bGQgX19jbmZuIG5hdGl2ZV9wb3dyKGRvdWJsZTIgeCwgZG91YmxlMiB5KTsKK2RvdWJsZTMgX19vdmxkIF9fY25mbiBuYXRpdmVfcG93cihkb3VibGUzIHgsIGRvdWJsZTMgeSk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gbmF0aXZlX3Bvd3IoZG91YmxlNCB4LCBkb3VibGU0IHkpOworZG91YmxlOCBfX292bGQgX19jbmZuIG5hdGl2ZV9wb3dyKGRvdWJsZTggeCwgZG91YmxlOCB5KTsKK2RvdWJsZTE2IF9fb3ZsZCBfX2NuZm4gbmF0aXZlX3Bvd3IoZG91YmxlMTYgeCwgZG91YmxlMTYgeSk7CisjZW5kaWYgLy9jbF9raHJfZnA2NAorCisvKioKKyAqIENvbXB1dGUgcmVjaXByb2NhbCBvdmVyIGFuIGltcGxlbWVudGF0aW9uLWRlZmluZWQKKyAqIHJhbmdlLiBUaGUgbWF4aW11bSBlcnJvciBpcyBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkLgorICovCitmbG9hdCBfX292bGQgX19jbmZuIG5hdGl2ZV9yZWNpcChmbG9hdCB4KTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIG5hdGl2ZV9yZWNpcChmbG9hdDIgeCk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBuYXRpdmVfcmVjaXAoZmxvYXQzIHgpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gbmF0aXZlX3JlY2lwKGZsb2F0NCB4KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIG5hdGl2ZV9yZWNpcChmbG9hdDggeCk7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gbmF0aXZlX3JlY2lwKGZsb2F0MTYgeCk7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2RvdWJsZSBfX292bGQgX19jbmZuIG5hdGl2ZV9yZWNpcChkb3VibGUgeCk7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gbmF0aXZlX3JlY2lwKGRvdWJsZTIgeCk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gbmF0aXZlX3JlY2lwKGRvdWJsZTMgeCk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gbmF0aXZlX3JlY2lwKGRvdWJsZTQgeCk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gbmF0aXZlX3JlY2lwKGRvdWJsZTggeCk7Citkb3VibGUxNiBfX292bGQgX19jbmZuIG5hdGl2ZV9yZWNpcChkb3VibGUxNiB4KTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisKKy8qKgorICogQ29tcHV0ZSBpbnZlcnNlIHNxdWFyZSByb290IG92ZXIgYW4gaW1wbGVtZW50YXRpb25kZWZpbmVkCisgKiByYW5nZS4gVGhlIG1heGltdW0gZXJyb3IgaXMgaW1wbGVtZW50YXRpb25kZWZpbmVkLgorICovCitmbG9hdCBfX292bGQgX19jbmZuIG5hdGl2ZV9yc3FydChmbG9hdCB4KTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIG5hdGl2ZV9yc3FydChmbG9hdDIgeCk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBuYXRpdmVfcnNxcnQoZmxvYXQzIHgpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gbmF0aXZlX3JzcXJ0KGZsb2F0NCB4KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIG5hdGl2ZV9yc3FydChmbG9hdDggeCk7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gbmF0aXZlX3JzcXJ0KGZsb2F0MTYgeCk7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2RvdWJsZSBfX292bGQgX19jbmZuIG5hdGl2ZV9yc3FydChkb3VibGUgeCk7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gbmF0aXZlX3JzcXJ0KGRvdWJsZTIgeCk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gbmF0aXZlX3JzcXJ0KGRvdWJsZTMgeCk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gbmF0aXZlX3JzcXJ0KGRvdWJsZTQgeCk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gbmF0aXZlX3JzcXJ0KGRvdWJsZTggeCk7Citkb3VibGUxNiBfX292bGQgX19jbmZuIG5hdGl2ZV9yc3FydChkb3VibGUxNiB4KTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisKKy8qKgorICogQ29tcHV0ZSBzaW5lIG92ZXIgYW4gaW1wbGVtZW50YXRpb24tZGVmaW5lZCByYW5nZS4KKyAqIFRoZSBtYXhpbXVtIGVycm9yIGlzIGltcGxlbWVudGF0aW9uLWRlZmluZWQuCisgKi8KK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gbmF0aXZlX3NpbihmbG9hdCB4KTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIG5hdGl2ZV9zaW4oZmxvYXQyIHgpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gbmF0aXZlX3NpbihmbG9hdDMgeCk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBuYXRpdmVfc2luKGZsb2F0NCB4KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIG5hdGl2ZV9zaW4oZmxvYXQ4IHgpOworZmxvYXQxNiBfX292bGQgX19jbmZuIG5hdGl2ZV9zaW4oZmxvYXQxNiB4KTsKKyNpZmRlZiBjbF9raHJfZnA2NAorZG91YmxlIF9fb3ZsZCBfX2NuZm4gbmF0aXZlX3Npbihkb3VibGUgeCk7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gbmF0aXZlX3Npbihkb3VibGUyIHgpOworZG91YmxlMyBfX292bGQgX19jbmZuIG5hdGl2ZV9zaW4oZG91YmxlMyB4KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBuYXRpdmVfc2luKGRvdWJsZTQgeCk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gbmF0aXZlX3Npbihkb3VibGU4IHgpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBuYXRpdmVfc2luKGRvdWJsZTE2IHgpOworI2VuZGlmIC8vY2xfa2hyX2ZwNjQKKworLyoqCisgKiBDb21wdXRlIHNxdWFyZSByb290IG92ZXIgYW4gaW1wbGVtZW50YXRpb24tZGVmaW5lZAorICogcmFuZ2UuIFRoZSBtYXhpbXVtIGVycm9yIGlzIGltcGxlbWVudGF0aW9uLWRlZmluZWQuCisgKi8KK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gbmF0aXZlX3NxcnQoZmxvYXQgeCk7CitmbG9hdDIgX19vdmxkIF9fY25mbiBuYXRpdmVfc3FydChmbG9hdDIgeCk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBuYXRpdmVfc3FydChmbG9hdDMgeCk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBuYXRpdmVfc3FydChmbG9hdDQgeCk7CitmbG9hdDggX19vdmxkIF9fY25mbiBuYXRpdmVfc3FydChmbG9hdDggeCk7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gbmF0aXZlX3NxcnQoZmxvYXQxNiB4KTsKKyNpZmRlZiBjbF9raHJfZnA2NAorZG91YmxlIF9fb3ZsZCBfX2NuZm4gbmF0aXZlX3NxcnQoZG91YmxlIHgpOworZG91YmxlMiBfX292bGQgX19jbmZuIG5hdGl2ZV9zcXJ0KGRvdWJsZTIgeCk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gbmF0aXZlX3NxcnQoZG91YmxlMyB4KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBuYXRpdmVfc3FydChkb3VibGU0IHgpOworZG91YmxlOCBfX292bGQgX19jbmZuIG5hdGl2ZV9zcXJ0KGRvdWJsZTggeCk7Citkb3VibGUxNiBfX292bGQgX19jbmZuIG5hdGl2ZV9zcXJ0KGRvdWJsZTE2IHgpOworI2VuZGlmIC8vY2xfa2hyX2ZwNjQKKworLyoqCisgKiBDb21wdXRlIHRhbmdlbnQgb3ZlciBhbiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlLgorICogVGhlIG1heGltdW0gZXJyb3IgaXMgaW1wbGVtZW50YXRpb24tZGVmaW5lZC4KKyAqLworZmxvYXQgX19vdmxkIF9fY25mbiBuYXRpdmVfdGFuKGZsb2F0IHgpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gbmF0aXZlX3RhbihmbG9hdDIgeCk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBuYXRpdmVfdGFuKGZsb2F0MyB4KTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIG5hdGl2ZV90YW4oZmxvYXQ0IHgpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gbmF0aXZlX3RhbihmbG9hdDggeCk7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gbmF0aXZlX3RhbihmbG9hdDE2IHgpOworI2lmZGVmIGNsX2tocl9mcDY0Citkb3VibGUgX19vdmxkIF9fY25mbiBuYXRpdmVfdGFuKGRvdWJsZSB4KTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBuYXRpdmVfdGFuKGRvdWJsZTIgeCk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gbmF0aXZlX3Rhbihkb3VibGUzIHgpOworZG91YmxlNCBfX292bGQgX19jbmZuIG5hdGl2ZV90YW4oZG91YmxlNCB4KTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBuYXRpdmVfdGFuKGRvdWJsZTggeCk7Citkb3VibGUxNiBfX292bGQgX19jbmZuIG5hdGl2ZV90YW4oZG91YmxlMTYgeCk7CisjZW5kaWYgLy9jbF9raHJfZnA2NAorCisvLyBPcGVuQ0wgdjEuMSBzNi4xMS4zLCB2MS4yIHM2LjEyLjMsIHYyLjAgczYuMTMuMyAtIEludGVnZXIgRnVuY3Rpb25zCisKKy8qKgorICogUmV0dXJucyB8IHggfC4KKyAqLwordWNoYXIgX19vdmxkIF9fY25mbiBhYnMoY2hhciB4KTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gYWJzKHVjaGFyIHgpOwordWNoYXIyIF9fb3ZsZCBfX2NuZm4gYWJzKGNoYXIyIHgpOwordWNoYXIyIF9fb3ZsZCBfX2NuZm4gYWJzKHVjaGFyMiB4KTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGFicyhjaGFyMyB4KTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGFicyh1Y2hhcjMgeCk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBhYnMoY2hhcjQgeCk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBhYnModWNoYXI0IHgpOwordWNoYXI4IF9fb3ZsZCBfX2NuZm4gYWJzKGNoYXI4IHgpOwordWNoYXI4IF9fb3ZsZCBfX2NuZm4gYWJzKHVjaGFyOCB4KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBhYnMoY2hhcjE2IHgpOwordWNoYXIxNiBfX292bGQgX19jbmZuIGFicyh1Y2hhcjE2IHgpOwordXNob3J0IF9fb3ZsZCBfX2NuZm4gYWJzKHNob3J0IHgpOwordXNob3J0IF9fb3ZsZCBfX2NuZm4gYWJzKHVzaG9ydCB4KTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBhYnMoc2hvcnQyIHgpOwordXNob3J0MiBfX292bGQgX19jbmZuIGFicyh1c2hvcnQyIHgpOwordXNob3J0MyBfX292bGQgX19jbmZuIGFicyhzaG9ydDMgeCk7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gYWJzKHVzaG9ydDMgeCk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gYWJzKHNob3J0NCB4KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBhYnModXNob3J0NCB4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBhYnMoc2hvcnQ4IHgpOwordXNob3J0OCBfX292bGQgX19jbmZuIGFicyh1c2hvcnQ4IHgpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBhYnMoc2hvcnQxNiB4KTsKK3VzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gYWJzKHVzaG9ydDE2IHgpOwordWludCBfX292bGQgX19jbmZuIGFicyhpbnQgeCk7Cit1aW50IF9fb3ZsZCBfX2NuZm4gYWJzKHVpbnQgeCk7Cit1aW50MiBfX292bGQgX19jbmZuIGFicyhpbnQyIHgpOwordWludDIgX19vdmxkIF9fY25mbiBhYnModWludDIgeCk7Cit1aW50MyBfX292bGQgX19jbmZuIGFicyhpbnQzIHgpOwordWludDMgX19vdmxkIF9fY25mbiBhYnModWludDMgeCk7Cit1aW50NCBfX292bGQgX19jbmZuIGFicyhpbnQ0IHgpOwordWludDQgX19vdmxkIF9fY25mbiBhYnModWludDQgeCk7Cit1aW50OCBfX292bGQgX19jbmZuIGFicyhpbnQ4IHgpOwordWludDggX19vdmxkIF9fY25mbiBhYnModWludDggeCk7Cit1aW50MTYgX19vdmxkIF9fY25mbiBhYnMoaW50MTYgeCk7Cit1aW50MTYgX19vdmxkIF9fY25mbiBhYnModWludDE2IHgpOwordWxvbmcgX19vdmxkIF9fY25mbiBhYnMobG9uZyB4KTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gYWJzKHVsb25nIHgpOwordWxvbmcyIF9fb3ZsZCBfX2NuZm4gYWJzKGxvbmcyIHgpOwordWxvbmcyIF9fb3ZsZCBfX2NuZm4gYWJzKHVsb25nMiB4KTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGFicyhsb25nMyB4KTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGFicyh1bG9uZzMgeCk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBhYnMobG9uZzQgeCk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBhYnModWxvbmc0IHgpOwordWxvbmc4IF9fb3ZsZCBfX2NuZm4gYWJzKGxvbmc4IHgpOwordWxvbmc4IF9fb3ZsZCBfX2NuZm4gYWJzKHVsb25nOCB4KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBhYnMobG9uZzE2IHgpOwordWxvbmcxNiBfX292bGQgX19jbmZuIGFicyh1bG9uZzE2IHgpOworCisvKioKKyAqIFJldHVybnMgfCB4IC0geSB8IHdpdGhvdXQgbW9kdWxvIG92ZXJmbG93LgorICovCit1Y2hhciBfX292bGQgX19jbmZuIGFic19kaWZmKGNoYXIgeCwgY2hhciB5KTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gYWJzX2RpZmYodWNoYXIgeCwgdWNoYXIgeSk7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBhYnNfZGlmZihjaGFyMiB4LCBjaGFyMiB5KTsKK3VjaGFyMiBfX292bGQgX19jbmZuIGFic19kaWZmKHVjaGFyMiB4LCB1Y2hhcjIgeSk7Cit1Y2hhcjMgX19vdmxkIF9fY25mbiBhYnNfZGlmZihjaGFyMyB4LCBjaGFyMyB5KTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGFic19kaWZmKHVjaGFyMyB4LCB1Y2hhcjMgeSk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBhYnNfZGlmZihjaGFyNCB4LCBjaGFyNCB5KTsKK3VjaGFyNCBfX292bGQgX19jbmZuIGFic19kaWZmKHVjaGFyNCB4LCB1Y2hhcjQgeSk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBhYnNfZGlmZihjaGFyOCB4LCBjaGFyOCB5KTsKK3VjaGFyOCBfX292bGQgX19jbmZuIGFic19kaWZmKHVjaGFyOCB4LCB1Y2hhcjggeSk7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gYWJzX2RpZmYoY2hhcjE2IHgsIGNoYXIxNiB5KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBhYnNfZGlmZih1Y2hhcjE2IHgsIHVjaGFyMTYgeSk7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBhYnNfZGlmZihzaG9ydCB4LCBzaG9ydCB5KTsKK3VzaG9ydCBfX292bGQgX19jbmZuIGFic19kaWZmKHVzaG9ydCB4LCB1c2hvcnQgeSk7Cit1c2hvcnQyIF9fb3ZsZCBfX2NuZm4gYWJzX2RpZmYoc2hvcnQyIHgsIHNob3J0MiB5KTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBhYnNfZGlmZih1c2hvcnQyIHgsIHVzaG9ydDIgeSk7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gYWJzX2RpZmYoc2hvcnQzIHgsIHNob3J0MyB5KTsKK3VzaG9ydDMgX19vdmxkIF9fY25mbiBhYnNfZGlmZih1c2hvcnQzIHgsIHVzaG9ydDMgeSk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gYWJzX2RpZmYoc2hvcnQ0IHgsIHNob3J0NCB5KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBhYnNfZGlmZih1c2hvcnQ0IHgsIHVzaG9ydDQgeSk7Cit1c2hvcnQ4IF9fb3ZsZCBfX2NuZm4gYWJzX2RpZmYoc2hvcnQ4IHgsIHNob3J0OCB5KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBhYnNfZGlmZih1c2hvcnQ4IHgsIHVzaG9ydDggeSk7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIGFic19kaWZmKHNob3J0MTYgeCwgc2hvcnQxNiB5KTsKK3VzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gYWJzX2RpZmYodXNob3J0MTYgeCwgdXNob3J0MTYgeSk7Cit1aW50IF9fb3ZsZCBfX2NuZm4gYWJzX2RpZmYoaW50IHgsIGludCB5KTsKK3VpbnQgX19vdmxkIF9fY25mbiBhYnNfZGlmZih1aW50IHgsIHVpbnQgeSk7Cit1aW50MiBfX292bGQgX19jbmZuIGFic19kaWZmKGludDIgeCwgaW50MiB5KTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gYWJzX2RpZmYodWludDIgeCwgdWludDIgeSk7Cit1aW50MyBfX292bGQgX19jbmZuIGFic19kaWZmKGludDMgeCwgaW50MyB5KTsKK3VpbnQzIF9fb3ZsZCBfX2NuZm4gYWJzX2RpZmYodWludDMgeCwgdWludDMgeSk7Cit1aW50NCBfX292bGQgX19jbmZuIGFic19kaWZmKGludDQgeCwgaW50NCB5KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gYWJzX2RpZmYodWludDQgeCwgdWludDQgeSk7Cit1aW50OCBfX292bGQgX19jbmZuIGFic19kaWZmKGludDggeCwgaW50OCB5KTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gYWJzX2RpZmYodWludDggeCwgdWludDggeSk7Cit1aW50MTYgX19vdmxkIF9fY25mbiBhYnNfZGlmZihpbnQxNiB4LCBpbnQxNiB5KTsKK3VpbnQxNiBfX292bGQgX19jbmZuIGFic19kaWZmKHVpbnQxNiB4LCB1aW50MTYgeSk7Cit1bG9uZyBfX292bGQgX19jbmZuIGFic19kaWZmKGxvbmcgeCwgbG9uZyB5KTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gYWJzX2RpZmYodWxvbmcgeCwgdWxvbmcgeSk7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBhYnNfZGlmZihsb25nMiB4LCBsb25nMiB5KTsKK3Vsb25nMiBfX292bGQgX19jbmZuIGFic19kaWZmKHVsb25nMiB4LCB1bG9uZzIgeSk7Cit1bG9uZzMgX19vdmxkIF9fY25mbiBhYnNfZGlmZihsb25nMyB4LCBsb25nMyB5KTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGFic19kaWZmKHVsb25nMyB4LCB1bG9uZzMgeSk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBhYnNfZGlmZihsb25nNCB4LCBsb25nNCB5KTsKK3Vsb25nNCBfX292bGQgX19jbmZuIGFic19kaWZmKHVsb25nNCB4LCB1bG9uZzQgeSk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBhYnNfZGlmZihsb25nOCB4LCBsb25nOCB5KTsKK3Vsb25nOCBfX292bGQgX19jbmZuIGFic19kaWZmKHVsb25nOCB4LCB1bG9uZzggeSk7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gYWJzX2RpZmYobG9uZzE2IHgsIGxvbmcxNiB5KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBhYnNfZGlmZih1bG9uZzE2IHgsIHVsb25nMTYgeSk7CisKKy8qKgorICogUmV0dXJucyB4ICsgeSBhbmQgc2F0dXJhdGVzIHRoZSByZXN1bHQuCisgKi8KK2NoYXIgX19vdmxkIF9fY25mbiBhZGRfc2F0KGNoYXIgeCwgY2hhciB5KTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gYWRkX3NhdCh1Y2hhciB4LCB1Y2hhciB5KTsKK2NoYXIyIF9fb3ZsZCBfX2NuZm4gYWRkX3NhdChjaGFyMiB4LCBjaGFyMiB5KTsKK3VjaGFyMiBfX292bGQgX19jbmZuIGFkZF9zYXQodWNoYXIyIHgsIHVjaGFyMiB5KTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gYWRkX3NhdChjaGFyMyB4LCBjaGFyMyB5KTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGFkZF9zYXQodWNoYXIzIHgsIHVjaGFyMyB5KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gYWRkX3NhdChjaGFyNCB4LCBjaGFyNCB5KTsKK3VjaGFyNCBfX292bGQgX19jbmZuIGFkZF9zYXQodWNoYXI0IHgsIHVjaGFyNCB5KTsKK2NoYXI4IF9fb3ZsZCBfX2NuZm4gYWRkX3NhdChjaGFyOCB4LCBjaGFyOCB5KTsKK3VjaGFyOCBfX292bGQgX19jbmZuIGFkZF9zYXQodWNoYXI4IHgsIHVjaGFyOCB5KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGFkZF9zYXQoY2hhcjE2IHgsIGNoYXIxNiB5KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBhZGRfc2F0KHVjaGFyMTYgeCwgdWNoYXIxNiB5KTsKK3Nob3J0IF9fb3ZsZCBfX2NuZm4gYWRkX3NhdChzaG9ydCB4LCBzaG9ydCB5KTsKK3VzaG9ydCBfX292bGQgX19jbmZuIGFkZF9zYXQodXNob3J0IHgsIHVzaG9ydCB5KTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGFkZF9zYXQoc2hvcnQyIHgsIHNob3J0MiB5KTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBhZGRfc2F0KHVzaG9ydDIgeCwgdXNob3J0MiB5KTsKK3Nob3J0MyBfX292bGQgX19jbmZuIGFkZF9zYXQoc2hvcnQzIHgsIHNob3J0MyB5KTsKK3VzaG9ydDMgX19vdmxkIF9fY25mbiBhZGRfc2F0KHVzaG9ydDMgeCwgdXNob3J0MyB5KTsKK3Nob3J0NCBfX292bGQgX19jbmZuIGFkZF9zYXQoc2hvcnQ0IHgsIHNob3J0NCB5KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBhZGRfc2F0KHVzaG9ydDQgeCwgdXNob3J0NCB5KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGFkZF9zYXQoc2hvcnQ4IHgsIHNob3J0OCB5KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBhZGRfc2F0KHVzaG9ydDggeCwgdXNob3J0OCB5KTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBhZGRfc2F0KHNob3J0MTYgeCwgc2hvcnQxNiB5KTsKK3VzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gYWRkX3NhdCh1c2hvcnQxNiB4LCB1c2hvcnQxNiB5KTsKK2ludCBfX292bGQgX19jbmZuIGFkZF9zYXQoaW50IHgsIGludCB5KTsKK3VpbnQgX19vdmxkIF9fY25mbiBhZGRfc2F0KHVpbnQgeCwgdWludCB5KTsKK2ludDIgX19vdmxkIF9fY25mbiBhZGRfc2F0KGludDIgeCwgaW50MiB5KTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gYWRkX3NhdCh1aW50MiB4LCB1aW50MiB5KTsKK2ludDMgX19vdmxkIF9fY25mbiBhZGRfc2F0KGludDMgeCwgaW50MyB5KTsKK3VpbnQzIF9fb3ZsZCBfX2NuZm4gYWRkX3NhdCh1aW50MyB4LCB1aW50MyB5KTsKK2ludDQgX19vdmxkIF9fY25mbiBhZGRfc2F0KGludDQgeCwgaW50NCB5KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gYWRkX3NhdCh1aW50NCB4LCB1aW50NCB5KTsKK2ludDggX19vdmxkIF9fY25mbiBhZGRfc2F0KGludDggeCwgaW50OCB5KTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gYWRkX3NhdCh1aW50OCB4LCB1aW50OCB5KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gYWRkX3NhdChpbnQxNiB4LCBpbnQxNiB5KTsKK3VpbnQxNiBfX292bGQgX19jbmZuIGFkZF9zYXQodWludDE2IHgsIHVpbnQxNiB5KTsKK2xvbmcgX19vdmxkIF9fY25mbiBhZGRfc2F0KGxvbmcgeCwgbG9uZyB5KTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gYWRkX3NhdCh1bG9uZyB4LCB1bG9uZyB5KTsKK2xvbmcyIF9fb3ZsZCBfX2NuZm4gYWRkX3NhdChsb25nMiB4LCBsb25nMiB5KTsKK3Vsb25nMiBfX292bGQgX19jbmZuIGFkZF9zYXQodWxvbmcyIHgsIHVsb25nMiB5KTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gYWRkX3NhdChsb25nMyB4LCBsb25nMyB5KTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGFkZF9zYXQodWxvbmczIHgsIHVsb25nMyB5KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gYWRkX3NhdChsb25nNCB4LCBsb25nNCB5KTsKK3Vsb25nNCBfX292bGQgX19jbmZuIGFkZF9zYXQodWxvbmc0IHgsIHVsb25nNCB5KTsKK2xvbmc4IF9fb3ZsZCBfX2NuZm4gYWRkX3NhdChsb25nOCB4LCBsb25nOCB5KTsKK3Vsb25nOCBfX292bGQgX19jbmZuIGFkZF9zYXQodWxvbmc4IHgsIHVsb25nOCB5KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGFkZF9zYXQobG9uZzE2IHgsIGxvbmcxNiB5KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBhZGRfc2F0KHVsb25nMTYgeCwgdWxvbmcxNiB5KTsKKworLyoqCisgKiBSZXR1cm5zICh4ICsgeSkgPj4gMS4gVGhlIGludGVybWVkaWF0ZSBzdW0gZG9lcworICogbm90IG1vZHVsbyBvdmVyZmxvdy4KKyAqLworY2hhciBfX292bGQgX19jbmZuIGhhZGQoY2hhciB4LCBjaGFyIHkpOwordWNoYXIgX19vdmxkIF9fY25mbiBoYWRkKHVjaGFyIHgsIHVjaGFyIHkpOworY2hhcjIgX19vdmxkIF9fY25mbiBoYWRkKGNoYXIyIHgsIGNoYXIyIHkpOwordWNoYXIyIF9fb3ZsZCBfX2NuZm4gaGFkZCh1Y2hhcjIgeCwgdWNoYXIyIHkpOworY2hhcjMgX19vdmxkIF9fY25mbiBoYWRkKGNoYXIzIHgsIGNoYXIzIHkpOwordWNoYXIzIF9fb3ZsZCBfX2NuZm4gaGFkZCh1Y2hhcjMgeCwgdWNoYXIzIHkpOworY2hhcjQgX19vdmxkIF9fY25mbiBoYWRkKGNoYXI0IHgsIGNoYXI0IHkpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gaGFkZCh1Y2hhcjQgeCwgdWNoYXI0IHkpOworY2hhcjggX19vdmxkIF9fY25mbiBoYWRkKGNoYXI4IHgsIGNoYXI4IHkpOwordWNoYXI4IF9fb3ZsZCBfX2NuZm4gaGFkZCh1Y2hhcjggeCwgdWNoYXI4IHkpOworY2hhcjE2IF9fb3ZsZCBfX2NuZm4gaGFkZChjaGFyMTYgeCwgY2hhcjE2IHkpOwordWNoYXIxNiBfX292bGQgX19jbmZuIGhhZGQodWNoYXIxNiB4LCB1Y2hhcjE2IHkpOworc2hvcnQgX19vdmxkIF9fY25mbiBoYWRkKHNob3J0IHgsIHNob3J0IHkpOwordXNob3J0IF9fb3ZsZCBfX2NuZm4gaGFkZCh1c2hvcnQgeCwgdXNob3J0IHkpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gaGFkZChzaG9ydDIgeCwgc2hvcnQyIHkpOwordXNob3J0MiBfX292bGQgX19jbmZuIGhhZGQodXNob3J0MiB4LCB1c2hvcnQyIHkpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gaGFkZChzaG9ydDMgeCwgc2hvcnQzIHkpOwordXNob3J0MyBfX292bGQgX19jbmZuIGhhZGQodXNob3J0MyB4LCB1c2hvcnQzIHkpOworc2hvcnQ0IF9fb3ZsZCBfX2NuZm4gaGFkZChzaG9ydDQgeCwgc2hvcnQ0IHkpOwordXNob3J0NCBfX292bGQgX19jbmZuIGhhZGQodXNob3J0NCB4LCB1c2hvcnQ0IHkpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gaGFkZChzaG9ydDggeCwgc2hvcnQ4IHkpOwordXNob3J0OCBfX292bGQgX19jbmZuIGhhZGQodXNob3J0OCB4LCB1c2hvcnQ4IHkpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGhhZGQoc2hvcnQxNiB4LCBzaG9ydDE2IHkpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBoYWRkKHVzaG9ydDE2IHgsIHVzaG9ydDE2IHkpOworaW50IF9fb3ZsZCBfX2NuZm4gaGFkZChpbnQgeCwgaW50IHkpOwordWludCBfX292bGQgX19jbmZuIGhhZGQodWludCB4LCB1aW50IHkpOworaW50MiBfX292bGQgX19jbmZuIGhhZGQoaW50MiB4LCBpbnQyIHkpOwordWludDIgX19vdmxkIF9fY25mbiBoYWRkKHVpbnQyIHgsIHVpbnQyIHkpOworaW50MyBfX292bGQgX19jbmZuIGhhZGQoaW50MyB4LCBpbnQzIHkpOwordWludDMgX19vdmxkIF9fY25mbiBoYWRkKHVpbnQzIHgsIHVpbnQzIHkpOworaW50NCBfX292bGQgX19jbmZuIGhhZGQoaW50NCB4LCBpbnQ0IHkpOwordWludDQgX19vdmxkIF9fY25mbiBoYWRkKHVpbnQ0IHgsIHVpbnQ0IHkpOworaW50OCBfX292bGQgX19jbmZuIGhhZGQoaW50OCB4LCBpbnQ4IHkpOwordWludDggX19vdmxkIF9fY25mbiBoYWRkKHVpbnQ4IHgsIHVpbnQ4IHkpOworaW50MTYgX19vdmxkIF9fY25mbiBoYWRkKGludDE2IHgsIGludDE2IHkpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gaGFkZCh1aW50MTYgeCwgdWludDE2IHkpOworbG9uZyBfX292bGQgX19jbmZuIGhhZGQobG9uZyB4LCBsb25nIHkpOwordWxvbmcgX19vdmxkIF9fY25mbiBoYWRkKHVsb25nIHgsIHVsb25nIHkpOworbG9uZzIgX19vdmxkIF9fY25mbiBoYWRkKGxvbmcyIHgsIGxvbmcyIHkpOwordWxvbmcyIF9fb3ZsZCBfX2NuZm4gaGFkZCh1bG9uZzIgeCwgdWxvbmcyIHkpOworbG9uZzMgX19vdmxkIF9fY25mbiBoYWRkKGxvbmczIHgsIGxvbmczIHkpOwordWxvbmczIF9fb3ZsZCBfX2NuZm4gaGFkZCh1bG9uZzMgeCwgdWxvbmczIHkpOworbG9uZzQgX19vdmxkIF9fY25mbiBoYWRkKGxvbmc0IHgsIGxvbmc0IHkpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gaGFkZCh1bG9uZzQgeCwgdWxvbmc0IHkpOworbG9uZzggX19vdmxkIF9fY25mbiBoYWRkKGxvbmc4IHgsIGxvbmc4IHkpOwordWxvbmc4IF9fb3ZsZCBfX2NuZm4gaGFkZCh1bG9uZzggeCwgdWxvbmc4IHkpOworbG9uZzE2IF9fb3ZsZCBfX2NuZm4gaGFkZChsb25nMTYgeCwgbG9uZzE2IHkpOwordWxvbmcxNiBfX292bGQgX19jbmZuIGhhZGQodWxvbmcxNiB4LCB1bG9uZzE2IHkpOworCisvKioKKyAqIFJldHVybnMgKHggKyB5ICsgMSkgPj4gMS4gVGhlIGludGVybWVkaWF0ZSBzdW0KKyAqIGRvZXMgbm90IG1vZHVsbyBvdmVyZmxvdy4KKyAqLworY2hhciBfX292bGQgX19jbmZuIHJoYWRkKGNoYXIgeCwgY2hhciB5KTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gcmhhZGQodWNoYXIgeCwgdWNoYXIgeSk7CitjaGFyMiBfX292bGQgX19jbmZuIHJoYWRkKGNoYXIyIHgsIGNoYXIyIHkpOwordWNoYXIyIF9fb3ZsZCBfX2NuZm4gcmhhZGQodWNoYXIyIHgsIHVjaGFyMiB5KTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gcmhhZGQoY2hhcjMgeCwgY2hhcjMgeSk7Cit1Y2hhcjMgX19vdmxkIF9fY25mbiByaGFkZCh1Y2hhcjMgeCwgdWNoYXIzIHkpOworY2hhcjQgX19vdmxkIF9fY25mbiByaGFkZChjaGFyNCB4LCBjaGFyNCB5KTsKK3VjaGFyNCBfX292bGQgX19jbmZuIHJoYWRkKHVjaGFyNCB4LCB1Y2hhcjQgeSk7CitjaGFyOCBfX292bGQgX19jbmZuIHJoYWRkKGNoYXI4IHgsIGNoYXI4IHkpOwordWNoYXI4IF9fb3ZsZCBfX2NuZm4gcmhhZGQodWNoYXI4IHgsIHVjaGFyOCB5KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIHJoYWRkKGNoYXIxNiB4LCBjaGFyMTYgeSk7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gcmhhZGQodWNoYXIxNiB4LCB1Y2hhcjE2IHkpOworc2hvcnQgX19vdmxkIF9fY25mbiByaGFkZChzaG9ydCB4LCBzaG9ydCB5KTsKK3VzaG9ydCBfX292bGQgX19jbmZuIHJoYWRkKHVzaG9ydCB4LCB1c2hvcnQgeSk7CitzaG9ydDIgX19vdmxkIF9fY25mbiByaGFkZChzaG9ydDIgeCwgc2hvcnQyIHkpOwordXNob3J0MiBfX292bGQgX19jbmZuIHJoYWRkKHVzaG9ydDIgeCwgdXNob3J0MiB5KTsKK3Nob3J0MyBfX292bGQgX19jbmZuIHJoYWRkKHNob3J0MyB4LCBzaG9ydDMgeSk7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gcmhhZGQodXNob3J0MyB4LCB1c2hvcnQzIHkpOworc2hvcnQ0IF9fb3ZsZCBfX2NuZm4gcmhhZGQoc2hvcnQ0IHgsIHNob3J0NCB5KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiByaGFkZCh1c2hvcnQ0IHgsIHVzaG9ydDQgeSk7CitzaG9ydDggX19vdmxkIF9fY25mbiByaGFkZChzaG9ydDggeCwgc2hvcnQ4IHkpOwordXNob3J0OCBfX292bGQgX19jbmZuIHJoYWRkKHVzaG9ydDggeCwgdXNob3J0OCB5KTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiByaGFkZChzaG9ydDE2IHgsIHNob3J0MTYgeSk7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIHJoYWRkKHVzaG9ydDE2IHgsIHVzaG9ydDE2IHkpOworaW50IF9fb3ZsZCBfX2NuZm4gcmhhZGQoaW50IHgsIGludCB5KTsKK3VpbnQgX19vdmxkIF9fY25mbiByaGFkZCh1aW50IHgsIHVpbnQgeSk7CitpbnQyIF9fb3ZsZCBfX2NuZm4gcmhhZGQoaW50MiB4LCBpbnQyIHkpOwordWludDIgX19vdmxkIF9fY25mbiByaGFkZCh1aW50MiB4LCB1aW50MiB5KTsKK2ludDMgX19vdmxkIF9fY25mbiByaGFkZChpbnQzIHgsIGludDMgeSk7Cit1aW50MyBfX292bGQgX19jbmZuIHJoYWRkKHVpbnQzIHgsIHVpbnQzIHkpOworaW50NCBfX292bGQgX19jbmZuIHJoYWRkKGludDQgeCwgaW50NCB5KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gcmhhZGQodWludDQgeCwgdWludDQgeSk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gcmhhZGQoaW50OCB4LCBpbnQ4IHkpOwordWludDggX19vdmxkIF9fY25mbiByaGFkZCh1aW50OCB4LCB1aW50OCB5KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gcmhhZGQoaW50MTYgeCwgaW50MTYgeSk7Cit1aW50MTYgX19vdmxkIF9fY25mbiByaGFkZCh1aW50MTYgeCwgdWludDE2IHkpOworbG9uZyBfX292bGQgX19jbmZuIHJoYWRkKGxvbmcgeCwgbG9uZyB5KTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gcmhhZGQodWxvbmcgeCwgdWxvbmcgeSk7Citsb25nMiBfX292bGQgX19jbmZuIHJoYWRkKGxvbmcyIHgsIGxvbmcyIHkpOwordWxvbmcyIF9fb3ZsZCBfX2NuZm4gcmhhZGQodWxvbmcyIHgsIHVsb25nMiB5KTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gcmhhZGQobG9uZzMgeCwgbG9uZzMgeSk7Cit1bG9uZzMgX19vdmxkIF9fY25mbiByaGFkZCh1bG9uZzMgeCwgdWxvbmczIHkpOworbG9uZzQgX19vdmxkIF9fY25mbiByaGFkZChsb25nNCB4LCBsb25nNCB5KTsKK3Vsb25nNCBfX292bGQgX19jbmZuIHJoYWRkKHVsb25nNCB4LCB1bG9uZzQgeSk7Citsb25nOCBfX292bGQgX19jbmZuIHJoYWRkKGxvbmc4IHgsIGxvbmc4IHkpOwordWxvbmc4IF9fb3ZsZCBfX2NuZm4gcmhhZGQodWxvbmc4IHgsIHVsb25nOCB5KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIHJoYWRkKGxvbmcxNiB4LCBsb25nMTYgeSk7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gcmhhZGQodWxvbmcxNiB4LCB1bG9uZzE2IHkpOworCisvKioKKyAqIFJldHVybnMgbWluKG1heCh4LCBtaW52YWwpLCBtYXh2YWwpLgorICogUmVzdWx0cyBhcmUgdW5kZWZpbmVkIGlmIG1pbnZhbCA+IG1heHZhbC4KKyAqLworY2hhciBfX292bGQgX19jbmZuIGNsYW1wKGNoYXIgeCwgY2hhciBtaW52YWwsIGNoYXIgbWF4dmFsKTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gY2xhbXAodWNoYXIgeCwgdWNoYXIgbWludmFsLCB1Y2hhciBtYXh2YWwpOworY2hhcjIgX19vdmxkIF9fY25mbiBjbGFtcChjaGFyMiB4LCBjaGFyMiBtaW52YWwsIGNoYXIyIG1heHZhbCk7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBjbGFtcCh1Y2hhcjIgeCwgdWNoYXIyIG1pbnZhbCwgdWNoYXIyIG1heHZhbCk7CitjaGFyMyBfX292bGQgX19jbmZuIGNsYW1wKGNoYXIzIHgsIGNoYXIzIG1pbnZhbCwgY2hhcjMgbWF4dmFsKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGNsYW1wKHVjaGFyMyB4LCB1Y2hhcjMgbWludmFsLCB1Y2hhcjMgbWF4dmFsKTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gY2xhbXAoY2hhcjQgeCwgY2hhcjQgbWludmFsLCBjaGFyNCBtYXh2YWwpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gY2xhbXAodWNoYXI0IHgsIHVjaGFyNCBtaW52YWwsIHVjaGFyNCBtYXh2YWwpOworY2hhcjggX19vdmxkIF9fY25mbiBjbGFtcChjaGFyOCB4LCBjaGFyOCBtaW52YWwsIGNoYXI4IG1heHZhbCk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBjbGFtcCh1Y2hhcjggeCwgdWNoYXI4IG1pbnZhbCwgdWNoYXI4IG1heHZhbCk7CitjaGFyMTYgX19vdmxkIF9fY25mbiBjbGFtcChjaGFyMTYgeCwgY2hhcjE2IG1pbnZhbCwgY2hhcjE2IG1heHZhbCk7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gY2xhbXAodWNoYXIxNiB4LCB1Y2hhcjE2IG1pbnZhbCwgdWNoYXIxNiBtYXh2YWwpOworc2hvcnQgX19vdmxkIF9fY25mbiBjbGFtcChzaG9ydCB4LCBzaG9ydCBtaW52YWwsIHNob3J0IG1heHZhbCk7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBjbGFtcCh1c2hvcnQgeCwgdXNob3J0IG1pbnZhbCwgdXNob3J0IG1heHZhbCk7CitzaG9ydDIgX19vdmxkIF9fY25mbiBjbGFtcChzaG9ydDIgeCwgc2hvcnQyIG1pbnZhbCwgc2hvcnQyIG1heHZhbCk7Cit1c2hvcnQyIF9fb3ZsZCBfX2NuZm4gY2xhbXAodXNob3J0MiB4LCB1c2hvcnQyIG1pbnZhbCwgdXNob3J0MiBtYXh2YWwpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gY2xhbXAoc2hvcnQzIHgsIHNob3J0MyBtaW52YWwsIHNob3J0MyBtYXh2YWwpOwordXNob3J0MyBfX292bGQgX19jbmZuIGNsYW1wKHVzaG9ydDMgeCwgdXNob3J0MyBtaW52YWwsIHVzaG9ydDMgbWF4dmFsKTsKK3Nob3J0NCBfX292bGQgX19jbmZuIGNsYW1wKHNob3J0NCB4LCBzaG9ydDQgbWludmFsLCBzaG9ydDQgbWF4dmFsKTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBjbGFtcCh1c2hvcnQ0IHgsIHVzaG9ydDQgbWludmFsLCB1c2hvcnQ0IG1heHZhbCk7CitzaG9ydDggX19vdmxkIF9fY25mbiBjbGFtcChzaG9ydDggeCwgc2hvcnQ4IG1pbnZhbCwgc2hvcnQ4IG1heHZhbCk7Cit1c2hvcnQ4IF9fb3ZsZCBfX2NuZm4gY2xhbXAodXNob3J0OCB4LCB1c2hvcnQ4IG1pbnZhbCwgdXNob3J0OCBtYXh2YWwpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGNsYW1wKHNob3J0MTYgeCwgc2hvcnQxNiBtaW52YWwsIHNob3J0MTYgbWF4dmFsKTsKK3VzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY2xhbXAodXNob3J0MTYgeCwgdXNob3J0MTYgbWludmFsLCB1c2hvcnQxNiBtYXh2YWwpOworaW50IF9fb3ZsZCBfX2NuZm4gY2xhbXAoaW50IHgsIGludCBtaW52YWwsIGludCBtYXh2YWwpOwordWludCBfX292bGQgX19jbmZuIGNsYW1wKHVpbnQgeCwgdWludCBtaW52YWwsIHVpbnQgbWF4dmFsKTsKK2ludDIgX19vdmxkIF9fY25mbiBjbGFtcChpbnQyIHgsIGludDIgbWludmFsLCBpbnQyIG1heHZhbCk7Cit1aW50MiBfX292bGQgX19jbmZuIGNsYW1wKHVpbnQyIHgsIHVpbnQyIG1pbnZhbCwgdWludDIgbWF4dmFsKTsKK2ludDMgX19vdmxkIF9fY25mbiBjbGFtcChpbnQzIHgsIGludDMgbWludmFsLCBpbnQzIG1heHZhbCk7Cit1aW50MyBfX292bGQgX19jbmZuIGNsYW1wKHVpbnQzIHgsIHVpbnQzIG1pbnZhbCwgdWludDMgbWF4dmFsKTsKK2ludDQgX19vdmxkIF9fY25mbiBjbGFtcChpbnQ0IHgsIGludDQgbWludmFsLCBpbnQ0IG1heHZhbCk7Cit1aW50NCBfX292bGQgX19jbmZuIGNsYW1wKHVpbnQ0IHgsIHVpbnQ0IG1pbnZhbCwgdWludDQgbWF4dmFsKTsKK2ludDggX19vdmxkIF9fY25mbiBjbGFtcChpbnQ4IHgsIGludDggbWludmFsLCBpbnQ4IG1heHZhbCk7Cit1aW50OCBfX292bGQgX19jbmZuIGNsYW1wKHVpbnQ4IHgsIHVpbnQ4IG1pbnZhbCwgdWludDggbWF4dmFsKTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gY2xhbXAoaW50MTYgeCwgaW50MTYgbWludmFsLCBpbnQxNiBtYXh2YWwpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gY2xhbXAodWludDE2IHgsIHVpbnQxNiBtaW52YWwsIHVpbnQxNiBtYXh2YWwpOworbG9uZyBfX292bGQgX19jbmZuIGNsYW1wKGxvbmcgeCwgbG9uZyBtaW52YWwsIGxvbmcgbWF4dmFsKTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gY2xhbXAodWxvbmcgeCwgdWxvbmcgbWludmFsLCB1bG9uZyBtYXh2YWwpOworbG9uZzIgX19vdmxkIF9fY25mbiBjbGFtcChsb25nMiB4LCBsb25nMiBtaW52YWwsIGxvbmcyIG1heHZhbCk7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBjbGFtcCh1bG9uZzIgeCwgdWxvbmcyIG1pbnZhbCwgdWxvbmcyIG1heHZhbCk7Citsb25nMyBfX292bGQgX19jbmZuIGNsYW1wKGxvbmczIHgsIGxvbmczIG1pbnZhbCwgbG9uZzMgbWF4dmFsKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGNsYW1wKHVsb25nMyB4LCB1bG9uZzMgbWludmFsLCB1bG9uZzMgbWF4dmFsKTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gY2xhbXAobG9uZzQgeCwgbG9uZzQgbWludmFsLCBsb25nNCBtYXh2YWwpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gY2xhbXAodWxvbmc0IHgsIHVsb25nNCBtaW52YWwsIHVsb25nNCBtYXh2YWwpOworbG9uZzggX19vdmxkIF9fY25mbiBjbGFtcChsb25nOCB4LCBsb25nOCBtaW52YWwsIGxvbmc4IG1heHZhbCk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBjbGFtcCh1bG9uZzggeCwgdWxvbmc4IG1pbnZhbCwgdWxvbmc4IG1heHZhbCk7Citsb25nMTYgX19vdmxkIF9fY25mbiBjbGFtcChsb25nMTYgeCwgbG9uZzE2IG1pbnZhbCwgbG9uZzE2IG1heHZhbCk7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gY2xhbXAodWxvbmcxNiB4LCB1bG9uZzE2IG1pbnZhbCwgdWxvbmcxNiBtYXh2YWwpOworY2hhciBfX292bGQgX19jbmZuIGNsYW1wKGNoYXIgeCwgY2hhciBtaW52YWwsIGNoYXIgbWF4dmFsKTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gY2xhbXAodWNoYXIgeCwgdWNoYXIgbWludmFsLCB1Y2hhciBtYXh2YWwpOworY2hhcjIgX19vdmxkIF9fY25mbiBjbGFtcChjaGFyMiB4LCBjaGFyIG1pbnZhbCwgY2hhciBtYXh2YWwpOwordWNoYXIyIF9fb3ZsZCBfX2NuZm4gY2xhbXAodWNoYXIyIHgsIHVjaGFyIG1pbnZhbCwgdWNoYXIgbWF4dmFsKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gY2xhbXAoY2hhcjMgeCwgY2hhciBtaW52YWwsIGNoYXIgbWF4dmFsKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIGNsYW1wKHVjaGFyMyB4LCB1Y2hhciBtaW52YWwsIHVjaGFyIG1heHZhbCk7CitjaGFyNCBfX292bGQgX19jbmZuIGNsYW1wKGNoYXI0IHgsIGNoYXIgbWludmFsLCBjaGFyIG1heHZhbCk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBjbGFtcCh1Y2hhcjQgeCwgdWNoYXIgbWludmFsLCB1Y2hhciBtYXh2YWwpOworY2hhcjggX19vdmxkIF9fY25mbiBjbGFtcChjaGFyOCB4LCBjaGFyIG1pbnZhbCwgY2hhciBtYXh2YWwpOwordWNoYXI4IF9fb3ZsZCBfX2NuZm4gY2xhbXAodWNoYXI4IHgsIHVjaGFyIG1pbnZhbCwgdWNoYXIgbWF4dmFsKTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGNsYW1wKGNoYXIxNiB4LCBjaGFyIG1pbnZhbCwgY2hhciBtYXh2YWwpOwordWNoYXIxNiBfX292bGQgX19jbmZuIGNsYW1wKHVjaGFyMTYgeCwgdWNoYXIgbWludmFsLCB1Y2hhciBtYXh2YWwpOworc2hvcnQgX19vdmxkIF9fY25mbiBjbGFtcChzaG9ydCB4LCBzaG9ydCBtaW52YWwsIHNob3J0IG1heHZhbCk7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBjbGFtcCh1c2hvcnQgeCwgdXNob3J0IG1pbnZhbCwgdXNob3J0IG1heHZhbCk7CitzaG9ydDIgX19vdmxkIF9fY25mbiBjbGFtcChzaG9ydDIgeCwgc2hvcnQgbWludmFsLCBzaG9ydCBtYXh2YWwpOwordXNob3J0MiBfX292bGQgX19jbmZuIGNsYW1wKHVzaG9ydDIgeCwgdXNob3J0IG1pbnZhbCwgdXNob3J0IG1heHZhbCk7CitzaG9ydDMgX19vdmxkIF9fY25mbiBjbGFtcChzaG9ydDMgeCwgc2hvcnQgbWludmFsLCBzaG9ydCBtYXh2YWwpOwordXNob3J0MyBfX292bGQgX19jbmZuIGNsYW1wKHVzaG9ydDMgeCwgdXNob3J0IG1pbnZhbCwgdXNob3J0IG1heHZhbCk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBjbGFtcChzaG9ydDQgeCwgc2hvcnQgbWludmFsLCBzaG9ydCBtYXh2YWwpOwordXNob3J0NCBfX292bGQgX19jbmZuIGNsYW1wKHVzaG9ydDQgeCwgdXNob3J0IG1pbnZhbCwgdXNob3J0IG1heHZhbCk7CitzaG9ydDggX19vdmxkIF9fY25mbiBjbGFtcChzaG9ydDggeCwgc2hvcnQgbWludmFsLCBzaG9ydCBtYXh2YWwpOwordXNob3J0OCBfX292bGQgX19jbmZuIGNsYW1wKHVzaG9ydDggeCwgdXNob3J0IG1pbnZhbCwgdXNob3J0IG1heHZhbCk7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gY2xhbXAoc2hvcnQxNiB4LCBzaG9ydCBtaW52YWwsIHNob3J0IG1heHZhbCk7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIGNsYW1wKHVzaG9ydDE2IHgsIHVzaG9ydCBtaW52YWwsIHVzaG9ydCBtYXh2YWwpOworaW50IF9fb3ZsZCBfX2NuZm4gY2xhbXAoaW50IHgsIGludCBtaW52YWwsIGludCBtYXh2YWwpOwordWludCBfX292bGQgX19jbmZuIGNsYW1wKHVpbnQgeCwgdWludCBtaW52YWwsIHVpbnQgbWF4dmFsKTsKK2ludDIgX19vdmxkIF9fY25mbiBjbGFtcChpbnQyIHgsIGludCBtaW52YWwsIGludCBtYXh2YWwpOwordWludDIgX19vdmxkIF9fY25mbiBjbGFtcCh1aW50MiB4LCB1aW50IG1pbnZhbCwgdWludCBtYXh2YWwpOworaW50MyBfX292bGQgX19jbmZuIGNsYW1wKGludDMgeCwgaW50IG1pbnZhbCwgaW50IG1heHZhbCk7Cit1aW50MyBfX292bGQgX19jbmZuIGNsYW1wKHVpbnQzIHgsIHVpbnQgbWludmFsLCB1aW50IG1heHZhbCk7CitpbnQ0IF9fb3ZsZCBfX2NuZm4gY2xhbXAoaW50NCB4LCBpbnQgbWludmFsLCBpbnQgbWF4dmFsKTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gY2xhbXAodWludDQgeCwgdWludCBtaW52YWwsIHVpbnQgbWF4dmFsKTsKK2ludDggX19vdmxkIF9fY25mbiBjbGFtcChpbnQ4IHgsIGludCBtaW52YWwsIGludCBtYXh2YWwpOwordWludDggX19vdmxkIF9fY25mbiBjbGFtcCh1aW50OCB4LCB1aW50IG1pbnZhbCwgdWludCBtYXh2YWwpOworaW50MTYgX19vdmxkIF9fY25mbiBjbGFtcChpbnQxNiB4LCBpbnQgbWludmFsLCBpbnQgbWF4dmFsKTsKK3VpbnQxNiBfX292bGQgX19jbmZuIGNsYW1wKHVpbnQxNiB4LCB1aW50IG1pbnZhbCwgdWludCBtYXh2YWwpOworbG9uZyBfX292bGQgX19jbmZuIGNsYW1wKGxvbmcgeCwgbG9uZyBtaW52YWwsIGxvbmcgbWF4dmFsKTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gY2xhbXAodWxvbmcgeCwgdWxvbmcgbWludmFsLCB1bG9uZyBtYXh2YWwpOworbG9uZzIgX19vdmxkIF9fY25mbiBjbGFtcChsb25nMiB4LCBsb25nIG1pbnZhbCwgbG9uZyBtYXh2YWwpOwordWxvbmcyIF9fb3ZsZCBfX2NuZm4gY2xhbXAodWxvbmcyIHgsIHVsb25nIG1pbnZhbCwgdWxvbmcgbWF4dmFsKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gY2xhbXAobG9uZzMgeCwgbG9uZyBtaW52YWwsIGxvbmcgbWF4dmFsKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIGNsYW1wKHVsb25nMyB4LCB1bG9uZyBtaW52YWwsIHVsb25nIG1heHZhbCk7Citsb25nNCBfX292bGQgX19jbmZuIGNsYW1wKGxvbmc0IHgsIGxvbmcgbWludmFsLCBsb25nIG1heHZhbCk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBjbGFtcCh1bG9uZzQgeCwgdWxvbmcgbWludmFsLCB1bG9uZyBtYXh2YWwpOworbG9uZzggX19vdmxkIF9fY25mbiBjbGFtcChsb25nOCB4LCBsb25nIG1pbnZhbCwgbG9uZyBtYXh2YWwpOwordWxvbmc4IF9fb3ZsZCBfX2NuZm4gY2xhbXAodWxvbmc4IHgsIHVsb25nIG1pbnZhbCwgdWxvbmcgbWF4dmFsKTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGNsYW1wKGxvbmcxNiB4LCBsb25nIG1pbnZhbCwgbG9uZyBtYXh2YWwpOwordWxvbmcxNiBfX292bGQgX19jbmZuIGNsYW1wKHVsb25nMTYgeCwgdWxvbmcgbWludmFsLCB1bG9uZyBtYXh2YWwpOworCisvKioKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBsZWFkaW5nIDAtYml0cyBpbiB4LCBzdGFydGluZworICogYXQgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IHBvc2l0aW9uLgorICovCitjaGFyIF9fb3ZsZCBfX2NuZm4gY2x6KGNoYXIgeCk7Cit1Y2hhciBfX292bGQgX19jbmZuIGNseih1Y2hhciB4KTsKK2NoYXIyIF9fb3ZsZCBfX2NuZm4gY2x6KGNoYXIyIHgpOwordWNoYXIyIF9fb3ZsZCBfX2NuZm4gY2x6KHVjaGFyMiB4KTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gY2x6KGNoYXIzIHgpOwordWNoYXIzIF9fb3ZsZCBfX2NuZm4gY2x6KHVjaGFyMyB4KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gY2x6KGNoYXI0IHgpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gY2x6KHVjaGFyNCB4KTsKK2NoYXI4IF9fb3ZsZCBfX2NuZm4gY2x6KGNoYXI4IHgpOwordWNoYXI4IF9fb3ZsZCBfX2NuZm4gY2x6KHVjaGFyOCB4KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIGNseihjaGFyMTYgeCk7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gY2x6KHVjaGFyMTYgeCk7CitzaG9ydCBfX292bGQgX19jbmZuIGNseihzaG9ydCB4KTsKK3VzaG9ydCBfX292bGQgX19jbmZuIGNseih1c2hvcnQgeCk7CitzaG9ydDIgX19vdmxkIF9fY25mbiBjbHooc2hvcnQyIHgpOwordXNob3J0MiBfX292bGQgX19jbmZuIGNseih1c2hvcnQyIHgpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gY2x6KHNob3J0MyB4KTsKK3VzaG9ydDMgX19vdmxkIF9fY25mbiBjbHoodXNob3J0MyB4KTsKK3Nob3J0NCBfX292bGQgX19jbmZuIGNseihzaG9ydDQgeCk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gY2x6KHVzaG9ydDQgeCk7CitzaG9ydDggX19vdmxkIF9fY25mbiBjbHooc2hvcnQ4IHgpOwordXNob3J0OCBfX292bGQgX19jbmZuIGNseih1c2hvcnQ4IHgpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGNseihzaG9ydDE2IHgpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBjbHoodXNob3J0MTYgeCk7CitpbnQgX19vdmxkIF9fY25mbiBjbHooaW50IHgpOwordWludCBfX292bGQgX19jbmZuIGNseih1aW50IHgpOworaW50MiBfX292bGQgX19jbmZuIGNseihpbnQyIHgpOwordWludDIgX19vdmxkIF9fY25mbiBjbHoodWludDIgeCk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gY2x6KGludDMgeCk7Cit1aW50MyBfX292bGQgX19jbmZuIGNseih1aW50MyB4KTsKK2ludDQgX19vdmxkIF9fY25mbiBjbHooaW50NCB4KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gY2x6KHVpbnQ0IHgpOworaW50OCBfX292bGQgX19jbmZuIGNseihpbnQ4IHgpOwordWludDggX19vdmxkIF9fY25mbiBjbHoodWludDggeCk7CitpbnQxNiBfX292bGQgX19jbmZuIGNseihpbnQxNiB4KTsKK3VpbnQxNiBfX292bGQgX19jbmZuIGNseih1aW50MTYgeCk7Citsb25nIF9fb3ZsZCBfX2NuZm4gY2x6KGxvbmcgeCk7Cit1bG9uZyBfX292bGQgX19jbmZuIGNseih1bG9uZyB4KTsKK2xvbmcyIF9fb3ZsZCBfX2NuZm4gY2x6KGxvbmcyIHgpOwordWxvbmcyIF9fb3ZsZCBfX2NuZm4gY2x6KHVsb25nMiB4KTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gY2x6KGxvbmczIHgpOwordWxvbmczIF9fb3ZsZCBfX2NuZm4gY2x6KHVsb25nMyB4KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gY2x6KGxvbmc0IHgpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gY2x6KHVsb25nNCB4KTsKK2xvbmc4IF9fb3ZsZCBfX2NuZm4gY2x6KGxvbmc4IHgpOwordWxvbmc4IF9fb3ZsZCBfX2NuZm4gY2x6KHVsb25nOCB4KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGNseihsb25nMTYgeCk7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gY2x6KHVsb25nMTYgeCk7CisKKy8qKgorICogUmV0dXJucyB0aGUgY291bnQgb2YgdHJhaWxpbmcgMC1iaXRzIGluIHguIElmIHggaXMgMCwKKyAqIHJldHVybnMgdGhlIHNpemUgaW4gYml0cyBvZiB0aGUgdHlwZSBvZiB4IG9yCisgKiBjb21wb25lbnQgdHlwZSBvZiB4LCBpZiB4IGlzIGEgdmVjdG9yLgorICovCisjaWYgX19PUEVOQ0xfQ19WRVJTSU9OX18gPj0gQ0xfVkVSU0lPTl8yXzAKK2NoYXIgX19vdmxkIGN0eihjaGFyIHgpOwordWNoYXIgX19vdmxkIGN0eih1Y2hhciB4KTsKK2NoYXIyIF9fb3ZsZCBjdHooY2hhcjIgeCk7Cit1Y2hhcjIgX19vdmxkIGN0eih1Y2hhcjIgeCk7CitjaGFyMyBfX292bGQgY3R6KGNoYXIzIHgpOwordWNoYXIzIF9fb3ZsZCBjdHoodWNoYXIzIHgpOworY2hhcjQgX19vdmxkIGN0eihjaGFyNCB4KTsKK3VjaGFyNCBfX292bGQgY3R6KHVjaGFyNCB4KTsKK2NoYXI4IF9fb3ZsZCBjdHooY2hhcjggeCk7Cit1Y2hhcjggX19vdmxkIGN0eih1Y2hhcjggeCk7CitjaGFyMTYgX19vdmxkIGN0eihjaGFyMTYgeCk7Cit1Y2hhcjE2IF9fb3ZsZCBjdHoodWNoYXIxNiB4KTsKK3Nob3J0IF9fb3ZsZCBjdHooc2hvcnQgeCk7Cit1c2hvcnQgX19vdmxkIGN0eih1c2hvcnQgeCk7CitzaG9ydDIgX19vdmxkIGN0eihzaG9ydDIgeCk7Cit1c2hvcnQyIF9fb3ZsZCBjdHoodXNob3J0MiB4KTsKK3Nob3J0MyBfX292bGQgY3R6KHNob3J0MyB4KTsKK3VzaG9ydDMgX19vdmxkIGN0eih1c2hvcnQzIHgpOworc2hvcnQ0IF9fb3ZsZCBjdHooc2hvcnQ0IHgpOwordXNob3J0NCBfX292bGQgY3R6KHVzaG9ydDQgeCk7CitzaG9ydDggX19vdmxkIGN0eihzaG9ydDggeCk7Cit1c2hvcnQ4IF9fb3ZsZCBjdHoodXNob3J0OCB4KTsKK3Nob3J0MTYgX19vdmxkIGN0eihzaG9ydDE2IHgpOwordXNob3J0MTYgX19vdmxkIGN0eih1c2hvcnQxNiB4KTsKK2ludCBfX292bGQgY3R6KGludCB4KTsKK3VpbnQgX19vdmxkIGN0eih1aW50IHgpOworaW50MiBfX292bGQgY3R6KGludDIgeCk7Cit1aW50MiBfX292bGQgY3R6KHVpbnQyIHgpOworaW50MyBfX292bGQgY3R6KGludDMgeCk7Cit1aW50MyBfX292bGQgY3R6KHVpbnQzIHgpOworaW50NCBfX292bGQgY3R6KGludDQgeCk7Cit1aW50NCBfX292bGQgY3R6KHVpbnQ0IHgpOworaW50OCBfX292bGQgY3R6KGludDggeCk7Cit1aW50OCBfX292bGQgY3R6KHVpbnQ4IHgpOworaW50MTYgX19vdmxkIGN0eihpbnQxNiB4KTsKK3VpbnQxNiBfX292bGQgY3R6KHVpbnQxNiB4KTsKK2xvbmcgX19vdmxkIGN0eihsb25nIHgpOwordWxvbmcgX19vdmxkIGN0eih1bG9uZyB4KTsKK2xvbmcyIF9fb3ZsZCBjdHoobG9uZzIgeCk7Cit1bG9uZzIgX19vdmxkIGN0eih1bG9uZzIgeCk7Citsb25nMyBfX292bGQgY3R6KGxvbmczIHgpOwordWxvbmczIF9fb3ZsZCBjdHoodWxvbmczIHgpOworbG9uZzQgX19vdmxkIGN0eihsb25nNCB4KTsKK3Vsb25nNCBfX292bGQgY3R6KHVsb25nNCB4KTsKK2xvbmc4IF9fb3ZsZCBjdHoobG9uZzggeCk7Cit1bG9uZzggX19vdmxkIGN0eih1bG9uZzggeCk7Citsb25nMTYgX19vdmxkIGN0eihsb25nMTYgeCk7Cit1bG9uZzE2IF9fb3ZsZCBjdHoodWxvbmcxNiB4KTsKKyNlbmRpZiAvL19fT1BFTkNMX0NfVkVSU0lPTl9fID49IENMX1ZFUlNJT05fMl8wCisKKy8qKgorICogUmV0dXJucyBtdWxfaGkoYSwgYikgKyBjLgorICovCitjaGFyIF9fb3ZsZCBfX2NuZm4gbWFkX2hpKGNoYXIgYSwgY2hhciBiLCBjaGFyIGMpOwordWNoYXIgX19vdmxkIF9fY25mbiBtYWRfaGkodWNoYXIgYSwgdWNoYXIgYiwgdWNoYXIgYyk7CitjaGFyMiBfX292bGQgX19jbmZuIG1hZF9oaShjaGFyMiBhLCBjaGFyMiBiLCBjaGFyMiBjKTsKK3VjaGFyMiBfX292bGQgX19jbmZuIG1hZF9oaSh1Y2hhcjIgYSwgdWNoYXIyIGIsIHVjaGFyMiBjKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gbWFkX2hpKGNoYXIzIGEsIGNoYXIzIGIsIGNoYXIzIGMpOwordWNoYXIzIF9fb3ZsZCBfX2NuZm4gbWFkX2hpKHVjaGFyMyBhLCB1Y2hhcjMgYiwgdWNoYXIzIGMpOworY2hhcjQgX19vdmxkIF9fY25mbiBtYWRfaGkoY2hhcjQgYSwgY2hhcjQgYiwgY2hhcjQgYyk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBtYWRfaGkodWNoYXI0IGEsIHVjaGFyNCBiLCB1Y2hhcjQgYyk7CitjaGFyOCBfX292bGQgX19jbmZuIG1hZF9oaShjaGFyOCBhLCBjaGFyOCBiLCBjaGFyOCBjKTsKK3VjaGFyOCBfX292bGQgX19jbmZuIG1hZF9oaSh1Y2hhcjggYSwgdWNoYXI4IGIsIHVjaGFyOCBjKTsKK2NoYXIxNiBfX292bGQgX19jbmZuIG1hZF9oaShjaGFyMTYgYSwgY2hhcjE2IGIsIGNoYXIxNiBjKTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBtYWRfaGkodWNoYXIxNiBhLCB1Y2hhcjE2IGIsIHVjaGFyMTYgYyk7CitzaG9ydCBfX292bGQgX19jbmZuIG1hZF9oaShzaG9ydCBhLCBzaG9ydCBiLCBzaG9ydCBjKTsKK3VzaG9ydCBfX292bGQgX19jbmZuIG1hZF9oaSh1c2hvcnQgYSwgdXNob3J0IGIsIHVzaG9ydCBjKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIG1hZF9oaShzaG9ydDIgYSwgc2hvcnQyIGIsIHNob3J0MiBjKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBtYWRfaGkodXNob3J0MiBhLCB1c2hvcnQyIGIsIHVzaG9ydDIgYyk7CitzaG9ydDMgX19vdmxkIF9fY25mbiBtYWRfaGkoc2hvcnQzIGEsIHNob3J0MyBiLCBzaG9ydDMgYyk7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gbWFkX2hpKHVzaG9ydDMgYSwgdXNob3J0MyBiLCB1c2hvcnQzIGMpOworc2hvcnQ0IF9fb3ZsZCBfX2NuZm4gbWFkX2hpKHNob3J0NCBhLCBzaG9ydDQgYiwgc2hvcnQ0IGMpOwordXNob3J0NCBfX292bGQgX19jbmZuIG1hZF9oaSh1c2hvcnQ0IGEsIHVzaG9ydDQgYiwgdXNob3J0NCBjKTsKK3Nob3J0OCBfX292bGQgX19jbmZuIG1hZF9oaShzaG9ydDggYSwgc2hvcnQ4IGIsIHNob3J0OCBjKTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBtYWRfaGkodXNob3J0OCBhLCB1c2hvcnQ4IGIsIHVzaG9ydDggYyk7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gbWFkX2hpKHNob3J0MTYgYSwgc2hvcnQxNiBiLCBzaG9ydDE2IGMpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBtYWRfaGkodXNob3J0MTYgYSwgdXNob3J0MTYgYiwgdXNob3J0MTYgYyk7CitpbnQgX19vdmxkIF9fY25mbiBtYWRfaGkoaW50IGEsIGludCBiLCBpbnQgYyk7Cit1aW50IF9fb3ZsZCBfX2NuZm4gbWFkX2hpKHVpbnQgYSwgdWludCBiLCB1aW50IGMpOworaW50MiBfX292bGQgX19jbmZuIG1hZF9oaShpbnQyIGEsIGludDIgYiwgaW50MiBjKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gbWFkX2hpKHVpbnQyIGEsIHVpbnQyIGIsIHVpbnQyIGMpOworaW50MyBfX292bGQgX19jbmZuIG1hZF9oaShpbnQzIGEsIGludDMgYiwgaW50MyBjKTsKK3VpbnQzIF9fb3ZsZCBfX2NuZm4gbWFkX2hpKHVpbnQzIGEsIHVpbnQzIGIsIHVpbnQzIGMpOworaW50NCBfX292bGQgX19jbmZuIG1hZF9oaShpbnQ0IGEsIGludDQgYiwgaW50NCBjKTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gbWFkX2hpKHVpbnQ0IGEsIHVpbnQ0IGIsIHVpbnQ0IGMpOworaW50OCBfX292bGQgX19jbmZuIG1hZF9oaShpbnQ4IGEsIGludDggYiwgaW50OCBjKTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gbWFkX2hpKHVpbnQ4IGEsIHVpbnQ4IGIsIHVpbnQ4IGMpOworaW50MTYgX19vdmxkIF9fY25mbiBtYWRfaGkoaW50MTYgYSwgaW50MTYgYiwgaW50MTYgYyk7Cit1aW50MTYgX19vdmxkIF9fY25mbiBtYWRfaGkodWludDE2IGEsIHVpbnQxNiBiLCB1aW50MTYgYyk7Citsb25nIF9fb3ZsZCBfX2NuZm4gbWFkX2hpKGxvbmcgYSwgbG9uZyBiLCBsb25nIGMpOwordWxvbmcgX19vdmxkIF9fY25mbiBtYWRfaGkodWxvbmcgYSwgdWxvbmcgYiwgdWxvbmcgYyk7Citsb25nMiBfX292bGQgX19jbmZuIG1hZF9oaShsb25nMiBhLCBsb25nMiBiLCBsb25nMiBjKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIG1hZF9oaSh1bG9uZzIgYSwgdWxvbmcyIGIsIHVsb25nMiBjKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gbWFkX2hpKGxvbmczIGEsIGxvbmczIGIsIGxvbmczIGMpOwordWxvbmczIF9fb3ZsZCBfX2NuZm4gbWFkX2hpKHVsb25nMyBhLCB1bG9uZzMgYiwgdWxvbmczIGMpOworbG9uZzQgX19vdmxkIF9fY25mbiBtYWRfaGkobG9uZzQgYSwgbG9uZzQgYiwgbG9uZzQgYyk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBtYWRfaGkodWxvbmc0IGEsIHVsb25nNCBiLCB1bG9uZzQgYyk7Citsb25nOCBfX292bGQgX19jbmZuIG1hZF9oaShsb25nOCBhLCBsb25nOCBiLCBsb25nOCBjKTsKK3Vsb25nOCBfX292bGQgX19jbmZuIG1hZF9oaSh1bG9uZzggYSwgdWxvbmc4IGIsIHVsb25nOCBjKTsKK2xvbmcxNiBfX292bGQgX19jbmZuIG1hZF9oaShsb25nMTYgYSwgbG9uZzE2IGIsIGxvbmcxNiBjKTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBtYWRfaGkodWxvbmcxNiBhLCB1bG9uZzE2IGIsIHVsb25nMTYgYyk7CisKKy8qKgorICogUmV0dXJucyBhICogYiArIGMgYW5kIHNhdHVyYXRlcyB0aGUgcmVzdWx0LgorICovCitjaGFyIF9fb3ZsZCBfX2NuZm4gbWFkX3NhdChjaGFyIGEsIGNoYXIgYiwgY2hhciBjKTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gbWFkX3NhdCh1Y2hhciBhLCB1Y2hhciBiLCB1Y2hhciBjKTsKK2NoYXIyIF9fb3ZsZCBfX2NuZm4gbWFkX3NhdChjaGFyMiBhLCBjaGFyMiBiLCBjaGFyMiBjKTsKK3VjaGFyMiBfX292bGQgX19jbmZuIG1hZF9zYXQodWNoYXIyIGEsIHVjaGFyMiBiLCB1Y2hhcjIgYyk7CitjaGFyMyBfX292bGQgX19jbmZuIG1hZF9zYXQoY2hhcjMgYSwgY2hhcjMgYiwgY2hhcjMgYyk7Cit1Y2hhcjMgX19vdmxkIF9fY25mbiBtYWRfc2F0KHVjaGFyMyBhLCB1Y2hhcjMgYiwgdWNoYXIzIGMpOworY2hhcjQgX19vdmxkIF9fY25mbiBtYWRfc2F0KGNoYXI0IGEsIGNoYXI0IGIsIGNoYXI0IGMpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gbWFkX3NhdCh1Y2hhcjQgYSwgdWNoYXI0IGIsIHVjaGFyNCBjKTsKK2NoYXI4IF9fb3ZsZCBfX2NuZm4gbWFkX3NhdChjaGFyOCBhLCBjaGFyOCBiLCBjaGFyOCBjKTsKK3VjaGFyOCBfX292bGQgX19jbmZuIG1hZF9zYXQodWNoYXI4IGEsIHVjaGFyOCBiLCB1Y2hhcjggYyk7CitjaGFyMTYgX19vdmxkIF9fY25mbiBtYWRfc2F0KGNoYXIxNiBhLCBjaGFyMTYgYiwgY2hhcjE2IGMpOwordWNoYXIxNiBfX292bGQgX19jbmZuIG1hZF9zYXQodWNoYXIxNiBhLCB1Y2hhcjE2IGIsIHVjaGFyMTYgYyk7CitzaG9ydCBfX292bGQgX19jbmZuIG1hZF9zYXQoc2hvcnQgYSwgc2hvcnQgYiwgc2hvcnQgYyk7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBtYWRfc2F0KHVzaG9ydCBhLCB1c2hvcnQgYiwgdXNob3J0IGMpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gbWFkX3NhdChzaG9ydDIgYSwgc2hvcnQyIGIsIHNob3J0MiBjKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBtYWRfc2F0KHVzaG9ydDIgYSwgdXNob3J0MiBiLCB1c2hvcnQyIGMpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gbWFkX3NhdChzaG9ydDMgYSwgc2hvcnQzIGIsIHNob3J0MyBjKTsKK3VzaG9ydDMgX19vdmxkIF9fY25mbiBtYWRfc2F0KHVzaG9ydDMgYSwgdXNob3J0MyBiLCB1c2hvcnQzIGMpOworc2hvcnQ0IF9fb3ZsZCBfX2NuZm4gbWFkX3NhdChzaG9ydDQgYSwgc2hvcnQ0IGIsIHNob3J0NCBjKTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBtYWRfc2F0KHVzaG9ydDQgYSwgdXNob3J0NCBiLCB1c2hvcnQ0IGMpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gbWFkX3NhdChzaG9ydDggYSwgc2hvcnQ4IGIsIHNob3J0OCBjKTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBtYWRfc2F0KHVzaG9ydDggYSwgdXNob3J0OCBiLCB1c2hvcnQ4IGMpOworc2hvcnQxNiBfX292bGQgX19jbmZuIG1hZF9zYXQoc2hvcnQxNiBhLCBzaG9ydDE2IGIsIHNob3J0MTYgYyk7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIG1hZF9zYXQodXNob3J0MTYgYSwgdXNob3J0MTYgYiwgdXNob3J0MTYgYyk7CitpbnQgX19vdmxkIF9fY25mbiBtYWRfc2F0KGludCBhLCBpbnQgYiwgaW50IGMpOwordWludCBfX292bGQgX19jbmZuIG1hZF9zYXQodWludCBhLCB1aW50IGIsIHVpbnQgYyk7CitpbnQyIF9fb3ZsZCBfX2NuZm4gbWFkX3NhdChpbnQyIGEsIGludDIgYiwgaW50MiBjKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gbWFkX3NhdCh1aW50MiBhLCB1aW50MiBiLCB1aW50MiBjKTsKK2ludDMgX19vdmxkIF9fY25mbiBtYWRfc2F0KGludDMgYSwgaW50MyBiLCBpbnQzIGMpOwordWludDMgX19vdmxkIF9fY25mbiBtYWRfc2F0KHVpbnQzIGEsIHVpbnQzIGIsIHVpbnQzIGMpOworaW50NCBfX292bGQgX19jbmZuIG1hZF9zYXQoaW50NCBhLCBpbnQ0IGIsIGludDQgYyk7Cit1aW50NCBfX292bGQgX19jbmZuIG1hZF9zYXQodWludDQgYSwgdWludDQgYiwgdWludDQgYyk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gbWFkX3NhdChpbnQ4IGEsIGludDggYiwgaW50OCBjKTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gbWFkX3NhdCh1aW50OCBhLCB1aW50OCBiLCB1aW50OCBjKTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gbWFkX3NhdChpbnQxNiBhLCBpbnQxNiBiLCBpbnQxNiBjKTsKK3VpbnQxNiBfX292bGQgX19jbmZuIG1hZF9zYXQodWludDE2IGEsIHVpbnQxNiBiLCB1aW50MTYgYyk7Citsb25nIF9fb3ZsZCBfX2NuZm4gbWFkX3NhdChsb25nIGEsIGxvbmcgYiwgbG9uZyBjKTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gbWFkX3NhdCh1bG9uZyBhLCB1bG9uZyBiLCB1bG9uZyBjKTsKK2xvbmcyIF9fb3ZsZCBfX2NuZm4gbWFkX3NhdChsb25nMiBhLCBsb25nMiBiLCBsb25nMiBjKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIG1hZF9zYXQodWxvbmcyIGEsIHVsb25nMiBiLCB1bG9uZzIgYyk7Citsb25nMyBfX292bGQgX19jbmZuIG1hZF9zYXQobG9uZzMgYSwgbG9uZzMgYiwgbG9uZzMgYyk7Cit1bG9uZzMgX19vdmxkIF9fY25mbiBtYWRfc2F0KHVsb25nMyBhLCB1bG9uZzMgYiwgdWxvbmczIGMpOworbG9uZzQgX19vdmxkIF9fY25mbiBtYWRfc2F0KGxvbmc0IGEsIGxvbmc0IGIsIGxvbmc0IGMpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gbWFkX3NhdCh1bG9uZzQgYSwgdWxvbmc0IGIsIHVsb25nNCBjKTsKK2xvbmc4IF9fb3ZsZCBfX2NuZm4gbWFkX3NhdChsb25nOCBhLCBsb25nOCBiLCBsb25nOCBjKTsKK3Vsb25nOCBfX292bGQgX19jbmZuIG1hZF9zYXQodWxvbmc4IGEsIHVsb25nOCBiLCB1bG9uZzggYyk7Citsb25nMTYgX19vdmxkIF9fY25mbiBtYWRfc2F0KGxvbmcxNiBhLCBsb25nMTYgYiwgbG9uZzE2IGMpOwordWxvbmcxNiBfX292bGQgX19jbmZuIG1hZF9zYXQodWxvbmcxNiBhLCB1bG9uZzE2IGIsIHVsb25nMTYgYyk7CisKKy8qKgorICogUmV0dXJucyB5IGlmIHggPCB5LCBvdGhlcndpc2UgaXQgcmV0dXJucyB4LgorICovCitjaGFyIF9fb3ZsZCBfX2NuZm4gbWF4KGNoYXIgeCwgY2hhciB5KTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gbWF4KHVjaGFyIHgsIHVjaGFyIHkpOworY2hhcjIgX19vdmxkIF9fY25mbiBtYXgoY2hhcjIgeCwgY2hhcjIgeSk7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBtYXgodWNoYXIyIHgsIHVjaGFyMiB5KTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gbWF4KGNoYXIzIHgsIGNoYXIzIHkpOwordWNoYXIzIF9fb3ZsZCBfX2NuZm4gbWF4KHVjaGFyMyB4LCB1Y2hhcjMgeSk7CitjaGFyNCBfX292bGQgX19jbmZuIG1heChjaGFyNCB4LCBjaGFyNCB5KTsKK3VjaGFyNCBfX292bGQgX19jbmZuIG1heCh1Y2hhcjQgeCwgdWNoYXI0IHkpOworY2hhcjggX19vdmxkIF9fY25mbiBtYXgoY2hhcjggeCwgY2hhcjggeSk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBtYXgodWNoYXI4IHgsIHVjaGFyOCB5KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIG1heChjaGFyMTYgeCwgY2hhcjE2IHkpOwordWNoYXIxNiBfX292bGQgX19jbmZuIG1heCh1Y2hhcjE2IHgsIHVjaGFyMTYgeSk7CitzaG9ydCBfX292bGQgX19jbmZuIG1heChzaG9ydCB4LCBzaG9ydCB5KTsKK3VzaG9ydCBfX292bGQgX19jbmZuIG1heCh1c2hvcnQgeCwgdXNob3J0IHkpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gbWF4KHNob3J0MiB4LCBzaG9ydDIgeSk7Cit1c2hvcnQyIF9fb3ZsZCBfX2NuZm4gbWF4KHVzaG9ydDIgeCwgdXNob3J0MiB5KTsKK3Nob3J0MyBfX292bGQgX19jbmZuIG1heChzaG9ydDMgeCwgc2hvcnQzIHkpOwordXNob3J0MyBfX292bGQgX19jbmZuIG1heCh1c2hvcnQzIHgsIHVzaG9ydDMgeSk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBtYXgoc2hvcnQ0IHgsIHNob3J0NCB5KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBtYXgodXNob3J0NCB4LCB1c2hvcnQ0IHkpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gbWF4KHNob3J0OCB4LCBzaG9ydDggeSk7Cit1c2hvcnQ4IF9fb3ZsZCBfX2NuZm4gbWF4KHVzaG9ydDggeCwgdXNob3J0OCB5KTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBtYXgoc2hvcnQxNiB4LCBzaG9ydDE2IHkpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBtYXgodXNob3J0MTYgeCwgdXNob3J0MTYgeSk7CitpbnQgX19vdmxkIF9fY25mbiBtYXgoaW50IHgsIGludCB5KTsKK3VpbnQgX19vdmxkIF9fY25mbiBtYXgodWludCB4LCB1aW50IHkpOworaW50MiBfX292bGQgX19jbmZuIG1heChpbnQyIHgsIGludDIgeSk7Cit1aW50MiBfX292bGQgX19jbmZuIG1heCh1aW50MiB4LCB1aW50MiB5KTsKK2ludDMgX19vdmxkIF9fY25mbiBtYXgoaW50MyB4LCBpbnQzIHkpOwordWludDMgX19vdmxkIF9fY25mbiBtYXgodWludDMgeCwgdWludDMgeSk7CitpbnQ0IF9fb3ZsZCBfX2NuZm4gbWF4KGludDQgeCwgaW50NCB5KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gbWF4KHVpbnQ0IHgsIHVpbnQ0IHkpOworaW50OCBfX292bGQgX19jbmZuIG1heChpbnQ4IHgsIGludDggeSk7Cit1aW50OCBfX292bGQgX19jbmZuIG1heCh1aW50OCB4LCB1aW50OCB5KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gbWF4KGludDE2IHgsIGludDE2IHkpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gbWF4KHVpbnQxNiB4LCB1aW50MTYgeSk7Citsb25nIF9fb3ZsZCBfX2NuZm4gbWF4KGxvbmcgeCwgbG9uZyB5KTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gbWF4KHVsb25nIHgsIHVsb25nIHkpOworbG9uZzIgX19vdmxkIF9fY25mbiBtYXgobG9uZzIgeCwgbG9uZzIgeSk7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBtYXgodWxvbmcyIHgsIHVsb25nMiB5KTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gbWF4KGxvbmczIHgsIGxvbmczIHkpOwordWxvbmczIF9fb3ZsZCBfX2NuZm4gbWF4KHVsb25nMyB4LCB1bG9uZzMgeSk7Citsb25nNCBfX292bGQgX19jbmZuIG1heChsb25nNCB4LCBsb25nNCB5KTsKK3Vsb25nNCBfX292bGQgX19jbmZuIG1heCh1bG9uZzQgeCwgdWxvbmc0IHkpOworbG9uZzggX19vdmxkIF9fY25mbiBtYXgobG9uZzggeCwgbG9uZzggeSk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBtYXgodWxvbmc4IHgsIHVsb25nOCB5KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIG1heChsb25nMTYgeCwgbG9uZzE2IHkpOwordWxvbmcxNiBfX292bGQgX19jbmZuIG1heCh1bG9uZzE2IHgsIHVsb25nMTYgeSk7CitjaGFyIF9fb3ZsZCBfX2NuZm4gbWF4KGNoYXIgeCwgY2hhciB5KTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gbWF4KHVjaGFyIHgsIHVjaGFyIHkpOworY2hhcjIgX19vdmxkIF9fY25mbiBtYXgoY2hhcjIgeCwgY2hhciB5KTsKK3VjaGFyMiBfX292bGQgX19jbmZuIG1heCh1Y2hhcjIgeCwgdWNoYXIgeSk7CitjaGFyMyBfX292bGQgX19jbmZuIG1heChjaGFyMyB4LCBjaGFyIHkpOwordWNoYXIzIF9fb3ZsZCBfX2NuZm4gbWF4KHVjaGFyMyB4LCB1Y2hhciB5KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gbWF4KGNoYXI0IHgsIGNoYXIgeSk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBtYXgodWNoYXI0IHgsIHVjaGFyIHkpOworY2hhcjggX19vdmxkIF9fY25mbiBtYXgoY2hhcjggeCwgY2hhciB5KTsKK3VjaGFyOCBfX292bGQgX19jbmZuIG1heCh1Y2hhcjggeCwgdWNoYXIgeSk7CitjaGFyMTYgX19vdmxkIF9fY25mbiBtYXgoY2hhcjE2IHgsIGNoYXIgeSk7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gbWF4KHVjaGFyMTYgeCwgdWNoYXIgeSk7CitzaG9ydCBfX292bGQgX19jbmZuIG1heChzaG9ydCB4LCBzaG9ydCB5KTsKK3VzaG9ydCBfX292bGQgX19jbmZuIG1heCh1c2hvcnQgeCwgdXNob3J0IHkpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gbWF4KHNob3J0MiB4LCBzaG9ydCB5KTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBtYXgodXNob3J0MiB4LCB1c2hvcnQgeSk7CitzaG9ydDMgX19vdmxkIF9fY25mbiBtYXgoc2hvcnQzIHgsIHNob3J0IHkpOwordXNob3J0MyBfX292bGQgX19jbmZuIG1heCh1c2hvcnQzIHgsIHVzaG9ydCB5KTsKK3Nob3J0NCBfX292bGQgX19jbmZuIG1heChzaG9ydDQgeCwgc2hvcnQgeSk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gbWF4KHVzaG9ydDQgeCwgdXNob3J0IHkpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gbWF4KHNob3J0OCB4LCBzaG9ydCB5KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBtYXgodXNob3J0OCB4LCB1c2hvcnQgeSk7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gbWF4KHNob3J0MTYgeCwgc2hvcnQgeSk7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIG1heCh1c2hvcnQxNiB4LCB1c2hvcnQgeSk7CitpbnQgX19vdmxkIF9fY25mbiBtYXgoaW50IHgsIGludCB5KTsKK3VpbnQgX19vdmxkIF9fY25mbiBtYXgodWludCB4LCB1aW50IHkpOworaW50MiBfX292bGQgX19jbmZuIG1heChpbnQyIHgsIGludCB5KTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gbWF4KHVpbnQyIHgsIHVpbnQgeSk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gbWF4KGludDMgeCwgaW50IHkpOwordWludDMgX19vdmxkIF9fY25mbiBtYXgodWludDMgeCwgdWludCB5KTsKK2ludDQgX19vdmxkIF9fY25mbiBtYXgoaW50NCB4LCBpbnQgeSk7Cit1aW50NCBfX292bGQgX19jbmZuIG1heCh1aW50NCB4LCB1aW50IHkpOworaW50OCBfX292bGQgX19jbmZuIG1heChpbnQ4IHgsIGludCB5KTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gbWF4KHVpbnQ4IHgsIHVpbnQgeSk7CitpbnQxNiBfX292bGQgX19jbmZuIG1heChpbnQxNiB4LCBpbnQgeSk7Cit1aW50MTYgX19vdmxkIF9fY25mbiBtYXgodWludDE2IHgsIHVpbnQgeSk7Citsb25nIF9fb3ZsZCBfX2NuZm4gbWF4KGxvbmcgeCwgbG9uZyB5KTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gbWF4KHVsb25nIHgsIHVsb25nIHkpOworbG9uZzIgX19vdmxkIF9fY25mbiBtYXgobG9uZzIgeCwgbG9uZyB5KTsKK3Vsb25nMiBfX292bGQgX19jbmZuIG1heCh1bG9uZzIgeCwgdWxvbmcgeSk7Citsb25nMyBfX292bGQgX19jbmZuIG1heChsb25nMyB4LCBsb25nIHkpOwordWxvbmczIF9fb3ZsZCBfX2NuZm4gbWF4KHVsb25nMyB4LCB1bG9uZyB5KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gbWF4KGxvbmc0IHgsIGxvbmcgeSk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBtYXgodWxvbmc0IHgsIHVsb25nIHkpOworbG9uZzggX19vdmxkIF9fY25mbiBtYXgobG9uZzggeCwgbG9uZyB5KTsKK3Vsb25nOCBfX292bGQgX19jbmZuIG1heCh1bG9uZzggeCwgdWxvbmcgeSk7Citsb25nMTYgX19vdmxkIF9fY25mbiBtYXgobG9uZzE2IHgsIGxvbmcgeSk7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gbWF4KHVsb25nMTYgeCwgdWxvbmcgeSk7CisKKy8qKgorICogUmV0dXJucyB5IGlmIHkgPCB4LCBvdGhlcndpc2UgaXQgcmV0dXJucyB4LgorICovCitjaGFyIF9fb3ZsZCBfX2NuZm4gbWluKGNoYXIgeCwgY2hhciB5KTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gbWluKHVjaGFyIHgsIHVjaGFyIHkpOworY2hhcjIgX19vdmxkIF9fY25mbiBtaW4oY2hhcjIgeCwgY2hhcjIgeSk7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBtaW4odWNoYXIyIHgsIHVjaGFyMiB5KTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gbWluKGNoYXIzIHgsIGNoYXIzIHkpOwordWNoYXIzIF9fb3ZsZCBfX2NuZm4gbWluKHVjaGFyMyB4LCB1Y2hhcjMgeSk7CitjaGFyNCBfX292bGQgX19jbmZuIG1pbihjaGFyNCB4LCBjaGFyNCB5KTsKK3VjaGFyNCBfX292bGQgX19jbmZuIG1pbih1Y2hhcjQgeCwgdWNoYXI0IHkpOworY2hhcjggX19vdmxkIF9fY25mbiBtaW4oY2hhcjggeCwgY2hhcjggeSk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBtaW4odWNoYXI4IHgsIHVjaGFyOCB5KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIG1pbihjaGFyMTYgeCwgY2hhcjE2IHkpOwordWNoYXIxNiBfX292bGQgX19jbmZuIG1pbih1Y2hhcjE2IHgsIHVjaGFyMTYgeSk7CitzaG9ydCBfX292bGQgX19jbmZuIG1pbihzaG9ydCB4LCBzaG9ydCB5KTsKK3VzaG9ydCBfX292bGQgX19jbmZuIG1pbih1c2hvcnQgeCwgdXNob3J0IHkpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gbWluKHNob3J0MiB4LCBzaG9ydDIgeSk7Cit1c2hvcnQyIF9fb3ZsZCBfX2NuZm4gbWluKHVzaG9ydDIgeCwgdXNob3J0MiB5KTsKK3Nob3J0MyBfX292bGQgX19jbmZuIG1pbihzaG9ydDMgeCwgc2hvcnQzIHkpOwordXNob3J0MyBfX292bGQgX19jbmZuIG1pbih1c2hvcnQzIHgsIHVzaG9ydDMgeSk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBtaW4oc2hvcnQ0IHgsIHNob3J0NCB5KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBtaW4odXNob3J0NCB4LCB1c2hvcnQ0IHkpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gbWluKHNob3J0OCB4LCBzaG9ydDggeSk7Cit1c2hvcnQ4IF9fb3ZsZCBfX2NuZm4gbWluKHVzaG9ydDggeCwgdXNob3J0OCB5KTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBtaW4oc2hvcnQxNiB4LCBzaG9ydDE2IHkpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBtaW4odXNob3J0MTYgeCwgdXNob3J0MTYgeSk7CitpbnQgX19vdmxkIF9fY25mbiBtaW4oaW50IHgsIGludCB5KTsKK3VpbnQgX19vdmxkIF9fY25mbiBtaW4odWludCB4LCB1aW50IHkpOworaW50MiBfX292bGQgX19jbmZuIG1pbihpbnQyIHgsIGludDIgeSk7Cit1aW50MiBfX292bGQgX19jbmZuIG1pbih1aW50MiB4LCB1aW50MiB5KTsKK2ludDMgX19vdmxkIF9fY25mbiBtaW4oaW50MyB4LCBpbnQzIHkpOwordWludDMgX19vdmxkIF9fY25mbiBtaW4odWludDMgeCwgdWludDMgeSk7CitpbnQ0IF9fb3ZsZCBfX2NuZm4gbWluKGludDQgeCwgaW50NCB5KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gbWluKHVpbnQ0IHgsIHVpbnQ0IHkpOworaW50OCBfX292bGQgX19jbmZuIG1pbihpbnQ4IHgsIGludDggeSk7Cit1aW50OCBfX292bGQgX19jbmZuIG1pbih1aW50OCB4LCB1aW50OCB5KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gbWluKGludDE2IHgsIGludDE2IHkpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gbWluKHVpbnQxNiB4LCB1aW50MTYgeSk7Citsb25nIF9fb3ZsZCBfX2NuZm4gbWluKGxvbmcgeCwgbG9uZyB5KTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gbWluKHVsb25nIHgsIHVsb25nIHkpOworbG9uZzIgX19vdmxkIF9fY25mbiBtaW4obG9uZzIgeCwgbG9uZzIgeSk7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBtaW4odWxvbmcyIHgsIHVsb25nMiB5KTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gbWluKGxvbmczIHgsIGxvbmczIHkpOwordWxvbmczIF9fb3ZsZCBfX2NuZm4gbWluKHVsb25nMyB4LCB1bG9uZzMgeSk7Citsb25nNCBfX292bGQgX19jbmZuIG1pbihsb25nNCB4LCBsb25nNCB5KTsKK3Vsb25nNCBfX292bGQgX19jbmZuIG1pbih1bG9uZzQgeCwgdWxvbmc0IHkpOworbG9uZzggX19vdmxkIF9fY25mbiBtaW4obG9uZzggeCwgbG9uZzggeSk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBtaW4odWxvbmc4IHgsIHVsb25nOCB5KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIG1pbihsb25nMTYgeCwgbG9uZzE2IHkpOwordWxvbmcxNiBfX292bGQgX19jbmZuIG1pbih1bG9uZzE2IHgsIHVsb25nMTYgeSk7CitjaGFyIF9fb3ZsZCBfX2NuZm4gbWluKGNoYXIgeCwgY2hhciB5KTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gbWluKHVjaGFyIHgsIHVjaGFyIHkpOworY2hhcjIgX19vdmxkIF9fY25mbiBtaW4oY2hhcjIgeCwgY2hhciB5KTsKK3VjaGFyMiBfX292bGQgX19jbmZuIG1pbih1Y2hhcjIgeCwgdWNoYXIgeSk7CitjaGFyMyBfX292bGQgX19jbmZuIG1pbihjaGFyMyB4LCBjaGFyIHkpOwordWNoYXIzIF9fb3ZsZCBfX2NuZm4gbWluKHVjaGFyMyB4LCB1Y2hhciB5KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gbWluKGNoYXI0IHgsIGNoYXIgeSk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBtaW4odWNoYXI0IHgsIHVjaGFyIHkpOworY2hhcjggX19vdmxkIF9fY25mbiBtaW4oY2hhcjggeCwgY2hhciB5KTsKK3VjaGFyOCBfX292bGQgX19jbmZuIG1pbih1Y2hhcjggeCwgdWNoYXIgeSk7CitjaGFyMTYgX19vdmxkIF9fY25mbiBtaW4oY2hhcjE2IHgsIGNoYXIgeSk7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gbWluKHVjaGFyMTYgeCwgdWNoYXIgeSk7CitzaG9ydCBfX292bGQgX19jbmZuIG1pbihzaG9ydCB4LCBzaG9ydCB5KTsKK3VzaG9ydCBfX292bGQgX19jbmZuIG1pbih1c2hvcnQgeCwgdXNob3J0IHkpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gbWluKHNob3J0MiB4LCBzaG9ydCB5KTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBtaW4odXNob3J0MiB4LCB1c2hvcnQgeSk7CitzaG9ydDMgX19vdmxkIF9fY25mbiBtaW4oc2hvcnQzIHgsIHNob3J0IHkpOwordXNob3J0MyBfX292bGQgX19jbmZuIG1pbih1c2hvcnQzIHgsIHVzaG9ydCB5KTsKK3Nob3J0NCBfX292bGQgX19jbmZuIG1pbihzaG9ydDQgeCwgc2hvcnQgeSk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gbWluKHVzaG9ydDQgeCwgdXNob3J0IHkpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gbWluKHNob3J0OCB4LCBzaG9ydCB5KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBtaW4odXNob3J0OCB4LCB1c2hvcnQgeSk7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gbWluKHNob3J0MTYgeCwgc2hvcnQgeSk7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIG1pbih1c2hvcnQxNiB4LCB1c2hvcnQgeSk7CitpbnQgX19vdmxkIF9fY25mbiBtaW4oaW50IHgsIGludCB5KTsKK3VpbnQgX19vdmxkIF9fY25mbiBtaW4odWludCB4LCB1aW50IHkpOworaW50MiBfX292bGQgX19jbmZuIG1pbihpbnQyIHgsIGludCB5KTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gbWluKHVpbnQyIHgsIHVpbnQgeSk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gbWluKGludDMgeCwgaW50IHkpOwordWludDMgX19vdmxkIF9fY25mbiBtaW4odWludDMgeCwgdWludCB5KTsKK2ludDQgX19vdmxkIF9fY25mbiBtaW4oaW50NCB4LCBpbnQgeSk7Cit1aW50NCBfX292bGQgX19jbmZuIG1pbih1aW50NCB4LCB1aW50IHkpOworaW50OCBfX292bGQgX19jbmZuIG1pbihpbnQ4IHgsIGludCB5KTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gbWluKHVpbnQ4IHgsIHVpbnQgeSk7CitpbnQxNiBfX292bGQgX19jbmZuIG1pbihpbnQxNiB4LCBpbnQgeSk7Cit1aW50MTYgX19vdmxkIF9fY25mbiBtaW4odWludDE2IHgsIHVpbnQgeSk7Citsb25nIF9fb3ZsZCBfX2NuZm4gbWluKGxvbmcgeCwgbG9uZyB5KTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gbWluKHVsb25nIHgsIHVsb25nIHkpOworbG9uZzIgX19vdmxkIF9fY25mbiBtaW4obG9uZzIgeCwgbG9uZyB5KTsKK3Vsb25nMiBfX292bGQgX19jbmZuIG1pbih1bG9uZzIgeCwgdWxvbmcgeSk7Citsb25nMyBfX292bGQgX19jbmZuIG1pbihsb25nMyB4LCBsb25nIHkpOwordWxvbmczIF9fb3ZsZCBfX2NuZm4gbWluKHVsb25nMyB4LCB1bG9uZyB5KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gbWluKGxvbmc0IHgsIGxvbmcgeSk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBtaW4odWxvbmc0IHgsIHVsb25nIHkpOworbG9uZzggX19vdmxkIF9fY25mbiBtaW4obG9uZzggeCwgbG9uZyB5KTsKK3Vsb25nOCBfX292bGQgX19jbmZuIG1pbih1bG9uZzggeCwgdWxvbmcgeSk7Citsb25nMTYgX19vdmxkIF9fY25mbiBtaW4obG9uZzE2IHgsIGxvbmcgeSk7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gbWluKHVsb25nMTYgeCwgdWxvbmcgeSk7CisKKy8qKgorICogQ29tcHV0ZXMgeCAqIHkgYW5kIHJldHVybnMgdGhlIGhpZ2ggaGFsZiBvZiB0aGUKKyAqIHByb2R1Y3Qgb2YgeCBhbmQgeS4KKyAqLworY2hhciBfX292bGQgX19jbmZuIG11bF9oaShjaGFyIHgsIGNoYXIgeSk7Cit1Y2hhciBfX292bGQgX19jbmZuIG11bF9oaSh1Y2hhciB4LCB1Y2hhciB5KTsKK2NoYXIyIF9fb3ZsZCBfX2NuZm4gbXVsX2hpKGNoYXIyIHgsIGNoYXIyIHkpOwordWNoYXIyIF9fb3ZsZCBfX2NuZm4gbXVsX2hpKHVjaGFyMiB4LCB1Y2hhcjIgeSk7CitjaGFyMyBfX292bGQgX19jbmZuIG11bF9oaShjaGFyMyB4LCBjaGFyMyB5KTsKK3VjaGFyMyBfX292bGQgX19jbmZuIG11bF9oaSh1Y2hhcjMgeCwgdWNoYXIzIHkpOworY2hhcjQgX19vdmxkIF9fY25mbiBtdWxfaGkoY2hhcjQgeCwgY2hhcjQgeSk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBtdWxfaGkodWNoYXI0IHgsIHVjaGFyNCB5KTsKK2NoYXI4IF9fb3ZsZCBfX2NuZm4gbXVsX2hpKGNoYXI4IHgsIGNoYXI4IHkpOwordWNoYXI4IF9fb3ZsZCBfX2NuZm4gbXVsX2hpKHVjaGFyOCB4LCB1Y2hhcjggeSk7CitjaGFyMTYgX19vdmxkIF9fY25mbiBtdWxfaGkoY2hhcjE2IHgsIGNoYXIxNiB5KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBtdWxfaGkodWNoYXIxNiB4LCB1Y2hhcjE2IHkpOworc2hvcnQgX19vdmxkIF9fY25mbiBtdWxfaGkoc2hvcnQgeCwgc2hvcnQgeSk7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBtdWxfaGkodXNob3J0IHgsIHVzaG9ydCB5KTsKK3Nob3J0MiBfX292bGQgX19jbmZuIG11bF9oaShzaG9ydDIgeCwgc2hvcnQyIHkpOwordXNob3J0MiBfX292bGQgX19jbmZuIG11bF9oaSh1c2hvcnQyIHgsIHVzaG9ydDIgeSk7CitzaG9ydDMgX19vdmxkIF9fY25mbiBtdWxfaGkoc2hvcnQzIHgsIHNob3J0MyB5KTsKK3VzaG9ydDMgX19vdmxkIF9fY25mbiBtdWxfaGkodXNob3J0MyB4LCB1c2hvcnQzIHkpOworc2hvcnQ0IF9fb3ZsZCBfX2NuZm4gbXVsX2hpKHNob3J0NCB4LCBzaG9ydDQgeSk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gbXVsX2hpKHVzaG9ydDQgeCwgdXNob3J0NCB5KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIG11bF9oaShzaG9ydDggeCwgc2hvcnQ4IHkpOwordXNob3J0OCBfX292bGQgX19jbmZuIG11bF9oaSh1c2hvcnQ4IHgsIHVzaG9ydDggeSk7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gbXVsX2hpKHNob3J0MTYgeCwgc2hvcnQxNiB5KTsKK3VzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gbXVsX2hpKHVzaG9ydDE2IHgsIHVzaG9ydDE2IHkpOworaW50IF9fb3ZsZCBfX2NuZm4gbXVsX2hpKGludCB4LCBpbnQgeSk7Cit1aW50IF9fb3ZsZCBfX2NuZm4gbXVsX2hpKHVpbnQgeCwgdWludCB5KTsKK2ludDIgX19vdmxkIF9fY25mbiBtdWxfaGkoaW50MiB4LCBpbnQyIHkpOwordWludDIgX19vdmxkIF9fY25mbiBtdWxfaGkodWludDIgeCwgdWludDIgeSk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gbXVsX2hpKGludDMgeCwgaW50MyB5KTsKK3VpbnQzIF9fb3ZsZCBfX2NuZm4gbXVsX2hpKHVpbnQzIHgsIHVpbnQzIHkpOworaW50NCBfX292bGQgX19jbmZuIG11bF9oaShpbnQ0IHgsIGludDQgeSk7Cit1aW50NCBfX292bGQgX19jbmZuIG11bF9oaSh1aW50NCB4LCB1aW50NCB5KTsKK2ludDggX19vdmxkIF9fY25mbiBtdWxfaGkoaW50OCB4LCBpbnQ4IHkpOwordWludDggX19vdmxkIF9fY25mbiBtdWxfaGkodWludDggeCwgdWludDggeSk7CitpbnQxNiBfX292bGQgX19jbmZuIG11bF9oaShpbnQxNiB4LCBpbnQxNiB5KTsKK3VpbnQxNiBfX292bGQgX19jbmZuIG11bF9oaSh1aW50MTYgeCwgdWludDE2IHkpOworbG9uZyBfX292bGQgX19jbmZuIG11bF9oaShsb25nIHgsIGxvbmcgeSk7Cit1bG9uZyBfX292bGQgX19jbmZuIG11bF9oaSh1bG9uZyB4LCB1bG9uZyB5KTsKK2xvbmcyIF9fb3ZsZCBfX2NuZm4gbXVsX2hpKGxvbmcyIHgsIGxvbmcyIHkpOwordWxvbmcyIF9fb3ZsZCBfX2NuZm4gbXVsX2hpKHVsb25nMiB4LCB1bG9uZzIgeSk7Citsb25nMyBfX292bGQgX19jbmZuIG11bF9oaShsb25nMyB4LCBsb25nMyB5KTsKK3Vsb25nMyBfX292bGQgX19jbmZuIG11bF9oaSh1bG9uZzMgeCwgdWxvbmczIHkpOworbG9uZzQgX19vdmxkIF9fY25mbiBtdWxfaGkobG9uZzQgeCwgbG9uZzQgeSk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBtdWxfaGkodWxvbmc0IHgsIHVsb25nNCB5KTsKK2xvbmc4IF9fb3ZsZCBfX2NuZm4gbXVsX2hpKGxvbmc4IHgsIGxvbmc4IHkpOwordWxvbmc4IF9fb3ZsZCBfX2NuZm4gbXVsX2hpKHVsb25nOCB4LCB1bG9uZzggeSk7Citsb25nMTYgX19vdmxkIF9fY25mbiBtdWxfaGkobG9uZzE2IHgsIGxvbmcxNiB5KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBtdWxfaGkodWxvbmcxNiB4LCB1bG9uZzE2IHkpOworCisvKioKKyAqIEZvciBlYWNoIGVsZW1lbnQgaW4gdiwgdGhlIGJpdHMgYXJlIHNoaWZ0ZWQgbGVmdCBieQorICogdGhlIG51bWJlciBvZiBiaXRzIGdpdmVuIGJ5IHRoZSBjb3JyZXNwb25kaW5nCisgKiBlbGVtZW50IGluIGkgKHN1YmplY3QgdG8gdXN1YWwgc2hpZnQgbW9kdWxvIHJ1bGVzCisgKiBkZXNjcmliZWQgaW4gc2VjdGlvbiA2LjMpLiBCaXRzIHNoaWZ0ZWQgb2ZmIHRoZSBsZWZ0CisgKiBzaWRlIG9mIHRoZSBlbGVtZW50IGFyZSBzaGlmdGVkIGJhY2sgaW4gZnJvbSB0aGUKKyAqIHJpZ2h0LgorICovCitjaGFyIF9fb3ZsZCBfX2NuZm4gcm90YXRlKGNoYXIgdiwgY2hhciBpKTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gcm90YXRlKHVjaGFyIHYsIHVjaGFyIGkpOworY2hhcjIgX19vdmxkIF9fY25mbiByb3RhdGUoY2hhcjIgdiwgY2hhcjIgaSk7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiByb3RhdGUodWNoYXIyIHYsIHVjaGFyMiBpKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gcm90YXRlKGNoYXIzIHYsIGNoYXIzIGkpOwordWNoYXIzIF9fb3ZsZCBfX2NuZm4gcm90YXRlKHVjaGFyMyB2LCB1Y2hhcjMgaSk7CitjaGFyNCBfX292bGQgX19jbmZuIHJvdGF0ZShjaGFyNCB2LCBjaGFyNCBpKTsKK3VjaGFyNCBfX292bGQgX19jbmZuIHJvdGF0ZSh1Y2hhcjQgdiwgdWNoYXI0IGkpOworY2hhcjggX19vdmxkIF9fY25mbiByb3RhdGUoY2hhcjggdiwgY2hhcjggaSk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiByb3RhdGUodWNoYXI4IHYsIHVjaGFyOCBpKTsKK2NoYXIxNiBfX292bGQgX19jbmZuIHJvdGF0ZShjaGFyMTYgdiwgY2hhcjE2IGkpOwordWNoYXIxNiBfX292bGQgX19jbmZuIHJvdGF0ZSh1Y2hhcjE2IHYsIHVjaGFyMTYgaSk7CitzaG9ydCBfX292bGQgX19jbmZuIHJvdGF0ZShzaG9ydCB2LCBzaG9ydCBpKTsKK3VzaG9ydCBfX292bGQgX19jbmZuIHJvdGF0ZSh1c2hvcnQgdiwgdXNob3J0IGkpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gcm90YXRlKHNob3J0MiB2LCBzaG9ydDIgaSk7Cit1c2hvcnQyIF9fb3ZsZCBfX2NuZm4gcm90YXRlKHVzaG9ydDIgdiwgdXNob3J0MiBpKTsKK3Nob3J0MyBfX292bGQgX19jbmZuIHJvdGF0ZShzaG9ydDMgdiwgc2hvcnQzIGkpOwordXNob3J0MyBfX292bGQgX19jbmZuIHJvdGF0ZSh1c2hvcnQzIHYsIHVzaG9ydDMgaSk7CitzaG9ydDQgX19vdmxkIF9fY25mbiByb3RhdGUoc2hvcnQ0IHYsIHNob3J0NCBpKTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiByb3RhdGUodXNob3J0NCB2LCB1c2hvcnQ0IGkpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gcm90YXRlKHNob3J0OCB2LCBzaG9ydDggaSk7Cit1c2hvcnQ4IF9fb3ZsZCBfX2NuZm4gcm90YXRlKHVzaG9ydDggdiwgdXNob3J0OCBpKTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiByb3RhdGUoc2hvcnQxNiB2LCBzaG9ydDE2IGkpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiByb3RhdGUodXNob3J0MTYgdiwgdXNob3J0MTYgaSk7CitpbnQgX19vdmxkIF9fY25mbiByb3RhdGUoaW50IHYsIGludCBpKTsKK3VpbnQgX19vdmxkIF9fY25mbiByb3RhdGUodWludCB2LCB1aW50IGkpOworaW50MiBfX292bGQgX19jbmZuIHJvdGF0ZShpbnQyIHYsIGludDIgaSk7Cit1aW50MiBfX292bGQgX19jbmZuIHJvdGF0ZSh1aW50MiB2LCB1aW50MiBpKTsKK2ludDMgX19vdmxkIF9fY25mbiByb3RhdGUoaW50MyB2LCBpbnQzIGkpOwordWludDMgX19vdmxkIF9fY25mbiByb3RhdGUodWludDMgdiwgdWludDMgaSk7CitpbnQ0IF9fb3ZsZCBfX2NuZm4gcm90YXRlKGludDQgdiwgaW50NCBpKTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gcm90YXRlKHVpbnQ0IHYsIHVpbnQ0IGkpOworaW50OCBfX292bGQgX19jbmZuIHJvdGF0ZShpbnQ4IHYsIGludDggaSk7Cit1aW50OCBfX292bGQgX19jbmZuIHJvdGF0ZSh1aW50OCB2LCB1aW50OCBpKTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gcm90YXRlKGludDE2IHYsIGludDE2IGkpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gcm90YXRlKHVpbnQxNiB2LCB1aW50MTYgaSk7Citsb25nIF9fb3ZsZCBfX2NuZm4gcm90YXRlKGxvbmcgdiwgbG9uZyBpKTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gcm90YXRlKHVsb25nIHYsIHVsb25nIGkpOworbG9uZzIgX19vdmxkIF9fY25mbiByb3RhdGUobG9uZzIgdiwgbG9uZzIgaSk7Cit1bG9uZzIgX19vdmxkIF9fY25mbiByb3RhdGUodWxvbmcyIHYsIHVsb25nMiBpKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gcm90YXRlKGxvbmczIHYsIGxvbmczIGkpOwordWxvbmczIF9fb3ZsZCBfX2NuZm4gcm90YXRlKHVsb25nMyB2LCB1bG9uZzMgaSk7Citsb25nNCBfX292bGQgX19jbmZuIHJvdGF0ZShsb25nNCB2LCBsb25nNCBpKTsKK3Vsb25nNCBfX292bGQgX19jbmZuIHJvdGF0ZSh1bG9uZzQgdiwgdWxvbmc0IGkpOworbG9uZzggX19vdmxkIF9fY25mbiByb3RhdGUobG9uZzggdiwgbG9uZzggaSk7Cit1bG9uZzggX19vdmxkIF9fY25mbiByb3RhdGUodWxvbmc4IHYsIHVsb25nOCBpKTsKK2xvbmcxNiBfX292bGQgX19jbmZuIHJvdGF0ZShsb25nMTYgdiwgbG9uZzE2IGkpOwordWxvbmcxNiBfX292bGQgX19jbmZuIHJvdGF0ZSh1bG9uZzE2IHYsIHVsb25nMTYgaSk7CisKKy8qKgorICogUmV0dXJucyB4IC0geSBhbmQgc2F0dXJhdGVzIHRoZSByZXN1bHQuCisgKi8KK2NoYXIgX19vdmxkIF9fY25mbiBzdWJfc2F0KGNoYXIgeCwgY2hhciB5KTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gc3ViX3NhdCh1Y2hhciB4LCB1Y2hhciB5KTsKK2NoYXIyIF9fb3ZsZCBfX2NuZm4gc3ViX3NhdChjaGFyMiB4LCBjaGFyMiB5KTsKK3VjaGFyMiBfX292bGQgX19jbmZuIHN1Yl9zYXQodWNoYXIyIHgsIHVjaGFyMiB5KTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gc3ViX3NhdChjaGFyMyB4LCBjaGFyMyB5KTsKK3VjaGFyMyBfX292bGQgX19jbmZuIHN1Yl9zYXQodWNoYXIzIHgsIHVjaGFyMyB5KTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gc3ViX3NhdChjaGFyNCB4LCBjaGFyNCB5KTsKK3VjaGFyNCBfX292bGQgX19jbmZuIHN1Yl9zYXQodWNoYXI0IHgsIHVjaGFyNCB5KTsKK2NoYXI4IF9fb3ZsZCBfX2NuZm4gc3ViX3NhdChjaGFyOCB4LCBjaGFyOCB5KTsKK3VjaGFyOCBfX292bGQgX19jbmZuIHN1Yl9zYXQodWNoYXI4IHgsIHVjaGFyOCB5KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIHN1Yl9zYXQoY2hhcjE2IHgsIGNoYXIxNiB5KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBzdWJfc2F0KHVjaGFyMTYgeCwgdWNoYXIxNiB5KTsKK3Nob3J0IF9fb3ZsZCBfX2NuZm4gc3ViX3NhdChzaG9ydCB4LCBzaG9ydCB5KTsKK3VzaG9ydCBfX292bGQgX19jbmZuIHN1Yl9zYXQodXNob3J0IHgsIHVzaG9ydCB5KTsKK3Nob3J0MiBfX292bGQgX19jbmZuIHN1Yl9zYXQoc2hvcnQyIHgsIHNob3J0MiB5KTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBzdWJfc2F0KHVzaG9ydDIgeCwgdXNob3J0MiB5KTsKK3Nob3J0MyBfX292bGQgX19jbmZuIHN1Yl9zYXQoc2hvcnQzIHgsIHNob3J0MyB5KTsKK3VzaG9ydDMgX19vdmxkIF9fY25mbiBzdWJfc2F0KHVzaG9ydDMgeCwgdXNob3J0MyB5KTsKK3Nob3J0NCBfX292bGQgX19jbmZuIHN1Yl9zYXQoc2hvcnQ0IHgsIHNob3J0NCB5KTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBzdWJfc2F0KHVzaG9ydDQgeCwgdXNob3J0NCB5KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIHN1Yl9zYXQoc2hvcnQ4IHgsIHNob3J0OCB5KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBzdWJfc2F0KHVzaG9ydDggeCwgdXNob3J0OCB5KTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBzdWJfc2F0KHNob3J0MTYgeCwgc2hvcnQxNiB5KTsKK3VzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gc3ViX3NhdCh1c2hvcnQxNiB4LCB1c2hvcnQxNiB5KTsKK2ludCBfX292bGQgX19jbmZuIHN1Yl9zYXQoaW50IHgsIGludCB5KTsKK3VpbnQgX19vdmxkIF9fY25mbiBzdWJfc2F0KHVpbnQgeCwgdWludCB5KTsKK2ludDIgX19vdmxkIF9fY25mbiBzdWJfc2F0KGludDIgeCwgaW50MiB5KTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gc3ViX3NhdCh1aW50MiB4LCB1aW50MiB5KTsKK2ludDMgX19vdmxkIF9fY25mbiBzdWJfc2F0KGludDMgeCwgaW50MyB5KTsKK3VpbnQzIF9fb3ZsZCBfX2NuZm4gc3ViX3NhdCh1aW50MyB4LCB1aW50MyB5KTsKK2ludDQgX19vdmxkIF9fY25mbiBzdWJfc2F0KGludDQgeCwgaW50NCB5KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gc3ViX3NhdCh1aW50NCB4LCB1aW50NCB5KTsKK2ludDggX19vdmxkIF9fY25mbiBzdWJfc2F0KGludDggeCwgaW50OCB5KTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gc3ViX3NhdCh1aW50OCB4LCB1aW50OCB5KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gc3ViX3NhdChpbnQxNiB4LCBpbnQxNiB5KTsKK3VpbnQxNiBfX292bGQgX19jbmZuIHN1Yl9zYXQodWludDE2IHgsIHVpbnQxNiB5KTsKK2xvbmcgX19vdmxkIF9fY25mbiBzdWJfc2F0KGxvbmcgeCwgbG9uZyB5KTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gc3ViX3NhdCh1bG9uZyB4LCB1bG9uZyB5KTsKK2xvbmcyIF9fb3ZsZCBfX2NuZm4gc3ViX3NhdChsb25nMiB4LCBsb25nMiB5KTsKK3Vsb25nMiBfX292bGQgX19jbmZuIHN1Yl9zYXQodWxvbmcyIHgsIHVsb25nMiB5KTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gc3ViX3NhdChsb25nMyB4LCBsb25nMyB5KTsKK3Vsb25nMyBfX292bGQgX19jbmZuIHN1Yl9zYXQodWxvbmczIHgsIHVsb25nMyB5KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gc3ViX3NhdChsb25nNCB4LCBsb25nNCB5KTsKK3Vsb25nNCBfX292bGQgX19jbmZuIHN1Yl9zYXQodWxvbmc0IHgsIHVsb25nNCB5KTsKK2xvbmc4IF9fb3ZsZCBfX2NuZm4gc3ViX3NhdChsb25nOCB4LCBsb25nOCB5KTsKK3Vsb25nOCBfX292bGQgX19jbmZuIHN1Yl9zYXQodWxvbmc4IHgsIHVsb25nOCB5KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIHN1Yl9zYXQobG9uZzE2IHgsIGxvbmcxNiB5KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBzdWJfc2F0KHVsb25nMTYgeCwgdWxvbmcxNiB5KTsKKworLyoqCisgKiByZXN1bHRbaV0gPSAoKHNob3J0KWhpW2ldIDw8IDgpIHwgbG9baV0KKyAqIHJlc3VsdFtpXSA9ICgodXNob3J0KWhpW2ldIDw8IDgpIHwgbG9baV0KKyAqLworc2hvcnQgX19vdmxkIF9fY25mbiB1cHNhbXBsZShjaGFyIGhpLCB1Y2hhciBsbyk7Cit1c2hvcnQgX19vdmxkIF9fY25mbiB1cHNhbXBsZSh1Y2hhciBoaSwgdWNoYXIgbG8pOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gdXBzYW1wbGUoY2hhcjIgaGksIHVjaGFyMiBsbyk7CitzaG9ydDMgX19vdmxkIF9fY25mbiB1cHNhbXBsZShjaGFyMyBoaSwgdWNoYXIzIGxvKTsKK3Nob3J0NCBfX292bGQgX19jbmZuIHVwc2FtcGxlKGNoYXI0IGhpLCB1Y2hhcjQgbG8pOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gdXBzYW1wbGUoY2hhcjggaGksIHVjaGFyOCBsbyk7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gdXBzYW1wbGUoY2hhcjE2IGhpLCB1Y2hhcjE2IGxvKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiB1cHNhbXBsZSh1Y2hhcjIgaGksIHVjaGFyMiBsbyk7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gdXBzYW1wbGUodWNoYXIzIGhpLCB1Y2hhcjMgbG8pOwordXNob3J0NCBfX292bGQgX19jbmZuIHVwc2FtcGxlKHVjaGFyNCBoaSwgdWNoYXI0IGxvKTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiB1cHNhbXBsZSh1Y2hhcjggaGksIHVjaGFyOCBsbyk7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIHVwc2FtcGxlKHVjaGFyMTYgaGksIHVjaGFyMTYgbG8pOworCisvKioKKyAqIHJlc3VsdFtpXSA9ICgoaW50KWhpW2ldIDw8IDE2KSB8IGxvW2ldCisgKiByZXN1bHRbaV0gPSAoKHVpbnQpaGlbaV0gPDwgMTYpIHwgbG9baV0KKyAqLworaW50IF9fb3ZsZCBfX2NuZm4gdXBzYW1wbGUoc2hvcnQgaGksIHVzaG9ydCBsbyk7Cit1aW50IF9fb3ZsZCBfX2NuZm4gdXBzYW1wbGUodXNob3J0IGhpLCB1c2hvcnQgbG8pOworaW50MiBfX292bGQgX19jbmZuIHVwc2FtcGxlKHNob3J0MiBoaSwgdXNob3J0MiBsbyk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gdXBzYW1wbGUoc2hvcnQzIGhpLCB1c2hvcnQzIGxvKTsKK2ludDQgX19vdmxkIF9fY25mbiB1cHNhbXBsZShzaG9ydDQgaGksIHVzaG9ydDQgbG8pOworaW50OCBfX292bGQgX19jbmZuIHVwc2FtcGxlKHNob3J0OCBoaSwgdXNob3J0OCBsbyk7CitpbnQxNiBfX292bGQgX19jbmZuIHVwc2FtcGxlKHNob3J0MTYgaGksIHVzaG9ydDE2IGxvKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gdXBzYW1wbGUodXNob3J0MiBoaSwgdXNob3J0MiBsbyk7Cit1aW50MyBfX292bGQgX19jbmZuIHVwc2FtcGxlKHVzaG9ydDMgaGksIHVzaG9ydDMgbG8pOwordWludDQgX19vdmxkIF9fY25mbiB1cHNhbXBsZSh1c2hvcnQ0IGhpLCB1c2hvcnQ0IGxvKTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gdXBzYW1wbGUodXNob3J0OCBoaSwgdXNob3J0OCBsbyk7Cit1aW50MTYgX19vdmxkIF9fY25mbiB1cHNhbXBsZSh1c2hvcnQxNiBoaSwgdXNob3J0MTYgbG8pOworLyoqCisgKiByZXN1bHRbaV0gPSAoKGxvbmcpaGlbaV0gPDwgMzIpIHwgbG9baV0KKyAqIHJlc3VsdFtpXSA9ICgodWxvbmcpaGlbaV0gPDwgMzIpIHwgbG9baV0KKyAqLworbG9uZyBfX292bGQgX19jbmZuIHVwc2FtcGxlKGludCBoaSwgdWludCBsbyk7Cit1bG9uZyBfX292bGQgX19jbmZuIHVwc2FtcGxlKHVpbnQgaGksIHVpbnQgbG8pOworbG9uZzIgX19vdmxkIF9fY25mbiB1cHNhbXBsZShpbnQyIGhpLCB1aW50MiBsbyk7Citsb25nMyBfX292bGQgX19jbmZuIHVwc2FtcGxlKGludDMgaGksIHVpbnQzIGxvKTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gdXBzYW1wbGUoaW50NCBoaSwgdWludDQgbG8pOworbG9uZzggX19vdmxkIF9fY25mbiB1cHNhbXBsZShpbnQ4IGhpLCB1aW50OCBsbyk7Citsb25nMTYgX19vdmxkIF9fY25mbiB1cHNhbXBsZShpbnQxNiBoaSwgdWludDE2IGxvKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIHVwc2FtcGxlKHVpbnQyIGhpLCB1aW50MiBsbyk7Cit1bG9uZzMgX19vdmxkIF9fY25mbiB1cHNhbXBsZSh1aW50MyBoaSwgdWludDMgbG8pOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gdXBzYW1wbGUodWludDQgaGksIHVpbnQ0IGxvKTsKK3Vsb25nOCBfX292bGQgX19jbmZuIHVwc2FtcGxlKHVpbnQ4IGhpLCB1aW50OCBsbyk7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gdXBzYW1wbGUodWludDE2IGhpLCB1aW50MTYgbG8pOworCisvKgorICogcG9wY291bnQoeCk6IHJldHVybnMgdGhlIG51bWJlciBvZiBzZXQgYml0IGluIHgKKyAqLworY2hhciBfX292bGQgX19jbmZuIHBvcGNvdW50KGNoYXIgeCk7Cit1Y2hhciBfX292bGQgX19jbmZuIHBvcGNvdW50KHVjaGFyIHgpOworY2hhcjIgX19vdmxkIF9fY25mbiBwb3Bjb3VudChjaGFyMiB4KTsKK3VjaGFyMiBfX292bGQgX19jbmZuIHBvcGNvdW50KHVjaGFyMiB4KTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gcG9wY291bnQoY2hhcjMgeCk7Cit1Y2hhcjMgX19vdmxkIF9fY25mbiBwb3Bjb3VudCh1Y2hhcjMgeCk7CitjaGFyNCBfX292bGQgX19jbmZuIHBvcGNvdW50KGNoYXI0IHgpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gcG9wY291bnQodWNoYXI0IHgpOworY2hhcjggX19vdmxkIF9fY25mbiBwb3Bjb3VudChjaGFyOCB4KTsKK3VjaGFyOCBfX292bGQgX19jbmZuIHBvcGNvdW50KHVjaGFyOCB4KTsKK2NoYXIxNiBfX292bGQgX19jbmZuIHBvcGNvdW50KGNoYXIxNiB4KTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBwb3Bjb3VudCh1Y2hhcjE2IHgpOworc2hvcnQgX19vdmxkIF9fY25mbiBwb3Bjb3VudChzaG9ydCB4KTsKK3VzaG9ydCBfX292bGQgX19jbmZuIHBvcGNvdW50KHVzaG9ydCB4KTsKK3Nob3J0MiBfX292bGQgX19jbmZuIHBvcGNvdW50KHNob3J0MiB4KTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBwb3Bjb3VudCh1c2hvcnQyIHgpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gcG9wY291bnQoc2hvcnQzIHgpOwordXNob3J0MyBfX292bGQgX19jbmZuIHBvcGNvdW50KHVzaG9ydDMgeCk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBwb3Bjb3VudChzaG9ydDQgeCk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gcG9wY291bnQodXNob3J0NCB4KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIHBvcGNvdW50KHNob3J0OCB4KTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBwb3Bjb3VudCh1c2hvcnQ4IHgpOworc2hvcnQxNiBfX292bGQgX19jbmZuIHBvcGNvdW50KHNob3J0MTYgeCk7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIHBvcGNvdW50KHVzaG9ydDE2IHgpOworaW50IF9fb3ZsZCBfX2NuZm4gcG9wY291bnQoaW50IHgpOwordWludCBfX292bGQgX19jbmZuIHBvcGNvdW50KHVpbnQgeCk7CitpbnQyIF9fb3ZsZCBfX2NuZm4gcG9wY291bnQoaW50MiB4KTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gcG9wY291bnQodWludDIgeCk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gcG9wY291bnQoaW50MyB4KTsKK3VpbnQzIF9fb3ZsZCBfX2NuZm4gcG9wY291bnQodWludDMgeCk7CitpbnQ0IF9fb3ZsZCBfX2NuZm4gcG9wY291bnQoaW50NCB4KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gcG9wY291bnQodWludDQgeCk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gcG9wY291bnQoaW50OCB4KTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gcG9wY291bnQodWludDggeCk7CitpbnQxNiBfX292bGQgX19jbmZuIHBvcGNvdW50KGludDE2IHgpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gcG9wY291bnQodWludDE2IHgpOworbG9uZyBfX292bGQgX19jbmZuIHBvcGNvdW50KGxvbmcgeCk7Cit1bG9uZyBfX292bGQgX19jbmZuIHBvcGNvdW50KHVsb25nIHgpOworbG9uZzIgX19vdmxkIF9fY25mbiBwb3Bjb3VudChsb25nMiB4KTsKK3Vsb25nMiBfX292bGQgX19jbmZuIHBvcGNvdW50KHVsb25nMiB4KTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gcG9wY291bnQobG9uZzMgeCk7Cit1bG9uZzMgX19vdmxkIF9fY25mbiBwb3Bjb3VudCh1bG9uZzMgeCk7Citsb25nNCBfX292bGQgX19jbmZuIHBvcGNvdW50KGxvbmc0IHgpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gcG9wY291bnQodWxvbmc0IHgpOworbG9uZzggX19vdmxkIF9fY25mbiBwb3Bjb3VudChsb25nOCB4KTsKK3Vsb25nOCBfX292bGQgX19jbmZuIHBvcGNvdW50KHVsb25nOCB4KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIHBvcGNvdW50KGxvbmcxNiB4KTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBwb3Bjb3VudCh1bG9uZzE2IHgpOworCisvKioKKyAqIE11bHRpcGx5IHR3byAyNC1iaXQgaW50ZWdlciB2YWx1ZXMgeCBhbmQgeSBhbmQgYWRkCisgKiB0aGUgMzItYml0IGludGVnZXIgcmVzdWx0IHRvIHRoZSAzMi1iaXQgaW50ZWdlciB6LgorICogUmVmZXIgdG8gZGVmaW5pdGlvbiBvZiBtdWwyNCB0byBzZWUgaG93IHRoZSAyNC1iaXQKKyAqIGludGVnZXIgbXVsdGlwbGljYXRpb24gaXMgcGVyZm9ybWVkLgorICovCitpbnQgX19vdmxkIF9fY25mbiBtYWQyNChpbnQgeCwgaW50IHksIGludCB6KTsKK3VpbnQgX19vdmxkIF9fY25mbiBtYWQyNCh1aW50IHgsIHVpbnQgeSwgdWludCB6KTsKK2ludDIgX19vdmxkIF9fY25mbiBtYWQyNChpbnQyIHgsIGludDIgeSwgaW50MiB6KTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gbWFkMjQodWludDIgeCwgdWludDIgeSwgdWludDIgeik7CitpbnQzIF9fb3ZsZCBfX2NuZm4gbWFkMjQoaW50MyB4LCBpbnQzIHksIGludDMgeik7Cit1aW50MyBfX292bGQgX19jbmZuIG1hZDI0KHVpbnQzIHgsIHVpbnQzIHksIHVpbnQzIHopOworaW50NCBfX292bGQgX19jbmZuIG1hZDI0KGludDQgeCwgaW50NCB5LCBpbnQ0IHopOwordWludDQgX19vdmxkIF9fY25mbiBtYWQyNCh1aW50NCB4LCB1aW50NCB5LCB1aW50NCB6KTsKK2ludDggX19vdmxkIF9fY25mbiBtYWQyNChpbnQ4IHgsIGludDggeSwgaW50OCB6KTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gbWFkMjQodWludDggeCwgdWludDggeSwgdWludDggeik7CitpbnQxNiBfX292bGQgX19jbmZuIG1hZDI0KGludDE2IHgsIGludDE2IHksIGludDE2IHopOwordWludDE2IF9fb3ZsZCBfX2NuZm4gbWFkMjQodWludDE2IHgsIHVpbnQxNiB5LCB1aW50MTYgeik7CisKKy8qKgorICogTXVsdGlwbHkgdHdvIDI0LWJpdCBpbnRlZ2VyIHZhbHVlcyB4IGFuZCB5LiB4IGFuZCB5CisgKiBhcmUgMzItYml0IGludGVnZXJzIGJ1dCBvbmx5IHRoZSBsb3cgMjQtYml0cyBhcmUgdXNlZAorICogdG8gcGVyZm9ybSB0aGUgbXVsdGlwbGljYXRpb24uIG11bDI0IHNob3VsZCBvbmx5CisgKiBiZSB1c2VkIHdoZW4gdmFsdWVzIGluIHggYW5kIHkgYXJlIGluIHRoZSByYW5nZSBbLQorICogMl4yMywgMl4yMy0xXSBpZiB4IGFuZCB5IGFyZSBzaWduZWQgaW50ZWdlcnMgYW5kIGluIHRoZQorICogcmFuZ2UgWzAsIDJeMjQtMV0gaWYgeCBhbmQgeSBhcmUgdW5zaWduZWQgaW50ZWdlcnMuIElmCisgKiB4IGFuZCB5IGFyZSBub3QgaW4gdGhpcyByYW5nZSwgdGhlIG11bHRpcGxpY2F0aW9uCisgKiByZXN1bHQgaXMgaW1wbGVtZW50YXRpb24tZGVmaW5lZC4KKyAqLworaW50IF9fb3ZsZCBfX2NuZm4gbXVsMjQoaW50IHgsIGludCB5KTsKK3VpbnQgX19vdmxkIF9fY25mbiBtdWwyNCh1aW50IHgsIHVpbnQgeSk7CitpbnQyIF9fb3ZsZCBfX2NuZm4gbXVsMjQoaW50MiB4LCBpbnQyIHkpOwordWludDIgX19vdmxkIF9fY25mbiBtdWwyNCh1aW50MiB4LCB1aW50MiB5KTsKK2ludDMgX19vdmxkIF9fY25mbiBtdWwyNChpbnQzIHgsIGludDMgeSk7Cit1aW50MyBfX292bGQgX19jbmZuIG11bDI0KHVpbnQzIHgsIHVpbnQzIHkpOworaW50NCBfX292bGQgX19jbmZuIG11bDI0KGludDQgeCwgaW50NCB5KTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gbXVsMjQodWludDQgeCwgdWludDQgeSk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gbXVsMjQoaW50OCB4LCBpbnQ4IHkpOwordWludDggX19vdmxkIF9fY25mbiBtdWwyNCh1aW50OCB4LCB1aW50OCB5KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gbXVsMjQoaW50MTYgeCwgaW50MTYgeSk7Cit1aW50MTYgX19vdmxkIF9fY25mbiBtdWwyNCh1aW50MTYgeCwgdWludDE2IHkpOworCisvLyBPcGVuQ0wgdjEuMSBzNi4xMS40LCB2MS4yIHM2LjEyLjQsIHYyLjAgczYuMTMuNCAtIENvbW1vbiBGdW5jdGlvbnMKKworLyoqCisgKiBSZXR1cm5zIGZtaW4oZm1heCh4LCBtaW52YWwpLCBtYXh2YWwpLgorICogUmVzdWx0cyBhcmUgdW5kZWZpbmVkIGlmIG1pbnZhbCA+IG1heHZhbC4KKyAqLworZmxvYXQgX19vdmxkIF9fY25mbiBjbGFtcChmbG9hdCB4LCBmbG9hdCBtaW52YWwsIGZsb2F0IG1heHZhbCk7CitmbG9hdDIgX19vdmxkIF9fY25mbiBjbGFtcChmbG9hdDIgeCwgZmxvYXQyIG1pbnZhbCwgZmxvYXQyIG1heHZhbCk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBjbGFtcChmbG9hdDMgeCwgZmxvYXQzIG1pbnZhbCwgZmxvYXQzIG1heHZhbCk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBjbGFtcChmbG9hdDQgeCwgZmxvYXQ0IG1pbnZhbCwgZmxvYXQ0IG1heHZhbCk7CitmbG9hdDggX19vdmxkIF9fY25mbiBjbGFtcChmbG9hdDggeCwgZmxvYXQ4IG1pbnZhbCwgZmxvYXQ4IG1heHZhbCk7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gY2xhbXAoZmxvYXQxNiB4LCBmbG9hdDE2IG1pbnZhbCwgZmxvYXQxNiBtYXh2YWwpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gY2xhbXAoZmxvYXQyIHgsIGZsb2F0IG1pbnZhbCwgZmxvYXQgbWF4dmFsKTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIGNsYW1wKGZsb2F0MyB4LCBmbG9hdCBtaW52YWwsIGZsb2F0IG1heHZhbCk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBjbGFtcChmbG9hdDQgeCwgZmxvYXQgbWludmFsLCBmbG9hdCBtYXh2YWwpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gY2xhbXAoZmxvYXQ4IHgsIGZsb2F0IG1pbnZhbCwgZmxvYXQgbWF4dmFsKTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBjbGFtcChmbG9hdDE2IHgsIGZsb2F0IG1pbnZhbCwgZmxvYXQgbWF4dmFsKTsKKyNpZmRlZiBjbF9raHJfZnA2NAorZG91YmxlIF9fb3ZsZCBfX2NuZm4gY2xhbXAoZG91YmxlIHgsIGRvdWJsZSBtaW52YWwsIGRvdWJsZSBtYXh2YWwpOworZG91YmxlMiBfX292bGQgX19jbmZuIGNsYW1wKGRvdWJsZTIgeCwgZG91YmxlMiBtaW52YWwsIGRvdWJsZTIgbWF4dmFsKTsKK2RvdWJsZTMgX19vdmxkIF9fY25mbiBjbGFtcChkb3VibGUzIHgsIGRvdWJsZTMgbWludmFsLCBkb3VibGUzIG1heHZhbCk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gY2xhbXAoZG91YmxlNCB4LCBkb3VibGU0IG1pbnZhbCwgZG91YmxlNCBtYXh2YWwpOworZG91YmxlOCBfX292bGQgX19jbmZuIGNsYW1wKGRvdWJsZTggeCwgZG91YmxlOCBtaW52YWwsIGRvdWJsZTggbWF4dmFsKTsKK2RvdWJsZTE2IF9fb3ZsZCBfX2NuZm4gY2xhbXAoZG91YmxlMTYgeCwgZG91YmxlMTYgbWludmFsLCBkb3VibGUxNiBtYXh2YWwpOworZG91YmxlMiBfX292bGQgX19jbmZuIGNsYW1wKGRvdWJsZTIgeCwgZG91YmxlIG1pbnZhbCwgZG91YmxlIG1heHZhbCk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gY2xhbXAoZG91YmxlMyB4LCBkb3VibGUgbWludmFsLCBkb3VibGUgbWF4dmFsKTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBjbGFtcChkb3VibGU0IHgsIGRvdWJsZSBtaW52YWwsIGRvdWJsZSBtYXh2YWwpOworZG91YmxlOCBfX292bGQgX19jbmZuIGNsYW1wKGRvdWJsZTggeCwgZG91YmxlIG1pbnZhbCwgZG91YmxlIG1heHZhbCk7Citkb3VibGUxNiBfX292bGQgX19jbmZuIGNsYW1wKGRvdWJsZTE2IHgsIGRvdWJsZSBtaW52YWwsIGRvdWJsZSBtYXh2YWwpOworI2VuZGlmIC8vY2xfa2hyX2ZwNjQKKyNpZmRlZiBjbF9raHJfZnAxNgoraGFsZiBfX292bGQgX19jbmZuIGNsYW1wKGhhbGYgeCwgaGFsZiBtaW52YWwsIGhhbGYgbWF4dmFsKTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gY2xhbXAoaGFsZjIgeCwgaGFsZjIgbWludmFsLCBoYWxmMiBtYXh2YWwpOworaGFsZjMgX19vdmxkIF9fY25mbiBjbGFtcChoYWxmMyB4LCBoYWxmMyBtaW52YWwsIGhhbGYzIG1heHZhbCk7CitoYWxmNCBfX292bGQgX19jbmZuIGNsYW1wKGhhbGY0IHgsIGhhbGY0IG1pbnZhbCwgaGFsZjQgbWF4dmFsKTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gY2xhbXAoaGFsZjggeCwgaGFsZjggbWludmFsLCBoYWxmOCBtYXh2YWwpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gY2xhbXAoaGFsZjE2IHgsIGhhbGYxNiBtaW52YWwsIGhhbGYxNiBtYXh2YWwpOworaGFsZjIgX19vdmxkIF9fY25mbiBjbGFtcChoYWxmMiB4LCBoYWxmIG1pbnZhbCwgaGFsZiBtYXh2YWwpOworaGFsZjMgX19vdmxkIF9fY25mbiBjbGFtcChoYWxmMyB4LCBoYWxmIG1pbnZhbCwgaGFsZiBtYXh2YWwpOworaGFsZjQgX19vdmxkIF9fY25mbiBjbGFtcChoYWxmNCB4LCBoYWxmIG1pbnZhbCwgaGFsZiBtYXh2YWwpOworaGFsZjggX19vdmxkIF9fY25mbiBjbGFtcChoYWxmOCB4LCBoYWxmIG1pbnZhbCwgaGFsZiBtYXh2YWwpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gY2xhbXAoaGFsZjE2IHgsIGhhbGYgbWludmFsLCBoYWxmIG1heHZhbCk7CisjZW5kaWYgLy9jbF9raHJfZnAxNgorCisvKioKKyAqIENvbnZlcnRzIHJhZGlhbnMgdG8gZGVncmVlcywgaS5lLiAoMTgwIC8gUEkpICoKKyAqIHJhZGlhbnMuCisgKi8KK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gZGVncmVlcyhmbG9hdCByYWRpYW5zKTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIGRlZ3JlZXMoZmxvYXQyIHJhZGlhbnMpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gZGVncmVlcyhmbG9hdDMgcmFkaWFucyk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBkZWdyZWVzKGZsb2F0NCByYWRpYW5zKTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIGRlZ3JlZXMoZmxvYXQ4IHJhZGlhbnMpOworZmxvYXQxNiBfX292bGQgX19jbmZuIGRlZ3JlZXMoZmxvYXQxNiByYWRpYW5zKTsKKyNpZmRlZiBjbF9raHJfZnA2NAorZG91YmxlIF9fb3ZsZCBfX2NuZm4gZGVncmVlcyhkb3VibGUgcmFkaWFucyk7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gZGVncmVlcyhkb3VibGUyIHJhZGlhbnMpOworZG91YmxlMyBfX292bGQgX19jbmZuIGRlZ3JlZXMoZG91YmxlMyByYWRpYW5zKTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBkZWdyZWVzKGRvdWJsZTQgcmFkaWFucyk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gZGVncmVlcyhkb3VibGU4IHJhZGlhbnMpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBkZWdyZWVzKGRvdWJsZTE2IHJhZGlhbnMpOworI2VuZGlmIC8vY2xfa2hyX2ZwNjQKKyNpZmRlZiBjbF9raHJfZnAxNgoraGFsZiBfX292bGQgX19jbmZuIGRlZ3JlZXMoaGFsZiByYWRpYW5zKTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gZGVncmVlcyhoYWxmMiByYWRpYW5zKTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gZGVncmVlcyhoYWxmMyByYWRpYW5zKTsKK2hhbGY0IF9fb3ZsZCBfX2NuZm4gZGVncmVlcyhoYWxmNCByYWRpYW5zKTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gZGVncmVlcyhoYWxmOCByYWRpYW5zKTsKK2hhbGYxNiBfX292bGQgX19jbmZuIGRlZ3JlZXMoaGFsZjE2IHJhZGlhbnMpOworI2VuZGlmIC8vY2xfa2hyX2ZwMTYKKworLyoqCisgKiBSZXR1cm5zIHkgaWYgeCA8IHksIG90aGVyd2lzZSBpdCByZXR1cm5zIHguIElmIHggYW5kIHkKKyAqIGFyZSBpbmZpbml0ZSBvciBOYU4sIHRoZSByZXR1cm4gdmFsdWVzIGFyZSB1bmRlZmluZWQuCisgKi8KK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gbWF4KGZsb2F0IHgsIGZsb2F0IHkpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gbWF4KGZsb2F0MiB4LCBmbG9hdDIgeSk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBtYXgoZmxvYXQzIHgsIGZsb2F0MyB5KTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIG1heChmbG9hdDQgeCwgZmxvYXQ0IHkpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gbWF4KGZsb2F0OCB4LCBmbG9hdDggeSk7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gbWF4KGZsb2F0MTYgeCwgZmxvYXQxNiB5KTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIG1heChmbG9hdDIgeCwgZmxvYXQgeSk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBtYXgoZmxvYXQzIHgsIGZsb2F0IHkpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gbWF4KGZsb2F0NCB4LCBmbG9hdCB5KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIG1heChmbG9hdDggeCwgZmxvYXQgeSk7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gbWF4KGZsb2F0MTYgeCwgZmxvYXQgeSk7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2RvdWJsZSBfX292bGQgX19jbmZuIG1heChkb3VibGUgeCwgZG91YmxlIHkpOworZG91YmxlMiBfX292bGQgX19jbmZuIG1heChkb3VibGUyIHgsIGRvdWJsZTIgeSk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gbWF4KGRvdWJsZTMgeCwgZG91YmxlMyB5KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBtYXgoZG91YmxlNCB4LCBkb3VibGU0IHkpOworZG91YmxlOCBfX292bGQgX19jbmZuIG1heChkb3VibGU4IHgsIGRvdWJsZTggeSk7Citkb3VibGUxNiBfX292bGQgX19jbmZuIG1heChkb3VibGUxNiB4LCBkb3VibGUxNiB5KTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBtYXgoZG91YmxlMiB4LCBkb3VibGUgeSk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gbWF4KGRvdWJsZTMgeCwgZG91YmxlIHkpOworZG91YmxlNCBfX292bGQgX19jbmZuIG1heChkb3VibGU0IHgsIGRvdWJsZSB5KTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBtYXgoZG91YmxlOCB4LCBkb3VibGUgeSk7Citkb3VibGUxNiBfX292bGQgX19jbmZuIG1heChkb3VibGUxNiB4LCBkb3VibGUgeSk7CisjZW5kaWYgLy9jbF9raHJfZnA2NAorI2lmZGVmIGNsX2tocl9mcDE2CitoYWxmIF9fb3ZsZCBfX2NuZm4gbWF4KGhhbGYgeCwgaGFsZiB5KTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gbWF4KGhhbGYyIHgsIGhhbGYyIHkpOworaGFsZjMgX19vdmxkIF9fY25mbiBtYXgoaGFsZjMgeCwgaGFsZjMgeSk7CitoYWxmNCBfX292bGQgX19jbmZuIG1heChoYWxmNCB4LCBoYWxmNCB5KTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gbWF4KGhhbGY4IHgsIGhhbGY4IHkpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gbWF4KGhhbGYxNiB4LCBoYWxmMTYgeSk7CitoYWxmMiBfX292bGQgX19jbmZuIG1heChoYWxmMiB4LCBoYWxmIHkpOworaGFsZjMgX19vdmxkIF9fY25mbiBtYXgoaGFsZjMgeCwgaGFsZiB5KTsKK2hhbGY0IF9fb3ZsZCBfX2NuZm4gbWF4KGhhbGY0IHgsIGhhbGYgeSk7CitoYWxmOCBfX292bGQgX19jbmZuIG1heChoYWxmOCB4LCBoYWxmIHkpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gbWF4KGhhbGYxNiB4LCBoYWxmIHkpOworI2VuZGlmIC8vY2xfa2hyX2ZwMTYKKworLyoqCisgKiBSZXR1cm5zIHkgaWYgeSA8IHgsIG90aGVyd2lzZSBpdCByZXR1cm5zIHguIElmIHggYW5kIHkKKyAqIGFyZSBpbmZpbml0ZSBvciBOYU4sIHRoZSByZXR1cm4gdmFsdWVzIGFyZSB1bmRlZmluZWQuCisgKi8KK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gbWluKGZsb2F0IHgsIGZsb2F0IHkpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gbWluKGZsb2F0MiB4LCBmbG9hdDIgeSk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBtaW4oZmxvYXQzIHgsIGZsb2F0MyB5KTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIG1pbihmbG9hdDQgeCwgZmxvYXQ0IHkpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gbWluKGZsb2F0OCB4LCBmbG9hdDggeSk7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gbWluKGZsb2F0MTYgeCwgZmxvYXQxNiB5KTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIG1pbihmbG9hdDIgeCwgZmxvYXQgeSk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBtaW4oZmxvYXQzIHgsIGZsb2F0IHkpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gbWluKGZsb2F0NCB4LCBmbG9hdCB5KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIG1pbihmbG9hdDggeCwgZmxvYXQgeSk7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gbWluKGZsb2F0MTYgeCwgZmxvYXQgeSk7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2RvdWJsZSBfX292bGQgX19jbmZuIG1pbihkb3VibGUgeCwgZG91YmxlIHkpOworZG91YmxlMiBfX292bGQgX19jbmZuIG1pbihkb3VibGUyIHgsIGRvdWJsZTIgeSk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gbWluKGRvdWJsZTMgeCwgZG91YmxlMyB5KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBtaW4oZG91YmxlNCB4LCBkb3VibGU0IHkpOworZG91YmxlOCBfX292bGQgX19jbmZuIG1pbihkb3VibGU4IHgsIGRvdWJsZTggeSk7Citkb3VibGUxNiBfX292bGQgX19jbmZuIG1pbihkb3VibGUxNiB4LCBkb3VibGUxNiB5KTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBtaW4oZG91YmxlMiB4LCBkb3VibGUgeSk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gbWluKGRvdWJsZTMgeCwgZG91YmxlIHkpOworZG91YmxlNCBfX292bGQgX19jbmZuIG1pbihkb3VibGU0IHgsIGRvdWJsZSB5KTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBtaW4oZG91YmxlOCB4LCBkb3VibGUgeSk7Citkb3VibGUxNiBfX292bGQgX19jbmZuIG1pbihkb3VibGUxNiB4LCBkb3VibGUgeSk7CisjZW5kaWYgLy9jbF9raHJfZnA2NAorI2lmZGVmIGNsX2tocl9mcDE2CitoYWxmIF9fb3ZsZCBfX2NuZm4gbWluKGhhbGYgeCwgaGFsZiB5KTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gbWluKGhhbGYyIHgsIGhhbGYyIHkpOworaGFsZjMgX19vdmxkIF9fY25mbiBtaW4oaGFsZjMgeCwgaGFsZjMgeSk7CitoYWxmNCBfX292bGQgX19jbmZuIG1pbihoYWxmNCB4LCBoYWxmNCB5KTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gbWluKGhhbGY4IHgsIGhhbGY4IHkpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gbWluKGhhbGYxNiB4LCBoYWxmMTYgeSk7CitoYWxmMiBfX292bGQgX19jbmZuIG1pbihoYWxmMiB4LCBoYWxmIHkpOworaGFsZjMgX19vdmxkIF9fY25mbiBtaW4oaGFsZjMgeCwgaGFsZiB5KTsKK2hhbGY0IF9fb3ZsZCBfX2NuZm4gbWluKGhhbGY0IHgsIGhhbGYgeSk7CitoYWxmOCBfX292bGQgX19jbmZuIG1pbihoYWxmOCB4LCBoYWxmIHkpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gbWluKGhhbGYxNiB4LCBoYWxmIHkpOworI2VuZGlmIC8vY2xfa2hyX2ZwMTYKKworLyoqCisgKiBSZXR1cm5zIHRoZSBsaW5lYXIgYmxlbmQgb2YgeCAmIHkgaW1wbGVtZW50ZWQgYXM6CisgKiB4ICsgKHkgLSB4KSAqIGEKKyAqIGEgbXVzdCBiZSBhIHZhbHVlIGluIHRoZSByYW5nZSAwLjAgLi4uIDEuMC4gSWYgYSBpcyBub3QKKyAqIGluIHRoZSByYW5nZSAwLjAgLi4uIDEuMCwgdGhlIHJldHVybiB2YWx1ZXMgYXJlCisgKiB1bmRlZmluZWQuCisgKi8KK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gbWl4KGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IGEpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gbWl4KGZsb2F0MiB4LCBmbG9hdDIgeSwgZmxvYXQyIGEpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gbWl4KGZsb2F0MyB4LCBmbG9hdDMgeSwgZmxvYXQzIGEpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gbWl4KGZsb2F0NCB4LCBmbG9hdDQgeSwgZmxvYXQ0IGEpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gbWl4KGZsb2F0OCB4LCBmbG9hdDggeSwgZmxvYXQ4IGEpOworZmxvYXQxNiBfX292bGQgX19jbmZuIG1peChmbG9hdDE2IHgsIGZsb2F0MTYgeSwgZmxvYXQxNiBhKTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIG1peChmbG9hdDIgeCwgZmxvYXQyIHksIGZsb2F0IGEpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gbWl4KGZsb2F0MyB4LCBmbG9hdDMgeSwgZmxvYXQgYSk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBtaXgoZmxvYXQ0IHgsIGZsb2F0NCB5LCBmbG9hdCBhKTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIG1peChmbG9hdDggeCwgZmxvYXQ4IHksIGZsb2F0IGEpOworZmxvYXQxNiBfX292bGQgX19jbmZuIG1peChmbG9hdDE2IHgsIGZsb2F0MTYgeSwgZmxvYXQgYSk7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2RvdWJsZSBfX292bGQgX19jbmZuIG1peChkb3VibGUgeCwgZG91YmxlIHksIGRvdWJsZSBhKTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBtaXgoZG91YmxlMiB4LCBkb3VibGUyIHksIGRvdWJsZTIgYSk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gbWl4KGRvdWJsZTMgeCwgZG91YmxlMyB5LCBkb3VibGUzIGEpOworZG91YmxlNCBfX292bGQgX19jbmZuIG1peChkb3VibGU0IHgsIGRvdWJsZTQgeSwgZG91YmxlNCBhKTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBtaXgoZG91YmxlOCB4LCBkb3VibGU4IHksIGRvdWJsZTggYSk7Citkb3VibGUxNiBfX292bGQgX19jbmZuIG1peChkb3VibGUxNiB4LCBkb3VibGUxNiB5LCBkb3VibGUxNiBhKTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBtaXgoZG91YmxlMiB4LCBkb3VibGUyIHksIGRvdWJsZSBhKTsKK2RvdWJsZTMgX19vdmxkIF9fY25mbiBtaXgoZG91YmxlMyB4LCBkb3VibGUzIHksIGRvdWJsZSBhKTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBtaXgoZG91YmxlNCB4LCBkb3VibGU0IHksIGRvdWJsZSBhKTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBtaXgoZG91YmxlOCB4LCBkb3VibGU4IHksIGRvdWJsZSBhKTsKK2RvdWJsZTE2IF9fb3ZsZCBfX2NuZm4gbWl4KGRvdWJsZTE2IHgsIGRvdWJsZTE2IHksIGRvdWJsZSBhKTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2hhbGYgX19vdmxkIF9fY25mbiBtaXgoaGFsZiB4LCBoYWxmIHksIGhhbGYgYSk7CitoYWxmMiBfX292bGQgX19jbmZuIG1peChoYWxmMiB4LCBoYWxmMiB5LCBoYWxmMiBhKTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gbWl4KGhhbGYzIHgsIGhhbGYzIHksIGhhbGYzIGEpOworaGFsZjQgX19vdmxkIF9fY25mbiBtaXgoaGFsZjQgeCwgaGFsZjQgeSwgaGFsZjQgYSk7CitoYWxmOCBfX292bGQgX19jbmZuIG1peChoYWxmOCB4LCBoYWxmOCB5LCBoYWxmOCBhKTsKK2hhbGYxNiBfX292bGQgX19jbmZuIG1peChoYWxmMTYgeCwgaGFsZjE2IHksIGhhbGYxNiBhKTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gbWl4KGhhbGYyIHgsIGhhbGYyIHksIGhhbGYgYSk7CitoYWxmMyBfX292bGQgX19jbmZuIG1peChoYWxmMyB4LCBoYWxmMyB5LCBoYWxmIGEpOworaGFsZjQgX19vdmxkIF9fY25mbiBtaXgoaGFsZjQgeCwgaGFsZjQgeSwgaGFsZiBhKTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gbWl4KGhhbGY4IHgsIGhhbGY4IHksIGhhbGYgYSk7CitoYWxmMTYgX19vdmxkIF9fY25mbiBtaXgoaGFsZjE2IHgsIGhhbGYxNiB5LCBoYWxmIGEpOworI2VuZGlmIC8vY2xfa2hyX2ZwMTYKKworLyoqCisgKiBDb252ZXJ0cyBkZWdyZWVzIHRvIHJhZGlhbnMsIGkuZS4gKFBJIC8gMTgwKSAqCisgKiBkZWdyZWVzLgorICovCitmbG9hdCBfX292bGQgX19jbmZuIHJhZGlhbnMoZmxvYXQgZGVncmVlcyk7CitmbG9hdDIgX19vdmxkIF9fY25mbiByYWRpYW5zKGZsb2F0MiBkZWdyZWVzKTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIHJhZGlhbnMoZmxvYXQzIGRlZ3JlZXMpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gcmFkaWFucyhmbG9hdDQgZGVncmVlcyk7CitmbG9hdDggX19vdmxkIF9fY25mbiByYWRpYW5zKGZsb2F0OCBkZWdyZWVzKTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiByYWRpYW5zKGZsb2F0MTYgZGVncmVlcyk7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2RvdWJsZSBfX292bGQgX19jbmZuIHJhZGlhbnMoZG91YmxlIGRlZ3JlZXMpOworZG91YmxlMiBfX292bGQgX19jbmZuIHJhZGlhbnMoZG91YmxlMiBkZWdyZWVzKTsKK2RvdWJsZTMgX19vdmxkIF9fY25mbiByYWRpYW5zKGRvdWJsZTMgZGVncmVlcyk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gcmFkaWFucyhkb3VibGU0IGRlZ3JlZXMpOworZG91YmxlOCBfX292bGQgX19jbmZuIHJhZGlhbnMoZG91YmxlOCBkZWdyZWVzKTsKK2RvdWJsZTE2IF9fb3ZsZCBfX2NuZm4gcmFkaWFucyhkb3VibGUxNiBkZWdyZWVzKTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2hhbGYgX19vdmxkIF9fY25mbiByYWRpYW5zKGhhbGYgZGVncmVlcyk7CitoYWxmMiBfX292bGQgX19jbmZuIHJhZGlhbnMoaGFsZjIgZGVncmVlcyk7CitoYWxmMyBfX292bGQgX19jbmZuIHJhZGlhbnMoaGFsZjMgZGVncmVlcyk7CitoYWxmNCBfX292bGQgX19jbmZuIHJhZGlhbnMoaGFsZjQgZGVncmVlcyk7CitoYWxmOCBfX292bGQgX19jbmZuIHJhZGlhbnMoaGFsZjggZGVncmVlcyk7CitoYWxmMTYgX19vdmxkIF9fY25mbiByYWRpYW5zKGhhbGYxNiBkZWdyZWVzKTsKKyNlbmRpZiAvL2NsX2tocl9mcDE2CisKKy8qKgorICogUmV0dXJucyAwLjAgaWYgeCA8IGVkZ2UsIG90aGVyd2lzZSBpdCByZXR1cm5zIDEuMC4KKyAqLworZmxvYXQgX19vdmxkIF9fY25mbiBzdGVwKGZsb2F0IGVkZ2UsIGZsb2F0IHgpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gc3RlcChmbG9hdDIgZWRnZSwgZmxvYXQyIHgpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gc3RlcChmbG9hdDMgZWRnZSwgZmxvYXQzIHgpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gc3RlcChmbG9hdDQgZWRnZSwgZmxvYXQ0IHgpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gc3RlcChmbG9hdDggZWRnZSwgZmxvYXQ4IHgpOworZmxvYXQxNiBfX292bGQgX19jbmZuIHN0ZXAoZmxvYXQxNiBlZGdlLCBmbG9hdDE2IHgpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gc3RlcChmbG9hdCBlZGdlLCBmbG9hdDIgeCk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBzdGVwKGZsb2F0IGVkZ2UsIGZsb2F0MyB4KTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIHN0ZXAoZmxvYXQgZWRnZSwgZmxvYXQ0IHgpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gc3RlcChmbG9hdCBlZGdlLCBmbG9hdDggeCk7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gc3RlcChmbG9hdCBlZGdlLCBmbG9hdDE2IHgpOworI2lmZGVmIGNsX2tocl9mcDY0Citkb3VibGUgX19vdmxkIF9fY25mbiBzdGVwKGRvdWJsZSBlZGdlLCBkb3VibGUgeCk7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gc3RlcChkb3VibGUyIGVkZ2UsIGRvdWJsZTIgeCk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gc3RlcChkb3VibGUzIGVkZ2UsIGRvdWJsZTMgeCk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gc3RlcChkb3VibGU0IGVkZ2UsIGRvdWJsZTQgeCk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gc3RlcChkb3VibGU4IGVkZ2UsIGRvdWJsZTggeCk7Citkb3VibGUxNiBfX292bGQgX19jbmZuIHN0ZXAoZG91YmxlMTYgZWRnZSwgZG91YmxlMTYgeCk7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gc3RlcChkb3VibGUgZWRnZSwgZG91YmxlMiB4KTsKK2RvdWJsZTMgX19vdmxkIF9fY25mbiBzdGVwKGRvdWJsZSBlZGdlLCBkb3VibGUzIHgpOworZG91YmxlNCBfX292bGQgX19jbmZuIHN0ZXAoZG91YmxlIGVkZ2UsIGRvdWJsZTQgeCk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gc3RlcChkb3VibGUgZWRnZSwgZG91YmxlOCB4KTsKK2RvdWJsZTE2IF9fb3ZsZCBfX2NuZm4gc3RlcChkb3VibGUgZWRnZSwgZG91YmxlMTYgeCk7CisjZW5kaWYgLy9jbF9raHJfZnA2NAorI2lmZGVmIGNsX2tocl9mcDE2CitoYWxmIF9fb3ZsZCBfX2NuZm4gc3RlcChoYWxmIGVkZ2UsIGhhbGYgeCk7CitoYWxmMiBfX292bGQgX19jbmZuIHN0ZXAoaGFsZjIgZWRnZSwgaGFsZjIgeCk7CitoYWxmMyBfX292bGQgX19jbmZuIHN0ZXAoaGFsZjMgZWRnZSwgaGFsZjMgeCk7CitoYWxmNCBfX292bGQgX19jbmZuIHN0ZXAoaGFsZjQgZWRnZSwgaGFsZjQgeCk7CitoYWxmOCBfX292bGQgX19jbmZuIHN0ZXAoaGFsZjggZWRnZSwgaGFsZjggeCk7CitoYWxmMTYgX19vdmxkIF9fY25mbiBzdGVwKGhhbGYxNiBlZGdlLCBoYWxmMTYgeCk7CitoYWxmIF9fb3ZsZCBfX2NuZm4gc3RlcChoYWxmIGVkZ2UsIGhhbGYgeCk7CitoYWxmMiBfX292bGQgX19jbmZuIHN0ZXAoaGFsZiBlZGdlLCBoYWxmMiB4KTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gc3RlcChoYWxmIGVkZ2UsIGhhbGYzIHgpOworaGFsZjQgX19vdmxkIF9fY25mbiBzdGVwKGhhbGYgZWRnZSwgaGFsZjQgeCk7CitoYWxmOCBfX292bGQgX19jbmZuIHN0ZXAoaGFsZiBlZGdlLCBoYWxmOCB4KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIHN0ZXAoaGFsZiBlZGdlLCBoYWxmMTYgeCk7CisjZW5kaWYgLy9jbF9raHJfZnAxNgorCisvKioKKyAqIFJldHVybnMgMC4wIGlmIHggPD0gZWRnZTAgYW5kIDEuMCBpZiB4ID49IGVkZ2UxIGFuZAorICogcGVyZm9ybXMgc21vb3RoIEhlcm1pdGUgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIDAKKyAqIGFuZCAxd2hlbiBlZGdlMCA8IHggPCBlZGdlMS4gVGhpcyBpcyB1c2VmdWwgaW4KKyAqIGNhc2VzIHdoZXJlIHlvdSB3b3VsZCB3YW50IGEgdGhyZXNob2xkIGZ1bmN0aW9uCisgKiB3aXRoIGEgc21vb3RoIHRyYW5zaXRpb24uCisgKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG86CisgKiBnZW50eXBlIHQ7CisgKiB0ID0gY2xhbXAgKCh4IC0gZWRnZTApIC8gKGVkZ2UxIC0gZWRnZTApLCAwLCAxKTsKKyAqIHJldHVybiB0ICogdCAqICgzIC0gMiAqIHQpOworICogUmVzdWx0cyBhcmUgdW5kZWZpbmVkIGlmIGVkZ2UwID49IGVkZ2UxIG9yIGlmIHgsCisgKiBlZGdlMCBvciBlZGdlMSBpcyBhIE5hTi4KKyAqLworZmxvYXQgX19vdmxkIF9fY25mbiBzbW9vdGhzdGVwKGZsb2F0IGVkZ2UwLCBmbG9hdCBlZGdlMSwgZmxvYXQgeCk7CitmbG9hdDIgX19vdmxkIF9fY25mbiBzbW9vdGhzdGVwKGZsb2F0MiBlZGdlMCwgZmxvYXQyIGVkZ2UxLCBmbG9hdDIgeCk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBzbW9vdGhzdGVwKGZsb2F0MyBlZGdlMCwgZmxvYXQzIGVkZ2UxLCBmbG9hdDMgeCk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBzbW9vdGhzdGVwKGZsb2F0NCBlZGdlMCwgZmxvYXQ0IGVkZ2UxLCBmbG9hdDQgeCk7CitmbG9hdDggX19vdmxkIF9fY25mbiBzbW9vdGhzdGVwKGZsb2F0OCBlZGdlMCwgZmxvYXQ4IGVkZ2UxLCBmbG9hdDggeCk7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gc21vb3Roc3RlcChmbG9hdDE2IGVkZ2UwLCBmbG9hdDE2IGVkZ2UxLCBmbG9hdDE2IHgpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gc21vb3Roc3RlcChmbG9hdCBlZGdlMCwgZmxvYXQgZWRnZTEsIGZsb2F0MiB4KTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIHNtb290aHN0ZXAoZmxvYXQgZWRnZTAsIGZsb2F0IGVkZ2UxLCBmbG9hdDMgeCk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBzbW9vdGhzdGVwKGZsb2F0IGVkZ2UwLCBmbG9hdCBlZGdlMSwgZmxvYXQ0IHgpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gc21vb3Roc3RlcChmbG9hdCBlZGdlMCwgZmxvYXQgZWRnZTEsIGZsb2F0OCB4KTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBzbW9vdGhzdGVwKGZsb2F0IGVkZ2UwLCBmbG9hdCBlZGdlMSwgZmxvYXQxNiB4KTsKKyNpZmRlZiBjbF9raHJfZnA2NAorZG91YmxlIF9fb3ZsZCBfX2NuZm4gc21vb3Roc3RlcChkb3VibGUgZWRnZTAsIGRvdWJsZSBlZGdlMSwgZG91YmxlIHgpOworZG91YmxlMiBfX292bGQgX19jbmZuIHNtb290aHN0ZXAoZG91YmxlMiBlZGdlMCwgZG91YmxlMiBlZGdlMSwgZG91YmxlMiB4KTsKK2RvdWJsZTMgX19vdmxkIF9fY25mbiBzbW9vdGhzdGVwKGRvdWJsZTMgZWRnZTAsIGRvdWJsZTMgZWRnZTEsIGRvdWJsZTMgeCk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gc21vb3Roc3RlcChkb3VibGU0IGVkZ2UwLCBkb3VibGU0IGVkZ2UxLCBkb3VibGU0IHgpOworZG91YmxlOCBfX292bGQgX19jbmZuIHNtb290aHN0ZXAoZG91YmxlOCBlZGdlMCwgZG91YmxlOCBlZGdlMSwgZG91YmxlOCB4KTsKK2RvdWJsZTE2IF9fb3ZsZCBfX2NuZm4gc21vb3Roc3RlcChkb3VibGUxNiBlZGdlMCwgZG91YmxlMTYgZWRnZTEsIGRvdWJsZTE2IHgpOworZG91YmxlMiBfX292bGQgX19jbmZuIHNtb290aHN0ZXAoZG91YmxlIGVkZ2UwLCBkb3VibGUgZWRnZTEsIGRvdWJsZTIgeCk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gc21vb3Roc3RlcChkb3VibGUgZWRnZTAsIGRvdWJsZSBlZGdlMSwgZG91YmxlMyB4KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBzbW9vdGhzdGVwKGRvdWJsZSBlZGdlMCwgZG91YmxlIGVkZ2UxLCBkb3VibGU0IHgpOworZG91YmxlOCBfX292bGQgX19jbmZuIHNtb290aHN0ZXAoZG91YmxlIGVkZ2UwLCBkb3VibGUgZWRnZTEsIGRvdWJsZTggeCk7Citkb3VibGUxNiBfX292bGQgX19jbmZuIHNtb290aHN0ZXAoZG91YmxlIGVkZ2UwLCBkb3VibGUgZWRnZTEsIGRvdWJsZTE2IHgpOworI2VuZGlmIC8vY2xfa2hyX2ZwNjQKKyNpZmRlZiBjbF9raHJfZnAxNgoraGFsZiBfX292bGQgX19jbmZuIHNtb290aHN0ZXAoaGFsZiBlZGdlMCwgaGFsZiBlZGdlMSwgaGFsZiB4KTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gc21vb3Roc3RlcChoYWxmMiBlZGdlMCwgaGFsZjIgZWRnZTEsIGhhbGYyIHgpOworaGFsZjMgX19vdmxkIF9fY25mbiBzbW9vdGhzdGVwKGhhbGYzIGVkZ2UwLCBoYWxmMyBlZGdlMSwgaGFsZjMgeCk7CitoYWxmNCBfX292bGQgX19jbmZuIHNtb290aHN0ZXAoaGFsZjQgZWRnZTAsIGhhbGY0IGVkZ2UxLCBoYWxmNCB4KTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gc21vb3Roc3RlcChoYWxmOCBlZGdlMCwgaGFsZjggZWRnZTEsIGhhbGY4IHgpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gc21vb3Roc3RlcChoYWxmMTYgZWRnZTAsIGhhbGYxNiBlZGdlMSwgaGFsZjE2IHgpOworaGFsZiBfX292bGQgX19jbmZuIHNtb290aHN0ZXAoaGFsZiBlZGdlMCwgaGFsZiBlZGdlMSwgaGFsZiB4KTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gc21vb3Roc3RlcChoYWxmIGVkZ2UwLCBoYWxmIGVkZ2UxLCBoYWxmMiB4KTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gc21vb3Roc3RlcChoYWxmIGVkZ2UwLCBoYWxmIGVkZ2UxLCBoYWxmMyB4KTsKK2hhbGY0IF9fb3ZsZCBfX2NuZm4gc21vb3Roc3RlcChoYWxmIGVkZ2UwLCBoYWxmIGVkZ2UxLCBoYWxmNCB4KTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gc21vb3Roc3RlcChoYWxmIGVkZ2UwLCBoYWxmIGVkZ2UxLCBoYWxmOCB4KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIHNtb290aHN0ZXAoaGFsZiBlZGdlMCwgaGFsZiBlZGdlMSwgaGFsZjE2IHgpOworI2VuZGlmIC8vY2xfa2hyX2ZwMTYKKworLyoqCisgKiBSZXR1cm5zIDEuMCBpZiB4ID4gMCwgLTAuMCBpZiB4ID0gLTAuMCwgKzAuMCBpZiB4ID0KKyAqICswLjAsIG9yIC0xLjAgaWYgeCA8IDAuIFJldHVybnMgMC4wIGlmIHggaXMgYSBOYU4uCisgKi8KK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gc2lnbihmbG9hdCB4KTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIHNpZ24oZmxvYXQyIHgpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gc2lnbihmbG9hdDMgeCk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBzaWduKGZsb2F0NCB4KTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIHNpZ24oZmxvYXQ4IHgpOworZmxvYXQxNiBfX292bGQgX19jbmZuIHNpZ24oZmxvYXQxNiB4KTsKKyNpZmRlZiBjbF9raHJfZnA2NAorZG91YmxlIF9fb3ZsZCBfX2NuZm4gc2lnbihkb3VibGUgeCk7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gc2lnbihkb3VibGUyIHgpOworZG91YmxlMyBfX292bGQgX19jbmZuIHNpZ24oZG91YmxlMyB4KTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBzaWduKGRvdWJsZTQgeCk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gc2lnbihkb3VibGU4IHgpOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBzaWduKGRvdWJsZTE2IHgpOworI2VuZGlmIC8vY2xfa2hyX2ZwNjQKKyNpZmRlZiBjbF9raHJfZnAxNgoraGFsZiBfX292bGQgX19jbmZuIHNpZ24oaGFsZiB4KTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gc2lnbihoYWxmMiB4KTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gc2lnbihoYWxmMyB4KTsKK2hhbGY0IF9fb3ZsZCBfX2NuZm4gc2lnbihoYWxmNCB4KTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gc2lnbihoYWxmOCB4KTsKK2hhbGYxNiBfX292bGQgX19jbmZuIHNpZ24oaGFsZjE2IHgpOworI2VuZGlmIC8vY2xfa2hyX2ZwMTYKKworLy8gT3BlbkNMIHYxLjEgczYuMTEuNSwgdjEuMiBzNi4xMi41LCB2Mi4wIHM2LjEzLjUgLSBHZW9tZXRyaWMgRnVuY3Rpb25zCisKKy8qKgorICogUmV0dXJucyB0aGUgY3Jvc3MgcHJvZHVjdCBvZiBwMC54eXogYW5kIHAxLnh5ei4gVGhlCisgKiB3IGNvbXBvbmVudCBvZiBmbG9hdDQgcmVzdWx0IHJldHVybmVkIHdpbGwgYmUgMC4wLgorICovCitmbG9hdDQgX19vdmxkIF9fY25mbiBjcm9zcyhmbG9hdDQgcDAsIGZsb2F0NCBwMSk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBjcm9zcyhmbG9hdDMgcDAsIGZsb2F0MyBwMSk7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBjcm9zcyhkb3VibGU0IHAwLCBkb3VibGU0IHAxKTsKK2RvdWJsZTMgX19vdmxkIF9fY25mbiBjcm9zcyhkb3VibGUzIHAwLCBkb3VibGUzIHAxKTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2hhbGY0IF9fb3ZsZCBfX2NuZm4gY3Jvc3MoaGFsZjQgcDAsIGhhbGY0IHAxKTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gY3Jvc3MoaGFsZjMgcDAsIGhhbGYzIHAxKTsKKyNlbmRpZiAvL2NsX2tocl9mcDE2CisKKy8qKgorICogQ29tcHV0ZSBkb3QgcHJvZHVjdC4KKyAqLworZmxvYXQgX19vdmxkIF9fY25mbiBkb3QoZmxvYXQgcDAsIGZsb2F0IHAxKTsKK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gZG90KGZsb2F0MiBwMCwgZmxvYXQyIHAxKTsKK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gZG90KGZsb2F0MyBwMCwgZmxvYXQzIHAxKTsKK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gZG90KGZsb2F0NCBwMCwgZmxvYXQ0IHAxKTsKKyNpZmRlZiBjbF9raHJfZnA2NAorZG91YmxlIF9fb3ZsZCBfX2NuZm4gZG90KGRvdWJsZSBwMCwgZG91YmxlIHAxKTsKK2RvdWJsZSBfX292bGQgX19jbmZuIGRvdChkb3VibGUyIHAwLCBkb3VibGUyIHAxKTsKK2RvdWJsZSBfX292bGQgX19jbmZuIGRvdChkb3VibGUzIHAwLCBkb3VibGUzIHAxKTsKK2RvdWJsZSBfX292bGQgX19jbmZuIGRvdChkb3VibGU0IHAwLCBkb3VibGU0IHAxKTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2hhbGYgX19vdmxkIF9fY25mbiBkb3QoaGFsZiBwMCwgaGFsZiBwMSk7CitoYWxmIF9fb3ZsZCBfX2NuZm4gZG90KGhhbGYyIHAwLCBoYWxmMiBwMSk7CitoYWxmIF9fb3ZsZCBfX2NuZm4gZG90KGhhbGYzIHAwLCBoYWxmMyBwMSk7CitoYWxmIF9fb3ZsZCBfX2NuZm4gZG90KGhhbGY0IHAwLCBoYWxmNCBwMSk7CisjZW5kaWYgLy9jbF9raHJfZnAxNgorCisvKioKKyAqIFJldHVybnMgdGhlIGRpc3RhbmNlIGJldHdlZW4gcDAgYW5kIHAxLiBUaGlzIGlzCisgKiBjYWxjdWxhdGVkIGFzIGxlbmd0aChwMCAtIHAxKS4KKyAqLworZmxvYXQgX19vdmxkIF9fY25mbiBkaXN0YW5jZShmbG9hdCBwMCwgZmxvYXQgcDEpOworZmxvYXQgX19vdmxkIF9fY25mbiBkaXN0YW5jZShmbG9hdDIgcDAsIGZsb2F0MiBwMSk7CitmbG9hdCBfX292bGQgX19jbmZuIGRpc3RhbmNlKGZsb2F0MyBwMCwgZmxvYXQzIHAxKTsKK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gZGlzdGFuY2UoZmxvYXQ0IHAwLCBmbG9hdDQgcDEpOworI2lmZGVmIGNsX2tocl9mcDY0Citkb3VibGUgX19vdmxkIF9fY25mbiBkaXN0YW5jZShkb3VibGUgcDAsIGRvdWJsZSBwMSk7Citkb3VibGUgX19vdmxkIF9fY25mbiBkaXN0YW5jZShkb3VibGUyIHAwLCBkb3VibGUyIHAxKTsKK2RvdWJsZSBfX292bGQgX19jbmZuIGRpc3RhbmNlKGRvdWJsZTMgcDAsIGRvdWJsZTMgcDEpOworZG91YmxlIF9fb3ZsZCBfX2NuZm4gZGlzdGFuY2UoZG91YmxlNCBwMCwgZG91YmxlNCBwMSk7CisjZW5kaWYgLy9jbF9raHJfZnA2NAorI2lmZGVmIGNsX2tocl9mcDE2CitoYWxmIF9fb3ZsZCBfX2NuZm4gZGlzdGFuY2UoaGFsZiBwMCwgaGFsZiBwMSk7CitoYWxmIF9fb3ZsZCBfX2NuZm4gZGlzdGFuY2UoaGFsZjIgcDAsIGhhbGYyIHAxKTsKK2hhbGYgX19vdmxkIF9fY25mbiBkaXN0YW5jZShoYWxmMyBwMCwgaGFsZjMgcDEpOworaGFsZiBfX292bGQgX19jbmZuIGRpc3RhbmNlKGhhbGY0IHAwLCBoYWxmNCBwMSk7CisjZW5kaWYgLy9jbF9raHJfZnAxNgorCisvKioKKyAqIFJldHVybiB0aGUgbGVuZ3RoIG9mIHZlY3RvciBwLCBpLmUuLAorICogc3FydChwLngyICsgcC55IDIgKyAuLi4pCisgKi8KK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gbGVuZ3RoKGZsb2F0IHApOworZmxvYXQgX19vdmxkIF9fY25mbiBsZW5ndGgoZmxvYXQyIHApOworZmxvYXQgX19vdmxkIF9fY25mbiBsZW5ndGgoZmxvYXQzIHApOworZmxvYXQgX19vdmxkIF9fY25mbiBsZW5ndGgoZmxvYXQ0IHApOworI2lmZGVmIGNsX2tocl9mcDY0Citkb3VibGUgX19vdmxkIF9fY25mbiBsZW5ndGgoZG91YmxlIHApOworZG91YmxlIF9fb3ZsZCBfX2NuZm4gbGVuZ3RoKGRvdWJsZTIgcCk7Citkb3VibGUgX19vdmxkIF9fY25mbiBsZW5ndGgoZG91YmxlMyBwKTsKK2RvdWJsZSBfX292bGQgX19jbmZuIGxlbmd0aChkb3VibGU0IHApOworI2VuZGlmIC8vY2xfa2hyX2ZwNjQKKyNpZmRlZiBjbF9raHJfZnAxNgoraGFsZiBfX292bGQgX19jbmZuIGxlbmd0aChoYWxmIHApOworaGFsZiBfX292bGQgX19jbmZuIGxlbmd0aChoYWxmMiBwKTsKK2hhbGYgX19vdmxkIF9fY25mbiBsZW5ndGgoaGFsZjMgcCk7CitoYWxmIF9fb3ZsZCBfX2NuZm4gbGVuZ3RoKGhhbGY0IHApOworI2VuZGlmIC8vY2xfa2hyX2ZwMTYKKworLyoqCisgKiBSZXR1cm5zIGEgdmVjdG9yIGluIHRoZSBzYW1lIGRpcmVjdGlvbiBhcyBwIGJ1dCB3aXRoIGEKKyAqIGxlbmd0aCBvZiAxLgorICovCitmbG9hdCBfX292bGQgX19jbmZuIG5vcm1hbGl6ZShmbG9hdCBwKTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIG5vcm1hbGl6ZShmbG9hdDIgcCk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBub3JtYWxpemUoZmxvYXQzIHApOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gbm9ybWFsaXplKGZsb2F0NCBwKTsKKyNpZmRlZiBjbF9raHJfZnA2NAorZG91YmxlIF9fb3ZsZCBfX2NuZm4gbm9ybWFsaXplKGRvdWJsZSBwKTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBub3JtYWxpemUoZG91YmxlMiBwKTsKK2RvdWJsZTMgX19vdmxkIF9fY25mbiBub3JtYWxpemUoZG91YmxlMyBwKTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBub3JtYWxpemUoZG91YmxlNCBwKTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2hhbGYgX19vdmxkIF9fY25mbiBub3JtYWxpemUoaGFsZiBwKTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gbm9ybWFsaXplKGhhbGYyIHApOworaGFsZjMgX19vdmxkIF9fY25mbiBub3JtYWxpemUoaGFsZjMgcCk7CitoYWxmNCBfX292bGQgX19jbmZuIG5vcm1hbGl6ZShoYWxmNCBwKTsKKyNlbmRpZiAvL2NsX2tocl9mcDE2CisKKy8qKgorICogUmV0dXJucyBmYXN0X2xlbmd0aChwMCAtIHAxKS4KKyAqLworZmxvYXQgX19vdmxkIF9fY25mbiBmYXN0X2Rpc3RhbmNlKGZsb2F0IHAwLCBmbG9hdCBwMSk7CitmbG9hdCBfX292bGQgX19jbmZuIGZhc3RfZGlzdGFuY2UoZmxvYXQyIHAwLCBmbG9hdDIgcDEpOworZmxvYXQgX19vdmxkIF9fY25mbiBmYXN0X2Rpc3RhbmNlKGZsb2F0MyBwMCwgZmxvYXQzIHAxKTsKK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gZmFzdF9kaXN0YW5jZShmbG9hdDQgcDAsIGZsb2F0NCBwMSk7CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2hhbGYgX19vdmxkIF9fY25mbiBmYXN0X2Rpc3RhbmNlKGhhbGYgcDAsIGhhbGYgcDEpOworaGFsZiBfX292bGQgX19jbmZuIGZhc3RfZGlzdGFuY2UoaGFsZjIgcDAsIGhhbGYyIHAxKTsKK2hhbGYgX19vdmxkIF9fY25mbiBmYXN0X2Rpc3RhbmNlKGhhbGYzIHAwLCBoYWxmMyBwMSk7CitoYWxmIF9fb3ZsZCBfX2NuZm4gZmFzdF9kaXN0YW5jZShoYWxmNCBwMCwgaGFsZjQgcDEpOworI2VuZGlmIC8vY2xfa2hyX2ZwMTYKKworLyoqCisgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdmVjdG9yIHAgY29tcHV0ZWQgYXM6CisgKiBoYWxmX3NxcnQocC54MiArIHAueTIgKyAuLi4pCisgKi8KK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gZmFzdF9sZW5ndGgoZmxvYXQgcCk7CitmbG9hdCBfX292bGQgX19jbmZuIGZhc3RfbGVuZ3RoKGZsb2F0MiBwKTsKK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gZmFzdF9sZW5ndGgoZmxvYXQzIHApOworZmxvYXQgX19vdmxkIF9fY25mbiBmYXN0X2xlbmd0aChmbG9hdDQgcCk7CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2hhbGYgX19vdmxkIF9fY25mbiBmYXN0X2xlbmd0aChoYWxmIHApOworaGFsZiBfX292bGQgX19jbmZuIGZhc3RfbGVuZ3RoKGhhbGYyIHApOworaGFsZiBfX292bGQgX19jbmZuIGZhc3RfbGVuZ3RoKGhhbGYzIHApOworaGFsZiBfX292bGQgX19jbmZuIGZhc3RfbGVuZ3RoKGhhbGY0IHApOworI2VuZGlmIC8vY2xfa2hyX2ZwMTYKKworLyoqCisgKiBSZXR1cm5zIGEgdmVjdG9yIGluIHRoZSBzYW1lIGRpcmVjdGlvbiBhcyBwIGJ1dCB3aXRoIGEKKyAqIGxlbmd0aCBvZiAxLiBmYXN0X25vcm1hbGl6ZSBpcyBjb21wdXRlZCBhczoKKyAqIHAgKiBoYWxmX3JzcXJ0IChwLnheMiArIHAueV4yICsgLi4uICkKKyAqIFRoZSByZXN1bHQgc2hhbGwgYmUgd2l0aGluIDgxOTIgdWxwcyBlcnJvciBmcm9tIHRoZQorICogaW5maW5pdGVseSBwcmVjaXNlIHJlc3VsdCBvZgorICogaWYgKGFsbChwID09IDAuMGYpKQorICogcmVzdWx0ID0gcDsKKyAqIGVsc2UKKyAqIHJlc3VsdCA9IHAgLyBzcXJ0IChwLnheMiArIHAueV4yICsgLi4uKTsKKyAqIHdpdGggdGhlIGZvbGxvd2luZyBleGNlcHRpb25zOgorICogMSkgSWYgdGhlIHN1bSBvZiBzcXVhcmVzIGlzIGdyZWF0ZXIgdGhhbiBGTFRfTUFYCisgKiB0aGVuIHRoZSB2YWx1ZSBvZiB0aGUgZmxvYXRpbmctcG9pbnQgdmFsdWVzIGluIHRoZQorICogcmVzdWx0IHZlY3RvciBhcmUgdW5kZWZpbmVkLgorICogMikgSWYgdGhlIHN1bSBvZiBzcXVhcmVzIGlzIGxlc3MgdGhhbiBGTFRfTUlOIHRoZW4KKyAqIHRoZSBpbXBsZW1lbnRhdGlvbiBtYXkgcmV0dXJuIGJhY2sgcC4KKyAqIDMpIElmIHRoZSBkZXZpY2UgaXMgaW4gImRlbm9ybXMgYXJlIGZsdXNoZWQgdG8gemVybyIKKyAqIG1vZGUsIGluZGl2aWR1YWwgb3BlcmFuZCBlbGVtZW50cyB3aXRoIG1hZ25pdHVkZQorICogbGVzcyB0aGFuIHNxcnQoRkxUX01JTikgbWF5IGJlIGZsdXNoZWQgdG8gemVybworICogYmVmb3JlIHByb2NlZWRpbmcgd2l0aCB0aGUgY2FsY3VsYXRpb24uCisgKi8KK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gZmFzdF9ub3JtYWxpemUoZmxvYXQgcCk7CitmbG9hdDIgX19vdmxkIF9fY25mbiBmYXN0X25vcm1hbGl6ZShmbG9hdDIgcCk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBmYXN0X25vcm1hbGl6ZShmbG9hdDMgcCk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBmYXN0X25vcm1hbGl6ZShmbG9hdDQgcCk7CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2hhbGYgX19vdmxkIF9fY25mbiBmYXN0X25vcm1hbGl6ZShoYWxmIHApOworaGFsZjIgX19vdmxkIF9fY25mbiBmYXN0X25vcm1hbGl6ZShoYWxmMiBwKTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gZmFzdF9ub3JtYWxpemUoaGFsZjMgcCk7CitoYWxmNCBfX292bGQgX19jbmZuIGZhc3Rfbm9ybWFsaXplKGhhbGY0IHApOworI2VuZGlmIC8vY2xfa2hyX2ZwMTYKKworLy8gT3BlbkNMIHYxLjEgczYuMTEuNiwgdjEuMiBzNi4xMi42LCB2Mi4wIHM2LjEzLjYgLSBSZWxhdGlvbmFsIEZ1bmN0aW9ucworCisvKioKKyAqIGludG4gaXNlcXVhbCAoZmxvYXRuIHgsIGZsb2F0biB5KQorICogUmV0dXJucyB0aGUgY29tcG9uZW50LXdpc2UgY29tcGFyZSBvZiB4ID09IHkuCisgKi8KK2ludCBfX292bGQgX19jbmZuIGlzZXF1YWwoZmxvYXQgeCwgZmxvYXQgeSk7CitpbnQyIF9fb3ZsZCBfX2NuZm4gaXNlcXVhbChmbG9hdDIgeCwgZmxvYXQyIHkpOworaW50MyBfX292bGQgX19jbmZuIGlzZXF1YWwoZmxvYXQzIHgsIGZsb2F0MyB5KTsKK2ludDQgX19vdmxkIF9fY25mbiBpc2VxdWFsKGZsb2F0NCB4LCBmbG9hdDQgeSk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gaXNlcXVhbChmbG9hdDggeCwgZmxvYXQ4IHkpOworaW50MTYgX19vdmxkIF9fY25mbiBpc2VxdWFsKGZsb2F0MTYgeCwgZmxvYXQxNiB5KTsKKyNpZmRlZiBjbF9raHJfZnA2NAoraW50IF9fb3ZsZCBfX2NuZm4gaXNlcXVhbChkb3VibGUgeCwgZG91YmxlIHkpOworbG9uZzIgX19vdmxkIF9fY25mbiBpc2VxdWFsKGRvdWJsZTIgeCwgZG91YmxlMiB5KTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gaXNlcXVhbChkb3VibGUzIHgsIGRvdWJsZTMgeSk7Citsb25nNCBfX292bGQgX19jbmZuIGlzZXF1YWwoZG91YmxlNCB4LCBkb3VibGU0IHkpOworbG9uZzggX19vdmxkIF9fY25mbiBpc2VxdWFsKGRvdWJsZTggeCwgZG91YmxlOCB5KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGlzZXF1YWwoZG91YmxlMTYgeCwgZG91YmxlMTYgeSk7CisjZW5kaWYgLy9jbF9raHJfZnA2NAorI2lmZGVmIGNsX2tocl9mcDE2CitpbnQgX19vdmxkIF9fY25mbiBpc2VxdWFsKGhhbGYgeCwgaGFsZiB5KTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGlzZXF1YWwoaGFsZjIgeCwgaGFsZjIgeSk7CitzaG9ydDMgX19vdmxkIF9fY25mbiBpc2VxdWFsKGhhbGYzIHgsIGhhbGYzIHkpOworc2hvcnQ0IF9fb3ZsZCBfX2NuZm4gaXNlcXVhbChoYWxmNCB4LCBoYWxmNCB5KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGlzZXF1YWwoaGFsZjggeCwgaGFsZjggeSk7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gaXNlcXVhbChoYWxmMTYgeCwgaGFsZjE2IHkpOworI2VuZGlmIC8vY2xfa2hyX2ZwMTYKKworLyoqCisgKiBSZXR1cm5zIHRoZSBjb21wb25lbnQtd2lzZSBjb21wYXJlIG9mIHggIT0geS4KKyAqLworaW50IF9fb3ZsZCBfX2NuZm4gaXNub3RlcXVhbChmbG9hdCB4LCBmbG9hdCB5KTsKK2ludDIgX19vdmxkIF9fY25mbiBpc25vdGVxdWFsKGZsb2F0MiB4LCBmbG9hdDIgeSk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gaXNub3RlcXVhbChmbG9hdDMgeCwgZmxvYXQzIHkpOworaW50NCBfX292bGQgX19jbmZuIGlzbm90ZXF1YWwoZmxvYXQ0IHgsIGZsb2F0NCB5KTsKK2ludDggX19vdmxkIF9fY25mbiBpc25vdGVxdWFsKGZsb2F0OCB4LCBmbG9hdDggeSk7CitpbnQxNiBfX292bGQgX19jbmZuIGlzbm90ZXF1YWwoZmxvYXQxNiB4LCBmbG9hdDE2IHkpOworI2lmZGVmIGNsX2tocl9mcDY0CitpbnQgX19vdmxkIF9fY25mbiBpc25vdGVxdWFsKGRvdWJsZSB4LCBkb3VibGUgeSk7Citsb25nMiBfX292bGQgX19jbmZuIGlzbm90ZXF1YWwoZG91YmxlMiB4LCBkb3VibGUyIHkpOworbG9uZzMgX19vdmxkIF9fY25mbiBpc25vdGVxdWFsKGRvdWJsZTMgeCwgZG91YmxlMyB5KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gaXNub3RlcXVhbChkb3VibGU0IHgsIGRvdWJsZTQgeSk7Citsb25nOCBfX292bGQgX19jbmZuIGlzbm90ZXF1YWwoZG91YmxlOCB4LCBkb3VibGU4IHkpOworbG9uZzE2IF9fb3ZsZCBfX2NuZm4gaXNub3RlcXVhbChkb3VibGUxNiB4LCBkb3VibGUxNiB5KTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2ludCBfX292bGQgX19jbmZuIGlzbm90ZXF1YWwoaGFsZiB4LCBoYWxmIHkpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gaXNub3RlcXVhbChoYWxmMiB4LCBoYWxmMiB5KTsKK3Nob3J0MyBfX292bGQgX19jbmZuIGlzbm90ZXF1YWwoaGFsZjMgeCwgaGFsZjMgeSk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBpc25vdGVxdWFsKGhhbGY0IHgsIGhhbGY0IHkpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gaXNub3RlcXVhbChoYWxmOCB4LCBoYWxmOCB5KTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBpc25vdGVxdWFsKGhhbGYxNiB4LCBoYWxmMTYgeSk7CisjZW5kaWYgLy9jbF9raHJfZnAxNgorCisvKioKKyAqIFJldHVybnMgdGhlIGNvbXBvbmVudC13aXNlIGNvbXBhcmUgb2YgeCA+IHkuCisgKi8KK2ludCBfX292bGQgX19jbmZuIGlzZ3JlYXRlcihmbG9hdCB4LCBmbG9hdCB5KTsKK2ludDIgX19vdmxkIF9fY25mbiBpc2dyZWF0ZXIoZmxvYXQyIHgsIGZsb2F0MiB5KTsKK2ludDMgX19vdmxkIF9fY25mbiBpc2dyZWF0ZXIoZmxvYXQzIHgsIGZsb2F0MyB5KTsKK2ludDQgX19vdmxkIF9fY25mbiBpc2dyZWF0ZXIoZmxvYXQ0IHgsIGZsb2F0NCB5KTsKK2ludDggX19vdmxkIF9fY25mbiBpc2dyZWF0ZXIoZmxvYXQ4IHgsIGZsb2F0OCB5KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gaXNncmVhdGVyKGZsb2F0MTYgeCwgZmxvYXQxNiB5KTsKKyNpZmRlZiBjbF9raHJfZnA2NAoraW50IF9fb3ZsZCBfX2NuZm4gaXNncmVhdGVyKGRvdWJsZSB4LCBkb3VibGUgeSk7Citsb25nMiBfX292bGQgX19jbmZuIGlzZ3JlYXRlcihkb3VibGUyIHgsIGRvdWJsZTIgeSk7Citsb25nMyBfX292bGQgX19jbmZuIGlzZ3JlYXRlcihkb3VibGUzIHgsIGRvdWJsZTMgeSk7Citsb25nNCBfX292bGQgX19jbmZuIGlzZ3JlYXRlcihkb3VibGU0IHgsIGRvdWJsZTQgeSk7Citsb25nOCBfX292bGQgX19jbmZuIGlzZ3JlYXRlcihkb3VibGU4IHgsIGRvdWJsZTggeSk7Citsb25nMTYgX19vdmxkIF9fY25mbiBpc2dyZWF0ZXIoZG91YmxlMTYgeCwgZG91YmxlMTYgeSk7CisjZW5kaWYgLy9jbF9raHJfZnA2NAorI2lmZGVmIGNsX2tocl9mcDE2CitpbnQgX19vdmxkIF9fY25mbiBpc2dyZWF0ZXIoaGFsZiB4LCBoYWxmIHkpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gaXNncmVhdGVyKGhhbGYyIHgsIGhhbGYyIHkpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gaXNncmVhdGVyKGhhbGYzIHgsIGhhbGYzIHkpOworc2hvcnQ0IF9fb3ZsZCBfX2NuZm4gaXNncmVhdGVyKGhhbGY0IHgsIGhhbGY0IHkpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gaXNncmVhdGVyKGhhbGY4IHgsIGhhbGY4IHkpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGlzZ3JlYXRlcihoYWxmMTYgeCwgaGFsZjE2IHkpOworI2VuZGlmIC8vY2xfa2hyX2ZwMTYKKworLyoqCisgKiBSZXR1cm5zIHRoZSBjb21wb25lbnQtd2lzZSBjb21wYXJlIG9mIHggPj0geS4KKyAqLworaW50IF9fb3ZsZCBfX2NuZm4gaXNncmVhdGVyZXF1YWwoZmxvYXQgeCwgZmxvYXQgeSk7CitpbnQyIF9fb3ZsZCBfX2NuZm4gaXNncmVhdGVyZXF1YWwoZmxvYXQyIHgsIGZsb2F0MiB5KTsKK2ludDMgX19vdmxkIF9fY25mbiBpc2dyZWF0ZXJlcXVhbChmbG9hdDMgeCwgZmxvYXQzIHkpOworaW50NCBfX292bGQgX19jbmZuIGlzZ3JlYXRlcmVxdWFsKGZsb2F0NCB4LCBmbG9hdDQgeSk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gaXNncmVhdGVyZXF1YWwoZmxvYXQ4IHgsIGZsb2F0OCB5KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gaXNncmVhdGVyZXF1YWwoZmxvYXQxNiB4LCBmbG9hdDE2IHkpOworI2lmZGVmIGNsX2tocl9mcDY0CitpbnQgX19vdmxkIF9fY25mbiBpc2dyZWF0ZXJlcXVhbChkb3VibGUgeCwgZG91YmxlIHkpOworbG9uZzIgX19vdmxkIF9fY25mbiBpc2dyZWF0ZXJlcXVhbChkb3VibGUyIHgsIGRvdWJsZTIgeSk7Citsb25nMyBfX292bGQgX19jbmZuIGlzZ3JlYXRlcmVxdWFsKGRvdWJsZTMgeCwgZG91YmxlMyB5KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gaXNncmVhdGVyZXF1YWwoZG91YmxlNCB4LCBkb3VibGU0IHkpOworbG9uZzggX19vdmxkIF9fY25mbiBpc2dyZWF0ZXJlcXVhbChkb3VibGU4IHgsIGRvdWJsZTggeSk7Citsb25nMTYgX19vdmxkIF9fY25mbiBpc2dyZWF0ZXJlcXVhbChkb3VibGUxNiB4LCBkb3VibGUxNiB5KTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2ludCBfX292bGQgX19jbmZuIGlzZ3JlYXRlcmVxdWFsKGhhbGYgeCwgaGFsZiB5KTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGlzZ3JlYXRlcmVxdWFsKGhhbGYyIHgsIGhhbGYyIHkpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gaXNncmVhdGVyZXF1YWwoaGFsZjMgeCwgaGFsZjMgeSk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBpc2dyZWF0ZXJlcXVhbChoYWxmNCB4LCBoYWxmNCB5KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGlzZ3JlYXRlcmVxdWFsKGhhbGY4IHgsIGhhbGY4IHkpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGlzZ3JlYXRlcmVxdWFsKGhhbGYxNiB4LCBoYWxmMTYgeSk7CisjZW5kaWYgLy9jbF9raHJfZnAxNgorCisvKioKKyAqIFJldHVybnMgdGhlIGNvbXBvbmVudC13aXNlIGNvbXBhcmUgb2YgeCA8IHkuCisgKi8KK2ludCBfX292bGQgX19jbmZuIGlzbGVzcyhmbG9hdCB4LCBmbG9hdCB5KTsKK2ludDIgX19vdmxkIF9fY25mbiBpc2xlc3MoZmxvYXQyIHgsIGZsb2F0MiB5KTsKK2ludDMgX19vdmxkIF9fY25mbiBpc2xlc3MoZmxvYXQzIHgsIGZsb2F0MyB5KTsKK2ludDQgX19vdmxkIF9fY25mbiBpc2xlc3MoZmxvYXQ0IHgsIGZsb2F0NCB5KTsKK2ludDggX19vdmxkIF9fY25mbiBpc2xlc3MoZmxvYXQ4IHgsIGZsb2F0OCB5KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gaXNsZXNzKGZsb2F0MTYgeCwgZmxvYXQxNiB5KTsKKyNpZmRlZiBjbF9raHJfZnA2NAoraW50IF9fb3ZsZCBfX2NuZm4gaXNsZXNzKGRvdWJsZSB4LCBkb3VibGUgeSk7Citsb25nMiBfX292bGQgX19jbmZuIGlzbGVzcyhkb3VibGUyIHgsIGRvdWJsZTIgeSk7Citsb25nMyBfX292bGQgX19jbmZuIGlzbGVzcyhkb3VibGUzIHgsIGRvdWJsZTMgeSk7Citsb25nNCBfX292bGQgX19jbmZuIGlzbGVzcyhkb3VibGU0IHgsIGRvdWJsZTQgeSk7Citsb25nOCBfX292bGQgX19jbmZuIGlzbGVzcyhkb3VibGU4IHgsIGRvdWJsZTggeSk7Citsb25nMTYgX19vdmxkIF9fY25mbiBpc2xlc3MoZG91YmxlMTYgeCwgZG91YmxlMTYgeSk7CisjZW5kaWYgLy9jbF9raHJfZnA2NAorI2lmZGVmIGNsX2tocl9mcDE2CitpbnQgX19vdmxkIF9fY25mbiBpc2xlc3MoaGFsZiB4LCBoYWxmIHkpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gaXNsZXNzKGhhbGYyIHgsIGhhbGYyIHkpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gaXNsZXNzKGhhbGYzIHgsIGhhbGYzIHkpOworc2hvcnQ0IF9fb3ZsZCBfX2NuZm4gaXNsZXNzKGhhbGY0IHgsIGhhbGY0IHkpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gaXNsZXNzKGhhbGY4IHgsIGhhbGY4IHkpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGlzbGVzcyhoYWxmMTYgeCwgaGFsZjE2IHkpOworI2VuZGlmIC8vY2xfa2hyX2ZwMTYKKworLyoqCisgKiBSZXR1cm5zIHRoZSBjb21wb25lbnQtd2lzZSBjb21wYXJlIG9mIHggPD0geS4KKyAqLworaW50IF9fb3ZsZCBfX2NuZm4gaXNsZXNzZXF1YWwoZmxvYXQgeCwgZmxvYXQgeSk7CitpbnQyIF9fb3ZsZCBfX2NuZm4gaXNsZXNzZXF1YWwoZmxvYXQyIHgsIGZsb2F0MiB5KTsKK2ludDMgX19vdmxkIF9fY25mbiBpc2xlc3NlcXVhbChmbG9hdDMgeCwgZmxvYXQzIHkpOworaW50NCBfX292bGQgX19jbmZuIGlzbGVzc2VxdWFsKGZsb2F0NCB4LCBmbG9hdDQgeSk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gaXNsZXNzZXF1YWwoZmxvYXQ4IHgsIGZsb2F0OCB5KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gaXNsZXNzZXF1YWwoZmxvYXQxNiB4LCBmbG9hdDE2IHkpOworI2lmZGVmIGNsX2tocl9mcDY0CitpbnQgX19vdmxkIF9fY25mbiBpc2xlc3NlcXVhbChkb3VibGUgeCwgZG91YmxlIHkpOworbG9uZzIgX19vdmxkIF9fY25mbiBpc2xlc3NlcXVhbChkb3VibGUyIHgsIGRvdWJsZTIgeSk7Citsb25nMyBfX292bGQgX19jbmZuIGlzbGVzc2VxdWFsKGRvdWJsZTMgeCwgZG91YmxlMyB5KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gaXNsZXNzZXF1YWwoZG91YmxlNCB4LCBkb3VibGU0IHkpOworbG9uZzggX19vdmxkIF9fY25mbiBpc2xlc3NlcXVhbChkb3VibGU4IHgsIGRvdWJsZTggeSk7Citsb25nMTYgX19vdmxkIF9fY25mbiBpc2xlc3NlcXVhbChkb3VibGUxNiB4LCBkb3VibGUxNiB5KTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2ludCBfX292bGQgX19jbmZuIGlzbGVzc2VxdWFsKGhhbGYgeCwgaGFsZiB5KTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGlzbGVzc2VxdWFsKGhhbGYyIHgsIGhhbGYyIHkpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gaXNsZXNzZXF1YWwoaGFsZjMgeCwgaGFsZjMgeSk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBpc2xlc3NlcXVhbChoYWxmNCB4LCBoYWxmNCB5KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGlzbGVzc2VxdWFsKGhhbGY4IHgsIGhhbGY4IHkpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGlzbGVzc2VxdWFsKGhhbGYxNiB4LCBoYWxmMTYgeSk7CisjZW5kaWYgLy9jbF9raHJfZnAxNgorCisvKioKKyAqIFJldHVybnMgdGhlIGNvbXBvbmVudC13aXNlIGNvbXBhcmUgb2YKKyAqICh4IDwgeSkgfHwgKHggPiB5KSAuCisgKi8KK2ludCBfX292bGQgX19jbmZuIGlzbGVzc2dyZWF0ZXIoZmxvYXQgeCwgZmxvYXQgeSk7CitpbnQyIF9fb3ZsZCBfX2NuZm4gaXNsZXNzZ3JlYXRlcihmbG9hdDIgeCwgZmxvYXQyIHkpOworaW50MyBfX292bGQgX19jbmZuIGlzbGVzc2dyZWF0ZXIoZmxvYXQzIHgsIGZsb2F0MyB5KTsKK2ludDQgX19vdmxkIF9fY25mbiBpc2xlc3NncmVhdGVyKGZsb2F0NCB4LCBmbG9hdDQgeSk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gaXNsZXNzZ3JlYXRlcihmbG9hdDggeCwgZmxvYXQ4IHkpOworaW50MTYgX19vdmxkIF9fY25mbiBpc2xlc3NncmVhdGVyKGZsb2F0MTYgeCwgZmxvYXQxNiB5KTsKKyNpZmRlZiBjbF9raHJfZnA2NAoraW50IF9fb3ZsZCBfX2NuZm4gaXNsZXNzZ3JlYXRlcihkb3VibGUgeCwgZG91YmxlIHkpOworbG9uZzIgX19vdmxkIF9fY25mbiBpc2xlc3NncmVhdGVyKGRvdWJsZTIgeCwgZG91YmxlMiB5KTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gaXNsZXNzZ3JlYXRlcihkb3VibGUzIHgsIGRvdWJsZTMgeSk7Citsb25nNCBfX292bGQgX19jbmZuIGlzbGVzc2dyZWF0ZXIoZG91YmxlNCB4LCBkb3VibGU0IHkpOworbG9uZzggX19vdmxkIF9fY25mbiBpc2xlc3NncmVhdGVyKGRvdWJsZTggeCwgZG91YmxlOCB5KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGlzbGVzc2dyZWF0ZXIoZG91YmxlMTYgeCwgZG91YmxlMTYgeSk7CisjZW5kaWYgLy9jbF9raHJfZnA2NAorI2lmZGVmIGNsX2tocl9mcDE2CitpbnQgX19vdmxkIF9fY25mbiBpc2xlc3NncmVhdGVyKGhhbGYgeCwgaGFsZiB5KTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGlzbGVzc2dyZWF0ZXIoaGFsZjIgeCwgaGFsZjIgeSk7CitzaG9ydDMgX19vdmxkIF9fY25mbiBpc2xlc3NncmVhdGVyKGhhbGYzIHgsIGhhbGYzIHkpOworc2hvcnQ0IF9fb3ZsZCBfX2NuZm4gaXNsZXNzZ3JlYXRlcihoYWxmNCB4LCBoYWxmNCB5KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGlzbGVzc2dyZWF0ZXIoaGFsZjggeCwgaGFsZjggeSk7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gaXNsZXNzZ3JlYXRlcihoYWxmMTYgeCwgaGFsZjE2IHkpOworI2VuZGlmIC8vY2xfa2hyX2ZwMTYKKworLyoqCisgKiBUZXN0IGZvciBmaW5pdGUgdmFsdWUuCisgKi8KK2ludCBfX292bGQgX19jbmZuIGlzZmluaXRlKGZsb2F0KTsKK2ludDIgX19vdmxkIF9fY25mbiBpc2Zpbml0ZShmbG9hdDIpOworaW50MyBfX292bGQgX19jbmZuIGlzZmluaXRlKGZsb2F0Myk7CitpbnQ0IF9fb3ZsZCBfX2NuZm4gaXNmaW5pdGUoZmxvYXQ0KTsKK2ludDggX19vdmxkIF9fY25mbiBpc2Zpbml0ZShmbG9hdDgpOworaW50MTYgX19vdmxkIF9fY25mbiBpc2Zpbml0ZShmbG9hdDE2KTsKKyNpZmRlZiBjbF9raHJfZnA2NAoraW50IF9fb3ZsZCBfX2NuZm4gaXNmaW5pdGUoZG91YmxlKTsKK2xvbmcyIF9fb3ZsZCBfX2NuZm4gaXNmaW5pdGUoZG91YmxlMik7Citsb25nMyBfX292bGQgX19jbmZuIGlzZmluaXRlKGRvdWJsZTMpOworbG9uZzQgX19vdmxkIF9fY25mbiBpc2Zpbml0ZShkb3VibGU0KTsKK2xvbmc4IF9fb3ZsZCBfX2NuZm4gaXNmaW5pdGUoZG91YmxlOCk7Citsb25nMTYgX19vdmxkIF9fY25mbiBpc2Zpbml0ZShkb3VibGUxNik7CisjZW5kaWYgLy9jbF9raHJfZnA2NAorI2lmZGVmIGNsX2tocl9mcDE2CitpbnQgX19vdmxkIF9fY25mbiBpc2Zpbml0ZShoYWxmKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGlzZmluaXRlKGhhbGYyKTsKK3Nob3J0MyBfX292bGQgX19jbmZuIGlzZmluaXRlKGhhbGYzKTsKK3Nob3J0NCBfX292bGQgX19jbmZuIGlzZmluaXRlKGhhbGY0KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGlzZmluaXRlKGhhbGY4KTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBpc2Zpbml0ZShoYWxmMTYpOworI2VuZGlmIC8vY2xfa2hyX2ZwMTYKKworLyoqCisgKiBUZXN0IGZvciBpbmZpbml0eSB2YWx1ZSAoK3ZlIG9yIC12ZSkgLgorICovCitpbnQgX19vdmxkIF9fY25mbiBpc2luZihmbG9hdCk7CitpbnQyIF9fb3ZsZCBfX2NuZm4gaXNpbmYoZmxvYXQyKTsKK2ludDMgX19vdmxkIF9fY25mbiBpc2luZihmbG9hdDMpOworaW50NCBfX292bGQgX19jbmZuIGlzaW5mKGZsb2F0NCk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gaXNpbmYoZmxvYXQ4KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gaXNpbmYoZmxvYXQxNik7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2ludCBfX292bGQgX19jbmZuIGlzaW5mKGRvdWJsZSk7Citsb25nMiBfX292bGQgX19jbmZuIGlzaW5mKGRvdWJsZTIpOworbG9uZzMgX19vdmxkIF9fY25mbiBpc2luZihkb3VibGUzKTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gaXNpbmYoZG91YmxlNCk7Citsb25nOCBfX292bGQgX19jbmZuIGlzaW5mKGRvdWJsZTgpOworbG9uZzE2IF9fb3ZsZCBfX2NuZm4gaXNpbmYoZG91YmxlMTYpOworI2VuZGlmIC8vY2xfa2hyX2ZwNjQKKyNpZmRlZiBjbF9raHJfZnAxNgoraW50IF9fb3ZsZCBfX2NuZm4gaXNpbmYoaGFsZik7CitzaG9ydDIgX19vdmxkIF9fY25mbiBpc2luZihoYWxmMik7CitzaG9ydDMgX19vdmxkIF9fY25mbiBpc2luZihoYWxmMyk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBpc2luZihoYWxmNCk7CitzaG9ydDggX19vdmxkIF9fY25mbiBpc2luZihoYWxmOCk7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gaXNpbmYoaGFsZjE2KTsKKyNlbmRpZiAvL2NsX2tocl9mcDE2CisKKy8qKgorICogVGVzdCBmb3IgYSBOYU4uCisgKi8KK2ludCBfX292bGQgX19jbmZuIGlzbmFuKGZsb2F0KTsKK2ludDIgX19vdmxkIF9fY25mbiBpc25hbihmbG9hdDIpOworaW50MyBfX292bGQgX19jbmZuIGlzbmFuKGZsb2F0Myk7CitpbnQ0IF9fb3ZsZCBfX2NuZm4gaXNuYW4oZmxvYXQ0KTsKK2ludDggX19vdmxkIF9fY25mbiBpc25hbihmbG9hdDgpOworaW50MTYgX19vdmxkIF9fY25mbiBpc25hbihmbG9hdDE2KTsKKyNpZmRlZiBjbF9raHJfZnA2NAoraW50IF9fb3ZsZCBfX2NuZm4gaXNuYW4oZG91YmxlKTsKK2xvbmcyIF9fb3ZsZCBfX2NuZm4gaXNuYW4oZG91YmxlMik7Citsb25nMyBfX292bGQgX19jbmZuIGlzbmFuKGRvdWJsZTMpOworbG9uZzQgX19vdmxkIF9fY25mbiBpc25hbihkb3VibGU0KTsKK2xvbmc4IF9fb3ZsZCBfX2NuZm4gaXNuYW4oZG91YmxlOCk7Citsb25nMTYgX19vdmxkIF9fY25mbiBpc25hbihkb3VibGUxNik7CisjZW5kaWYgLy9jbF9raHJfZnA2NAorI2lmZGVmIGNsX2tocl9mcDE2CitpbnQgX19vdmxkIF9fY25mbiBpc25hbihoYWxmKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGlzbmFuKGhhbGYyKTsKK3Nob3J0MyBfX292bGQgX19jbmZuIGlzbmFuKGhhbGYzKTsKK3Nob3J0NCBfX292bGQgX19jbmZuIGlzbmFuKGhhbGY0KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGlzbmFuKGhhbGY4KTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBpc25hbihoYWxmMTYpOworI2VuZGlmIC8vY2xfa2hyX2ZwMTYKKworLyoqCisgKiBUZXN0IGZvciBhIG5vcm1hbCB2YWx1ZS4KKyAqLworaW50IF9fb3ZsZCBfX2NuZm4gaXNub3JtYWwoZmxvYXQpOworaW50MiBfX292bGQgX19jbmZuIGlzbm9ybWFsKGZsb2F0Mik7CitpbnQzIF9fb3ZsZCBfX2NuZm4gaXNub3JtYWwoZmxvYXQzKTsKK2ludDQgX19vdmxkIF9fY25mbiBpc25vcm1hbChmbG9hdDQpOworaW50OCBfX292bGQgX19jbmZuIGlzbm9ybWFsKGZsb2F0OCk7CitpbnQxNiBfX292bGQgX19jbmZuIGlzbm9ybWFsKGZsb2F0MTYpOworI2lmZGVmIGNsX2tocl9mcDY0CitpbnQgX19vdmxkIF9fY25mbiBpc25vcm1hbChkb3VibGUpOworbG9uZzIgX19vdmxkIF9fY25mbiBpc25vcm1hbChkb3VibGUyKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gaXNub3JtYWwoZG91YmxlMyk7Citsb25nNCBfX292bGQgX19jbmZuIGlzbm9ybWFsKGRvdWJsZTQpOworbG9uZzggX19vdmxkIF9fY25mbiBpc25vcm1hbChkb3VibGU4KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGlzbm9ybWFsKGRvdWJsZTE2KTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2ludCBfX292bGQgX19jbmZuIGlzbm9ybWFsKGhhbGYpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gaXNub3JtYWwoaGFsZjIpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gaXNub3JtYWwoaGFsZjMpOworc2hvcnQ0IF9fb3ZsZCBfX2NuZm4gaXNub3JtYWwoaGFsZjQpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gaXNub3JtYWwoaGFsZjgpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGlzbm9ybWFsKGhhbGYxNik7CisjZW5kaWYgLy9jbF9raHJfZnAxNgorCisvKioKKyAqIFRlc3QgaWYgYXJndW1lbnRzIGFyZSBvcmRlcmVkLiBpc29yZGVyZWQoKSB0YWtlcworICogYXJndW1lbnRzIHggYW5kIHksIGFuZCByZXR1cm5zIHRoZSByZXN1bHQKKyAqIGlzZXF1YWwoeCwgeCkgJiYgaXNlcXVhbCh5LCB5KS4KKyAqLworaW50IF9fb3ZsZCBfX2NuZm4gaXNvcmRlcmVkKGZsb2F0IHgsIGZsb2F0IHkpOworaW50MiBfX292bGQgX19jbmZuIGlzb3JkZXJlZChmbG9hdDIgeCwgZmxvYXQyIHkpOworaW50MyBfX292bGQgX19jbmZuIGlzb3JkZXJlZChmbG9hdDMgeCwgZmxvYXQzIHkpOworaW50NCBfX292bGQgX19jbmZuIGlzb3JkZXJlZChmbG9hdDQgeCwgZmxvYXQ0IHkpOworaW50OCBfX292bGQgX19jbmZuIGlzb3JkZXJlZChmbG9hdDggeCwgZmxvYXQ4IHkpOworaW50MTYgX19vdmxkIF9fY25mbiBpc29yZGVyZWQoZmxvYXQxNiB4LCBmbG9hdDE2IHkpOworI2lmZGVmIGNsX2tocl9mcDY0CitpbnQgX19vdmxkIF9fY25mbiBpc29yZGVyZWQoZG91YmxlIHgsIGRvdWJsZSB5KTsKK2xvbmcyIF9fb3ZsZCBfX2NuZm4gaXNvcmRlcmVkKGRvdWJsZTIgeCwgZG91YmxlMiB5KTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gaXNvcmRlcmVkKGRvdWJsZTMgeCwgZG91YmxlMyB5KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gaXNvcmRlcmVkKGRvdWJsZTQgeCwgZG91YmxlNCB5KTsKK2xvbmc4IF9fb3ZsZCBfX2NuZm4gaXNvcmRlcmVkKGRvdWJsZTggeCwgZG91YmxlOCB5KTsKK2xvbmcxNiBfX292bGQgX19jbmZuIGlzb3JkZXJlZChkb3VibGUxNiB4LCBkb3VibGUxNiB5KTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2ludCBfX292bGQgX19jbmZuIGlzb3JkZXJlZChoYWxmIHgsIGhhbGYgeSk7CitzaG9ydDIgX19vdmxkIF9fY25mbiBpc29yZGVyZWQoaGFsZjIgeCwgaGFsZjIgeSk7CitzaG9ydDMgX19vdmxkIF9fY25mbiBpc29yZGVyZWQoaGFsZjMgeCwgaGFsZjMgeSk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBpc29yZGVyZWQoaGFsZjQgeCwgaGFsZjQgeSk7CitzaG9ydDggX19vdmxkIF9fY25mbiBpc29yZGVyZWQoaGFsZjggeCwgaGFsZjggeSk7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gaXNvcmRlcmVkKGhhbGYxNiB4LCBoYWxmMTYgeSk7CisjZW5kaWYgLy9jbF9raHJfZnAxNgorCisvKioKKyAqIFRlc3QgaWYgYXJndW1lbnRzIGFyZSB1bm9yZGVyZWQuIGlzdW5vcmRlcmVkKCkKKyAqIHRha2VzIGFyZ3VtZW50cyB4IGFuZCB5LCByZXR1cm5pbmcgbm9uLXplcm8gaWYgeCBvciB5CisgKiBpcyBOYU4sIGFuZCB6ZXJvIG90aGVyd2lzZS4KKyAqLworaW50IF9fb3ZsZCBfX2NuZm4gaXN1bm9yZGVyZWQoZmxvYXQgeCwgZmxvYXQgeSk7CitpbnQyIF9fb3ZsZCBfX2NuZm4gaXN1bm9yZGVyZWQoZmxvYXQyIHgsIGZsb2F0MiB5KTsKK2ludDMgX19vdmxkIF9fY25mbiBpc3Vub3JkZXJlZChmbG9hdDMgeCwgZmxvYXQzIHkpOworaW50NCBfX292bGQgX19jbmZuIGlzdW5vcmRlcmVkKGZsb2F0NCB4LCBmbG9hdDQgeSk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gaXN1bm9yZGVyZWQoZmxvYXQ4IHgsIGZsb2F0OCB5KTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gaXN1bm9yZGVyZWQoZmxvYXQxNiB4LCBmbG9hdDE2IHkpOworI2lmZGVmIGNsX2tocl9mcDY0CitpbnQgX19vdmxkIF9fY25mbiBpc3Vub3JkZXJlZChkb3VibGUgeCwgZG91YmxlIHkpOworbG9uZzIgX19vdmxkIF9fY25mbiBpc3Vub3JkZXJlZChkb3VibGUyIHgsIGRvdWJsZTIgeSk7Citsb25nMyBfX292bGQgX19jbmZuIGlzdW5vcmRlcmVkKGRvdWJsZTMgeCwgZG91YmxlMyB5KTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gaXN1bm9yZGVyZWQoZG91YmxlNCB4LCBkb3VibGU0IHkpOworbG9uZzggX19vdmxkIF9fY25mbiBpc3Vub3JkZXJlZChkb3VibGU4IHgsIGRvdWJsZTggeSk7Citsb25nMTYgX19vdmxkIF9fY25mbiBpc3Vub3JkZXJlZChkb3VibGUxNiB4LCBkb3VibGUxNiB5KTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2ludCBfX292bGQgX19jbmZuIGlzdW5vcmRlcmVkKGhhbGYgeCwgaGFsZiB5KTsKK3Nob3J0MiBfX292bGQgX19jbmZuIGlzdW5vcmRlcmVkKGhhbGYyIHgsIGhhbGYyIHkpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gaXN1bm9yZGVyZWQoaGFsZjMgeCwgaGFsZjMgeSk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBpc3Vub3JkZXJlZChoYWxmNCB4LCBoYWxmNCB5KTsKK3Nob3J0OCBfX292bGQgX19jbmZuIGlzdW5vcmRlcmVkKGhhbGY4IHgsIGhhbGY4IHkpOworc2hvcnQxNiBfX292bGQgX19jbmZuIGlzdW5vcmRlcmVkKGhhbGYxNiB4LCBoYWxmMTYgeSk7CisjZW5kaWYgLy9jbF9raHJfZnAxNgorCisvKioKKyAqIFRlc3QgZm9yIHNpZ24gYml0LiBUaGUgc2NhbGFyIHZlcnNpb24gb2YgdGhlIGZ1bmN0aW9uCisgKiByZXR1cm5zIGEgMSBpZiB0aGUgc2lnbiBiaXQgaW4gdGhlIGZsb2F0IGlzIHNldCBlbHNlIHJldHVybnMKKyAqIDAuIFRoZSB2ZWN0b3IgdmVyc2lvbiBvZiB0aGUgZnVuY3Rpb24gcmV0dXJucyB0aGUKKyAqIGZvbGxvd2luZyBmb3IgZWFjaCBjb21wb25lbnQgaW4gZmxvYXRuOiBhIC0xIGlmIHRoZQorICogc2lnbiBiaXQgaW4gdGhlIGZsb2F0IGlzIHNldCBlbHNlIHJldHVybnMgMC4KKyAqLworaW50IF9fb3ZsZCBfX2NuZm4gc2lnbmJpdChmbG9hdCk7CitpbnQyIF9fb3ZsZCBfX2NuZm4gc2lnbmJpdChmbG9hdDIpOworaW50MyBfX292bGQgX19jbmZuIHNpZ25iaXQoZmxvYXQzKTsKK2ludDQgX19vdmxkIF9fY25mbiBzaWduYml0KGZsb2F0NCk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gc2lnbmJpdChmbG9hdDgpOworaW50MTYgX19vdmxkIF9fY25mbiBzaWduYml0KGZsb2F0MTYpOworI2lmZGVmIGNsX2tocl9mcDY0CitpbnQgX19vdmxkIF9fY25mbiBzaWduYml0KGRvdWJsZSk7Citsb25nMiBfX292bGQgX19jbmZuIHNpZ25iaXQoZG91YmxlMik7Citsb25nMyBfX292bGQgX19jbmZuIHNpZ25iaXQoZG91YmxlMyk7Citsb25nNCBfX292bGQgX19jbmZuIHNpZ25iaXQoZG91YmxlNCk7Citsb25nOCBfX292bGQgX19jbmZuIHNpZ25iaXQoZG91YmxlOCk7Citsb25nMTYgX19vdmxkIF9fY25mbiBzaWduYml0KGRvdWJsZTE2KTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2ludCBfX292bGQgX19jbmZuIHNpZ25iaXQoaGFsZik7CitzaG9ydDIgX19vdmxkIF9fY25mbiBzaWduYml0KGhhbGYyKTsKK3Nob3J0MyBfX292bGQgX19jbmZuIHNpZ25iaXQoaGFsZjMpOworc2hvcnQ0IF9fb3ZsZCBfX2NuZm4gc2lnbmJpdChoYWxmNCk7CitzaG9ydDggX19vdmxkIF9fY25mbiBzaWduYml0KGhhbGY4KTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBzaWduYml0KGhhbGYxNik7CisjZW5kaWYgLy9jbF9raHJfZnAxNgorCisvKioKKyAqIFJldHVybnMgMSBpZiB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgaW4gYW55IGNvbXBvbmVudAorICogb2YgeCBpcyBzZXQ7IG90aGVyd2lzZSByZXR1cm5zIDAuCisgKi8KK2ludCBfX292bGQgX19jbmZuIGFueShjaGFyIHgpOworaW50IF9fb3ZsZCBfX2NuZm4gYW55KGNoYXIyIHgpOworaW50IF9fb3ZsZCBfX2NuZm4gYW55KGNoYXIzIHgpOworaW50IF9fb3ZsZCBfX2NuZm4gYW55KGNoYXI0IHgpOworaW50IF9fb3ZsZCBfX2NuZm4gYW55KGNoYXI4IHgpOworaW50IF9fb3ZsZCBfX2NuZm4gYW55KGNoYXIxNiB4KTsKK2ludCBfX292bGQgX19jbmZuIGFueShzaG9ydCB4KTsKK2ludCBfX292bGQgX19jbmZuIGFueShzaG9ydDIgeCk7CitpbnQgX19vdmxkIF9fY25mbiBhbnkoc2hvcnQzIHgpOworaW50IF9fb3ZsZCBfX2NuZm4gYW55KHNob3J0NCB4KTsKK2ludCBfX292bGQgX19jbmZuIGFueShzaG9ydDggeCk7CitpbnQgX19vdmxkIF9fY25mbiBhbnkoc2hvcnQxNiB4KTsKK2ludCBfX292bGQgX19jbmZuIGFueShpbnQgeCk7CitpbnQgX19vdmxkIF9fY25mbiBhbnkoaW50MiB4KTsKK2ludCBfX292bGQgX19jbmZuIGFueShpbnQzIHgpOworaW50IF9fb3ZsZCBfX2NuZm4gYW55KGludDQgeCk7CitpbnQgX19vdmxkIF9fY25mbiBhbnkoaW50OCB4KTsKK2ludCBfX292bGQgX19jbmZuIGFueShpbnQxNiB4KTsKK2ludCBfX292bGQgX19jbmZuIGFueShsb25nIHgpOworaW50IF9fb3ZsZCBfX2NuZm4gYW55KGxvbmcyIHgpOworaW50IF9fb3ZsZCBfX2NuZm4gYW55KGxvbmczIHgpOworaW50IF9fb3ZsZCBfX2NuZm4gYW55KGxvbmc0IHgpOworaW50IF9fb3ZsZCBfX2NuZm4gYW55KGxvbmc4IHgpOworaW50IF9fb3ZsZCBfX2NuZm4gYW55KGxvbmcxNiB4KTsKKworLyoqCisgKiBSZXR1cm5zIDEgaWYgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGluIGFsbCBjb21wb25lbnRzCisgKiBvZiB4IGlzIHNldDsgb3RoZXJ3aXNlIHJldHVybnMgMC4KKyAqLworaW50IF9fb3ZsZCBfX2NuZm4gYWxsKGNoYXIgeCk7CitpbnQgX19vdmxkIF9fY25mbiBhbGwoY2hhcjIgeCk7CitpbnQgX19vdmxkIF9fY25mbiBhbGwoY2hhcjMgeCk7CitpbnQgX19vdmxkIF9fY25mbiBhbGwoY2hhcjQgeCk7CitpbnQgX19vdmxkIF9fY25mbiBhbGwoY2hhcjggeCk7CitpbnQgX19vdmxkIF9fY25mbiBhbGwoY2hhcjE2IHgpOworaW50IF9fb3ZsZCBfX2NuZm4gYWxsKHNob3J0IHgpOworaW50IF9fb3ZsZCBfX2NuZm4gYWxsKHNob3J0MiB4KTsKK2ludCBfX292bGQgX19jbmZuIGFsbChzaG9ydDMgeCk7CitpbnQgX19vdmxkIF9fY25mbiBhbGwoc2hvcnQ0IHgpOworaW50IF9fb3ZsZCBfX2NuZm4gYWxsKHNob3J0OCB4KTsKK2ludCBfX292bGQgX19jbmZuIGFsbChzaG9ydDE2IHgpOworaW50IF9fb3ZsZCBfX2NuZm4gYWxsKGludCB4KTsKK2ludCBfX292bGQgX19jbmZuIGFsbChpbnQyIHgpOworaW50IF9fb3ZsZCBfX2NuZm4gYWxsKGludDMgeCk7CitpbnQgX19vdmxkIF9fY25mbiBhbGwoaW50NCB4KTsKK2ludCBfX292bGQgX19jbmZuIGFsbChpbnQ4IHgpOworaW50IF9fb3ZsZCBfX2NuZm4gYWxsKGludDE2IHgpOworaW50IF9fb3ZsZCBfX2NuZm4gYWxsKGxvbmcgeCk7CitpbnQgX19vdmxkIF9fY25mbiBhbGwobG9uZzIgeCk7CitpbnQgX19vdmxkIF9fY25mbiBhbGwobG9uZzMgeCk7CitpbnQgX19vdmxkIF9fY25mbiBhbGwobG9uZzQgeCk7CitpbnQgX19vdmxkIF9fY25mbiBhbGwobG9uZzggeCk7CitpbnQgX19vdmxkIF9fY25mbiBhbGwobG9uZzE2IHgpOworCisvKioKKyAqIEVhY2ggYml0IG9mIHRoZSByZXN1bHQgaXMgdGhlIGNvcnJlc3BvbmRpbmcgYml0IG9mIGEgaWYKKyAqIHRoZSBjb3JyZXNwb25kaW5nIGJpdCBvZiBjIGlzIDAuIE90aGVyd2lzZSBpdCBpcyB0aGUKKyAqIGNvcnJlc3BvbmRpbmcgYml0IG9mIGIuCisgKi8KK2NoYXIgX19vdmxkIF9fY25mbiBiaXRzZWxlY3QoY2hhciBhLCBjaGFyIGIsIGNoYXIgYyk7Cit1Y2hhciBfX292bGQgX19jbmZuIGJpdHNlbGVjdCh1Y2hhciBhLCB1Y2hhciBiLCB1Y2hhciBjKTsKK2NoYXIyIF9fb3ZsZCBfX2NuZm4gYml0c2VsZWN0KGNoYXIyIGEsIGNoYXIyIGIsIGNoYXIyIGMpOwordWNoYXIyIF9fb3ZsZCBfX2NuZm4gYml0c2VsZWN0KHVjaGFyMiBhLCB1Y2hhcjIgYiwgdWNoYXIyIGMpOworY2hhcjMgX19vdmxkIF9fY25mbiBiaXRzZWxlY3QoY2hhcjMgYSwgY2hhcjMgYiwgY2hhcjMgYyk7Cit1Y2hhcjMgX19vdmxkIF9fY25mbiBiaXRzZWxlY3QodWNoYXIzIGEsIHVjaGFyMyBiLCB1Y2hhcjMgYyk7CitjaGFyNCBfX292bGQgX19jbmZuIGJpdHNlbGVjdChjaGFyNCBhLCBjaGFyNCBiLCBjaGFyNCBjKTsKK3VjaGFyNCBfX292bGQgX19jbmZuIGJpdHNlbGVjdCh1Y2hhcjQgYSwgdWNoYXI0IGIsIHVjaGFyNCBjKTsKK2NoYXI4IF9fb3ZsZCBfX2NuZm4gYml0c2VsZWN0KGNoYXI4IGEsIGNoYXI4IGIsIGNoYXI4IGMpOwordWNoYXI4IF9fb3ZsZCBfX2NuZm4gYml0c2VsZWN0KHVjaGFyOCBhLCB1Y2hhcjggYiwgdWNoYXI4IGMpOworY2hhcjE2IF9fb3ZsZCBfX2NuZm4gYml0c2VsZWN0KGNoYXIxNiBhLCBjaGFyMTYgYiwgY2hhcjE2IGMpOwordWNoYXIxNiBfX292bGQgX19jbmZuIGJpdHNlbGVjdCh1Y2hhcjE2IGEsIHVjaGFyMTYgYiwgdWNoYXIxNiBjKTsKK3Nob3J0IF9fb3ZsZCBfX2NuZm4gYml0c2VsZWN0KHNob3J0IGEsIHNob3J0IGIsIHNob3J0IGMpOwordXNob3J0IF9fb3ZsZCBfX2NuZm4gYml0c2VsZWN0KHVzaG9ydCBhLCB1c2hvcnQgYiwgdXNob3J0IGMpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gYml0c2VsZWN0KHNob3J0MiBhLCBzaG9ydDIgYiwgc2hvcnQyIGMpOwordXNob3J0MiBfX292bGQgX19jbmZuIGJpdHNlbGVjdCh1c2hvcnQyIGEsIHVzaG9ydDIgYiwgdXNob3J0MiBjKTsKK3Nob3J0MyBfX292bGQgX19jbmZuIGJpdHNlbGVjdChzaG9ydDMgYSwgc2hvcnQzIGIsIHNob3J0MyBjKTsKK3VzaG9ydDMgX19vdmxkIF9fY25mbiBiaXRzZWxlY3QodXNob3J0MyBhLCB1c2hvcnQzIGIsIHVzaG9ydDMgYyk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBiaXRzZWxlY3Qoc2hvcnQ0IGEsIHNob3J0NCBiLCBzaG9ydDQgYyk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gYml0c2VsZWN0KHVzaG9ydDQgYSwgdXNob3J0NCBiLCB1c2hvcnQ0IGMpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gYml0c2VsZWN0KHNob3J0OCBhLCBzaG9ydDggYiwgc2hvcnQ4IGMpOwordXNob3J0OCBfX292bGQgX19jbmZuIGJpdHNlbGVjdCh1c2hvcnQ4IGEsIHVzaG9ydDggYiwgdXNob3J0OCBjKTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBiaXRzZWxlY3Qoc2hvcnQxNiBhLCBzaG9ydDE2IGIsIHNob3J0MTYgYyk7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIGJpdHNlbGVjdCh1c2hvcnQxNiBhLCB1c2hvcnQxNiBiLCB1c2hvcnQxNiBjKTsKK2ludCBfX292bGQgX19jbmZuIGJpdHNlbGVjdChpbnQgYSwgaW50IGIsIGludCBjKTsKK3VpbnQgX19vdmxkIF9fY25mbiBiaXRzZWxlY3QodWludCBhLCB1aW50IGIsIHVpbnQgYyk7CitpbnQyIF9fb3ZsZCBfX2NuZm4gYml0c2VsZWN0KGludDIgYSwgaW50MiBiLCBpbnQyIGMpOwordWludDIgX19vdmxkIF9fY25mbiBiaXRzZWxlY3QodWludDIgYSwgdWludDIgYiwgdWludDIgYyk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gYml0c2VsZWN0KGludDMgYSwgaW50MyBiLCBpbnQzIGMpOwordWludDMgX19vdmxkIF9fY25mbiBiaXRzZWxlY3QodWludDMgYSwgdWludDMgYiwgdWludDMgYyk7CitpbnQ0IF9fb3ZsZCBfX2NuZm4gYml0c2VsZWN0KGludDQgYSwgaW50NCBiLCBpbnQ0IGMpOwordWludDQgX19vdmxkIF9fY25mbiBiaXRzZWxlY3QodWludDQgYSwgdWludDQgYiwgdWludDQgYyk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gYml0c2VsZWN0KGludDggYSwgaW50OCBiLCBpbnQ4IGMpOwordWludDggX19vdmxkIF9fY25mbiBiaXRzZWxlY3QodWludDggYSwgdWludDggYiwgdWludDggYyk7CitpbnQxNiBfX292bGQgX19jbmZuIGJpdHNlbGVjdChpbnQxNiBhLCBpbnQxNiBiLCBpbnQxNiBjKTsKK3VpbnQxNiBfX292bGQgX19jbmZuIGJpdHNlbGVjdCh1aW50MTYgYSwgdWludDE2IGIsIHVpbnQxNiBjKTsKK2xvbmcgX19vdmxkIF9fY25mbiBiaXRzZWxlY3QobG9uZyBhLCBsb25nIGIsIGxvbmcgYyk7Cit1bG9uZyBfX292bGQgX19jbmZuIGJpdHNlbGVjdCh1bG9uZyBhLCB1bG9uZyBiLCB1bG9uZyBjKTsKK2xvbmcyIF9fb3ZsZCBfX2NuZm4gYml0c2VsZWN0KGxvbmcyIGEsIGxvbmcyIGIsIGxvbmcyIGMpOwordWxvbmcyIF9fb3ZsZCBfX2NuZm4gYml0c2VsZWN0KHVsb25nMiBhLCB1bG9uZzIgYiwgdWxvbmcyIGMpOworbG9uZzMgX19vdmxkIF9fY25mbiBiaXRzZWxlY3QobG9uZzMgYSwgbG9uZzMgYiwgbG9uZzMgYyk7Cit1bG9uZzMgX19vdmxkIF9fY25mbiBiaXRzZWxlY3QodWxvbmczIGEsIHVsb25nMyBiLCB1bG9uZzMgYyk7Citsb25nNCBfX292bGQgX19jbmZuIGJpdHNlbGVjdChsb25nNCBhLCBsb25nNCBiLCBsb25nNCBjKTsKK3Vsb25nNCBfX292bGQgX19jbmZuIGJpdHNlbGVjdCh1bG9uZzQgYSwgdWxvbmc0IGIsIHVsb25nNCBjKTsKK2xvbmc4IF9fb3ZsZCBfX2NuZm4gYml0c2VsZWN0KGxvbmc4IGEsIGxvbmc4IGIsIGxvbmc4IGMpOwordWxvbmc4IF9fb3ZsZCBfX2NuZm4gYml0c2VsZWN0KHVsb25nOCBhLCB1bG9uZzggYiwgdWxvbmc4IGMpOworbG9uZzE2IF9fb3ZsZCBfX2NuZm4gYml0c2VsZWN0KGxvbmcxNiBhLCBsb25nMTYgYiwgbG9uZzE2IGMpOwordWxvbmcxNiBfX292bGQgX19jbmZuIGJpdHNlbGVjdCh1bG9uZzE2IGEsIHVsb25nMTYgYiwgdWxvbmcxNiBjKTsKK2Zsb2F0IF9fb3ZsZCBfX2NuZm4gYml0c2VsZWN0KGZsb2F0IGEsIGZsb2F0IGIsIGZsb2F0IGMpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gYml0c2VsZWN0KGZsb2F0MiBhLCBmbG9hdDIgYiwgZmxvYXQyIGMpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gYml0c2VsZWN0KGZsb2F0MyBhLCBmbG9hdDMgYiwgZmxvYXQzIGMpOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gYml0c2VsZWN0KGZsb2F0NCBhLCBmbG9hdDQgYiwgZmxvYXQ0IGMpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gYml0c2VsZWN0KGZsb2F0OCBhLCBmbG9hdDggYiwgZmxvYXQ4IGMpOworZmxvYXQxNiBfX292bGQgX19jbmZuIGJpdHNlbGVjdChmbG9hdDE2IGEsIGZsb2F0MTYgYiwgZmxvYXQxNiBjKTsKKyNpZmRlZiBjbF9raHJfZnA2NAorZG91YmxlIF9fb3ZsZCBfX2NuZm4gYml0c2VsZWN0KGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlIGMpOworZG91YmxlMiBfX292bGQgX19jbmZuIGJpdHNlbGVjdChkb3VibGUyIGEsIGRvdWJsZTIgYiwgZG91YmxlMiBjKTsKK2RvdWJsZTMgX19vdmxkIF9fY25mbiBiaXRzZWxlY3QoZG91YmxlMyBhLCBkb3VibGUzIGIsIGRvdWJsZTMgYyk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gYml0c2VsZWN0KGRvdWJsZTQgYSwgZG91YmxlNCBiLCBkb3VibGU0IGMpOworZG91YmxlOCBfX292bGQgX19jbmZuIGJpdHNlbGVjdChkb3VibGU4IGEsIGRvdWJsZTggYiwgZG91YmxlOCBjKTsKK2RvdWJsZTE2IF9fb3ZsZCBfX2NuZm4gYml0c2VsZWN0KGRvdWJsZTE2IGEsIGRvdWJsZTE2IGIsIGRvdWJsZTE2IGMpOworI2VuZGlmIC8vY2xfa2hyX2ZwNjQKKyNpZmRlZiBjbF9raHJfZnAxNgoraGFsZiBfX292bGQgX19jbmZuIGJpdHNlbGVjdChoYWxmIGEsIGhhbGYgYiwgaGFsZiBjKTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gYml0c2VsZWN0KGhhbGYyIGEsIGhhbGYyIGIsIGhhbGYyIGMpOworaGFsZjMgX19vdmxkIF9fY25mbiBiaXRzZWxlY3QoaGFsZjMgYSwgaGFsZjMgYiwgaGFsZjMgYyk7CitoYWxmNCBfX292bGQgX19jbmZuIGJpdHNlbGVjdChoYWxmNCBhLCBoYWxmNCBiLCBoYWxmNCBjKTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gYml0c2VsZWN0KGhhbGY4IGEsIGhhbGY4IGIsIGhhbGY4IGMpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gYml0c2VsZWN0KGhhbGYxNiBhLCBoYWxmMTYgYiwgaGFsZjE2IGMpOworI2VuZGlmIC8vY2xfa2hyX2ZwMTYKKworLyoqCisgKiBGb3IgZWFjaCBjb21wb25lbnQgb2YgYSB2ZWN0b3IgdHlwZSwKKyAqIHJlc3VsdFtpXSA9IGlmIE1TQiBvZiBjW2ldIGlzIHNldCA/IGJbaV0gOiBhW2ldLgorICogRm9yIGEgc2NhbGFyIHR5cGUsIHJlc3VsdCA9IGMgPyBiIDogYS4KKyAqLworY2hhciBfX292bGQgX19jbmZuIHNlbGVjdChjaGFyIGEsIGNoYXIgYiwgY2hhciBjKTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVjaGFyIGEsIHVjaGFyIGIsIGNoYXIgYyk7CitjaGFyMiBfX292bGQgX19jbmZuIHNlbGVjdChjaGFyMiBhLCBjaGFyMiBiLCBjaGFyMiBjKTsKK3VjaGFyMiBfX292bGQgX19jbmZuIHNlbGVjdCh1Y2hhcjIgYSwgdWNoYXIyIGIsIGNoYXIyIGMpOworY2hhcjMgX19vdmxkIF9fY25mbiBzZWxlY3QoY2hhcjMgYSwgY2hhcjMgYiwgY2hhcjMgYyk7Cit1Y2hhcjMgX19vdmxkIF9fY25mbiBzZWxlY3QodWNoYXIzIGEsIHVjaGFyMyBiLCBjaGFyMyBjKTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGNoYXI0IGEsIGNoYXI0IGIsIGNoYXI0IGMpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVjaGFyNCBhLCB1Y2hhcjQgYiwgY2hhcjQgYyk7CitjaGFyOCBfX292bGQgX19jbmZuIHNlbGVjdChjaGFyOCBhLCBjaGFyOCBiLCBjaGFyOCBjKTsKK3VjaGFyOCBfX292bGQgX19jbmZuIHNlbGVjdCh1Y2hhcjggYSwgdWNoYXI4IGIsIGNoYXI4IGMpOworY2hhcjE2IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGNoYXIxNiBhLCBjaGFyMTYgYiwgY2hhcjE2IGMpOwordWNoYXIxNiBfX292bGQgX19jbmZuIHNlbGVjdCh1Y2hhcjE2IGEsIHVjaGFyMTYgYiwgY2hhcjE2IGMpOworc2hvcnQgX19vdmxkIF9fY25mbiBzZWxlY3Qoc2hvcnQgYSwgc2hvcnQgYiwgY2hhciBjKTsKK3VzaG9ydCBfX292bGQgX19jbmZuIHNlbGVjdCh1c2hvcnQgYSwgdXNob3J0IGIsIGNoYXIgYyk7CitzaG9ydDIgX19vdmxkIF9fY25mbiBzZWxlY3Qoc2hvcnQyIGEsIHNob3J0MiBiLCBjaGFyMiBjKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBzZWxlY3QodXNob3J0MiBhLCB1c2hvcnQyIGIsIGNoYXIyIGMpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHNob3J0MyBhLCBzaG9ydDMgYiwgY2hhcjMgYyk7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVzaG9ydDMgYSwgdXNob3J0MyBiLCBjaGFyMyBjKTsKK3Nob3J0NCBfX292bGQgX19jbmZuIHNlbGVjdChzaG9ydDQgYSwgc2hvcnQ0IGIsIGNoYXI0IGMpOwordXNob3J0NCBfX292bGQgX19jbmZuIHNlbGVjdCh1c2hvcnQ0IGEsIHVzaG9ydDQgYiwgY2hhcjQgYyk7CitzaG9ydDggX19vdmxkIF9fY25mbiBzZWxlY3Qoc2hvcnQ4IGEsIHNob3J0OCBiLCBjaGFyOCBjKTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBzZWxlY3QodXNob3J0OCBhLCB1c2hvcnQ4IGIsIGNoYXI4IGMpOworc2hvcnQxNiBfX292bGQgX19jbmZuIHNlbGVjdChzaG9ydDE2IGEsIHNob3J0MTYgYiwgY2hhcjE2IGMpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBzZWxlY3QodXNob3J0MTYgYSwgdXNob3J0MTYgYiwgY2hhcjE2IGMpOworaW50IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGludCBhLCBpbnQgYiwgY2hhciBjKTsKK3VpbnQgX19vdmxkIF9fY25mbiBzZWxlY3QodWludCBhLCB1aW50IGIsIGNoYXIgYyk7CitpbnQyIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGludDIgYSwgaW50MiBiLCBjaGFyMiBjKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVpbnQyIGEsIHVpbnQyIGIsIGNoYXIyIGMpOworaW50MyBfX292bGQgX19jbmZuIHNlbGVjdChpbnQzIGEsIGludDMgYiwgY2hhcjMgYyk7Cit1aW50MyBfX292bGQgX19jbmZuIHNlbGVjdCh1aW50MyBhLCB1aW50MyBiLCBjaGFyMyBjKTsKK2ludDQgX19vdmxkIF9fY25mbiBzZWxlY3QoaW50NCBhLCBpbnQ0IGIsIGNoYXI0IGMpOwordWludDQgX19vdmxkIF9fY25mbiBzZWxlY3QodWludDQgYSwgdWludDQgYiwgY2hhcjQgYyk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGludDggYSwgaW50OCBiLCBjaGFyOCBjKTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVpbnQ4IGEsIHVpbnQ4IGIsIGNoYXI4IGMpOworaW50MTYgX19vdmxkIF9fY25mbiBzZWxlY3QoaW50MTYgYSwgaW50MTYgYiwgY2hhcjE2IGMpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVpbnQxNiBhLCB1aW50MTYgYiwgY2hhcjE2IGMpOworbG9uZyBfX292bGQgX19jbmZuIHNlbGVjdChsb25nIGEsIGxvbmcgYiwgY2hhciBjKTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVsb25nIGEsIHVsb25nIGIsIGNoYXIgYyk7Citsb25nMiBfX292bGQgX19jbmZuIHNlbGVjdChsb25nMiBhLCBsb25nMiBiLCBjaGFyMiBjKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIHNlbGVjdCh1bG9uZzIgYSwgdWxvbmcyIGIsIGNoYXIyIGMpOworbG9uZzMgX19vdmxkIF9fY25mbiBzZWxlY3QobG9uZzMgYSwgbG9uZzMgYiwgY2hhcjMgYyk7Cit1bG9uZzMgX19vdmxkIF9fY25mbiBzZWxlY3QodWxvbmczIGEsIHVsb25nMyBiLCBjaGFyMyBjKTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGxvbmc0IGEsIGxvbmc0IGIsIGNoYXI0IGMpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVsb25nNCBhLCB1bG9uZzQgYiwgY2hhcjQgYyk7Citsb25nOCBfX292bGQgX19jbmZuIHNlbGVjdChsb25nOCBhLCBsb25nOCBiLCBjaGFyOCBjKTsKK3Vsb25nOCBfX292bGQgX19jbmZuIHNlbGVjdCh1bG9uZzggYSwgdWxvbmc4IGIsIGNoYXI4IGMpOworbG9uZzE2IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGxvbmcxNiBhLCBsb25nMTYgYiwgY2hhcjE2IGMpOwordWxvbmcxNiBfX292bGQgX19jbmZuIHNlbGVjdCh1bG9uZzE2IGEsIHVsb25nMTYgYiwgY2hhcjE2IGMpOworZmxvYXQgX19vdmxkIF9fY25mbiBzZWxlY3QoZmxvYXQgYSwgZmxvYXQgYiwgY2hhciBjKTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIHNlbGVjdChmbG9hdDIgYSwgZmxvYXQyIGIsIGNoYXIyIGMpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGZsb2F0MyBhLCBmbG9hdDMgYiwgY2hhcjMgYyk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBzZWxlY3QoZmxvYXQ0IGEsIGZsb2F0NCBiLCBjaGFyNCBjKTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIHNlbGVjdChmbG9hdDggYSwgZmxvYXQ4IGIsIGNoYXI4IGMpOworZmxvYXQxNiBfX292bGQgX19jbmZuIHNlbGVjdChmbG9hdDE2IGEsIGZsb2F0MTYgYiwgY2hhcjE2IGMpOworY2hhciBfX292bGQgX19jbmZuIHNlbGVjdChjaGFyIGEsIGNoYXIgYiwgc2hvcnQgYyk7Cit1Y2hhciBfX292bGQgX19jbmZuIHNlbGVjdCh1Y2hhciBhLCB1Y2hhciBiLCBzaG9ydCBjKTsKK2NoYXIyIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGNoYXIyIGEsIGNoYXIyIGIsIHNob3J0MiBjKTsKK3VjaGFyMiBfX292bGQgX19jbmZuIHNlbGVjdCh1Y2hhcjIgYSwgdWNoYXIyIGIsIHNob3J0MiBjKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGNoYXIzIGEsIGNoYXIzIGIsIHNob3J0MyBjKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIHNlbGVjdCh1Y2hhcjMgYSwgdWNoYXIzIGIsIHNob3J0MyBjKTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGNoYXI0IGEsIGNoYXI0IGIsIHNob3J0NCBjKTsKK3VjaGFyNCBfX292bGQgX19jbmZuIHNlbGVjdCh1Y2hhcjQgYSwgdWNoYXI0IGIsIHNob3J0NCBjKTsKK2NoYXI4IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGNoYXI4IGEsIGNoYXI4IGIsIHNob3J0OCBjKTsKK3VjaGFyOCBfX292bGQgX19jbmZuIHNlbGVjdCh1Y2hhcjggYSwgdWNoYXI4IGIsIHNob3J0OCBjKTsKK2NoYXIxNiBfX292bGQgX19jbmZuIHNlbGVjdChjaGFyMTYgYSwgY2hhcjE2IGIsIHNob3J0MTYgYyk7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVjaGFyMTYgYSwgdWNoYXIxNiBiLCBzaG9ydDE2IGMpOworc2hvcnQgX19vdmxkIF9fY25mbiBzZWxlY3Qoc2hvcnQgYSwgc2hvcnQgYiwgc2hvcnQgYyk7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBzZWxlY3QodXNob3J0IGEsIHVzaG9ydCBiLCBzaG9ydCBjKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIHNlbGVjdChzaG9ydDIgYSwgc2hvcnQyIGIsIHNob3J0MiBjKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBzZWxlY3QodXNob3J0MiBhLCB1c2hvcnQyIGIsIHNob3J0MiBjKTsKK3Nob3J0MyBfX292bGQgX19jbmZuIHNlbGVjdChzaG9ydDMgYSwgc2hvcnQzIGIsIHNob3J0MyBjKTsKK3VzaG9ydDMgX19vdmxkIF9fY25mbiBzZWxlY3QodXNob3J0MyBhLCB1c2hvcnQzIGIsIHNob3J0MyBjKTsKK3Nob3J0NCBfX292bGQgX19jbmZuIHNlbGVjdChzaG9ydDQgYSwgc2hvcnQ0IGIsIHNob3J0NCBjKTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBzZWxlY3QodXNob3J0NCBhLCB1c2hvcnQ0IGIsIHNob3J0NCBjKTsKK3Nob3J0OCBfX292bGQgX19jbmZuIHNlbGVjdChzaG9ydDggYSwgc2hvcnQ4IGIsIHNob3J0OCBjKTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBzZWxlY3QodXNob3J0OCBhLCB1c2hvcnQ4IGIsIHNob3J0OCBjKTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBzZWxlY3Qoc2hvcnQxNiBhLCBzaG9ydDE2IGIsIHNob3J0MTYgYyk7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIHNlbGVjdCh1c2hvcnQxNiBhLCB1c2hvcnQxNiBiLCBzaG9ydDE2IGMpOworaW50IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGludCBhLCBpbnQgYiwgc2hvcnQgYyk7Cit1aW50IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVpbnQgYSwgdWludCBiLCBzaG9ydCBjKTsKK2ludDIgX19vdmxkIF9fY25mbiBzZWxlY3QoaW50MiBhLCBpbnQyIGIsIHNob3J0MiBjKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVpbnQyIGEsIHVpbnQyIGIsIHNob3J0MiBjKTsKK2ludDMgX19vdmxkIF9fY25mbiBzZWxlY3QoaW50MyBhLCBpbnQzIGIsIHNob3J0MyBjKTsKK3VpbnQzIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVpbnQzIGEsIHVpbnQzIGIsIHNob3J0MyBjKTsKK2ludDQgX19vdmxkIF9fY25mbiBzZWxlY3QoaW50NCBhLCBpbnQ0IGIsIHNob3J0NCBjKTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVpbnQ0IGEsIHVpbnQ0IGIsIHNob3J0NCBjKTsKK2ludDggX19vdmxkIF9fY25mbiBzZWxlY3QoaW50OCBhLCBpbnQ4IGIsIHNob3J0OCBjKTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVpbnQ4IGEsIHVpbnQ4IGIsIHNob3J0OCBjKTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGludDE2IGEsIGludDE2IGIsIHNob3J0MTYgYyk7Cit1aW50MTYgX19vdmxkIF9fY25mbiBzZWxlY3QodWludDE2IGEsIHVpbnQxNiBiLCBzaG9ydDE2IGMpOworbG9uZyBfX292bGQgX19jbmZuIHNlbGVjdChsb25nIGEsIGxvbmcgYiwgc2hvcnQgYyk7Cit1bG9uZyBfX292bGQgX19jbmZuIHNlbGVjdCh1bG9uZyBhLCB1bG9uZyBiLCBzaG9ydCBjKTsKK2xvbmcyIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGxvbmcyIGEsIGxvbmcyIGIsIHNob3J0MiBjKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIHNlbGVjdCh1bG9uZzIgYSwgdWxvbmcyIGIsIHNob3J0MiBjKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGxvbmczIGEsIGxvbmczIGIsIHNob3J0MyBjKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIHNlbGVjdCh1bG9uZzMgYSwgdWxvbmczIGIsIHNob3J0MyBjKTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGxvbmc0IGEsIGxvbmc0IGIsIHNob3J0NCBjKTsKK3Vsb25nNCBfX292bGQgX19jbmZuIHNlbGVjdCh1bG9uZzQgYSwgdWxvbmc0IGIsIHNob3J0NCBjKTsKK2xvbmc4IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGxvbmc4IGEsIGxvbmc4IGIsIHNob3J0OCBjKTsKK3Vsb25nOCBfX292bGQgX19jbmZuIHNlbGVjdCh1bG9uZzggYSwgdWxvbmc4IGIsIHNob3J0OCBjKTsKK2xvbmcxNiBfX292bGQgX19jbmZuIHNlbGVjdChsb25nMTYgYSwgbG9uZzE2IGIsIHNob3J0MTYgYyk7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVsb25nMTYgYSwgdWxvbmcxNiBiLCBzaG9ydDE2IGMpOworZmxvYXQgX19vdmxkIF9fY25mbiBzZWxlY3QoZmxvYXQgYSwgZmxvYXQgYiwgc2hvcnQgYyk7CitmbG9hdDIgX19vdmxkIF9fY25mbiBzZWxlY3QoZmxvYXQyIGEsIGZsb2F0MiBiLCBzaG9ydDIgYyk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBzZWxlY3QoZmxvYXQzIGEsIGZsb2F0MyBiLCBzaG9ydDMgYyk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBzZWxlY3QoZmxvYXQ0IGEsIGZsb2F0NCBiLCBzaG9ydDQgYyk7CitmbG9hdDggX19vdmxkIF9fY25mbiBzZWxlY3QoZmxvYXQ4IGEsIGZsb2F0OCBiLCBzaG9ydDggYyk7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGZsb2F0MTYgYSwgZmxvYXQxNiBiLCBzaG9ydDE2IGMpOworY2hhciBfX292bGQgX19jbmZuIHNlbGVjdChjaGFyIGEsIGNoYXIgYiwgaW50IGMpOwordWNoYXIgX19vdmxkIF9fY25mbiBzZWxlY3QodWNoYXIgYSwgdWNoYXIgYiwgaW50IGMpOworY2hhcjIgX19vdmxkIF9fY25mbiBzZWxlY3QoY2hhcjIgYSwgY2hhcjIgYiwgaW50MiBjKTsKK3VjaGFyMiBfX292bGQgX19jbmZuIHNlbGVjdCh1Y2hhcjIgYSwgdWNoYXIyIGIsIGludDIgYyk7CitjaGFyMyBfX292bGQgX19jbmZuIHNlbGVjdChjaGFyMyBhLCBjaGFyMyBiLCBpbnQzIGMpOwordWNoYXIzIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVjaGFyMyBhLCB1Y2hhcjMgYiwgaW50MyBjKTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGNoYXI0IGEsIGNoYXI0IGIsIGludDQgYyk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBzZWxlY3QodWNoYXI0IGEsIHVjaGFyNCBiLCBpbnQ0IGMpOworY2hhcjggX19vdmxkIF9fY25mbiBzZWxlY3QoY2hhcjggYSwgY2hhcjggYiwgaW50OCBjKTsKK3VjaGFyOCBfX292bGQgX19jbmZuIHNlbGVjdCh1Y2hhcjggYSwgdWNoYXI4IGIsIGludDggYyk7CitjaGFyMTYgX19vdmxkIF9fY25mbiBzZWxlY3QoY2hhcjE2IGEsIGNoYXIxNiBiLCBpbnQxNiBjKTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBzZWxlY3QodWNoYXIxNiBhLCB1Y2hhcjE2IGIsIGludDE2IGMpOworc2hvcnQgX19vdmxkIF9fY25mbiBzZWxlY3Qoc2hvcnQgYSwgc2hvcnQgYiwgaW50IGMpOwordXNob3J0IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVzaG9ydCBhLCB1c2hvcnQgYiwgaW50IGMpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHNob3J0MiBhLCBzaG9ydDIgYiwgaW50MiBjKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBzZWxlY3QodXNob3J0MiBhLCB1c2hvcnQyIGIsIGludDIgYyk7CitzaG9ydDMgX19vdmxkIF9fY25mbiBzZWxlY3Qoc2hvcnQzIGEsIHNob3J0MyBiLCBpbnQzIGMpOwordXNob3J0MyBfX292bGQgX19jbmZuIHNlbGVjdCh1c2hvcnQzIGEsIHVzaG9ydDMgYiwgaW50MyBjKTsKK3Nob3J0NCBfX292bGQgX19jbmZuIHNlbGVjdChzaG9ydDQgYSwgc2hvcnQ0IGIsIGludDQgYyk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVzaG9ydDQgYSwgdXNob3J0NCBiLCBpbnQ0IGMpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHNob3J0OCBhLCBzaG9ydDggYiwgaW50OCBjKTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBzZWxlY3QodXNob3J0OCBhLCB1c2hvcnQ4IGIsIGludDggYyk7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHNob3J0MTYgYSwgc2hvcnQxNiBiLCBpbnQxNiBjKTsKK3VzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVzaG9ydDE2IGEsIHVzaG9ydDE2IGIsIGludDE2IGMpOworaW50IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGludCBhLCBpbnQgYiwgaW50IGMpOwordWludCBfX292bGQgX19jbmZuIHNlbGVjdCh1aW50IGEsIHVpbnQgYiwgaW50IGMpOworaW50MiBfX292bGQgX19jbmZuIHNlbGVjdChpbnQyIGEsIGludDIgYiwgaW50MiBjKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVpbnQyIGEsIHVpbnQyIGIsIGludDIgYyk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGludDMgYSwgaW50MyBiLCBpbnQzIGMpOwordWludDMgX19vdmxkIF9fY25mbiBzZWxlY3QodWludDMgYSwgdWludDMgYiwgaW50MyBjKTsKK2ludDQgX19vdmxkIF9fY25mbiBzZWxlY3QoaW50NCBhLCBpbnQ0IGIsIGludDQgYyk7Cit1aW50NCBfX292bGQgX19jbmZuIHNlbGVjdCh1aW50NCBhLCB1aW50NCBiLCBpbnQ0IGMpOworaW50OCBfX292bGQgX19jbmZuIHNlbGVjdChpbnQ4IGEsIGludDggYiwgaW50OCBjKTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVpbnQ4IGEsIHVpbnQ4IGIsIGludDggYyk7CitpbnQxNiBfX292bGQgX19jbmZuIHNlbGVjdChpbnQxNiBhLCBpbnQxNiBiLCBpbnQxNiBjKTsKK3VpbnQxNiBfX292bGQgX19jbmZuIHNlbGVjdCh1aW50MTYgYSwgdWludDE2IGIsIGludDE2IGMpOworbG9uZyBfX292bGQgX19jbmZuIHNlbGVjdChsb25nIGEsIGxvbmcgYiwgaW50IGMpOwordWxvbmcgX19vdmxkIF9fY25mbiBzZWxlY3QodWxvbmcgYSwgdWxvbmcgYiwgaW50IGMpOworbG9uZzIgX19vdmxkIF9fY25mbiBzZWxlY3QobG9uZzIgYSwgbG9uZzIgYiwgaW50MiBjKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIHNlbGVjdCh1bG9uZzIgYSwgdWxvbmcyIGIsIGludDIgYyk7Citsb25nMyBfX292bGQgX19jbmZuIHNlbGVjdChsb25nMyBhLCBsb25nMyBiLCBpbnQzIGMpOwordWxvbmczIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVsb25nMyBhLCB1bG9uZzMgYiwgaW50MyBjKTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGxvbmc0IGEsIGxvbmc0IGIsIGludDQgYyk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBzZWxlY3QodWxvbmc0IGEsIHVsb25nNCBiLCBpbnQ0IGMpOworbG9uZzggX19vdmxkIF9fY25mbiBzZWxlY3QobG9uZzggYSwgbG9uZzggYiwgaW50OCBjKTsKK3Vsb25nOCBfX292bGQgX19jbmZuIHNlbGVjdCh1bG9uZzggYSwgdWxvbmc4IGIsIGludDggYyk7Citsb25nMTYgX19vdmxkIF9fY25mbiBzZWxlY3QobG9uZzE2IGEsIGxvbmcxNiBiLCBpbnQxNiBjKTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBzZWxlY3QodWxvbmcxNiBhLCB1bG9uZzE2IGIsIGludDE2IGMpOworZmxvYXQgX19vdmxkIF9fY25mbiBzZWxlY3QoZmxvYXQgYSwgZmxvYXQgYiwgaW50IGMpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGZsb2F0MiBhLCBmbG9hdDIgYiwgaW50MiBjKTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIHNlbGVjdChmbG9hdDMgYSwgZmxvYXQzIGIsIGludDMgYyk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBzZWxlY3QoZmxvYXQ0IGEsIGZsb2F0NCBiLCBpbnQ0IGMpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGZsb2F0OCBhLCBmbG9hdDggYiwgaW50OCBjKTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBzZWxlY3QoZmxvYXQxNiBhLCBmbG9hdDE2IGIsIGludDE2IGMpOworY2hhciBfX292bGQgX19jbmZuIHNlbGVjdChjaGFyIGEsIGNoYXIgYiwgbG9uZyBjKTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVjaGFyIGEsIHVjaGFyIGIsIGxvbmcgYyk7CitjaGFyMiBfX292bGQgX19jbmZuIHNlbGVjdChjaGFyMiBhLCBjaGFyMiBiLCBsb25nMiBjKTsKK3VjaGFyMiBfX292bGQgX19jbmZuIHNlbGVjdCh1Y2hhcjIgYSwgdWNoYXIyIGIsIGxvbmcyIGMpOworY2hhcjMgX19vdmxkIF9fY25mbiBzZWxlY3QoY2hhcjMgYSwgY2hhcjMgYiwgbG9uZzMgYyk7Cit1Y2hhcjMgX19vdmxkIF9fY25mbiBzZWxlY3QodWNoYXIzIGEsIHVjaGFyMyBiLCBsb25nMyBjKTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGNoYXI0IGEsIGNoYXI0IGIsIGxvbmc0IGMpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVjaGFyNCBhLCB1Y2hhcjQgYiwgbG9uZzQgYyk7CitjaGFyOCBfX292bGQgX19jbmZuIHNlbGVjdChjaGFyOCBhLCBjaGFyOCBiLCBsb25nOCBjKTsKK3VjaGFyOCBfX292bGQgX19jbmZuIHNlbGVjdCh1Y2hhcjggYSwgdWNoYXI4IGIsIGxvbmc4IGMpOworY2hhcjE2IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGNoYXIxNiBhLCBjaGFyMTYgYiwgbG9uZzE2IGMpOwordWNoYXIxNiBfX292bGQgX19jbmZuIHNlbGVjdCh1Y2hhcjE2IGEsIHVjaGFyMTYgYiwgbG9uZzE2IGMpOworc2hvcnQgX19vdmxkIF9fY25mbiBzZWxlY3Qoc2hvcnQgYSwgc2hvcnQgYiwgbG9uZyBjKTsKK3VzaG9ydCBfX292bGQgX19jbmZuIHNlbGVjdCh1c2hvcnQgYSwgdXNob3J0IGIsIGxvbmcgYyk7CitzaG9ydDIgX19vdmxkIF9fY25mbiBzZWxlY3Qoc2hvcnQyIGEsIHNob3J0MiBiLCBsb25nMiBjKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBzZWxlY3QodXNob3J0MiBhLCB1c2hvcnQyIGIsIGxvbmcyIGMpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHNob3J0MyBhLCBzaG9ydDMgYiwgbG9uZzMgYyk7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVzaG9ydDMgYSwgdXNob3J0MyBiLCBsb25nMyBjKTsKK3Nob3J0NCBfX292bGQgX19jbmZuIHNlbGVjdChzaG9ydDQgYSwgc2hvcnQ0IGIsIGxvbmc0IGMpOwordXNob3J0NCBfX292bGQgX19jbmZuIHNlbGVjdCh1c2hvcnQ0IGEsIHVzaG9ydDQgYiwgbG9uZzQgYyk7CitzaG9ydDggX19vdmxkIF9fY25mbiBzZWxlY3Qoc2hvcnQ4IGEsIHNob3J0OCBiLCBsb25nOCBjKTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBzZWxlY3QodXNob3J0OCBhLCB1c2hvcnQ4IGIsIGxvbmc4IGMpOworc2hvcnQxNiBfX292bGQgX19jbmZuIHNlbGVjdChzaG9ydDE2IGEsIHNob3J0MTYgYiwgbG9uZzE2IGMpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBzZWxlY3QodXNob3J0MTYgYSwgdXNob3J0MTYgYiwgbG9uZzE2IGMpOworaW50IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGludCBhLCBpbnQgYiwgbG9uZyBjKTsKK3VpbnQgX19vdmxkIF9fY25mbiBzZWxlY3QodWludCBhLCB1aW50IGIsIGxvbmcgYyk7CitpbnQyIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGludDIgYSwgaW50MiBiLCBsb25nMiBjKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVpbnQyIGEsIHVpbnQyIGIsIGxvbmcyIGMpOworaW50MyBfX292bGQgX19jbmZuIHNlbGVjdChpbnQzIGEsIGludDMgYiwgbG9uZzMgYyk7Cit1aW50MyBfX292bGQgX19jbmZuIHNlbGVjdCh1aW50MyBhLCB1aW50MyBiLCBsb25nMyBjKTsKK2ludDQgX19vdmxkIF9fY25mbiBzZWxlY3QoaW50NCBhLCBpbnQ0IGIsIGxvbmc0IGMpOwordWludDQgX19vdmxkIF9fY25mbiBzZWxlY3QodWludDQgYSwgdWludDQgYiwgbG9uZzQgYyk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGludDggYSwgaW50OCBiLCBsb25nOCBjKTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVpbnQ4IGEsIHVpbnQ4IGIsIGxvbmc4IGMpOworaW50MTYgX19vdmxkIF9fY25mbiBzZWxlY3QoaW50MTYgYSwgaW50MTYgYiwgbG9uZzE2IGMpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVpbnQxNiBhLCB1aW50MTYgYiwgbG9uZzE2IGMpOworbG9uZyBfX292bGQgX19jbmZuIHNlbGVjdChsb25nIGEsIGxvbmcgYiwgbG9uZyBjKTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVsb25nIGEsIHVsb25nIGIsIGxvbmcgYyk7Citsb25nMiBfX292bGQgX19jbmZuIHNlbGVjdChsb25nMiBhLCBsb25nMiBiLCBsb25nMiBjKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIHNlbGVjdCh1bG9uZzIgYSwgdWxvbmcyIGIsIGxvbmcyIGMpOworbG9uZzMgX19vdmxkIF9fY25mbiBzZWxlY3QobG9uZzMgYSwgbG9uZzMgYiwgbG9uZzMgYyk7Cit1bG9uZzMgX19vdmxkIF9fY25mbiBzZWxlY3QodWxvbmczIGEsIHVsb25nMyBiLCBsb25nMyBjKTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGxvbmc0IGEsIGxvbmc0IGIsIGxvbmc0IGMpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVsb25nNCBhLCB1bG9uZzQgYiwgbG9uZzQgYyk7Citsb25nOCBfX292bGQgX19jbmZuIHNlbGVjdChsb25nOCBhLCBsb25nOCBiLCBsb25nOCBjKTsKK3Vsb25nOCBfX292bGQgX19jbmZuIHNlbGVjdCh1bG9uZzggYSwgdWxvbmc4IGIsIGxvbmc4IGMpOworbG9uZzE2IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGxvbmcxNiBhLCBsb25nMTYgYiwgbG9uZzE2IGMpOwordWxvbmcxNiBfX292bGQgX19jbmZuIHNlbGVjdCh1bG9uZzE2IGEsIHVsb25nMTYgYiwgbG9uZzE2IGMpOworZmxvYXQgX19vdmxkIF9fY25mbiBzZWxlY3QoZmxvYXQgYSwgZmxvYXQgYiwgbG9uZyBjKTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIHNlbGVjdChmbG9hdDIgYSwgZmxvYXQyIGIsIGxvbmcyIGMpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGZsb2F0MyBhLCBmbG9hdDMgYiwgbG9uZzMgYyk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBzZWxlY3QoZmxvYXQ0IGEsIGZsb2F0NCBiLCBsb25nNCBjKTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIHNlbGVjdChmbG9hdDggYSwgZmxvYXQ4IGIsIGxvbmc4IGMpOworZmxvYXQxNiBfX292bGQgX19jbmZuIHNlbGVjdChmbG9hdDE2IGEsIGZsb2F0MTYgYiwgbG9uZzE2IGMpOworY2hhciBfX292bGQgX19jbmZuIHNlbGVjdChjaGFyIGEsIGNoYXIgYiwgdWNoYXIgYyk7Cit1Y2hhciBfX292bGQgX19jbmZuIHNlbGVjdCh1Y2hhciBhLCB1Y2hhciBiLCB1Y2hhciBjKTsKK2NoYXIyIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGNoYXIyIGEsIGNoYXIyIGIsIHVjaGFyMiBjKTsKK3VjaGFyMiBfX292bGQgX19jbmZuIHNlbGVjdCh1Y2hhcjIgYSwgdWNoYXIyIGIsIHVjaGFyMiBjKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGNoYXIzIGEsIGNoYXIzIGIsIHVjaGFyMyBjKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIHNlbGVjdCh1Y2hhcjMgYSwgdWNoYXIzIGIsIHVjaGFyMyBjKTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGNoYXI0IGEsIGNoYXI0IGIsIHVjaGFyNCBjKTsKK3VjaGFyNCBfX292bGQgX19jbmZuIHNlbGVjdCh1Y2hhcjQgYSwgdWNoYXI0IGIsIHVjaGFyNCBjKTsKK2NoYXI4IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGNoYXI4IGEsIGNoYXI4IGIsIHVjaGFyOCBjKTsKK3VjaGFyOCBfX292bGQgX19jbmZuIHNlbGVjdCh1Y2hhcjggYSwgdWNoYXI4IGIsIHVjaGFyOCBjKTsKK2NoYXIxNiBfX292bGQgX19jbmZuIHNlbGVjdChjaGFyMTYgYSwgY2hhcjE2IGIsIHVjaGFyMTYgYyk7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVjaGFyMTYgYSwgdWNoYXIxNiBiLCB1Y2hhcjE2IGMpOworc2hvcnQgX19vdmxkIF9fY25mbiBzZWxlY3Qoc2hvcnQgYSwgc2hvcnQgYiwgdWNoYXIgYyk7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBzZWxlY3QodXNob3J0IGEsIHVzaG9ydCBiLCB1Y2hhciBjKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIHNlbGVjdChzaG9ydDIgYSwgc2hvcnQyIGIsIHVjaGFyMiBjKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBzZWxlY3QodXNob3J0MiBhLCB1c2hvcnQyIGIsIHVjaGFyMiBjKTsKK3Nob3J0MyBfX292bGQgX19jbmZuIHNlbGVjdChzaG9ydDMgYSwgc2hvcnQzIGIsIHVjaGFyMyBjKTsKK3VzaG9ydDMgX19vdmxkIF9fY25mbiBzZWxlY3QodXNob3J0MyBhLCB1c2hvcnQzIGIsIHVjaGFyMyBjKTsKK3Nob3J0NCBfX292bGQgX19jbmZuIHNlbGVjdChzaG9ydDQgYSwgc2hvcnQ0IGIsIHVjaGFyNCBjKTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBzZWxlY3QodXNob3J0NCBhLCB1c2hvcnQ0IGIsIHVjaGFyNCBjKTsKK3Nob3J0OCBfX292bGQgX19jbmZuIHNlbGVjdChzaG9ydDggYSwgc2hvcnQ4IGIsIHVjaGFyOCBjKTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBzZWxlY3QodXNob3J0OCBhLCB1c2hvcnQ4IGIsIHVjaGFyOCBjKTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBzZWxlY3Qoc2hvcnQxNiBhLCBzaG9ydDE2IGIsIHVjaGFyMTYgYyk7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIHNlbGVjdCh1c2hvcnQxNiBhLCB1c2hvcnQxNiBiLCB1Y2hhcjE2IGMpOworaW50IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGludCBhLCBpbnQgYiwgdWNoYXIgYyk7Cit1aW50IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVpbnQgYSwgdWludCBiLCB1Y2hhciBjKTsKK2ludDIgX19vdmxkIF9fY25mbiBzZWxlY3QoaW50MiBhLCBpbnQyIGIsIHVjaGFyMiBjKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVpbnQyIGEsIHVpbnQyIGIsIHVjaGFyMiBjKTsKK2ludDMgX19vdmxkIF9fY25mbiBzZWxlY3QoaW50MyBhLCBpbnQzIGIsIHVjaGFyMyBjKTsKK3VpbnQzIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVpbnQzIGEsIHVpbnQzIGIsIHVjaGFyMyBjKTsKK2ludDQgX19vdmxkIF9fY25mbiBzZWxlY3QoaW50NCBhLCBpbnQ0IGIsIHVjaGFyNCBjKTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVpbnQ0IGEsIHVpbnQ0IGIsIHVjaGFyNCBjKTsKK2ludDggX19vdmxkIF9fY25mbiBzZWxlY3QoaW50OCBhLCBpbnQ4IGIsIHVjaGFyOCBjKTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVpbnQ4IGEsIHVpbnQ4IGIsIHVjaGFyOCBjKTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGludDE2IGEsIGludDE2IGIsIHVjaGFyMTYgYyk7Cit1aW50MTYgX19vdmxkIF9fY25mbiBzZWxlY3QodWludDE2IGEsIHVpbnQxNiBiLCB1Y2hhcjE2IGMpOworbG9uZyBfX292bGQgX19jbmZuIHNlbGVjdChsb25nIGEsIGxvbmcgYiwgdWNoYXIgYyk7Cit1bG9uZyBfX292bGQgX19jbmZuIHNlbGVjdCh1bG9uZyBhLCB1bG9uZyBiLCB1Y2hhciBjKTsKK2xvbmcyIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGxvbmcyIGEsIGxvbmcyIGIsIHVjaGFyMiBjKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIHNlbGVjdCh1bG9uZzIgYSwgdWxvbmcyIGIsIHVjaGFyMiBjKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGxvbmczIGEsIGxvbmczIGIsIHVjaGFyMyBjKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIHNlbGVjdCh1bG9uZzMgYSwgdWxvbmczIGIsIHVjaGFyMyBjKTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGxvbmc0IGEsIGxvbmc0IGIsIHVjaGFyNCBjKTsKK3Vsb25nNCBfX292bGQgX19jbmZuIHNlbGVjdCh1bG9uZzQgYSwgdWxvbmc0IGIsIHVjaGFyNCBjKTsKK2xvbmc4IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGxvbmc4IGEsIGxvbmc4IGIsIHVjaGFyOCBjKTsKK3Vsb25nOCBfX292bGQgX19jbmZuIHNlbGVjdCh1bG9uZzggYSwgdWxvbmc4IGIsIHVjaGFyOCBjKTsKK2xvbmcxNiBfX292bGQgX19jbmZuIHNlbGVjdChsb25nMTYgYSwgbG9uZzE2IGIsIHVjaGFyMTYgYyk7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVsb25nMTYgYSwgdWxvbmcxNiBiLCB1Y2hhcjE2IGMpOworZmxvYXQgX19vdmxkIF9fY25mbiBzZWxlY3QoZmxvYXQgYSwgZmxvYXQgYiwgdWNoYXIgYyk7CitmbG9hdDIgX19vdmxkIF9fY25mbiBzZWxlY3QoZmxvYXQyIGEsIGZsb2F0MiBiLCB1Y2hhcjIgYyk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBzZWxlY3QoZmxvYXQzIGEsIGZsb2F0MyBiLCB1Y2hhcjMgYyk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBzZWxlY3QoZmxvYXQ0IGEsIGZsb2F0NCBiLCB1Y2hhcjQgYyk7CitmbG9hdDggX19vdmxkIF9fY25mbiBzZWxlY3QoZmxvYXQ4IGEsIGZsb2F0OCBiLCB1Y2hhcjggYyk7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGZsb2F0MTYgYSwgZmxvYXQxNiBiLCB1Y2hhcjE2IGMpOworY2hhciBfX292bGQgX19jbmZuIHNlbGVjdChjaGFyIGEsIGNoYXIgYiwgdXNob3J0IGMpOwordWNoYXIgX19vdmxkIF9fY25mbiBzZWxlY3QodWNoYXIgYSwgdWNoYXIgYiwgdXNob3J0IGMpOworY2hhcjIgX19vdmxkIF9fY25mbiBzZWxlY3QoY2hhcjIgYSwgY2hhcjIgYiwgdXNob3J0MiBjKTsKK3VjaGFyMiBfX292bGQgX19jbmZuIHNlbGVjdCh1Y2hhcjIgYSwgdWNoYXIyIGIsIHVzaG9ydDIgYyk7CitjaGFyMyBfX292bGQgX19jbmZuIHNlbGVjdChjaGFyMyBhLCBjaGFyMyBiLCB1c2hvcnQzIGMpOwordWNoYXIzIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVjaGFyMyBhLCB1Y2hhcjMgYiwgdXNob3J0MyBjKTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGNoYXI0IGEsIGNoYXI0IGIsIHVzaG9ydDQgYyk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBzZWxlY3QodWNoYXI0IGEsIHVjaGFyNCBiLCB1c2hvcnQ0IGMpOworY2hhcjggX19vdmxkIF9fY25mbiBzZWxlY3QoY2hhcjggYSwgY2hhcjggYiwgdXNob3J0OCBjKTsKK3VjaGFyOCBfX292bGQgX19jbmZuIHNlbGVjdCh1Y2hhcjggYSwgdWNoYXI4IGIsIHVzaG9ydDggYyk7CitjaGFyMTYgX19vdmxkIF9fY25mbiBzZWxlY3QoY2hhcjE2IGEsIGNoYXIxNiBiLCB1c2hvcnQxNiBjKTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBzZWxlY3QodWNoYXIxNiBhLCB1Y2hhcjE2IGIsIHVzaG9ydDE2IGMpOworc2hvcnQgX19vdmxkIF9fY25mbiBzZWxlY3Qoc2hvcnQgYSwgc2hvcnQgYiwgdXNob3J0IGMpOwordXNob3J0IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVzaG9ydCBhLCB1c2hvcnQgYiwgdXNob3J0IGMpOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHNob3J0MiBhLCBzaG9ydDIgYiwgdXNob3J0MiBjKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBzZWxlY3QodXNob3J0MiBhLCB1c2hvcnQyIGIsIHVzaG9ydDIgYyk7CitzaG9ydDMgX19vdmxkIF9fY25mbiBzZWxlY3Qoc2hvcnQzIGEsIHNob3J0MyBiLCB1c2hvcnQzIGMpOwordXNob3J0MyBfX292bGQgX19jbmZuIHNlbGVjdCh1c2hvcnQzIGEsIHVzaG9ydDMgYiwgdXNob3J0MyBjKTsKK3Nob3J0NCBfX292bGQgX19jbmZuIHNlbGVjdChzaG9ydDQgYSwgc2hvcnQ0IGIsIHVzaG9ydDQgYyk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVzaG9ydDQgYSwgdXNob3J0NCBiLCB1c2hvcnQ0IGMpOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHNob3J0OCBhLCBzaG9ydDggYiwgdXNob3J0OCBjKTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBzZWxlY3QodXNob3J0OCBhLCB1c2hvcnQ4IGIsIHVzaG9ydDggYyk7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHNob3J0MTYgYSwgc2hvcnQxNiBiLCB1c2hvcnQxNiBjKTsKK3VzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVzaG9ydDE2IGEsIHVzaG9ydDE2IGIsIHVzaG9ydDE2IGMpOworaW50IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGludCBhLCBpbnQgYiwgdXNob3J0IGMpOwordWludCBfX292bGQgX19jbmZuIHNlbGVjdCh1aW50IGEsIHVpbnQgYiwgdXNob3J0IGMpOworaW50MiBfX292bGQgX19jbmZuIHNlbGVjdChpbnQyIGEsIGludDIgYiwgdXNob3J0MiBjKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVpbnQyIGEsIHVpbnQyIGIsIHVzaG9ydDIgYyk7CitpbnQzIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGludDMgYSwgaW50MyBiLCB1c2hvcnQzIGMpOwordWludDMgX19vdmxkIF9fY25mbiBzZWxlY3QodWludDMgYSwgdWludDMgYiwgdXNob3J0MyBjKTsKK2ludDQgX19vdmxkIF9fY25mbiBzZWxlY3QoaW50NCBhLCBpbnQ0IGIsIHVzaG9ydDQgYyk7Cit1aW50NCBfX292bGQgX19jbmZuIHNlbGVjdCh1aW50NCBhLCB1aW50NCBiLCB1c2hvcnQ0IGMpOworaW50OCBfX292bGQgX19jbmZuIHNlbGVjdChpbnQ4IGEsIGludDggYiwgdXNob3J0OCBjKTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVpbnQ4IGEsIHVpbnQ4IGIsIHVzaG9ydDggYyk7CitpbnQxNiBfX292bGQgX19jbmZuIHNlbGVjdChpbnQxNiBhLCBpbnQxNiBiLCB1c2hvcnQxNiBjKTsKK3VpbnQxNiBfX292bGQgX19jbmZuIHNlbGVjdCh1aW50MTYgYSwgdWludDE2IGIsIHVzaG9ydDE2IGMpOworbG9uZyBfX292bGQgX19jbmZuIHNlbGVjdChsb25nIGEsIGxvbmcgYiwgdXNob3J0IGMpOwordWxvbmcgX19vdmxkIF9fY25mbiBzZWxlY3QodWxvbmcgYSwgdWxvbmcgYiwgdXNob3J0IGMpOworbG9uZzIgX19vdmxkIF9fY25mbiBzZWxlY3QobG9uZzIgYSwgbG9uZzIgYiwgdXNob3J0MiBjKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIHNlbGVjdCh1bG9uZzIgYSwgdWxvbmcyIGIsIHVzaG9ydDIgYyk7Citsb25nMyBfX292bGQgX19jbmZuIHNlbGVjdChsb25nMyBhLCBsb25nMyBiLCB1c2hvcnQzIGMpOwordWxvbmczIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVsb25nMyBhLCB1bG9uZzMgYiwgdXNob3J0MyBjKTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGxvbmc0IGEsIGxvbmc0IGIsIHVzaG9ydDQgYyk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBzZWxlY3QodWxvbmc0IGEsIHVsb25nNCBiLCB1c2hvcnQ0IGMpOworbG9uZzggX19vdmxkIF9fY25mbiBzZWxlY3QobG9uZzggYSwgbG9uZzggYiwgdXNob3J0OCBjKTsKK3Vsb25nOCBfX292bGQgX19jbmZuIHNlbGVjdCh1bG9uZzggYSwgdWxvbmc4IGIsIHVzaG9ydDggYyk7Citsb25nMTYgX19vdmxkIF9fY25mbiBzZWxlY3QobG9uZzE2IGEsIGxvbmcxNiBiLCB1c2hvcnQxNiBjKTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBzZWxlY3QodWxvbmcxNiBhLCB1bG9uZzE2IGIsIHVzaG9ydDE2IGMpOworZmxvYXQgX19vdmxkIF9fY25mbiBzZWxlY3QoZmxvYXQgYSwgZmxvYXQgYiwgdXNob3J0IGMpOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGZsb2F0MiBhLCBmbG9hdDIgYiwgdXNob3J0MiBjKTsKK2Zsb2F0MyBfX292bGQgX19jbmZuIHNlbGVjdChmbG9hdDMgYSwgZmxvYXQzIGIsIHVzaG9ydDMgYyk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBzZWxlY3QoZmxvYXQ0IGEsIGZsb2F0NCBiLCB1c2hvcnQ0IGMpOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGZsb2F0OCBhLCBmbG9hdDggYiwgdXNob3J0OCBjKTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBzZWxlY3QoZmxvYXQxNiBhLCBmbG9hdDE2IGIsIHVzaG9ydDE2IGMpOworY2hhciBfX292bGQgX19jbmZuIHNlbGVjdChjaGFyIGEsIGNoYXIgYiwgdWludCBjKTsKK3VjaGFyIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVjaGFyIGEsIHVjaGFyIGIsIHVpbnQgYyk7CitjaGFyMiBfX292bGQgX19jbmZuIHNlbGVjdChjaGFyMiBhLCBjaGFyMiBiLCB1aW50MiBjKTsKK3VjaGFyMiBfX292bGQgX19jbmZuIHNlbGVjdCh1Y2hhcjIgYSwgdWNoYXIyIGIsIHVpbnQyIGMpOworY2hhcjMgX19vdmxkIF9fY25mbiBzZWxlY3QoY2hhcjMgYSwgY2hhcjMgYiwgdWludDMgYyk7Cit1Y2hhcjMgX19vdmxkIF9fY25mbiBzZWxlY3QodWNoYXIzIGEsIHVjaGFyMyBiLCB1aW50MyBjKTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGNoYXI0IGEsIGNoYXI0IGIsIHVpbnQ0IGMpOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVjaGFyNCBhLCB1Y2hhcjQgYiwgdWludDQgYyk7CitjaGFyOCBfX292bGQgX19jbmZuIHNlbGVjdChjaGFyOCBhLCBjaGFyOCBiLCB1aW50OCBjKTsKK3VjaGFyOCBfX292bGQgX19jbmZuIHNlbGVjdCh1Y2hhcjggYSwgdWNoYXI4IGIsIHVpbnQ4IGMpOworY2hhcjE2IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGNoYXIxNiBhLCBjaGFyMTYgYiwgdWludDE2IGMpOwordWNoYXIxNiBfX292bGQgX19jbmZuIHNlbGVjdCh1Y2hhcjE2IGEsIHVjaGFyMTYgYiwgdWludDE2IGMpOworc2hvcnQgX19vdmxkIF9fY25mbiBzZWxlY3Qoc2hvcnQgYSwgc2hvcnQgYiwgdWludCBjKTsKK3VzaG9ydCBfX292bGQgX19jbmZuIHNlbGVjdCh1c2hvcnQgYSwgdXNob3J0IGIsIHVpbnQgYyk7CitzaG9ydDIgX19vdmxkIF9fY25mbiBzZWxlY3Qoc2hvcnQyIGEsIHNob3J0MiBiLCB1aW50MiBjKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBzZWxlY3QodXNob3J0MiBhLCB1c2hvcnQyIGIsIHVpbnQyIGMpOworc2hvcnQzIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHNob3J0MyBhLCBzaG9ydDMgYiwgdWludDMgYyk7Cit1c2hvcnQzIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVzaG9ydDMgYSwgdXNob3J0MyBiLCB1aW50MyBjKTsKK3Nob3J0NCBfX292bGQgX19jbmZuIHNlbGVjdChzaG9ydDQgYSwgc2hvcnQ0IGIsIHVpbnQ0IGMpOwordXNob3J0NCBfX292bGQgX19jbmZuIHNlbGVjdCh1c2hvcnQ0IGEsIHVzaG9ydDQgYiwgdWludDQgYyk7CitzaG9ydDggX19vdmxkIF9fY25mbiBzZWxlY3Qoc2hvcnQ4IGEsIHNob3J0OCBiLCB1aW50OCBjKTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBzZWxlY3QodXNob3J0OCBhLCB1c2hvcnQ4IGIsIHVpbnQ4IGMpOworc2hvcnQxNiBfX292bGQgX19jbmZuIHNlbGVjdChzaG9ydDE2IGEsIHNob3J0MTYgYiwgdWludDE2IGMpOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBzZWxlY3QodXNob3J0MTYgYSwgdXNob3J0MTYgYiwgdWludDE2IGMpOworaW50IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGludCBhLCBpbnQgYiwgdWludCBjKTsKK3VpbnQgX19vdmxkIF9fY25mbiBzZWxlY3QodWludCBhLCB1aW50IGIsIHVpbnQgYyk7CitpbnQyIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGludDIgYSwgaW50MiBiLCB1aW50MiBjKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVpbnQyIGEsIHVpbnQyIGIsIHVpbnQyIGMpOworaW50MyBfX292bGQgX19jbmZuIHNlbGVjdChpbnQzIGEsIGludDMgYiwgdWludDMgYyk7Cit1aW50MyBfX292bGQgX19jbmZuIHNlbGVjdCh1aW50MyBhLCB1aW50MyBiLCB1aW50MyBjKTsKK2ludDQgX19vdmxkIF9fY25mbiBzZWxlY3QoaW50NCBhLCBpbnQ0IGIsIHVpbnQ0IGMpOwordWludDQgX19vdmxkIF9fY25mbiBzZWxlY3QodWludDQgYSwgdWludDQgYiwgdWludDQgYyk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGludDggYSwgaW50OCBiLCB1aW50OCBjKTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVpbnQ4IGEsIHVpbnQ4IGIsIHVpbnQ4IGMpOworaW50MTYgX19vdmxkIF9fY25mbiBzZWxlY3QoaW50MTYgYSwgaW50MTYgYiwgdWludDE2IGMpOwordWludDE2IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVpbnQxNiBhLCB1aW50MTYgYiwgdWludDE2IGMpOworbG9uZyBfX292bGQgX19jbmZuIHNlbGVjdChsb25nIGEsIGxvbmcgYiwgdWludCBjKTsKK3Vsb25nIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVsb25nIGEsIHVsb25nIGIsIHVpbnQgYyk7Citsb25nMiBfX292bGQgX19jbmZuIHNlbGVjdChsb25nMiBhLCBsb25nMiBiLCB1aW50MiBjKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIHNlbGVjdCh1bG9uZzIgYSwgdWxvbmcyIGIsIHVpbnQyIGMpOworbG9uZzMgX19vdmxkIF9fY25mbiBzZWxlY3QobG9uZzMgYSwgbG9uZzMgYiwgdWludDMgYyk7Cit1bG9uZzMgX19vdmxkIF9fY25mbiBzZWxlY3QodWxvbmczIGEsIHVsb25nMyBiLCB1aW50MyBjKTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGxvbmc0IGEsIGxvbmc0IGIsIHVpbnQ0IGMpOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVsb25nNCBhLCB1bG9uZzQgYiwgdWludDQgYyk7Citsb25nOCBfX292bGQgX19jbmZuIHNlbGVjdChsb25nOCBhLCBsb25nOCBiLCB1aW50OCBjKTsKK3Vsb25nOCBfX292bGQgX19jbmZuIHNlbGVjdCh1bG9uZzggYSwgdWxvbmc4IGIsIHVpbnQ4IGMpOworbG9uZzE2IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGxvbmcxNiBhLCBsb25nMTYgYiwgdWludDE2IGMpOwordWxvbmcxNiBfX292bGQgX19jbmZuIHNlbGVjdCh1bG9uZzE2IGEsIHVsb25nMTYgYiwgdWludDE2IGMpOworZmxvYXQgX19vdmxkIF9fY25mbiBzZWxlY3QoZmxvYXQgYSwgZmxvYXQgYiwgdWludCBjKTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIHNlbGVjdChmbG9hdDIgYSwgZmxvYXQyIGIsIHVpbnQyIGMpOworZmxvYXQzIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGZsb2F0MyBhLCBmbG9hdDMgYiwgdWludDMgYyk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBzZWxlY3QoZmxvYXQ0IGEsIGZsb2F0NCBiLCB1aW50NCBjKTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIHNlbGVjdChmbG9hdDggYSwgZmxvYXQ4IGIsIHVpbnQ4IGMpOworZmxvYXQxNiBfX292bGQgX19jbmZuIHNlbGVjdChmbG9hdDE2IGEsIGZsb2F0MTYgYiwgdWludDE2IGMpOworY2hhciBfX292bGQgX19jbmZuIHNlbGVjdChjaGFyIGEsIGNoYXIgYiwgdWxvbmcgYyk7Cit1Y2hhciBfX292bGQgX19jbmZuIHNlbGVjdCh1Y2hhciBhLCB1Y2hhciBiLCB1bG9uZyBjKTsKK2NoYXIyIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGNoYXIyIGEsIGNoYXIyIGIsIHVsb25nMiBjKTsKK3VjaGFyMiBfX292bGQgX19jbmZuIHNlbGVjdCh1Y2hhcjIgYSwgdWNoYXIyIGIsIHVsb25nMiBjKTsKK2NoYXIzIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGNoYXIzIGEsIGNoYXIzIGIsIHVsb25nMyBjKTsKK3VjaGFyMyBfX292bGQgX19jbmZuIHNlbGVjdCh1Y2hhcjMgYSwgdWNoYXIzIGIsIHVsb25nMyBjKTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGNoYXI0IGEsIGNoYXI0IGIsIHVsb25nNCBjKTsKK3VjaGFyNCBfX292bGQgX19jbmZuIHNlbGVjdCh1Y2hhcjQgYSwgdWNoYXI0IGIsIHVsb25nNCBjKTsKK2NoYXI4IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGNoYXI4IGEsIGNoYXI4IGIsIHVsb25nOCBjKTsKK3VjaGFyOCBfX292bGQgX19jbmZuIHNlbGVjdCh1Y2hhcjggYSwgdWNoYXI4IGIsIHVsb25nOCBjKTsKK2NoYXIxNiBfX292bGQgX19jbmZuIHNlbGVjdChjaGFyMTYgYSwgY2hhcjE2IGIsIHVsb25nMTYgYyk7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVjaGFyMTYgYSwgdWNoYXIxNiBiLCB1bG9uZzE2IGMpOworc2hvcnQgX19vdmxkIF9fY25mbiBzZWxlY3Qoc2hvcnQgYSwgc2hvcnQgYiwgdWxvbmcgYyk7Cit1c2hvcnQgX19vdmxkIF9fY25mbiBzZWxlY3QodXNob3J0IGEsIHVzaG9ydCBiLCB1bG9uZyBjKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIHNlbGVjdChzaG9ydDIgYSwgc2hvcnQyIGIsIHVsb25nMiBjKTsKK3VzaG9ydDIgX19vdmxkIF9fY25mbiBzZWxlY3QodXNob3J0MiBhLCB1c2hvcnQyIGIsIHVsb25nMiBjKTsKK3Nob3J0MyBfX292bGQgX19jbmZuIHNlbGVjdChzaG9ydDMgYSwgc2hvcnQzIGIsIHVsb25nMyBjKTsKK3VzaG9ydDMgX19vdmxkIF9fY25mbiBzZWxlY3QodXNob3J0MyBhLCB1c2hvcnQzIGIsIHVsb25nMyBjKTsKK3Nob3J0NCBfX292bGQgX19jbmZuIHNlbGVjdChzaG9ydDQgYSwgc2hvcnQ0IGIsIHVsb25nNCBjKTsKK3VzaG9ydDQgX19vdmxkIF9fY25mbiBzZWxlY3QodXNob3J0NCBhLCB1c2hvcnQ0IGIsIHVsb25nNCBjKTsKK3Nob3J0OCBfX292bGQgX19jbmZuIHNlbGVjdChzaG9ydDggYSwgc2hvcnQ4IGIsIHVsb25nOCBjKTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBzZWxlY3QodXNob3J0OCBhLCB1c2hvcnQ4IGIsIHVsb25nOCBjKTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBzZWxlY3Qoc2hvcnQxNiBhLCBzaG9ydDE2IGIsIHVsb25nMTYgYyk7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIHNlbGVjdCh1c2hvcnQxNiBhLCB1c2hvcnQxNiBiLCB1bG9uZzE2IGMpOworaW50IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGludCBhLCBpbnQgYiwgdWxvbmcgYyk7Cit1aW50IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVpbnQgYSwgdWludCBiLCB1bG9uZyBjKTsKK2ludDIgX19vdmxkIF9fY25mbiBzZWxlY3QoaW50MiBhLCBpbnQyIGIsIHVsb25nMiBjKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVpbnQyIGEsIHVpbnQyIGIsIHVsb25nMiBjKTsKK2ludDMgX19vdmxkIF9fY25mbiBzZWxlY3QoaW50MyBhLCBpbnQzIGIsIHVsb25nMyBjKTsKK3VpbnQzIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVpbnQzIGEsIHVpbnQzIGIsIHVsb25nMyBjKTsKK2ludDQgX19vdmxkIF9fY25mbiBzZWxlY3QoaW50NCBhLCBpbnQ0IGIsIHVsb25nNCBjKTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVpbnQ0IGEsIHVpbnQ0IGIsIHVsb25nNCBjKTsKK2ludDggX19vdmxkIF9fY25mbiBzZWxlY3QoaW50OCBhLCBpbnQ4IGIsIHVsb25nOCBjKTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVpbnQ4IGEsIHVpbnQ4IGIsIHVsb25nOCBjKTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGludDE2IGEsIGludDE2IGIsIHVsb25nMTYgYyk7Cit1aW50MTYgX19vdmxkIF9fY25mbiBzZWxlY3QodWludDE2IGEsIHVpbnQxNiBiLCB1bG9uZzE2IGMpOworbG9uZyBfX292bGQgX19jbmZuIHNlbGVjdChsb25nIGEsIGxvbmcgYiwgdWxvbmcgYyk7Cit1bG9uZyBfX292bGQgX19jbmZuIHNlbGVjdCh1bG9uZyBhLCB1bG9uZyBiLCB1bG9uZyBjKTsKK2xvbmcyIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGxvbmcyIGEsIGxvbmcyIGIsIHVsb25nMiBjKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIHNlbGVjdCh1bG9uZzIgYSwgdWxvbmcyIGIsIHVsb25nMiBjKTsKK2xvbmczIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGxvbmczIGEsIGxvbmczIGIsIHVsb25nMyBjKTsKK3Vsb25nMyBfX292bGQgX19jbmZuIHNlbGVjdCh1bG9uZzMgYSwgdWxvbmczIGIsIHVsb25nMyBjKTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGxvbmc0IGEsIGxvbmc0IGIsIHVsb25nNCBjKTsKK3Vsb25nNCBfX292bGQgX19jbmZuIHNlbGVjdCh1bG9uZzQgYSwgdWxvbmc0IGIsIHVsb25nNCBjKTsKK2xvbmc4IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGxvbmc4IGEsIGxvbmc4IGIsIHVsb25nOCBjKTsKK3Vsb25nOCBfX292bGQgX19jbmZuIHNlbGVjdCh1bG9uZzggYSwgdWxvbmc4IGIsIHVsb25nOCBjKTsKK2xvbmcxNiBfX292bGQgX19jbmZuIHNlbGVjdChsb25nMTYgYSwgbG9uZzE2IGIsIHVsb25nMTYgYyk7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KHVsb25nMTYgYSwgdWxvbmcxNiBiLCB1bG9uZzE2IGMpOworZmxvYXQgX19vdmxkIF9fY25mbiBzZWxlY3QoZmxvYXQgYSwgZmxvYXQgYiwgdWxvbmcgYyk7CitmbG9hdDIgX19vdmxkIF9fY25mbiBzZWxlY3QoZmxvYXQyIGEsIGZsb2F0MiBiLCB1bG9uZzIgYyk7CitmbG9hdDMgX19vdmxkIF9fY25mbiBzZWxlY3QoZmxvYXQzIGEsIGZsb2F0MyBiLCB1bG9uZzMgYyk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBzZWxlY3QoZmxvYXQ0IGEsIGZsb2F0NCBiLCB1bG9uZzQgYyk7CitmbG9hdDggX19vdmxkIF9fY25mbiBzZWxlY3QoZmxvYXQ4IGEsIGZsb2F0OCBiLCB1bG9uZzggYyk7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGZsb2F0MTYgYSwgZmxvYXQxNiBiLCB1bG9uZzE2IGMpOworI2lmZGVmIGNsX2tocl9mcDY0Citkb3VibGUgX19vdmxkIF9fY25mbiBzZWxlY3QoZG91YmxlIGEsIGRvdWJsZSBiLCBsb25nIGMpOworZG91YmxlMiBfX292bGQgX19jbmZuIHNlbGVjdChkb3VibGUyIGEsIGRvdWJsZTIgYiwgbG9uZzIgYyk7Citkb3VibGUzIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGRvdWJsZTMgYSwgZG91YmxlMyBiLCBsb25nMyBjKTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBzZWxlY3QoZG91YmxlNCBhLCBkb3VibGU0IGIsIGxvbmc0IGMpOworZG91YmxlOCBfX292bGQgX19jbmZuIHNlbGVjdChkb3VibGU4IGEsIGRvdWJsZTggYiwgbG9uZzggYyk7Citkb3VibGUxNiBfX292bGQgX19jbmZuIHNlbGVjdChkb3VibGUxNiBhLCBkb3VibGUxNiBiLCBsb25nMTYgYyk7Citkb3VibGUgX19vdmxkIF9fY25mbiBzZWxlY3QoZG91YmxlIGEsIGRvdWJsZSBiLCB1bG9uZyBjKTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBzZWxlY3QoZG91YmxlMiBhLCBkb3VibGUyIGIsIHVsb25nMiBjKTsKK2RvdWJsZTMgX19vdmxkIF9fY25mbiBzZWxlY3QoZG91YmxlMyBhLCBkb3VibGUzIGIsIHVsb25nMyBjKTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBzZWxlY3QoZG91YmxlNCBhLCBkb3VibGU0IGIsIHVsb25nNCBjKTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBzZWxlY3QoZG91YmxlOCBhLCBkb3VibGU4IGIsIHVsb25nOCBjKTsKK2RvdWJsZTE2IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGRvdWJsZTE2IGEsIGRvdWJsZTE2IGIsIHVsb25nMTYgYyk7CisjZW5kaWYgLy9jbF9raHJfZnA2NAorI2lmZGVmIGNsX2tocl9mcDE2CitoYWxmIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGhhbGYgYSwgaGFsZiBiLCBzaG9ydCBjKTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGhhbGYyIGEsIGhhbGYyIGIsIHNob3J0MiBjKTsKK2hhbGYzIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGhhbGYzIGEsIGhhbGYzIGIsIHNob3J0MyBjKTsKK2hhbGY0IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGhhbGY0IGEsIGhhbGY0IGIsIHNob3J0NCBjKTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGhhbGY4IGEsIGhhbGY4IGIsIHNob3J0OCBjKTsKK2hhbGYxNiBfX292bGQgX19jbmZuIHNlbGVjdChoYWxmMTYgYSwgaGFsZjE2IGIsIHNob3J0MTYgYyk7CitoYWxmIF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGhhbGYgYSwgaGFsZiBiLCB1c2hvcnQgYyk7CitoYWxmMiBfX292bGQgX19jbmZuIHNlbGVjdChoYWxmMiBhLCBoYWxmMiBiLCB1c2hvcnQyIGMpOworaGFsZjMgX19vdmxkIF9fY25mbiBzZWxlY3QoaGFsZjMgYSwgaGFsZjMgYiwgdXNob3J0MyBjKTsKK2hhbGY0IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGhhbGY0IGEsIGhhbGY0IGIsIHVzaG9ydDQgYyk7CitoYWxmOCBfX292bGQgX19jbmZuIHNlbGVjdChoYWxmOCBhLCBoYWxmOCBiLCB1c2hvcnQ4IGMpOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gc2VsZWN0KGhhbGYxNiBhLCBoYWxmMTYgYiwgdXNob3J0MTYgYyk7CisjZW5kaWYgLy9jbF9raHJfZnAxNgorCisvLyBPcGVuQ0wgdjEuMSBzNi4xMS43LCB2MS4yIHM2LjEyLjcsIHYyLjAgczYuMTMuNyAtIFZlY3RvciBEYXRhIExvYWQgYW5kIFN0b3JlIEZ1bmN0aW9ucworLy8gT3BlbkNMIGV4dGVuc2lvbnMgdjEuMSBzOS42LjYsIHYxLjIgczkuNS42LCB2Mi4wIHM5LjQuNiAtIFZlY3RvciBEYXRhIExvYWQgYW5kIFN0b3JlIEZ1bmN0aW9ucyBmb3IgSGFsZiBUeXBlCisvKioKKyAqIFVzZSBnZW5lcmljIHR5cGUgZ2VudHlwZSB0byBpbmRpY2F0ZSB0aGUgYnVpbHQtaW4gZGF0YSB0eXBlcworICogY2hhciwgdWNoYXIsIHNob3J0LCB1c2hvcnQsIGludCwgdWludCwgbG9uZywgdWxvbmcsIGZsb2F0LAorICogZG91YmxlIG9yIGhhbGYuCisgKgorICogdmxvYWRuIHJldHVybiBzaXplb2YgKGdlbnR5cGVuKSBieXRlcyBvZiBkYXRhIHJlYWQgZnJvbSBhZGRyZXNzIChwICsgKG9mZnNldCAqIG4pKS4KKyAqCisgKiB2c3RvcmVuIHdyaXRlIHNpemVvZiAoZ2VudHlwZW4pIGJ5dGVzIGdpdmVuIGJ5IGRhdGEgdG8gYWRkcmVzcyAocCArIChvZmZzZXQgKiBuKSkuCisgKgorICogVGhlIGFkZHJlc3MgY29tcHV0ZWQgYXMgKHAgKyAob2Zmc2V0ICogbikpIG11c3QgYmUgCisgKiA4LWJpdCBhbGlnbmVkIGlmIGdlbnR5cGUgaXMgY2hhciwgdWNoYXI7CisgKiAxNi1iaXQgYWxpZ25lZCBpZiBnZW50eXBlIGlzIHNob3J0LCB1c2hvcnQsIGhhbGY7CisgKiAzMi1iaXQgYWxpZ25lZCBpZiBnZW50eXBlIGlzIGludCwgdWludCwgZmxvYXQ7CisgKiA2NC1iaXQgYWxpZ25lZCBpZiBnZW50eXBlIGlzIGxvbmcsIHVsb25nLCBkb3VibGUuCisgKi8KKworY2hhcjIgX19vdmxkIHZsb2FkMihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2NvbnN0YW50IGNoYXIgKnApOwordWNoYXIyIF9fb3ZsZCB2bG9hZDIoc2l6ZV90IG9mZnNldCwgY29uc3QgX19jb25zdGFudCB1Y2hhciAqcCk7CitzaG9ydDIgX19vdmxkIHZsb2FkMihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2NvbnN0YW50IHNob3J0ICpwKTsKK3VzaG9ydDIgX19vdmxkIHZsb2FkMihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2NvbnN0YW50IHVzaG9ydCAqcCk7CitpbnQyIF9fb3ZsZCB2bG9hZDIoc2l6ZV90IG9mZnNldCwgY29uc3QgX19jb25zdGFudCBpbnQgKnApOwordWludDIgX19vdmxkIHZsb2FkMihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2NvbnN0YW50IHVpbnQgKnApOworbG9uZzIgX19vdmxkIHZsb2FkMihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2NvbnN0YW50IGxvbmcgKnApOwordWxvbmcyIF9fb3ZsZCB2bG9hZDIoc2l6ZV90IG9mZnNldCwgY29uc3QgX19jb25zdGFudCB1bG9uZyAqcCk7CitmbG9hdDIgX19vdmxkIHZsb2FkMihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2NvbnN0YW50IGZsb2F0ICpwKTsKK2NoYXIzIF9fb3ZsZCB2bG9hZDMoc2l6ZV90IG9mZnNldCwgY29uc3QgX19jb25zdGFudCBjaGFyICpwKTsKK3VjaGFyMyBfX292bGQgdmxvYWQzKHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fY29uc3RhbnQgdWNoYXIgKnApOworc2hvcnQzIF9fb3ZsZCB2bG9hZDMoc2l6ZV90IG9mZnNldCwgY29uc3QgX19jb25zdGFudCBzaG9ydCAqcCk7Cit1c2hvcnQzIF9fb3ZsZCB2bG9hZDMoc2l6ZV90IG9mZnNldCwgY29uc3QgX19jb25zdGFudCB1c2hvcnQgKnApOworaW50MyBfX292bGQgdmxvYWQzKHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fY29uc3RhbnQgaW50ICpwKTsKK3VpbnQzIF9fb3ZsZCB2bG9hZDMoc2l6ZV90IG9mZnNldCwgY29uc3QgX19jb25zdGFudCB1aW50ICpwKTsKK2xvbmczIF9fb3ZsZCB2bG9hZDMoc2l6ZV90IG9mZnNldCwgY29uc3QgX19jb25zdGFudCBsb25nICpwKTsKK3Vsb25nMyBfX292bGQgdmxvYWQzKHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fY29uc3RhbnQgdWxvbmcgKnApOworZmxvYXQzIF9fb3ZsZCB2bG9hZDMoc2l6ZV90IG9mZnNldCwgY29uc3QgX19jb25zdGFudCBmbG9hdCAqcCk7CitjaGFyNCBfX292bGQgdmxvYWQ0KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fY29uc3RhbnQgY2hhciAqcCk7Cit1Y2hhcjQgX19vdmxkIHZsb2FkNChzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2NvbnN0YW50IHVjaGFyICpwKTsKK3Nob3J0NCBfX292bGQgdmxvYWQ0KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fY29uc3RhbnQgc2hvcnQgKnApOwordXNob3J0NCBfX292bGQgdmxvYWQ0KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fY29uc3RhbnQgdXNob3J0ICpwKTsKK2ludDQgX19vdmxkIHZsb2FkNChzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2NvbnN0YW50IGludCAqcCk7Cit1aW50NCBfX292bGQgdmxvYWQ0KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fY29uc3RhbnQgdWludCAqcCk7Citsb25nNCBfX292bGQgdmxvYWQ0KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fY29uc3RhbnQgbG9uZyAqcCk7Cit1bG9uZzQgX19vdmxkIHZsb2FkNChzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2NvbnN0YW50IHVsb25nICpwKTsKK2Zsb2F0NCBfX292bGQgdmxvYWQ0KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fY29uc3RhbnQgZmxvYXQgKnApOworY2hhcjggX19vdmxkIHZsb2FkOChzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2NvbnN0YW50IGNoYXIgKnApOwordWNoYXI4IF9fb3ZsZCB2bG9hZDgoc2l6ZV90IG9mZnNldCwgY29uc3QgX19jb25zdGFudCB1Y2hhciAqcCk7CitzaG9ydDggX19vdmxkIHZsb2FkOChzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2NvbnN0YW50IHNob3J0ICpwKTsKK3VzaG9ydDggX19vdmxkIHZsb2FkOChzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2NvbnN0YW50IHVzaG9ydCAqcCk7CitpbnQ4IF9fb3ZsZCB2bG9hZDgoc2l6ZV90IG9mZnNldCwgY29uc3QgX19jb25zdGFudCBpbnQgKnApOwordWludDggX19vdmxkIHZsb2FkOChzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2NvbnN0YW50IHVpbnQgKnApOworbG9uZzggX19vdmxkIHZsb2FkOChzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2NvbnN0YW50IGxvbmcgKnApOwordWxvbmc4IF9fb3ZsZCB2bG9hZDgoc2l6ZV90IG9mZnNldCwgY29uc3QgX19jb25zdGFudCB1bG9uZyAqcCk7CitmbG9hdDggX19vdmxkIHZsb2FkOChzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2NvbnN0YW50IGZsb2F0ICpwKTsKK2NoYXIxNiBfX292bGQgdmxvYWQxNihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2NvbnN0YW50IGNoYXIgKnApOwordWNoYXIxNiBfX292bGQgdmxvYWQxNihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2NvbnN0YW50IHVjaGFyICpwKTsKK3Nob3J0MTYgX19vdmxkIHZsb2FkMTYoc2l6ZV90IG9mZnNldCwgY29uc3QgX19jb25zdGFudCBzaG9ydCAqcCk7Cit1c2hvcnQxNiBfX292bGQgdmxvYWQxNihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2NvbnN0YW50IHVzaG9ydCAqcCk7CitpbnQxNiBfX292bGQgdmxvYWQxNihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2NvbnN0YW50IGludCAqcCk7Cit1aW50MTYgX19vdmxkIHZsb2FkMTYoc2l6ZV90IG9mZnNldCwgY29uc3QgX19jb25zdGFudCB1aW50ICpwKTsKK2xvbmcxNiBfX292bGQgdmxvYWQxNihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2NvbnN0YW50IGxvbmcgKnApOwordWxvbmcxNiBfX292bGQgdmxvYWQxNihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2NvbnN0YW50IHVsb25nICpwKTsKK2Zsb2F0MTYgX19vdmxkIHZsb2FkMTYoc2l6ZV90IG9mZnNldCwgY29uc3QgX19jb25zdGFudCBmbG9hdCAqcCk7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2RvdWJsZTIgX19vdmxkIHZsb2FkMihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2NvbnN0YW50IGRvdWJsZSAqcCk7Citkb3VibGUzIF9fb3ZsZCB2bG9hZDMoc2l6ZV90IG9mZnNldCwgY29uc3QgX19jb25zdGFudCBkb3VibGUgKnApOworZG91YmxlNCBfX292bGQgdmxvYWQ0KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fY29uc3RhbnQgZG91YmxlICpwKTsKK2RvdWJsZTggX19vdmxkIHZsb2FkOChzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2NvbnN0YW50IGRvdWJsZSAqcCk7Citkb3VibGUxNiBfX292bGQgdmxvYWQxNihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2NvbnN0YW50IGRvdWJsZSAqcCk7CisjZW5kaWYgLy9jbF9raHJfZnA2NAorCisjaWZkZWYgY2xfa2hyX2ZwMTYKK2hhbGYgX19vdmxkIHZsb2FkKHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fY29uc3RhbnQgaGFsZiAqcCk7CitoYWxmMiBfX292bGQgdmxvYWQyKHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fY29uc3RhbnQgaGFsZiAqcCk7CitoYWxmMyBfX292bGQgdmxvYWQzKHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fY29uc3RhbnQgaGFsZiAqcCk7CitoYWxmNCBfX292bGQgdmxvYWQ0KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fY29uc3RhbnQgaGFsZiAqcCk7CitoYWxmOCBfX292bGQgdmxvYWQ4KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fY29uc3RhbnQgaGFsZiAqcCk7CitoYWxmMTYgX19vdmxkIHZsb2FkMTYoc2l6ZV90IG9mZnNldCwgY29uc3QgX19jb25zdGFudCBoYWxmICpwKTsKKyNlbmRpZiAvL2NsX2tocl9mcDE2CisKKyNpZiBfX09QRU5DTF9DX1ZFUlNJT05fXyA+PSBDTF9WRVJTSU9OXzJfMAorY2hhcjIgX19vdmxkIHZsb2FkMihzaXplX3Qgb2Zmc2V0LCBjb25zdCBjaGFyICpwKTsKK3VjaGFyMiBfX292bGQgdmxvYWQyKHNpemVfdCBvZmZzZXQsIGNvbnN0IHVjaGFyICpwKTsKK3Nob3J0MiBfX292bGQgdmxvYWQyKHNpemVfdCBvZmZzZXQsIGNvbnN0IHNob3J0ICpwKTsKK3VzaG9ydDIgX19vdmxkIHZsb2FkMihzaXplX3Qgb2Zmc2V0LCBjb25zdCB1c2hvcnQgKnApOworaW50MiBfX292bGQgdmxvYWQyKHNpemVfdCBvZmZzZXQsIGNvbnN0IGludCAqcCk7Cit1aW50MiBfX292bGQgdmxvYWQyKHNpemVfdCBvZmZzZXQsIGNvbnN0IHVpbnQgKnApOworbG9uZzIgX19vdmxkIHZsb2FkMihzaXplX3Qgb2Zmc2V0LCBjb25zdCBsb25nICpwKTsKK3Vsb25nMiBfX292bGQgdmxvYWQyKHNpemVfdCBvZmZzZXQsIGNvbnN0IHVsb25nICpwKTsKK2Zsb2F0MiBfX292bGQgdmxvYWQyKHNpemVfdCBvZmZzZXQsIGNvbnN0IGZsb2F0ICpwKTsKK2NoYXIzIF9fb3ZsZCB2bG9hZDMoc2l6ZV90IG9mZnNldCwgY29uc3QgY2hhciAqcCk7Cit1Y2hhcjMgX19vdmxkIHZsb2FkMyhzaXplX3Qgb2Zmc2V0LCBjb25zdCB1Y2hhciAqcCk7CitzaG9ydDMgX19vdmxkIHZsb2FkMyhzaXplX3Qgb2Zmc2V0LCBjb25zdCBzaG9ydCAqcCk7Cit1c2hvcnQzIF9fb3ZsZCB2bG9hZDMoc2l6ZV90IG9mZnNldCwgY29uc3QgdXNob3J0ICpwKTsKK2ludDMgX19vdmxkIHZsb2FkMyhzaXplX3Qgb2Zmc2V0LCBjb25zdCBpbnQgKnApOwordWludDMgX19vdmxkIHZsb2FkMyhzaXplX3Qgb2Zmc2V0LCBjb25zdCB1aW50ICpwKTsKK2xvbmczIF9fb3ZsZCB2bG9hZDMoc2l6ZV90IG9mZnNldCwgY29uc3QgbG9uZyAqcCk7Cit1bG9uZzMgX19vdmxkIHZsb2FkMyhzaXplX3Qgb2Zmc2V0LCBjb25zdCB1bG9uZyAqcCk7CitmbG9hdDMgX19vdmxkIHZsb2FkMyhzaXplX3Qgb2Zmc2V0LCBjb25zdCBmbG9hdCAqcCk7CitjaGFyNCBfX292bGQgdmxvYWQ0KHNpemVfdCBvZmZzZXQsIGNvbnN0IGNoYXIgKnApOwordWNoYXI0IF9fb3ZsZCB2bG9hZDQoc2l6ZV90IG9mZnNldCwgY29uc3QgdWNoYXIgKnApOworc2hvcnQ0IF9fb3ZsZCB2bG9hZDQoc2l6ZV90IG9mZnNldCwgY29uc3Qgc2hvcnQgKnApOwordXNob3J0NCBfX292bGQgdmxvYWQ0KHNpemVfdCBvZmZzZXQsIGNvbnN0IHVzaG9ydCAqcCk7CitpbnQ0IF9fb3ZsZCB2bG9hZDQoc2l6ZV90IG9mZnNldCwgY29uc3QgaW50ICpwKTsKK3VpbnQ0IF9fb3ZsZCB2bG9hZDQoc2l6ZV90IG9mZnNldCwgY29uc3QgdWludCAqcCk7Citsb25nNCBfX292bGQgdmxvYWQ0KHNpemVfdCBvZmZzZXQsIGNvbnN0IGxvbmcgKnApOwordWxvbmc0IF9fb3ZsZCB2bG9hZDQoc2l6ZV90IG9mZnNldCwgY29uc3QgdWxvbmcgKnApOworZmxvYXQ0IF9fb3ZsZCB2bG9hZDQoc2l6ZV90IG9mZnNldCwgY29uc3QgZmxvYXQgKnApOworY2hhcjggX19vdmxkIHZsb2FkOChzaXplX3Qgb2Zmc2V0LCBjb25zdCBjaGFyICpwKTsKK3VjaGFyOCBfX292bGQgdmxvYWQ4KHNpemVfdCBvZmZzZXQsIGNvbnN0IHVjaGFyICpwKTsKK3Nob3J0OCBfX292bGQgdmxvYWQ4KHNpemVfdCBvZmZzZXQsIGNvbnN0IHNob3J0ICpwKTsKK3VzaG9ydDggX19vdmxkIHZsb2FkOChzaXplX3Qgb2Zmc2V0LCBjb25zdCB1c2hvcnQgKnApOworaW50OCBfX292bGQgdmxvYWQ4KHNpemVfdCBvZmZzZXQsIGNvbnN0IGludCAqcCk7Cit1aW50OCBfX292bGQgdmxvYWQ4KHNpemVfdCBvZmZzZXQsIGNvbnN0IHVpbnQgKnApOworbG9uZzggX19vdmxkIHZsb2FkOChzaXplX3Qgb2Zmc2V0LCBjb25zdCBsb25nICpwKTsKK3Vsb25nOCBfX292bGQgdmxvYWQ4KHNpemVfdCBvZmZzZXQsIGNvbnN0IHVsb25nICpwKTsKK2Zsb2F0OCBfX292bGQgdmxvYWQ4KHNpemVfdCBvZmZzZXQsIGNvbnN0IGZsb2F0ICpwKTsKK2NoYXIxNiBfX292bGQgdmxvYWQxNihzaXplX3Qgb2Zmc2V0LCBjb25zdCBjaGFyICpwKTsKK3VjaGFyMTYgX19vdmxkIHZsb2FkMTYoc2l6ZV90IG9mZnNldCwgY29uc3QgdWNoYXIgKnApOworc2hvcnQxNiBfX292bGQgdmxvYWQxNihzaXplX3Qgb2Zmc2V0LCBjb25zdCBzaG9ydCAqcCk7Cit1c2hvcnQxNiBfX292bGQgdmxvYWQxNihzaXplX3Qgb2Zmc2V0LCBjb25zdCB1c2hvcnQgKnApOworaW50MTYgX19vdmxkIHZsb2FkMTYoc2l6ZV90IG9mZnNldCwgY29uc3QgaW50ICpwKTsKK3VpbnQxNiBfX292bGQgdmxvYWQxNihzaXplX3Qgb2Zmc2V0LCBjb25zdCB1aW50ICpwKTsKK2xvbmcxNiBfX292bGQgdmxvYWQxNihzaXplX3Qgb2Zmc2V0LCBjb25zdCBsb25nICpwKTsKK3Vsb25nMTYgX19vdmxkIHZsb2FkMTYoc2l6ZV90IG9mZnNldCwgY29uc3QgdWxvbmcgKnApOworZmxvYXQxNiBfX292bGQgdmxvYWQxNihzaXplX3Qgb2Zmc2V0LCBjb25zdCBmbG9hdCAqcCk7CisKKyNpZmRlZiBjbF9raHJfZnA2NAorZG91YmxlMiBfX292bGQgdmxvYWQyKHNpemVfdCBvZmZzZXQsIGNvbnN0IGRvdWJsZSAqcCk7Citkb3VibGUzIF9fb3ZsZCB2bG9hZDMoc2l6ZV90IG9mZnNldCwgY29uc3QgZG91YmxlICpwKTsKK2RvdWJsZTQgX19vdmxkIHZsb2FkNChzaXplX3Qgb2Zmc2V0LCBjb25zdCBkb3VibGUgKnApOworZG91YmxlOCBfX292bGQgdmxvYWQ4KHNpemVfdCBvZmZzZXQsIGNvbnN0IGRvdWJsZSAqcCk7Citkb3VibGUxNiBfX292bGQgdmxvYWQxNihzaXplX3Qgb2Zmc2V0LCBjb25zdCBkb3VibGUgKnApOworI2VuZGlmIC8vY2xfa2hyX2ZwNjQKKworI2lmZGVmIGNsX2tocl9mcDE2CitoYWxmIF9fb3ZsZCB2bG9hZChzaXplX3Qgb2Zmc2V0LCBjb25zdCBoYWxmICpwKTsKK2hhbGYyIF9fb3ZsZCB2bG9hZDIoc2l6ZV90IG9mZnNldCwgY29uc3QgaGFsZiAqcCk7CitoYWxmMyBfX292bGQgdmxvYWQzKHNpemVfdCBvZmZzZXQsIGNvbnN0IGhhbGYgKnApOworaGFsZjQgX19vdmxkIHZsb2FkNChzaXplX3Qgb2Zmc2V0LCBjb25zdCBoYWxmICpwKTsKK2hhbGY4IF9fb3ZsZCB2bG9hZDgoc2l6ZV90IG9mZnNldCwgY29uc3QgaGFsZiAqcCk7CitoYWxmMTYgX19vdmxkIHZsb2FkMTYoc2l6ZV90IG9mZnNldCwgY29uc3QgaGFsZiAqcCk7CisjZW5kaWYgLy9jbF9raHJfZnAxNgorI2Vsc2UKK2NoYXIyIF9fb3ZsZCB2bG9hZDIoc2l6ZV90IG9mZnNldCwgY29uc3QgX19nbG9iYWwgY2hhciAqcCk7Cit1Y2hhcjIgX19vdmxkIHZsb2FkMihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2dsb2JhbCB1Y2hhciAqcCk7CitzaG9ydDIgX19vdmxkIHZsb2FkMihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2dsb2JhbCBzaG9ydCAqcCk7Cit1c2hvcnQyIF9fb3ZsZCB2bG9hZDIoc2l6ZV90IG9mZnNldCwgY29uc3QgX19nbG9iYWwgdXNob3J0ICpwKTsKK2ludDIgX19vdmxkIHZsb2FkMihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2dsb2JhbCBpbnQgKnApOwordWludDIgX19vdmxkIHZsb2FkMihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2dsb2JhbCB1aW50ICpwKTsKK2xvbmcyIF9fb3ZsZCB2bG9hZDIoc2l6ZV90IG9mZnNldCwgY29uc3QgX19nbG9iYWwgbG9uZyAqcCk7Cit1bG9uZzIgX19vdmxkIHZsb2FkMihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2dsb2JhbCB1bG9uZyAqcCk7CitmbG9hdDIgX19vdmxkIHZsb2FkMihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2dsb2JhbCBmbG9hdCAqcCk7CitjaGFyMyBfX292bGQgdmxvYWQzKHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fZ2xvYmFsIGNoYXIgKnApOwordWNoYXIzIF9fb3ZsZCB2bG9hZDMoc2l6ZV90IG9mZnNldCwgY29uc3QgX19nbG9iYWwgdWNoYXIgKnApOworc2hvcnQzIF9fb3ZsZCB2bG9hZDMoc2l6ZV90IG9mZnNldCwgY29uc3QgX19nbG9iYWwgc2hvcnQgKnApOwordXNob3J0MyBfX292bGQgdmxvYWQzKHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fZ2xvYmFsIHVzaG9ydCAqcCk7CitpbnQzIF9fb3ZsZCB2bG9hZDMoc2l6ZV90IG9mZnNldCwgY29uc3QgX19nbG9iYWwgaW50ICpwKTsKK3VpbnQzIF9fb3ZsZCB2bG9hZDMoc2l6ZV90IG9mZnNldCwgY29uc3QgX19nbG9iYWwgdWludCAqcCk7Citsb25nMyBfX292bGQgdmxvYWQzKHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fZ2xvYmFsIGxvbmcgKnApOwordWxvbmczIF9fb3ZsZCB2bG9hZDMoc2l6ZV90IG9mZnNldCwgY29uc3QgX19nbG9iYWwgdWxvbmcgKnApOworZmxvYXQzIF9fb3ZsZCB2bG9hZDMoc2l6ZV90IG9mZnNldCwgY29uc3QgX19nbG9iYWwgZmxvYXQgKnApOworY2hhcjQgX19vdmxkIHZsb2FkNChzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2dsb2JhbCBjaGFyICpwKTsKK3VjaGFyNCBfX292bGQgdmxvYWQ0KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fZ2xvYmFsIHVjaGFyICpwKTsKK3Nob3J0NCBfX292bGQgdmxvYWQ0KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fZ2xvYmFsIHNob3J0ICpwKTsKK3VzaG9ydDQgX19vdmxkIHZsb2FkNChzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2dsb2JhbCB1c2hvcnQgKnApOworaW50NCBfX292bGQgdmxvYWQ0KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fZ2xvYmFsIGludCAqcCk7Cit1aW50NCBfX292bGQgdmxvYWQ0KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fZ2xvYmFsIHVpbnQgKnApOworbG9uZzQgX19vdmxkIHZsb2FkNChzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2dsb2JhbCBsb25nICpwKTsKK3Vsb25nNCBfX292bGQgdmxvYWQ0KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fZ2xvYmFsIHVsb25nICpwKTsKK2Zsb2F0NCBfX292bGQgdmxvYWQ0KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fZ2xvYmFsIGZsb2F0ICpwKTsKK2NoYXI4IF9fb3ZsZCB2bG9hZDgoc2l6ZV90IG9mZnNldCwgY29uc3QgX19nbG9iYWwgY2hhciAqcCk7Cit1Y2hhcjggX19vdmxkIHZsb2FkOChzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2dsb2JhbCB1Y2hhciAqcCk7CitzaG9ydDggX19vdmxkIHZsb2FkOChzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2dsb2JhbCBzaG9ydCAqcCk7Cit1c2hvcnQ4IF9fb3ZsZCB2bG9hZDgoc2l6ZV90IG9mZnNldCwgY29uc3QgX19nbG9iYWwgdXNob3J0ICpwKTsKK2ludDggX19vdmxkIHZsb2FkOChzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2dsb2JhbCBpbnQgKnApOwordWludDggX19vdmxkIHZsb2FkOChzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2dsb2JhbCB1aW50ICpwKTsKK2xvbmc4IF9fb3ZsZCB2bG9hZDgoc2l6ZV90IG9mZnNldCwgY29uc3QgX19nbG9iYWwgbG9uZyAqcCk7Cit1bG9uZzggX19vdmxkIHZsb2FkOChzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2dsb2JhbCB1bG9uZyAqcCk7CitmbG9hdDggX19vdmxkIHZsb2FkOChzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2dsb2JhbCBmbG9hdCAqcCk7CitjaGFyMTYgX19vdmxkIHZsb2FkMTYoc2l6ZV90IG9mZnNldCwgY29uc3QgX19nbG9iYWwgY2hhciAqcCk7Cit1Y2hhcjE2IF9fb3ZsZCB2bG9hZDE2KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fZ2xvYmFsIHVjaGFyICpwKTsKK3Nob3J0MTYgX19vdmxkIHZsb2FkMTYoc2l6ZV90IG9mZnNldCwgY29uc3QgX19nbG9iYWwgc2hvcnQgKnApOwordXNob3J0MTYgX19vdmxkIHZsb2FkMTYoc2l6ZV90IG9mZnNldCwgY29uc3QgX19nbG9iYWwgdXNob3J0ICpwKTsKK2ludDE2IF9fb3ZsZCB2bG9hZDE2KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fZ2xvYmFsIGludCAqcCk7Cit1aW50MTYgX19vdmxkIHZsb2FkMTYoc2l6ZV90IG9mZnNldCwgY29uc3QgX19nbG9iYWwgdWludCAqcCk7Citsb25nMTYgX19vdmxkIHZsb2FkMTYoc2l6ZV90IG9mZnNldCwgY29uc3QgX19nbG9iYWwgbG9uZyAqcCk7Cit1bG9uZzE2IF9fb3ZsZCB2bG9hZDE2KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fZ2xvYmFsIHVsb25nICpwKTsKK2Zsb2F0MTYgX19vdmxkIHZsb2FkMTYoc2l6ZV90IG9mZnNldCwgY29uc3QgX19nbG9iYWwgZmxvYXQgKnApOworY2hhcjIgX19vdmxkIHZsb2FkMihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2xvY2FsIGNoYXIgKnApOwordWNoYXIyIF9fb3ZsZCB2bG9hZDIoc2l6ZV90IG9mZnNldCwgY29uc3QgX19sb2NhbCB1Y2hhciAqcCk7CitzaG9ydDIgX19vdmxkIHZsb2FkMihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2xvY2FsIHNob3J0ICpwKTsKK3VzaG9ydDIgX19vdmxkIHZsb2FkMihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2xvY2FsIHVzaG9ydCAqcCk7CitpbnQyIF9fb3ZsZCB2bG9hZDIoc2l6ZV90IG9mZnNldCwgY29uc3QgX19sb2NhbCBpbnQgKnApOwordWludDIgX19vdmxkIHZsb2FkMihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2xvY2FsIHVpbnQgKnApOworbG9uZzIgX19vdmxkIHZsb2FkMihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2xvY2FsIGxvbmcgKnApOwordWxvbmcyIF9fb3ZsZCB2bG9hZDIoc2l6ZV90IG9mZnNldCwgY29uc3QgX19sb2NhbCB1bG9uZyAqcCk7CitmbG9hdDIgX19vdmxkIHZsb2FkMihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2xvY2FsIGZsb2F0ICpwKTsKK2NoYXIzIF9fb3ZsZCB2bG9hZDMoc2l6ZV90IG9mZnNldCwgY29uc3QgX19sb2NhbCBjaGFyICpwKTsKK3VjaGFyMyBfX292bGQgdmxvYWQzKHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fbG9jYWwgdWNoYXIgKnApOworc2hvcnQzIF9fb3ZsZCB2bG9hZDMoc2l6ZV90IG9mZnNldCwgY29uc3QgX19sb2NhbCBzaG9ydCAqcCk7Cit1c2hvcnQzIF9fb3ZsZCB2bG9hZDMoc2l6ZV90IG9mZnNldCwgY29uc3QgX19sb2NhbCB1c2hvcnQgKnApOworaW50MyBfX292bGQgdmxvYWQzKHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fbG9jYWwgaW50ICpwKTsKK3VpbnQzIF9fb3ZsZCB2bG9hZDMoc2l6ZV90IG9mZnNldCwgY29uc3QgX19sb2NhbCB1aW50ICpwKTsKK2xvbmczIF9fb3ZsZCB2bG9hZDMoc2l6ZV90IG9mZnNldCwgY29uc3QgX19sb2NhbCBsb25nICpwKTsKK3Vsb25nMyBfX292bGQgdmxvYWQzKHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fbG9jYWwgdWxvbmcgKnApOworZmxvYXQzIF9fb3ZsZCB2bG9hZDMoc2l6ZV90IG9mZnNldCwgY29uc3QgX19sb2NhbCBmbG9hdCAqcCk7CitjaGFyNCBfX292bGQgdmxvYWQ0KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fbG9jYWwgY2hhciAqcCk7Cit1Y2hhcjQgX19vdmxkIHZsb2FkNChzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2xvY2FsIHVjaGFyICpwKTsKK3Nob3J0NCBfX292bGQgdmxvYWQ0KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fbG9jYWwgc2hvcnQgKnApOwordXNob3J0NCBfX292bGQgdmxvYWQ0KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fbG9jYWwgdXNob3J0ICpwKTsKK2ludDQgX19vdmxkIHZsb2FkNChzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2xvY2FsIGludCAqcCk7Cit1aW50NCBfX292bGQgdmxvYWQ0KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fbG9jYWwgdWludCAqcCk7Citsb25nNCBfX292bGQgdmxvYWQ0KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fbG9jYWwgbG9uZyAqcCk7Cit1bG9uZzQgX19vdmxkIHZsb2FkNChzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2xvY2FsIHVsb25nICpwKTsKK2Zsb2F0NCBfX292bGQgdmxvYWQ0KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fbG9jYWwgZmxvYXQgKnApOworY2hhcjggX19vdmxkIHZsb2FkOChzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2xvY2FsIGNoYXIgKnApOwordWNoYXI4IF9fb3ZsZCB2bG9hZDgoc2l6ZV90IG9mZnNldCwgY29uc3QgX19sb2NhbCB1Y2hhciAqcCk7CitzaG9ydDggX19vdmxkIHZsb2FkOChzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2xvY2FsIHNob3J0ICpwKTsKK3VzaG9ydDggX19vdmxkIHZsb2FkOChzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2xvY2FsIHVzaG9ydCAqcCk7CitpbnQ4IF9fb3ZsZCB2bG9hZDgoc2l6ZV90IG9mZnNldCwgY29uc3QgX19sb2NhbCBpbnQgKnApOwordWludDggX19vdmxkIHZsb2FkOChzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2xvY2FsIHVpbnQgKnApOworbG9uZzggX19vdmxkIHZsb2FkOChzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2xvY2FsIGxvbmcgKnApOwordWxvbmc4IF9fb3ZsZCB2bG9hZDgoc2l6ZV90IG9mZnNldCwgY29uc3QgX19sb2NhbCB1bG9uZyAqcCk7CitmbG9hdDggX19vdmxkIHZsb2FkOChzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2xvY2FsIGZsb2F0ICpwKTsKK2NoYXIxNiBfX292bGQgdmxvYWQxNihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2xvY2FsIGNoYXIgKnApOwordWNoYXIxNiBfX292bGQgdmxvYWQxNihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2xvY2FsIHVjaGFyICpwKTsKK3Nob3J0MTYgX19vdmxkIHZsb2FkMTYoc2l6ZV90IG9mZnNldCwgY29uc3QgX19sb2NhbCBzaG9ydCAqcCk7Cit1c2hvcnQxNiBfX292bGQgdmxvYWQxNihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2xvY2FsIHVzaG9ydCAqcCk7CitpbnQxNiBfX292bGQgdmxvYWQxNihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2xvY2FsIGludCAqcCk7Cit1aW50MTYgX19vdmxkIHZsb2FkMTYoc2l6ZV90IG9mZnNldCwgY29uc3QgX19sb2NhbCB1aW50ICpwKTsKK2xvbmcxNiBfX292bGQgdmxvYWQxNihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2xvY2FsIGxvbmcgKnApOwordWxvbmcxNiBfX292bGQgdmxvYWQxNihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2xvY2FsIHVsb25nICpwKTsKK2Zsb2F0MTYgX19vdmxkIHZsb2FkMTYoc2l6ZV90IG9mZnNldCwgY29uc3QgX19sb2NhbCBmbG9hdCAqcCk7CitjaGFyMiBfX292bGQgdmxvYWQyKHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fcHJpdmF0ZSBjaGFyICpwKTsKK3VjaGFyMiBfX292bGQgdmxvYWQyKHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fcHJpdmF0ZSB1Y2hhciAqcCk7CitzaG9ydDIgX19vdmxkIHZsb2FkMihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX3ByaXZhdGUgc2hvcnQgKnApOwordXNob3J0MiBfX292bGQgdmxvYWQyKHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fcHJpdmF0ZSB1c2hvcnQgKnApOworaW50MiBfX292bGQgdmxvYWQyKHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fcHJpdmF0ZSBpbnQgKnApOwordWludDIgX19vdmxkIHZsb2FkMihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX3ByaXZhdGUgdWludCAqcCk7Citsb25nMiBfX292bGQgdmxvYWQyKHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fcHJpdmF0ZSBsb25nICpwKTsKK3Vsb25nMiBfX292bGQgdmxvYWQyKHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fcHJpdmF0ZSB1bG9uZyAqcCk7CitmbG9hdDIgX19vdmxkIHZsb2FkMihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX3ByaXZhdGUgZmxvYXQgKnApOworY2hhcjMgX19vdmxkIHZsb2FkMyhzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX3ByaXZhdGUgY2hhciAqcCk7Cit1Y2hhcjMgX19vdmxkIHZsb2FkMyhzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX3ByaXZhdGUgdWNoYXIgKnApOworc2hvcnQzIF9fb3ZsZCB2bG9hZDMoc2l6ZV90IG9mZnNldCwgY29uc3QgX19wcml2YXRlIHNob3J0ICpwKTsKK3VzaG9ydDMgX19vdmxkIHZsb2FkMyhzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX3ByaXZhdGUgdXNob3J0ICpwKTsKK2ludDMgX19vdmxkIHZsb2FkMyhzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX3ByaXZhdGUgaW50ICpwKTsKK3VpbnQzIF9fb3ZsZCB2bG9hZDMoc2l6ZV90IG9mZnNldCwgY29uc3QgX19wcml2YXRlIHVpbnQgKnApOworbG9uZzMgX19vdmxkIHZsb2FkMyhzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX3ByaXZhdGUgbG9uZyAqcCk7Cit1bG9uZzMgX19vdmxkIHZsb2FkMyhzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX3ByaXZhdGUgdWxvbmcgKnApOworZmxvYXQzIF9fb3ZsZCB2bG9hZDMoc2l6ZV90IG9mZnNldCwgY29uc3QgX19wcml2YXRlIGZsb2F0ICpwKTsKK2NoYXI0IF9fb3ZsZCB2bG9hZDQoc2l6ZV90IG9mZnNldCwgY29uc3QgX19wcml2YXRlIGNoYXIgKnApOwordWNoYXI0IF9fb3ZsZCB2bG9hZDQoc2l6ZV90IG9mZnNldCwgY29uc3QgX19wcml2YXRlIHVjaGFyICpwKTsKK3Nob3J0NCBfX292bGQgdmxvYWQ0KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fcHJpdmF0ZSBzaG9ydCAqcCk7Cit1c2hvcnQ0IF9fb3ZsZCB2bG9hZDQoc2l6ZV90IG9mZnNldCwgY29uc3QgX19wcml2YXRlIHVzaG9ydCAqcCk7CitpbnQ0IF9fb3ZsZCB2bG9hZDQoc2l6ZV90IG9mZnNldCwgY29uc3QgX19wcml2YXRlIGludCAqcCk7Cit1aW50NCBfX292bGQgdmxvYWQ0KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fcHJpdmF0ZSB1aW50ICpwKTsKK2xvbmc0IF9fb3ZsZCB2bG9hZDQoc2l6ZV90IG9mZnNldCwgY29uc3QgX19wcml2YXRlIGxvbmcgKnApOwordWxvbmc0IF9fb3ZsZCB2bG9hZDQoc2l6ZV90IG9mZnNldCwgY29uc3QgX19wcml2YXRlIHVsb25nICpwKTsKK2Zsb2F0NCBfX292bGQgdmxvYWQ0KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fcHJpdmF0ZSBmbG9hdCAqcCk7CitjaGFyOCBfX292bGQgdmxvYWQ4KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fcHJpdmF0ZSBjaGFyICpwKTsKK3VjaGFyOCBfX292bGQgdmxvYWQ4KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fcHJpdmF0ZSB1Y2hhciAqcCk7CitzaG9ydDggX19vdmxkIHZsb2FkOChzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX3ByaXZhdGUgc2hvcnQgKnApOwordXNob3J0OCBfX292bGQgdmxvYWQ4KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fcHJpdmF0ZSB1c2hvcnQgKnApOworaW50OCBfX292bGQgdmxvYWQ4KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fcHJpdmF0ZSBpbnQgKnApOwordWludDggX19vdmxkIHZsb2FkOChzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX3ByaXZhdGUgdWludCAqcCk7Citsb25nOCBfX292bGQgdmxvYWQ4KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fcHJpdmF0ZSBsb25nICpwKTsKK3Vsb25nOCBfX292bGQgdmxvYWQ4KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fcHJpdmF0ZSB1bG9uZyAqcCk7CitmbG9hdDggX19vdmxkIHZsb2FkOChzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX3ByaXZhdGUgZmxvYXQgKnApOworY2hhcjE2IF9fb3ZsZCB2bG9hZDE2KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fcHJpdmF0ZSBjaGFyICpwKTsKK3VjaGFyMTYgX19vdmxkIHZsb2FkMTYoc2l6ZV90IG9mZnNldCwgY29uc3QgX19wcml2YXRlIHVjaGFyICpwKTsKK3Nob3J0MTYgX19vdmxkIHZsb2FkMTYoc2l6ZV90IG9mZnNldCwgY29uc3QgX19wcml2YXRlIHNob3J0ICpwKTsKK3VzaG9ydDE2IF9fb3ZsZCB2bG9hZDE2KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fcHJpdmF0ZSB1c2hvcnQgKnApOworaW50MTYgX19vdmxkIHZsb2FkMTYoc2l6ZV90IG9mZnNldCwgY29uc3QgX19wcml2YXRlIGludCAqcCk7Cit1aW50MTYgX19vdmxkIHZsb2FkMTYoc2l6ZV90IG9mZnNldCwgY29uc3QgX19wcml2YXRlIHVpbnQgKnApOworbG9uZzE2IF9fb3ZsZCB2bG9hZDE2KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fcHJpdmF0ZSBsb25nICpwKTsKK3Vsb25nMTYgX19vdmxkIHZsb2FkMTYoc2l6ZV90IG9mZnNldCwgY29uc3QgX19wcml2YXRlIHVsb25nICpwKTsKK2Zsb2F0MTYgX19vdmxkIHZsb2FkMTYoc2l6ZV90IG9mZnNldCwgY29uc3QgX19wcml2YXRlIGZsb2F0ICpwKTsKKworI2lmZGVmIGNsX2tocl9mcDY0Citkb3VibGUyIF9fb3ZsZCB2bG9hZDIoc2l6ZV90IG9mZnNldCwgY29uc3QgX19nbG9iYWwgZG91YmxlICpwKTsKK2RvdWJsZTMgX19vdmxkIHZsb2FkMyhzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2dsb2JhbCBkb3VibGUgKnApOworZG91YmxlNCBfX292bGQgdmxvYWQ0KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fZ2xvYmFsIGRvdWJsZSAqcCk7Citkb3VibGU4IF9fb3ZsZCB2bG9hZDgoc2l6ZV90IG9mZnNldCwgY29uc3QgX19nbG9iYWwgZG91YmxlICpwKTsKK2RvdWJsZTE2IF9fb3ZsZCB2bG9hZDE2KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fZ2xvYmFsIGRvdWJsZSAqcCk7Citkb3VibGUyIF9fb3ZsZCB2bG9hZDIoc2l6ZV90IG9mZnNldCwgY29uc3QgX19sb2NhbCBkb3VibGUgKnApOworZG91YmxlMyBfX292bGQgdmxvYWQzKHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fbG9jYWwgZG91YmxlICpwKTsKK2RvdWJsZTQgX19vdmxkIHZsb2FkNChzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2xvY2FsIGRvdWJsZSAqcCk7Citkb3VibGU4IF9fb3ZsZCB2bG9hZDgoc2l6ZV90IG9mZnNldCwgY29uc3QgX19sb2NhbCBkb3VibGUgKnApOworZG91YmxlMTYgX19vdmxkIHZsb2FkMTYoc2l6ZV90IG9mZnNldCwgY29uc3QgX19sb2NhbCBkb3VibGUgKnApOworZG91YmxlMiBfX292bGQgdmxvYWQyKHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fcHJpdmF0ZSBkb3VibGUgKnApOworZG91YmxlMyBfX292bGQgdmxvYWQzKHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fcHJpdmF0ZSBkb3VibGUgKnApOworZG91YmxlNCBfX292bGQgdmxvYWQ0KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fcHJpdmF0ZSBkb3VibGUgKnApOworZG91YmxlOCBfX292bGQgdmxvYWQ4KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fcHJpdmF0ZSBkb3VibGUgKnApOworZG91YmxlMTYgX19vdmxkIHZsb2FkMTYoc2l6ZV90IG9mZnNldCwgY29uc3QgX19wcml2YXRlIGRvdWJsZSAqcCk7CisjZW5kaWYgLy9jbF9raHJfZnA2NAorCisjaWZkZWYgY2xfa2hyX2ZwMTYKK2hhbGYgX19vdmxkIHZsb2FkKHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fZ2xvYmFsIGhhbGYgKnApOworaGFsZjIgX19vdmxkIHZsb2FkMihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2dsb2JhbCBoYWxmICpwKTsKK2hhbGYzIF9fb3ZsZCB2bG9hZDMoc2l6ZV90IG9mZnNldCwgY29uc3QgX19nbG9iYWwgaGFsZiAqcCk7CitoYWxmNCBfX292bGQgdmxvYWQ0KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fZ2xvYmFsIGhhbGYgKnApOworaGFsZjggX19vdmxkIHZsb2FkOChzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2dsb2JhbCBoYWxmICpwKTsKK2hhbGYxNiBfX292bGQgdmxvYWQxNihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2dsb2JhbCBoYWxmICpwKTsKK2hhbGYgX19vdmxkIHZsb2FkKHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fbG9jYWwgaGFsZiAqcCk7CitoYWxmMiBfX292bGQgdmxvYWQyKHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fbG9jYWwgaGFsZiAqcCk7CitoYWxmMyBfX292bGQgdmxvYWQzKHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fbG9jYWwgaGFsZiAqcCk7CitoYWxmNCBfX292bGQgdmxvYWQ0KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fbG9jYWwgaGFsZiAqcCk7CitoYWxmOCBfX292bGQgdmxvYWQ4KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fbG9jYWwgaGFsZiAqcCk7CitoYWxmMTYgX19vdmxkIHZsb2FkMTYoc2l6ZV90IG9mZnNldCwgY29uc3QgX19sb2NhbCBoYWxmICpwKTsKK2hhbGYgX19vdmxkIHZsb2FkKHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fcHJpdmF0ZSBoYWxmICpwKTsKK2hhbGYyIF9fb3ZsZCB2bG9hZDIoc2l6ZV90IG9mZnNldCwgY29uc3QgX19wcml2YXRlIGhhbGYgKnApOworaGFsZjMgX19vdmxkIHZsb2FkMyhzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX3ByaXZhdGUgaGFsZiAqcCk7CitoYWxmNCBfX292bGQgdmxvYWQ0KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fcHJpdmF0ZSBoYWxmICpwKTsKK2hhbGY4IF9fb3ZsZCB2bG9hZDgoc2l6ZV90IG9mZnNldCwgY29uc3QgX19wcml2YXRlIGhhbGYgKnApOworaGFsZjE2IF9fb3ZsZCB2bG9hZDE2KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fcHJpdmF0ZSBoYWxmICpwKTsKKyNlbmRpZiAvL2NsX2tocl9mcDE2CisjZW5kaWYgLy9fX09QRU5DTF9DX1ZFUlNJT05fXyA+PSBDTF9WRVJTSU9OXzJfMAorCisjaWYgX19PUEVOQ0xfQ19WRVJTSU9OX18gPj0gQ0xfVkVSU0lPTl8yXzAKK3ZvaWQgX19vdmxkIHZzdG9yZTIoY2hhcjIgZGF0YSwgc2l6ZV90IG9mZnNldCwgY2hhciAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmUyKHVjaGFyMiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCB1Y2hhciAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmUyKHNob3J0MiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBzaG9ydCAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmUyKHVzaG9ydDIgZGF0YSwgc2l6ZV90IG9mZnNldCwgdXNob3J0ICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTIoaW50MiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBpbnQgKnApOwordm9pZCBfX292bGQgdnN0b3JlMih1aW50MiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCB1aW50ICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTIobG9uZzIgZGF0YSwgc2l6ZV90IG9mZnNldCwgbG9uZyAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmUyKHVsb25nMiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCB1bG9uZyAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmUyKGZsb2F0MiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBmbG9hdCAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmUzKGNoYXIzIGRhdGEsIHNpemVfdCBvZmZzZXQsIGNoYXIgKnApOwordm9pZCBfX292bGQgdnN0b3JlMyh1Y2hhcjMgZGF0YSwgc2l6ZV90IG9mZnNldCwgdWNoYXIgKnApOwordm9pZCBfX292bGQgdnN0b3JlMyhzaG9ydDMgZGF0YSwgc2l6ZV90IG9mZnNldCwgc2hvcnQgKnApOwordm9pZCBfX292bGQgdnN0b3JlMyh1c2hvcnQzIGRhdGEsIHNpemVfdCBvZmZzZXQsIHVzaG9ydCAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmUzKGludDMgZGF0YSwgc2l6ZV90IG9mZnNldCwgaW50ICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTModWludDMgZGF0YSwgc2l6ZV90IG9mZnNldCwgdWludCAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmUzKGxvbmczIGRhdGEsIHNpemVfdCBvZmZzZXQsIGxvbmcgKnApOwordm9pZCBfX292bGQgdnN0b3JlMyh1bG9uZzMgZGF0YSwgc2l6ZV90IG9mZnNldCwgdWxvbmcgKnApOwordm9pZCBfX292bGQgdnN0b3JlMyhmbG9hdDMgZGF0YSwgc2l6ZV90IG9mZnNldCwgZmxvYXQgKnApOwordm9pZCBfX292bGQgdnN0b3JlNChjaGFyNCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBjaGFyICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTQodWNoYXI0IGRhdGEsIHNpemVfdCBvZmZzZXQsIHVjaGFyICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTQoc2hvcnQ0IGRhdGEsIHNpemVfdCBvZmZzZXQsIHNob3J0ICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTQodXNob3J0NCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCB1c2hvcnQgKnApOwordm9pZCBfX292bGQgdnN0b3JlNChpbnQ0IGRhdGEsIHNpemVfdCBvZmZzZXQsIGludCAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmU0KHVpbnQ0IGRhdGEsIHNpemVfdCBvZmZzZXQsIHVpbnQgKnApOwordm9pZCBfX292bGQgdnN0b3JlNChsb25nNCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBsb25nICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTQodWxvbmc0IGRhdGEsIHNpemVfdCBvZmZzZXQsIHVsb25nICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTQoZmxvYXQ0IGRhdGEsIHNpemVfdCBvZmZzZXQsIGZsb2F0ICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTgoY2hhcjggZGF0YSwgc2l6ZV90IG9mZnNldCwgY2hhciAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmU4KHVjaGFyOCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCB1Y2hhciAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmU4KHNob3J0OCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBzaG9ydCAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmU4KHVzaG9ydDggZGF0YSwgc2l6ZV90IG9mZnNldCwgdXNob3J0ICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTgoaW50OCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBpbnQgKnApOwordm9pZCBfX292bGQgdnN0b3JlOCh1aW50OCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCB1aW50ICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTgobG9uZzggZGF0YSwgc2l6ZV90IG9mZnNldCwgbG9uZyAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmU4KHVsb25nOCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCB1bG9uZyAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmU4KGZsb2F0OCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBmbG9hdCAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmUxNihjaGFyMTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgY2hhciAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmUxNih1Y2hhcjE2IGRhdGEsIHNpemVfdCBvZmZzZXQsIHVjaGFyICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTE2KHNob3J0MTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgc2hvcnQgKnApOwordm9pZCBfX292bGQgdnN0b3JlMTYodXNob3J0MTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgdXNob3J0ICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTE2KGludDE2IGRhdGEsIHNpemVfdCBvZmZzZXQsIGludCAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmUxNih1aW50MTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgdWludCAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmUxNihsb25nMTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgbG9uZyAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmUxNih1bG9uZzE2IGRhdGEsIHNpemVfdCBvZmZzZXQsIHVsb25nICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTE2KGZsb2F0MTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgZmxvYXQgKnApOworI2lmZGVmIGNsX2tocl9mcDY0Cit2b2lkIF9fb3ZsZCB2c3RvcmUyKGRvdWJsZTIgZGF0YSwgc2l6ZV90IG9mZnNldCwgZG91YmxlICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTMoZG91YmxlMyBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBkb3VibGUgKnApOwordm9pZCBfX292bGQgdnN0b3JlNChkb3VibGU0IGRhdGEsIHNpemVfdCBvZmZzZXQsIGRvdWJsZSAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmU4KGRvdWJsZTggZGF0YSwgc2l6ZV90IG9mZnNldCwgZG91YmxlICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTE2KGRvdWJsZTE2IGRhdGEsIHNpemVfdCBvZmZzZXQsIGRvdWJsZSAqcCk7CisjZW5kaWYgLy9jbF9raHJfZnA2NAorI2lmZGVmIGNsX2tocl9mcDE2Cit2b2lkIF9fb3ZsZCB2c3RvcmUoaGFsZiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTIoaGFsZjIgZGF0YSwgc2l6ZV90IG9mZnNldCwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmUzKGhhbGYzIGRhdGEsIHNpemVfdCBvZmZzZXQsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlNChoYWxmNCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTgoaGFsZjggZGF0YSwgc2l6ZV90IG9mZnNldCwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmUxNihoYWxmMTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgaGFsZiAqcCk7CisjZW5kaWYgLy9jbF9raHJfZnAxNgorI2Vsc2UKK3ZvaWQgX19vdmxkIHZzdG9yZTIoY2hhcjIgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgY2hhciAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmUyKHVjaGFyMiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCB1Y2hhciAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmUyKHNob3J0MiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCBzaG9ydCAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmUyKHVzaG9ydDIgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgdXNob3J0ICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTIoaW50MiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCBpbnQgKnApOwordm9pZCBfX292bGQgdnN0b3JlMih1aW50MiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCB1aW50ICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTIobG9uZzIgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgbG9uZyAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmUyKHVsb25nMiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCB1bG9uZyAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmUyKGZsb2F0MiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCBmbG9hdCAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmUzKGNoYXIzIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGNoYXIgKnApOwordm9pZCBfX292bGQgdnN0b3JlMyh1Y2hhcjMgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgdWNoYXIgKnApOwordm9pZCBfX292bGQgdnN0b3JlMyhzaG9ydDMgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgc2hvcnQgKnApOwordm9pZCBfX292bGQgdnN0b3JlMyh1c2hvcnQzIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIHVzaG9ydCAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmUzKGludDMgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgaW50ICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTModWludDMgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgdWludCAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmUzKGxvbmczIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGxvbmcgKnApOwordm9pZCBfX292bGQgdnN0b3JlMyh1bG9uZzMgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgdWxvbmcgKnApOwordm9pZCBfX292bGQgdnN0b3JlMyhmbG9hdDMgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgZmxvYXQgKnApOwordm9pZCBfX292bGQgdnN0b3JlNChjaGFyNCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCBjaGFyICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTQodWNoYXI0IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIHVjaGFyICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTQoc2hvcnQ0IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIHNob3J0ICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTQodXNob3J0NCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCB1c2hvcnQgKnApOwordm9pZCBfX292bGQgdnN0b3JlNChpbnQ0IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGludCAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmU0KHVpbnQ0IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIHVpbnQgKnApOwordm9pZCBfX292bGQgdnN0b3JlNChsb25nNCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCBsb25nICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTQodWxvbmc0IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIHVsb25nICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTQoZmxvYXQ0IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGZsb2F0ICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTgoY2hhcjggZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgY2hhciAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmU4KHVjaGFyOCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCB1Y2hhciAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmU4KHNob3J0OCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCBzaG9ydCAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmU4KHVzaG9ydDggZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgdXNob3J0ICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTgoaW50OCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCBpbnQgKnApOwordm9pZCBfX292bGQgdnN0b3JlOCh1aW50OCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCB1aW50ICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTgobG9uZzggZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgbG9uZyAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmU4KHVsb25nOCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCB1bG9uZyAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmU4KGZsb2F0OCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCBmbG9hdCAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmUxNihjaGFyMTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgY2hhciAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmUxNih1Y2hhcjE2IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIHVjaGFyICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTE2KHNob3J0MTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgc2hvcnQgKnApOwordm9pZCBfX292bGQgdnN0b3JlMTYodXNob3J0MTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgdXNob3J0ICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTE2KGludDE2IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGludCAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmUxNih1aW50MTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgdWludCAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmUxNihsb25nMTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgbG9uZyAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmUxNih1bG9uZzE2IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIHVsb25nICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTE2KGZsb2F0MTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgZmxvYXQgKnApOwordm9pZCBfX292bGQgdnN0b3JlMihjaGFyMiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGNoYXIgKnApOwordm9pZCBfX292bGQgdnN0b3JlMih1Y2hhcjIgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCB1Y2hhciAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmUyKHNob3J0MiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIHNob3J0ICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTIodXNob3J0MiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIHVzaG9ydCAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmUyKGludDIgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCBpbnQgKnApOwordm9pZCBfX292bGQgdnN0b3JlMih1aW50MiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIHVpbnQgKnApOwordm9pZCBfX292bGQgdnN0b3JlMihsb25nMiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGxvbmcgKnApOwordm9pZCBfX292bGQgdnN0b3JlMih1bG9uZzIgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCB1bG9uZyAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmUyKGZsb2F0MiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGZsb2F0ICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTMoY2hhcjMgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCBjaGFyICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTModWNoYXIzIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgdWNoYXIgKnApOwordm9pZCBfX292bGQgdnN0b3JlMyhzaG9ydDMgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCBzaG9ydCAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmUzKHVzaG9ydDMgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCB1c2hvcnQgKnApOwordm9pZCBfX292bGQgdnN0b3JlMyhpbnQzIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgaW50ICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTModWludDMgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCB1aW50ICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTMobG9uZzMgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCBsb25nICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTModWxvbmczIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgdWxvbmcgKnApOwordm9pZCBfX292bGQgdnN0b3JlMyhmbG9hdDMgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCBmbG9hdCAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmU0KGNoYXI0IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgY2hhciAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmU0KHVjaGFyNCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIHVjaGFyICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTQoc2hvcnQ0IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgc2hvcnQgKnApOwordm9pZCBfX292bGQgdnN0b3JlNCh1c2hvcnQ0IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgdXNob3J0ICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTQoaW50NCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGludCAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmU0KHVpbnQ0IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgdWludCAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmU0KGxvbmc0IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgbG9uZyAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmU0KHVsb25nNCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIHVsb25nICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTQoZmxvYXQ0IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgZmxvYXQgKnApOwordm9pZCBfX292bGQgdnN0b3JlOChjaGFyOCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGNoYXIgKnApOwordm9pZCBfX292bGQgdnN0b3JlOCh1Y2hhcjggZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCB1Y2hhciAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmU4KHNob3J0OCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIHNob3J0ICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTgodXNob3J0OCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIHVzaG9ydCAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmU4KGludDggZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCBpbnQgKnApOwordm9pZCBfX292bGQgdnN0b3JlOCh1aW50OCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIHVpbnQgKnApOwordm9pZCBfX292bGQgdnN0b3JlOChsb25nOCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGxvbmcgKnApOwordm9pZCBfX292bGQgdnN0b3JlOCh1bG9uZzggZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCB1bG9uZyAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmU4KGZsb2F0OCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGZsb2F0ICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTE2KGNoYXIxNiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGNoYXIgKnApOwordm9pZCBfX292bGQgdnN0b3JlMTYodWNoYXIxNiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIHVjaGFyICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTE2KHNob3J0MTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCBzaG9ydCAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmUxNih1c2hvcnQxNiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIHVzaG9ydCAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmUxNihpbnQxNiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGludCAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmUxNih1aW50MTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCB1aW50ICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTE2KGxvbmcxNiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGxvbmcgKnApOwordm9pZCBfX292bGQgdnN0b3JlMTYodWxvbmcxNiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIHVsb25nICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTE2KGZsb2F0MTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCBmbG9hdCAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmUyKGNoYXIyIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBjaGFyICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTIodWNoYXIyIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSB1Y2hhciAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmUyKHNob3J0MiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgc2hvcnQgKnApOwordm9pZCBfX292bGQgdnN0b3JlMih1c2hvcnQyIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSB1c2hvcnQgKnApOwordm9pZCBfX292bGQgdnN0b3JlMihpbnQyIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBpbnQgKnApOwordm9pZCBfX292bGQgdnN0b3JlMih1aW50MiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgdWludCAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmUyKGxvbmcyIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBsb25nICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTIodWxvbmcyIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSB1bG9uZyAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmUyKGZsb2F0MiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgZmxvYXQgKnApOwordm9pZCBfX292bGQgdnN0b3JlMyhjaGFyMyBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgY2hhciAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmUzKHVjaGFyMyBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgdWNoYXIgKnApOwordm9pZCBfX292bGQgdnN0b3JlMyhzaG9ydDMgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIHNob3J0ICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTModXNob3J0MyBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgdXNob3J0ICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTMoaW50MyBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgaW50ICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTModWludDMgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIHVpbnQgKnApOwordm9pZCBfX292bGQgdnN0b3JlMyhsb25nMyBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgbG9uZyAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmUzKHVsb25nMyBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgdWxvbmcgKnApOwordm9pZCBfX292bGQgdnN0b3JlMyhmbG9hdDMgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGZsb2F0ICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTQoY2hhcjQgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGNoYXIgKnApOwordm9pZCBfX292bGQgdnN0b3JlNCh1Y2hhcjQgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIHVjaGFyICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTQoc2hvcnQ0IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBzaG9ydCAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmU0KHVzaG9ydDQgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIHVzaG9ydCAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmU0KGludDQgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGludCAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmU0KHVpbnQ0IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSB1aW50ICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTQobG9uZzQgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGxvbmcgKnApOwordm9pZCBfX292bGQgdnN0b3JlNCh1bG9uZzQgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIHVsb25nICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTQoZmxvYXQ0IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBmbG9hdCAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmU4KGNoYXI4IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBjaGFyICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTgodWNoYXI4IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSB1Y2hhciAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmU4KHNob3J0OCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgc2hvcnQgKnApOwordm9pZCBfX292bGQgdnN0b3JlOCh1c2hvcnQ4IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSB1c2hvcnQgKnApOwordm9pZCBfX292bGQgdnN0b3JlOChpbnQ4IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBpbnQgKnApOwordm9pZCBfX292bGQgdnN0b3JlOCh1aW50OCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgdWludCAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmU4KGxvbmc4IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBsb25nICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTgodWxvbmc4IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSB1bG9uZyAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmU4KGZsb2F0OCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgZmxvYXQgKnApOwordm9pZCBfX292bGQgdnN0b3JlMTYoY2hhcjE2IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBjaGFyICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTE2KHVjaGFyMTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIHVjaGFyICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTE2KHNob3J0MTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIHNob3J0ICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTE2KHVzaG9ydDE2IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSB1c2hvcnQgKnApOwordm9pZCBfX292bGQgdnN0b3JlMTYoaW50MTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGludCAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmUxNih1aW50MTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIHVpbnQgKnApOwordm9pZCBfX292bGQgdnN0b3JlMTYobG9uZzE2IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBsb25nICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTE2KHVsb25nMTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIHVsb25nICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTE2KGZsb2F0MTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGZsb2F0ICpwKTsKKyNpZmRlZiBjbF9raHJfZnA2NAordm9pZCBfX292bGQgdnN0b3JlMihkb3VibGUyIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGRvdWJsZSAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmUzKGRvdWJsZTMgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgZG91YmxlICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTQoZG91YmxlNCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCBkb3VibGUgKnApOwordm9pZCBfX292bGQgdnN0b3JlOChkb3VibGU4IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGRvdWJsZSAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmUxNihkb3VibGUxNiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCBkb3VibGUgKnApOwordm9pZCBfX292bGQgdnN0b3JlMihkb3VibGUyIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgZG91YmxlICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTMoZG91YmxlMyBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGRvdWJsZSAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmU0KGRvdWJsZTQgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCBkb3VibGUgKnApOwordm9pZCBfX292bGQgdnN0b3JlOChkb3VibGU4IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgZG91YmxlICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTE2KGRvdWJsZTE2IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgZG91YmxlICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTIoZG91YmxlMiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgZG91YmxlICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTMoZG91YmxlMyBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgZG91YmxlICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTQoZG91YmxlNCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgZG91YmxlICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTgoZG91YmxlOCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgZG91YmxlICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTE2KGRvdWJsZTE2IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBkb3VibGUgKnApOworI2VuZGlmIC8vY2xfa2hyX2ZwNjQKKyNpZmRlZiBjbF9raHJfZnAxNgordm9pZCBfX292bGQgdnN0b3JlKGhhbGYgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmUyKGhhbGYyIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlMyhoYWxmMyBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTQoaGFsZjQgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmU4KGhhbGY4IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlMTYoaGFsZjE2IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlKGhhbGYgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTIoaGFsZjIgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTMoaGFsZjMgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTQoaGFsZjQgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTgoaGFsZjggZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTE2KGhhbGYxNiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlKGhhbGYgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlMihoYWxmMiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmUzKGhhbGYzIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZTQoaGFsZjQgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlOChoYWxmOCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmUxNihoYWxmMTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOworI2VuZGlmIC8vY2xfa2hyX2ZwMTYKKyNlbmRpZiAvL19fT1BFTkNMX0NfVkVSU0lPTl9fID49IENMX1ZFUlNJT05fMl8wCisKKy8qKgorICogUmVhZCBzaXplb2YgKGhhbGYpIGJ5dGVzIG9mIGRhdGEgZnJvbSBhZGRyZXNzCisgKiAocCArIG9mZnNldCkuIFRoZSBkYXRhIHJlYWQgaXMgaW50ZXJwcmV0ZWQgYXMgYQorICogaGFsZiB2YWx1ZS4gVGhlIGhhbGYgdmFsdWUgaXMgY29udmVydGVkIHRvIGEKKyAqIGZsb2F0IHZhbHVlIGFuZCB0aGUgZmxvYXQgdmFsdWUgaXMgcmV0dXJuZWQuCisgKiBUaGUgcmVhZCBhZGRyZXNzIGNvbXB1dGVkIGFzIChwICsgb2Zmc2V0KQorICogbXVzdCBiZSAxNi1iaXQgYWxpZ25lZC4KKyAqLworZmxvYXQgX19vdmxkIHZsb2FkX2hhbGYoc2l6ZV90IG9mZnNldCwgY29uc3QgX19jb25zdGFudCBoYWxmICpwKTsKKyNpZiBfX09QRU5DTF9DX1ZFUlNJT05fXyA+PSBDTF9WRVJTSU9OXzJfMAorZmxvYXQgX19vdmxkIHZsb2FkX2hhbGYoc2l6ZV90IG9mZnNldCwgY29uc3QgaGFsZiAqcCk7CisjZWxzZQorZmxvYXQgX19vdmxkIHZsb2FkX2hhbGYoc2l6ZV90IG9mZnNldCwgY29uc3QgX19nbG9iYWwgaGFsZiAqcCk7CitmbG9hdCBfX292bGQgdmxvYWRfaGFsZihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2xvY2FsIGhhbGYgKnApOworZmxvYXQgX19vdmxkIHZsb2FkX2hhbGYoc2l6ZV90IG9mZnNldCwgY29uc3QgX19wcml2YXRlIGhhbGYgKnApOworI2VuZGlmIC8vX19PUEVOQ0xfQ19WRVJTSU9OX18gPj0gQ0xfVkVSU0lPTl8yXzAKKworLyoqCisgKiBSZWFkIHNpemVvZiAoaGFsZm4pIGJ5dGVzIG9mIGRhdGEgZnJvbSBhZGRyZXNzCisgKiAocCArIChvZmZzZXQgKiBuKSkuIFRoZSBkYXRhIHJlYWQgaXMgaW50ZXJwcmV0ZWQKKyAqIGFzIGEgaGFsZm4gdmFsdWUuIFRoZSBoYWxmbiB2YWx1ZSByZWFkIGlzCisgKiBjb252ZXJ0ZWQgdG8gYSBmbG9hdG4gdmFsdWUgYW5kIHRoZSBmbG9hdG4KKyAqIHZhbHVlIGlzIHJldHVybmVkLiBUaGUgcmVhZCBhZGRyZXNzIGNvbXB1dGVkCisgKiBhcyAocCArIChvZmZzZXQgKiBuKSkgbXVzdCBiZSAxNi1iaXQgYWxpZ25lZC4KKyAqLworZmxvYXQyIF9fb3ZsZCB2bG9hZF9oYWxmMihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2NvbnN0YW50IGhhbGYgKnApOworZmxvYXQzIF9fb3ZsZCB2bG9hZF9oYWxmMyhzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2NvbnN0YW50IGhhbGYgKnApOworZmxvYXQ0IF9fb3ZsZCB2bG9hZF9oYWxmNChzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2NvbnN0YW50IGhhbGYgKnApOworZmxvYXQ4IF9fb3ZsZCB2bG9hZF9oYWxmOChzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2NvbnN0YW50IGhhbGYgKnApOworZmxvYXQxNiBfX292bGQgdmxvYWRfaGFsZjE2KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fY29uc3RhbnQgaGFsZiAqcCk7CisjaWYgX19PUEVOQ0xfQ19WRVJTSU9OX18gPj0gQ0xfVkVSU0lPTl8yXzAKK2Zsb2F0MiBfX292bGQgdmxvYWRfaGFsZjIoc2l6ZV90IG9mZnNldCwgY29uc3QgaGFsZiAqcCk7CitmbG9hdDMgX19vdmxkIHZsb2FkX2hhbGYzKHNpemVfdCBvZmZzZXQsIGNvbnN0IGhhbGYgKnApOworZmxvYXQ0IF9fb3ZsZCB2bG9hZF9oYWxmNChzaXplX3Qgb2Zmc2V0LCBjb25zdCBoYWxmICpwKTsKK2Zsb2F0OCBfX292bGQgdmxvYWRfaGFsZjgoc2l6ZV90IG9mZnNldCwgY29uc3QgaGFsZiAqcCk7CitmbG9hdDE2IF9fb3ZsZCB2bG9hZF9oYWxmMTYoc2l6ZV90IG9mZnNldCwgY29uc3QgaGFsZiAqcCk7CisjZWxzZQorZmxvYXQyIF9fb3ZsZCB2bG9hZF9oYWxmMihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2dsb2JhbCBoYWxmICpwKTsKK2Zsb2F0MyBfX292bGQgdmxvYWRfaGFsZjMoc2l6ZV90IG9mZnNldCwgY29uc3QgX19nbG9iYWwgaGFsZiAqcCk7CitmbG9hdDQgX19vdmxkIHZsb2FkX2hhbGY0KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fZ2xvYmFsIGhhbGYgKnApOworZmxvYXQ4IF9fb3ZsZCB2bG9hZF9oYWxmOChzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2dsb2JhbCBoYWxmICpwKTsKK2Zsb2F0MTYgX19vdmxkIHZsb2FkX2hhbGYxNihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2dsb2JhbCBoYWxmICpwKTsKK2Zsb2F0MiBfX292bGQgdmxvYWRfaGFsZjIoc2l6ZV90IG9mZnNldCwgY29uc3QgX19sb2NhbCBoYWxmICpwKTsKK2Zsb2F0MyBfX292bGQgdmxvYWRfaGFsZjMoc2l6ZV90IG9mZnNldCwgY29uc3QgX19sb2NhbCBoYWxmICpwKTsKK2Zsb2F0NCBfX292bGQgdmxvYWRfaGFsZjQoc2l6ZV90IG9mZnNldCwgY29uc3QgX19sb2NhbCBoYWxmICpwKTsKK2Zsb2F0OCBfX292bGQgdmxvYWRfaGFsZjgoc2l6ZV90IG9mZnNldCwgY29uc3QgX19sb2NhbCBoYWxmICpwKTsKK2Zsb2F0MTYgX19vdmxkIHZsb2FkX2hhbGYxNihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2xvY2FsIGhhbGYgKnApOworZmxvYXQyIF9fb3ZsZCB2bG9hZF9oYWxmMihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX3ByaXZhdGUgaGFsZiAqcCk7CitmbG9hdDMgX19vdmxkIHZsb2FkX2hhbGYzKHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fcHJpdmF0ZSBoYWxmICpwKTsKK2Zsb2F0NCBfX292bGQgdmxvYWRfaGFsZjQoc2l6ZV90IG9mZnNldCwgY29uc3QgX19wcml2YXRlIGhhbGYgKnApOworZmxvYXQ4IF9fb3ZsZCB2bG9hZF9oYWxmOChzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX3ByaXZhdGUgaGFsZiAqcCk7CitmbG9hdDE2IF9fb3ZsZCB2bG9hZF9oYWxmMTYoc2l6ZV90IG9mZnNldCwgY29uc3QgX19wcml2YXRlIGhhbGYgKnApOworI2VuZGlmIC8vX19PUEVOQ0xfQ19WRVJTSU9OX18gPj0gQ0xfVkVSU0lPTl8yXzAKKworLyoqCisgKiBUaGUgZmxvYXQgdmFsdWUgZ2l2ZW4gYnkgZGF0YSBpcyBmaXJzdAorICogY29udmVydGVkIHRvIGEgaGFsZiB2YWx1ZSB1c2luZyB0aGUgYXBwcm9wcmlhdGUKKyAqIHJvdW5kaW5nIG1vZGUuIFRoZSBoYWxmIHZhbHVlIGlzIHRoZW4gd3JpdHRlbgorICogdG8gYWRkcmVzcyBjb21wdXRlZCBhcyAocCArIG9mZnNldCkuIFRoZQorICogYWRkcmVzcyBjb21wdXRlZCBhcyAocCArIG9mZnNldCkgbXVzdCBiZSAxNi0KKyAqIGJpdCBhbGlnbmVkLgorICogdnN0b3JlX2hhbGYgdXNlIHRoZSBjdXJyZW50IHJvdW5kaW5nIG1vZGUuCisgKiBUaGUgZGVmYXVsdCBjdXJyZW50IHJvdW5kaW5nIG1vZGUgaXMgcm91bmQgdG8KKyAqIG5lYXJlc3QgZXZlbi4KKyAqLworI2lmIF9fT1BFTkNMX0NfVkVSU0lPTl9fID49IENMX1ZFUlNJT05fMl8wCit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZihmbG9hdCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmX3J0ZShmbG9hdCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmX3J0eihmbG9hdCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmX3J0cChmbG9hdCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmX3J0bihmbG9hdCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBoYWxmICpwKTsKKyNpZmRlZiBjbF9raHJfZnA2NAordm9pZCBfX292bGQgdnN0b3JlX2hhbGYoZG91YmxlIGRhdGEsIHNpemVfdCBvZmZzZXQsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGZfcnRlKGRvdWJsZSBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmX3J0eihkb3VibGUgZGF0YSwgc2l6ZV90IG9mZnNldCwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZl9ydHAoZG91YmxlIGRhdGEsIHNpemVfdCBvZmZzZXQsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGZfcnRuKGRvdWJsZSBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBoYWxmICpwKTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjZWxzZQordm9pZCBfX292bGQgdnN0b3JlX2hhbGYoZmxvYXQgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZl9ydGUoZmxvYXQgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZl9ydHooZmxvYXQgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZl9ydHAoZmxvYXQgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZl9ydG4oZmxvYXQgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZihmbG9hdCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGZfcnRlKGZsb2F0IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZl9ydHooZmxvYXQgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmX3J0cChmbG9hdCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGZfcnRuKGZsb2F0IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZihmbG9hdCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZl9ydGUoZmxvYXQgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGZfcnR6KGZsb2F0IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmX3J0cChmbG9hdCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZl9ydG4oZmxvYXQgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOworI2lmZGVmIGNsX2tocl9mcDY0Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZihkb3VibGUgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZl9ydGUoZG91YmxlIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGZfcnR6KGRvdWJsZSBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmX3J0cChkb3VibGUgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZl9ydG4oZG91YmxlIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGYoZG91YmxlIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZl9ydGUoZG91YmxlIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZl9ydHooZG91YmxlIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZl9ydHAoZG91YmxlIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZl9ydG4oZG91YmxlIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZihkb3VibGUgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGZfcnRlKGRvdWJsZSBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZl9ydHooZG91YmxlIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmX3J0cChkb3VibGUgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGZfcnRuKGRvdWJsZSBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgaGFsZiAqcCk7CisjZW5kaWYgLy9jbF9raHJfZnA2NAorI2VuZGlmIC8vX19PUEVOQ0xfQ19WRVJTSU9OX18gPj0gQ0xfVkVSU0lPTl8yXzAKKworLyoqCisgKiBUaGUgZmxvYXRuIHZhbHVlIGdpdmVuIGJ5IGRhdGEgaXMgY29udmVydGVkIHRvCisgKiBhIGhhbGZuIHZhbHVlIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSByb3VuZGluZworICogbW9kZS4gVGhlIGhhbGZuIHZhbHVlIGlzIHRoZW4gd3JpdHRlbiB0bworICogYWRkcmVzcyBjb21wdXRlZCBhcyAocCArIChvZmZzZXQgKiBuKSkuIFRoZQorICogYWRkcmVzcyBjb21wdXRlZCBhcyAocCArIChvZmZzZXQgKiBuKSkgbXVzdCBiZQorICogMTYtYml0IGFsaWduZWQuCisgKiB2c3RvcmVfaGFsZm4gdXNlcyB0aGUgY3VycmVudCByb3VuZGluZyBtb2RlLgorICogVGhlIGRlZmF1bHQgY3VycmVudCByb3VuZGluZyBtb2RlIGlzIHJvdW5kIHRvCisgKiBuZWFyZXN0IGV2ZW4uCisgKi8KKyNpZiBfX09QRU5DTF9DX1ZFUlNJT05fXyA+PSBDTF9WRVJTSU9OXzJfMAordm9pZCBfX292bGQgdnN0b3JlX2hhbGYyKGZsb2F0MiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmMyhmbG9hdDMgZGF0YSwgc2l6ZV90IG9mZnNldCwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjQoZmxvYXQ0IGRhdGEsIHNpemVfdCBvZmZzZXQsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGY4KGZsb2F0OCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmMTYoZmxvYXQxNiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmMl9ydGUoZmxvYXQyIGRhdGEsIHNpemVfdCBvZmZzZXQsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGYzX3J0ZShmbG9hdDMgZGF0YSwgc2l6ZV90IG9mZnNldCwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjRfcnRlKGZsb2F0NCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmOF9ydGUoZmxvYXQ4IGRhdGEsIHNpemVfdCBvZmZzZXQsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGYxNl9ydGUoZmxvYXQxNiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmMl9ydHooZmxvYXQyIGRhdGEsIHNpemVfdCBvZmZzZXQsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGYzX3J0eihmbG9hdDMgZGF0YSwgc2l6ZV90IG9mZnNldCwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjRfcnR6KGZsb2F0NCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmOF9ydHooZmxvYXQ4IGRhdGEsIHNpemVfdCBvZmZzZXQsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGYxNl9ydHooZmxvYXQxNiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmMl9ydHAoZmxvYXQyIGRhdGEsIHNpemVfdCBvZmZzZXQsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGYzX3J0cChmbG9hdDMgZGF0YSwgc2l6ZV90IG9mZnNldCwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjRfcnRwKGZsb2F0NCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmOF9ydHAoZmxvYXQ4IGRhdGEsIHNpemVfdCBvZmZzZXQsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGYxNl9ydHAoZmxvYXQxNiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmMl9ydG4oZmxvYXQyIGRhdGEsIHNpemVfdCBvZmZzZXQsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGYzX3J0bihmbG9hdDMgZGF0YSwgc2l6ZV90IG9mZnNldCwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjRfcnRuKGZsb2F0NCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmOF9ydG4oZmxvYXQ4IGRhdGEsIHNpemVfdCBvZmZzZXQsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGYxNl9ydG4oZmxvYXQxNiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBoYWxmICpwKTsKKyNpZmRlZiBjbF9raHJfZnA2NAordm9pZCBfX292bGQgdnN0b3JlX2hhbGYyKGRvdWJsZTIgZGF0YSwgc2l6ZV90IG9mZnNldCwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjMoZG91YmxlMyBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmNChkb3VibGU0IGRhdGEsIHNpemVfdCBvZmZzZXQsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGY4KGRvdWJsZTggZGF0YSwgc2l6ZV90IG9mZnNldCwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjE2KGRvdWJsZTE2IGRhdGEsIHNpemVfdCBvZmZzZXQsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGYyX3J0ZShkb3VibGUyIGRhdGEsIHNpemVfdCBvZmZzZXQsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGYzX3J0ZShkb3VibGUzIGRhdGEsIHNpemVfdCBvZmZzZXQsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGY0X3J0ZShkb3VibGU0IGRhdGEsIHNpemVfdCBvZmZzZXQsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGY4X3J0ZShkb3VibGU4IGRhdGEsIHNpemVfdCBvZmZzZXQsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGYxNl9ydGUoZG91YmxlMTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjJfcnR6KGRvdWJsZTIgZGF0YSwgc2l6ZV90IG9mZnNldCwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjNfcnR6KGRvdWJsZTMgZGF0YSwgc2l6ZV90IG9mZnNldCwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjRfcnR6KGRvdWJsZTQgZGF0YSwgc2l6ZV90IG9mZnNldCwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjhfcnR6KGRvdWJsZTggZGF0YSwgc2l6ZV90IG9mZnNldCwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjE2X3J0eihkb3VibGUxNiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmMl9ydHAoZG91YmxlMiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmM19ydHAoZG91YmxlMyBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmNF9ydHAoZG91YmxlNCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmOF9ydHAoZG91YmxlOCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmMTZfcnRwKGRvdWJsZTE2IGRhdGEsIHNpemVfdCBvZmZzZXQsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGYyX3J0bihkb3VibGUyIGRhdGEsIHNpemVfdCBvZmZzZXQsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGYzX3J0bihkb3VibGUzIGRhdGEsIHNpemVfdCBvZmZzZXQsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGY0X3J0bihkb3VibGU0IGRhdGEsIHNpemVfdCBvZmZzZXQsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGY4X3J0bihkb3VibGU4IGRhdGEsIHNpemVfdCBvZmZzZXQsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGYxNl9ydG4oZG91YmxlMTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgaGFsZiAqcCk7CisjZW5kaWYgLy9jbF9raHJfZnA2NAorI2Vsc2UKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmMihmbG9hdDIgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjMoZmxvYXQzIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGY0KGZsb2F0NCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmOChmbG9hdDggZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjE2KGZsb2F0MTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjJfcnRlKGZsb2F0MiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmM19ydGUoZmxvYXQzIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGY0X3J0ZShmbG9hdDQgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjhfcnRlKGZsb2F0OCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmMTZfcnRlKGZsb2F0MTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjJfcnR6KGZsb2F0MiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmM19ydHooZmxvYXQzIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGY0X3J0eihmbG9hdDQgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjhfcnR6KGZsb2F0OCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmMTZfcnR6KGZsb2F0MTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjJfcnRwKGZsb2F0MiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmM19ydHAoZmxvYXQzIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGY0X3J0cChmbG9hdDQgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjhfcnRwKGZsb2F0OCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmMTZfcnRwKGZsb2F0MTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjJfcnRuKGZsb2F0MiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmM19ydG4oZmxvYXQzIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGY0X3J0bihmbG9hdDQgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjhfcnRuKGZsb2F0OCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmMTZfcnRuKGZsb2F0MTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjIoZmxvYXQyIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjMoZmxvYXQzIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjQoZmxvYXQ0IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjgoZmxvYXQ4IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjE2KGZsb2F0MTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmMl9ydGUoZmxvYXQyIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjNfcnRlKGZsb2F0MyBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGY0X3J0ZShmbG9hdDQgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmOF9ydGUoZmxvYXQ4IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjE2X3J0ZShmbG9hdDE2IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjJfcnR6KGZsb2F0MiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGYzX3J0eihmbG9hdDMgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmNF9ydHooZmxvYXQ0IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjhfcnR6KGZsb2F0OCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGYxNl9ydHooZmxvYXQxNiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGYyX3J0cChmbG9hdDIgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmM19ydHAoZmxvYXQzIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjRfcnRwKGZsb2F0NCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGY4X3J0cChmbG9hdDggZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmMTZfcnRwKGZsb2F0MTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmMl9ydG4oZmxvYXQyIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjNfcnRuKGZsb2F0MyBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGY0X3J0bihmbG9hdDQgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmOF9ydG4oZmxvYXQ4IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjE2X3J0bihmbG9hdDE2IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjIoZmxvYXQyIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmMyhmbG9hdDMgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGY0KGZsb2F0NCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjgoZmxvYXQ4IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmMTYoZmxvYXQxNiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjJfcnRlKGZsb2F0MiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjNfcnRlKGZsb2F0MyBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjRfcnRlKGZsb2F0NCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjhfcnRlKGZsb2F0OCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjE2X3J0ZShmbG9hdDE2IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmMl9ydHooZmxvYXQyIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmM19ydHooZmxvYXQzIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmNF9ydHooZmxvYXQ0IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmOF9ydHooZmxvYXQ4IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmMTZfcnR6KGZsb2F0MTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGYyX3J0cChmbG9hdDIgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGYzX3J0cChmbG9hdDMgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGY0X3J0cChmbG9hdDQgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGY4X3J0cChmbG9hdDggZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGYxNl9ydHAoZmxvYXQxNiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjJfcnRuKGZsb2F0MiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjNfcnRuKGZsb2F0MyBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjRfcnRuKGZsb2F0NCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjhfcnRuKGZsb2F0OCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjE2X3J0bihmbG9hdDE2IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBoYWxmICpwKTsKKyNpZmRlZiBjbF9raHJfZnA2NAordm9pZCBfX292bGQgdnN0b3JlX2hhbGYyKGRvdWJsZTIgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjMoZG91YmxlMyBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmNChkb3VibGU0IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGY4KGRvdWJsZTggZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjE2KGRvdWJsZTE2IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGYyX3J0ZShkb3VibGUyIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGYzX3J0ZShkb3VibGUzIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGY0X3J0ZShkb3VibGU0IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGY4X3J0ZShkb3VibGU4IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGYxNl9ydGUoZG91YmxlMTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjJfcnR6KGRvdWJsZTIgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjNfcnR6KGRvdWJsZTMgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjRfcnR6KGRvdWJsZTQgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjhfcnR6KGRvdWJsZTggZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjE2X3J0eihkb3VibGUxNiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmMl9ydHAoZG91YmxlMiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmM19ydHAoZG91YmxlMyBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmNF9ydHAoZG91YmxlNCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmOF9ydHAoZG91YmxlOCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmMTZfcnRwKGRvdWJsZTE2IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGYyX3J0bihkb3VibGUyIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGYzX3J0bihkb3VibGUzIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGY0X3J0bihkb3VibGU0IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGY4X3J0bihkb3VibGU4IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGYxNl9ydG4oZG91YmxlMTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjIoZG91YmxlMiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGYzKGRvdWJsZTMgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmNChkb3VibGU0IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjgoZG91YmxlOCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGYxNihkb3VibGUxNiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGYyX3J0ZShkb3VibGUyIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjNfcnRlKGRvdWJsZTMgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmNF9ydGUoZG91YmxlNCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGY4X3J0ZShkb3VibGU4IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjE2X3J0ZShkb3VibGUxNiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGYyX3J0eihkb3VibGUyIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjNfcnR6KGRvdWJsZTMgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmNF9ydHooZG91YmxlNCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGY4X3J0eihkb3VibGU4IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjE2X3J0eihkb3VibGUxNiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGYyX3J0cChkb3VibGUyIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjNfcnRwKGRvdWJsZTMgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmNF9ydHAoZG91YmxlNCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGY4X3J0cChkb3VibGU4IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjE2X3J0cChkb3VibGUxNiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGYyX3J0bihkb3VibGUyIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjNfcnRuKGRvdWJsZTMgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmNF9ydG4oZG91YmxlNCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGY4X3J0bihkb3VibGU4IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjE2X3J0bihkb3VibGUxNiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGYyKGRvdWJsZTIgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGYzKGRvdWJsZTMgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGY0KGRvdWJsZTQgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGY4KGRvdWJsZTggZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGYxNihkb3VibGUxNiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjJfcnRlKGRvdWJsZTIgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGYzX3J0ZShkb3VibGUzIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmNF9ydGUoZG91YmxlNCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjhfcnRlKGRvdWJsZTggZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGYxNl9ydGUoZG91YmxlMTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGYyX3J0eihkb3VibGUyIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmM19ydHooZG91YmxlMyBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjRfcnR6KGRvdWJsZTQgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGY4X3J0eihkb3VibGU4IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmMTZfcnR6KGRvdWJsZTE2IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmMl9ydHAoZG91YmxlMiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjNfcnRwKGRvdWJsZTMgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGY0X3J0cChkb3VibGU0IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmOF9ydHAoZG91YmxlOCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjE2X3J0cChkb3VibGUxNiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjJfcnRuKGRvdWJsZTIgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGYzX3J0bihkb3VibGUzIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZV9oYWxmNF9ydG4oZG91YmxlNCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVfaGFsZjhfcnRuKGRvdWJsZTggZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlX2hhbGYxNl9ydG4oZG91YmxlMTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOworI2VuZGlmIC8vY2xfa2hyX2ZwNjQKKyNlbmRpZiAvL19fT1BFTkNMX0NfVkVSU0lPTl9fID49IENMX1ZFUlNJT05fMl8wCisKKy8qKgorICogRm9yIG4gPSAxLCAyLCA0LCA4IGFuZCAxNiByZWFkIHNpemVvZiAoaGFsZm4pCisgKiBieXRlcyBvZiBkYXRhIGZyb20gYWRkcmVzcyAocCArIChvZmZzZXQgKiBuKSkuCisgKiBUaGUgZGF0YSByZWFkIGlzIGludGVycHJldGVkIGFzIGEgaGFsZm4gdmFsdWUuCisgKiBUaGUgaGFsZm4gdmFsdWUgcmVhZCBpcyBjb252ZXJ0ZWQgdG8gYSBmbG9hdG4KKyAqIHZhbHVlIGFuZCB0aGUgZmxvYXRuIHZhbHVlIGlzIHJldHVybmVkLgorICogVGhlIGFkZHJlc3MgY29tcHV0ZWQgYXMgKHAgKyAob2Zmc2V0ICogbikpCisgKiBtdXN0IGJlIGFsaWduZWQgdG8gc2l6ZW9mIChoYWxmbikgYnl0ZXMuCisgKiBGb3IgbiA9IDMsIHZsb2FkYV9oYWxmMyByZWFkcyBhIGhhbGYzIGZyb20KKyAqIGFkZHJlc3MgKHAgKyAob2Zmc2V0ICogNCkpIGFuZCByZXR1cm5zIGEgZmxvYXQzLgorICogVGhlIGFkZHJlc3MgY29tcHV0ZWQgYXMgKHAgKyAob2Zmc2V0ICogNCkpCisgKiBtdXN0IGJlIGFsaWduZWQgdG8gc2l6ZW9mIChoYWxmKSAqIDQgYnl0ZXMuCisgKi8KK2Zsb2F0IF9fb3ZsZCB2bG9hZGFfaGFsZihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2NvbnN0YW50IGhhbGYgKnApOworZmxvYXQyIF9fb3ZsZCB2bG9hZGFfaGFsZjIoc2l6ZV90IG9mZnNldCwgY29uc3QgX19jb25zdGFudCBoYWxmICpwKTsKK2Zsb2F0MyBfX292bGQgdmxvYWRhX2hhbGYzKHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fY29uc3RhbnQgaGFsZiAqcCk7CitmbG9hdDQgX19vdmxkIHZsb2FkYV9oYWxmNChzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2NvbnN0YW50IGhhbGYgKnApOworZmxvYXQ4IF9fb3ZsZCB2bG9hZGFfaGFsZjgoc2l6ZV90IG9mZnNldCwgY29uc3QgX19jb25zdGFudCBoYWxmICpwKTsKK2Zsb2F0MTYgX19vdmxkIHZsb2FkYV9oYWxmMTYoc2l6ZV90IG9mZnNldCwgY29uc3QgX19jb25zdGFudCBoYWxmICpwKTsKKyNpZiBfX09QRU5DTF9DX1ZFUlNJT05fXyA+PSBDTF9WRVJTSU9OXzJfMAorZmxvYXQgX19vdmxkIHZsb2FkYV9oYWxmKHNpemVfdCBvZmZzZXQsIGNvbnN0IGhhbGYgKnApOworZmxvYXQyIF9fb3ZsZCB2bG9hZGFfaGFsZjIoc2l6ZV90IG9mZnNldCwgY29uc3QgaGFsZiAqcCk7CitmbG9hdDMgX19vdmxkIHZsb2FkYV9oYWxmMyhzaXplX3Qgb2Zmc2V0LCBjb25zdCBoYWxmICpwKTsKK2Zsb2F0NCBfX292bGQgdmxvYWRhX2hhbGY0KHNpemVfdCBvZmZzZXQsIGNvbnN0IGhhbGYgKnApOworZmxvYXQ4IF9fb3ZsZCB2bG9hZGFfaGFsZjgoc2l6ZV90IG9mZnNldCwgY29uc3QgaGFsZiAqcCk7CitmbG9hdDE2IF9fb3ZsZCB2bG9hZGFfaGFsZjE2KHNpemVfdCBvZmZzZXQsIGNvbnN0IGhhbGYgKnApOworI2Vsc2UKK2Zsb2F0IF9fb3ZsZCB2bG9hZGFfaGFsZihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2dsb2JhbCBoYWxmICpwKTsKK2Zsb2F0MiBfX292bGQgdmxvYWRhX2hhbGYyKHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fZ2xvYmFsIGhhbGYgKnApOworZmxvYXQzIF9fb3ZsZCB2bG9hZGFfaGFsZjMoc2l6ZV90IG9mZnNldCwgY29uc3QgX19nbG9iYWwgaGFsZiAqcCk7CitmbG9hdDQgX19vdmxkIHZsb2FkYV9oYWxmNChzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2dsb2JhbCBoYWxmICpwKTsKK2Zsb2F0OCBfX292bGQgdmxvYWRhX2hhbGY4KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fZ2xvYmFsIGhhbGYgKnApOworZmxvYXQxNiBfX292bGQgdmxvYWRhX2hhbGYxNihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2dsb2JhbCBoYWxmICpwKTsKK2Zsb2F0IF9fb3ZsZCB2bG9hZGFfaGFsZihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2xvY2FsIGhhbGYgKnApOworZmxvYXQyIF9fb3ZsZCB2bG9hZGFfaGFsZjIoc2l6ZV90IG9mZnNldCwgY29uc3QgX19sb2NhbCBoYWxmICpwKTsKK2Zsb2F0MyBfX292bGQgdmxvYWRhX2hhbGYzKHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fbG9jYWwgaGFsZiAqcCk7CitmbG9hdDQgX19vdmxkIHZsb2FkYV9oYWxmNChzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX2xvY2FsIGhhbGYgKnApOworZmxvYXQ4IF9fb3ZsZCB2bG9hZGFfaGFsZjgoc2l6ZV90IG9mZnNldCwgY29uc3QgX19sb2NhbCBoYWxmICpwKTsKK2Zsb2F0MTYgX19vdmxkIHZsb2FkYV9oYWxmMTYoc2l6ZV90IG9mZnNldCwgY29uc3QgX19sb2NhbCBoYWxmICpwKTsKK2Zsb2F0IF9fb3ZsZCB2bG9hZGFfaGFsZihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX3ByaXZhdGUgaGFsZiAqcCk7CitmbG9hdDIgX19vdmxkIHZsb2FkYV9oYWxmMihzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX3ByaXZhdGUgaGFsZiAqcCk7CitmbG9hdDMgX19vdmxkIHZsb2FkYV9oYWxmMyhzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX3ByaXZhdGUgaGFsZiAqcCk7CitmbG9hdDQgX19vdmxkIHZsb2FkYV9oYWxmNChzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX3ByaXZhdGUgaGFsZiAqcCk7CitmbG9hdDggX19vdmxkIHZsb2FkYV9oYWxmOChzaXplX3Qgb2Zmc2V0LCBjb25zdCBfX3ByaXZhdGUgaGFsZiAqcCk7CitmbG9hdDE2IF9fb3ZsZCB2bG9hZGFfaGFsZjE2KHNpemVfdCBvZmZzZXQsIGNvbnN0IF9fcHJpdmF0ZSBoYWxmICpwKTsKKyNlbmRpZiAvL19fT1BFTkNMX0NfVkVSU0lPTl9fID49IENMX1ZFUlNJT05fMl8wCisKKy8qKgorICogVGhlIGZsb2F0biB2YWx1ZSBnaXZlbiBieSBkYXRhIGlzIGNvbnZlcnRlZCB0bworICogYSBoYWxmbiB2YWx1ZSB1c2luZyB0aGUgYXBwcm9wcmlhdGUgcm91bmRpbmcKKyAqIG1vZGUuCisgKiBGb3IgbiA9IDEsIDIsIDQsIDggYW5kIDE2LCB0aGUgaGFsZm4gdmFsdWUgaXMKKyAqIHdyaXR0ZW4gdG8gdGhlIGFkZHJlc3MgY29tcHV0ZWQgYXMgKHAgKyAob2Zmc2V0CisgKiAqIG4pKS4gVGhlIGFkZHJlc3MgY29tcHV0ZWQgYXMgKHAgKyAob2Zmc2V0ICoKKyAqIG4pKSBtdXN0IGJlIGFsaWduZWQgdG8gc2l6ZW9mIChoYWxmbikgYnl0ZXMuCisgKiBGb3IgbiA9IDMsIHRoZSBoYWxmMyB2YWx1ZSBpcyB3cml0dGVuIHRvIHRoZQorICogYWRkcmVzcyBjb21wdXRlZCBhcyAocCArIChvZmZzZXQgKiA0KSkuIFRoZQorICogYWRkcmVzcyBjb21wdXRlZCBhcyAocCArIChvZmZzZXQgKiA0KSkgbXVzdCBiZQorICogYWxpZ25lZCB0byBzaXplb2YgKGhhbGYpICogNCBieXRlcy4KKyAqIHZzdG9yZWFfaGFsZm4gdXNlcyB0aGUgY3VycmVudCByb3VuZGluZworICogbW9kZS4gVGhlIGRlZmF1bHQgY3VycmVudCByb3VuZGluZyBtb2RlIGlzCisgKiByb3VuZCB0byBuZWFyZXN0IGV2ZW4uCisgKi8KKyNpZiBfX09QRU5DTF9DX1ZFUlNJT05fXyA+PSBDTF9WRVJTSU9OXzJfMAordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmKGZsb2F0IGRhdGEsIHNpemVfdCBvZmZzZXQsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmMihmbG9hdDIgZGF0YSwgc2l6ZV90IG9mZnNldCwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGYzKGZsb2F0MyBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjQoZmxvYXQ0IGRhdGEsIHNpemVfdCBvZmZzZXQsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmOChmbG9hdDggZGF0YSwgc2l6ZV90IG9mZnNldCwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGYxNihmbG9hdDE2IGRhdGEsIHNpemVfdCBvZmZzZXQsIGhhbGYgKnApOworCit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGZfcnRlKGZsb2F0IGRhdGEsIHNpemVfdCBvZmZzZXQsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmMl9ydGUoZmxvYXQyIGRhdGEsIHNpemVfdCBvZmZzZXQsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmM19ydGUoZmxvYXQzIGRhdGEsIHNpemVfdCBvZmZzZXQsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmNF9ydGUoZmxvYXQ0IGRhdGEsIHNpemVfdCBvZmZzZXQsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmOF9ydGUoZmxvYXQ4IGRhdGEsIHNpemVfdCBvZmZzZXQsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmMTZfcnRlKGZsb2F0MTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgaGFsZiAqcCk7CisKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZl9ydHooZmxvYXQgZGF0YSwgc2l6ZV90IG9mZnNldCwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGYyX3J0eihmbG9hdDIgZGF0YSwgc2l6ZV90IG9mZnNldCwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGYzX3J0eihmbG9hdDMgZGF0YSwgc2l6ZV90IG9mZnNldCwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGY0X3J0eihmbG9hdDQgZGF0YSwgc2l6ZV90IG9mZnNldCwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGY4X3J0eihmbG9hdDggZGF0YSwgc2l6ZV90IG9mZnNldCwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGYxNl9ydHooZmxvYXQxNiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBoYWxmICpwKTsKKwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmX3J0cChmbG9hdCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjJfcnRwKGZsb2F0MiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjNfcnRwKGZsb2F0MyBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjRfcnRwKGZsb2F0NCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjhfcnRwKGZsb2F0OCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjE2X3J0cChmbG9hdDE2IGRhdGEsIHNpemVfdCBvZmZzZXQsIGhhbGYgKnApOworCit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGZfcnRuKGZsb2F0IGRhdGEsIHNpemVfdCBvZmZzZXQsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmMl9ydG4oZmxvYXQyIGRhdGEsIHNpemVfdCBvZmZzZXQsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmM19ydG4oZmxvYXQzIGRhdGEsIHNpemVfdCBvZmZzZXQsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmNF9ydG4oZmxvYXQ0IGRhdGEsIHNpemVfdCBvZmZzZXQsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmOF9ydG4oZmxvYXQ4IGRhdGEsIHNpemVfdCBvZmZzZXQsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmMTZfcnRuKGZsb2F0MTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgaGFsZiAqcCk7CisKKyNpZmRlZiBjbF9raHJfZnA2NAordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmKGRvdWJsZSBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjIoZG91YmxlMiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjMoZG91YmxlMyBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjQoZG91YmxlNCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjgoZG91YmxlOCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjE2KGRvdWJsZTE2IGRhdGEsIHNpemVfdCBvZmZzZXQsIGhhbGYgKnApOworCit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGZfcnRlKGRvdWJsZSBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjJfcnRlKGRvdWJsZTIgZGF0YSwgc2l6ZV90IG9mZnNldCwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGYzX3J0ZShkb3VibGUzIGRhdGEsIHNpemVfdCBvZmZzZXQsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmNF9ydGUoZG91YmxlNCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjhfcnRlKGRvdWJsZTggZGF0YSwgc2l6ZV90IG9mZnNldCwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGYxNl9ydGUoZG91YmxlMTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgaGFsZiAqcCk7CisKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZl9ydHooZG91YmxlIGRhdGEsIHNpemVfdCBvZmZzZXQsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmMl9ydHooZG91YmxlMiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjNfcnR6KGRvdWJsZTMgZGF0YSwgc2l6ZV90IG9mZnNldCwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGY0X3J0eihkb3VibGU0IGRhdGEsIHNpemVfdCBvZmZzZXQsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmOF9ydHooZG91YmxlOCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjE2X3J0eihkb3VibGUxNiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBoYWxmICpwKTsKKwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmX3J0cChkb3VibGUgZGF0YSwgc2l6ZV90IG9mZnNldCwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGYyX3J0cChkb3VibGUyIGRhdGEsIHNpemVfdCBvZmZzZXQsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmM19ydHAoZG91YmxlMyBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjRfcnRwKGRvdWJsZTQgZGF0YSwgc2l6ZV90IG9mZnNldCwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGY4X3J0cChkb3VibGU4IGRhdGEsIHNpemVfdCBvZmZzZXQsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmMTZfcnRwKGRvdWJsZTE2IGRhdGEsIHNpemVfdCBvZmZzZXQsIGhhbGYgKnApOworCit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGZfcnRuKGRvdWJsZSBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjJfcnRuKGRvdWJsZTIgZGF0YSwgc2l6ZV90IG9mZnNldCwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGYzX3J0bihkb3VibGUzIGRhdGEsIHNpemVfdCBvZmZzZXQsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmNF9ydG4oZG91YmxlNCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjhfcnRuKGRvdWJsZTggZGF0YSwgc2l6ZV90IG9mZnNldCwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGYxNl9ydG4oZG91YmxlMTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgaGFsZiAqcCk7CisjZW5kaWYgLy9jbF9raHJfZnA2NAorCisjZWxzZQordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmKGZsb2F0IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmMihmbG9hdDIgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGYzKGZsb2F0MyBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjQoZmxvYXQ0IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmOChmbG9hdDggZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGYxNihmbG9hdDE2IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOworCit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGZfcnRlKGZsb2F0IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmMl9ydGUoZmxvYXQyIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmM19ydGUoZmxvYXQzIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmNF9ydGUoZmxvYXQ0IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmOF9ydGUoZmxvYXQ4IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmMTZfcnRlKGZsb2F0MTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgaGFsZiAqcCk7CisKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZl9ydHooZmxvYXQgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGYyX3J0eihmbG9hdDIgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGYzX3J0eihmbG9hdDMgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGY0X3J0eihmbG9hdDQgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGY4X3J0eihmbG9hdDggZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGYxNl9ydHooZmxvYXQxNiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCBoYWxmICpwKTsKKwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmX3J0cChmbG9hdCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjJfcnRwKGZsb2F0MiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjNfcnRwKGZsb2F0MyBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjRfcnRwKGZsb2F0NCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjhfcnRwKGZsb2F0OCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjE2X3J0cChmbG9hdDE2IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOworCit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGZfcnRuKGZsb2F0IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmMl9ydG4oZmxvYXQyIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmM19ydG4oZmxvYXQzIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmNF9ydG4oZmxvYXQ0IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmOF9ydG4oZmxvYXQ4IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmMTZfcnRuKGZsb2F0MTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgaGFsZiAqcCk7CisKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZihmbG9hdCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmMihmbG9hdDIgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjMoZmxvYXQzIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGY0KGZsb2F0NCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmOChmbG9hdDggZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjE2KGZsb2F0MTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCBoYWxmICpwKTsKKwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmX3J0ZShmbG9hdCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmMl9ydGUoZmxvYXQyIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGYzX3J0ZShmbG9hdDMgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjRfcnRlKGZsb2F0NCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmOF9ydGUoZmxvYXQ4IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGYxNl9ydGUoZmxvYXQxNiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGhhbGYgKnApOworCit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGZfcnR6KGZsb2F0IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGYyX3J0eihmbG9hdDIgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjNfcnR6KGZsb2F0MyBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmNF9ydHooZmxvYXQ0IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGY4X3J0eihmbG9hdDggZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjE2X3J0eihmbG9hdDE2IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgaGFsZiAqcCk7CisKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZl9ydHAoZmxvYXQgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjJfcnRwKGZsb2F0MiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmM19ydHAoZmxvYXQzIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGY0X3J0cChmbG9hdDQgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjhfcnRwKGZsb2F0OCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmMTZfcnRwKGZsb2F0MTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCBoYWxmICpwKTsKKwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmX3J0bihmbG9hdCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmMl9ydG4oZmxvYXQyIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGYzX3J0bihmbG9hdDMgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjRfcnRuKGZsb2F0NCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmOF9ydG4oZmxvYXQ4IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGYxNl9ydG4oZmxvYXQxNiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGhhbGYgKnApOworCit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGYoZmxvYXQgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmMihmbG9hdDIgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmMyhmbG9hdDMgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmNChmbG9hdDQgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmOChmbG9hdDggZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmMTYoZmxvYXQxNiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgaGFsZiAqcCk7CisKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZl9ydGUoZmxvYXQgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmMl9ydGUoZmxvYXQyIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjNfcnRlKGZsb2F0MyBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGY0X3J0ZShmbG9hdDQgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmOF9ydGUoZmxvYXQ4IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjE2X3J0ZShmbG9hdDE2IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBoYWxmICpwKTsKKwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmX3J0eihmbG9hdCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGYyX3J0eihmbG9hdDIgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmM19ydHooZmxvYXQzIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjRfcnR6KGZsb2F0NCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGY4X3J0eihmbG9hdDggZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmMTZfcnR6KGZsb2F0MTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOworCit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGZfcnRwKGZsb2F0IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjJfcnRwKGZsb2F0MiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGYzX3J0cChmbG9hdDMgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmNF9ydHAoZmxvYXQ0IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjhfcnRwKGZsb2F0OCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGYxNl9ydHAoZmxvYXQxNiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgaGFsZiAqcCk7CisKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZl9ydG4oZmxvYXQgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmMl9ydG4oZmxvYXQyIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjNfcnRuKGZsb2F0MyBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGY0X3J0bihmbG9hdDQgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmOF9ydG4oZmxvYXQ4IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjE2X3J0bihmbG9hdDE2IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBoYWxmICpwKTsKKworI2lmZGVmIGNsX2tocl9mcDY0Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGYoZG91YmxlIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmMihkb3VibGUyIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmMyhkb3VibGUzIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmNChkb3VibGU0IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmOChkb3VibGU4IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmMTYoZG91YmxlMTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgaGFsZiAqcCk7CisKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZl9ydGUoZG91YmxlIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmMl9ydGUoZG91YmxlMiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjNfcnRlKGRvdWJsZTMgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGY0X3J0ZShkb3VibGU0IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmOF9ydGUoZG91YmxlOCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjE2X3J0ZShkb3VibGUxNiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCBoYWxmICpwKTsKKwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmX3J0eihkb3VibGUgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGYyX3J0eihkb3VibGUyIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmM19ydHooZG91YmxlMyBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjRfcnR6KGRvdWJsZTQgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGY4X3J0eihkb3VibGU4IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmMTZfcnR6KGRvdWJsZTE2IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOworCit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGZfcnRwKGRvdWJsZSBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjJfcnRwKGRvdWJsZTIgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGYzX3J0cChkb3VibGUzIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmNF9ydHAoZG91YmxlNCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjhfcnRwKGRvdWJsZTggZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGYxNl9ydHAoZG91YmxlMTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgaGFsZiAqcCk7CisKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZl9ydG4oZG91YmxlIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmMl9ydG4oZG91YmxlMiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjNfcnRuKGRvdWJsZTMgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19nbG9iYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGY0X3J0bihkb3VibGU0IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fZ2xvYmFsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmOF9ydG4oZG91YmxlOCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjE2X3J0bihkb3VibGUxNiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2dsb2JhbCBoYWxmICpwKTsKKwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmKGRvdWJsZSBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmMihkb3VibGUyIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGYzKGRvdWJsZTMgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjQoZG91YmxlNCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmOChkb3VibGU4IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGYxNihkb3VibGUxNiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGhhbGYgKnApOworCit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGZfcnRlKGRvdWJsZSBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmMl9ydGUoZG91YmxlMiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmM19ydGUoZG91YmxlMyBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmNF9ydGUoZG91YmxlNCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmOF9ydGUoZG91YmxlOCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmMTZfcnRlKGRvdWJsZTE2IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgaGFsZiAqcCk7CisKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZl9ydHooZG91YmxlIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGYyX3J0eihkb3VibGUyIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGYzX3J0eihkb3VibGUzIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGY0X3J0eihkb3VibGU0IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGY4X3J0eihkb3VibGU4IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGYxNl9ydHooZG91YmxlMTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCBoYWxmICpwKTsKKwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmX3J0cChkb3VibGUgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjJfcnRwKGRvdWJsZTIgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjNfcnRwKGRvdWJsZTMgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjRfcnRwKGRvdWJsZTQgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjhfcnRwKGRvdWJsZTggZGF0YSwgc2l6ZV90IG9mZnNldCwgX19sb2NhbCBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjE2X3J0cChkb3VibGUxNiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGhhbGYgKnApOworCit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGZfcnRuKGRvdWJsZSBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmMl9ydG4oZG91YmxlMiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmM19ydG4oZG91YmxlMyBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmNF9ydG4oZG91YmxlNCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmOF9ydG4oZG91YmxlOCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX2xvY2FsIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmMTZfcnRuKGRvdWJsZTE2IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fbG9jYWwgaGFsZiAqcCk7CisKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZihkb3VibGUgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmMihkb3VibGUyIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjMoZG91YmxlMyBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGY0KGRvdWJsZTQgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmOChkb3VibGU4IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjE2KGRvdWJsZTE2IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBoYWxmICpwKTsKKwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmX3J0ZShkb3VibGUgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmMl9ydGUoZG91YmxlMiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGYzX3J0ZShkb3VibGUzIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjRfcnRlKGRvdWJsZTQgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmOF9ydGUoZG91YmxlOCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGYxNl9ydGUoZG91YmxlMTYgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOworCit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGZfcnR6KGRvdWJsZSBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGYyX3J0eihkb3VibGUyIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjNfcnR6KGRvdWJsZTMgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmNF9ydHooZG91YmxlNCBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGY4X3J0eihkb3VibGU4IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjE2X3J0eihkb3VibGUxNiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgaGFsZiAqcCk7CisKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZl9ydHAoZG91YmxlIGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjJfcnRwKGRvdWJsZTIgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmM19ydHAoZG91YmxlMyBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGY0X3J0cChkb3VibGU0IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjhfcnRwKGRvdWJsZTggZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmMTZfcnRwKGRvdWJsZTE2IGRhdGEsIHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBoYWxmICpwKTsKKwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmX3J0bihkb3VibGUgZGF0YSwgc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmMl9ydG4oZG91YmxlMiBkYXRhLHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjNfcnRuKGRvdWJsZTMgZGF0YSxzaXplX3Qgb2Zmc2V0LCBfX3ByaXZhdGUgaGFsZiAqcCk7Cit2b2lkIF9fb3ZsZCB2c3RvcmVhX2hhbGY0X3J0bihkb3VibGU0IGRhdGEsc2l6ZV90IG9mZnNldCwgX19wcml2YXRlIGhhbGYgKnApOwordm9pZCBfX292bGQgdnN0b3JlYV9oYWxmOF9ydG4oZG91YmxlOCBkYXRhLHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBoYWxmICpwKTsKK3ZvaWQgX19vdmxkIHZzdG9yZWFfaGFsZjE2X3J0bihkb3VibGUxNiBkYXRhLHNpemVfdCBvZmZzZXQsIF9fcHJpdmF0ZSBoYWxmICpwKTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjZW5kaWYgLy9fX09QRU5DTF9DX1ZFUlNJT05fXyA+PSBDTF9WRVJTSU9OXzJfMAorCisvLyBPcGVuQ0wgdjEuMSBzNi4xMS44LCB2MS4yIHM2LjEyLjgsIHYyLjAgczYuMTMuOCAtIFN5bmNocm9uaXphdGlvbiBGdW5jdGlvbnMKKworLy8gRmxhZyB0eXBlIGFuZCB2YWx1ZXMgZm9yIGJhcnJpZXIsIG1lbV9mZW5jZSwgcmVhZF9tZW1fZmVuY2UsIHdyaXRlX21lbV9mZW5jZQordHlwZWRlZiB1aW50IGNsX21lbV9mZW5jZV9mbGFnczsKKworLyoqCisgKiBRdWV1ZSBhIG1lbW9yeSBmZW5jZSB0byBlbnN1cmUgY29ycmVjdAorICogb3JkZXJpbmcgb2YgbWVtb3J5IG9wZXJhdGlvbnMgdG8gbG9jYWwgbWVtb3J5CisgKi8KKyNkZWZpbmUgQ0xLX0xPQ0FMX01FTV9GRU5DRSAgICAweDAxCisKKy8qKgorICogUXVldWUgYSBtZW1vcnkgZmVuY2UgdG8gZW5zdXJlIGNvcnJlY3QKKyAqIG9yZGVyaW5nIG9mIG1lbW9yeSBvcGVyYXRpb25zIHRvIGdsb2JhbCBtZW1vcnkKKyAqLworI2RlZmluZSBDTEtfR0xPQkFMX01FTV9GRU5DRSAgIDB4MDIKKworI2lmIF9fT1BFTkNMX0NfVkVSU0lPTl9fID49IENMX1ZFUlNJT05fMl8wCisvKioKKyAqIFF1ZXVlIGEgbWVtb3J5IGZlbmNlIHRvIGVuc3VyZSBjb3JyZWN0IG9yZGVyaW5nIG9mIG1lbW9yeQorICogb3BlcmF0aW9ucyBiZXR3ZWVuIHdvcmstaXRlbXMgb2YgYSB3b3JrLWdyb3VwIHRvCisgKiBpbWFnZSBtZW1vcnkuCisgKi8KKyNkZWZpbmUgQ0xLX0lNQUdFX01FTV9GRU5DRSAgMHgwNAorI2VuZGlmIC8vX19PUEVOQ0xfQ19WRVJTSU9OX18gPj0gQ0xfVkVSU0lPTl8yXzAKKworLyoqCisgKiBBbGwgd29yay1pdGVtcyBpbiBhIHdvcmstZ3JvdXAgZXhlY3V0aW5nIHRoZSBrZXJuZWwKKyAqIG9uIGEgcHJvY2Vzc29yIG11c3QgZXhlY3V0ZSB0aGlzIGZ1bmN0aW9uIGJlZm9yZSBhbnkKKyAqIGFyZSBhbGxvd2VkIHRvIGNvbnRpbnVlIGV4ZWN1dGlvbiBiZXlvbmQgdGhlIGJhcnJpZXIuCisgKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgZW5jb3VudGVyZWQgYnkgYWxsIHdvcmstaXRlbXMgaW4KKyAqIGEgd29yay1ncm91cCBleGVjdXRpbmcgdGhlIGtlcm5lbC4KKyAqIElmIGJhcnJpZXIgaXMgaW5zaWRlIGEgY29uZGl0aW9uYWwgc3RhdGVtZW50LCB0aGVuIGFsbAorICogd29yay1pdGVtcyBtdXN0IGVudGVyIHRoZSBjb25kaXRpb25hbCBpZiBhbnkgd29yay1pdGVtCisgKiBlbnRlcnMgdGhlIGNvbmRpdGlvbmFsIHN0YXRlbWVudCBhbmQgZXhlY3V0ZXMgdGhlCisgKiBiYXJyaWVyLgorICogSWYgYmFycmVyIGlzIGluc2lkZSBhIGxvb3AsIGFsbCB3b3JrLWl0ZW1zIG11c3QgZXhlY3V0ZQorICogdGhlIGJhcnJpZXIgZm9yIGVhY2ggaXRlcmF0aW9uIG9mIHRoZSBsb29wIGJlZm9yZSBhbnkgYXJlCisgKiBhbGxvd2VkIHRvIGNvbnRpbnVlIGV4ZWN1dGlvbiBiZXlvbmQgdGhlIGJhcnJpZXIuCisgKiBUaGUgYmFycmllciBmdW5jdGlvbiBhbHNvIHF1ZXVlcyBhIG1lbW9yeSBmZW5jZQorICogKHJlYWRzIGFuZCB3cml0ZXMpIHRvIGVuc3VyZSBjb3JyZWN0IG9yZGVyaW5nIG9mCisgKiBtZW1vcnkgb3BlcmF0aW9ucyB0byBsb2NhbCBvciBnbG9iYWwgbWVtb3J5LgorICogVGhlIGZsYWdzIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgbWVtb3J5IGFkZHJlc3Mgc3BhY2UKKyAqIGFuZCBjYW4gYmUgc2V0IHRvIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyBsaXRlcmFsCisgKiB2YWx1ZXMuCisgKiBDTEtfTE9DQUxfTUVNX0ZFTkNFIC0gVGhlIGJhcnJpZXIgZnVuY3Rpb24KKyAqIHdpbGwgZWl0aGVyIGZsdXNoIGFueSB2YXJpYWJsZXMgc3RvcmVkIGluIGxvY2FsIG1lbW9yeQorICogb3IgcXVldWUgYSBtZW1vcnkgZmVuY2UgdG8gZW5zdXJlIGNvcnJlY3Qgb3JkZXJpbmcgb2YKKyAqIG1lbW9yeSBvcGVyYXRpb25zIHRvIGxvY2FsIG1lbW9yeS4KKyAqIENMS19HTE9CQUxfTUVNX0ZFTkNFIC0gVGhlIGJhcnJpZXIgZnVuY3Rpb24KKyAqIHdpbGwgcXVldWUgYSBtZW1vcnkgZmVuY2UgdG8gZW5zdXJlIGNvcnJlY3Qgb3JkZXJpbmcKKyAqIG9mIG1lbW9yeSBvcGVyYXRpb25zIHRvIGdsb2JhbCBtZW1vcnkuIFRoaXMgY2FuIGJlCisgKiB1c2VmdWwgd2hlbiB3b3JrLWl0ZW1zLCBmb3IgZXhhbXBsZSwgd3JpdGUgdG8gYnVmZmVyIG9yCisgKiBpbWFnZSBvYmplY3RzIGFuZCB0aGVuIHdhbnQgdG8gcmVhZCB0aGUgdXBkYXRlZCBkYXRhLgorICovCisKK3ZvaWQgX19vdmxkIGJhcnJpZXIoY2xfbWVtX2ZlbmNlX2ZsYWdzIGZsYWdzKTsKKworI2lmIF9fT1BFTkNMX0NfVkVSU0lPTl9fID49IENMX1ZFUlNJT05fMl8wCisKK3R5cGVkZWYgZW51bSBtZW1vcnlfc2NvcGUKK3sKKyAgbWVtb3J5X3Njb3BlX3dvcmtfaXRlbSwKKyAgbWVtb3J5X3Njb3BlX3dvcmtfZ3JvdXAsCisgIG1lbW9yeV9zY29wZV9kZXZpY2UsCisgIG1lbW9yeV9zY29wZV9hbGxfc3ZtX2RldmljZXMsCisgIG1lbW9yeV9zY29wZV9zdWJfZ3JvdXAKK30gbWVtb3J5X3Njb3BlOworCit2b2lkIF9fb3ZsZCB3b3JrX2dyb3VwX2JhcnJpZXIoY2xfbWVtX2ZlbmNlX2ZsYWdzIGZsYWdzLCBtZW1vcnlfc2NvcGUgc2NvcGUpOwordm9pZCBfX292bGQgd29ya19ncm91cF9iYXJyaWVyKGNsX21lbV9mZW5jZV9mbGFncyBmbGFncyk7CisjZW5kaWYgLy9fX09QRU5DTF9DX1ZFUlNJT05fXyA+PSBDTF9WRVJTSU9OXzJfMAorCisvLyBPcGVuQ0wgdjEuMSBzNi4xMS45LCB2MS4yIHM2LjEyLjkgLSBFeHBsaWNpdCBNZW1vcnkgRmVuY2UgRnVuY3Rpb25zCisKKy8qKgorICogT3JkZXJzIGxvYWRzIGFuZCBzdG9yZXMgb2YgYSB3b3JrLWl0ZW0KKyAqIGV4ZWN1dGluZyBhIGtlcm5lbC4gVGhpcyBtZWFucyB0aGF0IGxvYWRzCisgKiBhbmQgc3RvcmVzIHByZWNlZGluZyB0aGUgbWVtX2ZlbmNlIHdpbGwKKyAqIGJlIGNvbW1pdHRlZCB0byBtZW1vcnkgYmVmb3JlIGFueSBsb2FkcworICogYW5kIHN0b3JlcyBmb2xsb3dpbmcgdGhlIG1lbV9mZW5jZS4KKyAqIFRoZSBmbGFncyBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIG1lbW9yeQorICogYWRkcmVzcyBzcGFjZSBhbmQgY2FuIGJlIHNldCB0byBhCisgKiBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIGxpdGVyYWwKKyAqIHZhbHVlczoKKyAqIENMS19MT0NBTF9NRU1fRkVOQ0UKKyAqIENMS19HTE9CQUxfTUVNX0ZFTkNFLgorICovCit2b2lkIF9fb3ZsZCBtZW1fZmVuY2UoY2xfbWVtX2ZlbmNlX2ZsYWdzIGZsYWdzKTsKKworLyoqCisgKiBSZWFkIG1lbW9yeSBiYXJyaWVyIHRoYXQgb3JkZXJzIG9ubHkKKyAqIGxvYWRzLgorICogVGhlIGZsYWdzIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgbWVtb3J5CisgKiBhZGRyZXNzIHNwYWNlIGFuZCBjYW4gYmUgc2V0IHRvIHRvIGEKKyAqIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgbGl0ZXJhbAorICogdmFsdWVzOgorICogQ0xLX0xPQ0FMX01FTV9GRU5DRQorICogQ0xLX0dMT0JBTF9NRU1fRkVOQ0UuCisgKi8KK3ZvaWQgX19vdmxkIHJlYWRfbWVtX2ZlbmNlKGNsX21lbV9mZW5jZV9mbGFncyBmbGFncyk7CisKKy8qKgorICogV3JpdGUgbWVtb3J5IGJhcnJpZXIgdGhhdCBvcmRlcnMgb25seQorICogc3RvcmVzLgorICogVGhlIGZsYWdzIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgbWVtb3J5CisgKiBhZGRyZXNzIHNwYWNlIGFuZCBjYW4gYmUgc2V0IHRvIHRvIGEKKyAqIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgbGl0ZXJhbAorICogdmFsdWVzOgorICogQ0xLX0xPQ0FMX01FTV9GRU5DRQorICogQ0xLX0dMT0JBTF9NRU1fRkVOQ0UuCisgKi8KK3ZvaWQgX19vdmxkIHdyaXRlX21lbV9mZW5jZShjbF9tZW1fZmVuY2VfZmxhZ3MgZmxhZ3MpOworCisvLyBPcGVuQ0wgdjIuMCBzNi4xMy45IC0gQWRkcmVzcyBTcGFjZSBRdWFsaWZpZXIgRnVuY3Rpb25zCisKKyNpZiBfX09QRU5DTF9DX1ZFUlNJT05fXyA+PSBDTF9WRVJTSU9OXzJfMAorY2xfbWVtX2ZlbmNlX2ZsYWdzIF9fb3ZsZCBnZXRfZmVuY2UoY29uc3Qgdm9pZCAqcHRyKTsKK2NsX21lbV9mZW5jZV9mbGFncyBfX292bGQgZ2V0X2ZlbmNlKHZvaWQgKnB0cik7CisKKy8qKiAKKyAqIEJ1aWx0aW4gZnVuY3Rpb25zIHRvX2dsb2JhbCwgdG9fbG9jYWwsIGFuZCB0b19wcml2YXRlIG5lZWQgdG8gYmUgZGVjbGFyZWQgYXMgQ2xhbmcgYnVpbHRpbiBmdW5jdGlvbnMKKyAqIGFuZCBjaGVja2VkIGluIFNlbWEgc2luY2UgdGhleSBzaG91bGQgYmUgZGVjbGFyZWQgYXMKKyAqICAgYWRkciBnZW50eXBlKiB0b19hZGRyIChnZW50eXBlKik7CisgKiB3aGVyZSBnZW50eXBlIGlzIGJ1aWx0aW4gdHlwZSBvciB1c2VyIGRlZmluZWQgdHlwZS4KKyAqLworCisjZW5kaWYgLy9fX09QRU5DTF9DX1ZFUlNJT05fXyA+PSBDTF9WRVJTSU9OXzJfMAorCisvLyBPcGVuQ0wgdjEuMSBzNi4xMS4xMCwgdjEuMiBzNi4xMi4xMCwgdjIuMCBzNi4xMy4xMCAtIEFzeW5jIENvcGllcyBmcm9tIEdsb2JhbCB0byBMb2NhbCBNZW1vcnksIExvY2FsIHRvIEdsb2JhbCBNZW1vcnksIGFuZCBQcmVmZXRjaAorCisvKioKKyAqIGV2ZW50X3QgYXN5bmNfd29ya19ncm91cF9jb3B5ICgKKyAqIF9fZ2xvYmFsIGdlbnR5cGUgKmRzdCwKKyAqIGNvbnN0IF9fbG9jYWwgZ2VudHlwZSAqc3JjLAorICogc2l6ZV90IG51bV9lbGVtZW50cywKKyAqIGV2ZW50X3QgZXZlbnQpCisgKiBQZXJmb3JtIGFuIGFzeW5jIGNvcHkgb2YgbnVtX2VsZW1lbnRzCisgKiBnZW50eXBlIGVsZW1lbnRzIGZyb20gc3JjIHRvIGRzdC4gVGhlIGFzeW5jCisgKiBjb3B5IGlzIHBlcmZvcm1lZCBieSBhbGwgd29yay1pdGVtcyBpbiBhIHdvcmtncm91cAorICogYW5kIHRoaXMgYnVpbHQtaW4gZnVuY3Rpb24gbXVzdCB0aGVyZWZvcmUKKyAqIGJlIGVuY291bnRlcmVkIGJ5IGFsbCB3b3JrLWl0ZW1zIGluIGEgd29ya2dyb3VwCisgKiBleGVjdXRpbmcgdGhlIGtlcm5lbCB3aXRoIHRoZSBzYW1lCisgKiBhcmd1bWVudCB2YWx1ZXM7IG90aGVyd2lzZSB0aGUgcmVzdWx0cyBhcmUKKyAqIHVuZGVmaW5lZC4KKyAqIFJldHVybnMgYW4gZXZlbnQgb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgYnkKKyAqIHdhaXRfZ3JvdXBfZXZlbnRzIHRvIHdhaXQgZm9yIHRoZSBhc3luYyBjb3B5CisgKiB0byBmaW5pc2guIFRoZSBldmVudCBhcmd1bWVudCBjYW4gYWxzbyBiZSB1c2VkCisgKiB0byBhc3NvY2lhdGUgdGhlIGFzeW5jX3dvcmtfZ3JvdXBfY29weSB3aXRoCisgKiBhIHByZXZpb3VzIGFzeW5jIGNvcHkgYWxsb3dpbmcgYW4gZXZlbnQgdG8gYmUKKyAqIHNoYXJlZCBieSBtdWx0aXBsZSBhc3luYyBjb3BpZXM7IG90aGVyd2lzZSBldmVudAorICogc2hvdWxkIGJlIHplcm8uCisgKiBJZiBldmVudCBhcmd1bWVudCBpcyBub24temVybywgdGhlIGV2ZW50IG9iamVjdAorICogc3VwcGxpZWQgaW4gZXZlbnQgYXJndW1lbnQgd2lsbCBiZSByZXR1cm5lZC4KKyAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcGVyZm9ybSBhbnkgaW1wbGljaXQKKyAqIHN5bmNocm9uaXphdGlvbiBvZiBzb3VyY2UgZGF0YSBzdWNoIGFzIHVzaW5nIGEKKyAqIGJhcnJpZXIgYmVmb3JlIHBlcmZvcm1pbmcgdGhlIGNvcHkuCisgKi8KK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2xvY2FsIGNoYXIgKmRzdCwgY29uc3QgX19nbG9iYWwgY2hhciAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2xvY2FsIHVjaGFyICpkc3QsIGNvbnN0IF9fZ2xvYmFsIHVjaGFyICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9jb3B5KF9fbG9jYWwgc2hvcnQgKmRzdCwgY29uc3QgX19nbG9iYWwgc2hvcnQgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX2NvcHkoX19sb2NhbCB1c2hvcnQgKmRzdCwgY29uc3QgX19nbG9iYWwgdXNob3J0ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9jb3B5KF9fbG9jYWwgaW50ICpkc3QsIGNvbnN0IF9fZ2xvYmFsIGludCAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2xvY2FsIHVpbnQgKmRzdCwgY29uc3QgX19nbG9iYWwgdWludCAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2xvY2FsIGxvbmcgKmRzdCwgY29uc3QgX19nbG9iYWwgbG9uZyAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2xvY2FsIHVsb25nICpkc3QsIGNvbnN0IF9fZ2xvYmFsIHVsb25nICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9jb3B5KF9fbG9jYWwgZmxvYXQgKmRzdCwgY29uc3QgX19nbG9iYWwgZmxvYXQgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX2NvcHkoX19sb2NhbCBjaGFyMiAqZHN0LCBjb25zdCBfX2dsb2JhbCBjaGFyMiAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2xvY2FsIHVjaGFyMiAqZHN0LCBjb25zdCBfX2dsb2JhbCB1Y2hhcjIgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX2NvcHkoX19sb2NhbCBzaG9ydDIgKmRzdCwgY29uc3QgX19nbG9iYWwgc2hvcnQyICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9jb3B5KF9fbG9jYWwgdXNob3J0MiAqZHN0LCBjb25zdCBfX2dsb2JhbCB1c2hvcnQyICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9jb3B5KF9fbG9jYWwgaW50MiAqZHN0LCBjb25zdCBfX2dsb2JhbCBpbnQyICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9jb3B5KF9fbG9jYWwgdWludDIgKmRzdCwgY29uc3QgX19nbG9iYWwgdWludDIgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX2NvcHkoX19sb2NhbCBsb25nMiAqZHN0LCBjb25zdCBfX2dsb2JhbCBsb25nMiAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2xvY2FsIHVsb25nMiAqZHN0LCBjb25zdCBfX2dsb2JhbCB1bG9uZzIgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX2NvcHkoX19sb2NhbCBmbG9hdDIgKmRzdCwgY29uc3QgX19nbG9iYWwgZmxvYXQyICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9jb3B5KF9fbG9jYWwgY2hhcjMgKmRzdCwgY29uc3QgX19nbG9iYWwgY2hhcjMgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX2NvcHkoX19sb2NhbCB1Y2hhcjMgKmRzdCwgY29uc3QgX19nbG9iYWwgdWNoYXIzICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9jb3B5KF9fbG9jYWwgc2hvcnQzICpkc3QsIGNvbnN0IF9fZ2xvYmFsIHNob3J0MyAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2xvY2FsIHVzaG9ydDMgKmRzdCwgY29uc3QgX19nbG9iYWwgdXNob3J0MyAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2xvY2FsIGludDMgKmRzdCwgY29uc3QgX19nbG9iYWwgaW50MyAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2xvY2FsIHVpbnQzICpkc3QsIGNvbnN0IF9fZ2xvYmFsIHVpbnQzICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9jb3B5KF9fbG9jYWwgbG9uZzMgKmRzdCwgY29uc3QgX19nbG9iYWwgbG9uZzMgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX2NvcHkoX19sb2NhbCB1bG9uZzMgKmRzdCwgY29uc3QgX19nbG9iYWwgdWxvbmczICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9jb3B5KF9fbG9jYWwgZmxvYXQzICpkc3QsIGNvbnN0IF9fZ2xvYmFsIGZsb2F0MyAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2xvY2FsIGNoYXI0ICpkc3QsIGNvbnN0IF9fZ2xvYmFsIGNoYXI0ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9jb3B5KF9fbG9jYWwgdWNoYXI0ICpkc3QsIGNvbnN0IF9fZ2xvYmFsIHVjaGFyNCAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2xvY2FsIHNob3J0NCAqZHN0LCBjb25zdCBfX2dsb2JhbCBzaG9ydDQgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX2NvcHkoX19sb2NhbCB1c2hvcnQ0ICpkc3QsIGNvbnN0IF9fZ2xvYmFsIHVzaG9ydDQgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX2NvcHkoX19sb2NhbCBpbnQ0ICpkc3QsIGNvbnN0IF9fZ2xvYmFsIGludDQgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX2NvcHkoX19sb2NhbCB1aW50NCAqZHN0LCBjb25zdCBfX2dsb2JhbCB1aW50NCAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2xvY2FsIGxvbmc0ICpkc3QsIGNvbnN0IF9fZ2xvYmFsIGxvbmc0ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9jb3B5KF9fbG9jYWwgdWxvbmc0ICpkc3QsIGNvbnN0IF9fZ2xvYmFsIHVsb25nNCAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2xvY2FsIGZsb2F0NCAqZHN0LCBjb25zdCBfX2dsb2JhbCBmbG9hdDQgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX2NvcHkoX19sb2NhbCBjaGFyOCAqZHN0LCBjb25zdCBfX2dsb2JhbCBjaGFyOCAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2xvY2FsIHVjaGFyOCAqZHN0LCBjb25zdCBfX2dsb2JhbCB1Y2hhcjggKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX2NvcHkoX19sb2NhbCBzaG9ydDggKmRzdCwgY29uc3QgX19nbG9iYWwgc2hvcnQ4ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9jb3B5KF9fbG9jYWwgdXNob3J0OCAqZHN0LCBjb25zdCBfX2dsb2JhbCB1c2hvcnQ4ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9jb3B5KF9fbG9jYWwgaW50OCAqZHN0LCBjb25zdCBfX2dsb2JhbCBpbnQ4ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9jb3B5KF9fbG9jYWwgdWludDggKmRzdCwgY29uc3QgX19nbG9iYWwgdWludDggKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX2NvcHkoX19sb2NhbCBsb25nOCAqZHN0LCBjb25zdCBfX2dsb2JhbCBsb25nOCAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2xvY2FsIHVsb25nOCAqZHN0LCBjb25zdCBfX2dsb2JhbCB1bG9uZzggKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX2NvcHkoX19sb2NhbCBmbG9hdDggKmRzdCwgY29uc3QgX19nbG9iYWwgZmxvYXQ4ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9jb3B5KF9fbG9jYWwgY2hhcjE2ICpkc3QsIGNvbnN0IF9fZ2xvYmFsIGNoYXIxNiAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2xvY2FsIHVjaGFyMTYgKmRzdCwgY29uc3QgX19nbG9iYWwgdWNoYXIxNiAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2xvY2FsIHNob3J0MTYgKmRzdCwgY29uc3QgX19nbG9iYWwgc2hvcnQxNiAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2xvY2FsIHVzaG9ydDE2ICpkc3QsIGNvbnN0IF9fZ2xvYmFsIHVzaG9ydDE2ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9jb3B5KF9fbG9jYWwgaW50MTYgKmRzdCwgY29uc3QgX19nbG9iYWwgaW50MTYgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX2NvcHkoX19sb2NhbCB1aW50MTYgKmRzdCwgY29uc3QgX19nbG9iYWwgdWludDE2ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9jb3B5KF9fbG9jYWwgbG9uZzE2ICpkc3QsIGNvbnN0IF9fZ2xvYmFsIGxvbmcxNiAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2xvY2FsIHVsb25nMTYgKmRzdCwgY29uc3QgX19nbG9iYWwgdWxvbmcxNiAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2xvY2FsIGZsb2F0MTYgKmRzdCwgY29uc3QgX19nbG9iYWwgZmxvYXQxNiAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2dsb2JhbCBjaGFyICpkc3QsIGNvbnN0IF9fbG9jYWwgY2hhciAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2dsb2JhbCB1Y2hhciAqZHN0LCBjb25zdCBfX2xvY2FsIHVjaGFyICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9jb3B5KF9fZ2xvYmFsIHNob3J0ICpkc3QsIGNvbnN0IF9fbG9jYWwgc2hvcnQgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX2NvcHkoX19nbG9iYWwgdXNob3J0ICpkc3QsIGNvbnN0IF9fbG9jYWwgdXNob3J0ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9jb3B5KF9fZ2xvYmFsIGludCAqZHN0LCBjb25zdCBfX2xvY2FsIGludCAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2dsb2JhbCB1aW50ICpkc3QsIGNvbnN0IF9fbG9jYWwgdWludCAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2dsb2JhbCBsb25nICpkc3QsIGNvbnN0IF9fbG9jYWwgbG9uZyAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2dsb2JhbCB1bG9uZyAqZHN0LCBjb25zdCBfX2xvY2FsIHVsb25nICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9jb3B5KF9fZ2xvYmFsIGZsb2F0ICpkc3QsIGNvbnN0IF9fbG9jYWwgZmxvYXQgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX2NvcHkoX19nbG9iYWwgY2hhcjIgKmRzdCwgY29uc3QgX19sb2NhbCBjaGFyMiAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2dsb2JhbCB1Y2hhcjIgKmRzdCwgY29uc3QgX19sb2NhbCB1Y2hhcjIgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX2NvcHkoX19nbG9iYWwgc2hvcnQyICpkc3QsIGNvbnN0IF9fbG9jYWwgc2hvcnQyICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9jb3B5KF9fZ2xvYmFsIHVzaG9ydDIgKmRzdCwgY29uc3QgX19sb2NhbCB1c2hvcnQyICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9jb3B5KF9fZ2xvYmFsIGludDIgKmRzdCwgY29uc3QgX19sb2NhbCBpbnQyICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9jb3B5KF9fZ2xvYmFsIHVpbnQyICpkc3QsIGNvbnN0IF9fbG9jYWwgdWludDIgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX2NvcHkoX19nbG9iYWwgbG9uZzIgKmRzdCwgY29uc3QgX19sb2NhbCBsb25nMiAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2dsb2JhbCB1bG9uZzIgKmRzdCwgY29uc3QgX19sb2NhbCB1bG9uZzIgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX2NvcHkoX19nbG9iYWwgZmxvYXQyICpkc3QsIGNvbnN0IF9fbG9jYWwgZmxvYXQyICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9jb3B5KF9fZ2xvYmFsIGNoYXIzICpkc3QsIGNvbnN0IF9fbG9jYWwgY2hhcjMgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX2NvcHkoX19nbG9iYWwgdWNoYXIzICpkc3QsIGNvbnN0IF9fbG9jYWwgdWNoYXIzICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9jb3B5KF9fZ2xvYmFsIHNob3J0MyAqZHN0LCBjb25zdCBfX2xvY2FsIHNob3J0MyAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2dsb2JhbCB1c2hvcnQzICpkc3QsIGNvbnN0IF9fbG9jYWwgdXNob3J0MyAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2dsb2JhbCBpbnQzICpkc3QsIGNvbnN0IF9fbG9jYWwgaW50MyAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2dsb2JhbCB1aW50MyAqZHN0LCBjb25zdCBfX2xvY2FsIHVpbnQzICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9jb3B5KF9fZ2xvYmFsIGxvbmczICpkc3QsIGNvbnN0IF9fbG9jYWwgbG9uZzMgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX2NvcHkoX19nbG9iYWwgdWxvbmczICpkc3QsIGNvbnN0IF9fbG9jYWwgdWxvbmczICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9jb3B5KF9fZ2xvYmFsIGZsb2F0MyAqZHN0LCBjb25zdCBfX2xvY2FsIGZsb2F0MyAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2dsb2JhbCBjaGFyNCAqZHN0LCBjb25zdCBfX2xvY2FsIGNoYXI0ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9jb3B5KF9fZ2xvYmFsIHVjaGFyNCAqZHN0LCBjb25zdCBfX2xvY2FsIHVjaGFyNCAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2dsb2JhbCBzaG9ydDQgKmRzdCwgY29uc3QgX19sb2NhbCBzaG9ydDQgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX2NvcHkoX19nbG9iYWwgdXNob3J0NCAqZHN0LCBjb25zdCBfX2xvY2FsIHVzaG9ydDQgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX2NvcHkoX19nbG9iYWwgaW50NCAqZHN0LCBjb25zdCBfX2xvY2FsIGludDQgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX2NvcHkoX19nbG9iYWwgdWludDQgKmRzdCwgY29uc3QgX19sb2NhbCB1aW50NCAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2dsb2JhbCBsb25nNCAqZHN0LCBjb25zdCBfX2xvY2FsIGxvbmc0ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9jb3B5KF9fZ2xvYmFsIHVsb25nNCAqZHN0LCBjb25zdCBfX2xvY2FsIHVsb25nNCAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2dsb2JhbCBmbG9hdDQgKmRzdCwgY29uc3QgX19sb2NhbCBmbG9hdDQgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX2NvcHkoX19nbG9iYWwgY2hhcjggKmRzdCwgY29uc3QgX19sb2NhbCBjaGFyOCAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2dsb2JhbCB1Y2hhcjggKmRzdCwgY29uc3QgX19sb2NhbCB1Y2hhcjggKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX2NvcHkoX19nbG9iYWwgc2hvcnQ4ICpkc3QsIGNvbnN0IF9fbG9jYWwgc2hvcnQ4ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9jb3B5KF9fZ2xvYmFsIHVzaG9ydDggKmRzdCwgY29uc3QgX19sb2NhbCB1c2hvcnQ4ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9jb3B5KF9fZ2xvYmFsIGludDggKmRzdCwgY29uc3QgX19sb2NhbCBpbnQ4ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9jb3B5KF9fZ2xvYmFsIHVpbnQ4ICpkc3QsIGNvbnN0IF9fbG9jYWwgdWludDggKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX2NvcHkoX19nbG9iYWwgbG9uZzggKmRzdCwgY29uc3QgX19sb2NhbCBsb25nOCAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2dsb2JhbCB1bG9uZzggKmRzdCwgY29uc3QgX19sb2NhbCB1bG9uZzggKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX2NvcHkoX19nbG9iYWwgZmxvYXQ4ICpkc3QsIGNvbnN0IF9fbG9jYWwgZmxvYXQ4ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9jb3B5KF9fZ2xvYmFsIGNoYXIxNiAqZHN0LCBjb25zdCBfX2xvY2FsIGNoYXIxNiAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2dsb2JhbCB1Y2hhcjE2ICpkc3QsIGNvbnN0IF9fbG9jYWwgdWNoYXIxNiAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2dsb2JhbCBzaG9ydDE2ICpkc3QsIGNvbnN0IF9fbG9jYWwgc2hvcnQxNiAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2dsb2JhbCB1c2hvcnQxNiAqZHN0LCBjb25zdCBfX2xvY2FsIHVzaG9ydDE2ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9jb3B5KF9fZ2xvYmFsIGludDE2ICpkc3QsIGNvbnN0IF9fbG9jYWwgaW50MTYgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX2NvcHkoX19nbG9iYWwgdWludDE2ICpkc3QsIGNvbnN0IF9fbG9jYWwgdWludDE2ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9jb3B5KF9fZ2xvYmFsIGxvbmcxNiAqZHN0LCBjb25zdCBfX2xvY2FsIGxvbmcxNiAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2dsb2JhbCB1bG9uZzE2ICpkc3QsIGNvbnN0IF9fbG9jYWwgdWxvbmcxNiAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2dsb2JhbCBmbG9hdDE2ICpkc3QsIGNvbnN0IF9fbG9jYWwgZmxvYXQxNiAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKKyNpZmRlZiBjbF9raHJfZnA2NAorZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9jb3B5KF9fbG9jYWwgZG91YmxlICpkc3QsIGNvbnN0IF9fZ2xvYmFsIGRvdWJsZSAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2xvY2FsIGRvdWJsZTIgKmRzdCwgY29uc3QgX19nbG9iYWwgZG91YmxlMiAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2xvY2FsIGRvdWJsZTMgKmRzdCwgY29uc3QgX19nbG9iYWwgZG91YmxlMyAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2xvY2FsIGRvdWJsZTQgKmRzdCwgY29uc3QgX19nbG9iYWwgZG91YmxlNCAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2xvY2FsIGRvdWJsZTggKmRzdCwgY29uc3QgX19nbG9iYWwgZG91YmxlOCAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2xvY2FsIGRvdWJsZTE2ICpkc3QsIGNvbnN0IF9fZ2xvYmFsIGRvdWJsZTE2ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9jb3B5KF9fZ2xvYmFsIGRvdWJsZSAqZHN0LCBjb25zdCBfX2xvY2FsIGRvdWJsZSAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2dsb2JhbCBkb3VibGUyICpkc3QsIGNvbnN0IF9fbG9jYWwgZG91YmxlMiAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2dsb2JhbCBkb3VibGUzICpkc3QsIGNvbnN0IF9fbG9jYWwgZG91YmxlMyAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2dsb2JhbCBkb3VibGU0ICpkc3QsIGNvbnN0IF9fbG9jYWwgZG91YmxlNCAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2dsb2JhbCBkb3VibGU4ICpkc3QsIGNvbnN0IF9fbG9jYWwgZG91YmxlOCAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2dsb2JhbCBkb3VibGUxNiAqZHN0LCBjb25zdCBfX2xvY2FsIGRvdWJsZTE2ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIGV2ZW50X3QgZXZlbnQpOworI2VuZGlmIC8vY2xfa2hyX2ZwNjQKKyNpZmRlZiBjbF9raHJfZnAxNgorZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9jb3B5KF9fbG9jYWwgaGFsZiAqZHN0LCBjb25zdCBfX2dsb2JhbCBoYWxmICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9jb3B5KF9fbG9jYWwgaGFsZjIgKmRzdCwgY29uc3QgX19nbG9iYWwgaGFsZjIgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX2NvcHkoX19sb2NhbCBoYWxmMyAqZHN0LCBjb25zdCBfX2dsb2JhbCBoYWxmMyAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2xvY2FsIGhhbGY0ICpkc3QsIGNvbnN0IF9fZ2xvYmFsIGhhbGY0ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9jb3B5KF9fbG9jYWwgaGFsZjggKmRzdCwgY29uc3QgX19nbG9iYWwgaGFsZjggKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX2NvcHkoX19sb2NhbCBoYWxmMTYgKmRzdCwgY29uc3QgX19nbG9iYWwgaGFsZjE2ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9jb3B5KF9fZ2xvYmFsIGhhbGYgKmRzdCwgY29uc3QgX19sb2NhbCBoYWxmICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9jb3B5KF9fZ2xvYmFsIGhhbGYyICpkc3QsIGNvbnN0IF9fbG9jYWwgaGFsZjIgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX2NvcHkoX19nbG9iYWwgaGFsZjMgKmRzdCwgY29uc3QgX19sb2NhbCBoYWxmMyAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfY29weShfX2dsb2JhbCBoYWxmNCAqZHN0LCBjb25zdCBfX2xvY2FsIGhhbGY0ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9jb3B5KF9fZ2xvYmFsIGhhbGY4ICpkc3QsIGNvbnN0IF9fbG9jYWwgaGFsZjggKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX2NvcHkoX19nbG9iYWwgaGFsZjE2ICpkc3QsIGNvbnN0IF9fbG9jYWwgaGFsZjE2ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIGV2ZW50X3QgZXZlbnQpOworI2VuZGlmIC8vY2xfa2hyX2ZwMTYKKworLyoqCisgKiBQZXJmb3JtIGFuIGFzeW5jIGdhdGhlciBvZiBudW1fZWxlbWVudHMKKyAqIGdlbnR5cGUgZWxlbWVudHMgZnJvbSBzcmMgdG8gZHN0LiBUaGUKKyAqIHNyY19zdHJpZGUgaXMgdGhlIHN0cmlkZSBpbiBlbGVtZW50cyBmb3IgZWFjaAorICogZ2VudHlwZSBlbGVtZW50IHJlYWQgZnJvbSBzcmMuIFRoZSBkc3Rfc3RyaWRlCisgKiBpcyB0aGUgc3RyaWRlIGluIGVsZW1lbnRzIGZvciBlYWNoIGdlbnR5cGUKKyAqIGVsZW1lbnQgd3JpdHRlbiB0byBkc3QuIFRoZSBhc3luYyBnYXRoZXIgaXMKKyAqIHBlcmZvcm1lZCBieSBhbGwgd29yay1pdGVtcyBpbiBhIHdvcmstZ3JvdXAuCisgKiBUaGlzIGJ1aWx0LWluIGZ1bmN0aW9uIG11c3QgdGhlcmVmb3JlIGJlCisgKiBlbmNvdW50ZXJlZCBieSBhbGwgd29yay1pdGVtcyBpbiBhIHdvcmstZ3JvdXAKKyAqIGV4ZWN1dGluZyB0aGUga2VybmVsIHdpdGggdGhlIHNhbWUgYXJndW1lbnQKKyAqIHZhbHVlczsgb3RoZXJ3aXNlIHRoZSByZXN1bHRzIGFyZSB1bmRlZmluZWQuCisgKiBSZXR1cm5zIGFuIGV2ZW50IG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIGJ5CisgKiB3YWl0X2dyb3VwX2V2ZW50cyB0byB3YWl0IGZvciB0aGUgYXN5bmMgY29weQorICogdG8gZmluaXNoLiBUaGUgZXZlbnQgYXJndW1lbnQgY2FuIGFsc28gYmUgdXNlZAorICogdG8gYXNzb2NpYXRlIHRoZQorICogYXN5bmNfd29ya19ncm91cF9zdHJpZGVkX2NvcHkgd2l0aCBhCisgKiBwcmV2aW91cyBhc3luYyBjb3B5IGFsbG93aW5nIGFuIGV2ZW50IHRvIGJlCisgKiBzaGFyZWQgYnkgbXVsdGlwbGUgYXN5bmMgY29waWVzOyBvdGhlcndpc2UgZXZlbnQKKyAqIHNob3VsZCBiZSB6ZXJvLgorICogSWYgZXZlbnQgYXJndW1lbnQgaXMgbm9uLXplcm8sIHRoZSBldmVudCBvYmplY3QKKyAqIHN1cHBsaWVkIGluIGV2ZW50IGFyZ3VtZW50IHdpbGwgYmUgcmV0dXJuZWQuCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHBlcmZvcm0gYW55IGltcGxpY2l0CisgKiBzeW5jaHJvbml6YXRpb24gb2Ygc291cmNlIGRhdGEgc3VjaCBhcyB1c2luZyBhCisgKiBiYXJyaWVyIGJlZm9yZSBwZXJmb3JtaW5nIHRoZSBjb3B5LgorICovCitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2xvY2FsIGNoYXIgKmRzdCwgY29uc3QgX19nbG9iYWwgY2hhciAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3Qgc3JjX3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2xvY2FsIHVjaGFyICpkc3QsIGNvbnN0IF9fZ2xvYmFsIHVjaGFyICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIHNpemVfdCBzcmNfc3RyaWRlLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfc3RyaWRlZF9jb3B5KF9fbG9jYWwgc2hvcnQgKmRzdCwgY29uc3QgX19nbG9iYWwgc2hvcnQgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgc2l6ZV90IHNyY19zdHJpZGUsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9zdHJpZGVkX2NvcHkoX19sb2NhbCB1c2hvcnQgKmRzdCwgY29uc3QgX19nbG9iYWwgdXNob3J0ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIHNpemVfdCBzcmNfc3RyaWRlLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfc3RyaWRlZF9jb3B5KF9fbG9jYWwgaW50ICpkc3QsIGNvbnN0IF9fZ2xvYmFsIGludCAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3Qgc3JjX3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2xvY2FsIHVpbnQgKmRzdCwgY29uc3QgX19nbG9iYWwgdWludCAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3Qgc3JjX3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2xvY2FsIGxvbmcgKmRzdCwgY29uc3QgX19nbG9iYWwgbG9uZyAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3Qgc3JjX3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2xvY2FsIHVsb25nICpkc3QsIGNvbnN0IF9fZ2xvYmFsIHVsb25nICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIHNpemVfdCBzcmNfc3RyaWRlLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfc3RyaWRlZF9jb3B5KF9fbG9jYWwgZmxvYXQgKmRzdCwgY29uc3QgX19nbG9iYWwgZmxvYXQgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgc2l6ZV90IHNyY19zdHJpZGUsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9zdHJpZGVkX2NvcHkoX19sb2NhbCBjaGFyMiAqZHN0LCBjb25zdCBfX2dsb2JhbCBjaGFyMiAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3Qgc3JjX3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2xvY2FsIHVjaGFyMiAqZHN0LCBjb25zdCBfX2dsb2JhbCB1Y2hhcjIgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgc2l6ZV90IHNyY19zdHJpZGUsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9zdHJpZGVkX2NvcHkoX19sb2NhbCBzaG9ydDIgKmRzdCwgY29uc3QgX19nbG9iYWwgc2hvcnQyICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIHNpemVfdCBzcmNfc3RyaWRlLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfc3RyaWRlZF9jb3B5KF9fbG9jYWwgdXNob3J0MiAqZHN0LCBjb25zdCBfX2dsb2JhbCB1c2hvcnQyICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIHNpemVfdCBzcmNfc3RyaWRlLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfc3RyaWRlZF9jb3B5KF9fbG9jYWwgaW50MiAqZHN0LCBjb25zdCBfX2dsb2JhbCBpbnQyICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIHNpemVfdCBzcmNfc3RyaWRlLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfc3RyaWRlZF9jb3B5KF9fbG9jYWwgdWludDIgKmRzdCwgY29uc3QgX19nbG9iYWwgdWludDIgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgc2l6ZV90IHNyY19zdHJpZGUsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9zdHJpZGVkX2NvcHkoX19sb2NhbCBsb25nMiAqZHN0LCBjb25zdCBfX2dsb2JhbCBsb25nMiAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3Qgc3JjX3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2xvY2FsIHVsb25nMiAqZHN0LCBjb25zdCBfX2dsb2JhbCB1bG9uZzIgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgc2l6ZV90IHNyY19zdHJpZGUsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9zdHJpZGVkX2NvcHkoX19sb2NhbCBmbG9hdDIgKmRzdCwgY29uc3QgX19nbG9iYWwgZmxvYXQyICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIHNpemVfdCBzcmNfc3RyaWRlLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfc3RyaWRlZF9jb3B5KF9fbG9jYWwgY2hhcjMgKmRzdCwgY29uc3QgX19nbG9iYWwgY2hhcjMgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgc2l6ZV90IHNyY19zdHJpZGUsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9zdHJpZGVkX2NvcHkoX19sb2NhbCB1Y2hhcjMgKmRzdCwgY29uc3QgX19nbG9iYWwgdWNoYXIzICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIHNpemVfdCBzcmNfc3RyaWRlLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfc3RyaWRlZF9jb3B5KF9fbG9jYWwgc2hvcnQzICpkc3QsIGNvbnN0IF9fZ2xvYmFsIHNob3J0MyAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3Qgc3JjX3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2xvY2FsIHVzaG9ydDMgKmRzdCwgY29uc3QgX19nbG9iYWwgdXNob3J0MyAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3Qgc3JjX3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2xvY2FsIGludDMgKmRzdCwgY29uc3QgX19nbG9iYWwgaW50MyAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3Qgc3JjX3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2xvY2FsIHVpbnQzICpkc3QsIGNvbnN0IF9fZ2xvYmFsIHVpbnQzICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIHNpemVfdCBzcmNfc3RyaWRlLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfc3RyaWRlZF9jb3B5KF9fbG9jYWwgbG9uZzMgKmRzdCwgY29uc3QgX19nbG9iYWwgbG9uZzMgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgc2l6ZV90IHNyY19zdHJpZGUsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9zdHJpZGVkX2NvcHkoX19sb2NhbCB1bG9uZzMgKmRzdCwgY29uc3QgX19nbG9iYWwgdWxvbmczICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIHNpemVfdCBzcmNfc3RyaWRlLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfc3RyaWRlZF9jb3B5KF9fbG9jYWwgZmxvYXQzICpkc3QsIGNvbnN0IF9fZ2xvYmFsIGZsb2F0MyAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3Qgc3JjX3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2xvY2FsIGNoYXI0ICpkc3QsIGNvbnN0IF9fZ2xvYmFsIGNoYXI0ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIHNpemVfdCBzcmNfc3RyaWRlLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfc3RyaWRlZF9jb3B5KF9fbG9jYWwgdWNoYXI0ICpkc3QsIGNvbnN0IF9fZ2xvYmFsIHVjaGFyNCAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3Qgc3JjX3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2xvY2FsIHNob3J0NCAqZHN0LCBjb25zdCBfX2dsb2JhbCBzaG9ydDQgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgc2l6ZV90IHNyY19zdHJpZGUsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9zdHJpZGVkX2NvcHkoX19sb2NhbCB1c2hvcnQ0ICpkc3QsIGNvbnN0IF9fZ2xvYmFsIHVzaG9ydDQgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgc2l6ZV90IHNyY19zdHJpZGUsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9zdHJpZGVkX2NvcHkoX19sb2NhbCBpbnQ0ICpkc3QsIGNvbnN0IF9fZ2xvYmFsIGludDQgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgc2l6ZV90IHNyY19zdHJpZGUsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9zdHJpZGVkX2NvcHkoX19sb2NhbCB1aW50NCAqZHN0LCBjb25zdCBfX2dsb2JhbCB1aW50NCAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3Qgc3JjX3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2xvY2FsIGxvbmc0ICpkc3QsIGNvbnN0IF9fZ2xvYmFsIGxvbmc0ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIHNpemVfdCBzcmNfc3RyaWRlLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfc3RyaWRlZF9jb3B5KF9fbG9jYWwgdWxvbmc0ICpkc3QsIGNvbnN0IF9fZ2xvYmFsIHVsb25nNCAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3Qgc3JjX3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2xvY2FsIGZsb2F0NCAqZHN0LCBjb25zdCBfX2dsb2JhbCBmbG9hdDQgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgc2l6ZV90IHNyY19zdHJpZGUsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9zdHJpZGVkX2NvcHkoX19sb2NhbCBjaGFyOCAqZHN0LCBjb25zdCBfX2dsb2JhbCBjaGFyOCAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3Qgc3JjX3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2xvY2FsIHVjaGFyOCAqZHN0LCBjb25zdCBfX2dsb2JhbCB1Y2hhcjggKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgc2l6ZV90IHNyY19zdHJpZGUsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9zdHJpZGVkX2NvcHkoX19sb2NhbCBzaG9ydDggKmRzdCwgY29uc3QgX19nbG9iYWwgc2hvcnQ4ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIHNpemVfdCBzcmNfc3RyaWRlLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfc3RyaWRlZF9jb3B5KF9fbG9jYWwgdXNob3J0OCAqZHN0LCBjb25zdCBfX2dsb2JhbCB1c2hvcnQ4ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIHNpemVfdCBzcmNfc3RyaWRlLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfc3RyaWRlZF9jb3B5KF9fbG9jYWwgaW50OCAqZHN0LCBjb25zdCBfX2dsb2JhbCBpbnQ4ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIHNpemVfdCBzcmNfc3RyaWRlLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfc3RyaWRlZF9jb3B5KF9fbG9jYWwgdWludDggKmRzdCwgY29uc3QgX19nbG9iYWwgdWludDggKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgc2l6ZV90IHNyY19zdHJpZGUsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9zdHJpZGVkX2NvcHkoX19sb2NhbCBsb25nOCAqZHN0LCBjb25zdCBfX2dsb2JhbCBsb25nOCAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3Qgc3JjX3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2xvY2FsIHVsb25nOCAqZHN0LCBjb25zdCBfX2dsb2JhbCB1bG9uZzggKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgc2l6ZV90IHNyY19zdHJpZGUsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9zdHJpZGVkX2NvcHkoX19sb2NhbCBmbG9hdDggKmRzdCwgY29uc3QgX19nbG9iYWwgZmxvYXQ4ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIHNpemVfdCBzcmNfc3RyaWRlLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfc3RyaWRlZF9jb3B5KF9fbG9jYWwgY2hhcjE2ICpkc3QsIGNvbnN0IF9fZ2xvYmFsIGNoYXIxNiAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3Qgc3JjX3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2xvY2FsIHVjaGFyMTYgKmRzdCwgY29uc3QgX19nbG9iYWwgdWNoYXIxNiAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3Qgc3JjX3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2xvY2FsIHNob3J0MTYgKmRzdCwgY29uc3QgX19nbG9iYWwgc2hvcnQxNiAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3Qgc3JjX3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2xvY2FsIHVzaG9ydDE2ICpkc3QsIGNvbnN0IF9fZ2xvYmFsIHVzaG9ydDE2ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIHNpemVfdCBzcmNfc3RyaWRlLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfc3RyaWRlZF9jb3B5KF9fbG9jYWwgaW50MTYgKmRzdCwgY29uc3QgX19nbG9iYWwgaW50MTYgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgc2l6ZV90IHNyY19zdHJpZGUsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9zdHJpZGVkX2NvcHkoX19sb2NhbCB1aW50MTYgKmRzdCwgY29uc3QgX19nbG9iYWwgdWludDE2ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIHNpemVfdCBzcmNfc3RyaWRlLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfc3RyaWRlZF9jb3B5KF9fbG9jYWwgbG9uZzE2ICpkc3QsIGNvbnN0IF9fZ2xvYmFsIGxvbmcxNiAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3Qgc3JjX3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2xvY2FsIHVsb25nMTYgKmRzdCwgY29uc3QgX19nbG9iYWwgdWxvbmcxNiAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3Qgc3JjX3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2xvY2FsIGZsb2F0MTYgKmRzdCwgY29uc3QgX19nbG9iYWwgZmxvYXQxNiAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3Qgc3JjX3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2dsb2JhbCBjaGFyICpkc3QsIGNvbnN0IF9fbG9jYWwgY2hhciAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3QgZHN0X3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2dsb2JhbCB1Y2hhciAqZHN0LCBjb25zdCBfX2xvY2FsIHVjaGFyICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIHNpemVfdCBkc3Rfc3RyaWRlLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfc3RyaWRlZF9jb3B5KF9fZ2xvYmFsIHNob3J0ICpkc3QsIGNvbnN0IF9fbG9jYWwgc2hvcnQgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgc2l6ZV90IGRzdF9zdHJpZGUsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9zdHJpZGVkX2NvcHkoX19nbG9iYWwgdXNob3J0ICpkc3QsIGNvbnN0IF9fbG9jYWwgdXNob3J0ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIHNpemVfdCBkc3Rfc3RyaWRlLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfc3RyaWRlZF9jb3B5KF9fZ2xvYmFsIGludCAqZHN0LCBjb25zdCBfX2xvY2FsIGludCAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3QgZHN0X3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2dsb2JhbCB1aW50ICpkc3QsIGNvbnN0IF9fbG9jYWwgdWludCAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3QgZHN0X3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2dsb2JhbCBsb25nICpkc3QsIGNvbnN0IF9fbG9jYWwgbG9uZyAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3QgZHN0X3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2dsb2JhbCB1bG9uZyAqZHN0LCBjb25zdCBfX2xvY2FsIHVsb25nICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIHNpemVfdCBkc3Rfc3RyaWRlLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfc3RyaWRlZF9jb3B5KF9fZ2xvYmFsIGZsb2F0ICpkc3QsIGNvbnN0IF9fbG9jYWwgZmxvYXQgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgc2l6ZV90IGRzdF9zdHJpZGUsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9zdHJpZGVkX2NvcHkoX19nbG9iYWwgY2hhcjIgKmRzdCwgY29uc3QgX19sb2NhbCBjaGFyMiAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3QgZHN0X3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2dsb2JhbCB1Y2hhcjIgKmRzdCwgY29uc3QgX19sb2NhbCB1Y2hhcjIgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgc2l6ZV90IGRzdF9zdHJpZGUsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9zdHJpZGVkX2NvcHkoX19nbG9iYWwgc2hvcnQyICpkc3QsIGNvbnN0IF9fbG9jYWwgc2hvcnQyICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIHNpemVfdCBkc3Rfc3RyaWRlLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfc3RyaWRlZF9jb3B5KF9fZ2xvYmFsIHVzaG9ydDIgKmRzdCwgY29uc3QgX19sb2NhbCB1c2hvcnQyICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIHNpemVfdCBkc3Rfc3RyaWRlLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfc3RyaWRlZF9jb3B5KF9fZ2xvYmFsIGludDIgKmRzdCwgY29uc3QgX19sb2NhbCBpbnQyICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIHNpemVfdCBkc3Rfc3RyaWRlLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfc3RyaWRlZF9jb3B5KF9fZ2xvYmFsIHVpbnQyICpkc3QsIGNvbnN0IF9fbG9jYWwgdWludDIgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgc2l6ZV90IGRzdF9zdHJpZGUsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9zdHJpZGVkX2NvcHkoX19nbG9iYWwgbG9uZzIgKmRzdCwgY29uc3QgX19sb2NhbCBsb25nMiAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3QgZHN0X3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2dsb2JhbCB1bG9uZzIgKmRzdCwgY29uc3QgX19sb2NhbCB1bG9uZzIgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgc2l6ZV90IGRzdF9zdHJpZGUsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9zdHJpZGVkX2NvcHkoX19nbG9iYWwgZmxvYXQyICpkc3QsIGNvbnN0IF9fbG9jYWwgZmxvYXQyICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIHNpemVfdCBkc3Rfc3RyaWRlLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfc3RyaWRlZF9jb3B5KF9fZ2xvYmFsIGNoYXIzICpkc3QsIGNvbnN0IF9fbG9jYWwgY2hhcjMgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgc2l6ZV90IGRzdF9zdHJpZGUsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9zdHJpZGVkX2NvcHkoX19nbG9iYWwgdWNoYXIzICpkc3QsIGNvbnN0IF9fbG9jYWwgdWNoYXIzICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIHNpemVfdCBkc3Rfc3RyaWRlLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfc3RyaWRlZF9jb3B5KF9fZ2xvYmFsIHNob3J0MyAqZHN0LCBjb25zdCBfX2xvY2FsIHNob3J0MyAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3QgZHN0X3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2dsb2JhbCB1c2hvcnQzICpkc3QsIGNvbnN0IF9fbG9jYWwgdXNob3J0MyAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3QgZHN0X3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2dsb2JhbCBpbnQzICpkc3QsIGNvbnN0IF9fbG9jYWwgaW50MyAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3QgZHN0X3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2dsb2JhbCB1aW50MyAqZHN0LCBjb25zdCBfX2xvY2FsIHVpbnQzICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIHNpemVfdCBkc3Rfc3RyaWRlLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfc3RyaWRlZF9jb3B5KF9fZ2xvYmFsIGxvbmczICpkc3QsIGNvbnN0IF9fbG9jYWwgbG9uZzMgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgc2l6ZV90IGRzdF9zdHJpZGUsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9zdHJpZGVkX2NvcHkoX19nbG9iYWwgdWxvbmczICpkc3QsIGNvbnN0IF9fbG9jYWwgdWxvbmczICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIHNpemVfdCBkc3Rfc3RyaWRlLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfc3RyaWRlZF9jb3B5KF9fZ2xvYmFsIGZsb2F0MyAqZHN0LCBjb25zdCBfX2xvY2FsIGZsb2F0MyAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3QgZHN0X3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2dsb2JhbCBjaGFyNCAqZHN0LCBjb25zdCBfX2xvY2FsIGNoYXI0ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIHNpemVfdCBkc3Rfc3RyaWRlLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfc3RyaWRlZF9jb3B5KF9fZ2xvYmFsIHVjaGFyNCAqZHN0LCBjb25zdCBfX2xvY2FsIHVjaGFyNCAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3QgZHN0X3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2dsb2JhbCBzaG9ydDQgKmRzdCwgY29uc3QgX19sb2NhbCBzaG9ydDQgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgc2l6ZV90IGRzdF9zdHJpZGUsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9zdHJpZGVkX2NvcHkoX19nbG9iYWwgdXNob3J0NCAqZHN0LCBjb25zdCBfX2xvY2FsIHVzaG9ydDQgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgc2l6ZV90IGRzdF9zdHJpZGUsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9zdHJpZGVkX2NvcHkoX19nbG9iYWwgaW50NCAqZHN0LCBjb25zdCBfX2xvY2FsIGludDQgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgc2l6ZV90IGRzdF9zdHJpZGUsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9zdHJpZGVkX2NvcHkoX19nbG9iYWwgdWludDQgKmRzdCwgY29uc3QgX19sb2NhbCB1aW50NCAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3QgZHN0X3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2dsb2JhbCBsb25nNCAqZHN0LCBjb25zdCBfX2xvY2FsIGxvbmc0ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIHNpemVfdCBkc3Rfc3RyaWRlLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfc3RyaWRlZF9jb3B5KF9fZ2xvYmFsIHVsb25nNCAqZHN0LCBjb25zdCBfX2xvY2FsIHVsb25nNCAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3QgZHN0X3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2dsb2JhbCBmbG9hdDQgKmRzdCwgY29uc3QgX19sb2NhbCBmbG9hdDQgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgc2l6ZV90IGRzdF9zdHJpZGUsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9zdHJpZGVkX2NvcHkoX19nbG9iYWwgY2hhcjggKmRzdCwgY29uc3QgX19sb2NhbCBjaGFyOCAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3QgZHN0X3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2dsb2JhbCB1Y2hhcjggKmRzdCwgY29uc3QgX19sb2NhbCB1Y2hhcjggKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgc2l6ZV90IGRzdF9zdHJpZGUsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9zdHJpZGVkX2NvcHkoX19nbG9iYWwgc2hvcnQ4ICpkc3QsIGNvbnN0IF9fbG9jYWwgc2hvcnQ4ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIHNpemVfdCBkc3Rfc3RyaWRlLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfc3RyaWRlZF9jb3B5KF9fZ2xvYmFsIHVzaG9ydDggKmRzdCwgY29uc3QgX19sb2NhbCB1c2hvcnQ4ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIHNpemVfdCBkc3Rfc3RyaWRlLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfc3RyaWRlZF9jb3B5KF9fZ2xvYmFsIGludDggKmRzdCwgY29uc3QgX19sb2NhbCBpbnQ4ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIHNpemVfdCBkc3Rfc3RyaWRlLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfc3RyaWRlZF9jb3B5KF9fZ2xvYmFsIHVpbnQ4ICpkc3QsIGNvbnN0IF9fbG9jYWwgdWludDggKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgc2l6ZV90IGRzdF9zdHJpZGUsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9zdHJpZGVkX2NvcHkoX19nbG9iYWwgbG9uZzggKmRzdCwgY29uc3QgX19sb2NhbCBsb25nOCAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3QgZHN0X3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2dsb2JhbCB1bG9uZzggKmRzdCwgY29uc3QgX19sb2NhbCB1bG9uZzggKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgc2l6ZV90IGRzdF9zdHJpZGUsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9zdHJpZGVkX2NvcHkoX19nbG9iYWwgZmxvYXQ4ICpkc3QsIGNvbnN0IF9fbG9jYWwgZmxvYXQ4ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIHNpemVfdCBkc3Rfc3RyaWRlLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfc3RyaWRlZF9jb3B5KF9fZ2xvYmFsIGNoYXIxNiAqZHN0LCBjb25zdCBfX2xvY2FsIGNoYXIxNiAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3QgZHN0X3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2dsb2JhbCB1Y2hhcjE2ICpkc3QsIGNvbnN0IF9fbG9jYWwgdWNoYXIxNiAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3QgZHN0X3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2dsb2JhbCBzaG9ydDE2ICpkc3QsIGNvbnN0IF9fbG9jYWwgc2hvcnQxNiAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3QgZHN0X3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2dsb2JhbCB1c2hvcnQxNiAqZHN0LCBjb25zdCBfX2xvY2FsIHVzaG9ydDE2ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIHNpemVfdCBkc3Rfc3RyaWRlLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfc3RyaWRlZF9jb3B5KF9fZ2xvYmFsIGludDE2ICpkc3QsIGNvbnN0IF9fbG9jYWwgaW50MTYgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgc2l6ZV90IGRzdF9zdHJpZGUsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9zdHJpZGVkX2NvcHkoX19nbG9iYWwgdWludDE2ICpkc3QsIGNvbnN0IF9fbG9jYWwgdWludDE2ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIHNpemVfdCBkc3Rfc3RyaWRlLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfc3RyaWRlZF9jb3B5KF9fZ2xvYmFsIGxvbmcxNiAqZHN0LCBjb25zdCBfX2xvY2FsIGxvbmcxNiAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3QgZHN0X3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2dsb2JhbCB1bG9uZzE2ICpkc3QsIGNvbnN0IF9fbG9jYWwgdWxvbmcxNiAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3QgZHN0X3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2dsb2JhbCBmbG9hdDE2ICpkc3QsIGNvbnN0IF9fbG9jYWwgZmxvYXQxNiAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3QgZHN0X3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfc3RyaWRlZF9jb3B5KF9fbG9jYWwgZG91YmxlICpkc3QsIGNvbnN0IF9fZ2xvYmFsIGRvdWJsZSAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3Qgc3JjX3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2xvY2FsIGRvdWJsZTIgKmRzdCwgY29uc3QgX19nbG9iYWwgZG91YmxlMiAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3Qgc3JjX3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2xvY2FsIGRvdWJsZTMgKmRzdCwgY29uc3QgX19nbG9iYWwgZG91YmxlMyAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3Qgc3JjX3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2xvY2FsIGRvdWJsZTQgKmRzdCwgY29uc3QgX19nbG9iYWwgZG91YmxlNCAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3Qgc3JjX3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2xvY2FsIGRvdWJsZTggKmRzdCwgY29uc3QgX19nbG9iYWwgZG91YmxlOCAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3Qgc3JjX3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2xvY2FsIGRvdWJsZTE2ICpkc3QsIGNvbnN0IF9fZ2xvYmFsIGRvdWJsZTE2ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIHNpemVfdCBzcmNfc3RyaWRlLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfc3RyaWRlZF9jb3B5KF9fZ2xvYmFsIGRvdWJsZSAqZHN0LCBjb25zdCBfX2xvY2FsIGRvdWJsZSAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3QgZHN0X3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2dsb2JhbCBkb3VibGUyICpkc3QsIGNvbnN0IF9fbG9jYWwgZG91YmxlMiAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3QgZHN0X3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2dsb2JhbCBkb3VibGUzICpkc3QsIGNvbnN0IF9fbG9jYWwgZG91YmxlMyAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3QgZHN0X3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2dsb2JhbCBkb3VibGU0ICpkc3QsIGNvbnN0IF9fbG9jYWwgZG91YmxlNCAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3QgZHN0X3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2dsb2JhbCBkb3VibGU4ICpkc3QsIGNvbnN0IF9fbG9jYWwgZG91YmxlOCAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3QgZHN0X3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2dsb2JhbCBkb3VibGUxNiAqZHN0LCBjb25zdCBfX2xvY2FsIGRvdWJsZTE2ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIHNpemVfdCBkc3Rfc3RyaWRlLCBldmVudF90IGV2ZW50KTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisjaWZkZWYgY2xfa2hyX2ZwMTYKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfc3RyaWRlZF9jb3B5KF9fbG9jYWwgaGFsZiAqZHN0LCBjb25zdCBfX2dsb2JhbCBoYWxmICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIHNpemVfdCBzcmNfc3RyaWRlLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfc3RyaWRlZF9jb3B5KF9fbG9jYWwgaGFsZjIgKmRzdCwgY29uc3QgX19nbG9iYWwgaGFsZjIgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgc2l6ZV90IHNyY19zdHJpZGUsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9zdHJpZGVkX2NvcHkoX19sb2NhbCBoYWxmMyAqZHN0LCBjb25zdCBfX2dsb2JhbCBoYWxmMyAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3Qgc3JjX3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2xvY2FsIGhhbGY0ICpkc3QsIGNvbnN0IF9fZ2xvYmFsIGhhbGY0ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIHNpemVfdCBzcmNfc3RyaWRlLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfc3RyaWRlZF9jb3B5KF9fbG9jYWwgaGFsZjggKmRzdCwgY29uc3QgX19nbG9iYWwgaGFsZjggKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgc2l6ZV90IHNyY19zdHJpZGUsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9zdHJpZGVkX2NvcHkoX19sb2NhbCBoYWxmMTYgKmRzdCwgY29uc3QgX19nbG9iYWwgaGFsZjE2ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIHNpemVfdCBzcmNfc3RyaWRlLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfc3RyaWRlZF9jb3B5KF9fZ2xvYmFsIGhhbGYgKmRzdCwgY29uc3QgX19sb2NhbCBoYWxmICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIHNpemVfdCBkc3Rfc3RyaWRlLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfc3RyaWRlZF9jb3B5KF9fZ2xvYmFsIGhhbGYyICpkc3QsIGNvbnN0IF9fbG9jYWwgaGFsZjIgKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgc2l6ZV90IGRzdF9zdHJpZGUsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9zdHJpZGVkX2NvcHkoX19nbG9iYWwgaGFsZjMgKmRzdCwgY29uc3QgX19sb2NhbCBoYWxmMyAqc3JjLCBzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3QgZHN0X3N0cmlkZSwgZXZlbnRfdCBldmVudCk7CitldmVudF90IF9fb3ZsZCBhc3luY193b3JrX2dyb3VwX3N0cmlkZWRfY29weShfX2dsb2JhbCBoYWxmNCAqZHN0LCBjb25zdCBfX2xvY2FsIGhhbGY0ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIHNpemVfdCBkc3Rfc3RyaWRlLCBldmVudF90IGV2ZW50KTsKK2V2ZW50X3QgX19vdmxkIGFzeW5jX3dvcmtfZ3JvdXBfc3RyaWRlZF9jb3B5KF9fZ2xvYmFsIGhhbGY4ICpkc3QsIGNvbnN0IF9fbG9jYWwgaGFsZjggKnNyYywgc2l6ZV90IG51bV9lbGVtZW50cywgc2l6ZV90IGRzdF9zdHJpZGUsIGV2ZW50X3QgZXZlbnQpOworZXZlbnRfdCBfX292bGQgYXN5bmNfd29ya19ncm91cF9zdHJpZGVkX2NvcHkoX19nbG9iYWwgaGFsZjE2ICpkc3QsIGNvbnN0IF9fbG9jYWwgaGFsZjE2ICpzcmMsIHNpemVfdCBudW1fZWxlbWVudHMsIHNpemVfdCBkc3Rfc3RyaWRlLCBldmVudF90IGV2ZW50KTsKKyNlbmRpZiAvL2NsX2tocl9mcDE2CisKKy8qKgorICogV2FpdCBmb3IgZXZlbnRzIHRoYXQgaWRlbnRpZnkgdGhlCisgKiBhc3luY193b3JrX2dyb3VwX2NvcHkgb3BlcmF0aW9ucyB0bworICogY29tcGxldGUuIFRoZSBldmVudCBvYmplY3RzIHNwZWNpZmllZCBpbgorICogZXZlbnRfbGlzdCB3aWxsIGJlIHJlbGVhc2VkIGFmdGVyIHRoZSB3YWl0IGlzCisgKiBwZXJmb3JtZWQuCisgKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgZW5jb3VudGVyZWQgYnkgYWxsIHdvcmtpdGVtcworICogaW4gYSB3b3JrLWdyb3VwIGV4ZWN1dGluZyB0aGUga2VybmVsIHdpdGgKKyAqIHRoZSBzYW1lIG51bV9ldmVudHMgYW5kIGV2ZW50IG9iamVjdHMgc3BlY2lmaWVkCisgKiBpbiBldmVudF9saXN0OyBvdGhlcndpc2UgdGhlIHJlc3VsdHMgYXJlIHVuZGVmaW5lZC4KKyAqLwordm9pZCBfX292bGQgd2FpdF9ncm91cF9ldmVudHMoaW50IG51bV9ldmVudHMsIGV2ZW50X3QgKmV2ZW50X2xpc3QpOworCisvKioKKyAqIFByZWZldGNoIG51bV9lbGVtZW50cyAqIHNpemVvZihnZW50eXBlKQorICogYnl0ZXMgaW50byB0aGUgZ2xvYmFsIGNhY2hlLiBUaGUgcHJlZmV0Y2gKKyAqIGluc3RydWN0aW9uIGlzIGFwcGxpZWQgdG8gYSB3b3JrLWl0ZW0gaW4gYSB3b3JrZ3JvdXAKKyAqIGFuZCBkb2VzIG5vdCBhZmZlY3QgdGhlIGZ1bmN0aW9uYWwKKyAqIGJlaGF2aW9yIG9mIHRoZSBrZXJuZWwuCisgKi8KK3ZvaWQgX19vdmxkIHByZWZldGNoKGNvbnN0IF9fZ2xvYmFsIGNoYXIgKnAsIHNpemVfdCBudW1fZWxlbWVudHMpOwordm9pZCBfX292bGQgcHJlZmV0Y2goY29uc3QgX19nbG9iYWwgdWNoYXIgKnAsIHNpemVfdCBudW1fZWxlbWVudHMpOwordm9pZCBfX292bGQgcHJlZmV0Y2goY29uc3QgX19nbG9iYWwgc2hvcnQgKnAsIHNpemVfdCBudW1fZWxlbWVudHMpOwordm9pZCBfX292bGQgcHJlZmV0Y2goY29uc3QgX19nbG9iYWwgdXNob3J0ICpwLCBzaXplX3QgbnVtX2VsZW1lbnRzKTsKK3ZvaWQgX19vdmxkIHByZWZldGNoKGNvbnN0IF9fZ2xvYmFsIGludCAqcCwgc2l6ZV90IG51bV9lbGVtZW50cyk7Cit2b2lkIF9fb3ZsZCBwcmVmZXRjaChjb25zdCBfX2dsb2JhbCB1aW50ICpwLCBzaXplX3QgbnVtX2VsZW1lbnRzKTsKK3ZvaWQgX19vdmxkIHByZWZldGNoKGNvbnN0IF9fZ2xvYmFsIGxvbmcgKnAsIHNpemVfdCBudW1fZWxlbWVudHMpOwordm9pZCBfX292bGQgcHJlZmV0Y2goY29uc3QgX19nbG9iYWwgdWxvbmcgKnAsIHNpemVfdCBudW1fZWxlbWVudHMpOwordm9pZCBfX292bGQgcHJlZmV0Y2goY29uc3QgX19nbG9iYWwgZmxvYXQgKnAsIHNpemVfdCBudW1fZWxlbWVudHMpOwordm9pZCBfX292bGQgcHJlZmV0Y2goY29uc3QgX19nbG9iYWwgY2hhcjIgKnAsIHNpemVfdCBudW1fZWxlbWVudHMpOwordm9pZCBfX292bGQgcHJlZmV0Y2goY29uc3QgX19nbG9iYWwgdWNoYXIyICpwLCBzaXplX3QgbnVtX2VsZW1lbnRzKTsKK3ZvaWQgX19vdmxkIHByZWZldGNoKGNvbnN0IF9fZ2xvYmFsIHNob3J0MiAqcCwgc2l6ZV90IG51bV9lbGVtZW50cyk7Cit2b2lkIF9fb3ZsZCBwcmVmZXRjaChjb25zdCBfX2dsb2JhbCB1c2hvcnQyICpwLCBzaXplX3QgbnVtX2VsZW1lbnRzKTsKK3ZvaWQgX19vdmxkIHByZWZldGNoKGNvbnN0IF9fZ2xvYmFsIGludDIgKnAsIHNpemVfdCBudW1fZWxlbWVudHMpOwordm9pZCBfX292bGQgcHJlZmV0Y2goY29uc3QgX19nbG9iYWwgdWludDIgKnAsIHNpemVfdCBudW1fZWxlbWVudHMpOwordm9pZCBfX292bGQgcHJlZmV0Y2goY29uc3QgX19nbG9iYWwgbG9uZzIgKnAsIHNpemVfdCBudW1fZWxlbWVudHMpOwordm9pZCBfX292bGQgcHJlZmV0Y2goY29uc3QgX19nbG9iYWwgdWxvbmcyICpwLCBzaXplX3QgbnVtX2VsZW1lbnRzKTsKK3ZvaWQgX19vdmxkIHByZWZldGNoKGNvbnN0IF9fZ2xvYmFsIGZsb2F0MiAqcCwgc2l6ZV90IG51bV9lbGVtZW50cyk7Cit2b2lkIF9fb3ZsZCBwcmVmZXRjaChjb25zdCBfX2dsb2JhbCBjaGFyMyAqcCwgc2l6ZV90IG51bV9lbGVtZW50cyk7Cit2b2lkIF9fb3ZsZCBwcmVmZXRjaChjb25zdCBfX2dsb2JhbCB1Y2hhcjMgKnAsIHNpemVfdCBudW1fZWxlbWVudHMpOwordm9pZCBfX292bGQgcHJlZmV0Y2goY29uc3QgX19nbG9iYWwgc2hvcnQzICpwLCBzaXplX3QgbnVtX2VsZW1lbnRzKTsKK3ZvaWQgX19vdmxkIHByZWZldGNoKGNvbnN0IF9fZ2xvYmFsIHVzaG9ydDMgKnAsIHNpemVfdCBudW1fZWxlbWVudHMpOwordm9pZCBfX292bGQgcHJlZmV0Y2goY29uc3QgX19nbG9iYWwgaW50MyAqcCwgc2l6ZV90IG51bV9lbGVtZW50cyk7Cit2b2lkIF9fb3ZsZCBwcmVmZXRjaChjb25zdCBfX2dsb2JhbCB1aW50MyAqcCwgc2l6ZV90IG51bV9lbGVtZW50cyk7Cit2b2lkIF9fb3ZsZCBwcmVmZXRjaChjb25zdCBfX2dsb2JhbCBsb25nMyAqcCwgc2l6ZV90IG51bV9lbGVtZW50cyk7Cit2b2lkIF9fb3ZsZCBwcmVmZXRjaChjb25zdCBfX2dsb2JhbCB1bG9uZzMgKnAsIHNpemVfdCBudW1fZWxlbWVudHMpOwordm9pZCBfX292bGQgcHJlZmV0Y2goY29uc3QgX19nbG9iYWwgZmxvYXQzICpwLCBzaXplX3QgbnVtX2VsZW1lbnRzKTsKK3ZvaWQgX19vdmxkIHByZWZldGNoKGNvbnN0IF9fZ2xvYmFsIGNoYXI0ICpwLCBzaXplX3QgbnVtX2VsZW1lbnRzKTsKK3ZvaWQgX19vdmxkIHByZWZldGNoKGNvbnN0IF9fZ2xvYmFsIHVjaGFyNCAqcCwgc2l6ZV90IG51bV9lbGVtZW50cyk7Cit2b2lkIF9fb3ZsZCBwcmVmZXRjaChjb25zdCBfX2dsb2JhbCBzaG9ydDQgKnAsIHNpemVfdCBudW1fZWxlbWVudHMpOwordm9pZCBfX292bGQgcHJlZmV0Y2goY29uc3QgX19nbG9iYWwgdXNob3J0NCAqcCwgc2l6ZV90IG51bV9lbGVtZW50cyk7Cit2b2lkIF9fb3ZsZCBwcmVmZXRjaChjb25zdCBfX2dsb2JhbCBpbnQ0ICpwLCBzaXplX3QgbnVtX2VsZW1lbnRzKTsKK3ZvaWQgX19vdmxkIHByZWZldGNoKGNvbnN0IF9fZ2xvYmFsIHVpbnQ0ICpwLCBzaXplX3QgbnVtX2VsZW1lbnRzKTsKK3ZvaWQgX19vdmxkIHByZWZldGNoKGNvbnN0IF9fZ2xvYmFsIGxvbmc0ICpwLCBzaXplX3QgbnVtX2VsZW1lbnRzKTsKK3ZvaWQgX19vdmxkIHByZWZldGNoKGNvbnN0IF9fZ2xvYmFsIHVsb25nNCAqcCwgc2l6ZV90IG51bV9lbGVtZW50cyk7Cit2b2lkIF9fb3ZsZCBwcmVmZXRjaChjb25zdCBfX2dsb2JhbCBmbG9hdDQgKnAsIHNpemVfdCBudW1fZWxlbWVudHMpOwordm9pZCBfX292bGQgcHJlZmV0Y2goY29uc3QgX19nbG9iYWwgY2hhcjggKnAsIHNpemVfdCBudW1fZWxlbWVudHMpOwordm9pZCBfX292bGQgcHJlZmV0Y2goY29uc3QgX19nbG9iYWwgdWNoYXI4ICpwLCBzaXplX3QgbnVtX2VsZW1lbnRzKTsKK3ZvaWQgX19vdmxkIHByZWZldGNoKGNvbnN0IF9fZ2xvYmFsIHNob3J0OCAqcCwgc2l6ZV90IG51bV9lbGVtZW50cyk7Cit2b2lkIF9fb3ZsZCBwcmVmZXRjaChjb25zdCBfX2dsb2JhbCB1c2hvcnQ4ICpwLCBzaXplX3QgbnVtX2VsZW1lbnRzKTsKK3ZvaWQgX19vdmxkIHByZWZldGNoKGNvbnN0IF9fZ2xvYmFsIGludDggKnAsIHNpemVfdCBudW1fZWxlbWVudHMpOwordm9pZCBfX292bGQgcHJlZmV0Y2goY29uc3QgX19nbG9iYWwgdWludDggKnAsIHNpemVfdCBudW1fZWxlbWVudHMpOwordm9pZCBfX292bGQgcHJlZmV0Y2goY29uc3QgX19nbG9iYWwgbG9uZzggKnAsIHNpemVfdCBudW1fZWxlbWVudHMpOwordm9pZCBfX292bGQgcHJlZmV0Y2goY29uc3QgX19nbG9iYWwgdWxvbmc4ICpwLCBzaXplX3QgbnVtX2VsZW1lbnRzKTsKK3ZvaWQgX19vdmxkIHByZWZldGNoKGNvbnN0IF9fZ2xvYmFsIGZsb2F0OCAqcCwgc2l6ZV90IG51bV9lbGVtZW50cyk7Cit2b2lkIF9fb3ZsZCBwcmVmZXRjaChjb25zdCBfX2dsb2JhbCBjaGFyMTYgKnAsIHNpemVfdCBudW1fZWxlbWVudHMpOwordm9pZCBfX292bGQgcHJlZmV0Y2goY29uc3QgX19nbG9iYWwgdWNoYXIxNiAqcCwgc2l6ZV90IG51bV9lbGVtZW50cyk7Cit2b2lkIF9fb3ZsZCBwcmVmZXRjaChjb25zdCBfX2dsb2JhbCBzaG9ydDE2ICpwLCBzaXplX3QgbnVtX2VsZW1lbnRzKTsKK3ZvaWQgX19vdmxkIHByZWZldGNoKGNvbnN0IF9fZ2xvYmFsIHVzaG9ydDE2ICpwLCBzaXplX3QgbnVtX2VsZW1lbnRzKTsKK3ZvaWQgX19vdmxkIHByZWZldGNoKGNvbnN0IF9fZ2xvYmFsIGludDE2ICpwLCBzaXplX3QgbnVtX2VsZW1lbnRzKTsKK3ZvaWQgX19vdmxkIHByZWZldGNoKGNvbnN0IF9fZ2xvYmFsIHVpbnQxNiAqcCwgc2l6ZV90IG51bV9lbGVtZW50cyk7Cit2b2lkIF9fb3ZsZCBwcmVmZXRjaChjb25zdCBfX2dsb2JhbCBsb25nMTYgKnAsIHNpemVfdCBudW1fZWxlbWVudHMpOwordm9pZCBfX292bGQgcHJlZmV0Y2goY29uc3QgX19nbG9iYWwgdWxvbmcxNiAqcCwgc2l6ZV90IG51bV9lbGVtZW50cyk7Cit2b2lkIF9fb3ZsZCBwcmVmZXRjaChjb25zdCBfX2dsb2JhbCBmbG9hdDE2ICpwLCBzaXplX3QgbnVtX2VsZW1lbnRzKTsKKyNpZmRlZiBjbF9raHJfZnA2NAordm9pZCBfX292bGQgcHJlZmV0Y2goY29uc3QgX19nbG9iYWwgZG91YmxlICpwLCBzaXplX3QgbnVtX2VsZW1lbnRzKTsKK3ZvaWQgX19vdmxkIHByZWZldGNoKGNvbnN0IF9fZ2xvYmFsIGRvdWJsZTIgKnAsIHNpemVfdCBudW1fZWxlbWVudHMpOwordm9pZCBfX292bGQgcHJlZmV0Y2goY29uc3QgX19nbG9iYWwgZG91YmxlMyAqcCwgc2l6ZV90IG51bV9lbGVtZW50cyk7Cit2b2lkIF9fb3ZsZCBwcmVmZXRjaChjb25zdCBfX2dsb2JhbCBkb3VibGU0ICpwLCBzaXplX3QgbnVtX2VsZW1lbnRzKTsKK3ZvaWQgX19vdmxkIHByZWZldGNoKGNvbnN0IF9fZ2xvYmFsIGRvdWJsZTggKnAsIHNpemVfdCBudW1fZWxlbWVudHMpOwordm9pZCBfX292bGQgcHJlZmV0Y2goY29uc3QgX19nbG9iYWwgZG91YmxlMTYgKnAsIHNpemVfdCBudW1fZWxlbWVudHMpOworI2VuZGlmIC8vY2xfa2hyX2ZwNjQKKyNpZmRlZiBjbF9raHJfZnAxNgordm9pZCBfX292bGQgcHJlZmV0Y2goY29uc3QgX19nbG9iYWwgaGFsZiAqcCwgc2l6ZV90IG51bV9lbGVtZW50cyk7Cit2b2lkIF9fb3ZsZCBwcmVmZXRjaChjb25zdCBfX2dsb2JhbCBoYWxmMiAqcCwgc2l6ZV90IG51bV9lbGVtZW50cyk7Cit2b2lkIF9fb3ZsZCBwcmVmZXRjaChjb25zdCBfX2dsb2JhbCBoYWxmMyAqcCwgc2l6ZV90IG51bV9lbGVtZW50cyk7Cit2b2lkIF9fb3ZsZCBwcmVmZXRjaChjb25zdCBfX2dsb2JhbCBoYWxmNCAqcCwgc2l6ZV90IG51bV9lbGVtZW50cyk7Cit2b2lkIF9fb3ZsZCBwcmVmZXRjaChjb25zdCBfX2dsb2JhbCBoYWxmOCAqcCwgc2l6ZV90IG51bV9lbGVtZW50cyk7Cit2b2lkIF9fb3ZsZCBwcmVmZXRjaChjb25zdCBfX2dsb2JhbCBoYWxmMTYgKnAsIHNpemVfdCBudW1fZWxlbWVudHMpOworI2VuZGlmIC8vIGNsX2tocl9mcDE2CisKKy8vIE9wZW5DTCB2MS4xIHM2LjExLjEsIHYxLjIgczYuMTIuMTEgLSBBdG9taWMgRnVuY3Rpb25zCisKKyNpZiBkZWZpbmVkKGNsX2tocl9pbnQ2NF9iYXNlX2F0b21pY3MpICYmIGRlZmluZWQoY2xfa2hyX2ludDY0X2V4dGVuZGVkX2F0b21pY3MpCisjcHJhZ21hIE9QRU5DTCBFWFRFTlNJT04gY2xfa2hyX2ludDY0X2Jhc2VfYXRvbWljcyA6IGVuYWJsZQorI3ByYWdtYSBPUEVOQ0wgRVhURU5TSU9OIGNsX2tocl9pbnQ2NF9leHRlbmRlZF9hdG9taWNzIDogZW5hYmxlCisjZW5kaWYKKy8qKgorICogUmVhZCB0aGUgMzItYml0IHZhbHVlIChyZWZlcnJlZCB0byBhcyBvbGQpCisgKiBzdG9yZWQgYXQgbG9jYXRpb24gcG9pbnRlZCBieSBwLiBDb21wdXRlCisgKiAob2xkICsgdmFsKSBhbmQgc3RvcmUgcmVzdWx0IGF0IGxvY2F0aW9uCisgKiBwb2ludGVkIGJ5IHAuIFRoZSBmdW5jdGlvbiByZXR1cm5zIG9sZC4KKyAqLworaW50IF9fb3ZsZCBhdG9taWNfYWRkKHZvbGF0aWxlIF9fZ2xvYmFsIGludCAqcCwgaW50IHZhbCk7Cit1bnNpZ25lZCBpbnQgX19vdmxkIGF0b21pY19hZGQodm9sYXRpbGUgX19nbG9iYWwgdW5zaWduZWQgaW50ICpwLCB1bnNpZ25lZCBpbnQgdmFsKTsKK2ludCBfX292bGQgYXRvbWljX2FkZCh2b2xhdGlsZSBfX2xvY2FsIGludCAqcCwgaW50IHZhbCk7Cit1bnNpZ25lZCBpbnQgX19vdmxkIGF0b21pY19hZGQodm9sYXRpbGUgX19sb2NhbCB1bnNpZ25lZCBpbnQgKnAsIHVuc2lnbmVkIGludCB2YWwpOworCisjaWYgZGVmaW5lZChjbF9raHJfZ2xvYmFsX2ludDMyX2Jhc2VfYXRvbWljcykKK2ludCBfX292bGQgYXRvbV9hZGQodm9sYXRpbGUgX19nbG9iYWwgaW50ICpwLCBpbnQgdmFsKTsKK3Vuc2lnbmVkIGludCBfX292bGQgYXRvbV9hZGQodm9sYXRpbGUgX19nbG9iYWwgdW5zaWduZWQgaW50ICpwLCB1bnNpZ25lZCBpbnQgdmFsKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoY2xfa2hyX2xvY2FsX2ludDMyX2Jhc2VfYXRvbWljcykKK2ludCBfX292bGQgYXRvbV9hZGQodm9sYXRpbGUgX19sb2NhbCBpbnQgKnAsIGludCB2YWwpOwordW5zaWduZWQgaW50IF9fb3ZsZCBhdG9tX2FkZCh2b2xhdGlsZSBfX2xvY2FsIHVuc2lnbmVkIGludCAqcCwgdW5zaWduZWQgaW50IHZhbCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoY2xfa2hyX2ludDY0X2Jhc2VfYXRvbWljcykKK2xvbmcgX19vdmxkIGF0b21fYWRkKHZvbGF0aWxlIF9fZ2xvYmFsIGxvbmcgKnAsIGxvbmcgdmFsKTsKK3Vuc2lnbmVkIGxvbmcgX19vdmxkIGF0b21fYWRkKHZvbGF0aWxlIF9fZ2xvYmFsIHVuc2lnbmVkIGxvbmcgKnAsIHVuc2lnbmVkIGxvbmcgdmFsKTsKK2xvbmcgX19vdmxkIGF0b21fYWRkKHZvbGF0aWxlIF9fbG9jYWwgbG9uZyAqcCwgbG9uZyB2YWwpOwordW5zaWduZWQgbG9uZyBfX292bGQgYXRvbV9hZGQodm9sYXRpbGUgX19sb2NhbCB1bnNpZ25lZCBsb25nICpwLCB1bnNpZ25lZCBsb25nIHZhbCk7CisjZW5kaWYKKworLyoqCisgKiBSZWFkIHRoZSAzMi1iaXQgdmFsdWUgKHJlZmVycmVkIHRvIGFzIG9sZCkgc3RvcmVkIGF0IGxvY2F0aW9uIHBvaW50ZWQgYnkgcC4KKyAqIENvbXB1dGUgKG9sZCAtIHZhbCkgYW5kIHN0b3JlIHJlc3VsdCBhdCBsb2NhdGlvbiBwb2ludGVkIGJ5IHAuIFRoZSBmdW5jdGlvbgorICogcmV0dXJucyBvbGQuCisgKi8KK2ludCBfX292bGQgYXRvbWljX3N1Yih2b2xhdGlsZSBfX2dsb2JhbCBpbnQgKnAsIGludCB2YWwpOwordW5zaWduZWQgaW50IF9fb3ZsZCBhdG9taWNfc3ViKHZvbGF0aWxlIF9fZ2xvYmFsIHVuc2lnbmVkIGludCAqcCwgdW5zaWduZWQgaW50IHZhbCk7CitpbnQgX19vdmxkIGF0b21pY19zdWIodm9sYXRpbGUgX19sb2NhbCBpbnQgKnAsIGludCB2YWwpOwordW5zaWduZWQgaW50IF9fb3ZsZCBhdG9taWNfc3ViKHZvbGF0aWxlIF9fbG9jYWwgdW5zaWduZWQgaW50ICpwLCB1bnNpZ25lZCBpbnQgdmFsKTsKKworI2lmIGRlZmluZWQoY2xfa2hyX2dsb2JhbF9pbnQzMl9iYXNlX2F0b21pY3MpCitpbnQgX19vdmxkIGF0b21fc3ViKHZvbGF0aWxlIF9fZ2xvYmFsIGludCAqcCwgaW50IHZhbCk7Cit1bnNpZ25lZCBpbnQgX19vdmxkIGF0b21fc3ViKHZvbGF0aWxlIF9fZ2xvYmFsIHVuc2lnbmVkIGludCAqcCwgdW5zaWduZWQgaW50IHZhbCk7CisjZW5kaWYKKyNpZiBkZWZpbmVkKGNsX2tocl9sb2NhbF9pbnQzMl9iYXNlX2F0b21pY3MpCitpbnQgX19vdmxkIGF0b21fc3ViKHZvbGF0aWxlIF9fbG9jYWwgaW50ICpwLCBpbnQgdmFsKTsKK3Vuc2lnbmVkIGludCBfX292bGQgYXRvbV9zdWIodm9sYXRpbGUgX19sb2NhbCB1bnNpZ25lZCBpbnQgKnAsIHVuc2lnbmVkIGludCB2YWwpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKGNsX2tocl9pbnQ2NF9iYXNlX2F0b21pY3MpCitsb25nIF9fb3ZsZCBhdG9tX3N1Yih2b2xhdGlsZSBfX2dsb2JhbCBsb25nICpwLCBsb25nIHZhbCk7Cit1bnNpZ25lZCBsb25nIF9fb3ZsZCBhdG9tX3N1Yih2b2xhdGlsZSBfX2dsb2JhbCB1bnNpZ25lZCBsb25nICpwLCB1bnNpZ25lZCBsb25nIHZhbCk7Citsb25nIF9fb3ZsZCBhdG9tX3N1Yih2b2xhdGlsZSBfX2xvY2FsIGxvbmcgKnAsIGxvbmcgdmFsKTsKK3Vuc2lnbmVkIGxvbmcgX19vdmxkIGF0b21fc3ViKHZvbGF0aWxlIF9fbG9jYWwgdW5zaWduZWQgbG9uZyAqcCwgdW5zaWduZWQgbG9uZyB2YWwpOworI2VuZGlmCisKKy8qKgorICogU3dhcHMgdGhlIG9sZCB2YWx1ZSBzdG9yZWQgYXQgbG9jYXRpb24gcAorICogd2l0aCBuZXcgdmFsdWUgZ2l2ZW4gYnkgdmFsLiBSZXR1cm5zIG9sZAorICogdmFsdWUuCisgKi8KK2ludCBfX292bGQgYXRvbWljX3hjaGcodm9sYXRpbGUgX19nbG9iYWwgaW50ICpwLCBpbnQgdmFsKTsKK3Vuc2lnbmVkIGludCBfX292bGQgYXRvbWljX3hjaGcodm9sYXRpbGUgX19nbG9iYWwgdW5zaWduZWQgaW50ICpwLCB1bnNpZ25lZCBpbnQgdmFsKTsKK2ludCBfX292bGQgYXRvbWljX3hjaGcodm9sYXRpbGUgX19sb2NhbCBpbnQgKnAsIGludCB2YWwpOwordW5zaWduZWQgaW50IF9fb3ZsZCBhdG9taWNfeGNoZyh2b2xhdGlsZSBfX2xvY2FsIHVuc2lnbmVkIGludCAqcCwgdW5zaWduZWQgaW50IHZhbCk7CitmbG9hdCBfX292bGQgYXRvbWljX3hjaGcodm9sYXRpbGUgX19nbG9iYWwgZmxvYXQgKnAsIGZsb2F0IHZhbCk7CitmbG9hdCBfX292bGQgYXRvbWljX3hjaGcodm9sYXRpbGUgX19sb2NhbCBmbG9hdCAqcCwgZmxvYXQgdmFsKTsKKworI2lmIGRlZmluZWQoY2xfa2hyX2dsb2JhbF9pbnQzMl9iYXNlX2F0b21pY3MpCitpbnQgX19vdmxkIGF0b21feGNoZyh2b2xhdGlsZSBfX2dsb2JhbCBpbnQgKnAsIGludCB2YWwpOworaW50IF9fb3ZsZCBhdG9tX3hjaGcodm9sYXRpbGUgX19sb2NhbCBpbnQgKnAsIGludCB2YWwpOworI2VuZGlmCisjaWYgZGVmaW5lZChjbF9raHJfbG9jYWxfaW50MzJfYmFzZV9hdG9taWNzKQordW5zaWduZWQgaW50IF9fb3ZsZCBhdG9tX3hjaGcodm9sYXRpbGUgX19nbG9iYWwgdW5zaWduZWQgaW50ICpwLCB1bnNpZ25lZCBpbnQgdmFsKTsKK3Vuc2lnbmVkIGludCBfX292bGQgYXRvbV94Y2hnKHZvbGF0aWxlIF9fbG9jYWwgdW5zaWduZWQgaW50ICpwLCB1bnNpZ25lZCBpbnQgdmFsKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChjbF9raHJfaW50NjRfYmFzZV9hdG9taWNzKQorbG9uZyBfX292bGQgYXRvbV94Y2hnKHZvbGF0aWxlIF9fZ2xvYmFsIGxvbmcgKnAsIGxvbmcgdmFsKTsKK2xvbmcgX19vdmxkIGF0b21feGNoZyh2b2xhdGlsZSBfX2xvY2FsIGxvbmcgKnAsIGxvbmcgdmFsKTsKK3Vuc2lnbmVkIGxvbmcgX19vdmxkIGF0b21feGNoZyh2b2xhdGlsZSBfX2dsb2JhbCB1bnNpZ25lZCBsb25nICpwLCB1bnNpZ25lZCBsb25nIHZhbCk7Cit1bnNpZ25lZCBsb25nIF9fb3ZsZCBhdG9tX3hjaGcodm9sYXRpbGUgX19sb2NhbCB1bnNpZ25lZCBsb25nICpwLCB1bnNpZ25lZCBsb25nIHZhbCk7CisjZW5kaWYKKworLyoqCisgKiBSZWFkIHRoZSAzMi1iaXQgdmFsdWUgKHJlZmVycmVkIHRvIGFzIG9sZCkKKyAqIHN0b3JlZCBhdCBsb2NhdGlvbiBwb2ludGVkIGJ5IHAuIENvbXB1dGUKKyAqIChvbGQgKyAxKSBhbmQgc3RvcmUgcmVzdWx0IGF0IGxvY2F0aW9uCisgKiBwb2ludGVkIGJ5IHAuIFRoZSBmdW5jdGlvbiByZXR1cm5zIG9sZC4KKyAqLworaW50IF9fb3ZsZCBhdG9taWNfaW5jKHZvbGF0aWxlIF9fZ2xvYmFsIGludCAqcCk7Cit1bnNpZ25lZCBpbnQgX19vdmxkIGF0b21pY19pbmModm9sYXRpbGUgX19nbG9iYWwgdW5zaWduZWQgaW50ICpwKTsKK2ludCBfX292bGQgYXRvbWljX2luYyh2b2xhdGlsZSBfX2xvY2FsIGludCAqcCk7Cit1bnNpZ25lZCBpbnQgX19vdmxkIGF0b21pY19pbmModm9sYXRpbGUgX19sb2NhbCB1bnNpZ25lZCBpbnQgKnApOworCisjaWYgZGVmaW5lZChjbF9raHJfZ2xvYmFsX2ludDMyX2Jhc2VfYXRvbWljcykKK2ludCBfX292bGQgYXRvbV9pbmModm9sYXRpbGUgX19nbG9iYWwgaW50ICpwKTsKK3Vuc2lnbmVkIGludCBfX292bGQgYXRvbV9pbmModm9sYXRpbGUgX19nbG9iYWwgdW5zaWduZWQgaW50ICpwKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoY2xfa2hyX2xvY2FsX2ludDMyX2Jhc2VfYXRvbWljcykKK2ludCBfX292bGQgYXRvbV9pbmModm9sYXRpbGUgX19sb2NhbCBpbnQgKnApOwordW5zaWduZWQgaW50IF9fb3ZsZCBhdG9tX2luYyh2b2xhdGlsZSBfX2xvY2FsIHVuc2lnbmVkIGludCAqcCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoY2xfa2hyX2ludDY0X2Jhc2VfYXRvbWljcykKK2xvbmcgX19vdmxkIGF0b21faW5jKHZvbGF0aWxlIF9fZ2xvYmFsIGxvbmcgKnApOwordW5zaWduZWQgbG9uZyBfX292bGQgYXRvbV9pbmModm9sYXRpbGUgX19nbG9iYWwgdW5zaWduZWQgbG9uZyAqcCk7Citsb25nIF9fb3ZsZCBhdG9tX2luYyh2b2xhdGlsZSBfX2xvY2FsIGxvbmcgKnApOwordW5zaWduZWQgbG9uZyBfX292bGQgYXRvbV9pbmModm9sYXRpbGUgX19sb2NhbCB1bnNpZ25lZCBsb25nICpwKTsKKyNlbmRpZgorCisvKioKKyAqIFJlYWQgdGhlIDMyLWJpdCB2YWx1ZSAocmVmZXJyZWQgdG8gYXMgb2xkKQorICogc3RvcmVkIGF0IGxvY2F0aW9uIHBvaW50ZWQgYnkgcC4gQ29tcHV0ZQorICogKG9sZCAtIDEpIGFuZCBzdG9yZSByZXN1bHQgYXQgbG9jYXRpb24KKyAqIHBvaW50ZWQgYnkgcC4gVGhlIGZ1bmN0aW9uIHJldHVybnMgb2xkLgorICovCitpbnQgX19vdmxkIGF0b21pY19kZWModm9sYXRpbGUgX19nbG9iYWwgaW50ICpwKTsKK3Vuc2lnbmVkIGludCBfX292bGQgYXRvbWljX2RlYyh2b2xhdGlsZSBfX2dsb2JhbCB1bnNpZ25lZCBpbnQgKnApOworaW50IF9fb3ZsZCBhdG9taWNfZGVjKHZvbGF0aWxlIF9fbG9jYWwgaW50ICpwKTsKK3Vuc2lnbmVkIGludCBfX292bGQgYXRvbWljX2RlYyh2b2xhdGlsZSBfX2xvY2FsIHVuc2lnbmVkIGludCAqcCk7CisKKyNpZiBkZWZpbmVkKGNsX2tocl9nbG9iYWxfaW50MzJfYmFzZV9hdG9taWNzKQoraW50IF9fb3ZsZCBhdG9tX2RlYyh2b2xhdGlsZSBfX2dsb2JhbCBpbnQgKnApOwordW5zaWduZWQgaW50IF9fb3ZsZCBhdG9tX2RlYyh2b2xhdGlsZSBfX2dsb2JhbCB1bnNpZ25lZCBpbnQgKnApOworI2VuZGlmCisjaWYgZGVmaW5lZChjbF9raHJfbG9jYWxfaW50MzJfYmFzZV9hdG9taWNzKQoraW50IF9fb3ZsZCBhdG9tX2RlYyh2b2xhdGlsZSBfX2xvY2FsIGludCAqcCk7Cit1bnNpZ25lZCBpbnQgX19vdmxkIGF0b21fZGVjKHZvbGF0aWxlIF9fbG9jYWwgdW5zaWduZWQgaW50ICpwKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChjbF9raHJfaW50NjRfYmFzZV9hdG9taWNzKQorbG9uZyBfX292bGQgYXRvbV9kZWModm9sYXRpbGUgX19nbG9iYWwgbG9uZyAqcCk7Cit1bnNpZ25lZCBsb25nIF9fb3ZsZCBhdG9tX2RlYyh2b2xhdGlsZSBfX2dsb2JhbCB1bnNpZ25lZCBsb25nICpwKTsKK2xvbmcgX19vdmxkIGF0b21fZGVjKHZvbGF0aWxlIF9fbG9jYWwgbG9uZyAqcCk7Cit1bnNpZ25lZCBsb25nIF9fb3ZsZCBhdG9tX2RlYyh2b2xhdGlsZSBfX2xvY2FsIHVuc2lnbmVkIGxvbmcgKnApOworI2VuZGlmCisKKy8qKgorICogUmVhZCB0aGUgMzItYml0IHZhbHVlIChyZWZlcnJlZCB0byBhcyBvbGQpCisgKiBzdG9yZWQgYXQgbG9jYXRpb24gcG9pbnRlZCBieSBwLiBDb21wdXRlCisgKiAob2xkID09IGNtcCkgPyB2YWwgOiBvbGQgYW5kIHN0b3JlIHJlc3VsdCBhdAorICogbG9jYXRpb24gcG9pbnRlZCBieSBwLiBUaGUgZnVuY3Rpb24KKyAqIHJldHVybnMgb2xkLgorICovCitpbnQgX19vdmxkIGF0b21pY19jbXB4Y2hnKHZvbGF0aWxlIF9fZ2xvYmFsIGludCAqcCwgaW50IGNtcCwgaW50IHZhbCk7Cit1bnNpZ25lZCBpbnQgX19vdmxkIGF0b21pY19jbXB4Y2hnKHZvbGF0aWxlIF9fZ2xvYmFsIHVuc2lnbmVkIGludCAqcCwgdW5zaWduZWQgaW50IGNtcCwgdW5zaWduZWQgaW50IHZhbCk7CitpbnQgX19vdmxkIGF0b21pY19jbXB4Y2hnKHZvbGF0aWxlIF9fbG9jYWwgaW50ICpwLCBpbnQgY21wLCBpbnQgdmFsKTsKK3Vuc2lnbmVkIGludCBfX292bGQgYXRvbWljX2NtcHhjaGcodm9sYXRpbGUgX19sb2NhbCB1bnNpZ25lZCBpbnQgKnAsIHVuc2lnbmVkIGludCBjbXAsIHVuc2lnbmVkIGludCB2YWwpOworCisjaWYgZGVmaW5lZChjbF9raHJfZ2xvYmFsX2ludDMyX2Jhc2VfYXRvbWljcykKK2ludCBfX292bGQgYXRvbV9jbXB4Y2hnKHZvbGF0aWxlIF9fZ2xvYmFsIGludCAqcCwgaW50IGNtcCwgaW50IHZhbCk7Cit1bnNpZ25lZCBpbnQgX19vdmxkIGF0b21fY21weGNoZyh2b2xhdGlsZSBfX2dsb2JhbCB1bnNpZ25lZCBpbnQgKnAsIHVuc2lnbmVkIGludCBjbXAsIHVuc2lnbmVkIGludCB2YWwpOworI2VuZGlmCisjaWYgZGVmaW5lZChjbF9raHJfbG9jYWxfaW50MzJfYmFzZV9hdG9taWNzKQoraW50IF9fb3ZsZCBhdG9tX2NtcHhjaGcodm9sYXRpbGUgX19sb2NhbCBpbnQgKnAsIGludCBjbXAsIGludCB2YWwpOwordW5zaWduZWQgaW50IF9fb3ZsZCBhdG9tX2NtcHhjaGcodm9sYXRpbGUgX19sb2NhbCB1bnNpZ25lZCBpbnQgKnAsIHVuc2lnbmVkIGludCBjbXAsIHVuc2lnbmVkIGludCB2YWwpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKGNsX2tocl9pbnQ2NF9iYXNlX2F0b21pY3MpCitsb25nIF9fb3ZsZCBhdG9tX2NtcHhjaGcodm9sYXRpbGUgX19nbG9iYWwgbG9uZyAqcCwgbG9uZyBjbXAsIGxvbmcgdmFsKTsKK3Vuc2lnbmVkIGxvbmcgX19vdmxkIGF0b21fY21weGNoZyh2b2xhdGlsZSBfX2dsb2JhbCB1bnNpZ25lZCBsb25nICpwLCB1bnNpZ25lZCBsb25nIGNtcCwgdW5zaWduZWQgbG9uZyB2YWwpOworbG9uZyBfX292bGQgYXRvbV9jbXB4Y2hnKHZvbGF0aWxlIF9fbG9jYWwgbG9uZyAqcCwgbG9uZyBjbXAsIGxvbmcgdmFsKTsKK3Vuc2lnbmVkIGxvbmcgX19vdmxkIGF0b21fY21weGNoZyh2b2xhdGlsZSBfX2xvY2FsIHVuc2lnbmVkIGxvbmcgKnAsIHVuc2lnbmVkIGxvbmcgY21wLCB1bnNpZ25lZCBsb25nIHZhbCk7CisjZW5kaWYKKworLyoqCisgKiBSZWFkIHRoZSAzMi1iaXQgdmFsdWUgKHJlZmVycmVkIHRvIGFzIG9sZCkKKyAqIHN0b3JlZCBhdCBsb2NhdGlvbiBwb2ludGVkIGJ5IHAuIENvbXB1dGUKKyAqIG1pbihvbGQsIHZhbCkgYW5kIHN0b3JlIG1pbmltdW0gdmFsdWUgYXQKKyAqIGxvY2F0aW9uIHBvaW50ZWQgYnkgcC4gVGhlIGZ1bmN0aW9uCisgKiByZXR1cm5zIG9sZC4KKyAqLworaW50IF9fb3ZsZCBhdG9taWNfbWluKHZvbGF0aWxlIF9fZ2xvYmFsIGludCAqcCwgaW50IHZhbCk7Cit1bnNpZ25lZCBpbnQgX19vdmxkIGF0b21pY19taW4odm9sYXRpbGUgX19nbG9iYWwgdW5zaWduZWQgaW50ICpwLCB1bnNpZ25lZCBpbnQgdmFsKTsKK2ludCBfX292bGQgYXRvbWljX21pbih2b2xhdGlsZSBfX2xvY2FsIGludCAqcCwgaW50IHZhbCk7Cit1bnNpZ25lZCBpbnQgX19vdmxkIGF0b21pY19taW4odm9sYXRpbGUgX19sb2NhbCB1bnNpZ25lZCBpbnQgKnAsIHVuc2lnbmVkIGludCB2YWwpOworCisjaWYgZGVmaW5lZChjbF9raHJfZ2xvYmFsX2ludDMyX2V4dGVuZGVkX2F0b21pY3MpCitpbnQgX19vdmxkIGF0b21fbWluKHZvbGF0aWxlIF9fZ2xvYmFsIGludCAqcCwgaW50IHZhbCk7Cit1bnNpZ25lZCBpbnQgX19vdmxkIGF0b21fbWluKHZvbGF0aWxlIF9fZ2xvYmFsIHVuc2lnbmVkIGludCAqcCwgdW5zaWduZWQgaW50IHZhbCk7CisjZW5kaWYKKyNpZiBkZWZpbmVkKGNsX2tocl9sb2NhbF9pbnQzMl9leHRlbmRlZF9hdG9taWNzKQoraW50IF9fb3ZsZCBhdG9tX21pbih2b2xhdGlsZSBfX2xvY2FsIGludCAqcCwgaW50IHZhbCk7Cit1bnNpZ25lZCBpbnQgX19vdmxkIGF0b21fbWluKHZvbGF0aWxlIF9fbG9jYWwgdW5zaWduZWQgaW50ICpwLCB1bnNpZ25lZCBpbnQgdmFsKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChjbF9raHJfaW50NjRfZXh0ZW5kZWRfYXRvbWljcykKK2xvbmcgX19vdmxkIGF0b21fbWluKHZvbGF0aWxlIF9fZ2xvYmFsIGxvbmcgKnAsIGxvbmcgdmFsKTsKK3Vuc2lnbmVkIGxvbmcgX19vdmxkIGF0b21fbWluKHZvbGF0aWxlIF9fZ2xvYmFsIHVuc2lnbmVkIGxvbmcgKnAsIHVuc2lnbmVkIGxvbmcgdmFsKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoY2xfa2hyX2xvY2FsX2ludDMyX2V4dGVuZGVkX2F0b21pY3MpCitsb25nIF9fb3ZsZCBhdG9tX21pbih2b2xhdGlsZSBfX2xvY2FsIGxvbmcgKnAsIGxvbmcgdmFsKTsKK3Vuc2lnbmVkIGxvbmcgX19vdmxkIGF0b21fbWluKHZvbGF0aWxlIF9fbG9jYWwgdW5zaWduZWQgbG9uZyAqcCwgdW5zaWduZWQgbG9uZyB2YWwpOworI2VuZGlmCisKKy8qKgorICogUmVhZCB0aGUgMzItYml0IHZhbHVlIChyZWZlcnJlZCB0byBhcyBvbGQpCisgKiBzdG9yZWQgYXQgbG9jYXRpb24gcG9pbnRlZCBieSBwLiBDb21wdXRlCisgKiBtYXgob2xkLCB2YWwpIGFuZCBzdG9yZSBtYXhpbXVtIHZhbHVlIGF0CisgKiBsb2NhdGlvbiBwb2ludGVkIGJ5IHAuIFRoZSBmdW5jdGlvbgorICogcmV0dXJucyBvbGQuCisgKi8KK2ludCBfX292bGQgYXRvbWljX21heCh2b2xhdGlsZSBfX2dsb2JhbCBpbnQgKnAsIGludCB2YWwpOwordW5zaWduZWQgaW50IF9fb3ZsZCBhdG9taWNfbWF4KHZvbGF0aWxlIF9fZ2xvYmFsIHVuc2lnbmVkIGludCAqcCwgdW5zaWduZWQgaW50IHZhbCk7CitpbnQgX19vdmxkIGF0b21pY19tYXgodm9sYXRpbGUgX19sb2NhbCBpbnQgKnAsIGludCB2YWwpOwordW5zaWduZWQgaW50IF9fb3ZsZCBhdG9taWNfbWF4KHZvbGF0aWxlIF9fbG9jYWwgdW5zaWduZWQgaW50ICpwLCB1bnNpZ25lZCBpbnQgdmFsKTsKKworI2lmIGRlZmluZWQoY2xfa2hyX2dsb2JhbF9pbnQzMl9leHRlbmRlZF9hdG9taWNzKQoraW50IF9fb3ZsZCBhdG9tX21heCh2b2xhdGlsZSBfX2dsb2JhbCBpbnQgKnAsIGludCB2YWwpOwordW5zaWduZWQgaW50IF9fb3ZsZCBhdG9tX21heCh2b2xhdGlsZSBfX2dsb2JhbCB1bnNpZ25lZCBpbnQgKnAsIHVuc2lnbmVkIGludCB2YWwpOworI2VuZGlmCisjaWYgZGVmaW5lZChjbF9raHJfbG9jYWxfaW50MzJfZXh0ZW5kZWRfYXRvbWljcykKK2ludCBfX292bGQgYXRvbV9tYXgodm9sYXRpbGUgX19sb2NhbCBpbnQgKnAsIGludCB2YWwpOwordW5zaWduZWQgaW50IF9fb3ZsZCBhdG9tX21heCh2b2xhdGlsZSBfX2xvY2FsIHVuc2lnbmVkIGludCAqcCwgdW5zaWduZWQgaW50IHZhbCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoY2xfa2hyX2ludDY0X2V4dGVuZGVkX2F0b21pY3MpCitsb25nIF9fb3ZsZCBhdG9tX21heCh2b2xhdGlsZSBfX2dsb2JhbCBsb25nICpwLCBsb25nIHZhbCk7Cit1bnNpZ25lZCBsb25nIF9fb3ZsZCBhdG9tX21heCh2b2xhdGlsZSBfX2dsb2JhbCB1bnNpZ25lZCBsb25nICpwLCB1bnNpZ25lZCBsb25nIHZhbCk7Citsb25nIF9fb3ZsZCBhdG9tX21heCh2b2xhdGlsZSBfX2xvY2FsIGxvbmcgKnAsIGxvbmcgdmFsKTsKK3Vuc2lnbmVkIGxvbmcgX19vdmxkIGF0b21fbWF4KHZvbGF0aWxlIF9fbG9jYWwgdW5zaWduZWQgbG9uZyAqcCwgdW5zaWduZWQgbG9uZyB2YWwpOworI2VuZGlmCisKKy8qKgorICogUmVhZCB0aGUgMzItYml0IHZhbHVlIChyZWZlcnJlZCB0byBhcyBvbGQpCisgKiBzdG9yZWQgYXQgbG9jYXRpb24gcG9pbnRlZCBieSBwLiBDb21wdXRlCisgKiAob2xkICYgdmFsKSBhbmQgc3RvcmUgcmVzdWx0IGF0IGxvY2F0aW9uCisgKiBwb2ludGVkIGJ5IHAuIFRoZSBmdW5jdGlvbiByZXR1cm5zIG9sZC4KKyAqLworaW50IF9fb3ZsZCBhdG9taWNfYW5kKHZvbGF0aWxlIF9fZ2xvYmFsIGludCAqcCwgaW50IHZhbCk7Cit1bnNpZ25lZCBpbnQgX19vdmxkIGF0b21pY19hbmQodm9sYXRpbGUgX19nbG9iYWwgdW5zaWduZWQgaW50ICpwLCB1bnNpZ25lZCBpbnQgdmFsKTsKK2ludCBfX292bGQgYXRvbWljX2FuZCh2b2xhdGlsZSBfX2xvY2FsIGludCAqcCwgaW50IHZhbCk7Cit1bnNpZ25lZCBpbnQgX19vdmxkIGF0b21pY19hbmQodm9sYXRpbGUgX19sb2NhbCB1bnNpZ25lZCBpbnQgKnAsIHVuc2lnbmVkIGludCB2YWwpOworCisjaWYgZGVmaW5lZChjbF9raHJfZ2xvYmFsX2ludDMyX2V4dGVuZGVkX2F0b21pY3MpCitpbnQgX19vdmxkIGF0b21fYW5kKHZvbGF0aWxlIF9fZ2xvYmFsIGludCAqcCwgaW50IHZhbCk7Cit1bnNpZ25lZCBpbnQgX19vdmxkIGF0b21fYW5kKHZvbGF0aWxlIF9fZ2xvYmFsIHVuc2lnbmVkIGludCAqcCwgdW5zaWduZWQgaW50IHZhbCk7CisjZW5kaWYKKyNpZiBkZWZpbmVkKGNsX2tocl9sb2NhbF9pbnQzMl9leHRlbmRlZF9hdG9taWNzKQoraW50IF9fb3ZsZCBhdG9tX2FuZCh2b2xhdGlsZSBfX2xvY2FsIGludCAqcCwgaW50IHZhbCk7Cit1bnNpZ25lZCBpbnQgX19vdmxkIGF0b21fYW5kKHZvbGF0aWxlIF9fbG9jYWwgdW5zaWduZWQgaW50ICpwLCB1bnNpZ25lZCBpbnQgdmFsKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChjbF9raHJfaW50NjRfZXh0ZW5kZWRfYXRvbWljcykKK2xvbmcgX19vdmxkIGF0b21fYW5kKHZvbGF0aWxlIF9fZ2xvYmFsIGxvbmcgKnAsIGxvbmcgdmFsKTsKK3Vuc2lnbmVkIGxvbmcgX19vdmxkIGF0b21fYW5kKHZvbGF0aWxlIF9fZ2xvYmFsIHVuc2lnbmVkIGxvbmcgKnAsIHVuc2lnbmVkIGxvbmcgdmFsKTsKK2xvbmcgX19vdmxkIGF0b21fYW5kKHZvbGF0aWxlIF9fbG9jYWwgbG9uZyAqcCwgbG9uZyB2YWwpOwordW5zaWduZWQgbG9uZyBfX292bGQgYXRvbV9hbmQodm9sYXRpbGUgX19sb2NhbCB1bnNpZ25lZCBsb25nICpwLCB1bnNpZ25lZCBsb25nIHZhbCk7CisjZW5kaWYKKworLyoqCisgKiBSZWFkIHRoZSAzMi1iaXQgdmFsdWUgKHJlZmVycmVkIHRvIGFzIG9sZCkKKyAqIHN0b3JlZCBhdCBsb2NhdGlvbiBwb2ludGVkIGJ5IHAuIENvbXB1dGUKKyAqIChvbGQgfCB2YWwpIGFuZCBzdG9yZSByZXN1bHQgYXQgbG9jYXRpb24KKyAqIHBvaW50ZWQgYnkgcC4gVGhlIGZ1bmN0aW9uIHJldHVybnMgb2xkLgorICovCitpbnQgX19vdmxkIGF0b21pY19vcih2b2xhdGlsZSBfX2dsb2JhbCBpbnQgKnAsIGludCB2YWwpOwordW5zaWduZWQgaW50IF9fb3ZsZCBhdG9taWNfb3Iodm9sYXRpbGUgX19nbG9iYWwgdW5zaWduZWQgaW50ICpwLCB1bnNpZ25lZCBpbnQgdmFsKTsKK2ludCBfX292bGQgYXRvbWljX29yKHZvbGF0aWxlIF9fbG9jYWwgaW50ICpwLCBpbnQgdmFsKTsKK3Vuc2lnbmVkIGludCBfX292bGQgYXRvbWljX29yKHZvbGF0aWxlIF9fbG9jYWwgdW5zaWduZWQgaW50ICpwLCB1bnNpZ25lZCBpbnQgdmFsKTsKKworI2lmIGRlZmluZWQoY2xfa2hyX2dsb2JhbF9pbnQzMl9leHRlbmRlZF9hdG9taWNzKQoraW50IF9fb3ZsZCBhdG9tX29yKHZvbGF0aWxlIF9fZ2xvYmFsIGludCAqcCwgaW50IHZhbCk7Cit1bnNpZ25lZCBpbnQgX19vdmxkIGF0b21fb3Iodm9sYXRpbGUgX19nbG9iYWwgdW5zaWduZWQgaW50ICpwLCB1bnNpZ25lZCBpbnQgdmFsKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoY2xfa2hyX2xvY2FsX2ludDMyX2V4dGVuZGVkX2F0b21pY3MpCitpbnQgX19vdmxkIGF0b21fb3Iodm9sYXRpbGUgX19sb2NhbCBpbnQgKnAsIGludCB2YWwpOwordW5zaWduZWQgaW50IF9fb3ZsZCBhdG9tX29yKHZvbGF0aWxlIF9fbG9jYWwgdW5zaWduZWQgaW50ICpwLCB1bnNpZ25lZCBpbnQgdmFsKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChjbF9raHJfaW50NjRfZXh0ZW5kZWRfYXRvbWljcykKK2xvbmcgX19vdmxkIGF0b21fb3Iodm9sYXRpbGUgX19nbG9iYWwgbG9uZyAqcCwgbG9uZyB2YWwpOwordW5zaWduZWQgbG9uZyBfX292bGQgYXRvbV9vcih2b2xhdGlsZSBfX2dsb2JhbCB1bnNpZ25lZCBsb25nICpwLCB1bnNpZ25lZCBsb25nIHZhbCk7Citsb25nIF9fb3ZsZCBhdG9tX29yKHZvbGF0aWxlIF9fbG9jYWwgbG9uZyAqcCwgbG9uZyB2YWwpOwordW5zaWduZWQgbG9uZyBfX292bGQgYXRvbV9vcih2b2xhdGlsZSBfX2xvY2FsIHVuc2lnbmVkIGxvbmcgKnAsIHVuc2lnbmVkIGxvbmcgdmFsKTsKKyNlbmRpZgorCisvKioKKyAqIFJlYWQgdGhlIDMyLWJpdCB2YWx1ZSAocmVmZXJyZWQgdG8gYXMgb2xkKQorICogc3RvcmVkIGF0IGxvY2F0aW9uIHBvaW50ZWQgYnkgcC4gQ29tcHV0ZQorICogKG9sZCBeIHZhbCkgYW5kIHN0b3JlIHJlc3VsdCBhdCBsb2NhdGlvbgorICogcG9pbnRlZCBieSBwLiBUaGUgZnVuY3Rpb24gcmV0dXJucyBvbGQuCisgKi8KK2ludCBfX292bGQgYXRvbWljX3hvcih2b2xhdGlsZSBfX2dsb2JhbCBpbnQgKnAsIGludCB2YWwpOwordW5zaWduZWQgaW50IF9fb3ZsZCBhdG9taWNfeG9yKHZvbGF0aWxlIF9fZ2xvYmFsIHVuc2lnbmVkIGludCAqcCwgdW5zaWduZWQgaW50IHZhbCk7CitpbnQgX19vdmxkIGF0b21pY194b3Iodm9sYXRpbGUgX19sb2NhbCBpbnQgKnAsIGludCB2YWwpOwordW5zaWduZWQgaW50IF9fb3ZsZCBhdG9taWNfeG9yKHZvbGF0aWxlIF9fbG9jYWwgdW5zaWduZWQgaW50ICpwLCB1bnNpZ25lZCBpbnQgdmFsKTsKKworI2lmIGRlZmluZWQoY2xfa2hyX2dsb2JhbF9pbnQzMl9leHRlbmRlZF9hdG9taWNzKQoraW50IF9fb3ZsZCBhdG9tX3hvcih2b2xhdGlsZSBfX2dsb2JhbCBpbnQgKnAsIGludCB2YWwpOwordW5zaWduZWQgaW50IF9fb3ZsZCBhdG9tX3hvcih2b2xhdGlsZSBfX2dsb2JhbCB1bnNpZ25lZCBpbnQgKnAsIHVuc2lnbmVkIGludCB2YWwpOworI2VuZGlmCisjaWYgZGVmaW5lZChjbF9raHJfbG9jYWxfaW50MzJfZXh0ZW5kZWRfYXRvbWljcykKK2ludCBfX292bGQgYXRvbV94b3Iodm9sYXRpbGUgX19sb2NhbCBpbnQgKnAsIGludCB2YWwpOwordW5zaWduZWQgaW50IF9fb3ZsZCBhdG9tX3hvcih2b2xhdGlsZSBfX2xvY2FsIHVuc2lnbmVkIGludCAqcCwgdW5zaWduZWQgaW50IHZhbCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoY2xfa2hyX2ludDY0X2Jhc2VfYXRvbWljcykgJiYgZGVmaW5lZChjbF9raHJfaW50NjRfZXh0ZW5kZWRfYXRvbWljcykKKyNwcmFnbWEgT1BFTkNMIEVYVEVOU0lPTiBjbF9raHJfaW50NjRfYmFzZV9hdG9taWNzIDogZGlzYWJsZQorI3ByYWdtYSBPUEVOQ0wgRVhURU5TSU9OIGNsX2tocl9pbnQ2NF9leHRlbmRlZF9hdG9taWNzIDogZGlzYWJsZQorI2VuZGlmCisKKy8vIE9wZW5DTCB2Mi4wIHM2LjEzLjExIC0gQXRvbWljcyBGdW5jdGlvbnMKKworI2lmIF9fT1BFTkNMX0NfVkVSU0lPTl9fID49IENMX1ZFUlNJT05fMl8wCisjaWZuZGVmIEFUT01JQ19WQVJfSU5JVAorI2RlZmluZSBBVE9NSUNfVkFSX0lOSVQoeCkgKHgpCisjZW5kaWYgLy9BVE9NSUNfVkFSX0lOSVQKKyNkZWZpbmUgQVRPTUlDX0ZMQUdfSU5JVCAwCisKKy8vIGVudW0gdmFsdWVzIGFsaWduZWQgd2l0aCB3aGF0IGNsYW5nIHVzZXMgaW4gRW1pdEF0b21pY0V4cHIoKQordHlwZWRlZiBlbnVtIG1lbW9yeV9vcmRlcgoreworICBtZW1vcnlfb3JkZXJfcmVsYXhlZCwKKyAgbWVtb3J5X29yZGVyX2FjcXVpcmUsCisgIG1lbW9yeV9vcmRlcl9yZWxlYXNlLAorICBtZW1vcnlfb3JkZXJfYWNxX3JlbCwKKyAgbWVtb3J5X29yZGVyX3NlcV9jc3QKK30gbWVtb3J5X29yZGVyOworCisvLyBkb3VibGUgYXRvbWljcyBzdXBwb3J0IHJlcXVpcmVzIGV4dGVuc2lvbnMgY2xfa2hyX2ludDY0X2Jhc2VfYXRvbWljcyBhbmQgY2xfa2hyX2ludDY0X2V4dGVuZGVkX2F0b21pY3MKKyNpZiBkZWZpbmVkKGNsX2tocl9pbnQ2NF9iYXNlX2F0b21pY3MpICYmIGRlZmluZWQoY2xfa2hyX2ludDY0X2V4dGVuZGVkX2F0b21pY3MpCisjcHJhZ21hIE9QRU5DTCBFWFRFTlNJT04gY2xfa2hyX2ludDY0X2Jhc2VfYXRvbWljcyA6IGVuYWJsZQorI3ByYWdtYSBPUEVOQ0wgRVhURU5TSU9OIGNsX2tocl9pbnQ2NF9leHRlbmRlZF9hdG9taWNzIDogZW5hYmxlCisjZW5kaWYKKworLy8gYXRvbWljX2luaXQoKQordm9pZCBfX292bGQgYXRvbWljX2luaXQodm9sYXRpbGUgYXRvbWljX2ludCAqb2JqZWN0LCBpbnQgdmFsdWUpOwordm9pZCBfX292bGQgYXRvbWljX2luaXQodm9sYXRpbGUgYXRvbWljX3VpbnQgKm9iamVjdCwgdWludCB2YWx1ZSk7Cit2b2lkIF9fb3ZsZCBhdG9taWNfaW5pdCh2b2xhdGlsZSBhdG9taWNfZmxvYXQgKm9iamVjdCwgZmxvYXQgdmFsdWUpOworI2lmIGRlZmluZWQoY2xfa2hyX2ludDY0X2Jhc2VfYXRvbWljcykgJiYgZGVmaW5lZChjbF9raHJfaW50NjRfZXh0ZW5kZWRfYXRvbWljcykKK3ZvaWQgX19vdmxkIGF0b21pY19pbml0KHZvbGF0aWxlIGF0b21pY19sb25nICpvYmplY3QsIGxvbmcgdmFsdWUpOwordm9pZCBfX292bGQgYXRvbWljX2luaXQodm9sYXRpbGUgYXRvbWljX3Vsb25nICpvYmplY3QsIHVsb25nIHZhbHVlKTsKKyNpZmRlZiBjbF9raHJfZnA2NAordm9pZCBfX292bGQgYXRvbWljX2luaXQodm9sYXRpbGUgYXRvbWljX2RvdWJsZSAqb2JqZWN0LCBkb3VibGUgdmFsdWUpOworI2VuZGlmIC8vY2xfa2hyX2ZwNjQKKyNlbmRpZgorCisvLyBhdG9taWNfd29ya19pdGVtX2ZlbmNlKCkKK3ZvaWQgX19vdmxkIGF0b21pY193b3JrX2l0ZW1fZmVuY2UoY2xfbWVtX2ZlbmNlX2ZsYWdzIGZsYWdzLCBtZW1vcnlfb3JkZXIgb3JkZXIsIG1lbW9yeV9zY29wZSBzY29wZSk7CisKKy8vIGF0b21pY19mZXRjaCgpCisKK2ludCBfX292bGQgYXRvbWljX2ZldGNoX2FkZCh2b2xhdGlsZSBhdG9taWNfaW50ICpvYmplY3QsIGludCBvcGVyYW5kKTsKK2ludCBfX292bGQgYXRvbWljX2ZldGNoX2FkZF9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfaW50ICpvYmplY3QsIGludCBvcGVyYW5kLCBtZW1vcnlfb3JkZXIgb3JkZXIpOworaW50IF9fb3ZsZCBhdG9taWNfZmV0Y2hfYWRkX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY19pbnQgKm9iamVjdCwgaW50IG9wZXJhbmQsIG1lbW9yeV9vcmRlciBvcmRlciwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKK3VpbnQgX19vdmxkIGF0b21pY19mZXRjaF9hZGQodm9sYXRpbGUgYXRvbWljX3VpbnQgKm9iamVjdCwgdWludCBvcGVyYW5kKTsKK3VpbnQgX19vdmxkIGF0b21pY19mZXRjaF9hZGRfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX3VpbnQgKm9iamVjdCwgdWludCBvcGVyYW5kLCBtZW1vcnlfb3JkZXIgb3JkZXIpOwordWludCBfX292bGQgYXRvbWljX2ZldGNoX2FkZF9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfdWludCAqb2JqZWN0LCB1aW50IG9wZXJhbmQsIG1lbW9yeV9vcmRlciBvcmRlciwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKK2ludCBfX292bGQgYXRvbWljX2ZldGNoX3N1Yih2b2xhdGlsZSBhdG9taWNfaW50ICpvYmplY3QsIGludCBvcGVyYW5kKTsKK2ludCBfX292bGQgYXRvbWljX2ZldGNoX3N1Yl9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfaW50ICpvYmplY3QsIGludCBvcGVyYW5kLCBtZW1vcnlfb3JkZXIgb3JkZXIpOworaW50IF9fb3ZsZCBhdG9taWNfZmV0Y2hfc3ViX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY19pbnQgKm9iamVjdCwgaW50IG9wZXJhbmQsIG1lbW9yeV9vcmRlciBvcmRlciwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKK3VpbnQgX19vdmxkIGF0b21pY19mZXRjaF9zdWIodm9sYXRpbGUgYXRvbWljX3VpbnQgKm9iamVjdCwgdWludCBvcGVyYW5kKTsKK3VpbnQgX19vdmxkIGF0b21pY19mZXRjaF9zdWJfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX3VpbnQgKm9iamVjdCwgdWludCBvcGVyYW5kLCBtZW1vcnlfb3JkZXIgb3JkZXIpOwordWludCBfX292bGQgYXRvbWljX2ZldGNoX3N1Yl9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfdWludCAqb2JqZWN0LCB1aW50IG9wZXJhbmQsIG1lbW9yeV9vcmRlciBvcmRlciwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKK2ludCBfX292bGQgYXRvbWljX2ZldGNoX29yKHZvbGF0aWxlIGF0b21pY19pbnQgKm9iamVjdCwgaW50IG9wZXJhbmQpOworaW50IF9fb3ZsZCBhdG9taWNfZmV0Y2hfb3JfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX2ludCAqb2JqZWN0LCBpbnQgb3BlcmFuZCwgbWVtb3J5X29yZGVyIG9yZGVyKTsKK2ludCBfX292bGQgYXRvbWljX2ZldGNoX29yX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY19pbnQgKm9iamVjdCwgaW50IG9wZXJhbmQsIG1lbW9yeV9vcmRlciBvcmRlciwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKK3VpbnQgX19vdmxkIGF0b21pY19mZXRjaF9vcih2b2xhdGlsZSBhdG9taWNfdWludCAqb2JqZWN0LCB1aW50IG9wZXJhbmQpOwordWludCBfX292bGQgYXRvbWljX2ZldGNoX29yX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY191aW50ICpvYmplY3QsIHVpbnQgb3BlcmFuZCwgbWVtb3J5X29yZGVyIG9yZGVyKTsKK3VpbnQgX19vdmxkIGF0b21pY19mZXRjaF9vcl9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfdWludCAqb2JqZWN0LCB1aW50IG9wZXJhbmQsIG1lbW9yeV9vcmRlciBvcmRlciwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKK2ludCBfX292bGQgYXRvbWljX2ZldGNoX3hvcih2b2xhdGlsZSBhdG9taWNfaW50ICpvYmplY3QsIGludCBvcGVyYW5kKTsKK2ludCBfX292bGQgYXRvbWljX2ZldGNoX3hvcl9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfaW50ICpvYmplY3QsIGludCBvcGVyYW5kLCBtZW1vcnlfb3JkZXIgb3JkZXIpOworaW50IF9fb3ZsZCBhdG9taWNfZmV0Y2hfeG9yX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY19pbnQgKm9iamVjdCwgaW50IG9wZXJhbmQsIG1lbW9yeV9vcmRlciBvcmRlciwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKK3VpbnQgX19vdmxkIGF0b21pY19mZXRjaF94b3Iodm9sYXRpbGUgYXRvbWljX3VpbnQgKm9iamVjdCwgdWludCBvcGVyYW5kKTsKK3VpbnQgX19vdmxkIGF0b21pY19mZXRjaF94b3JfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX3VpbnQgKm9iamVjdCwgdWludCBvcGVyYW5kLCBtZW1vcnlfb3JkZXIgb3JkZXIpOwordWludCBfX292bGQgYXRvbWljX2ZldGNoX3hvcl9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfdWludCAqb2JqZWN0LCB1aW50IG9wZXJhbmQsIG1lbW9yeV9vcmRlciBvcmRlciwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKK2ludCBfX292bGQgYXRvbWljX2ZldGNoX2FuZCh2b2xhdGlsZSBhdG9taWNfaW50ICpvYmplY3QsIGludCBvcGVyYW5kKTsKK2ludCBfX292bGQgYXRvbWljX2ZldGNoX2FuZF9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfaW50ICpvYmplY3QsIGludCBvcGVyYW5kLCBtZW1vcnlfb3JkZXIgb3JkZXIpOworaW50IF9fb3ZsZCBhdG9taWNfZmV0Y2hfYW5kX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY19pbnQgKm9iamVjdCwgaW50IG9wZXJhbmQsIG1lbW9yeV9vcmRlciBvcmRlciwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKK3VpbnQgX19vdmxkIGF0b21pY19mZXRjaF9hbmQodm9sYXRpbGUgYXRvbWljX3VpbnQgKm9iamVjdCwgdWludCBvcGVyYW5kKTsKK3VpbnQgX19vdmxkIGF0b21pY19mZXRjaF9hbmRfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX3VpbnQgKm9iamVjdCwgdWludCBvcGVyYW5kLCBtZW1vcnlfb3JkZXIgb3JkZXIpOwordWludCBfX292bGQgYXRvbWljX2ZldGNoX2FuZF9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfdWludCAqb2JqZWN0LCB1aW50IG9wZXJhbmQsIG1lbW9yeV9vcmRlciBvcmRlciwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKK2ludCBfX292bGQgYXRvbWljX2ZldGNoX21pbih2b2xhdGlsZSBhdG9taWNfaW50ICpvYmplY3QsIGludCBvcGVyYW5kKTsKK2ludCBfX292bGQgYXRvbWljX2ZldGNoX21pbl9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfaW50ICpvYmplY3QsIGludCBvcGVyYW5kLCBtZW1vcnlfb3JkZXIgb3JkZXIpOworaW50IF9fb3ZsZCBhdG9taWNfZmV0Y2hfbWluX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY19pbnQgKm9iamVjdCwgaW50IG9wZXJhbmQsIG1lbW9yeV9vcmRlciBvcmRlciwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKK3VpbnQgX19vdmxkIGF0b21pY19mZXRjaF9taW4odm9sYXRpbGUgYXRvbWljX3VpbnQgKm9iamVjdCwgdWludCBvcGVyYW5kKTsKK3VpbnQgX19vdmxkIGF0b21pY19mZXRjaF9taW5fZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX3VpbnQgKm9iamVjdCwgdWludCBvcGVyYW5kLCBtZW1vcnlfb3JkZXIgb3JkZXIpOwordWludCBfX292bGQgYXRvbWljX2ZldGNoX21pbl9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfdWludCAqb2JqZWN0LCB1aW50IG9wZXJhbmQsIG1lbW9yeV9vcmRlciBvcmRlciwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKK3VpbnQgX19vdmxkIGF0b21pY19mZXRjaF9taW4odm9sYXRpbGUgYXRvbWljX3VpbnQgKm9iamVjdCwgaW50IG9wZXJhbmQpOwordWludCBfX292bGQgYXRvbWljX2ZldGNoX21pbl9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfdWludCAqb2JqZWN0LCBpbnQgb3BlcmFuZCwgbWVtb3J5X29yZGVyIG9yZGVyKTsKK3VpbnQgX19vdmxkIGF0b21pY19mZXRjaF9taW5fZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX3VpbnQgKm9iamVjdCwgaW50IG9wZXJhbmQsIG1lbW9yeV9vcmRlciBvcmRlciwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKK2ludCBfX292bGQgYXRvbWljX2ZldGNoX21heCh2b2xhdGlsZSBhdG9taWNfaW50ICpvYmplY3QsIGludCBvcGVyYW5kKTsKK2ludCBfX292bGQgYXRvbWljX2ZldGNoX21heF9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfaW50ICpvYmplY3QsIGludCBvcGVyYW5kLCBtZW1vcnlfb3JkZXIgb3JkZXIpOworaW50IF9fb3ZsZCBhdG9taWNfZmV0Y2hfbWF4X2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY19pbnQgKm9iamVjdCwgaW50IG9wZXJhbmQsIG1lbW9yeV9vcmRlciBvcmRlciwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKK3VpbnQgX19vdmxkIGF0b21pY19mZXRjaF9tYXgodm9sYXRpbGUgYXRvbWljX3VpbnQgKm9iamVjdCwgdWludCBvcGVyYW5kKTsKK3VpbnQgX19vdmxkIGF0b21pY19mZXRjaF9tYXhfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX3VpbnQgKm9iamVjdCwgdWludCBvcGVyYW5kLCBtZW1vcnlfb3JkZXIgb3JkZXIpOwordWludCBfX292bGQgYXRvbWljX2ZldGNoX21heF9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfdWludCAqb2JqZWN0LCB1aW50IG9wZXJhbmQsIG1lbW9yeV9vcmRlciBvcmRlciwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKK3VpbnQgX19vdmxkIGF0b21pY19mZXRjaF9tYXgodm9sYXRpbGUgYXRvbWljX3VpbnQgKm9iamVjdCwgaW50IG9wZXJhbmQpOwordWludCBfX292bGQgYXRvbWljX2ZldGNoX21heF9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfdWludCAqb2JqZWN0LCBpbnQgb3BlcmFuZCwgbWVtb3J5X29yZGVyIG9yZGVyKTsKK3VpbnQgX19vdmxkIGF0b21pY19mZXRjaF9tYXhfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX3VpbnQgKm9iamVjdCwgaW50IG9wZXJhbmQsIG1lbW9yeV9vcmRlciBvcmRlciwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKKworI2lmIGRlZmluZWQoY2xfa2hyX2ludDY0X2Jhc2VfYXRvbWljcykgJiYgZGVmaW5lZChjbF9raHJfaW50NjRfZXh0ZW5kZWRfYXRvbWljcykKK2xvbmcgX19vdmxkIGF0b21pY19mZXRjaF9hZGQodm9sYXRpbGUgYXRvbWljX2xvbmcgKm9iamVjdCwgbG9uZyBvcGVyYW5kKTsKK2xvbmcgX19vdmxkIGF0b21pY19mZXRjaF9hZGRfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX2xvbmcgKm9iamVjdCwgbG9uZyBvcGVyYW5kLCBtZW1vcnlfb3JkZXIgb3JkZXIpOworbG9uZyBfX292bGQgYXRvbWljX2ZldGNoX2FkZF9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfbG9uZyAqb2JqZWN0LCBsb25nIG9wZXJhbmQsIG1lbW9yeV9vcmRlciBvcmRlciwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKK3Vsb25nIF9fb3ZsZCBhdG9taWNfZmV0Y2hfYWRkKHZvbGF0aWxlIGF0b21pY191bG9uZyAqb2JqZWN0LCB1bG9uZyBvcGVyYW5kKTsKK3Vsb25nIF9fb3ZsZCBhdG9taWNfZmV0Y2hfYWRkX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY191bG9uZyAqb2JqZWN0LCB1bG9uZyBvcGVyYW5kLCBtZW1vcnlfb3JkZXIgb3JkZXIpOwordWxvbmcgX19vdmxkIGF0b21pY19mZXRjaF9hZGRfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX3Vsb25nICpvYmplY3QsIHVsb25nIG9wZXJhbmQsIG1lbW9yeV9vcmRlciBvcmRlciwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKK2xvbmcgX19vdmxkIGF0b21pY19mZXRjaF9zdWIodm9sYXRpbGUgYXRvbWljX2xvbmcgKm9iamVjdCwgbG9uZyBvcGVyYW5kKTsKK2xvbmcgX19vdmxkIGF0b21pY19mZXRjaF9zdWJfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX2xvbmcgKm9iamVjdCwgbG9uZyBvcGVyYW5kLCBtZW1vcnlfb3JkZXIgb3JkZXIpOworbG9uZyBfX292bGQgYXRvbWljX2ZldGNoX3N1Yl9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfbG9uZyAqb2JqZWN0LCBsb25nIG9wZXJhbmQsIG1lbW9yeV9vcmRlciBvcmRlciwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKK3Vsb25nIF9fb3ZsZCBhdG9taWNfZmV0Y2hfc3ViKHZvbGF0aWxlIGF0b21pY191bG9uZyAqb2JqZWN0LCB1bG9uZyBvcGVyYW5kKTsKK3Vsb25nIF9fb3ZsZCBhdG9taWNfZmV0Y2hfc3ViX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY191bG9uZyAqb2JqZWN0LCB1bG9uZyBvcGVyYW5kLCBtZW1vcnlfb3JkZXIgb3JkZXIpOwordWxvbmcgX19vdmxkIGF0b21pY19mZXRjaF9zdWJfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX3Vsb25nICpvYmplY3QsIHVsb25nIG9wZXJhbmQsIG1lbW9yeV9vcmRlciBvcmRlciwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKK2xvbmcgX19vdmxkIGF0b21pY19mZXRjaF9vcih2b2xhdGlsZSBhdG9taWNfbG9uZyAqb2JqZWN0LCBsb25nIG9wZXJhbmQpOworbG9uZyBfX292bGQgYXRvbWljX2ZldGNoX29yX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY19sb25nICpvYmplY3QsIGxvbmcgb3BlcmFuZCwgbWVtb3J5X29yZGVyIG9yZGVyKTsKK2xvbmcgX19vdmxkIGF0b21pY19mZXRjaF9vcl9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfbG9uZyAqb2JqZWN0LCBsb25nIG9wZXJhbmQsIG1lbW9yeV9vcmRlciBvcmRlciwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKK3Vsb25nIF9fb3ZsZCBhdG9taWNfZmV0Y2hfb3Iodm9sYXRpbGUgYXRvbWljX3Vsb25nICpvYmplY3QsIHVsb25nIG9wZXJhbmQpOwordWxvbmcgX19vdmxkIGF0b21pY19mZXRjaF9vcl9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfdWxvbmcgKm9iamVjdCwgdWxvbmcgb3BlcmFuZCwgbWVtb3J5X29yZGVyIG9yZGVyKTsKK3Vsb25nIF9fb3ZsZCBhdG9taWNfZmV0Y2hfb3JfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX3Vsb25nICpvYmplY3QsIHVsb25nIG9wZXJhbmQsIG1lbW9yeV9vcmRlciBvcmRlciwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKK2xvbmcgX19vdmxkIGF0b21pY19mZXRjaF94b3Iodm9sYXRpbGUgYXRvbWljX2xvbmcgKm9iamVjdCwgbG9uZyBvcGVyYW5kKTsKK2xvbmcgX19vdmxkIGF0b21pY19mZXRjaF94b3JfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX2xvbmcgKm9iamVjdCwgbG9uZyBvcGVyYW5kLCBtZW1vcnlfb3JkZXIgb3JkZXIpOworbG9uZyBfX292bGQgYXRvbWljX2ZldGNoX3hvcl9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfbG9uZyAqb2JqZWN0LCBsb25nIG9wZXJhbmQsIG1lbW9yeV9vcmRlciBvcmRlciwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKK3Vsb25nIF9fb3ZsZCBhdG9taWNfZmV0Y2hfeG9yKHZvbGF0aWxlIGF0b21pY191bG9uZyAqb2JqZWN0LCB1bG9uZyBvcGVyYW5kKTsKK3Vsb25nIF9fb3ZsZCBhdG9taWNfZmV0Y2hfeG9yX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY191bG9uZyAqb2JqZWN0LCB1bG9uZyBvcGVyYW5kLCBtZW1vcnlfb3JkZXIgb3JkZXIpOwordWxvbmcgX19vdmxkIGF0b21pY19mZXRjaF94b3JfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX3Vsb25nICpvYmplY3QsIHVsb25nIG9wZXJhbmQsIG1lbW9yeV9vcmRlciBvcmRlciwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKK2xvbmcgX19vdmxkIGF0b21pY19mZXRjaF9hbmQodm9sYXRpbGUgYXRvbWljX2xvbmcgKm9iamVjdCwgbG9uZyBvcGVyYW5kKTsKK2xvbmcgX19vdmxkIGF0b21pY19mZXRjaF9hbmRfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX2xvbmcgKm9iamVjdCwgbG9uZyBvcGVyYW5kLCBtZW1vcnlfb3JkZXIgb3JkZXIpOworbG9uZyBfX292bGQgYXRvbWljX2ZldGNoX2FuZF9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfbG9uZyAqb2JqZWN0LCBsb25nIG9wZXJhbmQsIG1lbW9yeV9vcmRlciBvcmRlciwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKK3Vsb25nIF9fb3ZsZCBhdG9taWNfZmV0Y2hfYW5kKHZvbGF0aWxlIGF0b21pY191bG9uZyAqb2JqZWN0LCB1bG9uZyBvcGVyYW5kKTsKK3Vsb25nIF9fb3ZsZCBhdG9taWNfZmV0Y2hfYW5kX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY191bG9uZyAqb2JqZWN0LCB1bG9uZyBvcGVyYW5kLCBtZW1vcnlfb3JkZXIgb3JkZXIpOwordWxvbmcgX19vdmxkIGF0b21pY19mZXRjaF9hbmRfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX3Vsb25nICpvYmplY3QsIHVsb25nIG9wZXJhbmQsIG1lbW9yeV9vcmRlciBvcmRlciwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKK2xvbmcgX19vdmxkIGF0b21pY19mZXRjaF9taW4odm9sYXRpbGUgYXRvbWljX2xvbmcgKm9iamVjdCwgbG9uZyBvcGVyYW5kKTsKK2xvbmcgX19vdmxkIGF0b21pY19mZXRjaF9taW5fZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX2xvbmcgKm9iamVjdCwgbG9uZyBvcGVyYW5kLCBtZW1vcnlfb3JkZXIgb3JkZXIpOworbG9uZyBfX292bGQgYXRvbWljX2ZldGNoX21pbl9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfbG9uZyAqb2JqZWN0LCBsb25nIG9wZXJhbmQsIG1lbW9yeV9vcmRlciBvcmRlciwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKK3Vsb25nIF9fb3ZsZCBhdG9taWNfZmV0Y2hfbWluKHZvbGF0aWxlIGF0b21pY191bG9uZyAqb2JqZWN0LCB1bG9uZyBvcGVyYW5kKTsKK3Vsb25nIF9fb3ZsZCBhdG9taWNfZmV0Y2hfbWluX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY191bG9uZyAqb2JqZWN0LCB1bG9uZyBvcGVyYW5kLCBtZW1vcnlfb3JkZXIgb3JkZXIpOwordWxvbmcgX19vdmxkIGF0b21pY19mZXRjaF9taW5fZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX3Vsb25nICpvYmplY3QsIHVsb25nIG9wZXJhbmQsIG1lbW9yeV9vcmRlciBvcmRlciwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKK3Vsb25nIF9fb3ZsZCBhdG9taWNfZmV0Y2hfbWluKHZvbGF0aWxlIGF0b21pY191bG9uZyAqb2JqZWN0LCBsb25nIG9wZXJhbmQpOwordWxvbmcgX19vdmxkIGF0b21pY19mZXRjaF9taW5fZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX3Vsb25nICpvYmplY3QsIGxvbmcgb3BlcmFuZCwgbWVtb3J5X29yZGVyIG9yZGVyKTsKK3Vsb25nIF9fb3ZsZCBhdG9taWNfZmV0Y2hfbWluX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY191bG9uZyAqb2JqZWN0LCBsb25nIG9wZXJhbmQsIG1lbW9yeV9vcmRlciBvcmRlciwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKK2xvbmcgX19vdmxkIGF0b21pY19mZXRjaF9tYXgodm9sYXRpbGUgYXRvbWljX2xvbmcgKm9iamVjdCwgbG9uZyBvcGVyYW5kKTsKK2xvbmcgX19vdmxkIGF0b21pY19mZXRjaF9tYXhfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX2xvbmcgKm9iamVjdCwgbG9uZyBvcGVyYW5kLCBtZW1vcnlfb3JkZXIgb3JkZXIpOworbG9uZyBfX292bGQgYXRvbWljX2ZldGNoX21heF9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfbG9uZyAqb2JqZWN0LCBsb25nIG9wZXJhbmQsIG1lbW9yeV9vcmRlciBvcmRlciwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKK3Vsb25nIF9fb3ZsZCBhdG9taWNfZmV0Y2hfbWF4KHZvbGF0aWxlIGF0b21pY191bG9uZyAqb2JqZWN0LCB1bG9uZyBvcGVyYW5kKTsKK3Vsb25nIF9fb3ZsZCBhdG9taWNfZmV0Y2hfbWF4X2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY191bG9uZyAqb2JqZWN0LCB1bG9uZyBvcGVyYW5kLCBtZW1vcnlfb3JkZXIgb3JkZXIpOwordWxvbmcgX19vdmxkIGF0b21pY19mZXRjaF9tYXhfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX3Vsb25nICpvYmplY3QsIHVsb25nIG9wZXJhbmQsIG1lbW9yeV9vcmRlciBvcmRlciwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKK3Vsb25nIF9fb3ZsZCBhdG9taWNfZmV0Y2hfbWF4KHZvbGF0aWxlIGF0b21pY191bG9uZyAqb2JqZWN0LCBsb25nIG9wZXJhbmQpOwordWxvbmcgX19vdmxkIGF0b21pY19mZXRjaF9tYXhfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX3Vsb25nICpvYmplY3QsIGxvbmcgb3BlcmFuZCwgbWVtb3J5X29yZGVyIG9yZGVyKTsKK3Vsb25nIF9fb3ZsZCBhdG9taWNfZmV0Y2hfbWF4X2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY191bG9uZyAqb2JqZWN0LCBsb25nIG9wZXJhbmQsIG1lbW9yeV9vcmRlciBvcmRlciwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKKyNlbmRpZiAvL2RlZmluZWQoY2xfa2hyX2ludDY0X2Jhc2VfYXRvbWljcykgJiYgZGVmaW5lZChjbF9raHJfaW50NjRfZXh0ZW5kZWRfYXRvbWljcykKKworLy8gT3BlbkNMIHYyLjAgczYuMTMuMTEuNy41OgorLy8gYWRkL3N1YjogYXRvbWljIHR5cGUgYXJndW1lbnQgY2FuIGJlIHVpbnRwdHJfdC9pbnRwdHJfdCwgdmFsdWUgdHlwZSBhcmd1bWVudCBjYW4gYmUgcHRyZGlmZl90LgorLy8gb3IveG9yL2FuZC9taW4vbWF4OiBhdG9taWMgdHlwZSBhcmd1bWVudCBjYW4gYmUgaW50cHRyX3QvdWludHB0cl90LCB2YWx1ZSB0eXBlIGFyZ3VtZW50IGNhbiBiZSBpbnRwdHJfdC91aW50cHRyX3QuCisKKyNpZiBkZWZpbmVkKGNsX2tocl9pbnQ2NF9iYXNlX2F0b21pY3MpICYmIGRlZmluZWQoY2xfa2hyX2ludDY0X2V4dGVuZGVkX2F0b21pY3MpIAordWludHB0cl90IF9fb3ZsZCBhdG9taWNfZmV0Y2hfYWRkKHZvbGF0aWxlIGF0b21pY191aW50cHRyX3QgKm9iamVjdCwgcHRyZGlmZl90IG9wZXJhbmQpOwordWludHB0cl90IF9fb3ZsZCBhdG9taWNfZmV0Y2hfYWRkX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY191aW50cHRyX3QgKm9iamVjdCwgcHRyZGlmZl90IG9wZXJhbmQsIG1lbW9yeV9vcmRlciBvcmRlcik7Cit1aW50cHRyX3QgX19vdmxkIGF0b21pY19mZXRjaF9hZGRfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX3VpbnRwdHJfdCAqb2JqZWN0LCBwdHJkaWZmX3Qgb3BlcmFuZCwgbWVtb3J5X29yZGVyIG9yZGVyLCBtZW1vcnlfc2NvcGUgc2NvcGUpOwordWludHB0cl90IF9fb3ZsZCBhdG9taWNfZmV0Y2hfc3ViKHZvbGF0aWxlIGF0b21pY191aW50cHRyX3QgKm9iamVjdCwgcHRyZGlmZl90IG9wZXJhbmQpOwordWludHB0cl90IF9fb3ZsZCBhdG9taWNfZmV0Y2hfc3ViX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY191aW50cHRyX3QgKm9iamVjdCwgcHRyZGlmZl90IG9wZXJhbmQsIG1lbW9yeV9vcmRlciBvcmRlcik7Cit1aW50cHRyX3QgX19vdmxkIGF0b21pY19mZXRjaF9zdWJfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX3VpbnRwdHJfdCAqb2JqZWN0LCBwdHJkaWZmX3Qgb3BlcmFuZCwgbWVtb3J5X29yZGVyIG9yZGVyLCBtZW1vcnlfc2NvcGUgc2NvcGUpOworCit1aW50cHRyX3QgX19vdmxkIGF0b21pY19mZXRjaF9vcih2b2xhdGlsZSBhdG9taWNfdWludHB0cl90ICpvYmplY3QsIGludHB0cl90IG9wZXJhbmQpOwordWludHB0cl90IF9fb3ZsZCBhdG9taWNfZmV0Y2hfb3JfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX3VpbnRwdHJfdCAqb2JqZWN0LCBpbnRwdHJfdCBvcGVyYW5kLCBtZW1vcnlfb3JkZXIgb3JkZXIpOwordWludHB0cl90IF9fb3ZsZCBhdG9taWNfZmV0Y2hfb3JfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX3VpbnRwdHJfdCAqb2JqZWN0LCBpbnRwdHJfdCBvcGVyYW5kLCBtZW1vcnlfb3JkZXIgb3JkZXIsIG1lbW9yeV9zY29wZSBzY29wZSk7Cit1aW50cHRyX3QgX19vdmxkIGF0b21pY19mZXRjaF94b3Iodm9sYXRpbGUgYXRvbWljX3VpbnRwdHJfdCAqb2JqZWN0LCBpbnRwdHJfdCBvcGVyYW5kKTsKK3VpbnRwdHJfdCBfX292bGQgYXRvbWljX2ZldGNoX3hvcl9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfdWludHB0cl90ICpvYmplY3QsIGludHB0cl90IG9wZXJhbmQsIG1lbW9yeV9vcmRlciBvcmRlcik7Cit1aW50cHRyX3QgX19vdmxkIGF0b21pY19mZXRjaF94b3JfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX3VpbnRwdHJfdCAqb2JqZWN0LCBpbnRwdHJfdCBvcGVyYW5kLCBtZW1vcnlfb3JkZXIgb3JkZXIsIG1lbW9yeV9zY29wZSBzY29wZSk7Cit1aW50cHRyX3QgX19vdmxkIGF0b21pY19mZXRjaF9hbmQodm9sYXRpbGUgYXRvbWljX3VpbnRwdHJfdCAqb2JqZWN0LCBpbnRwdHJfdCBvcGVyYW5kKTsKK3VpbnRwdHJfdCBfX292bGQgYXRvbWljX2ZldGNoX2FuZF9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfdWludHB0cl90ICpvYmplY3QsIGludHB0cl90IG9wZXJhbmQsIG1lbW9yeV9vcmRlciBvcmRlcik7Cit1aW50cHRyX3QgX19vdmxkIGF0b21pY19mZXRjaF9hbmRfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX3VpbnRwdHJfdCAqb2JqZWN0LCBpbnRwdHJfdCBvcGVyYW5kLCBtZW1vcnlfb3JkZXIgb3JkZXIsIG1lbW9yeV9zY29wZSBzY29wZSk7Cit1aW50cHRyX3QgX19vdmxkIGF0b21pY19mZXRjaF9taW4odm9sYXRpbGUgYXRvbWljX3VpbnRwdHJfdCAqb2JqZWN0LCBpbnRwdHJfdCBvcGVybWF4KTsKK3VpbnRwdHJfdCBfX292bGQgYXRvbWljX2ZldGNoX21pbl9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfdWludHB0cl90ICpvYmplY3QsIGludHB0cl90IG9wZXJtYXgsIG1lbW9yeV9vcmRlciBtaW5kZXIpOwordWludHB0cl90IF9fb3ZsZCBhdG9taWNfZmV0Y2hfbWluX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY191aW50cHRyX3QgKm9iamVjdCwgaW50cHRyX3Qgb3Blcm1heCwgbWVtb3J5X29yZGVyIG1pbmRlciwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKK3VpbnRwdHJfdCBfX292bGQgYXRvbWljX2ZldGNoX21heCh2b2xhdGlsZSBhdG9taWNfdWludHB0cl90ICpvYmplY3QsIGludHB0cl90IG9wZXJtYXgpOwordWludHB0cl90IF9fb3ZsZCBhdG9taWNfZmV0Y2hfbWF4X2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY191aW50cHRyX3QgKm9iamVjdCwgaW50cHRyX3Qgb3Blcm1heCwgbWVtb3J5X29yZGVyIG1pbmRlcik7Cit1aW50cHRyX3QgX19vdmxkIGF0b21pY19mZXRjaF9tYXhfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX3VpbnRwdHJfdCAqb2JqZWN0LCBpbnRwdHJfdCBvcGVybWF4LCBtZW1vcnlfb3JkZXIgbWluZGVyLCBtZW1vcnlfc2NvcGUgc2NvcGUpOworCitpbnRwdHJfdCBfX292bGQgYXRvbWljX2ZldGNoX29yKHZvbGF0aWxlIGF0b21pY19pbnRwdHJfdCAqb2JqZWN0LCB1aW50cHRyX3Qgb3BlcmFuZCk7CitpbnRwdHJfdCBfX292bGQgYXRvbWljX2ZldGNoX29yX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY19pbnRwdHJfdCAqb2JqZWN0LCB1aW50cHRyX3Qgb3BlcmFuZCwgbWVtb3J5X29yZGVyIG9yZGVyKTsKK2ludHB0cl90IF9fb3ZsZCBhdG9taWNfZmV0Y2hfb3JfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX2ludHB0cl90ICpvYmplY3QsIHVpbnRwdHJfdCBvcGVyYW5kLCBtZW1vcnlfb3JkZXIgb3JkZXIsIG1lbW9yeV9zY29wZSBzY29wZSk7CitpbnRwdHJfdCBfX292bGQgYXRvbWljX2ZldGNoX3hvcih2b2xhdGlsZSBhdG9taWNfaW50cHRyX3QgKm9iamVjdCwgdWludHB0cl90IG9wZXJhbmQpOworaW50cHRyX3QgX19vdmxkIGF0b21pY19mZXRjaF94b3JfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX2ludHB0cl90ICpvYmplY3QsIHVpbnRwdHJfdCBvcGVyYW5kLCBtZW1vcnlfb3JkZXIgb3JkZXIpOworaW50cHRyX3QgX19vdmxkIGF0b21pY19mZXRjaF94b3JfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX2ludHB0cl90ICpvYmplY3QsIHVpbnRwdHJfdCBvcGVyYW5kLCBtZW1vcnlfb3JkZXIgb3JkZXIsIG1lbW9yeV9zY29wZSBzY29wZSk7CitpbnRwdHJfdCBfX292bGQgYXRvbWljX2ZldGNoX2FuZCh2b2xhdGlsZSBhdG9taWNfaW50cHRyX3QgKm9iamVjdCwgdWludHB0cl90IG9wZXJhbmQpOworaW50cHRyX3QgX19vdmxkIGF0b21pY19mZXRjaF9hbmRfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX2ludHB0cl90ICpvYmplY3QsIHVpbnRwdHJfdCBvcGVyYW5kLCBtZW1vcnlfb3JkZXIgb3JkZXIpOworaW50cHRyX3QgX19vdmxkIGF0b21pY19mZXRjaF9hbmRfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX2ludHB0cl90ICpvYmplY3QsIHVpbnRwdHJfdCBvcGVyYW5kLCBtZW1vcnlfb3JkZXIgb3JkZXIsIG1lbW9yeV9zY29wZSBzY29wZSk7CitpbnRwdHJfdCBfX292bGQgYXRvbWljX2ZldGNoX21pbih2b2xhdGlsZSBhdG9taWNfaW50cHRyX3QgKm9iamVjdCwgdWludHB0cl90IG9wZXJtYXgpOworaW50cHRyX3QgX19vdmxkIGF0b21pY19mZXRjaF9taW5fZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX2ludHB0cl90ICpvYmplY3QsIHVpbnRwdHJfdCBvcGVybWF4LCBtZW1vcnlfb3JkZXIgbWluZGVyKTsKK2ludHB0cl90IF9fb3ZsZCBhdG9taWNfZmV0Y2hfbWluX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY19pbnRwdHJfdCAqb2JqZWN0LCB1aW50cHRyX3Qgb3Blcm1heCwgbWVtb3J5X29yZGVyIG1pbmRlciwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKK2ludHB0cl90IF9fb3ZsZCBhdG9taWNfZmV0Y2hfbWF4KHZvbGF0aWxlIGF0b21pY19pbnRwdHJfdCAqb2JqZWN0LCB1aW50cHRyX3Qgb3Blcm1heCk7CitpbnRwdHJfdCBfX292bGQgYXRvbWljX2ZldGNoX21heF9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfaW50cHRyX3QgKm9iamVjdCwgdWludHB0cl90IG9wZXJtYXgsIG1lbW9yeV9vcmRlciBtaW5kZXIpOworaW50cHRyX3QgX19vdmxkIGF0b21pY19mZXRjaF9tYXhfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX2ludHB0cl90ICpvYmplY3QsIHVpbnRwdHJfdCBvcGVybWF4LCBtZW1vcnlfb3JkZXIgbWluZGVyLCBtZW1vcnlfc2NvcGUgc2NvcGUpOworI2VuZGlmCisKKy8vIGF0b21pY19zdG9yZSgpCisKK3ZvaWQgX19vdmxkIGF0b21pY19zdG9yZSh2b2xhdGlsZSBhdG9taWNfaW50ICpvYmplY3QsIGludCBkZXNpcmVkKTsKK3ZvaWQgX19vdmxkIGF0b21pY19zdG9yZV9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfaW50ICpvYmplY3QsIGludCBkZXNpcmVkLCBtZW1vcnlfb3JkZXIgb3JkZXIpOwordm9pZCBfX292bGQgYXRvbWljX3N0b3JlX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY19pbnQgKm9iamVjdCwgaW50IGRlc2lyZWQsIG1lbW9yeV9vcmRlciBvcmRlciwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKK3ZvaWQgX19vdmxkIGF0b21pY19zdG9yZSh2b2xhdGlsZSBhdG9taWNfdWludCAqb2JqZWN0LCB1aW50IGRlc2lyZWQpOwordm9pZCBfX292bGQgYXRvbWljX3N0b3JlX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY191aW50ICpvYmplY3QsIHVpbnQgZGVzaXJlZCwgbWVtb3J5X29yZGVyIG9yZGVyKTsKK3ZvaWQgX19vdmxkIGF0b21pY19zdG9yZV9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfdWludCAqb2JqZWN0LCB1aW50IGRlc2lyZWQsIG1lbW9yeV9vcmRlciBvcmRlciwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKK3ZvaWQgX19vdmxkIGF0b21pY19zdG9yZSh2b2xhdGlsZSBhdG9taWNfZmxvYXQgKm9iamVjdCwgZmxvYXQgZGVzaXJlZCk7Cit2b2lkIF9fb3ZsZCBhdG9taWNfc3RvcmVfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX2Zsb2F0ICpvYmplY3QsIGZsb2F0IGRlc2lyZWQsIG1lbW9yeV9vcmRlciBvcmRlcik7Cit2b2lkIF9fb3ZsZCBhdG9taWNfc3RvcmVfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX2Zsb2F0ICpvYmplY3QsIGZsb2F0IGRlc2lyZWQsIG1lbW9yeV9vcmRlciBvcmRlciwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKKyNpZiBkZWZpbmVkKGNsX2tocl9pbnQ2NF9iYXNlX2F0b21pY3MpICYmIGRlZmluZWQoY2xfa2hyX2ludDY0X2V4dGVuZGVkX2F0b21pY3MpCisjaWZkZWYgY2xfa2hyX2ZwNjQKK3ZvaWQgX19vdmxkIGF0b21pY19zdG9yZSh2b2xhdGlsZSBhdG9taWNfZG91YmxlICpvYmplY3QsIGRvdWJsZSBkZXNpcmVkKTsKK3ZvaWQgX19vdmxkIGF0b21pY19zdG9yZV9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfZG91YmxlICpvYmplY3QsIGRvdWJsZSBkZXNpcmVkLCBtZW1vcnlfb3JkZXIgb3JkZXIpOwordm9pZCBfX292bGQgYXRvbWljX3N0b3JlX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY19kb3VibGUgKm9iamVjdCwgZG91YmxlIGRlc2lyZWQsIG1lbW9yeV9vcmRlciBvcmRlciwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0Cit2b2lkIF9fb3ZsZCBhdG9taWNfc3RvcmUodm9sYXRpbGUgYXRvbWljX2xvbmcgKm9iamVjdCwgbG9uZyBkZXNpcmVkKTsKK3ZvaWQgX19vdmxkIGF0b21pY19zdG9yZV9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfbG9uZyAqb2JqZWN0LCBsb25nIGRlc2lyZWQsIG1lbW9yeV9vcmRlciBvcmRlcik7Cit2b2lkIF9fb3ZsZCBhdG9taWNfc3RvcmVfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX2xvbmcgKm9iamVjdCwgbG9uZyBkZXNpcmVkLCBtZW1vcnlfb3JkZXIgb3JkZXIsIG1lbW9yeV9zY29wZSBzY29wZSk7Cit2b2lkIF9fb3ZsZCBhdG9taWNfc3RvcmUodm9sYXRpbGUgYXRvbWljX3Vsb25nICpvYmplY3QsIHVsb25nIGRlc2lyZWQpOwordm9pZCBfX292bGQgYXRvbWljX3N0b3JlX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY191bG9uZyAqb2JqZWN0LCB1bG9uZyBkZXNpcmVkLCBtZW1vcnlfb3JkZXIgb3JkZXIpOwordm9pZCBfX292bGQgYXRvbWljX3N0b3JlX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY191bG9uZyAqb2JqZWN0LCB1bG9uZyBkZXNpcmVkLCBtZW1vcnlfb3JkZXIgb3JkZXIsIG1lbW9yeV9zY29wZSBzY29wZSk7CisjZW5kaWYKKworLy8gYXRvbWljX2xvYWQoKQorCitpbnQgX19vdmxkIGF0b21pY19sb2FkKHZvbGF0aWxlIGF0b21pY19pbnQgKm9iamVjdCk7CitpbnQgX19vdmxkIGF0b21pY19sb2FkX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY19pbnQgKm9iamVjdCwgbWVtb3J5X29yZGVyIG9yZGVyKTsKK2ludCBfX292bGQgYXRvbWljX2xvYWRfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX2ludCAqb2JqZWN0LCBtZW1vcnlfb3JkZXIgb3JkZXIsIG1lbW9yeV9zY29wZSBzY29wZSk7Cit1aW50IF9fb3ZsZCBhdG9taWNfbG9hZCh2b2xhdGlsZSBhdG9taWNfdWludCAqb2JqZWN0KTsKK3VpbnQgX19vdmxkIGF0b21pY19sb2FkX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY191aW50ICpvYmplY3QsIG1lbW9yeV9vcmRlciBvcmRlcik7Cit1aW50IF9fb3ZsZCBhdG9taWNfbG9hZF9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfdWludCAqb2JqZWN0LCBtZW1vcnlfb3JkZXIgb3JkZXIsIG1lbW9yeV9zY29wZSBzY29wZSk7CitmbG9hdCBfX292bGQgYXRvbWljX2xvYWQodm9sYXRpbGUgYXRvbWljX2Zsb2F0ICpvYmplY3QpOworZmxvYXQgX19vdmxkIGF0b21pY19sb2FkX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY19mbG9hdCAqb2JqZWN0LCBtZW1vcnlfb3JkZXIgb3JkZXIpOworZmxvYXQgX19vdmxkIGF0b21pY19sb2FkX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY19mbG9hdCAqb2JqZWN0LCBtZW1vcnlfb3JkZXIgb3JkZXIsIG1lbW9yeV9zY29wZSBzY29wZSk7CisjaWYgZGVmaW5lZChjbF9raHJfaW50NjRfYmFzZV9hdG9taWNzKSAmJiBkZWZpbmVkKGNsX2tocl9pbnQ2NF9leHRlbmRlZF9hdG9taWNzKQorI2lmZGVmIGNsX2tocl9mcDY0Citkb3VibGUgX19vdmxkIGF0b21pY19sb2FkKHZvbGF0aWxlIGF0b21pY19kb3VibGUgKm9iamVjdCk7Citkb3VibGUgX19vdmxkIGF0b21pY19sb2FkX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY19kb3VibGUgKm9iamVjdCwgbWVtb3J5X29yZGVyIG9yZGVyKTsKK2RvdWJsZSBfX292bGQgYXRvbWljX2xvYWRfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX2RvdWJsZSAqb2JqZWN0LCBtZW1vcnlfb3JkZXIgb3JkZXIsIG1lbW9yeV9zY29wZSBzY29wZSk7CisjZW5kaWYgLy9jbF9raHJfZnA2NAorbG9uZyBfX292bGQgYXRvbWljX2xvYWQodm9sYXRpbGUgYXRvbWljX2xvbmcgKm9iamVjdCk7Citsb25nIF9fb3ZsZCBhdG9taWNfbG9hZF9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfbG9uZyAqb2JqZWN0LCBtZW1vcnlfb3JkZXIgb3JkZXIpOworbG9uZyBfX292bGQgYXRvbWljX2xvYWRfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX2xvbmcgKm9iamVjdCwgbWVtb3J5X29yZGVyIG9yZGVyLCBtZW1vcnlfc2NvcGUgc2NvcGUpOwordWxvbmcgX19vdmxkIGF0b21pY19sb2FkKHZvbGF0aWxlIGF0b21pY191bG9uZyAqb2JqZWN0KTsKK3Vsb25nIF9fb3ZsZCBhdG9taWNfbG9hZF9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfdWxvbmcgKm9iamVjdCwgbWVtb3J5X29yZGVyIG9yZGVyKTsKK3Vsb25nIF9fb3ZsZCBhdG9taWNfbG9hZF9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfdWxvbmcgKm9iamVjdCwgbWVtb3J5X29yZGVyIG9yZGVyLCBtZW1vcnlfc2NvcGUgc2NvcGUpOworI2VuZGlmCisKKy8vIGF0b21pY19leGNoYW5nZSgpCisKK2ludCBfX292bGQgYXRvbWljX2V4Y2hhbmdlKHZvbGF0aWxlIGF0b21pY19pbnQgKm9iamVjdCwgaW50IGRlc2lyZWQpOworaW50IF9fb3ZsZCBhdG9taWNfZXhjaGFuZ2VfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX2ludCAqb2JqZWN0LCBpbnQgZGVzaXJlZCwgbWVtb3J5X29yZGVyIG9yZGVyKTsKK2ludCBfX292bGQgYXRvbWljX2V4Y2hhbmdlX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY19pbnQgKm9iamVjdCwgaW50IGRlc2lyZWQsIG1lbW9yeV9vcmRlciBvcmRlciwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKK3VpbnQgX19vdmxkIGF0b21pY19leGNoYW5nZSh2b2xhdGlsZSBhdG9taWNfdWludCAqb2JqZWN0LCB1aW50IGRlc2lyZWQpOwordWludCBfX292bGQgYXRvbWljX2V4Y2hhbmdlX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY191aW50ICpvYmplY3QsIHVpbnQgZGVzaXJlZCwgbWVtb3J5X29yZGVyIG9yZGVyKTsKK3VpbnQgX19vdmxkIGF0b21pY19leGNoYW5nZV9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfdWludCAqb2JqZWN0LCB1aW50IGRlc2lyZWQsIG1lbW9yeV9vcmRlciBvcmRlciwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKK2Zsb2F0IF9fb3ZsZCBhdG9taWNfZXhjaGFuZ2Uodm9sYXRpbGUgYXRvbWljX2Zsb2F0ICpvYmplY3QsIGZsb2F0IGRlc2lyZWQpOworZmxvYXQgX19vdmxkIGF0b21pY19leGNoYW5nZV9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfZmxvYXQgKm9iamVjdCwgZmxvYXQgZGVzaXJlZCwgbWVtb3J5X29yZGVyIG9yZGVyKTsKK2Zsb2F0IF9fb3ZsZCBhdG9taWNfZXhjaGFuZ2VfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX2Zsb2F0ICpvYmplY3QsIGZsb2F0IGRlc2lyZWQsIG1lbW9yeV9vcmRlciBvcmRlciwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKKyNpZiBkZWZpbmVkKGNsX2tocl9pbnQ2NF9iYXNlX2F0b21pY3MpICYmIGRlZmluZWQoY2xfa2hyX2ludDY0X2V4dGVuZGVkX2F0b21pY3MpCisjaWZkZWYgY2xfa2hyX2ZwNjQKK2RvdWJsZSBfX292bGQgYXRvbWljX2V4Y2hhbmdlKHZvbGF0aWxlIGF0b21pY19kb3VibGUgKm9iamVjdCwgZG91YmxlIGRlc2lyZWQpOworZG91YmxlIF9fb3ZsZCBhdG9taWNfZXhjaGFuZ2VfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX2RvdWJsZSAqb2JqZWN0LCBkb3VibGUgZGVzaXJlZCwgbWVtb3J5X29yZGVyIG9yZGVyKTsKK2RvdWJsZSBfX292bGQgYXRvbWljX2V4Y2hhbmdlX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY19kb3VibGUgKm9iamVjdCwgZG91YmxlIGRlc2lyZWQsIG1lbW9yeV9vcmRlciBvcmRlciwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0Citsb25nIF9fb3ZsZCBhdG9taWNfZXhjaGFuZ2Uodm9sYXRpbGUgYXRvbWljX2xvbmcgKm9iamVjdCwgbG9uZyBkZXNpcmVkKTsKK2xvbmcgX19vdmxkIGF0b21pY19leGNoYW5nZV9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfbG9uZyAqb2JqZWN0LCBsb25nIGRlc2lyZWQsIG1lbW9yeV9vcmRlciBvcmRlcik7Citsb25nIF9fb3ZsZCBhdG9taWNfZXhjaGFuZ2VfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX2xvbmcgKm9iamVjdCwgbG9uZyBkZXNpcmVkLCBtZW1vcnlfb3JkZXIgb3JkZXIsIG1lbW9yeV9zY29wZSBzY29wZSk7Cit1bG9uZyBfX292bGQgYXRvbWljX2V4Y2hhbmdlKHZvbGF0aWxlIGF0b21pY191bG9uZyAqb2JqZWN0LCB1bG9uZyBkZXNpcmVkKTsKK3Vsb25nIF9fb3ZsZCBhdG9taWNfZXhjaGFuZ2VfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX3Vsb25nICpvYmplY3QsIHVsb25nIGRlc2lyZWQsIG1lbW9yeV9vcmRlciBvcmRlcik7Cit1bG9uZyBfX292bGQgYXRvbWljX2V4Y2hhbmdlX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY191bG9uZyAqb2JqZWN0LCB1bG9uZyBkZXNpcmVkLCBtZW1vcnlfb3JkZXIgb3JkZXIsIG1lbW9yeV9zY29wZSBzY29wZSk7CisjZW5kaWYKKworLy8gYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKCkgYW5kIGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3dlYWsoKQorCitib29sIF9fb3ZsZCBhdG9taWNfY29tcGFyZV9leGNoYW5nZV9zdHJvbmcodm9sYXRpbGUgYXRvbWljX2ludCAqb2JqZWN0LCBpbnQgKmV4cGVjdGVkLCBpbnQgZGVzaXJlZCk7Citib29sIF9fb3ZsZCBhdG9taWNfY29tcGFyZV9leGNoYW5nZV9zdHJvbmdfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX2ludCAqb2JqZWN0LCBpbnQgKmV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc2lyZWQsIG1lbW9yeV9vcmRlciBzdWNjZXNzLCBtZW1vcnlfb3JkZXIgZmFpbHVyZSk7Citib29sIF9fb3ZsZCBhdG9taWNfY29tcGFyZV9leGNoYW5nZV9zdHJvbmdfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX2ludCAqb2JqZWN0LCBpbnQgKmV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc2lyZWQsIG1lbW9yeV9vcmRlciBzdWNjZXNzLCBtZW1vcnlfb3JkZXIgZmFpbHVyZSwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKK2Jvb2wgX19vdmxkIGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyh2b2xhdGlsZSBhdG9taWNfdWludCAqb2JqZWN0LCB1aW50ICpleHBlY3RlZCwgdWludCBkZXNpcmVkKTsKK2Jvb2wgX19vdmxkIGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZ19leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfdWludCAqb2JqZWN0LCB1aW50ICpleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQgZGVzaXJlZCwgbWVtb3J5X29yZGVyIHN1Y2Nlc3MsIG1lbW9yeV9vcmRlciBmYWlsdXJlKTsKK2Jvb2wgX19vdmxkIGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZ19leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfdWludCAqb2JqZWN0LCB1aW50ICpleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQgZGVzaXJlZCwgbWVtb3J5X29yZGVyIHN1Y2Nlc3MsIG1lbW9yeV9vcmRlciBmYWlsdXJlLCBtZW1vcnlfc2NvcGUgc2NvcGUpOworYm9vbCBfX292bGQgYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfd2Vhayh2b2xhdGlsZSBhdG9taWNfaW50ICpvYmplY3QsIGludCAqZXhwZWN0ZWQsIGludCBkZXNpcmVkKTsKK2Jvb2wgX19vdmxkIGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3dlYWtfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX2ludCAqb2JqZWN0LCBpbnQgKmV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc2lyZWQsIG1lbW9yeV9vcmRlciBzdWNjZXNzLCBtZW1vcnlfb3JkZXIgZmFpbHVyZSk7Citib29sIF9fb3ZsZCBhdG9taWNfY29tcGFyZV9leGNoYW5nZV93ZWFrX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY19pbnQgKm9iamVjdCwgaW50ICpleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXNpcmVkLCBtZW1vcnlfb3JkZXIgc3VjY2VzcywgbWVtb3J5X29yZGVyIGZhaWx1cmUsIG1lbW9yeV9zY29wZSBzY29wZSk7Citib29sIF9fb3ZsZCBhdG9taWNfY29tcGFyZV9leGNoYW5nZV93ZWFrKHZvbGF0aWxlIGF0b21pY191aW50ICpvYmplY3QsIHVpbnQgKmV4cGVjdGVkLCB1aW50IGRlc2lyZWQpOworYm9vbCBfX292bGQgYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfd2Vha19leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfdWludCAqb2JqZWN0LCB1aW50ICpleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQgZGVzaXJlZCwgbWVtb3J5X29yZGVyIHN1Y2Nlc3MsIG1lbW9yeV9vcmRlciBmYWlsdXJlKTsKK2Jvb2wgX19vdmxkIGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3dlYWtfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX3VpbnQgKm9iamVjdCwgdWludCAqZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50IGRlc2lyZWQsIG1lbW9yeV9vcmRlciBzdWNjZXNzLCBtZW1vcnlfb3JkZXIgZmFpbHVyZSwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKK2Jvb2wgX19vdmxkIGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyh2b2xhdGlsZSBhdG9taWNfZmxvYXQgKm9iamVjdCwgZmxvYXQgKmV4cGVjdGVkLCBmbG9hdCBkZXNpcmVkKTsKK2Jvb2wgX19vdmxkIGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZ19leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfZmxvYXQgKm9iamVjdCwgZmxvYXQgKmV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZGVzaXJlZCwgbWVtb3J5X29yZGVyIHN1Y2Nlc3MsIG1lbW9yeV9vcmRlciBmYWlsdXJlKTsKK2Jvb2wgX19vdmxkIGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZ19leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfZmxvYXQgKm9iamVjdCwgZmxvYXQgKmV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZGVzaXJlZCwgbWVtb3J5X29yZGVyIHN1Y2Nlc3MsIG1lbW9yeV9vcmRlciBmYWlsdXJlLCBtZW1vcnlfc2NvcGUgc2NvcGUpOworYm9vbCBfX292bGQgYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfd2Vhayh2b2xhdGlsZSBhdG9taWNfZmxvYXQgKm9iamVjdCwgZmxvYXQgKmV4cGVjdGVkLCBmbG9hdCBkZXNpcmVkKTsKK2Jvb2wgX19vdmxkIGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3dlYWtfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX2Zsb2F0ICpvYmplY3QsIGZsb2F0ICpleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGRlc2lyZWQsIG1lbW9yeV9vcmRlciBzdWNjZXNzLCBtZW1vcnlfb3JkZXIgZmFpbHVyZSk7Citib29sIF9fb3ZsZCBhdG9taWNfY29tcGFyZV9leGNoYW5nZV93ZWFrX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY19mbG9hdCAqb2JqZWN0LCBmbG9hdCAqZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBkZXNpcmVkLCBtZW1vcnlfb3JkZXIgc3VjY2VzcywgbWVtb3J5X29yZGVyIGZhaWx1cmUsIG1lbW9yeV9zY29wZSBzY29wZSk7CisjaWYgZGVmaW5lZChjbF9raHJfaW50NjRfYmFzZV9hdG9taWNzKSAmJiBkZWZpbmVkKGNsX2tocl9pbnQ2NF9leHRlbmRlZF9hdG9taWNzKQorI2lmZGVmIGNsX2tocl9mcDY0Citib29sIF9fb3ZsZCBhdG9taWNfY29tcGFyZV9leGNoYW5nZV9zdHJvbmcodm9sYXRpbGUgYXRvbWljX2RvdWJsZSAqb2JqZWN0LCBkb3VibGUgKmV4cGVjdGVkLCBkb3VibGUgZGVzaXJlZCk7Citib29sIF9fb3ZsZCBhdG9taWNfY29tcGFyZV9leGNoYW5nZV9zdHJvbmdfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX2RvdWJsZSAqb2JqZWN0LCBkb3VibGUgKmV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGRlc2lyZWQsIG1lbW9yeV9vcmRlciBzdWNjZXNzLCBtZW1vcnlfb3JkZXIgZmFpbHVyZSk7Citib29sIF9fb3ZsZCBhdG9taWNfY29tcGFyZV9leGNoYW5nZV9zdHJvbmdfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX2RvdWJsZSAqb2JqZWN0LCBkb3VibGUgKmV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGRlc2lyZWQsIG1lbW9yeV9vcmRlciBzdWNjZXNzLCBtZW1vcnlfb3JkZXIgZmFpbHVyZSwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKK2Jvb2wgX19vdmxkIGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3dlYWsodm9sYXRpbGUgYXRvbWljX2RvdWJsZSAqb2JqZWN0LCBkb3VibGUgKmV4cGVjdGVkLCBkb3VibGUgZGVzaXJlZCk7Citib29sIF9fb3ZsZCBhdG9taWNfY29tcGFyZV9leGNoYW5nZV93ZWFrX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY19kb3VibGUgKm9iamVjdCwgZG91YmxlICpleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkZXNpcmVkLCBtZW1vcnlfb3JkZXIgc3VjY2VzcywgbWVtb3J5X29yZGVyIGZhaWx1cmUpOworYm9vbCBfX292bGQgYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfd2Vha19leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfZG91YmxlICpvYmplY3QsIGRvdWJsZSAqZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZGVzaXJlZCwgbWVtb3J5X29yZGVyIHN1Y2Nlc3MsIG1lbW9yeV9vcmRlciBmYWlsdXJlLCBtZW1vcnlfc2NvcGUgc2NvcGUpOworI2VuZGlmIC8vY2xfa2hyX2ZwNjQKK2Jvb2wgX19vdmxkIGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyh2b2xhdGlsZSBhdG9taWNfbG9uZyAqb2JqZWN0LCBsb25nICpleHBlY3RlZCwgbG9uZyBkZXNpcmVkKTsKK2Jvb2wgX19vdmxkIGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZ19leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfbG9uZyAqb2JqZWN0LCBsb25nICpleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgZGVzaXJlZCwgbWVtb3J5X29yZGVyIHN1Y2Nlc3MsIG1lbW9yeV9vcmRlciBmYWlsdXJlKTsKK2Jvb2wgX19vdmxkIGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZ19leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfbG9uZyAqb2JqZWN0LCBsb25nICpleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgZGVzaXJlZCwgbWVtb3J5X29yZGVyIHN1Y2Nlc3MsIG1lbW9yeV9vcmRlciBmYWlsdXJlLCBtZW1vcnlfc2NvcGUgc2NvcGUpOworYm9vbCBfX292bGQgYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfd2Vhayh2b2xhdGlsZSBhdG9taWNfbG9uZyAqb2JqZWN0LCBsb25nICpleHBlY3RlZCwgbG9uZyBkZXNpcmVkKTsKK2Jvb2wgX19vdmxkIGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3dlYWtfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX2xvbmcgKm9iamVjdCwgbG9uZyAqZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGRlc2lyZWQsIG1lbW9yeV9vcmRlciBzdWNjZXNzLCBtZW1vcnlfb3JkZXIgZmFpbHVyZSk7Citib29sIF9fb3ZsZCBhdG9taWNfY29tcGFyZV9leGNoYW5nZV93ZWFrX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY19sb25nICpvYmplY3QsIGxvbmcgKmV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBkZXNpcmVkLCBtZW1vcnlfb3JkZXIgc3VjY2VzcywgbWVtb3J5X29yZGVyIGZhaWx1cmUsIG1lbW9yeV9zY29wZSBzY29wZSk7Citib29sIF9fb3ZsZCBhdG9taWNfY29tcGFyZV9leGNoYW5nZV9zdHJvbmcodm9sYXRpbGUgYXRvbWljX3Vsb25nICpvYmplY3QsIHVsb25nICpleHBlY3RlZCwgdWxvbmcgZGVzaXJlZCk7Citib29sIF9fb3ZsZCBhdG9taWNfY29tcGFyZV9leGNoYW5nZV9zdHJvbmdfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX3Vsb25nICpvYmplY3QsIHVsb25nICpleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVsb25nIGRlc2lyZWQsIG1lbW9yeV9vcmRlciBzdWNjZXNzLCBtZW1vcnlfb3JkZXIgZmFpbHVyZSk7Citib29sIF9fb3ZsZCBhdG9taWNfY29tcGFyZV9leGNoYW5nZV9zdHJvbmdfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX3Vsb25nICpvYmplY3QsIHVsb25nICpleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVsb25nIGRlc2lyZWQsIG1lbW9yeV9vcmRlciBzdWNjZXNzLCBtZW1vcnlfb3JkZXIgZmFpbHVyZSwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKK2Jvb2wgX19vdmxkIGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3dlYWsodm9sYXRpbGUgYXRvbWljX3Vsb25nICpvYmplY3QsIHVsb25nICpleHBlY3RlZCwgdWxvbmcgZGVzaXJlZCk7Citib29sIF9fb3ZsZCBhdG9taWNfY29tcGFyZV9leGNoYW5nZV93ZWFrX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY191bG9uZyAqb2JqZWN0LCB1bG9uZyAqZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bG9uZyBkZXNpcmVkLCBtZW1vcnlfb3JkZXIgc3VjY2VzcywgbWVtb3J5X29yZGVyIGZhaWx1cmUpOworYm9vbCBfX292bGQgYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfd2Vha19leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfdWxvbmcgKm9iamVjdCwgdWxvbmcgKmV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWxvbmcgZGVzaXJlZCwgbWVtb3J5X29yZGVyIHN1Y2Nlc3MsIG1lbW9yeV9vcmRlciBmYWlsdXJlLCBtZW1vcnlfc2NvcGUgc2NvcGUpOworI2VuZGlmCisKKy8vIGF0b21pY19mbGFnX3Rlc3RfYW5kX3NldCgpIGFuZCBhdG9taWNfZmxhZ19jbGVhcigpCisKK2Jvb2wgX19vdmxkIGF0b21pY19mbGFnX3Rlc3RfYW5kX3NldCh2b2xhdGlsZSBhdG9taWNfZmxhZyAqb2JqZWN0KTsKK2Jvb2wgX19vdmxkIGF0b21pY19mbGFnX3Rlc3RfYW5kX3NldF9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfZmxhZyAqb2JqZWN0LCBtZW1vcnlfb3JkZXIgb3JkZXIpOworYm9vbCBfX292bGQgYXRvbWljX2ZsYWdfdGVzdF9hbmRfc2V0X2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY19mbGFnICpvYmplY3QsIG1lbW9yeV9vcmRlciBvcmRlciwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKK3ZvaWQgX19vdmxkIGF0b21pY19mbGFnX2NsZWFyKHZvbGF0aWxlIGF0b21pY19mbGFnICpvYmplY3QpOwordm9pZCBfX292bGQgYXRvbWljX2ZsYWdfY2xlYXJfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX2ZsYWcgKm9iamVjdCwgbWVtb3J5X29yZGVyIG9yZGVyKTsKK3ZvaWQgX19vdmxkIGF0b21pY19mbGFnX2NsZWFyX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY19mbGFnICpvYmplY3QsIG1lbW9yeV9vcmRlciBvcmRlciwgbWVtb3J5X3Njb3BlIHNjb3BlKTsKKworI2VuZGlmIC8vX19PUEVOQ0xfQ19WRVJTSU9OX18gPj0gQ0xfVkVSU0lPTl8yXzAKKworLy8gT3BlbkNMIHYxLjEgczYuMTEuMTIsIHYxLjIgczYuMTIuMTIsIHYyLjAgczYuMTMuMTIgLSBNaXNjZWxsYW5lb3VzIFZlY3RvciBGdW5jdGlvbnMKKworLyoqCisgKiBUaGUgc2h1ZmZsZSBhbmQgc2h1ZmZsZTIgYnVpbHQtaW4gZnVuY3Rpb25zIGNvbnN0cnVjdAorICogYSBwZXJtdXRhdGlvbiBvZiBlbGVtZW50cyBmcm9tIG9uZSBvciB0d28gaW5wdXQKKyAqIHZlY3RvcnMgcmVzcGVjdGl2ZWx5IHRoYXQgYXJlIG9mIHRoZSBzYW1lIHR5cGUsCisgKiByZXR1cm5pbmcgYSB2ZWN0b3Igd2l0aCB0aGUgc2FtZSBlbGVtZW50IHR5cGUgYXMgdGhlCisgKiBpbnB1dCBhbmQgbGVuZ3RoIHRoYXQgaXMgdGhlIHNhbWUgYXMgdGhlIHNodWZmbGUgbWFzay4KKyAqIFRoZSBzaXplIG9mIGVhY2ggZWxlbWVudCBpbiB0aGUgbWFzayBtdXN0IG1hdGNoIHRoZQorICogc2l6ZSBvZiBlYWNoIGVsZW1lbnQgaW4gdGhlIHJlc3VsdC4gRm9yIHNodWZmbGUsIG9ubHkKKyAqIHRoZSBpbG9nYigybS0xKSBsZWFzdCBzaWduaWZpY2FudCBiaXRzIG9mIGVhY2ggbWFzaworICogZWxlbWVudCBhcmUgY29uc2lkZXJlZC4gRm9yIHNodWZmbGUyLCBvbmx5IHRoZQorICogaWxvZ2IoMm0tMSkrMSBsZWFzdCBzaWduaWZpY2FudCBiaXRzIG9mIGVhY2ggbWFzaworICogZWxlbWVudCBhcmUgY29uc2lkZXJlZC4gT3RoZXIgYml0cyBpbiB0aGUgbWFzayBzaGFsbAorICogYmUgaWdub3JlZC4KKyAqIFRoZSBlbGVtZW50cyBvZiB0aGUgaW5wdXQgdmVjdG9ycyBhcmUgbnVtYmVyZWQgZnJvbQorICogbGVmdCB0byByaWdodCBhY3Jvc3Mgb25lIG9yIGJvdGggb2YgdGhlIHZlY3RvcnMuIEZvciB0aGlzCisgKiBwdXJwb3NlLCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGEgdmVjdG9yIGlzIGdpdmVuCisgKiBieSB2ZWNfc3RlcChnZW50eXBlbSkuIFRoZSBzaHVmZmxlIG1hc2sgb3BlcmFuZAorICogc3BlY2lmaWVzLCBmb3IgZWFjaCBlbGVtZW50IG9mIHRoZSByZXN1bHQgdmVjdG9yLCB3aGljaAorICogZWxlbWVudCBvZiB0aGUgb25lIG9yIHR3byBpbnB1dCB2ZWN0b3JzIHRoZSByZXN1bHQKKyAqIGVsZW1lbnQgZ2V0cy4KKyAqIEV4YW1wbGVzOgorICogdWludDQgbWFzayA9ICh1aW50NCkoMywgMiwKKyAqIDEsIDApOworICogZmxvYXQ0IGE7CisgKiBmbG9hdDQgciA9IHNodWZmbGUoYSwgbWFzayk7CisgKiAvLyByLnMwMTIzID0gYS53enl4CisgKiB1aW50OCBtYXNrID0gKHVpbnQ4KSgwLCAxLCAyLCAzLAorICogNCwgNSwgNiwgNyk7CisgKiBmbG9hdDQgYSwgYjsKKyAqIGZsb2F0OCByID0gc2h1ZmZsZTIoYSwgYiwgbWFzayk7CisgKiAvLyByLnMwMTIzID0gYS54eXp3CisgKiAvLyByLnM0NTY3ID0gYi54eXp3CisgKiB1aW50NCBtYXNrOworICogZmxvYXQ4IGE7CisgKiBmbG9hdDQgYjsKKyAqIGIgPSBzaHVmZmxlKGEsIG1hc2spOworICogRXhhbXBsZXMgdGhhdCBhcmUgbm90IHZhbGlkIGFyZToKKyAqIHVpbnQ4IG1hc2s7CisgKiBzaG9ydDE2IGE7CisgKiBzaG9ydDggYjsKKyAqIGIgPSBzaHVmZmxlKGEsIG1hc2spOyA8LSBub3QgdmFsaWQKKyAqLworY2hhcjIgX19vdmxkIF9fY25mbiBzaHVmZmxlKGNoYXIyIHgsIHVjaGFyMiBtYXNrKTsKK2NoYXIyIF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZShjaGFyNCB4LCB1Y2hhcjIgbWFzayk7CitjaGFyMiBfX292bGQgX19jbmZuIHNodWZmbGUoY2hhcjggeCwgdWNoYXIyIG1hc2spOworY2hhcjIgX19vdmxkIF9fY25mbiBzaHVmZmxlKGNoYXIxNiB4LCB1Y2hhcjIgbWFzayk7CisKK3VjaGFyMiBfX292bGQgX19jbmZuIHNodWZmbGUodWNoYXIyIHgsIHVjaGFyMiBtYXNrKTsKK3VjaGFyMiBfX292bGQgX19jbmZuIHNodWZmbGUodWNoYXI0IHgsIHVjaGFyMiBtYXNrKTsKK3VjaGFyMiBfX292bGQgX19jbmZuIHNodWZmbGUodWNoYXI4IHgsIHVjaGFyMiBtYXNrKTsKK3VjaGFyMiBfX292bGQgX19jbmZuIHNodWZmbGUodWNoYXIxNiB4LCB1Y2hhcjIgbWFzayk7CisKK3Nob3J0MiBfX292bGQgX19jbmZuIHNodWZmbGUoc2hvcnQyIHgsIHVzaG9ydDIgbWFzayk7CitzaG9ydDIgX19vdmxkIF9fY25mbiBzaHVmZmxlKHNob3J0NCB4LCB1c2hvcnQyIG1hc2spOworc2hvcnQyIF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZShzaG9ydDggeCwgdXNob3J0MiBtYXNrKTsKK3Nob3J0MiBfX292bGQgX19jbmZuIHNodWZmbGUoc2hvcnQxNiB4LCB1c2hvcnQyIG1hc2spOworCit1c2hvcnQyIF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZSh1c2hvcnQyIHgsIHVzaG9ydDIgbWFzayk7Cit1c2hvcnQyIF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZSh1c2hvcnQ0IHgsIHVzaG9ydDIgbWFzayk7Cit1c2hvcnQyIF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZSh1c2hvcnQ4IHgsIHVzaG9ydDIgbWFzayk7Cit1c2hvcnQyIF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZSh1c2hvcnQxNiB4LCB1c2hvcnQyIG1hc2spOworCitpbnQyIF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZShpbnQyIHgsIHVpbnQyIG1hc2spOworaW50MiBfX292bGQgX19jbmZuIHNodWZmbGUoaW50NCB4LCB1aW50MiBtYXNrKTsKK2ludDIgX19vdmxkIF9fY25mbiBzaHVmZmxlKGludDggeCwgdWludDIgbWFzayk7CitpbnQyIF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZShpbnQxNiB4LCB1aW50MiBtYXNrKTsKKwordWludDIgX19vdmxkIF9fY25mbiBzaHVmZmxlKHVpbnQyIHgsIHVpbnQyIG1hc2spOwordWludDIgX19vdmxkIF9fY25mbiBzaHVmZmxlKHVpbnQ0IHgsIHVpbnQyIG1hc2spOwordWludDIgX19vdmxkIF9fY25mbiBzaHVmZmxlKHVpbnQ4IHgsIHVpbnQyIG1hc2spOwordWludDIgX19vdmxkIF9fY25mbiBzaHVmZmxlKHVpbnQxNiB4LCB1aW50MiBtYXNrKTsKKworbG9uZzIgX19vdmxkIF9fY25mbiBzaHVmZmxlKGxvbmcyIHgsIHVsb25nMiBtYXNrKTsKK2xvbmcyIF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZShsb25nNCB4LCB1bG9uZzIgbWFzayk7Citsb25nMiBfX292bGQgX19jbmZuIHNodWZmbGUobG9uZzggeCwgdWxvbmcyIG1hc2spOworbG9uZzIgX19vdmxkIF9fY25mbiBzaHVmZmxlKGxvbmcxNiB4LCB1bG9uZzIgbWFzayk7CisKK3Vsb25nMiBfX292bGQgX19jbmZuIHNodWZmbGUodWxvbmcyIHgsIHVsb25nMiBtYXNrKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIHNodWZmbGUodWxvbmc0IHgsIHVsb25nMiBtYXNrKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIHNodWZmbGUodWxvbmc4IHgsIHVsb25nMiBtYXNrKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIHNodWZmbGUodWxvbmcxNiB4LCB1bG9uZzIgbWFzayk7CisKK2Zsb2F0MiBfX292bGQgX19jbmZuIHNodWZmbGUoZmxvYXQyIHgsIHVpbnQyIG1hc2spOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZShmbG9hdDQgeCwgdWludDIgbWFzayk7CitmbG9hdDIgX19vdmxkIF9fY25mbiBzaHVmZmxlKGZsb2F0OCB4LCB1aW50MiBtYXNrKTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIHNodWZmbGUoZmxvYXQxNiB4LCB1aW50MiBtYXNrKTsKKworY2hhcjQgX19vdmxkIF9fY25mbiBzaHVmZmxlKGNoYXIyIHgsIHVjaGFyNCBtYXNrKTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZShjaGFyNCB4LCB1Y2hhcjQgbWFzayk7CitjaGFyNCBfX292bGQgX19jbmZuIHNodWZmbGUoY2hhcjggeCwgdWNoYXI0IG1hc2spOworY2hhcjQgX19vdmxkIF9fY25mbiBzaHVmZmxlKGNoYXIxNiB4LCB1Y2hhcjQgbWFzayk7CisKK3VjaGFyNCBfX292bGQgX19jbmZuIHNodWZmbGUodWNoYXIyIHgsIHVjaGFyNCBtYXNrKTsKK3VjaGFyNCBfX292bGQgX19jbmZuIHNodWZmbGUodWNoYXI0IHgsIHVjaGFyNCBtYXNrKTsKK3VjaGFyNCBfX292bGQgX19jbmZuIHNodWZmbGUodWNoYXI4IHgsIHVjaGFyNCBtYXNrKTsKK3VjaGFyNCBfX292bGQgX19jbmZuIHNodWZmbGUodWNoYXIxNiB4LCB1Y2hhcjQgbWFzayk7CisKK3Nob3J0NCBfX292bGQgX19jbmZuIHNodWZmbGUoc2hvcnQyIHgsIHVzaG9ydDQgbWFzayk7CitzaG9ydDQgX19vdmxkIF9fY25mbiBzaHVmZmxlKHNob3J0NCB4LCB1c2hvcnQ0IG1hc2spOworc2hvcnQ0IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZShzaG9ydDggeCwgdXNob3J0NCBtYXNrKTsKK3Nob3J0NCBfX292bGQgX19jbmZuIHNodWZmbGUoc2hvcnQxNiB4LCB1c2hvcnQ0IG1hc2spOworCit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZSh1c2hvcnQyIHgsIHVzaG9ydDQgbWFzayk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZSh1c2hvcnQ0IHgsIHVzaG9ydDQgbWFzayk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZSh1c2hvcnQ4IHgsIHVzaG9ydDQgbWFzayk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZSh1c2hvcnQxNiB4LCB1c2hvcnQ0IG1hc2spOworCitpbnQ0IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZShpbnQyIHgsIHVpbnQ0IG1hc2spOworaW50NCBfX292bGQgX19jbmZuIHNodWZmbGUoaW50NCB4LCB1aW50NCBtYXNrKTsKK2ludDQgX19vdmxkIF9fY25mbiBzaHVmZmxlKGludDggeCwgdWludDQgbWFzayk7CitpbnQ0IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZShpbnQxNiB4LCB1aW50NCBtYXNrKTsKKwordWludDQgX19vdmxkIF9fY25mbiBzaHVmZmxlKHVpbnQyIHgsIHVpbnQ0IG1hc2spOwordWludDQgX19vdmxkIF9fY25mbiBzaHVmZmxlKHVpbnQ0IHgsIHVpbnQ0IG1hc2spOwordWludDQgX19vdmxkIF9fY25mbiBzaHVmZmxlKHVpbnQ4IHgsIHVpbnQ0IG1hc2spOwordWludDQgX19vdmxkIF9fY25mbiBzaHVmZmxlKHVpbnQxNiB4LCB1aW50NCBtYXNrKTsKKworbG9uZzQgX19vdmxkIF9fY25mbiBzaHVmZmxlKGxvbmcyIHgsIHVsb25nNCBtYXNrKTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZShsb25nNCB4LCB1bG9uZzQgbWFzayk7Citsb25nNCBfX292bGQgX19jbmZuIHNodWZmbGUobG9uZzggeCwgdWxvbmc0IG1hc2spOworbG9uZzQgX19vdmxkIF9fY25mbiBzaHVmZmxlKGxvbmcxNiB4LCB1bG9uZzQgbWFzayk7CisKK3Vsb25nNCBfX292bGQgX19jbmZuIHNodWZmbGUodWxvbmcyIHgsIHVsb25nNCBtYXNrKTsKK3Vsb25nNCBfX292bGQgX19jbmZuIHNodWZmbGUodWxvbmc0IHgsIHVsb25nNCBtYXNrKTsKK3Vsb25nNCBfX292bGQgX19jbmZuIHNodWZmbGUodWxvbmc4IHgsIHVsb25nNCBtYXNrKTsKK3Vsb25nNCBfX292bGQgX19jbmZuIHNodWZmbGUodWxvbmcxNiB4LCB1bG9uZzQgbWFzayk7CisKK2Zsb2F0NCBfX292bGQgX19jbmZuIHNodWZmbGUoZmxvYXQyIHgsIHVpbnQ0IG1hc2spOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZShmbG9hdDQgeCwgdWludDQgbWFzayk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBzaHVmZmxlKGZsb2F0OCB4LCB1aW50NCBtYXNrKTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIHNodWZmbGUoZmxvYXQxNiB4LCB1aW50NCBtYXNrKTsKKworY2hhcjggX19vdmxkIF9fY25mbiBzaHVmZmxlKGNoYXIyIHgsIHVjaGFyOCBtYXNrKTsKK2NoYXI4IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZShjaGFyNCB4LCB1Y2hhcjggbWFzayk7CitjaGFyOCBfX292bGQgX19jbmZuIHNodWZmbGUoY2hhcjggeCwgdWNoYXI4IG1hc2spOworY2hhcjggX19vdmxkIF9fY25mbiBzaHVmZmxlKGNoYXIxNiB4LCB1Y2hhcjggbWFzayk7CisKK3VjaGFyOCBfX292bGQgX19jbmZuIHNodWZmbGUodWNoYXIyIHgsIHVjaGFyOCBtYXNrKTsKK3VjaGFyOCBfX292bGQgX19jbmZuIHNodWZmbGUodWNoYXI0IHgsIHVjaGFyOCBtYXNrKTsKK3VjaGFyOCBfX292bGQgX19jbmZuIHNodWZmbGUodWNoYXI4IHgsIHVjaGFyOCBtYXNrKTsKK3VjaGFyOCBfX292bGQgX19jbmZuIHNodWZmbGUodWNoYXIxNiB4LCB1Y2hhcjggbWFzayk7CisKK3Nob3J0OCBfX292bGQgX19jbmZuIHNodWZmbGUoc2hvcnQyIHgsIHVzaG9ydDggbWFzayk7CitzaG9ydDggX19vdmxkIF9fY25mbiBzaHVmZmxlKHNob3J0NCB4LCB1c2hvcnQ4IG1hc2spOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZShzaG9ydDggeCwgdXNob3J0OCBtYXNrKTsKK3Nob3J0OCBfX292bGQgX19jbmZuIHNodWZmbGUoc2hvcnQxNiB4LCB1c2hvcnQ4IG1hc2spOworCit1c2hvcnQ4IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZSh1c2hvcnQyIHgsIHVzaG9ydDggbWFzayk7Cit1c2hvcnQ4IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZSh1c2hvcnQ0IHgsIHVzaG9ydDggbWFzayk7Cit1c2hvcnQ4IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZSh1c2hvcnQ4IHgsIHVzaG9ydDggbWFzayk7Cit1c2hvcnQ4IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZSh1c2hvcnQxNiB4LCB1c2hvcnQ4IG1hc2spOworCitpbnQ4IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZShpbnQyIHgsIHVpbnQ4IG1hc2spOworaW50OCBfX292bGQgX19jbmZuIHNodWZmbGUoaW50NCB4LCB1aW50OCBtYXNrKTsKK2ludDggX19vdmxkIF9fY25mbiBzaHVmZmxlKGludDggeCwgdWludDggbWFzayk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZShpbnQxNiB4LCB1aW50OCBtYXNrKTsKKwordWludDggX19vdmxkIF9fY25mbiBzaHVmZmxlKHVpbnQyIHgsIHVpbnQ4IG1hc2spOwordWludDggX19vdmxkIF9fY25mbiBzaHVmZmxlKHVpbnQ0IHgsIHVpbnQ4IG1hc2spOwordWludDggX19vdmxkIF9fY25mbiBzaHVmZmxlKHVpbnQ4IHgsIHVpbnQ4IG1hc2spOwordWludDggX19vdmxkIF9fY25mbiBzaHVmZmxlKHVpbnQxNiB4LCB1aW50OCBtYXNrKTsKKworbG9uZzggX19vdmxkIF9fY25mbiBzaHVmZmxlKGxvbmcyIHgsIHVsb25nOCBtYXNrKTsKK2xvbmc4IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZShsb25nNCB4LCB1bG9uZzggbWFzayk7Citsb25nOCBfX292bGQgX19jbmZuIHNodWZmbGUobG9uZzggeCwgdWxvbmc4IG1hc2spOworbG9uZzggX19vdmxkIF9fY25mbiBzaHVmZmxlKGxvbmcxNiB4LCB1bG9uZzggbWFzayk7CisKK3Vsb25nOCBfX292bGQgX19jbmZuIHNodWZmbGUodWxvbmcyIHgsIHVsb25nOCBtYXNrKTsKK3Vsb25nOCBfX292bGQgX19jbmZuIHNodWZmbGUodWxvbmc0IHgsIHVsb25nOCBtYXNrKTsKK3Vsb25nOCBfX292bGQgX19jbmZuIHNodWZmbGUodWxvbmc4IHgsIHVsb25nOCBtYXNrKTsKK3Vsb25nOCBfX292bGQgX19jbmZuIHNodWZmbGUodWxvbmcxNiB4LCB1bG9uZzggbWFzayk7CisKK2Zsb2F0OCBfX292bGQgX19jbmZuIHNodWZmbGUoZmxvYXQyIHgsIHVpbnQ4IG1hc2spOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZShmbG9hdDQgeCwgdWludDggbWFzayk7CitmbG9hdDggX19vdmxkIF9fY25mbiBzaHVmZmxlKGZsb2F0OCB4LCB1aW50OCBtYXNrKTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIHNodWZmbGUoZmxvYXQxNiB4LCB1aW50OCBtYXNrKTsKKworY2hhcjE2IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZShjaGFyMiB4LCB1Y2hhcjE2IG1hc2spOworY2hhcjE2IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZShjaGFyNCB4LCB1Y2hhcjE2IG1hc2spOworY2hhcjE2IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZShjaGFyOCB4LCB1Y2hhcjE2IG1hc2spOworY2hhcjE2IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZShjaGFyMTYgeCwgdWNoYXIxNiBtYXNrKTsKKwordWNoYXIxNiBfX292bGQgX19jbmZuIHNodWZmbGUodWNoYXIyIHgsIHVjaGFyMTYgbWFzayk7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZSh1Y2hhcjQgeCwgdWNoYXIxNiBtYXNrKTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBzaHVmZmxlKHVjaGFyOCB4LCB1Y2hhcjE2IG1hc2spOwordWNoYXIxNiBfX292bGQgX19jbmZuIHNodWZmbGUodWNoYXIxNiB4LCB1Y2hhcjE2IG1hc2spOworCitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZShzaG9ydDIgeCwgdXNob3J0MTYgbWFzayk7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZShzaG9ydDQgeCwgdXNob3J0MTYgbWFzayk7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZShzaG9ydDggeCwgdXNob3J0MTYgbWFzayk7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZShzaG9ydDE2IHgsIHVzaG9ydDE2IG1hc2spOworCit1c2hvcnQxNiBfX292bGQgX19jbmZuIHNodWZmbGUodXNob3J0MiB4LCB1c2hvcnQxNiBtYXNrKTsKK3VzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZSh1c2hvcnQ0IHgsIHVzaG9ydDE2IG1hc2spOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBzaHVmZmxlKHVzaG9ydDggeCwgdXNob3J0MTYgbWFzayk7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIHNodWZmbGUodXNob3J0MTYgeCwgdXNob3J0MTYgbWFzayk7CisKK2ludDE2IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZShpbnQyIHgsIHVpbnQxNiBtYXNrKTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZShpbnQ0IHgsIHVpbnQxNiBtYXNrKTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZShpbnQ4IHgsIHVpbnQxNiBtYXNrKTsKK2ludDE2IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZShpbnQxNiB4LCB1aW50MTYgbWFzayk7CisKK3VpbnQxNiBfX292bGQgX19jbmZuIHNodWZmbGUodWludDIgeCwgdWludDE2IG1hc2spOwordWludDE2IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZSh1aW50NCB4LCB1aW50MTYgbWFzayk7Cit1aW50MTYgX19vdmxkIF9fY25mbiBzaHVmZmxlKHVpbnQ4IHgsIHVpbnQxNiBtYXNrKTsKK3VpbnQxNiBfX292bGQgX19jbmZuIHNodWZmbGUodWludDE2IHgsIHVpbnQxNiBtYXNrKTsKKworbG9uZzE2IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZShsb25nMiB4LCB1bG9uZzE2IG1hc2spOworbG9uZzE2IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZShsb25nNCB4LCB1bG9uZzE2IG1hc2spOworbG9uZzE2IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZShsb25nOCB4LCB1bG9uZzE2IG1hc2spOworbG9uZzE2IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZShsb25nMTYgeCwgdWxvbmcxNiBtYXNrKTsKKwordWxvbmcxNiBfX292bGQgX19jbmZuIHNodWZmbGUodWxvbmcyIHgsIHVsb25nMTYgbWFzayk7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZSh1bG9uZzQgeCwgdWxvbmcxNiBtYXNrKTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBzaHVmZmxlKHVsb25nOCB4LCB1bG9uZzE2IG1hc2spOwordWxvbmcxNiBfX292bGQgX19jbmZuIHNodWZmbGUodWxvbmcxNiB4LCB1bG9uZzE2IG1hc2spOworCitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZShmbG9hdDIgeCwgdWludDE2IG1hc2spOworZmxvYXQxNiBfX292bGQgX19jbmZuIHNodWZmbGUoZmxvYXQ0IHgsIHVpbnQxNiBtYXNrKTsKK2Zsb2F0MTYgX19vdmxkIF9fY25mbiBzaHVmZmxlKGZsb2F0OCB4LCB1aW50MTYgbWFzayk7CitmbG9hdDE2IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZShmbG9hdDE2IHgsIHVpbnQxNiBtYXNrKTsKKworI2lmZGVmIGNsX2tocl9mcDY0Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZShkb3VibGUyIHgsIHVsb25nMiBtYXNrKTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBzaHVmZmxlKGRvdWJsZTQgeCwgdWxvbmcyIG1hc2spOworZG91YmxlMiBfX292bGQgX19jbmZuIHNodWZmbGUoZG91YmxlOCB4LCB1bG9uZzIgbWFzayk7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZShkb3VibGUxNiB4LCB1bG9uZzIgbWFzayk7CisKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBzaHVmZmxlKGRvdWJsZTIgeCwgdWxvbmc0IG1hc2spOworZG91YmxlNCBfX292bGQgX19jbmZuIHNodWZmbGUoZG91YmxlNCB4LCB1bG9uZzQgbWFzayk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZShkb3VibGU4IHgsIHVsb25nNCBtYXNrKTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBzaHVmZmxlKGRvdWJsZTE2IHgsIHVsb25nNCBtYXNrKTsKKworZG91YmxlOCBfX292bGQgX19jbmZuIHNodWZmbGUoZG91YmxlMiB4LCB1bG9uZzggbWFzayk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZShkb3VibGU0IHgsIHVsb25nOCBtYXNrKTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBzaHVmZmxlKGRvdWJsZTggeCwgdWxvbmc4IG1hc2spOworZG91YmxlOCBfX292bGQgX19jbmZuIHNodWZmbGUoZG91YmxlMTYgeCwgdWxvbmc4IG1hc2spOworCitkb3VibGUxNiBfX292bGQgX19jbmZuIHNodWZmbGUoZG91YmxlMiB4LCB1bG9uZzE2IG1hc2spOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBzaHVmZmxlKGRvdWJsZTQgeCwgdWxvbmcxNiBtYXNrKTsKK2RvdWJsZTE2IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZShkb3VibGU4IHgsIHVsb25nMTYgbWFzayk7Citkb3VibGUxNiBfX292bGQgX19jbmZuIHNodWZmbGUoZG91YmxlMTYgeCwgdWxvbmcxNiBtYXNrKTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisKKyNpZmRlZiBjbF9raHJfZnAxNgoraGFsZjIgX19vdmxkIF9fY25mbiBzaHVmZmxlKGhhbGYyIHgsIHVzaG9ydDIgbWFzayk7CitoYWxmMiBfX292bGQgX19jbmZuIHNodWZmbGUoaGFsZjQgeCwgdXNob3J0MiBtYXNrKTsKK2hhbGYyIF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZShoYWxmOCB4LCB1c2hvcnQyIG1hc2spOworaGFsZjIgX19vdmxkIF9fY25mbiBzaHVmZmxlKGhhbGYxNiB4LCB1c2hvcnQyIG1hc2spOworCitoYWxmNCBfX292bGQgX19jbmZuIHNodWZmbGUoaGFsZjIgeCwgdXNob3J0NCBtYXNrKTsKK2hhbGY0IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZShoYWxmNCB4LCB1c2hvcnQ0IG1hc2spOworaGFsZjQgX19vdmxkIF9fY25mbiBzaHVmZmxlKGhhbGY4IHgsIHVzaG9ydDQgbWFzayk7CitoYWxmNCBfX292bGQgX19jbmZuIHNodWZmbGUoaGFsZjE2IHgsIHVzaG9ydDQgbWFzayk7CisKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZShoYWxmMiB4LCB1c2hvcnQ4IG1hc2spOworaGFsZjggX19vdmxkIF9fY25mbiBzaHVmZmxlKGhhbGY0IHgsIHVzaG9ydDggbWFzayk7CitoYWxmOCBfX292bGQgX19jbmZuIHNodWZmbGUoaGFsZjggeCwgdXNob3J0OCBtYXNrKTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZShoYWxmMTYgeCwgdXNob3J0OCBtYXNrKTsKKworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZShoYWxmMiB4LCB1c2hvcnQxNiBtYXNrKTsKK2hhbGYxNiBfX292bGQgX19jbmZuIHNodWZmbGUoaGFsZjQgeCwgdXNob3J0MTYgbWFzayk7CitoYWxmMTYgX19vdmxkIF9fY25mbiBzaHVmZmxlKGhhbGY4IHgsIHVzaG9ydDE2IG1hc2spOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZShoYWxmMTYgeCwgdXNob3J0MTYgbWFzayk7CisjZW5kaWYgLy9jbF9raHJfZnAxNgorCitjaGFyMiBfX292bGQgX19jbmZuIHNodWZmbGUyKGNoYXIyIHgsIGNoYXIyIHksIHVjaGFyMiBtYXNrKTsKK2NoYXIyIF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIoY2hhcjQgeCwgY2hhcjQgeSwgdWNoYXIyIG1hc2spOworY2hhcjIgX19vdmxkIF9fY25mbiBzaHVmZmxlMihjaGFyOCB4LCBjaGFyOCB5LCB1Y2hhcjIgbWFzayk7CitjaGFyMiBfX292bGQgX19jbmZuIHNodWZmbGUyKGNoYXIxNiB4LCBjaGFyMTYgeSwgdWNoYXIyIG1hc2spOworCit1Y2hhcjIgX19vdmxkIF9fY25mbiBzaHVmZmxlMih1Y2hhcjIgeCwgdWNoYXIyIHksIHVjaGFyMiBtYXNrKTsKK3VjaGFyMiBfX292bGQgX19jbmZuIHNodWZmbGUyKHVjaGFyNCB4LCB1Y2hhcjQgeSwgdWNoYXIyIG1hc2spOwordWNoYXIyIF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIodWNoYXI4IHgsIHVjaGFyOCB5LCB1Y2hhcjIgbWFzayk7Cit1Y2hhcjIgX19vdmxkIF9fY25mbiBzaHVmZmxlMih1Y2hhcjE2IHgsIHVjaGFyMTYgeSwgdWNoYXIyIG1hc2spOworCitzaG9ydDIgX19vdmxkIF9fY25mbiBzaHVmZmxlMihzaG9ydDIgeCwgc2hvcnQyIHksIHVzaG9ydDIgbWFzayk7CitzaG9ydDIgX19vdmxkIF9fY25mbiBzaHVmZmxlMihzaG9ydDQgeCwgc2hvcnQ0IHksIHVzaG9ydDIgbWFzayk7CitzaG9ydDIgX19vdmxkIF9fY25mbiBzaHVmZmxlMihzaG9ydDggeCwgc2hvcnQ4IHksIHVzaG9ydDIgbWFzayk7CitzaG9ydDIgX19vdmxkIF9fY25mbiBzaHVmZmxlMihzaG9ydDE2IHgsIHNob3J0MTYgeSwgdXNob3J0MiBtYXNrKTsKKwordXNob3J0MiBfX292bGQgX19jbmZuIHNodWZmbGUyKHVzaG9ydDIgeCwgdXNob3J0MiB5LCB1c2hvcnQyIG1hc2spOwordXNob3J0MiBfX292bGQgX19jbmZuIHNodWZmbGUyKHVzaG9ydDQgeCwgdXNob3J0NCB5LCB1c2hvcnQyIG1hc2spOwordXNob3J0MiBfX292bGQgX19jbmZuIHNodWZmbGUyKHVzaG9ydDggeCwgdXNob3J0OCB5LCB1c2hvcnQyIG1hc2spOwordXNob3J0MiBfX292bGQgX19jbmZuIHNodWZmbGUyKHVzaG9ydDE2IHgsIHVzaG9ydDE2IHksIHVzaG9ydDIgbWFzayk7CisKK2ludDIgX19vdmxkIF9fY25mbiBzaHVmZmxlMihpbnQyIHgsIGludDIgeSwgdWludDIgbWFzayk7CitpbnQyIF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIoaW50NCB4LCBpbnQ0IHksIHVpbnQyIG1hc2spOworaW50MiBfX292bGQgX19jbmZuIHNodWZmbGUyKGludDggeCwgaW50OCB5LCB1aW50MiBtYXNrKTsKK2ludDIgX19vdmxkIF9fY25mbiBzaHVmZmxlMihpbnQxNiB4LCBpbnQxNiB5LCB1aW50MiBtYXNrKTsKKwordWludDIgX19vdmxkIF9fY25mbiBzaHVmZmxlMih1aW50MiB4LCB1aW50MiB5LCB1aW50MiBtYXNrKTsKK3VpbnQyIF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIodWludDQgeCwgdWludDQgeSwgdWludDIgbWFzayk7Cit1aW50MiBfX292bGQgX19jbmZuIHNodWZmbGUyKHVpbnQ4IHgsIHVpbnQ4IHksIHVpbnQyIG1hc2spOwordWludDIgX19vdmxkIF9fY25mbiBzaHVmZmxlMih1aW50MTYgeCwgdWludDE2IHksIHVpbnQyIG1hc2spOworCitsb25nMiBfX292bGQgX19jbmZuIHNodWZmbGUyKGxvbmcyIHgsIGxvbmcyIHksIHVsb25nMiBtYXNrKTsKK2xvbmcyIF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIobG9uZzQgeCwgbG9uZzQgeSwgdWxvbmcyIG1hc2spOworbG9uZzIgX19vdmxkIF9fY25mbiBzaHVmZmxlMihsb25nOCB4LCBsb25nOCB5LCB1bG9uZzIgbWFzayk7Citsb25nMiBfX292bGQgX19jbmZuIHNodWZmbGUyKGxvbmcxNiB4LCBsb25nMTYgeSwgdWxvbmcyIG1hc2spOworCit1bG9uZzIgX19vdmxkIF9fY25mbiBzaHVmZmxlMih1bG9uZzIgeCwgdWxvbmcyIHksIHVsb25nMiBtYXNrKTsKK3Vsb25nMiBfX292bGQgX19jbmZuIHNodWZmbGUyKHVsb25nNCB4LCB1bG9uZzQgeSwgdWxvbmcyIG1hc2spOwordWxvbmcyIF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIodWxvbmc4IHgsIHVsb25nOCB5LCB1bG9uZzIgbWFzayk7Cit1bG9uZzIgX19vdmxkIF9fY25mbiBzaHVmZmxlMih1bG9uZzE2IHgsIHVsb25nMTYgeSwgdWxvbmcyIG1hc2spOworCitmbG9hdDIgX19vdmxkIF9fY25mbiBzaHVmZmxlMihmbG9hdDIgeCwgZmxvYXQyIHksIHVpbnQyIG1hc2spOworZmxvYXQyIF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIoZmxvYXQ0IHgsIGZsb2F0NCB5LCB1aW50MiBtYXNrKTsKK2Zsb2F0MiBfX292bGQgX19jbmZuIHNodWZmbGUyKGZsb2F0OCB4LCBmbG9hdDggeSwgdWludDIgbWFzayk7CitmbG9hdDIgX19vdmxkIF9fY25mbiBzaHVmZmxlMihmbG9hdDE2IHgsIGZsb2F0MTYgeSwgdWludDIgbWFzayk7CisKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIoY2hhcjIgeCwgY2hhcjIgeSwgdWNoYXI0IG1hc2spOworY2hhcjQgX19vdmxkIF9fY25mbiBzaHVmZmxlMihjaGFyNCB4LCBjaGFyNCB5LCB1Y2hhcjQgbWFzayk7CitjaGFyNCBfX292bGQgX19jbmZuIHNodWZmbGUyKGNoYXI4IHgsIGNoYXI4IHksIHVjaGFyNCBtYXNrKTsKK2NoYXI0IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIoY2hhcjE2IHgsIGNoYXIxNiB5LCB1Y2hhcjQgbWFzayk7CisKK3VjaGFyNCBfX292bGQgX19jbmZuIHNodWZmbGUyKHVjaGFyMiB4LCB1Y2hhcjIgeSwgdWNoYXI0IG1hc2spOwordWNoYXI0IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIodWNoYXI0IHgsIHVjaGFyNCB5LCB1Y2hhcjQgbWFzayk7Cit1Y2hhcjQgX19vdmxkIF9fY25mbiBzaHVmZmxlMih1Y2hhcjggeCwgdWNoYXI4IHksIHVjaGFyNCBtYXNrKTsKK3VjaGFyNCBfX292bGQgX19jbmZuIHNodWZmbGUyKHVjaGFyMTYgeCwgdWNoYXIxNiB5LCB1Y2hhcjQgbWFzayk7CisKK3Nob3J0NCBfX292bGQgX19jbmZuIHNodWZmbGUyKHNob3J0MiB4LCBzaG9ydDIgeSwgdXNob3J0NCBtYXNrKTsKK3Nob3J0NCBfX292bGQgX19jbmZuIHNodWZmbGUyKHNob3J0NCB4LCBzaG9ydDQgeSwgdXNob3J0NCBtYXNrKTsKK3Nob3J0NCBfX292bGQgX19jbmZuIHNodWZmbGUyKHNob3J0OCB4LCBzaG9ydDggeSwgdXNob3J0NCBtYXNrKTsKK3Nob3J0NCBfX292bGQgX19jbmZuIHNodWZmbGUyKHNob3J0MTYgeCwgc2hvcnQxNiB5LCB1c2hvcnQ0IG1hc2spOworCit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIodXNob3J0MiB4LCB1c2hvcnQyIHksIHVzaG9ydDQgbWFzayk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIodXNob3J0NCB4LCB1c2hvcnQ0IHksIHVzaG9ydDQgbWFzayk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIodXNob3J0OCB4LCB1c2hvcnQ4IHksIHVzaG9ydDQgbWFzayk7Cit1c2hvcnQ0IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIodXNob3J0MTYgeCwgdXNob3J0MTYgeSwgdXNob3J0NCBtYXNrKTsKKworaW50NCBfX292bGQgX19jbmZuIHNodWZmbGUyKGludDIgeCwgaW50MiB5LCB1aW50NCBtYXNrKTsKK2ludDQgX19vdmxkIF9fY25mbiBzaHVmZmxlMihpbnQ0IHgsIGludDQgeSwgdWludDQgbWFzayk7CitpbnQ0IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIoaW50OCB4LCBpbnQ4IHksIHVpbnQ0IG1hc2spOworaW50NCBfX292bGQgX19jbmZuIHNodWZmbGUyKGludDE2IHgsIGludDE2IHksIHVpbnQ0IG1hc2spOworCit1aW50NCBfX292bGQgX19jbmZuIHNodWZmbGUyKHVpbnQyIHgsIHVpbnQyIHksIHVpbnQ0IG1hc2spOwordWludDQgX19vdmxkIF9fY25mbiBzaHVmZmxlMih1aW50NCB4LCB1aW50NCB5LCB1aW50NCBtYXNrKTsKK3VpbnQ0IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIodWludDggeCwgdWludDggeSwgdWludDQgbWFzayk7Cit1aW50NCBfX292bGQgX19jbmZuIHNodWZmbGUyKHVpbnQxNiB4LCB1aW50MTYgeSwgdWludDQgbWFzayk7CisKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIobG9uZzIgeCwgbG9uZzIgeSwgdWxvbmc0IG1hc2spOworbG9uZzQgX19vdmxkIF9fY25mbiBzaHVmZmxlMihsb25nNCB4LCBsb25nNCB5LCB1bG9uZzQgbWFzayk7Citsb25nNCBfX292bGQgX19jbmZuIHNodWZmbGUyKGxvbmc4IHgsIGxvbmc4IHksIHVsb25nNCBtYXNrKTsKK2xvbmc0IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIobG9uZzE2IHgsIGxvbmcxNiB5LCB1bG9uZzQgbWFzayk7CisKK3Vsb25nNCBfX292bGQgX19jbmZuIHNodWZmbGUyKHVsb25nMiB4LCB1bG9uZzIgeSwgdWxvbmc0IG1hc2spOwordWxvbmc0IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIodWxvbmc0IHgsIHVsb25nNCB5LCB1bG9uZzQgbWFzayk7Cit1bG9uZzQgX19vdmxkIF9fY25mbiBzaHVmZmxlMih1bG9uZzggeCwgdWxvbmc4IHksIHVsb25nNCBtYXNrKTsKK3Vsb25nNCBfX292bGQgX19jbmZuIHNodWZmbGUyKHVsb25nMTYgeCwgdWxvbmcxNiB5LCB1bG9uZzQgbWFzayk7CisKK2Zsb2F0NCBfX292bGQgX19jbmZuIHNodWZmbGUyKGZsb2F0MiB4LCBmbG9hdDIgeSwgdWludDQgbWFzayk7CitmbG9hdDQgX19vdmxkIF9fY25mbiBzaHVmZmxlMihmbG9hdDQgeCwgZmxvYXQ0IHksIHVpbnQ0IG1hc2spOworZmxvYXQ0IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIoZmxvYXQ4IHgsIGZsb2F0OCB5LCB1aW50NCBtYXNrKTsKK2Zsb2F0NCBfX292bGQgX19jbmZuIHNodWZmbGUyKGZsb2F0MTYgeCwgZmxvYXQxNiB5LCB1aW50NCBtYXNrKTsKKworY2hhcjggX19vdmxkIF9fY25mbiBzaHVmZmxlMihjaGFyMiB4LCBjaGFyMiB5LCB1Y2hhcjggbWFzayk7CitjaGFyOCBfX292bGQgX19jbmZuIHNodWZmbGUyKGNoYXI0IHgsIGNoYXI0IHksIHVjaGFyOCBtYXNrKTsKK2NoYXI4IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIoY2hhcjggeCwgY2hhcjggeSwgdWNoYXI4IG1hc2spOworY2hhcjggX19vdmxkIF9fY25mbiBzaHVmZmxlMihjaGFyMTYgeCwgY2hhcjE2IHksIHVjaGFyOCBtYXNrKTsKKwordWNoYXI4IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIodWNoYXIyIHgsIHVjaGFyMiB5LCB1Y2hhcjggbWFzayk7Cit1Y2hhcjggX19vdmxkIF9fY25mbiBzaHVmZmxlMih1Y2hhcjQgeCwgdWNoYXI0IHksIHVjaGFyOCBtYXNrKTsKK3VjaGFyOCBfX292bGQgX19jbmZuIHNodWZmbGUyKHVjaGFyOCB4LCB1Y2hhcjggeSwgdWNoYXI4IG1hc2spOwordWNoYXI4IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIodWNoYXIxNiB4LCB1Y2hhcjE2IHksIHVjaGFyOCBtYXNrKTsKKworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIoc2hvcnQyIHgsIHNob3J0MiB5LCB1c2hvcnQ4IG1hc2spOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIoc2hvcnQ0IHgsIHNob3J0NCB5LCB1c2hvcnQ4IG1hc2spOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIoc2hvcnQ4IHgsIHNob3J0OCB5LCB1c2hvcnQ4IG1hc2spOworc2hvcnQ4IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIoc2hvcnQxNiB4LCBzaG9ydDE2IHksIHVzaG9ydDggbWFzayk7CisKK3VzaG9ydDggX19vdmxkIF9fY25mbiBzaHVmZmxlMih1c2hvcnQyIHgsIHVzaG9ydDIgeSwgdXNob3J0OCBtYXNrKTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBzaHVmZmxlMih1c2hvcnQ0IHgsIHVzaG9ydDQgeSwgdXNob3J0OCBtYXNrKTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBzaHVmZmxlMih1c2hvcnQ4IHgsIHVzaG9ydDggeSwgdXNob3J0OCBtYXNrKTsKK3VzaG9ydDggX19vdmxkIF9fY25mbiBzaHVmZmxlMih1c2hvcnQxNiB4LCB1c2hvcnQxNiB5LCB1c2hvcnQ4IG1hc2spOworCitpbnQ4IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIoaW50MiB4LCBpbnQyIHksIHVpbnQ4IG1hc2spOworaW50OCBfX292bGQgX19jbmZuIHNodWZmbGUyKGludDQgeCwgaW50NCB5LCB1aW50OCBtYXNrKTsKK2ludDggX19vdmxkIF9fY25mbiBzaHVmZmxlMihpbnQ4IHgsIGludDggeSwgdWludDggbWFzayk7CitpbnQ4IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIoaW50MTYgeCwgaW50MTYgeSwgdWludDggbWFzayk7CisKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIodWludDIgeCwgdWludDIgeSwgdWludDggbWFzayk7Cit1aW50OCBfX292bGQgX19jbmZuIHNodWZmbGUyKHVpbnQ0IHgsIHVpbnQ0IHksIHVpbnQ4IG1hc2spOwordWludDggX19vdmxkIF9fY25mbiBzaHVmZmxlMih1aW50OCB4LCB1aW50OCB5LCB1aW50OCBtYXNrKTsKK3VpbnQ4IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIodWludDE2IHgsIHVpbnQxNiB5LCB1aW50OCBtYXNrKTsKKworbG9uZzggX19vdmxkIF9fY25mbiBzaHVmZmxlMihsb25nMiB4LCBsb25nMiB5LCB1bG9uZzggbWFzayk7Citsb25nOCBfX292bGQgX19jbmZuIHNodWZmbGUyKGxvbmc0IHgsIGxvbmc0IHksIHVsb25nOCBtYXNrKTsKK2xvbmc4IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIobG9uZzggeCwgbG9uZzggeSwgdWxvbmc4IG1hc2spOworbG9uZzggX19vdmxkIF9fY25mbiBzaHVmZmxlMihsb25nMTYgeCwgbG9uZzE2IHksIHVsb25nOCBtYXNrKTsKKwordWxvbmc4IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIodWxvbmcyIHgsIHVsb25nMiB5LCB1bG9uZzggbWFzayk7Cit1bG9uZzggX19vdmxkIF9fY25mbiBzaHVmZmxlMih1bG9uZzQgeCwgdWxvbmc0IHksIHVsb25nOCBtYXNrKTsKK3Vsb25nOCBfX292bGQgX19jbmZuIHNodWZmbGUyKHVsb25nOCB4LCB1bG9uZzggeSwgdWxvbmc4IG1hc2spOwordWxvbmc4IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIodWxvbmcxNiB4LCB1bG9uZzE2IHksIHVsb25nOCBtYXNrKTsKKworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIoZmxvYXQyIHgsIGZsb2F0MiB5LCB1aW50OCBtYXNrKTsKK2Zsb2F0OCBfX292bGQgX19jbmZuIHNodWZmbGUyKGZsb2F0NCB4LCBmbG9hdDQgeSwgdWludDggbWFzayk7CitmbG9hdDggX19vdmxkIF9fY25mbiBzaHVmZmxlMihmbG9hdDggeCwgZmxvYXQ4IHksIHVpbnQ4IG1hc2spOworZmxvYXQ4IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIoZmxvYXQxNiB4LCBmbG9hdDE2IHksIHVpbnQ4IG1hc2spOworCitjaGFyMTYgX19vdmxkIF9fY25mbiBzaHVmZmxlMihjaGFyMiB4LCBjaGFyMiB5LCB1Y2hhcjE2IG1hc2spOworY2hhcjE2IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIoY2hhcjQgeCwgY2hhcjQgeSwgdWNoYXIxNiBtYXNrKTsKK2NoYXIxNiBfX292bGQgX19jbmZuIHNodWZmbGUyKGNoYXI4IHgsIGNoYXI4IHksIHVjaGFyMTYgbWFzayk7CitjaGFyMTYgX19vdmxkIF9fY25mbiBzaHVmZmxlMihjaGFyMTYgeCwgY2hhcjE2IHksIHVjaGFyMTYgbWFzayk7CisKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBzaHVmZmxlMih1Y2hhcjIgeCwgdWNoYXIyIHksIHVjaGFyMTYgbWFzayk7Cit1Y2hhcjE2IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIodWNoYXI0IHgsIHVjaGFyNCB5LCB1Y2hhcjE2IG1hc2spOwordWNoYXIxNiBfX292bGQgX19jbmZuIHNodWZmbGUyKHVjaGFyOCB4LCB1Y2hhcjggeSwgdWNoYXIxNiBtYXNrKTsKK3VjaGFyMTYgX19vdmxkIF9fY25mbiBzaHVmZmxlMih1Y2hhcjE2IHgsIHVjaGFyMTYgeSwgdWNoYXIxNiBtYXNrKTsKKworc2hvcnQxNiBfX292bGQgX19jbmZuIHNodWZmbGUyKHNob3J0MiB4LCBzaG9ydDIgeSwgdXNob3J0MTYgbWFzayk7CitzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIoc2hvcnQ0IHgsIHNob3J0NCB5LCB1c2hvcnQxNiBtYXNrKTsKK3Nob3J0MTYgX19vdmxkIF9fY25mbiBzaHVmZmxlMihzaG9ydDggeCwgc2hvcnQ4IHksIHVzaG9ydDE2IG1hc2spOworc2hvcnQxNiBfX292bGQgX19jbmZuIHNodWZmbGUyKHNob3J0MTYgeCwgc2hvcnQxNiB5LCB1c2hvcnQxNiBtYXNrKTsKKwordXNob3J0MTYgX19vdmxkIF9fY25mbiBzaHVmZmxlMih1c2hvcnQyIHgsIHVzaG9ydDIgeSwgdXNob3J0MTYgbWFzayk7Cit1c2hvcnQxNiBfX292bGQgX19jbmZuIHNodWZmbGUyKHVzaG9ydDQgeCwgdXNob3J0NCB5LCB1c2hvcnQxNiBtYXNrKTsKK3VzaG9ydDE2IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIodXNob3J0OCB4LCB1c2hvcnQ4IHksIHVzaG9ydDE2IG1hc2spOwordXNob3J0MTYgX19vdmxkIF9fY25mbiBzaHVmZmxlMih1c2hvcnQxNiB4LCB1c2hvcnQxNiB5LCB1c2hvcnQxNiBtYXNrKTsKKworaW50MTYgX19vdmxkIF9fY25mbiBzaHVmZmxlMihpbnQyIHgsIGludDIgeSwgdWludDE2IG1hc2spOworaW50MTYgX19vdmxkIF9fY25mbiBzaHVmZmxlMihpbnQ0IHgsIGludDQgeSwgdWludDE2IG1hc2spOworaW50MTYgX19vdmxkIF9fY25mbiBzaHVmZmxlMihpbnQ4IHgsIGludDggeSwgdWludDE2IG1hc2spOworaW50MTYgX19vdmxkIF9fY25mbiBzaHVmZmxlMihpbnQxNiB4LCBpbnQxNiB5LCB1aW50MTYgbWFzayk7CisKK3VpbnQxNiBfX292bGQgX19jbmZuIHNodWZmbGUyKHVpbnQyIHgsIHVpbnQyIHksIHVpbnQxNiBtYXNrKTsKK3VpbnQxNiBfX292bGQgX19jbmZuIHNodWZmbGUyKHVpbnQ0IHgsIHVpbnQ0IHksIHVpbnQxNiBtYXNrKTsKK3VpbnQxNiBfX292bGQgX19jbmZuIHNodWZmbGUyKHVpbnQ4IHgsIHVpbnQ4IHksIHVpbnQxNiBtYXNrKTsKK3VpbnQxNiBfX292bGQgX19jbmZuIHNodWZmbGUyKHVpbnQxNiB4LCB1aW50MTYgeSwgdWludDE2IG1hc2spOworCitsb25nMTYgX19vdmxkIF9fY25mbiBzaHVmZmxlMihsb25nMiB4LCBsb25nMiB5LCB1bG9uZzE2IG1hc2spOworbG9uZzE2IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIobG9uZzQgeCwgbG9uZzQgeSwgdWxvbmcxNiBtYXNrKTsKK2xvbmcxNiBfX292bGQgX19jbmZuIHNodWZmbGUyKGxvbmc4IHgsIGxvbmc4IHksIHVsb25nMTYgbWFzayk7Citsb25nMTYgX19vdmxkIF9fY25mbiBzaHVmZmxlMihsb25nMTYgeCwgbG9uZzE2IHksIHVsb25nMTYgbWFzayk7CisKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBzaHVmZmxlMih1bG9uZzIgeCwgdWxvbmcyIHksIHVsb25nMTYgbWFzayk7Cit1bG9uZzE2IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIodWxvbmc0IHgsIHVsb25nNCB5LCB1bG9uZzE2IG1hc2spOwordWxvbmcxNiBfX292bGQgX19jbmZuIHNodWZmbGUyKHVsb25nOCB4LCB1bG9uZzggeSwgdWxvbmcxNiBtYXNrKTsKK3Vsb25nMTYgX19vdmxkIF9fY25mbiBzaHVmZmxlMih1bG9uZzE2IHgsIHVsb25nMTYgeSwgdWxvbmcxNiBtYXNrKTsKKworZmxvYXQxNiBfX292bGQgX19jbmZuIHNodWZmbGUyKGZsb2F0MiB4LCBmbG9hdDIgeSwgdWludDE2IG1hc2spOworZmxvYXQxNiBfX292bGQgX19jbmZuIHNodWZmbGUyKGZsb2F0NCB4LCBmbG9hdDQgeSwgdWludDE2IG1hc2spOworZmxvYXQxNiBfX292bGQgX19jbmZuIHNodWZmbGUyKGZsb2F0OCB4LCBmbG9hdDggeSwgdWludDE2IG1hc2spOworZmxvYXQxNiBfX292bGQgX19jbmZuIHNodWZmbGUyKGZsb2F0MTYgeCwgZmxvYXQxNiB5LCB1aW50MTYgbWFzayk7CisKKyNpZmRlZiBjbF9raHJfZnA2NAorZG91YmxlMiBfX292bGQgX19jbmZuIHNodWZmbGUyKGRvdWJsZTIgeCwgZG91YmxlMiB5LCB1bG9uZzIgbWFzayk7Citkb3VibGUyIF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIoZG91YmxlNCB4LCBkb3VibGU0IHksIHVsb25nMiBtYXNrKTsKK2RvdWJsZTIgX19vdmxkIF9fY25mbiBzaHVmZmxlMihkb3VibGU4IHgsIGRvdWJsZTggeSwgdWxvbmcyIG1hc2spOworZG91YmxlMiBfX292bGQgX19jbmZuIHNodWZmbGUyKGRvdWJsZTE2IHgsIGRvdWJsZTE2IHksIHVsb25nMiBtYXNrKTsKKworZG91YmxlNCBfX292bGQgX19jbmZuIHNodWZmbGUyKGRvdWJsZTIgeCwgZG91YmxlMiB5LCB1bG9uZzQgbWFzayk7Citkb3VibGU0IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIoZG91YmxlNCB4LCBkb3VibGU0IHksIHVsb25nNCBtYXNrKTsKK2RvdWJsZTQgX19vdmxkIF9fY25mbiBzaHVmZmxlMihkb3VibGU4IHgsIGRvdWJsZTggeSwgdWxvbmc0IG1hc2spOworZG91YmxlNCBfX292bGQgX19jbmZuIHNodWZmbGUyKGRvdWJsZTE2IHgsIGRvdWJsZTE2IHksIHVsb25nNCBtYXNrKTsKKworZG91YmxlOCBfX292bGQgX19jbmZuIHNodWZmbGUyKGRvdWJsZTIgeCwgZG91YmxlMiB5LCB1bG9uZzggbWFzayk7Citkb3VibGU4IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIoZG91YmxlNCB4LCBkb3VibGU0IHksIHVsb25nOCBtYXNrKTsKK2RvdWJsZTggX19vdmxkIF9fY25mbiBzaHVmZmxlMihkb3VibGU4IHgsIGRvdWJsZTggeSwgdWxvbmc4IG1hc2spOworZG91YmxlOCBfX292bGQgX19jbmZuIHNodWZmbGUyKGRvdWJsZTE2IHgsIGRvdWJsZTE2IHksIHVsb25nOCBtYXNrKTsKKworZG91YmxlMTYgX19vdmxkIF9fY25mbiBzaHVmZmxlMihkb3VibGUyIHgsIGRvdWJsZTIgeSwgdWxvbmcxNiBtYXNrKTsKK2RvdWJsZTE2IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIoZG91YmxlNCB4LCBkb3VibGU0IHksIHVsb25nMTYgbWFzayk7Citkb3VibGUxNiBfX292bGQgX19jbmZuIHNodWZmbGUyKGRvdWJsZTggeCwgZG91YmxlOCB5LCB1bG9uZzE2IG1hc2spOworZG91YmxlMTYgX19vdmxkIF9fY25mbiBzaHVmZmxlMihkb3VibGUxNiB4LCBkb3VibGUxNiB5LCB1bG9uZzE2IG1hc2spOworI2VuZGlmIC8vY2xfa2hyX2ZwNjQKKworI2lmZGVmIGNsX2tocl9mcDE2CitoYWxmMiBfX292bGQgX19jbmZuIHNodWZmbGUyKGhhbGYyIHgsIGhhbGYyIHksIHVzaG9ydDIgbWFzayk7CitoYWxmMiBfX292bGQgX19jbmZuIHNodWZmbGUyKGhhbGY0IHgsIGhhbGY0IHksIHVzaG9ydDIgbWFzayk7CitoYWxmMiBfX292bGQgX19jbmZuIHNodWZmbGUyKGhhbGY4IHgsIGhhbGY4IHksIHVzaG9ydDIgbWFzayk7CitoYWxmMiBfX292bGQgX19jbmZuIHNodWZmbGUyKGhhbGYxNiB4LCBoYWxmMTYgeSwgdXNob3J0MiBtYXNrKTsKKworaGFsZjQgX19vdmxkIF9fY25mbiBzaHVmZmxlMihoYWxmMiB4LCBoYWxmMiB5LCB1c2hvcnQ0IG1hc2spOworaGFsZjQgX19vdmxkIF9fY25mbiBzaHVmZmxlMihoYWxmNCB4LCBoYWxmNCB5LCB1c2hvcnQ0IG1hc2spOworaGFsZjQgX19vdmxkIF9fY25mbiBzaHVmZmxlMihoYWxmOCB4LCBoYWxmOCB5LCB1c2hvcnQ0IG1hc2spOworaGFsZjQgX19vdmxkIF9fY25mbiBzaHVmZmxlMihoYWxmMTYgeCwgaGFsZjE2IHksIHVzaG9ydDQgbWFzayk7CisKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIoaGFsZjIgeCwgaGFsZjIgeSwgdXNob3J0OCBtYXNrKTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIoaGFsZjQgeCwgaGFsZjQgeSwgdXNob3J0OCBtYXNrKTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIoaGFsZjggeCwgaGFsZjggeSwgdXNob3J0OCBtYXNrKTsKK2hhbGY4IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIoaGFsZjE2IHgsIGhhbGYxNiB5LCB1c2hvcnQ4IG1hc2spOworCitoYWxmMTYgX19vdmxkIF9fY25mbiBzaHVmZmxlMihoYWxmMiB4LCBoYWxmMiB5LCB1c2hvcnQxNiBtYXNrKTsKK2hhbGYxNiBfX292bGQgX19jbmZuIHNodWZmbGUyKGhhbGY0IHgsIGhhbGY0IHksIHVzaG9ydDE2IG1hc2spOworaGFsZjE2IF9fb3ZsZCBfX2NuZm4gc2h1ZmZsZTIoaGFsZjggeCwgaGFsZjggeSwgdXNob3J0MTYgbWFzayk7CitoYWxmMTYgX19vdmxkIF9fY25mbiBzaHVmZmxlMihoYWxmMTYgeCwgaGFsZjE2IHksIHVzaG9ydDE2IG1hc2spOworI2VuZGlmIC8vY2xfa2hyX2ZwMTYKKworLy8gT3BlbkNMIHYxLjIgczYuMTIuMTMsIHYyLjAgczYuMTMuMTMgLSBwcmludGYKKworaW50IHByaW50ZihfX2NvbnN0YW50IGNvbnN0IGNoYXIqIHN0LCAuLi4pOworCisvLyBPcGVuQ0wgdjEuMSBzNi4xMS4zLCB2MS4yIHM2LjEyLjE0LCB2Mi4wIHM2LjEzLjE0IC0gSW1hZ2UgUmVhZCBhbmQgV3JpdGUgRnVuY3Rpb25zCisKKy8vIFRoZXNlIHZhbHVlcyBuZWVkIHRvIG1hdGNoIHRoZSBydW50aW1lIGVxdWl2YWxlbnQKKy8vCisvLyBBZGRyZXNzaW5nIE1vZGUuCisvLworI2RlZmluZSBDTEtfQUREUkVTU19OT05FICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ0xLX0FERFJFU1NfQ0xBTVBfVE9fRURHRSAgICAgICAyCisjZGVmaW5lIENMS19BRERSRVNTX0NMQU1QICAgICAgICAgICAgICAgNAorI2RlZmluZSBDTEtfQUREUkVTU19SRVBFQVQgICAgICAgICAgICAgIDYKKyNkZWZpbmUgQ0xLX0FERFJFU1NfTUlSUk9SRURfUkVQRUFUICAgICA4CisKKy8vCisvLyBDb29yZGluYXRpb24gTm9ybWFsaXphdGlvbgorLy8KKyNkZWZpbmUgQ0xLX05PUk1BTElaRURfQ09PUkRTX0ZBTFNFICAgICAwCisjZGVmaW5lIENMS19OT1JNQUxJWkVEX0NPT1JEU19UUlVFICAgICAgMQorCisvLworLy8gRmlsdGVyaW5nIE1vZGUuCisvLworI2RlZmluZSBDTEtfRklMVEVSX05FQVJFU1QgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgQ0xLX0ZJTFRFUl9MSU5FQVIgICAgICAgICAgICAgICAweDIwCisKKy8qKgorICogVXNlIHRoZSBjb29yZGluYXRlIChjb29yZC54eSkgdG8gZG8gYW4gZWxlbWVudCBsb29rdXAgaW4KKyAqIHRoZSAyRCBpbWFnZSBvYmplY3Qgc3BlY2lmaWVkIGJ5IGltYWdlLgorICoKKyAqIFVzZSB0aGUgY29vcmRpbmF0ZSAoY29vcmQueCwgY29vcmQueSwgY29vcmQueikgdG8gZG8KKyAqIGFuIGVsZW1lbnQgbG9va3VwIGluIHRoZSAzRCBpbWFnZSBvYmplY3Qgc3BlY2lmaWVkCisgKiBieSBpbWFnZS4gY29vcmQudyBpcyBpZ25vcmVkLgorICoKKyAqIFVzZSB0aGUgY29vcmRpbmF0ZSAoY29vcmQueikgdG8gaW5kZXggaW50byB0aGUKKyAqIDJEIGltYWdlIGFycmF5IG9iamVjdCBzcGVjaWZpZWQgYnkgaW1hZ2VfYXJyYXkKKyAqIGFuZCAoY29vcmQueCwgY29vcmQueSkgdG8gZG8gYW4gZWxlbWVudCBsb29rdXAgaW4KKyAqIHRoZSAyRCBpbWFnZSBvYmplY3Qgc3BlY2lmaWVkIGJ5IGltYWdlLgorICoKKyAqIFVzZSB0aGUgY29vcmRpbmF0ZSAoeCkgdG8gZG8gYW4gZWxlbWVudCBsb29rdXAgaW4KKyAqIHRoZSAxRCBpbWFnZSBvYmplY3Qgc3BlY2lmaWVkIGJ5IGltYWdlLgorICoKKyAqIFVzZSB0aGUgY29vcmRpbmF0ZSAoY29vcmQueSkgdG8gaW5kZXggaW50byB0aGUKKyAqIDFEIGltYWdlIGFycmF5IG9iamVjdCBzcGVjaWZpZWQgYnkgaW1hZ2VfYXJyYXkKKyAqIGFuZCAoY29vcmQueCkgdG8gZG8gYW4gZWxlbWVudCBsb29rdXAgaW4KKyAqIHRoZSAxRCBpbWFnZSBvYmplY3Qgc3BlY2lmaWVkIGJ5IGltYWdlLgorICoKKyAqIFVzZSB0aGUgY29vcmRpbmF0ZSAoY29vZC54eSkgYW5kIHNhbXBsZSB0byBkbyBhbgorICogZWxlbWVudCBsb29rdXAgaW4gdGhlIDJEIG11bHRpLXNhbXBsZSBpbWFnZSBzcGVjaWZpZWQKKyAqIGJ5IGltYWdlLgorICoKKyAqIFVzZSBjb29yZC54eSBhbmQgc2FtcGxlIHRvIGRvIGFuIGVsZW1lbnQKKyAqIGxvb2t1cCBpbiB0aGUgMkQgbXVsdGktc2FtcGxlIGltYWdlIGxheWVyCisgKiBpZGVudGlmaWVkIGJ5IGluZGV4IGNvb3JkLnogaW4gdGhlIDJEIG11bHRpLXNhbXBsZQorICogaW1hZ2UgYXJyYXkgc3BlY2lmaWVkIGJ5IGltYWdlLgorICoKKyAqIEZvciBtaXBtYXAgaW1hZ2VzLCB1c2UgdGhlIG1pcC1sZXZlbCBzcGVjaWZpZWQgYnkKKyAqIHRoZSBMZXZlbC1vZi1EZXRhaWwgKGxvZCkgb3IgdXNlIGdyYWRpZW50cyBmb3IgTE9ECisgKiBjb21wdXRhdGlvbi4KKyAqCisgKiByZWFkX2ltYWdlZiByZXR1cm5zIGZsb2F0aW5nLXBvaW50IHZhbHVlcyBpbiB0aGUKKyAqIHJhbmdlIFswLjAgLi4uIDEuMF0gZm9yIGltYWdlIG9iamVjdHMgY3JlYXRlZCB3aXRoCisgKiBpbWFnZV9jaGFubmVsX2RhdGFfdHlwZSBzZXQgdG8gb25lIG9mIHRoZSBwcmVkZWZpbmVkCisgKiBwYWNrZWQgZm9ybWF0cyBvciBDTF9VTk9STV9JTlQ4LCBvcgorICogQ0xfVU5PUk1fSU5UMTYuCisgKgorICogcmVhZF9pbWFnZWYgcmV0dXJucyBmbG9hdGluZy1wb2ludCB2YWx1ZXMgaW4gdGhlCisgKiByYW5nZSBbLTEuMCAuLi4gMS4wXSBmb3IgaW1hZ2Ugb2JqZWN0cyBjcmVhdGVkIHdpdGgKKyAqIGltYWdlX2NoYW5uZWxfZGF0YV90eXBlIHNldCB0byBDTF9TTk9STV9JTlQ4LAorICogb3IgQ0xfU05PUk1fSU5UMTYuCisgKgorICogcmVhZF9pbWFnZWYgcmV0dXJucyBmbG9hdGluZy1wb2ludCB2YWx1ZXMgZm9yIGltYWdlCisgKiBvYmplY3RzIGNyZWF0ZWQgd2l0aCBpbWFnZV9jaGFubmVsX2RhdGFfdHlwZSBzZXQgdG8KKyAqIENMX0hBTEZfRkxPQVQgb3IgQ0xfRkxPQVQuCisgKgorICogcmVhZF9pbWFnZWkgYW5kIHJlYWRfaW1hZ2V1aSByZXR1cm4KKyAqIHVubm9ybWFsaXplZCBzaWduZWQgaW50ZWdlciBhbmQgdW5zaWduZWQgaW50ZWdlcgorICogdmFsdWVzIHJlc3BlY3RpdmVseS4gRWFjaCBjaGFubmVsIHdpbGwgYmUgc3RvcmVkIGluIGEKKyAqIDMyLWJpdCBpbnRlZ2VyLgorICoKKyAqIHJlYWRfaW1hZ2VpIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBpbWFnZSBvYmplY3RzCisgKiBjcmVhdGVkIHdpdGggaW1hZ2VfY2hhbm5lbF9kYXRhX3R5cGUgc2V0IHRvIG9uZSBvZgorICogdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiBDTF9TSUdORURfSU5UOCwKKyAqIENMX1NJR05FRF9JTlQxNiBhbmQKKyAqIENMX1NJR05FRF9JTlQzMi4KKyAqIElmIHRoZSBpbWFnZV9jaGFubmVsX2RhdGFfdHlwZSBpcyBub3Qgb25lIG9mIHRoZQorICogYWJvdmUgdmFsdWVzLCB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IHJlYWRfaW1hZ2VpCisgKiBhcmUgdW5kZWZpbmVkLgorICoKKyAqIHJlYWRfaW1hZ2V1aSBjYW4gb25seSBiZSB1c2VkIHdpdGggaW1hZ2Ugb2JqZWN0cworICogY3JlYXRlZCB3aXRoIGltYWdlX2NoYW5uZWxfZGF0YV90eXBlIHNldCB0byBvbmUgb2YKKyAqIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogQ0xfVU5TSUdORURfSU5UOCwKKyAqIENMX1VOU0lHTkVEX0lOVDE2IGFuZAorICogQ0xfVU5TSUdORURfSU5UMzIuCisgKiBJZiB0aGUgaW1hZ2VfY2hhbm5lbF9kYXRhX3R5cGUgaXMgbm90IG9uZSBvZiB0aGUKKyAqIGFib3ZlIHZhbHVlcywgdGhlIHZhbHVlcyByZXR1cm5lZCBieSByZWFkX2ltYWdldWkKKyAqIGFyZSB1bmRlZmluZWQuCisgKgorICogVGhlIHJlYWRfaW1hZ2V7aXx1aX0gY2FsbHMgc3VwcG9ydCBhIG5lYXJlc3QgZmlsdGVyCisgKiBvbmx5LiBUaGUgZmlsdGVyX21vZGUgc3BlY2lmaWVkIGluIHNhbXBsZXIKKyAqIG11c3QgYmUgc2V0IHRvIENMS19GSUxURVJfTkVBUkVTVDsgb3RoZXJ3aXNlCisgKiB0aGUgdmFsdWVzIHJldHVybmVkIGFyZSB1bmRlZmluZWQuCisgCisgKiBUaGUgcmVhZF9pbWFnZXtmfGl8dWl9IGNhbGxzIHRoYXQgdGFrZQorICogaW50ZWdlciBjb29yZGluYXRlcyBtdXN0IHVzZSBhIHNhbXBsZXIgd2l0aAorICogbm9ybWFsaXplZCBjb29yZGluYXRlcyBzZXQgdG8KKyAqIENMS19OT1JNQUxJWkVEX0NPT1JEU19GQUxTRSBhbmQKKyAqIGFkZHJlc3NpbmcgbW9kZSBzZXQgdG8KKyAqIENMS19BRERSRVNTX0NMQU1QX1RPX0VER0UsCisgKiBDTEtfQUREUkVTU19DTEFNUCBvciBDTEtfQUREUkVTU19OT05FOworICogb3RoZXJ3aXNlIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYXJlIHVuZGVmaW5lZC4KKyAqCisgKiBWYWx1ZXMgcmV0dXJuZWQgYnkgcmVhZF9pbWFnZWYgZm9yIGltYWdlIG9iamVjdHMKKyAqIHdpdGggaW1hZ2VfY2hhbm5lbF9kYXRhX3R5cGUgdmFsdWVzIG5vdCBzcGVjaWZpZWQKKyAqIGluIHRoZSBkZXNjcmlwdGlvbiBhYm92ZSBhcmUgdW5kZWZpbmVkLgorICovCisKK2Zsb2F0NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWYocmVhZF9vbmx5IGltYWdlMmRfdCBpbWFnZSwgc2FtcGxlcl90IHNhbXBsZXIsIGludDIgY29vcmQpOworZmxvYXQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdlZihyZWFkX29ubHkgaW1hZ2UyZF90IGltYWdlLCBzYW1wbGVyX3Qgc2FtcGxlciwgZmxvYXQyIGNvb3JkKTsKKworaW50NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWkocmVhZF9vbmx5IGltYWdlMmRfdCBpbWFnZSwgc2FtcGxlcl90IHNhbXBsZXIsIGludDIgY29vcmQpOworaW50NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWkocmVhZF9vbmx5IGltYWdlMmRfdCBpbWFnZSwgc2FtcGxlcl90IHNhbXBsZXIsIGZsb2F0MiBjb29yZCk7Cit1aW50NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZXVpKHJlYWRfb25seSBpbWFnZTJkX3QgaW1hZ2UsIHNhbXBsZXJfdCBzYW1wbGVyLCBpbnQyIGNvb3JkKTsKK3VpbnQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdldWkocmVhZF9vbmx5IGltYWdlMmRfdCBpbWFnZSwgc2FtcGxlcl90IHNhbXBsZXIsIGZsb2F0MiBjb29yZCk7CisKK2Zsb2F0NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWYocmVhZF9vbmx5IGltYWdlM2RfdCBpbWFnZSwgc2FtcGxlcl90IHNhbXBsZXIsIGludDQgY29vcmQpOworZmxvYXQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdlZihyZWFkX29ubHkgaW1hZ2UzZF90IGltYWdlLCBzYW1wbGVyX3Qgc2FtcGxlciwgZmxvYXQ0IGNvb3JkKTsKKworaW50NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWkocmVhZF9vbmx5IGltYWdlM2RfdCBpbWFnZSwgc2FtcGxlcl90IHNhbXBsZXIsIGludDQgY29vcmQpOworaW50NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWkocmVhZF9vbmx5IGltYWdlM2RfdCBpbWFnZSwgc2FtcGxlcl90IHNhbXBsZXIsIGZsb2F0NCBjb29yZCk7Cit1aW50NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZXVpKHJlYWRfb25seSBpbWFnZTNkX3QgaW1hZ2UsIHNhbXBsZXJfdCBzYW1wbGVyLCBpbnQ0IGNvb3JkKTsKK3VpbnQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdldWkocmVhZF9vbmx5IGltYWdlM2RfdCBpbWFnZSwgc2FtcGxlcl90IHNhbXBsZXIsIGZsb2F0NCBjb29yZCk7CisKK2Zsb2F0NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWYocmVhZF9vbmx5IGltYWdlMmRfYXJyYXlfdCBpbWFnZV9hcnJheSwgc2FtcGxlcl90IHNhbXBsZXIsIGludDQgY29vcmQpOworZmxvYXQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdlZihyZWFkX29ubHkgaW1hZ2UyZF9hcnJheV90IGltYWdlX2FycmF5LCBzYW1wbGVyX3Qgc2FtcGxlciwgZmxvYXQ0IGNvb3JkKTsKKworaW50NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWkocmVhZF9vbmx5IGltYWdlMmRfYXJyYXlfdCBpbWFnZV9hcnJheSwgc2FtcGxlcl90IHNhbXBsZXIsIGludDQgY29vcmQpOworaW50NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWkocmVhZF9vbmx5IGltYWdlMmRfYXJyYXlfdCBpbWFnZV9hcnJheSwgc2FtcGxlcl90IHNhbXBsZXIsIGZsb2F0NCBjb29yZCk7Cit1aW50NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZXVpKHJlYWRfb25seSBpbWFnZTJkX2FycmF5X3QgaW1hZ2VfYXJyYXksIHNhbXBsZXJfdCBzYW1wbGVyLCBpbnQ0IGNvb3JkKTsKK3VpbnQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdldWkocmVhZF9vbmx5IGltYWdlMmRfYXJyYXlfdCBpbWFnZV9hcnJheSwgc2FtcGxlcl90IHNhbXBsZXIsIGZsb2F0NCBjb29yZCk7CisKK2Zsb2F0NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWYocmVhZF9vbmx5IGltYWdlMWRfdCBpbWFnZSwgc2FtcGxlcl90IHNhbXBsZXIsIGludCBjb29yZCk7CitmbG9hdDQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VmKHJlYWRfb25seSBpbWFnZTFkX3QgaW1hZ2UsIHNhbXBsZXJfdCBzYW1wbGVyLCBmbG9hdCBjb29yZCk7CisKK2ludDQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VpKHJlYWRfb25seSBpbWFnZTFkX3QgaW1hZ2UsIHNhbXBsZXJfdCBzYW1wbGVyLCBpbnQgY29vcmQpOworaW50NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWkocmVhZF9vbmx5IGltYWdlMWRfdCBpbWFnZSwgc2FtcGxlcl90IHNhbXBsZXIsIGZsb2F0IGNvb3JkKTsKK3VpbnQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdldWkocmVhZF9vbmx5IGltYWdlMWRfdCBpbWFnZSwgc2FtcGxlcl90IHNhbXBsZXIsIGludCBjb29yZCk7Cit1aW50NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZXVpKHJlYWRfb25seSBpbWFnZTFkX3QgaW1hZ2UsIHNhbXBsZXJfdCBzYW1wbGVyLCBmbG9hdCBjb29yZCk7CisKK2Zsb2F0NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWYocmVhZF9vbmx5IGltYWdlMWRfYXJyYXlfdCBpbWFnZV9hcnJheSwgc2FtcGxlcl90IHNhbXBsZXIsIGludDIgY29vcmQpOworZmxvYXQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdlZihyZWFkX29ubHkgaW1hZ2UxZF9hcnJheV90IGltYWdlX2FycmF5LCBzYW1wbGVyX3Qgc2FtcGxlciwgZmxvYXQyIGNvb3JkKTsKKworaW50NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWkocmVhZF9vbmx5IGltYWdlMWRfYXJyYXlfdCBpbWFnZV9hcnJheSwgc2FtcGxlcl90IHNhbXBsZXIsIGludDIgY29vcmQpOworaW50NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWkocmVhZF9vbmx5IGltYWdlMWRfYXJyYXlfdCBpbWFnZV9hcnJheSwgc2FtcGxlcl90IHNhbXBsZXIsIGZsb2F0MiBjb29yZCk7Cit1aW50NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZXVpKHJlYWRfb25seSBpbWFnZTFkX2FycmF5X3QgaW1hZ2VfYXJyYXksIHNhbXBsZXJfdCBzYW1wbGVyLCBpbnQyIGNvb3JkKTsKK3VpbnQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdldWkocmVhZF9vbmx5IGltYWdlMWRfYXJyYXlfdCBpbWFnZV9hcnJheSwgc2FtcGxlcl90IHNhbXBsZXIsIGZsb2F0MiBjb29yZCk7CisKKyNpZmRlZiBjbF9raHJfZGVwdGhfaW1hZ2VzCitmbG9hdCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWYocmVhZF9vbmx5IGltYWdlMmRfZGVwdGhfdCBpbWFnZSwgc2FtcGxlcl90IHNhbXBsZXIsIGZsb2F0MiBjb29yZCk7CitmbG9hdCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWYocmVhZF9vbmx5IGltYWdlMmRfZGVwdGhfdCBpbWFnZSwgc2FtcGxlcl90IHNhbXBsZXIsIGludDIgY29vcmQpOworCitmbG9hdCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWYocmVhZF9vbmx5IGltYWdlMmRfYXJyYXlfZGVwdGhfdCBpbWFnZSwgc2FtcGxlcl90IHNhbXBsZXIsIGZsb2F0NCBjb29yZCk7CitmbG9hdCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWYocmVhZF9vbmx5IGltYWdlMmRfYXJyYXlfZGVwdGhfdCBpbWFnZSwgc2FtcGxlcl90IHNhbXBsZXIsIGludDQgY29vcmQpOworI2VuZGlmIC8vY2xfa2hyX2RlcHRoX2ltYWdlcworCisjaWYgZGVmaW5lZChjbF9raHJfZ2xfbXNhYV9zaGFyaW5nKQorZmxvYXQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdlZihyZWFkX29ubHkgaW1hZ2UyZF9tc2FhX3QgaW1hZ2UsIGludDIgY29vcmQsIGludCBzYW1wbGUpOworaW50NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWkocmVhZF9vbmx5IGltYWdlMmRfbXNhYV90IGltYWdlLCBpbnQyIGNvb3JkLCBpbnQgc2FtcGxlKTsKK3VpbnQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdldWkocmVhZF9vbmx5IGltYWdlMmRfbXNhYV90IGltYWdlLCBpbnQyIGNvb3JkLCBpbnQgc2FtcGxlKTsKKworZmxvYXQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VmKHJlYWRfb25seSBpbWFnZTJkX21zYWFfZGVwdGhfdCBpbWFnZSwgaW50MiBjb29yZCwgaW50IHNhbXBsZSk7CisKK2Zsb2F0NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWYocmVhZF9vbmx5IGltYWdlMmRfYXJyYXlfbXNhYV90IGltYWdlLCBpbnQ0IGNvb3JkLCBpbnQgc2FtcGxlKTsKK2ludDQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VpKHJlYWRfb25seSBpbWFnZTJkX2FycmF5X21zYWFfdCBpbWFnZSwgaW50NCBjb29yZCwgaW50IHNhbXBsZSk7Cit1aW50NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZXVpKHJlYWRfb25seSBpbWFnZTJkX2FycmF5X21zYWFfdCBpbWFnZSwgaW50NCBjb29yZCwgaW50IHNhbXBsZSk7CisKK2Zsb2F0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdlZihyZWFkX29ubHkgaW1hZ2UyZF9hcnJheV9tc2FhX2RlcHRoX3QgaW1hZ2UsIGludDQgY29vcmQsIGludCBzYW1wbGUpOworI2VuZGlmIC8vY2xfa2hyX2dsX21zYWFfc2hhcmluZworCisvLyBPcGVuQ0wgRXh0ZW5zaW9uIHYyLjAgczkuMTggLSBNaXBtYXBzCisjaWZkZWYgY2xfa2hyX21pcG1hcF9pbWFnZQorCitmbG9hdDQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VmKHJlYWRfb25seSBpbWFnZTFkX3QgaW1hZ2UsIHNhbXBsZXJfdCBzYW1wbGVyLCBmbG9hdCBjb29yZCwgZmxvYXQgbG9kKTsKK2ludDQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VpKHJlYWRfb25seSBpbWFnZTFkX3QgaW1hZ2UsIHNhbXBsZXJfdCBzYW1wbGVyLCBmbG9hdCBjb29yZCwgZmxvYXQgbG9kKTsKK3VpbnQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdldWkocmVhZF9vbmx5IGltYWdlMWRfdCBpbWFnZSwgc2FtcGxlcl90IHNhbXBsZXIsIGZsb2F0IGNvb3JkLCBmbG9hdCBsb2QpOworCitmbG9hdDQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VmKHJlYWRfb25seSBpbWFnZTFkX2FycmF5X3QgaW1hZ2VfYXJyYXksIHNhbXBsZXJfdCBzYW1wbGVyLCBmbG9hdDIgY29vcmQsIGZsb2F0IGxvZCk7CitpbnQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdlaShyZWFkX29ubHkgaW1hZ2UxZF9hcnJheV90IGltYWdlX2FycmF5LCBzYW1wbGVyX3Qgc2FtcGxlciwgZmxvYXQyIGNvb3JkLCBmbG9hdCBsb2QpOwordWludDQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2V1aShyZWFkX29ubHkgaW1hZ2UxZF9hcnJheV90IGltYWdlX2FycmF5LCBzYW1wbGVyX3Qgc2FtcGxlciwgZmxvYXQyIGNvb3JkLCBmbG9hdCBsb2QpOworCitmbG9hdDQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VmKHJlYWRfb25seSBpbWFnZTJkX3QgaW1hZ2UsIHNhbXBsZXJfdCBzYW1wbGVyLCBmbG9hdDIgY29vcmQsIGZsb2F0IGxvZCk7CitpbnQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdlaShyZWFkX29ubHkgaW1hZ2UyZF90IGltYWdlLCBzYW1wbGVyX3Qgc2FtcGxlciwgZmxvYXQyIGNvb3JkLCBmbG9hdCBsb2QpOwordWludDQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2V1aShyZWFkX29ubHkgaW1hZ2UyZF90IGltYWdlLCBzYW1wbGVyX3Qgc2FtcGxlciwgZmxvYXQyIGNvb3JkLCBmbG9hdCBsb2QpOworCitmbG9hdCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWYocmVhZF9vbmx5IGltYWdlMmRfZGVwdGhfdCBpbWFnZSwgc2FtcGxlcl90IHNhbXBsZXIsIGZsb2F0MiBjb29yZCwgZmxvYXQgbG9kKTsKKworZmxvYXQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdlZihyZWFkX29ubHkgaW1hZ2UyZF9hcnJheV90IGltYWdlX2FycmF5LCBzYW1wbGVyX3Qgc2FtcGxlciwgZmxvYXQ0IGNvb3JkLCBmbG9hdCBsb2QpOworaW50NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWkocmVhZF9vbmx5IGltYWdlMmRfYXJyYXlfdCBpbWFnZV9hcnJheSwgc2FtcGxlcl90IHNhbXBsZXIsIGZsb2F0NCBjb29yZCwgZmxvYXQgbG9kKTsKK3VpbnQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdldWkocmVhZF9vbmx5IGltYWdlMmRfYXJyYXlfdCBpbWFnZV9hcnJheSwgc2FtcGxlcl90IHNhbXBsZXIsIGZsb2F0NCBjb29yZCwgZmxvYXQgbG9kKTsKKworZmxvYXQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VmKHJlYWRfb25seSBpbWFnZTJkX2FycmF5X2RlcHRoX3QgaW1hZ2UsIHNhbXBsZXJfdCBzYW1wbGVyLCBmbG9hdDQgY29vcmQsIGZsb2F0IGxvZCk7CisKK2Zsb2F0NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWYocmVhZF9vbmx5IGltYWdlM2RfdCBpbWFnZSwgc2FtcGxlcl90IHNhbXBsZXIsIGZsb2F0NCBjb29yZCwgZmxvYXQgbG9kKTsKK2ludDQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VpKHJlYWRfb25seSBpbWFnZTNkX3QgaW1hZ2UsIHNhbXBsZXJfdCBzYW1wbGVyLCBmbG9hdDQgY29vcmQsIGZsb2F0IGxvZCk7Cit1aW50NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZXVpKHJlYWRfb25seSBpbWFnZTNkX3QgaW1hZ2UsIHNhbXBsZXJfdCBzYW1wbGVyLCBmbG9hdDQgY29vcmQsIGZsb2F0IGxvZCk7CisKK2Zsb2F0NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWYocmVhZF9vbmx5IGltYWdlMWRfdCBpbWFnZSwgc2FtcGxlcl90IHNhbXBsZXIsIGZsb2F0IGNvb3JkLCBmbG9hdCBncmFkaWVudFgsIGZsb2F0IGdyYWRpZW50WSk7CitpbnQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdlaShyZWFkX29ubHkgaW1hZ2UxZF90IGltYWdlLCBzYW1wbGVyX3Qgc2FtcGxlciwgZmxvYXQgY29vcmQsIGZsb2F0IGdyYWRpZW50WCwgZmxvYXQgZ3JhZGllbnRZKTsKK3VpbnQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdldWkocmVhZF9vbmx5IGltYWdlMWRfdCBpbWFnZSwgc2FtcGxlcl90IHNhbXBsZXIsIGZsb2F0IGNvb3JkLCBmbG9hdCBncmFkaWVudFgsIGZsb2F0IGdyYWRpZW50WSk7CisKK2Zsb2F0NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWYocmVhZF9vbmx5IGltYWdlMWRfYXJyYXlfdCBpbWFnZV9hcnJheSwgc2FtcGxlcl90IHNhbXBsZXIsIGZsb2F0MiBjb29yZCwgZmxvYXQgZ3JhZGllbnRYLCBmbG9hdCBncmFkaWVudFkpOworaW50NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWkocmVhZF9vbmx5IGltYWdlMWRfYXJyYXlfdCBpbWFnZV9hcnJheSwgc2FtcGxlcl90IHNhbXBsZXIsIGZsb2F0MiBjb29yZCwgZmxvYXQgZ3JhZGllbnRYLCBmbG9hdCBncmFkaWVudFkpOwordWludDQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2V1aShyZWFkX29ubHkgaW1hZ2UxZF9hcnJheV90IGltYWdlX2FycmF5LCBzYW1wbGVyX3Qgc2FtcGxlciwgZmxvYXQyIGNvb3JkLCBmbG9hdCBncmFkaWVudFgsIGZsb2F0IGdyYWRpZW50WSk7CisKK2Zsb2F0NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWYocmVhZF9vbmx5IGltYWdlMmRfdCBpbWFnZSwgc2FtcGxlcl90IHNhbXBsZXIsIGZsb2F0MiBjb29yZCwgZmxvYXQyIGdyYWRpZW50WCwgZmxvYXQyIGdyYWRpZW50WSk7CitpbnQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdlaShyZWFkX29ubHkgaW1hZ2UyZF90IGltYWdlLCBzYW1wbGVyX3Qgc2FtcGxlciwgZmxvYXQyIGNvb3JkLCBmbG9hdDIgZ3JhZGllbnRYLCBmbG9hdDIgZ3JhZGllbnRZKTsKK3VpbnQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdldWkocmVhZF9vbmx5IGltYWdlMmRfdCBpbWFnZSwgc2FtcGxlcl90IHNhbXBsZXIsIGZsb2F0MiBjb29yZCwgZmxvYXQyIGdyYWRpZW50WCwgZmxvYXQyIGdyYWRpZW50WSk7CisKK2Zsb2F0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdlZihyZWFkX29ubHkgaW1hZ2UyZF9kZXB0aF90IGltYWdlLCBzYW1wbGVyX3Qgc2FtcGxlciwgZmxvYXQyIGNvb3JkLCBmbG9hdDIgZ3JhZGllbnRYLCBmbG9hdDIgZ3JhZGllbnRZKTsKKworZmxvYXQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdlZihyZWFkX29ubHkgaW1hZ2UyZF9hcnJheV90IGltYWdlX2FycmF5LCBzYW1wbGVyX3Qgc2FtcGxlciwgZmxvYXQ0IGNvb3JkLCBmbG9hdDIgZ3JhZGllbnRYLCBmbG9hdDIgZ3JhZGllbnRZKTsKK2ludDQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VpKHJlYWRfb25seSBpbWFnZTJkX2FycmF5X3QgaW1hZ2VfYXJyYXksIHNhbXBsZXJfdCBzYW1wbGVyLCBmbG9hdDQgY29vcmQsIGZsb2F0MiBncmFkaWVudFgsIGZsb2F0MiBncmFkaWVudFkpOwordWludDQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2V1aShyZWFkX29ubHkgaW1hZ2UyZF9hcnJheV90IGltYWdlX2FycmF5LCBzYW1wbGVyX3Qgc2FtcGxlciwgZmxvYXQ0IGNvb3JkLCBmbG9hdDIgZ3JhZGllbnRYLCBmbG9hdDIgZ3JhZGllbnRZKTsKKworZmxvYXQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VmKHJlYWRfb25seSBpbWFnZTJkX2FycmF5X2RlcHRoX3QgaW1hZ2UsIHNhbXBsZXJfdCBzYW1wbGVyLCBmbG9hdDQgY29vcmQsIGZsb2F0MiBncmFkaWVudFgsIGZsb2F0MiBncmFkaWVudFkpOworCitmbG9hdDQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VmKHJlYWRfb25seSBpbWFnZTNkX3QgaW1hZ2UsIHNhbXBsZXJfdCBzYW1wbGVyLCBmbG9hdDQgY29vcmQsIGZsb2F0NCBncmFkaWVudFgsIGZsb2F0NCBncmFkaWVudFkpOworaW50NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWkocmVhZF9vbmx5IGltYWdlM2RfdCBpbWFnZSwgc2FtcGxlcl90IHNhbXBsZXIsIGZsb2F0NCBjb29yZCwgZmxvYXQ0IGdyYWRpZW50WCwgZmxvYXQ0IGdyYWRpZW50WSk7Cit1aW50NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZXVpKHJlYWRfb25seSBpbWFnZTNkX3QgaW1hZ2UsIHNhbXBsZXJfdCBzYW1wbGVyLCBmbG9hdDQgY29vcmQsIGZsb2F0NCBncmFkaWVudFgsIGZsb2F0NCBncmFkaWVudFkpOworCitmbG9hdDQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VmKHJlYWRfb25seSBpbWFnZTFkX3QgaW1hZ2UsIHNhbXBsZXJfdCBzYW1wbGVyLCBmbG9hdCBjb29yZCwgZmxvYXQgbG9kKTsKK2ludDQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VpKHJlYWRfb25seSBpbWFnZTFkX3QgaW1hZ2UsIHNhbXBsZXJfdCBzYW1wbGVyLCBmbG9hdCBjb29yZCwgZmxvYXQgbG9kKTsKK3VpbnQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdldWkocmVhZF9vbmx5IGltYWdlMWRfdCBpbWFnZSwgc2FtcGxlcl90IHNhbXBsZXIsIGZsb2F0IGNvb3JkLCBmbG9hdCBsb2QpOworCitmbG9hdDQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VmKHJlYWRfb25seSBpbWFnZTFkX2FycmF5X3QgaW1hZ2VfYXJyYXksIHNhbXBsZXJfdCBzYW1wbGVyLCBmbG9hdDIgY29vcmQsIGZsb2F0IGxvZCk7CitpbnQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdlaShyZWFkX29ubHkgaW1hZ2UxZF9hcnJheV90IGltYWdlX2FycmF5LCBzYW1wbGVyX3Qgc2FtcGxlciwgZmxvYXQyIGNvb3JkLCBmbG9hdCBsb2QpOwordWludDQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2V1aShyZWFkX29ubHkgaW1hZ2UxZF9hcnJheV90IGltYWdlX2FycmF5LCBzYW1wbGVyX3Qgc2FtcGxlciwgZmxvYXQyIGNvb3JkLCBmbG9hdCBsb2QpOworCitmbG9hdDQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VmKHJlYWRfb25seSBpbWFnZTJkX3QgaW1hZ2UsIHNhbXBsZXJfdCBzYW1wbGVyLCBmbG9hdDIgY29vcmQsIGZsb2F0IGxvZCk7CitpbnQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdlaShyZWFkX29ubHkgaW1hZ2UyZF90IGltYWdlLCBzYW1wbGVyX3Qgc2FtcGxlciwgZmxvYXQyIGNvb3JkLCBmbG9hdCBsb2QpOwordWludDQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2V1aShyZWFkX29ubHkgaW1hZ2UyZF90IGltYWdlLCBzYW1wbGVyX3Qgc2FtcGxlciwgZmxvYXQyIGNvb3JkLCBmbG9hdCBsb2QpOworCitmbG9hdCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWYocmVhZF9vbmx5IGltYWdlMmRfZGVwdGhfdCBpbWFnZSwgc2FtcGxlcl90IHNhbXBsZXIsIGZsb2F0MiBjb29yZCwgZmxvYXQgbG9kKTsKKworZmxvYXQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdlZihyZWFkX29ubHkgaW1hZ2UyZF9hcnJheV90IGltYWdlX2FycmF5LCBzYW1wbGVyX3Qgc2FtcGxlciwgZmxvYXQ0IGNvb3JkLCBmbG9hdCBsb2QpOworaW50NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWkocmVhZF9vbmx5IGltYWdlMmRfYXJyYXlfdCBpbWFnZV9hcnJheSwgc2FtcGxlcl90IHNhbXBsZXIsIGZsb2F0NCBjb29yZCwgZmxvYXQgbG9kKTsKK3VpbnQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdldWkocmVhZF9vbmx5IGltYWdlMmRfYXJyYXlfdCBpbWFnZV9hcnJheSwgc2FtcGxlcl90IHNhbXBsZXIsIGZsb2F0NCBjb29yZCwgZmxvYXQgbG9kKTsKKworZmxvYXQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VmKHJlYWRfb25seSBpbWFnZTJkX2FycmF5X2RlcHRoX3QgaW1hZ2UsIHNhbXBsZXJfdCBzYW1wbGVyLCBmbG9hdDQgY29vcmQsIGZsb2F0IGxvZCk7CisKK2Zsb2F0NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWYocmVhZF9vbmx5IGltYWdlM2RfdCBpbWFnZSwgc2FtcGxlcl90IHNhbXBsZXIsIGZsb2F0NCBjb29yZCwgZmxvYXQgbG9kKTsKK2ludDQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VpKHJlYWRfb25seSBpbWFnZTNkX3QgaW1hZ2UsIHNhbXBsZXJfdCBzYW1wbGVyLCBmbG9hdDQgY29vcmQsIGZsb2F0IGxvZCk7Cit1aW50NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZXVpKHJlYWRfb25seSBpbWFnZTNkX3QgaW1hZ2UsIHNhbXBsZXJfdCBzYW1wbGVyLCBmbG9hdDQgY29vcmQsIGZsb2F0IGxvZCk7CisKKyNlbmRpZiAvL2NsX2tocl9taXBtYXBfaW1hZ2UKKworLyoqCisqIFNhbXBsZXItbGVzcyBJbWFnZSBBY2Nlc3MKKyovCisKK2Zsb2F0NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWYocmVhZF9vbmx5IGltYWdlMWRfdCBpbWFnZSwgaW50IGNvb3JkKTsKK2ludDQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VpKHJlYWRfb25seSBpbWFnZTFkX3QgaW1hZ2UsIGludCBjb29yZCk7Cit1aW50NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZXVpKHJlYWRfb25seSBpbWFnZTFkX3QgaW1hZ2UsIGludCBjb29yZCk7CisKK2Zsb2F0NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWYocmVhZF9vbmx5IGltYWdlMWRfYnVmZmVyX3QgaW1hZ2UsIGludCBjb29yZCk7CitpbnQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdlaShyZWFkX29ubHkgaW1hZ2UxZF9idWZmZXJfdCBpbWFnZSwgaW50IGNvb3JkKTsKK3VpbnQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdldWkocmVhZF9vbmx5IGltYWdlMWRfYnVmZmVyX3QgaW1hZ2UsIGludCBjb29yZCk7CisKK2Zsb2F0NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWYocmVhZF9vbmx5IGltYWdlMWRfYXJyYXlfdCBpbWFnZSwgaW50MiBjb29yZCk7CitpbnQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdlaShyZWFkX29ubHkgaW1hZ2UxZF9hcnJheV90IGltYWdlLCBpbnQyIGNvb3JkKTsKK3VpbnQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdldWkocmVhZF9vbmx5IGltYWdlMWRfYXJyYXlfdCBpbWFnZSwgaW50MiBjb29yZCk7CisKK2Zsb2F0NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWYocmVhZF9vbmx5IGltYWdlMmRfdCBpbWFnZSwgaW50MiBjb29yZCk7CitpbnQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdlaShyZWFkX29ubHkgaW1hZ2UyZF90IGltYWdlLCBpbnQyIGNvb3JkKTsKK3VpbnQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdldWkocmVhZF9vbmx5IGltYWdlMmRfdCBpbWFnZSwgaW50MiBjb29yZCk7CisKK2Zsb2F0NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWYocmVhZF9vbmx5IGltYWdlMmRfYXJyYXlfdCBpbWFnZSwgaW50NCBjb29yZCk7CitpbnQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdlaShyZWFkX29ubHkgaW1hZ2UyZF9hcnJheV90IGltYWdlLCBpbnQ0IGNvb3JkKTsKK3VpbnQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdldWkocmVhZF9vbmx5IGltYWdlMmRfYXJyYXlfdCBpbWFnZSwgaW50NCBjb29yZCk7CisKKyNpZmRlZiBjbF9raHJfZGVwdGhfaW1hZ2VzCitmbG9hdCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWYocmVhZF9vbmx5IGltYWdlMmRfZGVwdGhfdCBpbWFnZSwgaW50MiBjb29yZCk7CitmbG9hdCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWYocmVhZF9vbmx5IGltYWdlMmRfYXJyYXlfZGVwdGhfdCBpbWFnZSwgaW50NCBjb29yZCk7CisjZW5kaWYgLy9jbF9raHJfZGVwdGhfaW1hZ2VzCisKK2Zsb2F0NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWYocmVhZF9vbmx5IGltYWdlM2RfdCBpbWFnZSwgaW50NCBjb29yZCk7CitpbnQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdlaShyZWFkX29ubHkgaW1hZ2UzZF90IGltYWdlLCBpbnQ0IGNvb3JkKTsKK3VpbnQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdldWkocmVhZF9vbmx5IGltYWdlM2RfdCBpbWFnZSwgaW50NCBjb29yZCk7CisKKy8vIEltYWdlIHJlYWQgZnVuY3Rpb25zIHJldHVybmluZyBoYWxmNCB0eXBlCisjaWZkZWYgY2xfa2hyX2ZwMTYKK2hhbGY0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdlaChyZWFkX29ubHkgaW1hZ2UxZF90IGltYWdlLCBzYW1wbGVyX3Qgc2FtcGxlciwgaW50IGNvb3JkKTsKK2hhbGY0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdlaChyZWFkX29ubHkgaW1hZ2UxZF90IGltYWdlLCBzYW1wbGVyX3Qgc2FtcGxlciwgZmxvYXQgY29vcmQpOworaGFsZjQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VoKHJlYWRfb25seSBpbWFnZTFkX2FycmF5X3QgaW1hZ2UsIHNhbXBsZXJfdCBzYW1wbGVyLCBpbnQyIGNvb3JkKTsKK2hhbGY0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdlaChyZWFkX29ubHkgaW1hZ2UxZF9hcnJheV90IGltYWdlLCBzYW1wbGVyX3Qgc2FtcGxlciwgZmxvYXQyIGNvb3JkKTsKK2hhbGY0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdlaChyZWFkX29ubHkgaW1hZ2UyZF90IGltYWdlLCBzYW1wbGVyX3Qgc2FtcGxlciwgaW50MiBjb29yZCk7CitoYWxmNCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWgocmVhZF9vbmx5IGltYWdlMmRfdCBpbWFnZSwgc2FtcGxlcl90IHNhbXBsZXIsIGZsb2F0MiBjb29yZCk7CitoYWxmNCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWgocmVhZF9vbmx5IGltYWdlM2RfdCBpbWFnZSwgc2FtcGxlcl90IHNhbXBsZXIsIGludDQgY29vcmQpOworaGFsZjQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VoKHJlYWRfb25seSBpbWFnZTNkX3QgaW1hZ2UsIHNhbXBsZXJfdCBzYW1wbGVyLCBmbG9hdDQgY29vcmQpOworaGFsZjQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VoKHJlYWRfb25seSBpbWFnZTJkX2FycmF5X3QgaW1hZ2UsIHNhbXBsZXJfdCBzYW1wbGVyLCBpbnQ0IGNvb3JkKTsKK2hhbGY0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdlaChyZWFkX29ubHkgaW1hZ2UyZF9hcnJheV90IGltYWdlLCBzYW1wbGVyX3Qgc2FtcGxlciwgZmxvYXQ0IGNvb3JkKTsKK2hhbGY0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdlaChyZWFkX29ubHkgaW1hZ2UxZF90IGltYWdlLCBpbnQgY29vcmQpOworaGFsZjQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VoKHJlYWRfb25seSBpbWFnZTJkX3QgaW1hZ2UsIGludDIgY29vcmQpOworaGFsZjQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VoKHJlYWRfb25seSBpbWFnZTNkX3QgaW1hZ2UsIGludDQgY29vcmQpOworaGFsZjQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VoKHJlYWRfb25seSBpbWFnZTFkX2FycmF5X3QgaW1hZ2UsIGludDIgY29vcmQpOworaGFsZjQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VoKHJlYWRfb25seSBpbWFnZTJkX2FycmF5X3QgaW1hZ2UsIGludDQgY29vcmQpOworaGFsZjQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VoKHJlYWRfb25seSBpbWFnZTFkX2J1ZmZlcl90IGltYWdlLCBpbnQgY29vcmQpOworI2VuZGlmIC8vY2xfa2hyX2ZwMTYKKworLy8gSW1hZ2UgcmVhZCBmdW5jdGlvbnMgZm9yIHJlYWRfd3JpdGUgaW1hZ2VzCisjaWYgX19PUEVOQ0xfQ19WRVJTSU9OX18gPj0gQ0xfVkVSU0lPTl8yXzAKK2Zsb2F0NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWYocmVhZF93cml0ZSBpbWFnZTFkX3QgaW1hZ2UsIGludCBjb29yZCk7CitpbnQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdlaShyZWFkX3dyaXRlIGltYWdlMWRfdCBpbWFnZSwgaW50IGNvb3JkKTsKK3VpbnQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdldWkocmVhZF93cml0ZSBpbWFnZTFkX3QgaW1hZ2UsIGludCBjb29yZCk7CisKK2Zsb2F0NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWYocmVhZF93cml0ZSBpbWFnZTFkX2J1ZmZlcl90IGltYWdlLCBpbnQgY29vcmQpOworaW50NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWkocmVhZF93cml0ZSBpbWFnZTFkX2J1ZmZlcl90IGltYWdlLCBpbnQgY29vcmQpOwordWludDQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2V1aShyZWFkX3dyaXRlIGltYWdlMWRfYnVmZmVyX3QgaW1hZ2UsIGludCBjb29yZCk7CisKK2Zsb2F0NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWYocmVhZF93cml0ZSBpbWFnZTFkX2FycmF5X3QgaW1hZ2UsIGludDIgY29vcmQpOworaW50NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWkocmVhZF93cml0ZSBpbWFnZTFkX2FycmF5X3QgaW1hZ2UsIGludDIgY29vcmQpOwordWludDQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2V1aShyZWFkX3dyaXRlIGltYWdlMWRfYXJyYXlfdCBpbWFnZSwgaW50MiBjb29yZCk7CisKK2Zsb2F0NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWYocmVhZF93cml0ZSBpbWFnZTJkX3QgaW1hZ2UsIGludDIgY29vcmQpOworaW50NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWkocmVhZF93cml0ZSBpbWFnZTJkX3QgaW1hZ2UsIGludDIgY29vcmQpOwordWludDQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2V1aShyZWFkX3dyaXRlIGltYWdlMmRfdCBpbWFnZSwgaW50MiBjb29yZCk7CisKK2Zsb2F0NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWYocmVhZF93cml0ZSBpbWFnZTJkX2FycmF5X3QgaW1hZ2UsIGludDQgY29vcmQpOworaW50NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWkocmVhZF93cml0ZSBpbWFnZTJkX2FycmF5X3QgaW1hZ2UsIGludDQgY29vcmQpOwordWludDQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2V1aShyZWFkX3dyaXRlIGltYWdlMmRfYXJyYXlfdCBpbWFnZSwgaW50NCBjb29yZCk7CisKK2Zsb2F0NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWYocmVhZF93cml0ZSBpbWFnZTNkX3QgaW1hZ2UsIGludDQgY29vcmQpOworaW50NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWkocmVhZF93cml0ZSBpbWFnZTNkX3QgaW1hZ2UsIGludDQgY29vcmQpOwordWludDQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2V1aShyZWFkX3dyaXRlIGltYWdlM2RfdCBpbWFnZSwgaW50NCBjb29yZCk7CisKKyNpZmRlZiBjbF9raHJfZGVwdGhfaW1hZ2VzCitmbG9hdCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWYocmVhZF93cml0ZSBpbWFnZTJkX2RlcHRoX3QgaW1hZ2UsIGludDIgY29vcmQpOworZmxvYXQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VmKHJlYWRfd3JpdGUgaW1hZ2UyZF9hcnJheV9kZXB0aF90IGltYWdlLCBpbnQ0IGNvb3JkKTsKKyNlbmRpZiAvL2NsX2tocl9kZXB0aF9pbWFnZXMKKworI2lmIGNsX2tocl9nbF9tc2FhX3NoYXJpbmcKK2Zsb2F0NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWYocmVhZF93cml0ZSBpbWFnZTJkX21zYWFfdCBpbWFnZSwgaW50MiBjb29yZCwgaW50IHNhbXBsZSk7CitpbnQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdlaShyZWFkX3dyaXRlIGltYWdlMmRfbXNhYV90IGltYWdlLCBpbnQyIGNvb3JkLCBpbnQgc2FtcGxlKTsKK3VpbnQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdldWkocmVhZF93cml0ZSBpbWFnZTJkX21zYWFfdCBpbWFnZSwgaW50MiBjb29yZCwgaW50IHNhbXBsZSk7CisKK2Zsb2F0NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWYocmVhZF93cml0ZSBpbWFnZTJkX2FycmF5X21zYWFfdCBpbWFnZSwgaW50NCBjb29yZCwgaW50IHNhbXBsZSk7CitpbnQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdlaShyZWFkX3dyaXRlIGltYWdlMmRfYXJyYXlfbXNhYV90IGltYWdlLCBpbnQ0IGNvb3JkLCBpbnQgc2FtcGxlKTsKK3VpbnQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdldWkocmVhZF93cml0ZSBpbWFnZTJkX2FycmF5X21zYWFfdCBpbWFnZSwgaW50NCBjb29yZCwgaW50IHNhbXBsZSk7CisKK2Zsb2F0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdlZihyZWFkX3dyaXRlIGltYWdlMmRfbXNhYV9kZXB0aF90IGltYWdlLCBpbnQyIGNvb3JkLCBpbnQgc2FtcGxlKTsKK2Zsb2F0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdlZihyZWFkX3dyaXRlIGltYWdlMmRfYXJyYXlfbXNhYV9kZXB0aF90IGltYWdlLCBpbnQ0IGNvb3JkLCBpbnQgc2FtcGxlKTsKKyNlbmRpZiAvL2NsX2tocl9nbF9tc2FhX3NoYXJpbmcKKworI2lmZGVmIGNsX2tocl9taXBtYXBfaW1hZ2UKK2Zsb2F0NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWYocmVhZF93cml0ZSBpbWFnZTFkX3QgaW1hZ2UsIHNhbXBsZXJfdCBzYW1wbGVyLCBmbG9hdCBjb29yZCwgZmxvYXQgbG9kKTsKK2ludDQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VpKHJlYWRfd3JpdGUgaW1hZ2UxZF90IGltYWdlLCBzYW1wbGVyX3Qgc2FtcGxlciwgZmxvYXQgY29vcmQsIGZsb2F0IGxvZCk7Cit1aW50NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZXVpKHJlYWRfd3JpdGUgaW1hZ2UxZF90IGltYWdlLCBzYW1wbGVyX3Qgc2FtcGxlciwgZmxvYXQgY29vcmQsIGZsb2F0IGxvZCk7CisKK2Zsb2F0NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWYocmVhZF93cml0ZSBpbWFnZTFkX2FycmF5X3QgaW1hZ2VfYXJyYXksIHNhbXBsZXJfdCBzYW1wbGVyLCBmbG9hdDIgY29vcmQsIGZsb2F0IGxvZCk7CitpbnQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdlaShyZWFkX3dyaXRlIGltYWdlMWRfYXJyYXlfdCBpbWFnZV9hcnJheSwgc2FtcGxlcl90IHNhbXBsZXIsIGZsb2F0MiBjb29yZCwgZmxvYXQgbG9kKTsKK3VpbnQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdldWkocmVhZF93cml0ZSBpbWFnZTFkX2FycmF5X3QgaW1hZ2VfYXJyYXksIHNhbXBsZXJfdCBzYW1wbGVyLCBmbG9hdDIgY29vcmQsIGZsb2F0IGxvZCk7CisKK2Zsb2F0NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWYocmVhZF93cml0ZSBpbWFnZTJkX3QgaW1hZ2UsIHNhbXBsZXJfdCBzYW1wbGVyLCBmbG9hdDIgY29vcmQsIGZsb2F0IGxvZCk7CitpbnQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdlaShyZWFkX3dyaXRlIGltYWdlMmRfdCBpbWFnZSwgc2FtcGxlcl90IHNhbXBsZXIsIGZsb2F0MiBjb29yZCwgZmxvYXQgbG9kKTsKK3VpbnQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdldWkocmVhZF93cml0ZSBpbWFnZTJkX3QgaW1hZ2UsIHNhbXBsZXJfdCBzYW1wbGVyLCBmbG9hdDIgY29vcmQsIGZsb2F0IGxvZCk7CisKK2Zsb2F0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdlZihyZWFkX3dyaXRlIGltYWdlMmRfZGVwdGhfdCBpbWFnZSwgc2FtcGxlcl90IHNhbXBsZXIsIGZsb2F0MiBjb29yZCwgZmxvYXQgbG9kKTsKKworZmxvYXQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdlZihyZWFkX3dyaXRlIGltYWdlMmRfYXJyYXlfdCBpbWFnZV9hcnJheSwgc2FtcGxlcl90IHNhbXBsZXIsIGZsb2F0NCBjb29yZCwgZmxvYXQgbG9kKTsKK2ludDQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VpKHJlYWRfd3JpdGUgaW1hZ2UyZF9hcnJheV90IGltYWdlX2FycmF5LCBzYW1wbGVyX3Qgc2FtcGxlciwgZmxvYXQ0IGNvb3JkLCBmbG9hdCBsb2QpOwordWludDQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2V1aShyZWFkX3dyaXRlIGltYWdlMmRfYXJyYXlfdCBpbWFnZV9hcnJheSwgc2FtcGxlcl90IHNhbXBsZXIsIGZsb2F0NCBjb29yZCwgZmxvYXQgbG9kKTsKKworZmxvYXQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VmKHJlYWRfd3JpdGUgaW1hZ2UyZF9hcnJheV9kZXB0aF90IGltYWdlLCBzYW1wbGVyX3Qgc2FtcGxlciwgZmxvYXQ0IGNvb3JkLCBmbG9hdCBsb2QpOworCitmbG9hdDQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VmKHJlYWRfd3JpdGUgaW1hZ2UzZF90IGltYWdlLCBzYW1wbGVyX3Qgc2FtcGxlciwgZmxvYXQ0IGNvb3JkLCBmbG9hdCBsb2QpOworaW50NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWkocmVhZF93cml0ZSBpbWFnZTNkX3QgaW1hZ2UsIHNhbXBsZXJfdCBzYW1wbGVyLCBmbG9hdDQgY29vcmQsIGZsb2F0IGxvZCk7Cit1aW50NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZXVpKHJlYWRfd3JpdGUgaW1hZ2UzZF90IGltYWdlLCBzYW1wbGVyX3Qgc2FtcGxlciwgZmxvYXQ0IGNvb3JkLCBmbG9hdCBsb2QpOworCitmbG9hdDQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VmKHJlYWRfd3JpdGUgaW1hZ2UxZF90IGltYWdlLCBzYW1wbGVyX3Qgc2FtcGxlciwgZmxvYXQgY29vcmQsIGZsb2F0IGdyYWRpZW50WCwgZmxvYXQgZ3JhZGllbnRZKTsKK2ludDQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VpKHJlYWRfd3JpdGUgaW1hZ2UxZF90IGltYWdlLCBzYW1wbGVyX3Qgc2FtcGxlciwgZmxvYXQgY29vcmQsIGZsb2F0IGdyYWRpZW50WCwgZmxvYXQgZ3JhZGllbnRZKTsKK3VpbnQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdldWkocmVhZF93cml0ZSBpbWFnZTFkX3QgaW1hZ2UsIHNhbXBsZXJfdCBzYW1wbGVyLCBmbG9hdCBjb29yZCwgZmxvYXQgZ3JhZGllbnRYLCBmbG9hdCBncmFkaWVudFkpOworCitmbG9hdDQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VmKHJlYWRfd3JpdGUgaW1hZ2UxZF9hcnJheV90IGltYWdlX2FycmF5LCBzYW1wbGVyX3Qgc2FtcGxlciwgZmxvYXQyIGNvb3JkLCBmbG9hdCBncmFkaWVudFgsIGZsb2F0IGdyYWRpZW50WSk7CitpbnQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdlaShyZWFkX3dyaXRlIGltYWdlMWRfYXJyYXlfdCBpbWFnZV9hcnJheSwgc2FtcGxlcl90IHNhbXBsZXIsIGZsb2F0MiBjb29yZCwgZmxvYXQgZ3JhZGllbnRYLCBmbG9hdCBncmFkaWVudFkpOwordWludDQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2V1aShyZWFkX3dyaXRlIGltYWdlMWRfYXJyYXlfdCBpbWFnZV9hcnJheSwgc2FtcGxlcl90IHNhbXBsZXIsIGZsb2F0MiBjb29yZCwgZmxvYXQgZ3JhZGllbnRYLCBmbG9hdCBncmFkaWVudFkpOworCitmbG9hdDQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VmKHJlYWRfd3JpdGUgaW1hZ2UyZF90IGltYWdlLCBzYW1wbGVyX3Qgc2FtcGxlciwgZmxvYXQyIGNvb3JkLCBmbG9hdDIgZ3JhZGllbnRYLCBmbG9hdDIgZ3JhZGllbnRZKTsKK2ludDQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VpKHJlYWRfd3JpdGUgaW1hZ2UyZF90IGltYWdlLCBzYW1wbGVyX3Qgc2FtcGxlciwgZmxvYXQyIGNvb3JkLCBmbG9hdDIgZ3JhZGllbnRYLCBmbG9hdDIgZ3JhZGllbnRZKTsKK3VpbnQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdldWkocmVhZF93cml0ZSBpbWFnZTJkX3QgaW1hZ2UsIHNhbXBsZXJfdCBzYW1wbGVyLCBmbG9hdDIgY29vcmQsIGZsb2F0MiBncmFkaWVudFgsIGZsb2F0MiBncmFkaWVudFkpOworCitmbG9hdCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWYocmVhZF93cml0ZSBpbWFnZTJkX2RlcHRoX3QgaW1hZ2UsIHNhbXBsZXJfdCBzYW1wbGVyLCBmbG9hdDIgY29vcmQsIGZsb2F0MiBncmFkaWVudFgsIGZsb2F0MiBncmFkaWVudFkpOworCitmbG9hdDQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VmKHJlYWRfd3JpdGUgaW1hZ2UyZF9hcnJheV90IGltYWdlX2FycmF5LCBzYW1wbGVyX3Qgc2FtcGxlciwgZmxvYXQ0IGNvb3JkLCBmbG9hdDIgZ3JhZGllbnRYLCBmbG9hdDIgZ3JhZGllbnRZKTsKK2ludDQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VpKHJlYWRfd3JpdGUgaW1hZ2UyZF9hcnJheV90IGltYWdlX2FycmF5LCBzYW1wbGVyX3Qgc2FtcGxlciwgZmxvYXQ0IGNvb3JkLCBmbG9hdDIgZ3JhZGllbnRYLCBmbG9hdDIgZ3JhZGllbnRZKTsKK3VpbnQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdldWkocmVhZF93cml0ZSBpbWFnZTJkX2FycmF5X3QgaW1hZ2VfYXJyYXksIHNhbXBsZXJfdCBzYW1wbGVyLCBmbG9hdDQgY29vcmQsIGZsb2F0MiBncmFkaWVudFgsIGZsb2F0MiBncmFkaWVudFkpOworCitmbG9hdCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWYocmVhZF93cml0ZSBpbWFnZTJkX2FycmF5X2RlcHRoX3QgaW1hZ2UsIHNhbXBsZXJfdCBzYW1wbGVyLCBmbG9hdDQgY29vcmQsIGZsb2F0MiBncmFkaWVudFgsIGZsb2F0MiBncmFkaWVudFkpOworCitmbG9hdDQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VmKHJlYWRfd3JpdGUgaW1hZ2UzZF90IGltYWdlLCBzYW1wbGVyX3Qgc2FtcGxlciwgZmxvYXQ0IGNvb3JkLCBmbG9hdDQgZ3JhZGllbnRYLCBmbG9hdDQgZ3JhZGllbnRZKTsKK2ludDQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VpKHJlYWRfd3JpdGUgaW1hZ2UzZF90IGltYWdlLCBzYW1wbGVyX3Qgc2FtcGxlciwgZmxvYXQ0IGNvb3JkLCBmbG9hdDQgZ3JhZGllbnRYLCBmbG9hdDQgZ3JhZGllbnRZKTsKK3VpbnQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdldWkocmVhZF93cml0ZSBpbWFnZTNkX3QgaW1hZ2UsIHNhbXBsZXJfdCBzYW1wbGVyLCBmbG9hdDQgY29vcmQsIGZsb2F0NCBncmFkaWVudFgsIGZsb2F0NCBncmFkaWVudFkpOworCitmbG9hdDQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VmKHJlYWRfd3JpdGUgaW1hZ2UxZF90IGltYWdlLCBzYW1wbGVyX3Qgc2FtcGxlciwgZmxvYXQgY29vcmQsIGZsb2F0IGxvZCk7CitpbnQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdlaShyZWFkX3dyaXRlIGltYWdlMWRfdCBpbWFnZSwgc2FtcGxlcl90IHNhbXBsZXIsIGZsb2F0IGNvb3JkLCBmbG9hdCBsb2QpOwordWludDQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2V1aShyZWFkX3dyaXRlIGltYWdlMWRfdCBpbWFnZSwgc2FtcGxlcl90IHNhbXBsZXIsIGZsb2F0IGNvb3JkLCBmbG9hdCBsb2QpOworCitmbG9hdDQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VmKHJlYWRfd3JpdGUgaW1hZ2UxZF9hcnJheV90IGltYWdlX2FycmF5LCBzYW1wbGVyX3Qgc2FtcGxlciwgZmxvYXQyIGNvb3JkLCBmbG9hdCBsb2QpOworaW50NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWkocmVhZF93cml0ZSBpbWFnZTFkX2FycmF5X3QgaW1hZ2VfYXJyYXksIHNhbXBsZXJfdCBzYW1wbGVyLCBmbG9hdDIgY29vcmQsIGZsb2F0IGxvZCk7Cit1aW50NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZXVpKHJlYWRfd3JpdGUgaW1hZ2UxZF9hcnJheV90IGltYWdlX2FycmF5LCBzYW1wbGVyX3Qgc2FtcGxlciwgZmxvYXQyIGNvb3JkLCBmbG9hdCBsb2QpOworCitmbG9hdDQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VmKHJlYWRfd3JpdGUgaW1hZ2UyZF90IGltYWdlLCBzYW1wbGVyX3Qgc2FtcGxlciwgZmxvYXQyIGNvb3JkLCBmbG9hdCBsb2QpOworaW50NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWkocmVhZF93cml0ZSBpbWFnZTJkX3QgaW1hZ2UsIHNhbXBsZXJfdCBzYW1wbGVyLCBmbG9hdDIgY29vcmQsIGZsb2F0IGxvZCk7Cit1aW50NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZXVpKHJlYWRfd3JpdGUgaW1hZ2UyZF90IGltYWdlLCBzYW1wbGVyX3Qgc2FtcGxlciwgZmxvYXQyIGNvb3JkLCBmbG9hdCBsb2QpOworCitmbG9hdCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWYocmVhZF93cml0ZSBpbWFnZTJkX2RlcHRoX3QgaW1hZ2UsIHNhbXBsZXJfdCBzYW1wbGVyLCBmbG9hdDIgY29vcmQsIGZsb2F0IGxvZCk7CisKK2Zsb2F0NCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWYocmVhZF93cml0ZSBpbWFnZTJkX2FycmF5X3QgaW1hZ2VfYXJyYXksIHNhbXBsZXJfdCBzYW1wbGVyLCBmbG9hdDQgY29vcmQsIGZsb2F0IGxvZCk7CitpbnQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdlaShyZWFkX3dyaXRlIGltYWdlMmRfYXJyYXlfdCBpbWFnZV9hcnJheSwgc2FtcGxlcl90IHNhbXBsZXIsIGZsb2F0NCBjb29yZCwgZmxvYXQgbG9kKTsKK3VpbnQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdldWkocmVhZF93cml0ZSBpbWFnZTJkX2FycmF5X3QgaW1hZ2VfYXJyYXksIHNhbXBsZXJfdCBzYW1wbGVyLCBmbG9hdDQgY29vcmQsIGZsb2F0IGxvZCk7CisKK2Zsb2F0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdlZihyZWFkX3dyaXRlIGltYWdlMmRfYXJyYXlfZGVwdGhfdCBpbWFnZSwgc2FtcGxlcl90IHNhbXBsZXIsIGZsb2F0NCBjb29yZCwgZmxvYXQgbG9kKTsKKworZmxvYXQ0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdlZihyZWFkX3dyaXRlIGltYWdlM2RfdCBpbWFnZSwgc2FtcGxlcl90IHNhbXBsZXIsIGZsb2F0NCBjb29yZCwgZmxvYXQgbG9kKTsKK2ludDQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VpKHJlYWRfd3JpdGUgaW1hZ2UzZF90IGltYWdlLCBzYW1wbGVyX3Qgc2FtcGxlciwgZmxvYXQ0IGNvb3JkLCBmbG9hdCBsb2QpOwordWludDQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2V1aShyZWFkX3dyaXRlIGltYWdlM2RfdCBpbWFnZSwgc2FtcGxlcl90IHNhbXBsZXIsIGZsb2F0NCBjb29yZCwgZmxvYXQgbG9kKTsKKyNlbmRpZiAvL2NsX2tocl9taXBtYXBfaW1hZ2UKKworLy8gSW1hZ2UgcmVhZCBmdW5jdGlvbnMgcmV0dXJuaW5nIGhhbGY0IHR5cGUKKyNpZmRlZiBjbF9raHJfZnAxNgoraGFsZjQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VoKHJlYWRfd3JpdGUgaW1hZ2UxZF90IGltYWdlLCBpbnQgY29vcmQpOworaGFsZjQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VoKHJlYWRfd3JpdGUgaW1hZ2UyZF90IGltYWdlLCBpbnQyIGNvb3JkKTsKK2hhbGY0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdlaChyZWFkX3dyaXRlIGltYWdlM2RfdCBpbWFnZSwgaW50NCBjb29yZCk7CitoYWxmNCBfX3B1cmVmbiBfX292bGQgcmVhZF9pbWFnZWgocmVhZF93cml0ZSBpbWFnZTFkX2FycmF5X3QgaW1hZ2UsIGludDIgY29vcmQpOworaGFsZjQgX19wdXJlZm4gX19vdmxkIHJlYWRfaW1hZ2VoKHJlYWRfd3JpdGUgaW1hZ2UyZF9hcnJheV90IGltYWdlLCBpbnQ0IGNvb3JkKTsKK2hhbGY0IF9fcHVyZWZuIF9fb3ZsZCByZWFkX2ltYWdlaChyZWFkX3dyaXRlIGltYWdlMWRfYnVmZmVyX3QgaW1hZ2UsIGludCBjb29yZCk7CisjZW5kaWYgLy9jbF9raHJfZnAxNgorI2VuZGlmIC8vX19PUEVOQ0xfQ19WRVJTSU9OX18gPj0gQ0xfVkVSU0lPTl8yXzAKKworLyoqCisgKiBXcml0ZSBjb2xvciB2YWx1ZSB0byBsb2NhdGlvbiBzcGVjaWZpZWQgYnkgY29vcmRpbmF0ZQorICogKGNvb3JkLngsIGNvb3JkLnkpIGluIHRoZSAyRCBpbWFnZSBvYmplY3Qgc3BlY2lmaWVkIGJ5IGltYWdlLgorICogKGNvb3JkLngsIGNvb3JkLnkpIGFyZSBjb25zaWRlcmVkIHRvIGJlIHVubm9ybWFsaXplZCBjb29yZGluYXRlcworICogYW5kIG11c3QgYmUgaW4gdGhlIHJhbmdlIDAgLi4uIGltYWdlIHdpZHRoIC0gMSwgYW5kIDAKKyAqIC4uLiBpbWFnZSBoZWlnaHQgLSAxLgorCisgKiBXcml0ZSBjb2xvciB2YWx1ZSB0byBsb2NhdGlvbiBzcGVjaWZpZWQgYnkgY29vcmRpbmF0ZQorICogKGNvb3JkLngsIGNvb3JkLnkpIGluIHRoZSAyRCBpbWFnZSBvYmplY3Qgc3BlY2lmaWVkIGJ5IGluZGV4CisgKiAoY29vcmQueikgb2YgdGhlIDJEIGltYWdlIGFycmF5IG9iamVjdCBpbWFnZV9hcnJheS4KKyAqIChjb29yZC54LCBjb29yZC55KSBhcmUgY29uc2lkZXJlZCB0byBiZSB1bm5vcm1hbGl6ZWQKKyAqIGNvb3JkaW5hdGVzIGFuZCBtdXN0IGJlIGluIHRoZSByYW5nZSAwIC4uLiBpbWFnZSB3aWR0aAorICogLSAxLgorICoKKyAqIFdyaXRlIGNvbG9yIHZhbHVlIHRvIGxvY2F0aW9uIHNwZWNpZmllZCBieSBjb29yZGluYXRlCisgKiAoY29vcmQpIGluIHRoZSAxRCBpbWFnZSAoYnVmZmVyKSBvYmplY3Qgc3BlY2lmaWVkIGJ5IGltYWdlLgorICogY29vcmQgaXMgY29uc2lkZXJlZCB0byBiZSB1bm5vcm1hbGl6ZWQgY29vcmRpbmF0ZXMKKyAqIGFuZCBtdXN0IGJlIGluIHRoZSByYW5nZSAwIC4uLiBpbWFnZSB3aWR0aCAtIDEuCisgKgorICogV3JpdGUgY29sb3IgdmFsdWUgdG8gbG9jYXRpb24gc3BlY2lmaWVkIGJ5IGNvb3JkaW5hdGUKKyAqIChjb29yZC54KSBpbiB0aGUgMUQgaW1hZ2Ugb2JqZWN0IHNwZWNpZmllZCBieSBpbmRleAorICogKGNvb3JkLnkpIG9mIHRoZSAxRCBpbWFnZSBhcnJheSBvYmplY3QgaW1hZ2VfYXJyYXkuCisgKiB4IGlzIGNvbnNpZGVyZWQgdG8gYmUgdW5ub3JtYWxpemVkIGNvb3JkaW5hdGVzCisgKiBhbmQgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMCAuLi4gaW1hZ2Ugd2lkdGggLSAxLgorICoKKyAqIFdyaXRlIGNvbG9yIHZhbHVlIHRvIGxvY2F0aW9uIHNwZWNpZmllZCBieSBjb29yZGluYXRlCisgKiAoY29vcmQueCwgY29vcmQueSwgY29vcmQueikgaW4gdGhlIDNEIGltYWdlIG9iamVjdCBzcGVjaWZpZWQgYnkgaW1hZ2UuCisgKiBjb29yZC54ICYgY29vcmQueSBhcmUgY29uc2lkZXJlZCB0byBiZSB1bm5vcm1hbGl6ZWQgY29vcmRpbmF0ZXMKKyAqIGFuZCBtdXN0IGJlIGluIHRoZSByYW5nZSAwIC4uLiBpbWFnZSB3aWR0aCAtIDEsIGFuZCAwCisgKiAuLi4gaW1hZ2UgaGVpZ2h0IC0gMS4KKyAqCisgKiBGb3IgbWlwbWFwIGltYWdlcywgdXNlIG1pcC1sZXZlbCBzcGVjaWZpZWQgYnkgbG9kLgorICoKKyAqIEFwcHJvcHJpYXRlIGRhdGEgZm9ybWF0IGNvbnZlcnNpb24gdG8gdGhlIHNwZWNpZmllZAorICogaW1hZ2UgZm9ybWF0IGlzIGRvbmUgYmVmb3JlIHdyaXRpbmcgdGhlIGNvbG9yIHZhbHVlLgorICoKKyAqIHdyaXRlX2ltYWdlZiBjYW4gb25seSBiZSB1c2VkIHdpdGggaW1hZ2Ugb2JqZWN0cworICogY3JlYXRlZCB3aXRoIGltYWdlX2NoYW5uZWxfZGF0YV90eXBlIHNldCB0byBvbmUgb2YKKyAqIHRoZSBwcmUtZGVmaW5lZCBwYWNrZWQgZm9ybWF0cyBvciBzZXQgdG8KKyAqIENMX1NOT1JNX0lOVDgsIENMX1VOT1JNX0lOVDgsCisgKiBDTF9TTk9STV9JTlQxNiwgQ0xfVU5PUk1fSU5UMTYsCisgKiBDTF9IQUxGX0ZMT0FUIG9yIENMX0ZMT0FULiBBcHByb3ByaWF0ZSBkYXRhCisgKiBmb3JtYXQgY29udmVyc2lvbiB3aWxsIGJlIGRvbmUgdG8gY29udmVydCBjaGFubmVsCisgKiBkYXRhIGZyb20gYSBmbG9hdGluZy1wb2ludCB2YWx1ZSB0byBhY3R1YWwgZGF0YSBmb3JtYXQKKyAqIGluIHdoaWNoIHRoZSBjaGFubmVscyBhcmUgc3RvcmVkLgorICoKKyAqIHdyaXRlX2ltYWdlaSBjYW4gb25seSBiZSB1c2VkIHdpdGggaW1hZ2Ugb2JqZWN0cworICogY3JlYXRlZCB3aXRoIGltYWdlX2NoYW5uZWxfZGF0YV90eXBlIHNldCB0byBvbmUgb2YKKyAqIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogQ0xfU0lHTkVEX0lOVDgsCisgKiBDTF9TSUdORURfSU5UMTYgYW5kCisgKiBDTF9TSUdORURfSU5UMzIuCisgKgorICogd3JpdGVfaW1hZ2V1aSBjYW4gb25seSBiZSB1c2VkIHdpdGggaW1hZ2Ugb2JqZWN0cworICogY3JlYXRlZCB3aXRoIGltYWdlX2NoYW5uZWxfZGF0YV90eXBlIHNldCB0byBvbmUgb2YKKyAqIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogQ0xfVU5TSUdORURfSU5UOCwKKyAqIENMX1VOU0lHTkVEX0lOVDE2IGFuZAorICogQ0xfVU5TSUdORURfSU5UMzIuCisgKgorICogVGhlIGJlaGF2aW9yIG9mIHdyaXRlX2ltYWdlZiwgd3JpdGVfaW1hZ2VpIGFuZAorICogd3JpdGVfaW1hZ2V1aSBmb3IgaW1hZ2Ugb2JqZWN0cyBjcmVhdGVkIHdpdGgKKyAqIGltYWdlX2NoYW5uZWxfZGF0YV90eXBlIHZhbHVlcyBub3Qgc3BlY2lmaWVkIGluCisgKiB0aGUgZGVzY3JpcHRpb24gYWJvdmUgb3Igd2l0aCAoeCwgeSkgY29vcmRpbmF0ZQorICogdmFsdWVzIHRoYXQgYXJlIG5vdCBpbiB0aGUgcmFuZ2UgKDAgLi4uIGltYWdlIHdpZHRoIC0xLAorICogMCAuLi4gaW1hZ2UgaGVpZ2h0IC0gMSksIHJlc3BlY3RpdmVseSwgaXMgdW5kZWZpbmVkLgorICovCit2b2lkIF9fb3ZsZCB3cml0ZV9pbWFnZWYod3JpdGVfb25seSBpbWFnZTJkX3QgaW1hZ2UsIGludDIgY29vcmQsIGZsb2F0NCBjb2xvcik7Cit2b2lkIF9fb3ZsZCB3cml0ZV9pbWFnZWkod3JpdGVfb25seSBpbWFnZTJkX3QgaW1hZ2UsIGludDIgY29vcmQsIGludDQgY29sb3IpOwordm9pZCBfX292bGQgd3JpdGVfaW1hZ2V1aSh3cml0ZV9vbmx5IGltYWdlMmRfdCBpbWFnZSwgaW50MiBjb29yZCwgdWludDQgY29sb3IpOworCit2b2lkIF9fb3ZsZCB3cml0ZV9pbWFnZWYod3JpdGVfb25seSBpbWFnZTJkX2FycmF5X3QgaW1hZ2VfYXJyYXksIGludDQgY29vcmQsIGZsb2F0NCBjb2xvcik7Cit2b2lkIF9fb3ZsZCB3cml0ZV9pbWFnZWkod3JpdGVfb25seSBpbWFnZTJkX2FycmF5X3QgaW1hZ2VfYXJyYXksIGludDQgY29vcmQsIGludDQgY29sb3IpOwordm9pZCBfX292bGQgd3JpdGVfaW1hZ2V1aSh3cml0ZV9vbmx5IGltYWdlMmRfYXJyYXlfdCBpbWFnZV9hcnJheSwgaW50NCBjb29yZCwgdWludDQgY29sb3IpOworCit2b2lkIF9fb3ZsZCB3cml0ZV9pbWFnZWYod3JpdGVfb25seSBpbWFnZTFkX3QgaW1hZ2UsIGludCBjb29yZCwgZmxvYXQ0IGNvbG9yKTsKK3ZvaWQgX19vdmxkIHdyaXRlX2ltYWdlaSh3cml0ZV9vbmx5IGltYWdlMWRfdCBpbWFnZSwgaW50IGNvb3JkLCBpbnQ0IGNvbG9yKTsKK3ZvaWQgX19vdmxkIHdyaXRlX2ltYWdldWkod3JpdGVfb25seSBpbWFnZTFkX3QgaW1hZ2UsIGludCBjb29yZCwgdWludDQgY29sb3IpOworCit2b2lkIF9fb3ZsZCB3cml0ZV9pbWFnZWYod3JpdGVfb25seSBpbWFnZTFkX2J1ZmZlcl90IGltYWdlLCBpbnQgY29vcmQsIGZsb2F0NCBjb2xvcik7Cit2b2lkIF9fb3ZsZCB3cml0ZV9pbWFnZWkod3JpdGVfb25seSBpbWFnZTFkX2J1ZmZlcl90IGltYWdlLCBpbnQgY29vcmQsIGludDQgY29sb3IpOwordm9pZCBfX292bGQgd3JpdGVfaW1hZ2V1aSh3cml0ZV9vbmx5IGltYWdlMWRfYnVmZmVyX3QgaW1hZ2UsIGludCBjb29yZCwgdWludDQgY29sb3IpOworCit2b2lkIF9fb3ZsZCB3cml0ZV9pbWFnZWYod3JpdGVfb25seSBpbWFnZTFkX2FycmF5X3QgaW1hZ2VfYXJyYXksIGludDIgY29vcmQsIGZsb2F0NCBjb2xvcik7Cit2b2lkIF9fb3ZsZCB3cml0ZV9pbWFnZWkod3JpdGVfb25seSBpbWFnZTFkX2FycmF5X3QgaW1hZ2VfYXJyYXksIGludDIgY29vcmQsIGludDQgY29sb3IpOwordm9pZCBfX292bGQgd3JpdGVfaW1hZ2V1aSh3cml0ZV9vbmx5IGltYWdlMWRfYXJyYXlfdCBpbWFnZV9hcnJheSwgaW50MiBjb29yZCwgdWludDQgY29sb3IpOworCit2b2lkIF9fb3ZsZCB3cml0ZV9pbWFnZWYod3JpdGVfb25seSBpbWFnZTNkX3QgaW1hZ2UsIGludDQgY29vcmQsIGZsb2F0NCBjb2xvcik7Cit2b2lkIF9fb3ZsZCB3cml0ZV9pbWFnZWkod3JpdGVfb25seSBpbWFnZTNkX3QgaW1hZ2UsIGludDQgY29vcmQsIGludDQgY29sb3IpOwordm9pZCBfX292bGQgd3JpdGVfaW1hZ2V1aSh3cml0ZV9vbmx5IGltYWdlM2RfdCBpbWFnZSwgaW50NCBjb29yZCwgdWludDQgY29sb3IpOworCisjaWZkZWYgY2xfa2hyX2RlcHRoX2ltYWdlcwordm9pZCBfX292bGQgd3JpdGVfaW1hZ2VmKHdyaXRlX29ubHkgaW1hZ2UyZF9kZXB0aF90IGltYWdlLCBpbnQyIGNvb3JkLCBmbG9hdCBjb2xvcik7Cit2b2lkIF9fb3ZsZCB3cml0ZV9pbWFnZWYod3JpdGVfb25seSBpbWFnZTJkX2FycmF5X2RlcHRoX3QgaW1hZ2UsIGludDQgY29vcmQsIGZsb2F0IGNvbG9yKTsKKyNlbmRpZiAvL2NsX2tocl9kZXB0aF9pbWFnZXMKKworLy8gT3BlbkNMIEV4dGVuc2lvbiB2Mi4wIHM5LjE4IC0gTWlwbWFwcworI2lmZGVmIGNsX2tocl9taXBtYXBfaW1hZ2UKK3ZvaWQgX19vdmxkIHdyaXRlX2ltYWdlZih3cml0ZV9vbmx5IGltYWdlMWRfdCBpbWFnZSwgaW50IGNvb3JkLCBpbnQgbG9kLCBmbG9hdDQgY29sb3IpOwordm9pZCBfX292bGQgd3JpdGVfaW1hZ2VpKHdyaXRlX29ubHkgaW1hZ2UxZF90IGltYWdlLCBpbnQgY29vcmQsIGludCBsb2QsIGludDQgY29sb3IpOwordm9pZCBfX292bGQgd3JpdGVfaW1hZ2V1aSh3cml0ZV9vbmx5IGltYWdlMWRfdCBpbWFnZSwgaW50IGNvb3JkLCBpbnQgbG9kLCB1aW50NCBjb2xvcik7CisKK3ZvaWQgX19vdmxkIHdyaXRlX2ltYWdlZih3cml0ZV9vbmx5IGltYWdlMWRfYXJyYXlfdCBpbWFnZV9hcnJheSwgaW50MiBjb29yZCwgaW50IGxvZCwgZmxvYXQ0IGNvbG9yKTsKK3ZvaWQgX19vdmxkIHdyaXRlX2ltYWdlaSh3cml0ZV9vbmx5IGltYWdlMWRfYXJyYXlfdCBpbWFnZV9hcnJheSwgaW50MiBjb29yZCwgaW50IGxvZCwgaW50NCBjb2xvcik7Cit2b2lkIF9fb3ZsZCB3cml0ZV9pbWFnZXVpKHdyaXRlX29ubHkgaW1hZ2UxZF9hcnJheV90IGltYWdlX2FycmF5LCBpbnQyIGNvb3JkLCBpbnQgbG9kLCB1aW50NCBjb2xvcik7CisKK3ZvaWQgX19vdmxkIHdyaXRlX2ltYWdlZih3cml0ZV9vbmx5IGltYWdlMmRfdCBpbWFnZSwgaW50MiBjb29yZCwgaW50IGxvZCwgZmxvYXQ0IGNvbG9yKTsKK3ZvaWQgX19vdmxkIHdyaXRlX2ltYWdlaSh3cml0ZV9vbmx5IGltYWdlMmRfdCBpbWFnZSwgaW50MiBjb29yZCwgaW50IGxvZCwgaW50NCBjb2xvcik7Cit2b2lkIF9fb3ZsZCB3cml0ZV9pbWFnZXVpKHdyaXRlX29ubHkgaW1hZ2UyZF90IGltYWdlLCBpbnQyIGNvb3JkLCBpbnQgbG9kLCB1aW50NCBjb2xvcik7CisKK3ZvaWQgX19vdmxkIHdyaXRlX2ltYWdlZih3cml0ZV9vbmx5IGltYWdlMmRfYXJyYXlfdCBpbWFnZV9hcnJheSwgaW50NCBjb29yZCwgaW50IGxvZCwgZmxvYXQ0IGNvbG9yKTsKK3ZvaWQgX19vdmxkIHdyaXRlX2ltYWdlaSh3cml0ZV9vbmx5IGltYWdlMmRfYXJyYXlfdCBpbWFnZV9hcnJheSwgaW50NCBjb29yZCwgaW50IGxvZCwgaW50NCBjb2xvcik7Cit2b2lkIF9fb3ZsZCB3cml0ZV9pbWFnZXVpKHdyaXRlX29ubHkgaW1hZ2UyZF9hcnJheV90IGltYWdlX2FycmF5LCBpbnQ0IGNvb3JkLCBpbnQgbG9kLCB1aW50NCBjb2xvcik7CisKK3ZvaWQgX19vdmxkIHdyaXRlX2ltYWdlZih3cml0ZV9vbmx5IGltYWdlMmRfZGVwdGhfdCBpbWFnZSwgaW50MiBjb29yZCwgaW50IGxvZCwgZmxvYXQgY29sb3IpOwordm9pZCBfX292bGQgd3JpdGVfaW1hZ2VmKHdyaXRlX29ubHkgaW1hZ2UyZF9hcnJheV9kZXB0aF90IGltYWdlLCBpbnQ0IGNvb3JkLCBpbnQgbG9kLCBmbG9hdCBjb2xvcik7CisKK3ZvaWQgX19vdmxkIHdyaXRlX2ltYWdlZih3cml0ZV9vbmx5IGltYWdlM2RfdCBpbWFnZSwgaW50NCBjb29yZCwgaW50IGxvZCwgZmxvYXQ0IGNvbG9yKTsKK3ZvaWQgX19vdmxkIHdyaXRlX2ltYWdlaSh3cml0ZV9vbmx5IGltYWdlM2RfdCBpbWFnZSwgaW50NCBjb29yZCwgaW50IGxvZCwgaW50NCBjb2xvcik7Cit2b2lkIF9fb3ZsZCB3cml0ZV9pbWFnZXVpKHdyaXRlX29ubHkgaW1hZ2UzZF90IGltYWdlLCBpbnQ0IGNvb3JkLCBpbnQgbG9kLCB1aW50NCBjb2xvcik7CisjZW5kaWYgLy9jbF9raHJfbWlwbWFwX2ltYWdlCisKKy8vIEltYWdlIHdyaXRlIGZ1bmN0aW9ucyBmb3IgaGFsZjQgdHlwZQorI2lmZGVmIGNsX2tocl9mcDE2Cit2b2lkIF9fb3ZsZCB3cml0ZV9pbWFnZWgod3JpdGVfb25seSBpbWFnZTFkX3QgaW1hZ2UsIGludCBjb29yZCwgaGFsZjQgY29sb3IpOwordm9pZCBfX292bGQgd3JpdGVfaW1hZ2VoKHdyaXRlX29ubHkgaW1hZ2UyZF90IGltYWdlLCBpbnQyIGNvb3JkLCBoYWxmNCBjb2xvcik7Cit2b2lkIF9fb3ZsZCB3cml0ZV9pbWFnZWgod3JpdGVfb25seSBpbWFnZTNkX3QgaW1hZ2UsIGludDQgY29vcmQsIGhhbGY0IGNvbG9yKTsKK3ZvaWQgX19vdmxkIHdyaXRlX2ltYWdlaCh3cml0ZV9vbmx5IGltYWdlMWRfYXJyYXlfdCBpbWFnZSwgaW50MiBjb29yZCwgaGFsZjQgY29sb3IpOwordm9pZCBfX292bGQgd3JpdGVfaW1hZ2VoKHdyaXRlX29ubHkgaW1hZ2UyZF9hcnJheV90IGltYWdlLCBpbnQ0IGNvb3JkLCBoYWxmNCBjb2xvcik7Cit2b2lkIF9fb3ZsZCB3cml0ZV9pbWFnZWgod3JpdGVfb25seSBpbWFnZTFkX2J1ZmZlcl90IGltYWdlLCBpbnQgY29vcmQsIGhhbGY0IGNvbG9yKTsKKyNlbmRpZiAvL2NsX2tocl9mcDE2CisKKy8vIEltYWdlIHdyaXRlIGZ1bmN0aW9ucyBmb3IgcmVhZF93cml0ZSBpbWFnZXMKKyNpZiBfX09QRU5DTF9DX1ZFUlNJT05fXyA+PSBDTF9WRVJTSU9OXzJfMAordm9pZCBfX292bGQgd3JpdGVfaW1hZ2VmKHJlYWRfd3JpdGUgaW1hZ2UyZF90IGltYWdlLCBpbnQyIGNvb3JkLCBmbG9hdDQgY29sb3IpOwordm9pZCBfX292bGQgd3JpdGVfaW1hZ2VpKHJlYWRfd3JpdGUgaW1hZ2UyZF90IGltYWdlLCBpbnQyIGNvb3JkLCBpbnQ0IGNvbG9yKTsKK3ZvaWQgX19vdmxkIHdyaXRlX2ltYWdldWkocmVhZF93cml0ZSBpbWFnZTJkX3QgaW1hZ2UsIGludDIgY29vcmQsIHVpbnQ0IGNvbG9yKTsKKwordm9pZCBfX292bGQgd3JpdGVfaW1hZ2VmKHJlYWRfd3JpdGUgaW1hZ2UyZF9hcnJheV90IGltYWdlX2FycmF5LCBpbnQ0IGNvb3JkLCBmbG9hdDQgY29sb3IpOwordm9pZCBfX292bGQgd3JpdGVfaW1hZ2VpKHJlYWRfd3JpdGUgaW1hZ2UyZF9hcnJheV90IGltYWdlX2FycmF5LCBpbnQ0IGNvb3JkLCBpbnQ0IGNvbG9yKTsKK3ZvaWQgX19vdmxkIHdyaXRlX2ltYWdldWkocmVhZF93cml0ZSBpbWFnZTJkX2FycmF5X3QgaW1hZ2VfYXJyYXksIGludDQgY29vcmQsIHVpbnQ0IGNvbG9yKTsKKwordm9pZCBfX292bGQgd3JpdGVfaW1hZ2VmKHJlYWRfd3JpdGUgaW1hZ2UxZF90IGltYWdlLCBpbnQgY29vcmQsIGZsb2F0NCBjb2xvcik7Cit2b2lkIF9fb3ZsZCB3cml0ZV9pbWFnZWkocmVhZF93cml0ZSBpbWFnZTFkX3QgaW1hZ2UsIGludCBjb29yZCwgaW50NCBjb2xvcik7Cit2b2lkIF9fb3ZsZCB3cml0ZV9pbWFnZXVpKHJlYWRfd3JpdGUgaW1hZ2UxZF90IGltYWdlLCBpbnQgY29vcmQsIHVpbnQ0IGNvbG9yKTsKKwordm9pZCBfX292bGQgd3JpdGVfaW1hZ2VmKHJlYWRfd3JpdGUgaW1hZ2UxZF9idWZmZXJfdCBpbWFnZSwgaW50IGNvb3JkLCBmbG9hdDQgY29sb3IpOwordm9pZCBfX292bGQgd3JpdGVfaW1hZ2VpKHJlYWRfd3JpdGUgaW1hZ2UxZF9idWZmZXJfdCBpbWFnZSwgaW50IGNvb3JkLCBpbnQ0IGNvbG9yKTsKK3ZvaWQgX19vdmxkIHdyaXRlX2ltYWdldWkocmVhZF93cml0ZSBpbWFnZTFkX2J1ZmZlcl90IGltYWdlLCBpbnQgY29vcmQsIHVpbnQ0IGNvbG9yKTsKKwordm9pZCBfX292bGQgd3JpdGVfaW1hZ2VmKHJlYWRfd3JpdGUgaW1hZ2UxZF9hcnJheV90IGltYWdlX2FycmF5LCBpbnQyIGNvb3JkLCBmbG9hdDQgY29sb3IpOwordm9pZCBfX292bGQgd3JpdGVfaW1hZ2VpKHJlYWRfd3JpdGUgaW1hZ2UxZF9hcnJheV90IGltYWdlX2FycmF5LCBpbnQyIGNvb3JkLCBpbnQ0IGNvbG9yKTsKK3ZvaWQgX19vdmxkIHdyaXRlX2ltYWdldWkocmVhZF93cml0ZSBpbWFnZTFkX2FycmF5X3QgaW1hZ2VfYXJyYXksIGludDIgY29vcmQsIHVpbnQ0IGNvbG9yKTsKKwordm9pZCBfX292bGQgd3JpdGVfaW1hZ2VmKHJlYWRfd3JpdGUgaW1hZ2UzZF90IGltYWdlLCBpbnQ0IGNvb3JkLCBmbG9hdDQgY29sb3IpOwordm9pZCBfX292bGQgd3JpdGVfaW1hZ2VpKHJlYWRfd3JpdGUgaW1hZ2UzZF90IGltYWdlLCBpbnQ0IGNvb3JkLCBpbnQ0IGNvbG9yKTsKK3ZvaWQgX19vdmxkIHdyaXRlX2ltYWdldWkocmVhZF93cml0ZSBpbWFnZTNkX3QgaW1hZ2UsIGludDQgY29vcmQsIHVpbnQ0IGNvbG9yKTsKKworI2lmZGVmIGNsX2tocl9kZXB0aF9pbWFnZXMKK3ZvaWQgX19vdmxkIHdyaXRlX2ltYWdlZihyZWFkX3dyaXRlIGltYWdlMmRfZGVwdGhfdCBpbWFnZSwgaW50MiBjb29yZCwgZmxvYXQgY29sb3IpOwordm9pZCBfX292bGQgd3JpdGVfaW1hZ2VmKHJlYWRfd3JpdGUgaW1hZ2UyZF9hcnJheV9kZXB0aF90IGltYWdlLCBpbnQ0IGNvb3JkLCBmbG9hdCBjb2xvcik7CisjZW5kaWYgLy9jbF9raHJfZGVwdGhfaW1hZ2VzCisKKyNpZmRlZiBjbF9raHJfbWlwbWFwX2ltYWdlCit2b2lkIF9fb3ZsZCB3cml0ZV9pbWFnZWYocmVhZF93cml0ZSBpbWFnZTFkX3QgaW1hZ2UsIGludCBjb29yZCwgaW50IGxvZCwgZmxvYXQ0IGNvbG9yKTsKK3ZvaWQgX19vdmxkIHdyaXRlX2ltYWdlaShyZWFkX3dyaXRlIGltYWdlMWRfdCBpbWFnZSwgaW50IGNvb3JkLCBpbnQgbG9kLCBpbnQ0IGNvbG9yKTsKK3ZvaWQgX19vdmxkIHdyaXRlX2ltYWdldWkocmVhZF93cml0ZSBpbWFnZTFkX3QgaW1hZ2UsIGludCBjb29yZCwgaW50IGxvZCwgdWludDQgY29sb3IpOworCit2b2lkIF9fb3ZsZCB3cml0ZV9pbWFnZWYocmVhZF93cml0ZSBpbWFnZTFkX2FycmF5X3QgaW1hZ2VfYXJyYXksIGludDIgY29vcmQsIGludCBsb2QsIGZsb2F0NCBjb2xvcik7Cit2b2lkIF9fb3ZsZCB3cml0ZV9pbWFnZWkocmVhZF93cml0ZSBpbWFnZTFkX2FycmF5X3QgaW1hZ2VfYXJyYXksIGludDIgY29vcmQsIGludCBsb2QsIGludDQgY29sb3IpOwordm9pZCBfX292bGQgd3JpdGVfaW1hZ2V1aShyZWFkX3dyaXRlIGltYWdlMWRfYXJyYXlfdCBpbWFnZV9hcnJheSwgaW50MiBjb29yZCwgaW50IGxvZCwgdWludDQgY29sb3IpOworCit2b2lkIF9fb3ZsZCB3cml0ZV9pbWFnZWYocmVhZF93cml0ZSBpbWFnZTJkX3QgaW1hZ2UsIGludDIgY29vcmQsIGludCBsb2QsIGZsb2F0NCBjb2xvcik7Cit2b2lkIF9fb3ZsZCB3cml0ZV9pbWFnZWkocmVhZF93cml0ZSBpbWFnZTJkX3QgaW1hZ2UsIGludDIgY29vcmQsIGludCBsb2QsIGludDQgY29sb3IpOwordm9pZCBfX292bGQgd3JpdGVfaW1hZ2V1aShyZWFkX3dyaXRlIGltYWdlMmRfdCBpbWFnZSwgaW50MiBjb29yZCwgaW50IGxvZCwgdWludDQgY29sb3IpOworCit2b2lkIF9fb3ZsZCB3cml0ZV9pbWFnZWYocmVhZF93cml0ZSBpbWFnZTJkX2FycmF5X3QgaW1hZ2VfYXJyYXksIGludDQgY29vcmQsIGludCBsb2QsIGZsb2F0NCBjb2xvcik7Cit2b2lkIF9fb3ZsZCB3cml0ZV9pbWFnZWkocmVhZF93cml0ZSBpbWFnZTJkX2FycmF5X3QgaW1hZ2VfYXJyYXksIGludDQgY29vcmQsIGludCBsb2QsIGludDQgY29sb3IpOwordm9pZCBfX292bGQgd3JpdGVfaW1hZ2V1aShyZWFkX3dyaXRlIGltYWdlMmRfYXJyYXlfdCBpbWFnZV9hcnJheSwgaW50NCBjb29yZCwgaW50IGxvZCwgdWludDQgY29sb3IpOworCit2b2lkIF9fb3ZsZCB3cml0ZV9pbWFnZWYocmVhZF93cml0ZSBpbWFnZTJkX2RlcHRoX3QgaW1hZ2UsIGludDIgY29vcmQsIGludCBsb2QsIGZsb2F0IGNvbG9yKTsKK3ZvaWQgX19vdmxkIHdyaXRlX2ltYWdlZihyZWFkX3dyaXRlIGltYWdlMmRfYXJyYXlfZGVwdGhfdCBpbWFnZSwgaW50NCBjb29yZCwgaW50IGxvZCwgZmxvYXQgY29sb3IpOworCit2b2lkIF9fb3ZsZCB3cml0ZV9pbWFnZWYocmVhZF93cml0ZSBpbWFnZTNkX3QgaW1hZ2UsIGludDQgY29vcmQsIGludCBsb2QsIGZsb2F0NCBjb2xvcik7Cit2b2lkIF9fb3ZsZCB3cml0ZV9pbWFnZWkocmVhZF93cml0ZSBpbWFnZTNkX3QgaW1hZ2UsIGludDQgY29vcmQsIGludCBsb2QsIGludDQgY29sb3IpOwordm9pZCBfX292bGQgd3JpdGVfaW1hZ2V1aShyZWFkX3dyaXRlIGltYWdlM2RfdCBpbWFnZSwgaW50NCBjb29yZCwgaW50IGxvZCwgdWludDQgY29sb3IpOworI2VuZGlmIC8vY2xfa2hyX21pcG1hcF9pbWFnZQorCisvLyBJbWFnZSB3cml0ZSBmdW5jdGlvbnMgZm9yIGhhbGY0IHR5cGUKKyNpZmRlZiBjbF9raHJfZnAxNgordm9pZCBfX292bGQgd3JpdGVfaW1hZ2VoKHJlYWRfd3JpdGUgaW1hZ2UxZF90IGltYWdlLCBpbnQgY29vcmQsIGhhbGY0IGNvbG9yKTsKK3ZvaWQgX19vdmxkIHdyaXRlX2ltYWdlaChyZWFkX3dyaXRlIGltYWdlMmRfdCBpbWFnZSwgaW50MiBjb29yZCwgaGFsZjQgY29sb3IpOwordm9pZCBfX292bGQgd3JpdGVfaW1hZ2VoKHJlYWRfd3JpdGUgaW1hZ2UzZF90IGltYWdlLCBpbnQ0IGNvb3JkLCBoYWxmNCBjb2xvcik7Cit2b2lkIF9fb3ZsZCB3cml0ZV9pbWFnZWgocmVhZF93cml0ZSBpbWFnZTFkX2FycmF5X3QgaW1hZ2UsIGludDIgY29vcmQsIGhhbGY0IGNvbG9yKTsKK3ZvaWQgX19vdmxkIHdyaXRlX2ltYWdlaChyZWFkX3dyaXRlIGltYWdlMmRfYXJyYXlfdCBpbWFnZSwgaW50NCBjb29yZCwgaGFsZjQgY29sb3IpOwordm9pZCBfX292bGQgd3JpdGVfaW1hZ2VoKHJlYWRfd3JpdGUgaW1hZ2UxZF9idWZmZXJfdCBpbWFnZSwgaW50IGNvb3JkLCBoYWxmNCBjb2xvcik7CisjZW5kaWYgLy9jbF9raHJfZnAxNgorI2VuZGlmIC8vX19PUEVOQ0xfQ19WRVJTSU9OX18gPj0gQ0xfVkVSU0lPTl8yXzAKKworLy8gTm90ZTogSW4gT3BlbkNMIHYxLjAvMS4xLzEuMiwgaW1hZ2UgYXJndW1lbnQgb2YgaW1hZ2UgcXVlcnkgYnVpbHRpbiBmdW5jdGlvbnMgZG9lcyBub3QgaGF2ZQorLy8gYWNjZXNzIHF1YWxpZmllciwgd2hpY2ggYnkgZGVmYXVsdCBhc3N1bWUgcmVhZF9vbmx5IGFjY2VzcyBxdWFsaWZpZXIuIEltYWdlIHF1ZXJ5IGJ1aWx0aW4KKy8vIGZ1bmN0aW9ucyB3aXRoIHdyaXRlX29ubHkgaW1hZ2UgYXJndW1lbnQgc2hvdWxkIGFsc28gYmUgZGVjbGFyZWQuCisKKy8qKgorICogUmV0dXJuIHRoZSBpbWFnZSB3aWR0aCBpbiBwaXhlbHMuCisgKgorICAqLworaW50IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX3dpZHRoKHJlYWRfb25seSBpbWFnZTFkX3QgaW1hZ2UpOworaW50IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX3dpZHRoKHJlYWRfb25seSBpbWFnZTFkX2J1ZmZlcl90IGltYWdlKTsKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV93aWR0aChyZWFkX29ubHkgaW1hZ2UyZF90IGltYWdlKTsKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV93aWR0aChyZWFkX29ubHkgaW1hZ2UzZF90IGltYWdlKTsKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV93aWR0aChyZWFkX29ubHkgaW1hZ2UxZF9hcnJheV90IGltYWdlKTsKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV93aWR0aChyZWFkX29ubHkgaW1hZ2UyZF9hcnJheV90IGltYWdlKTsKKyNpZmRlZiBjbF9raHJfZGVwdGhfaW1hZ2VzCitpbnQgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2Vfd2lkdGgocmVhZF9vbmx5IGltYWdlMmRfZGVwdGhfdCBpbWFnZSk7CitpbnQgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2Vfd2lkdGgocmVhZF9vbmx5IGltYWdlMmRfYXJyYXlfZGVwdGhfdCBpbWFnZSk7CisjZW5kaWYgLy9jbF9raHJfZGVwdGhfaW1hZ2VzCisjaWYgZGVmaW5lZChjbF9raHJfZ2xfbXNhYV9zaGFyaW5nKQoraW50IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX3dpZHRoKHJlYWRfb25seSBpbWFnZTJkX21zYWFfdCBpbWFnZSk7CitpbnQgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2Vfd2lkdGgocmVhZF9vbmx5IGltYWdlMmRfbXNhYV9kZXB0aF90IGltYWdlKTsKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV93aWR0aChyZWFkX29ubHkgaW1hZ2UyZF9hcnJheV9tc2FhX3QgaW1hZ2UpOworaW50IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX3dpZHRoKHJlYWRfb25seSBpbWFnZTJkX2FycmF5X21zYWFfZGVwdGhfdCBpbWFnZSk7CisjZW5kaWYgLy9jbF9raHJfZ2xfbXNhYV9zaGFyaW5nCisKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV93aWR0aCh3cml0ZV9vbmx5IGltYWdlMWRfdCBpbWFnZSk7CitpbnQgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2Vfd2lkdGgod3JpdGVfb25seSBpbWFnZTFkX2J1ZmZlcl90IGltYWdlKTsKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV93aWR0aCh3cml0ZV9vbmx5IGltYWdlMmRfdCBpbWFnZSk7CitpbnQgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2Vfd2lkdGgod3JpdGVfb25seSBpbWFnZTNkX3QgaW1hZ2UpOworaW50IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX3dpZHRoKHdyaXRlX29ubHkgaW1hZ2UxZF9hcnJheV90IGltYWdlKTsKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV93aWR0aCh3cml0ZV9vbmx5IGltYWdlMmRfYXJyYXlfdCBpbWFnZSk7CisjaWZkZWYgY2xfa2hyX2RlcHRoX2ltYWdlcworaW50IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX3dpZHRoKHdyaXRlX29ubHkgaW1hZ2UyZF9kZXB0aF90IGltYWdlKTsKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV93aWR0aCh3cml0ZV9vbmx5IGltYWdlMmRfYXJyYXlfZGVwdGhfdCBpbWFnZSk7CisjZW5kaWYgLy9jbF9raHJfZGVwdGhfaW1hZ2VzCisjaWYgZGVmaW5lZChjbF9raHJfZ2xfbXNhYV9zaGFyaW5nKQoraW50IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX3dpZHRoKHdyaXRlX29ubHkgaW1hZ2UyZF9tc2FhX3QgaW1hZ2UpOworaW50IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX3dpZHRoKHdyaXRlX29ubHkgaW1hZ2UyZF9tc2FhX2RlcHRoX3QgaW1hZ2UpOworaW50IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX3dpZHRoKHdyaXRlX29ubHkgaW1hZ2UyZF9hcnJheV9tc2FhX3QgaW1hZ2UpOworaW50IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX3dpZHRoKHdyaXRlX29ubHkgaW1hZ2UyZF9hcnJheV9tc2FhX2RlcHRoX3QgaW1hZ2UpOworI2VuZGlmIC8vY2xfa2hyX2dsX21zYWFfc2hhcmluZworCisjaWYgX19PUEVOQ0xfQ19WRVJTSU9OX18gPj0gQ0xfVkVSU0lPTl8yXzAKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV93aWR0aChyZWFkX3dyaXRlIGltYWdlMWRfdCBpbWFnZSk7CitpbnQgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2Vfd2lkdGgocmVhZF93cml0ZSBpbWFnZTFkX2J1ZmZlcl90IGltYWdlKTsKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV93aWR0aChyZWFkX3dyaXRlIGltYWdlMmRfdCBpbWFnZSk7CitpbnQgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2Vfd2lkdGgocmVhZF93cml0ZSBpbWFnZTNkX3QgaW1hZ2UpOworaW50IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX3dpZHRoKHJlYWRfd3JpdGUgaW1hZ2UxZF9hcnJheV90IGltYWdlKTsKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV93aWR0aChyZWFkX3dyaXRlIGltYWdlMmRfYXJyYXlfdCBpbWFnZSk7CisjaWZkZWYgY2xfa2hyX2RlcHRoX2ltYWdlcworaW50IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX3dpZHRoKHJlYWRfd3JpdGUgaW1hZ2UyZF9kZXB0aF90IGltYWdlKTsKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV93aWR0aChyZWFkX3dyaXRlIGltYWdlMmRfYXJyYXlfZGVwdGhfdCBpbWFnZSk7CisjZW5kaWYgLy9jbF9raHJfZGVwdGhfaW1hZ2VzCisjaWYgZGVmaW5lZChjbF9raHJfZ2xfbXNhYV9zaGFyaW5nKQoraW50IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX3dpZHRoKHJlYWRfd3JpdGUgaW1hZ2UyZF9tc2FhX3QgaW1hZ2UpOworaW50IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX3dpZHRoKHJlYWRfd3JpdGUgaW1hZ2UyZF9tc2FhX2RlcHRoX3QgaW1hZ2UpOworaW50IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX3dpZHRoKHJlYWRfd3JpdGUgaW1hZ2UyZF9hcnJheV9tc2FhX3QgaW1hZ2UpOworaW50IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX3dpZHRoKHJlYWRfd3JpdGUgaW1hZ2UyZF9hcnJheV9tc2FhX2RlcHRoX3QgaW1hZ2UpOworI2VuZGlmIC8vY2xfa2hyX2dsX21zYWFfc2hhcmluZworI2VuZGlmIC8vX19PUEVOQ0xfQ19WRVJTSU9OX18gPj0gQ0xfVkVSU0lPTl8yXzAKKworLyoqCisgKiBSZXR1cm4gdGhlIGltYWdlIGhlaWdodCBpbiBwaXhlbHMuCisgKi8KK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV9oZWlnaHQocmVhZF9vbmx5IGltYWdlMmRfdCBpbWFnZSk7CitpbnQgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfaGVpZ2h0KHJlYWRfb25seSBpbWFnZTNkX3QgaW1hZ2UpOworaW50IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX2hlaWdodChyZWFkX29ubHkgaW1hZ2UyZF9hcnJheV90IGltYWdlKTsKKyNpZmRlZiBjbF9raHJfZGVwdGhfaW1hZ2VzCitpbnQgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfaGVpZ2h0KHJlYWRfb25seSBpbWFnZTJkX2RlcHRoX3QgaW1hZ2UpOworaW50IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX2hlaWdodChyZWFkX29ubHkgaW1hZ2UyZF9hcnJheV9kZXB0aF90IGltYWdlKTsKKyNlbmRpZiAvL2NsX2tocl9kZXB0aF9pbWFnZXMKKyNpZiBkZWZpbmVkKGNsX2tocl9nbF9tc2FhX3NoYXJpbmcpCitpbnQgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfaGVpZ2h0KHJlYWRfb25seSBpbWFnZTJkX21zYWFfdCBpbWFnZSk7CitpbnQgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfaGVpZ2h0KHJlYWRfb25seSBpbWFnZTJkX21zYWFfZGVwdGhfdCBpbWFnZSk7CitpbnQgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfaGVpZ2h0KHJlYWRfb25seSBpbWFnZTJkX2FycmF5X21zYWFfdCBpbWFnZSk7CitpbnQgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfaGVpZ2h0KHJlYWRfb25seSBpbWFnZTJkX2FycmF5X21zYWFfZGVwdGhfdCBpbWFnZSk7CisjZW5kaWYgLy9jbF9raHJfZ2xfbXNhYV9zaGFyaW5nCisKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV9oZWlnaHQod3JpdGVfb25seSBpbWFnZTJkX3QgaW1hZ2UpOworaW50IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX2hlaWdodCh3cml0ZV9vbmx5IGltYWdlM2RfdCBpbWFnZSk7CitpbnQgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfaGVpZ2h0KHdyaXRlX29ubHkgaW1hZ2UyZF9hcnJheV90IGltYWdlKTsKKyNpZmRlZiBjbF9raHJfZGVwdGhfaW1hZ2VzCitpbnQgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfaGVpZ2h0KHdyaXRlX29ubHkgaW1hZ2UyZF9kZXB0aF90IGltYWdlKTsKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV9oZWlnaHQod3JpdGVfb25seSBpbWFnZTJkX2FycmF5X2RlcHRoX3QgaW1hZ2UpOworI2VuZGlmIC8vY2xfa2hyX2RlcHRoX2ltYWdlcworI2lmIGRlZmluZWQoY2xfa2hyX2dsX21zYWFfc2hhcmluZykKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV9oZWlnaHQod3JpdGVfb25seSBpbWFnZTJkX21zYWFfdCBpbWFnZSk7CitpbnQgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfaGVpZ2h0KHdyaXRlX29ubHkgaW1hZ2UyZF9tc2FhX2RlcHRoX3QgaW1hZ2UpOworaW50IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX2hlaWdodCh3cml0ZV9vbmx5IGltYWdlMmRfYXJyYXlfbXNhYV90IGltYWdlKTsKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV9oZWlnaHQod3JpdGVfb25seSBpbWFnZTJkX2FycmF5X21zYWFfZGVwdGhfdCBpbWFnZSk7CisjZW5kaWYgLy9jbF9raHJfZ2xfbXNhYV9zaGFyaW5nCisKKyNpZiBfX09QRU5DTF9DX1ZFUlNJT05fXyA+PSBDTF9WRVJTSU9OXzJfMAoraW50IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX2hlaWdodChyZWFkX3dyaXRlIGltYWdlMmRfdCBpbWFnZSk7CitpbnQgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfaGVpZ2h0KHJlYWRfd3JpdGUgaW1hZ2UzZF90IGltYWdlKTsKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV9oZWlnaHQocmVhZF93cml0ZSBpbWFnZTJkX2FycmF5X3QgaW1hZ2UpOworI2lmZGVmIGNsX2tocl9kZXB0aF9pbWFnZXMKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV9oZWlnaHQocmVhZF93cml0ZSBpbWFnZTJkX2RlcHRoX3QgaW1hZ2UpOworaW50IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX2hlaWdodChyZWFkX3dyaXRlIGltYWdlMmRfYXJyYXlfZGVwdGhfdCBpbWFnZSk7CisjZW5kaWYgLy9jbF9raHJfZGVwdGhfaW1hZ2VzCisjaWYgZGVmaW5lZChjbF9raHJfZ2xfbXNhYV9zaGFyaW5nKQoraW50IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX2hlaWdodChyZWFkX3dyaXRlIGltYWdlMmRfbXNhYV90IGltYWdlKTsKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV9oZWlnaHQocmVhZF93cml0ZSBpbWFnZTJkX21zYWFfZGVwdGhfdCBpbWFnZSk7CitpbnQgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfaGVpZ2h0KHJlYWRfd3JpdGUgaW1hZ2UyZF9hcnJheV9tc2FhX3QgaW1hZ2UpOworaW50IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX2hlaWdodChyZWFkX3dyaXRlIGltYWdlMmRfYXJyYXlfbXNhYV9kZXB0aF90IGltYWdlKTsKKyNlbmRpZiAvL2NsX2tocl9nbF9tc2FhX3NoYXJpbmcKKyNlbmRpZiAvL19fT1BFTkNMX0NfVkVSU0lPTl9fID49IENMX1ZFUlNJT05fMl8wCisKKy8qKgorICogUmV0dXJuIHRoZSBpbWFnZSBkZXB0aCBpbiBwaXhlbHMuCisgKi8KK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV9kZXB0aChyZWFkX29ubHkgaW1hZ2UzZF90IGltYWdlKTsKKworaW50IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX2RlcHRoKHdyaXRlX29ubHkgaW1hZ2UzZF90IGltYWdlKTsKKworI2lmIF9fT1BFTkNMX0NfVkVSU0lPTl9fID49IENMX1ZFUlNJT05fMl8wCitpbnQgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfZGVwdGgocmVhZF93cml0ZSBpbWFnZTNkX3QgaW1hZ2UpOworI2VuZGlmIC8vX19PUEVOQ0xfQ19WRVJTSU9OX18gPj0gQ0xfVkVSU0lPTl8yXzAKKworLy8gT3BlbkNMIEV4dGVuc2lvbiB2Mi4wIHM5LjE4IC0gTWlwbWFwcworI2lmZGVmIGNsX2tocl9taXBtYXBfaW1hZ2UKKy8qKgorICogUmV0dXJuIHRoZSBpbWFnZSBtaXBsZXZlbHMuCisgKi8KKworaW50IF9fb3ZsZCBnZXRfaW1hZ2VfbnVtX21pcF9sZXZlbHMocmVhZF9vbmx5IGltYWdlMWRfdCBpbWFnZSk7CitpbnQgX19vdmxkIGdldF9pbWFnZV9udW1fbWlwX2xldmVscyhyZWFkX29ubHkgaW1hZ2UyZF90IGltYWdlKTsKK2ludCBfX292bGQgZ2V0X2ltYWdlX251bV9taXBfbGV2ZWxzKHJlYWRfb25seSBpbWFnZTNkX3QgaW1hZ2UpOworCitpbnQgX19vdmxkIGdldF9pbWFnZV9udW1fbWlwX2xldmVscyh3cml0ZV9vbmx5IGltYWdlMWRfdCBpbWFnZSk7CitpbnQgX19vdmxkIGdldF9pbWFnZV9udW1fbWlwX2xldmVscyh3cml0ZV9vbmx5IGltYWdlMmRfdCBpbWFnZSk7CitpbnQgX19vdmxkIGdldF9pbWFnZV9udW1fbWlwX2xldmVscyh3cml0ZV9vbmx5IGltYWdlM2RfdCBpbWFnZSk7CisKKyNpZiBfX09QRU5DTF9DX1ZFUlNJT05fXyA+PSBDTF9WRVJTSU9OXzJfMAoraW50IF9fb3ZsZCBnZXRfaW1hZ2VfbnVtX21pcF9sZXZlbHMocmVhZF93cml0ZSBpbWFnZTFkX3QgaW1hZ2UpOworaW50IF9fb3ZsZCBnZXRfaW1hZ2VfbnVtX21pcF9sZXZlbHMocmVhZF93cml0ZSBpbWFnZTJkX3QgaW1hZ2UpOworaW50IF9fb3ZsZCBnZXRfaW1hZ2VfbnVtX21pcF9sZXZlbHMocmVhZF93cml0ZSBpbWFnZTNkX3QgaW1hZ2UpOworI2VuZGlmIC8vX19PUEVOQ0xfQ19WRVJTSU9OX18gPj0gQ0xfVkVSU0lPTl8yXzAKKworaW50IF9fb3ZsZCBnZXRfaW1hZ2VfbnVtX21pcF9sZXZlbHMocmVhZF9vbmx5IGltYWdlMWRfYXJyYXlfdCBpbWFnZSk7CitpbnQgX19vdmxkIGdldF9pbWFnZV9udW1fbWlwX2xldmVscyhyZWFkX29ubHkgaW1hZ2UyZF9hcnJheV90IGltYWdlKTsKK2ludCBfX292bGQgZ2V0X2ltYWdlX251bV9taXBfbGV2ZWxzKHJlYWRfb25seSBpbWFnZTJkX2FycmF5X2RlcHRoX3QgaW1hZ2UpOworaW50IF9fb3ZsZCBnZXRfaW1hZ2VfbnVtX21pcF9sZXZlbHMocmVhZF9vbmx5IGltYWdlMmRfZGVwdGhfdCBpbWFnZSk7CisKK2ludCBfX292bGQgZ2V0X2ltYWdlX251bV9taXBfbGV2ZWxzKHdyaXRlX29ubHkgaW1hZ2UxZF9hcnJheV90IGltYWdlKTsKK2ludCBfX292bGQgZ2V0X2ltYWdlX251bV9taXBfbGV2ZWxzKHdyaXRlX29ubHkgaW1hZ2UyZF9hcnJheV90IGltYWdlKTsKK2ludCBfX292bGQgZ2V0X2ltYWdlX251bV9taXBfbGV2ZWxzKHdyaXRlX29ubHkgaW1hZ2UyZF9hcnJheV9kZXB0aF90IGltYWdlKTsKK2ludCBfX292bGQgZ2V0X2ltYWdlX251bV9taXBfbGV2ZWxzKHdyaXRlX29ubHkgaW1hZ2UyZF9kZXB0aF90IGltYWdlKTsKKworI2lmIF9fT1BFTkNMX0NfVkVSU0lPTl9fID49IENMX1ZFUlNJT05fMl8wCitpbnQgX19vdmxkIGdldF9pbWFnZV9udW1fbWlwX2xldmVscyhyZWFkX3dyaXRlIGltYWdlMWRfYXJyYXlfdCBpbWFnZSk7CitpbnQgX19vdmxkIGdldF9pbWFnZV9udW1fbWlwX2xldmVscyhyZWFkX3dyaXRlIGltYWdlMmRfYXJyYXlfdCBpbWFnZSk7CitpbnQgX19vdmxkIGdldF9pbWFnZV9udW1fbWlwX2xldmVscyhyZWFkX3dyaXRlIGltYWdlMmRfYXJyYXlfZGVwdGhfdCBpbWFnZSk7CitpbnQgX19vdmxkIGdldF9pbWFnZV9udW1fbWlwX2xldmVscyhyZWFkX3dyaXRlIGltYWdlMmRfZGVwdGhfdCBpbWFnZSk7CisjZW5kaWYgLy9fX09QRU5DTF9DX1ZFUlNJT05fXyA+PSBDTF9WRVJTSU9OXzJfMAorCisjZW5kaWYgLy9jbF9raHJfbWlwbWFwX2ltYWdlCisKKy8qKgorICogUmV0dXJuIHRoZSBjaGFubmVsIGRhdGEgdHlwZS4gVmFsaWQgdmFsdWVzIGFyZToKKyAqIENMS19TTk9STV9JTlQ4CisgKiBDTEtfU05PUk1fSU5UMTYKKyAqIENMS19VTk9STV9JTlQ4CisgKiBDTEtfVU5PUk1fSU5UMTYKKyAqIENMS19VTk9STV9TSE9SVF81NjUKKyAqIENMS19VTk9STV9TSE9SVF81NTUKKyAqIENMS19VTk9STV9TSE9SVF8xMDEwMTAKKyAqIENMS19TSUdORURfSU5UOAorICogQ0xLX1NJR05FRF9JTlQxNgorICogQ0xLX1NJR05FRF9JTlQzMgorICogQ0xLX1VOU0lHTkVEX0lOVDgKKyAqIENMS19VTlNJR05FRF9JTlQxNgorICogQ0xLX1VOU0lHTkVEX0lOVDMyCisgKiBDTEtfSEFMRl9GTE9BVAorICogQ0xLX0ZMT0FUCisgKi8KKworLy8KKy8vIENoYW5uZWwgRGF0YXR5cGUuCisvLworI2RlZmluZSBDTEtfU05PUk1fSU5UOCAgICAgICAgMHgxMEQwCisjZGVmaW5lIENMS19TTk9STV9JTlQxNiAgICAgICAweDEwRDEKKyNkZWZpbmUgQ0xLX1VOT1JNX0lOVDggICAgICAgIDB4MTBEMgorI2RlZmluZSBDTEtfVU5PUk1fSU5UMTYgICAgICAgMHgxMEQzCisjZGVmaW5lIENMS19VTk9STV9TSE9SVF81NjUgICAweDEwRDQKKyNkZWZpbmUgQ0xLX1VOT1JNX1NIT1JUXzU1NSAgIDB4MTBENQorI2RlZmluZSBDTEtfVU5PUk1fSU5UXzEwMTAxMCAgMHgxMEQ2CisjZGVmaW5lIENMS19TSUdORURfSU5UOCAgICAgICAweDEwRDcKKyNkZWZpbmUgQ0xLX1NJR05FRF9JTlQxNiAgICAgIDB4MTBEOAorI2RlZmluZSBDTEtfU0lHTkVEX0lOVDMyICAgICAgMHgxMEQ5CisjZGVmaW5lIENMS19VTlNJR05FRF9JTlQ4ICAgICAweDEwREEKKyNkZWZpbmUgQ0xLX1VOU0lHTkVEX0lOVDE2ICAgIDB4MTBEQgorI2RlZmluZSBDTEtfVU5TSUdORURfSU5UMzIgICAgMHgxMERDCisjZGVmaW5lIENMS19IQUxGX0ZMT0FUICAgICAgICAweDEwREQKKyNkZWZpbmUgQ0xLX0ZMT0FUICAgICAgICAgICAgIDB4MTBERQorI2RlZmluZSBDTEtfVU5PUk1fSU5UMjQgICAgICAgMHgxMERGCisKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV9jaGFubmVsX2RhdGFfdHlwZShyZWFkX29ubHkgaW1hZ2UxZF90IGltYWdlKTsKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV9jaGFubmVsX2RhdGFfdHlwZShyZWFkX29ubHkgaW1hZ2UxZF9idWZmZXJfdCBpbWFnZSk7CitpbnQgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfY2hhbm5lbF9kYXRhX3R5cGUocmVhZF9vbmx5IGltYWdlMmRfdCBpbWFnZSk7CitpbnQgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfY2hhbm5lbF9kYXRhX3R5cGUocmVhZF9vbmx5IGltYWdlM2RfdCBpbWFnZSk7CitpbnQgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfY2hhbm5lbF9kYXRhX3R5cGUocmVhZF9vbmx5IGltYWdlMWRfYXJyYXlfdCBpbWFnZSk7CitpbnQgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfY2hhbm5lbF9kYXRhX3R5cGUocmVhZF9vbmx5IGltYWdlMmRfYXJyYXlfdCBpbWFnZSk7CisjaWZkZWYgY2xfa2hyX2RlcHRoX2ltYWdlcworaW50IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX2NoYW5uZWxfZGF0YV90eXBlKHJlYWRfb25seSBpbWFnZTJkX2RlcHRoX3QgaW1hZ2UpOworaW50IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX2NoYW5uZWxfZGF0YV90eXBlKHJlYWRfb25seSBpbWFnZTJkX2FycmF5X2RlcHRoX3QgaW1hZ2UpOworI2VuZGlmIC8vY2xfa2hyX2RlcHRoX2ltYWdlcworI2lmIGRlZmluZWQoY2xfa2hyX2dsX21zYWFfc2hhcmluZykKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV9jaGFubmVsX2RhdGFfdHlwZShyZWFkX29ubHkgaW1hZ2UyZF9tc2FhX3QgaW1hZ2UpOworaW50IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX2NoYW5uZWxfZGF0YV90eXBlKHJlYWRfb25seSBpbWFnZTJkX21zYWFfZGVwdGhfdCBpbWFnZSk7CitpbnQgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfY2hhbm5lbF9kYXRhX3R5cGUocmVhZF9vbmx5IGltYWdlMmRfYXJyYXlfbXNhYV90IGltYWdlKTsKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV9jaGFubmVsX2RhdGFfdHlwZShyZWFkX29ubHkgaW1hZ2UyZF9hcnJheV9tc2FhX2RlcHRoX3QgaW1hZ2UpOworI2VuZGlmIC8vY2xfa2hyX2dsX21zYWFfc2hhcmluZworCitpbnQgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfY2hhbm5lbF9kYXRhX3R5cGUod3JpdGVfb25seSBpbWFnZTFkX3QgaW1hZ2UpOworaW50IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX2NoYW5uZWxfZGF0YV90eXBlKHdyaXRlX29ubHkgaW1hZ2UxZF9idWZmZXJfdCBpbWFnZSk7CitpbnQgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfY2hhbm5lbF9kYXRhX3R5cGUod3JpdGVfb25seSBpbWFnZTJkX3QgaW1hZ2UpOworaW50IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX2NoYW5uZWxfZGF0YV90eXBlKHdyaXRlX29ubHkgaW1hZ2UzZF90IGltYWdlKTsKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV9jaGFubmVsX2RhdGFfdHlwZSh3cml0ZV9vbmx5IGltYWdlMWRfYXJyYXlfdCBpbWFnZSk7CitpbnQgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfY2hhbm5lbF9kYXRhX3R5cGUod3JpdGVfb25seSBpbWFnZTJkX2FycmF5X3QgaW1hZ2UpOworI2lmZGVmIGNsX2tocl9kZXB0aF9pbWFnZXMKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV9jaGFubmVsX2RhdGFfdHlwZSh3cml0ZV9vbmx5IGltYWdlMmRfZGVwdGhfdCBpbWFnZSk7CitpbnQgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfY2hhbm5lbF9kYXRhX3R5cGUod3JpdGVfb25seSBpbWFnZTJkX2FycmF5X2RlcHRoX3QgaW1hZ2UpOworI2VuZGlmIC8vY2xfa2hyX2RlcHRoX2ltYWdlcworI2lmIGRlZmluZWQoY2xfa2hyX2dsX21zYWFfc2hhcmluZykKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV9jaGFubmVsX2RhdGFfdHlwZSh3cml0ZV9vbmx5IGltYWdlMmRfbXNhYV90IGltYWdlKTsKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV9jaGFubmVsX2RhdGFfdHlwZSh3cml0ZV9vbmx5IGltYWdlMmRfbXNhYV9kZXB0aF90IGltYWdlKTsKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV9jaGFubmVsX2RhdGFfdHlwZSh3cml0ZV9vbmx5IGltYWdlMmRfYXJyYXlfbXNhYV90IGltYWdlKTsKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV9jaGFubmVsX2RhdGFfdHlwZSh3cml0ZV9vbmx5IGltYWdlMmRfYXJyYXlfbXNhYV9kZXB0aF90IGltYWdlKTsKKyNlbmRpZiAvL2NsX2tocl9nbF9tc2FhX3NoYXJpbmcKKworI2lmIF9fT1BFTkNMX0NfVkVSU0lPTl9fID49IENMX1ZFUlNJT05fMl8wCitpbnQgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfY2hhbm5lbF9kYXRhX3R5cGUocmVhZF93cml0ZSBpbWFnZTFkX3QgaW1hZ2UpOworaW50IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX2NoYW5uZWxfZGF0YV90eXBlKHJlYWRfd3JpdGUgaW1hZ2UxZF9idWZmZXJfdCBpbWFnZSk7CitpbnQgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfY2hhbm5lbF9kYXRhX3R5cGUocmVhZF93cml0ZSBpbWFnZTJkX3QgaW1hZ2UpOworaW50IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX2NoYW5uZWxfZGF0YV90eXBlKHJlYWRfd3JpdGUgaW1hZ2UzZF90IGltYWdlKTsKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV9jaGFubmVsX2RhdGFfdHlwZShyZWFkX3dyaXRlIGltYWdlMWRfYXJyYXlfdCBpbWFnZSk7CitpbnQgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfY2hhbm5lbF9kYXRhX3R5cGUocmVhZF93cml0ZSBpbWFnZTJkX2FycmF5X3QgaW1hZ2UpOworI2lmZGVmIGNsX2tocl9kZXB0aF9pbWFnZXMKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV9jaGFubmVsX2RhdGFfdHlwZShyZWFkX3dyaXRlIGltYWdlMmRfZGVwdGhfdCBpbWFnZSk7CitpbnQgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfY2hhbm5lbF9kYXRhX3R5cGUocmVhZF93cml0ZSBpbWFnZTJkX2FycmF5X2RlcHRoX3QgaW1hZ2UpOworI2VuZGlmIC8vY2xfa2hyX2RlcHRoX2ltYWdlcworI2lmIGRlZmluZWQoY2xfa2hyX2dsX21zYWFfc2hhcmluZykKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV9jaGFubmVsX2RhdGFfdHlwZShyZWFkX3dyaXRlIGltYWdlMmRfbXNhYV90IGltYWdlKTsKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV9jaGFubmVsX2RhdGFfdHlwZShyZWFkX3dyaXRlIGltYWdlMmRfbXNhYV9kZXB0aF90IGltYWdlKTsKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV9jaGFubmVsX2RhdGFfdHlwZShyZWFkX3dyaXRlIGltYWdlMmRfYXJyYXlfbXNhYV90IGltYWdlKTsKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV9jaGFubmVsX2RhdGFfdHlwZShyZWFkX3dyaXRlIGltYWdlMmRfYXJyYXlfbXNhYV9kZXB0aF90IGltYWdlKTsKKyNlbmRpZiAvL2NsX2tocl9nbF9tc2FhX3NoYXJpbmcKKyNlbmRpZiAvL19fT1BFTkNMX0NfVkVSU0lPTl9fID49IENMX1ZFUlNJT05fMl8wCisKKy8qKgorICogUmV0dXJuIHRoZSBpbWFnZSBjaGFubmVsIG9yZGVyLiBWYWxpZCB2YWx1ZXMgYXJlOgorICogQ0xLX0EKKyAqIENMS19SCisgKiBDTEtfUngKKyAqIENMS19SRworICogQ0xLX1JHeAorICogQ0xLX1JBCisgKiBDTEtfUkdCCisgKiBDTEtfUkdCeAorICogQ0xLX1JHQkEKKyAqIENMS19BUkdCCisgKiBDTEtfQkdSQQorICogQ0xLX0lOVEVOU0lUWQorICogQ0xLX0xVTUlOQU5DRQorICovCisvLyBDaGFubmVsIG9yZGVyLCBudW1iZXJpbmcgbXVzdCBiZSBhbGlnbmVkIHdpdGggY2xfY2hhbm5lbF9vcmRlciBpbiBjbC5oCisvLworI2RlZmluZSBDTEtfUiAgICAgICAgIDB4MTBCMAorI2RlZmluZSBDTEtfQSAgICAgICAgIDB4MTBCMQorI2RlZmluZSBDTEtfUkcgICAgICAgIDB4MTBCMgorI2RlZmluZSBDTEtfUkEgICAgICAgIDB4MTBCMworI2RlZmluZSBDTEtfUkdCICAgICAgIDB4MTBCNAorI2RlZmluZSBDTEtfUkdCQSAgICAgIDB4MTBCNQorI2RlZmluZSBDTEtfQkdSQSAgICAgIDB4MTBCNgorI2RlZmluZSBDTEtfQVJHQiAgICAgIDB4MTBCNworI2RlZmluZSBDTEtfSU5URU5TSVRZIDB4MTBCOAorI2RlZmluZSBDTEtfTFVNSU5BTkNFIDB4MTBCOQorI2RlZmluZSBDTEtfUnggICAgICAgICAgICAgICAgMHgxMEJBCisjZGVmaW5lIENMS19SR3ggICAgICAgICAgICAgICAweDEwQkIKKyNkZWZpbmUgQ0xLX1JHQnggICAgICAgICAgICAgIDB4MTBCQworI2RlZmluZSBDTEtfREVQVEggICAgICAgICAgICAgMHgxMEJECisjZGVmaW5lIENMS19ERVBUSF9TVEVOQ0lMICAgICAweDEwQkUKKyNpZiBfX09QRU5DTF9DX1ZFUlNJT05fXyA+PSBDTF9WRVJTSU9OXzJfMAorI2RlZmluZSBDTEtfc1JHQiAgICAgICAgICAgICAgMHgxMEJGCisjZGVmaW5lIENMS19zUkdCQSAgICAgICAgICAgICAweDEwQzEKKyNkZWZpbmUgQ0xLX3NSR0J4ICAgICAgICAgICAgIDB4MTBDMAorI2RlZmluZSBDTEtfc0JHUkEgICAgICAgICAgICAgMHgxMEMyCisjZW5kaWYgLy9fX09QRU5DTF9DX1ZFUlNJT05fXyA+PSBDTF9WRVJTSU9OXzJfMAorCitpbnQgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfY2hhbm5lbF9vcmRlcihyZWFkX29ubHkgaW1hZ2UxZF90IGltYWdlKTsKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV9jaGFubmVsX29yZGVyKHJlYWRfb25seSBpbWFnZTFkX2J1ZmZlcl90IGltYWdlKTsKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV9jaGFubmVsX29yZGVyKHJlYWRfb25seSBpbWFnZTJkX3QgaW1hZ2UpOworaW50IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX2NoYW5uZWxfb3JkZXIocmVhZF9vbmx5IGltYWdlM2RfdCBpbWFnZSk7CitpbnQgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfY2hhbm5lbF9vcmRlcihyZWFkX29ubHkgaW1hZ2UxZF9hcnJheV90IGltYWdlKTsKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV9jaGFubmVsX29yZGVyKHJlYWRfb25seSBpbWFnZTJkX2FycmF5X3QgaW1hZ2UpOworI2lmZGVmIGNsX2tocl9kZXB0aF9pbWFnZXMKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV9jaGFubmVsX29yZGVyKHJlYWRfb25seSBpbWFnZTJkX2RlcHRoX3QgaW1hZ2UpOworaW50IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX2NoYW5uZWxfb3JkZXIocmVhZF9vbmx5IGltYWdlMmRfYXJyYXlfZGVwdGhfdCBpbWFnZSk7CisjZW5kaWYgLy9jbF9raHJfZGVwdGhfaW1hZ2VzCisjaWYgZGVmaW5lZChjbF9raHJfZ2xfbXNhYV9zaGFyaW5nKQoraW50IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX2NoYW5uZWxfb3JkZXIocmVhZF9vbmx5IGltYWdlMmRfbXNhYV90IGltYWdlKTsKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV9jaGFubmVsX29yZGVyKHJlYWRfb25seSBpbWFnZTJkX21zYWFfZGVwdGhfdCBpbWFnZSk7CitpbnQgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfY2hhbm5lbF9vcmRlcihyZWFkX29ubHkgaW1hZ2UyZF9hcnJheV9tc2FhX3QgaW1hZ2UpOworaW50IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX2NoYW5uZWxfb3JkZXIocmVhZF9vbmx5IGltYWdlMmRfYXJyYXlfbXNhYV9kZXB0aF90IGltYWdlKTsKKyNlbmRpZiAvL2NsX2tocl9nbF9tc2FhX3NoYXJpbmcKKworaW50IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX2NoYW5uZWxfb3JkZXIod3JpdGVfb25seSBpbWFnZTFkX3QgaW1hZ2UpOworaW50IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX2NoYW5uZWxfb3JkZXIod3JpdGVfb25seSBpbWFnZTFkX2J1ZmZlcl90IGltYWdlKTsKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV9jaGFubmVsX29yZGVyKHdyaXRlX29ubHkgaW1hZ2UyZF90IGltYWdlKTsKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV9jaGFubmVsX29yZGVyKHdyaXRlX29ubHkgaW1hZ2UzZF90IGltYWdlKTsKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV9jaGFubmVsX29yZGVyKHdyaXRlX29ubHkgaW1hZ2UxZF9hcnJheV90IGltYWdlKTsKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV9jaGFubmVsX29yZGVyKHdyaXRlX29ubHkgaW1hZ2UyZF9hcnJheV90IGltYWdlKTsKKyNpZmRlZiBjbF9raHJfZGVwdGhfaW1hZ2VzCitpbnQgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfY2hhbm5lbF9vcmRlcih3cml0ZV9vbmx5IGltYWdlMmRfZGVwdGhfdCBpbWFnZSk7CitpbnQgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfY2hhbm5lbF9vcmRlcih3cml0ZV9vbmx5IGltYWdlMmRfYXJyYXlfZGVwdGhfdCBpbWFnZSk7CisjZW5kaWYgLy9jbF9raHJfZGVwdGhfaW1hZ2VzCisjaWYgZGVmaW5lZChjbF9raHJfZ2xfbXNhYV9zaGFyaW5nKQoraW50IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX2NoYW5uZWxfb3JkZXIod3JpdGVfb25seSBpbWFnZTJkX21zYWFfdCBpbWFnZSk7CitpbnQgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfY2hhbm5lbF9vcmRlcih3cml0ZV9vbmx5IGltYWdlMmRfbXNhYV9kZXB0aF90IGltYWdlKTsKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV9jaGFubmVsX29yZGVyKHdyaXRlX29ubHkgaW1hZ2UyZF9hcnJheV9tc2FhX3QgaW1hZ2UpOworaW50IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX2NoYW5uZWxfb3JkZXIod3JpdGVfb25seSBpbWFnZTJkX2FycmF5X21zYWFfZGVwdGhfdCBpbWFnZSk7CisjZW5kaWYgLy9jbF9raHJfZ2xfbXNhYV9zaGFyaW5nCisKKyNpZiBfX09QRU5DTF9DX1ZFUlNJT05fXyA+PSBDTF9WRVJTSU9OXzJfMAoraW50IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX2NoYW5uZWxfb3JkZXIocmVhZF93cml0ZSBpbWFnZTFkX3QgaW1hZ2UpOworaW50IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX2NoYW5uZWxfb3JkZXIocmVhZF93cml0ZSBpbWFnZTFkX2J1ZmZlcl90IGltYWdlKTsKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV9jaGFubmVsX29yZGVyKHJlYWRfd3JpdGUgaW1hZ2UyZF90IGltYWdlKTsKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV9jaGFubmVsX29yZGVyKHJlYWRfd3JpdGUgaW1hZ2UzZF90IGltYWdlKTsKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV9jaGFubmVsX29yZGVyKHJlYWRfd3JpdGUgaW1hZ2UxZF9hcnJheV90IGltYWdlKTsKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV9jaGFubmVsX29yZGVyKHJlYWRfd3JpdGUgaW1hZ2UyZF9hcnJheV90IGltYWdlKTsKKyNpZmRlZiBjbF9raHJfZGVwdGhfaW1hZ2VzCitpbnQgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfY2hhbm5lbF9vcmRlcihyZWFkX3dyaXRlIGltYWdlMmRfZGVwdGhfdCBpbWFnZSk7CitpbnQgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfY2hhbm5lbF9vcmRlcihyZWFkX3dyaXRlIGltYWdlMmRfYXJyYXlfZGVwdGhfdCBpbWFnZSk7CisjZW5kaWYgLy9jbF9raHJfZGVwdGhfaW1hZ2VzCisjaWYgZGVmaW5lZChjbF9raHJfZ2xfbXNhYV9zaGFyaW5nKQoraW50IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX2NoYW5uZWxfb3JkZXIocmVhZF93cml0ZSBpbWFnZTJkX21zYWFfdCBpbWFnZSk7CitpbnQgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfY2hhbm5lbF9vcmRlcihyZWFkX3dyaXRlIGltYWdlMmRfbXNhYV9kZXB0aF90IGltYWdlKTsKK2ludCBfX292bGQgX19jbmZuIGdldF9pbWFnZV9jaGFubmVsX29yZGVyKHJlYWRfd3JpdGUgaW1hZ2UyZF9hcnJheV9tc2FhX3QgaW1hZ2UpOworaW50IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX2NoYW5uZWxfb3JkZXIocmVhZF93cml0ZSBpbWFnZTJkX2FycmF5X21zYWFfZGVwdGhfdCBpbWFnZSk7CisjZW5kaWYgLy9jbF9raHJfZ2xfbXNhYV9zaGFyaW5nCisjZW5kaWYgLy9fX09QRU5DTF9DX1ZFUlNJT05fXyA+PSBDTF9WRVJTSU9OXzJfMAorCisvKioKKyAqIFJldHVybiB0aGUgMkQgaW1hZ2Ugd2lkdGggYW5kIGhlaWdodCBhcyBhbiBpbnQyCisgKiB0eXBlLiBUaGUgd2lkdGggaXMgcmV0dXJuZWQgaW4gdGhlIHggY29tcG9uZW50LCBhbmQKKyAqIHRoZSBoZWlnaHQgaW4gdGhlIHkgY29tcG9uZW50LgorICovCitpbnQyIF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX2RpbShyZWFkX29ubHkgaW1hZ2UyZF90IGltYWdlKTsKK2ludDIgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfZGltKHJlYWRfb25seSBpbWFnZTJkX2FycmF5X3QgaW1hZ2UpOworI2lmZGVmIGNsX2tocl9kZXB0aF9pbWFnZXMKK2ludDIgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfZGltKHJlYWRfb25seSBpbWFnZTJkX2FycmF5X2RlcHRoX3QgaW1hZ2UpOworaW50MiBfX292bGQgX19jbmZuIGdldF9pbWFnZV9kaW0ocmVhZF9vbmx5IGltYWdlMmRfZGVwdGhfdCBpbWFnZSk7CisjZW5kaWYgLy9jbF9raHJfZGVwdGhfaW1hZ2VzCisjaWYgZGVmaW5lZChjbF9raHJfZ2xfbXNhYV9zaGFyaW5nKQoraW50MiBfX292bGQgX19jbmZuIGdldF9pbWFnZV9kaW0ocmVhZF9vbmx5IGltYWdlMmRfbXNhYV90IGltYWdlKTsKK2ludDIgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfZGltKHJlYWRfb25seSBpbWFnZTJkX21zYWFfZGVwdGhfdCBpbWFnZSk7CitpbnQyIF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX2RpbShyZWFkX29ubHkgaW1hZ2UyZF9hcnJheV9tc2FhX3QgaW1hZ2UpOworaW50MiBfX292bGQgX19jbmZuIGdldF9pbWFnZV9kaW0ocmVhZF9vbmx5IGltYWdlMmRfYXJyYXlfbXNhYV9kZXB0aF90IGltYWdlKTsKKyNlbmRpZiAvL2NsX2tocl9nbF9tc2FhX3NoYXJpbmcKKworaW50MiBfX292bGQgX19jbmZuIGdldF9pbWFnZV9kaW0od3JpdGVfb25seSBpbWFnZTJkX3QgaW1hZ2UpOworaW50MiBfX292bGQgX19jbmZuIGdldF9pbWFnZV9kaW0od3JpdGVfb25seSBpbWFnZTJkX2FycmF5X3QgaW1hZ2UpOworI2lmZGVmIGNsX2tocl9kZXB0aF9pbWFnZXMKK2ludDIgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfZGltKHdyaXRlX29ubHkgaW1hZ2UyZF9hcnJheV9kZXB0aF90IGltYWdlKTsKK2ludDIgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfZGltKHdyaXRlX29ubHkgaW1hZ2UyZF9kZXB0aF90IGltYWdlKTsKKyNlbmRpZiAvL2NsX2tocl9kZXB0aF9pbWFnZXMKKyNpZiBkZWZpbmVkKGNsX2tocl9nbF9tc2FhX3NoYXJpbmcpCitpbnQyIF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX2RpbSh3cml0ZV9vbmx5IGltYWdlMmRfbXNhYV90IGltYWdlKTsKK2ludDIgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfZGltKHdyaXRlX29ubHkgaW1hZ2UyZF9tc2FhX2RlcHRoX3QgaW1hZ2UpOworaW50MiBfX292bGQgX19jbmZuIGdldF9pbWFnZV9kaW0od3JpdGVfb25seSBpbWFnZTJkX2FycmF5X21zYWFfdCBpbWFnZSk7CitpbnQyIF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX2RpbSh3cml0ZV9vbmx5IGltYWdlMmRfYXJyYXlfbXNhYV9kZXB0aF90IGltYWdlKTsKKyNlbmRpZiAvL2NsX2tocl9nbF9tc2FhX3NoYXJpbmcKKworI2lmIF9fT1BFTkNMX0NfVkVSU0lPTl9fID49IENMX1ZFUlNJT05fMl8wCitpbnQyIF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX2RpbShyZWFkX3dyaXRlIGltYWdlMmRfdCBpbWFnZSk7CitpbnQyIF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX2RpbShyZWFkX3dyaXRlIGltYWdlMmRfYXJyYXlfdCBpbWFnZSk7CisjaWZkZWYgY2xfa2hyX2RlcHRoX2ltYWdlcworaW50MiBfX292bGQgX19jbmZuIGdldF9pbWFnZV9kaW0ocmVhZF93cml0ZSBpbWFnZTJkX2FycmF5X2RlcHRoX3QgaW1hZ2UpOworaW50MiBfX292bGQgX19jbmZuIGdldF9pbWFnZV9kaW0ocmVhZF93cml0ZSBpbWFnZTJkX2RlcHRoX3QgaW1hZ2UpOworI2VuZGlmIC8vY2xfa2hyX2RlcHRoX2ltYWdlcworI2lmIGRlZmluZWQoY2xfa2hyX2dsX21zYWFfc2hhcmluZykKK2ludDIgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfZGltKHJlYWRfd3JpdGUgaW1hZ2UyZF9tc2FhX3QgaW1hZ2UpOworaW50MiBfX292bGQgX19jbmZuIGdldF9pbWFnZV9kaW0ocmVhZF93cml0ZSBpbWFnZTJkX21zYWFfZGVwdGhfdCBpbWFnZSk7CitpbnQyIF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX2RpbShyZWFkX3dyaXRlIGltYWdlMmRfYXJyYXlfbXNhYV90IGltYWdlKTsKK2ludDIgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfZGltKHJlYWRfd3JpdGUgaW1hZ2UyZF9hcnJheV9tc2FhX2RlcHRoX3QgaW1hZ2UpOworI2VuZGlmIC8vY2xfa2hyX2dsX21zYWFfc2hhcmluZworI2VuZGlmIC8vX19PUEVOQ0xfQ19WRVJTSU9OX18gPj0gQ0xfVkVSU0lPTl8yXzAKKworLyoqCisgKiBSZXR1cm4gdGhlIDNEIGltYWdlIHdpZHRoLCBoZWlnaHQsIGFuZCBkZXB0aCBhcyBhbgorICogaW50NCB0eXBlLiBUaGUgd2lkdGggaXMgcmV0dXJuZWQgaW4gdGhlIHgKKyAqIGNvbXBvbmVudCwgaGVpZ2h0IGluIHRoZSB5IGNvbXBvbmVudCwgZGVwdGggaW4gdGhlIHoKKyAqIGNvbXBvbmVudCBhbmQgdGhlIHcgY29tcG9uZW50IGlzIDAuCisgKi8KK2ludDQgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfZGltKHJlYWRfb25seSBpbWFnZTNkX3QgaW1hZ2UpOworaW50NCBfX292bGQgX19jbmZuIGdldF9pbWFnZV9kaW0od3JpdGVfb25seSBpbWFnZTNkX3QgaW1hZ2UpOworI2lmIF9fT1BFTkNMX0NfVkVSU0lPTl9fID49IENMX1ZFUlNJT05fMl8wCitpbnQ0IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX2RpbShyZWFkX3dyaXRlIGltYWdlM2RfdCBpbWFnZSk7CisjZW5kaWYgLy9fX09QRU5DTF9DX1ZFUlNJT05fXyA+PSBDTF9WRVJTSU9OXzJfMAorCisvKioKKyAqIFJldHVybiB0aGUgaW1hZ2UgYXJyYXkgc2l6ZS4KKyAqLworCitzaXplX3QgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfYXJyYXlfc2l6ZShyZWFkX29ubHkgaW1hZ2UxZF9hcnJheV90IGltYWdlX2FycmF5KTsKK3NpemVfdCBfX292bGQgX19jbmZuIGdldF9pbWFnZV9hcnJheV9zaXplKHJlYWRfb25seSBpbWFnZTJkX2FycmF5X3QgaW1hZ2VfYXJyYXkpOworI2lmZGVmIGNsX2tocl9kZXB0aF9pbWFnZXMKK3NpemVfdCBfX292bGQgX19jbmZuIGdldF9pbWFnZV9hcnJheV9zaXplKHJlYWRfb25seSBpbWFnZTJkX2FycmF5X2RlcHRoX3QgaW1hZ2VfYXJyYXkpOworI2VuZGlmIC8vY2xfa2hyX2RlcHRoX2ltYWdlcworI2lmIGRlZmluZWQoY2xfa2hyX2dsX21zYWFfc2hhcmluZykKK3NpemVfdCBfX292bGQgX19jbmZuIGdldF9pbWFnZV9hcnJheV9zaXplKHJlYWRfb25seSBpbWFnZTJkX2FycmF5X21zYWFfdCBpbWFnZV9hcnJheSk7CitzaXplX3QgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfYXJyYXlfc2l6ZShyZWFkX29ubHkgaW1hZ2UyZF9hcnJheV9tc2FhX2RlcHRoX3QgaW1hZ2VfYXJyYXkpOworI2VuZGlmIC8vY2xfa2hyX2dsX21zYWFfc2hhcmluZworCitzaXplX3QgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfYXJyYXlfc2l6ZSh3cml0ZV9vbmx5IGltYWdlMWRfYXJyYXlfdCBpbWFnZV9hcnJheSk7CitzaXplX3QgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfYXJyYXlfc2l6ZSh3cml0ZV9vbmx5IGltYWdlMmRfYXJyYXlfdCBpbWFnZV9hcnJheSk7CisjaWZkZWYgY2xfa2hyX2RlcHRoX2ltYWdlcworc2l6ZV90IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX2FycmF5X3NpemUod3JpdGVfb25seSBpbWFnZTJkX2FycmF5X2RlcHRoX3QgaW1hZ2VfYXJyYXkpOworI2VuZGlmIC8vY2xfa2hyX2RlcHRoX2ltYWdlcworI2lmIGRlZmluZWQoY2xfa2hyX2dsX21zYWFfc2hhcmluZykKK3NpemVfdCBfX292bGQgX19jbmZuIGdldF9pbWFnZV9hcnJheV9zaXplKHdyaXRlX29ubHkgaW1hZ2UyZF9hcnJheV9tc2FhX3QgaW1hZ2VfYXJyYXkpOworc2l6ZV90IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX2FycmF5X3NpemUod3JpdGVfb25seSBpbWFnZTJkX2FycmF5X21zYWFfZGVwdGhfdCBpbWFnZV9hcnJheSk7CisjZW5kaWYgLy9jbF9raHJfZ2xfbXNhYV9zaGFyaW5nCisKKyNpZiBfX09QRU5DTF9DX1ZFUlNJT05fXyA+PSBDTF9WRVJTSU9OXzJfMAorc2l6ZV90IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX2FycmF5X3NpemUocmVhZF93cml0ZSBpbWFnZTFkX2FycmF5X3QgaW1hZ2VfYXJyYXkpOworc2l6ZV90IF9fb3ZsZCBfX2NuZm4gZ2V0X2ltYWdlX2FycmF5X3NpemUocmVhZF93cml0ZSBpbWFnZTJkX2FycmF5X3QgaW1hZ2VfYXJyYXkpOworI2lmZGVmIGNsX2tocl9kZXB0aF9pbWFnZXMKK3NpemVfdCBfX292bGQgX19jbmZuIGdldF9pbWFnZV9hcnJheV9zaXplKHJlYWRfd3JpdGUgaW1hZ2UyZF9hcnJheV9kZXB0aF90IGltYWdlX2FycmF5KTsKKyNlbmRpZiAvL2NsX2tocl9kZXB0aF9pbWFnZXMKKyNpZiBkZWZpbmVkKGNsX2tocl9nbF9tc2FhX3NoYXJpbmcpCitzaXplX3QgX19vdmxkIF9fY25mbiBnZXRfaW1hZ2VfYXJyYXlfc2l6ZShyZWFkX3dyaXRlIGltYWdlMmRfYXJyYXlfbXNhYV90IGltYWdlX2FycmF5KTsKK3NpemVfdCBfX292bGQgX19jbmZuIGdldF9pbWFnZV9hcnJheV9zaXplKHJlYWRfd3JpdGUgaW1hZ2UyZF9hcnJheV9tc2FhX2RlcHRoX3QgaW1hZ2VfYXJyYXkpOworI2VuZGlmIC8vY2xfa2hyX2dsX21zYWFfc2hhcmluZworI2VuZGlmIC8vX19PUEVOQ0xfQ19WRVJTSU9OX18gPj0gQ0xfVkVSU0lPTl8yXzAKKworLyoqCisqIFJldHVybiB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgYXNzb2NpYXRlZCB3aXRoIGltYWdlCisqLworI2lmIGRlZmluZWQoY2xfa2hyX2dsX21zYWFfc2hhcmluZykKK2ludCBfX292bGQgZ2V0X2ltYWdlX251bV9zYW1wbGVzKHJlYWRfb25seSBpbWFnZTJkX21zYWFfdCBpbWFnZSk7CitpbnQgX19vdmxkIGdldF9pbWFnZV9udW1fc2FtcGxlcyhyZWFkX29ubHkgaW1hZ2UyZF9tc2FhX2RlcHRoX3QgaW1hZ2UpOworaW50IF9fb3ZsZCBnZXRfaW1hZ2VfbnVtX3NhbXBsZXMocmVhZF9vbmx5IGltYWdlMmRfYXJyYXlfbXNhYV9kZXB0aF90IGltYWdlKTsKK2ludCBfX292bGQgZ2V0X2ltYWdlX251bV9zYW1wbGVzKHJlYWRfb25seSBpbWFnZTJkX2FycmF5X21zYWFfdCBpbWFnZSk7CitpbnQgX19vdmxkIGdldF9pbWFnZV9udW1fc2FtcGxlcyhyZWFkX29ubHkgaW1hZ2UyZF9hcnJheV9tc2FhX2RlcHRoX3QgaW1hZ2UpOworCitpbnQgX19vdmxkIGdldF9pbWFnZV9udW1fc2FtcGxlcyh3cml0ZV9vbmx5IGltYWdlMmRfbXNhYV90IGltYWdlKTsKK2ludCBfX292bGQgZ2V0X2ltYWdlX251bV9zYW1wbGVzKHdyaXRlX29ubHkgaW1hZ2UyZF9tc2FhX2RlcHRoX3QgaW1hZ2UpOworaW50IF9fb3ZsZCBnZXRfaW1hZ2VfbnVtX3NhbXBsZXMod3JpdGVfb25seSBpbWFnZTJkX2FycmF5X21zYWFfZGVwdGhfdCBpbWFnZSk7CitpbnQgX19vdmxkIGdldF9pbWFnZV9udW1fc2FtcGxlcyh3cml0ZV9vbmx5IGltYWdlMmRfYXJyYXlfbXNhYV90IGltYWdlKTsKK2ludCBfX292bGQgZ2V0X2ltYWdlX251bV9zYW1wbGVzKHdyaXRlX29ubHkgaW1hZ2UyZF9hcnJheV9tc2FhX2RlcHRoX3QgaW1hZ2UpOworCisjaWYgX19PUEVOQ0xfQ19WRVJTSU9OX18gPj0gQ0xfVkVSU0lPTl8yXzAKK2ludCBfX292bGQgZ2V0X2ltYWdlX251bV9zYW1wbGVzKHJlYWRfd3JpdGUgaW1hZ2UyZF9tc2FhX3QgaW1hZ2UpOworaW50IF9fb3ZsZCBnZXRfaW1hZ2VfbnVtX3NhbXBsZXMocmVhZF93cml0ZSBpbWFnZTJkX21zYWFfZGVwdGhfdCBpbWFnZSk7CitpbnQgX19vdmxkIGdldF9pbWFnZV9udW1fc2FtcGxlcyhyZWFkX3dyaXRlIGltYWdlMmRfYXJyYXlfbXNhYV9kZXB0aF90IGltYWdlKTsKK2ludCBfX292bGQgZ2V0X2ltYWdlX251bV9zYW1wbGVzKHJlYWRfd3JpdGUgaW1hZ2UyZF9hcnJheV9tc2FhX3QgaW1hZ2UpOworaW50IF9fb3ZsZCBnZXRfaW1hZ2VfbnVtX3NhbXBsZXMocmVhZF93cml0ZSBpbWFnZTJkX2FycmF5X21zYWFfZGVwdGhfdCBpbWFnZSk7CisjZW5kaWYgLy9fX09QRU5DTF9DX1ZFUlNJT05fXyA+PSBDTF9WRVJTSU9OXzJfMAorI2VuZGlmCisKKy8vIE9wZW5DTCB2Mi4wIHM2LjEzLjE1IC0gV29yay1ncm91cCBGdW5jdGlvbnMKKworI2lmIF9fT1BFTkNMX0NfVkVSU0lPTl9fID49IENMX1ZFUlNJT05fMl8wCitpbnQgX19vdmxkIHdvcmtfZ3JvdXBfYWxsKGludCBwcmVkaWNhdGUpOworaW50IF9fb3ZsZCB3b3JrX2dyb3VwX2FueShpbnQgcHJlZGljYXRlKTsKKworI2lmZGVmIGNsX2tocl9mcDE2CitoYWxmIF9fb3ZsZCB3b3JrX2dyb3VwX2Jyb2FkY2FzdChoYWxmIGEsIHNpemVfdCBsb2NhbF9pZCk7CitoYWxmIF9fb3ZsZCB3b3JrX2dyb3VwX2Jyb2FkY2FzdChoYWxmIGEsIHNpemVfdCB4LCBzaXplX3QgeSk7CitoYWxmIF9fb3ZsZCB3b3JrX2dyb3VwX2Jyb2FkY2FzdChoYWxmIGEsIHNpemVfdCB4LCBzaXplX3QgeSwgc2l6ZV90IHopOworI2VuZGlmCitpbnQgX19vdmxkIHdvcmtfZ3JvdXBfYnJvYWRjYXN0KGludCBhLCBzaXplX3QgbG9jYWxfaWQpOworaW50IF9fb3ZsZCB3b3JrX2dyb3VwX2Jyb2FkY2FzdChpbnQgYSwgc2l6ZV90IHgsIHNpemVfdCB5KTsKK2ludCBfX292bGQgd29ya19ncm91cF9icm9hZGNhc3QoaW50IGEsIHNpemVfdCB4LCBzaXplX3QgeSwgc2l6ZV90IHopOwordWludCBfX292bGQgd29ya19ncm91cF9icm9hZGNhc3QodWludCBhLCBzaXplX3QgbG9jYWxfaWQpOwordWludCBfX292bGQgd29ya19ncm91cF9icm9hZGNhc3QodWludCBhLCBzaXplX3QgeCwgc2l6ZV90IHkpOwordWludCBfX292bGQgd29ya19ncm91cF9icm9hZGNhc3QodWludCBhLCBzaXplX3QgeCwgc2l6ZV90IHksIHNpemVfdCB6KTsKK2xvbmcgX19vdmxkIHdvcmtfZ3JvdXBfYnJvYWRjYXN0KGxvbmcgYSwgc2l6ZV90IGxvY2FsX2lkKTsKK2xvbmcgX19vdmxkIHdvcmtfZ3JvdXBfYnJvYWRjYXN0KGxvbmcgYSwgc2l6ZV90IHgsIHNpemVfdCB5KTsKK2xvbmcgX19vdmxkIHdvcmtfZ3JvdXBfYnJvYWRjYXN0KGxvbmcgYSwgc2l6ZV90IHgsIHNpemVfdCB5LCBzaXplX3Qgeik7Cit1bG9uZyBfX292bGQgd29ya19ncm91cF9icm9hZGNhc3QodWxvbmcgYSwgc2l6ZV90IGxvY2FsX2lkKTsKK3Vsb25nIF9fb3ZsZCB3b3JrX2dyb3VwX2Jyb2FkY2FzdCh1bG9uZyBhLCBzaXplX3QgeCwgc2l6ZV90IHkpOwordWxvbmcgX19vdmxkIHdvcmtfZ3JvdXBfYnJvYWRjYXN0KHVsb25nIGEsIHNpemVfdCB4LCBzaXplX3QgeSwgc2l6ZV90IHopOworZmxvYXQgX19vdmxkIHdvcmtfZ3JvdXBfYnJvYWRjYXN0KGZsb2F0IGEsIHNpemVfdCBsb2NhbF9pZCk7CitmbG9hdCBfX292bGQgd29ya19ncm91cF9icm9hZGNhc3QoZmxvYXQgYSwgc2l6ZV90IHgsIHNpemVfdCB5KTsKK2Zsb2F0IF9fb3ZsZCB3b3JrX2dyb3VwX2Jyb2FkY2FzdChmbG9hdCBhLCBzaXplX3QgeCwgc2l6ZV90IHksIHNpemVfdCB6KTsKKyNpZmRlZiBjbF9raHJfZnA2NAorZG91YmxlIF9fb3ZsZCB3b3JrX2dyb3VwX2Jyb2FkY2FzdChkb3VibGUgYSwgc2l6ZV90IGxvY2FsX2lkKTsKK2RvdWJsZSBfX292bGQgd29ya19ncm91cF9icm9hZGNhc3QoZG91YmxlIGEsIHNpemVfdCB4LCBzaXplX3QgeSk7Citkb3VibGUgX19vdmxkIHdvcmtfZ3JvdXBfYnJvYWRjYXN0KGRvdWJsZSBhLCBzaXplX3QgeCwgc2l6ZV90IHksIHNpemVfdCB6KTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisKKyNpZmRlZiBjbF9raHJfZnAxNgoraGFsZiBfX292bGQgd29ya19ncm91cF9yZWR1Y2VfYWRkKGhhbGYgeCk7CitoYWxmIF9fb3ZsZCB3b3JrX2dyb3VwX3JlZHVjZV9taW4oaGFsZiB4KTsKK2hhbGYgX19vdmxkIHdvcmtfZ3JvdXBfcmVkdWNlX21heChoYWxmIHgpOworaGFsZiBfX292bGQgd29ya19ncm91cF9zY2FuX2V4Y2x1c2l2ZV9hZGQoaGFsZiB4KTsKK2hhbGYgX19vdmxkIHdvcmtfZ3JvdXBfc2Nhbl9leGNsdXNpdmVfbWluKGhhbGYgeCk7CitoYWxmIF9fb3ZsZCB3b3JrX2dyb3VwX3NjYW5fZXhjbHVzaXZlX21heChoYWxmIHgpOworaGFsZiBfX292bGQgd29ya19ncm91cF9zY2FuX2luY2x1c2l2ZV9hZGQoaGFsZiB4KTsKK2hhbGYgX19vdmxkIHdvcmtfZ3JvdXBfc2Nhbl9pbmNsdXNpdmVfbWluKGhhbGYgeCk7CitoYWxmIF9fb3ZsZCB3b3JrX2dyb3VwX3NjYW5faW5jbHVzaXZlX21heChoYWxmIHgpOworI2VuZGlmCitpbnQgX19vdmxkIHdvcmtfZ3JvdXBfcmVkdWNlX2FkZChpbnQgeCk7CitpbnQgX19vdmxkIHdvcmtfZ3JvdXBfcmVkdWNlX21pbihpbnQgeCk7CitpbnQgX19vdmxkIHdvcmtfZ3JvdXBfcmVkdWNlX21heChpbnQgeCk7CitpbnQgX19vdmxkIHdvcmtfZ3JvdXBfc2Nhbl9leGNsdXNpdmVfYWRkKGludCB4KTsKK2ludCBfX292bGQgd29ya19ncm91cF9zY2FuX2V4Y2x1c2l2ZV9taW4oaW50IHgpOworaW50IF9fb3ZsZCB3b3JrX2dyb3VwX3NjYW5fZXhjbHVzaXZlX21heChpbnQgeCk7CitpbnQgX19vdmxkIHdvcmtfZ3JvdXBfc2Nhbl9pbmNsdXNpdmVfYWRkKGludCB4KTsKK2ludCBfX292bGQgd29ya19ncm91cF9zY2FuX2luY2x1c2l2ZV9taW4oaW50IHgpOworaW50IF9fb3ZsZCB3b3JrX2dyb3VwX3NjYW5faW5jbHVzaXZlX21heChpbnQgeCk7Cit1aW50IF9fb3ZsZCB3b3JrX2dyb3VwX3JlZHVjZV9hZGQodWludCB4KTsKK3VpbnQgX19vdmxkIHdvcmtfZ3JvdXBfcmVkdWNlX21pbih1aW50IHgpOwordWludCBfX292bGQgd29ya19ncm91cF9yZWR1Y2VfbWF4KHVpbnQgeCk7Cit1aW50IF9fb3ZsZCB3b3JrX2dyb3VwX3NjYW5fZXhjbHVzaXZlX2FkZCh1aW50IHgpOwordWludCBfX292bGQgd29ya19ncm91cF9zY2FuX2V4Y2x1c2l2ZV9taW4odWludCB4KTsKK3VpbnQgX19vdmxkIHdvcmtfZ3JvdXBfc2Nhbl9leGNsdXNpdmVfbWF4KHVpbnQgeCk7Cit1aW50IF9fb3ZsZCB3b3JrX2dyb3VwX3NjYW5faW5jbHVzaXZlX2FkZCh1aW50IHgpOwordWludCBfX292bGQgd29ya19ncm91cF9zY2FuX2luY2x1c2l2ZV9taW4odWludCB4KTsKK3VpbnQgX19vdmxkIHdvcmtfZ3JvdXBfc2Nhbl9pbmNsdXNpdmVfbWF4KHVpbnQgeCk7Citsb25nIF9fb3ZsZCB3b3JrX2dyb3VwX3JlZHVjZV9hZGQobG9uZyB4KTsKK2xvbmcgX19vdmxkIHdvcmtfZ3JvdXBfcmVkdWNlX21pbihsb25nIHgpOworbG9uZyBfX292bGQgd29ya19ncm91cF9yZWR1Y2VfbWF4KGxvbmcgeCk7Citsb25nIF9fb3ZsZCB3b3JrX2dyb3VwX3NjYW5fZXhjbHVzaXZlX2FkZChsb25nIHgpOworbG9uZyBfX292bGQgd29ya19ncm91cF9zY2FuX2V4Y2x1c2l2ZV9taW4obG9uZyB4KTsKK2xvbmcgX19vdmxkIHdvcmtfZ3JvdXBfc2Nhbl9leGNsdXNpdmVfbWF4KGxvbmcgeCk7Citsb25nIF9fb3ZsZCB3b3JrX2dyb3VwX3NjYW5faW5jbHVzaXZlX2FkZChsb25nIHgpOworbG9uZyBfX292bGQgd29ya19ncm91cF9zY2FuX2luY2x1c2l2ZV9taW4obG9uZyB4KTsKK2xvbmcgX19vdmxkIHdvcmtfZ3JvdXBfc2Nhbl9pbmNsdXNpdmVfbWF4KGxvbmcgeCk7Cit1bG9uZyBfX292bGQgd29ya19ncm91cF9yZWR1Y2VfYWRkKHVsb25nIHgpOwordWxvbmcgX19vdmxkIHdvcmtfZ3JvdXBfcmVkdWNlX21pbih1bG9uZyB4KTsKK3Vsb25nIF9fb3ZsZCB3b3JrX2dyb3VwX3JlZHVjZV9tYXgodWxvbmcgeCk7Cit1bG9uZyBfX292bGQgd29ya19ncm91cF9zY2FuX2V4Y2x1c2l2ZV9hZGQodWxvbmcgeCk7Cit1bG9uZyBfX292bGQgd29ya19ncm91cF9zY2FuX2V4Y2x1c2l2ZV9taW4odWxvbmcgeCk7Cit1bG9uZyBfX292bGQgd29ya19ncm91cF9zY2FuX2V4Y2x1c2l2ZV9tYXgodWxvbmcgeCk7Cit1bG9uZyBfX292bGQgd29ya19ncm91cF9zY2FuX2luY2x1c2l2ZV9hZGQodWxvbmcgeCk7Cit1bG9uZyBfX292bGQgd29ya19ncm91cF9zY2FuX2luY2x1c2l2ZV9taW4odWxvbmcgeCk7Cit1bG9uZyBfX292bGQgd29ya19ncm91cF9zY2FuX2luY2x1c2l2ZV9tYXgodWxvbmcgeCk7CitmbG9hdCBfX292bGQgd29ya19ncm91cF9yZWR1Y2VfYWRkKGZsb2F0IHgpOworZmxvYXQgX19vdmxkIHdvcmtfZ3JvdXBfcmVkdWNlX21pbihmbG9hdCB4KTsKK2Zsb2F0IF9fb3ZsZCB3b3JrX2dyb3VwX3JlZHVjZV9tYXgoZmxvYXQgeCk7CitmbG9hdCBfX292bGQgd29ya19ncm91cF9zY2FuX2V4Y2x1c2l2ZV9hZGQoZmxvYXQgeCk7CitmbG9hdCBfX292bGQgd29ya19ncm91cF9zY2FuX2V4Y2x1c2l2ZV9taW4oZmxvYXQgeCk7CitmbG9hdCBfX292bGQgd29ya19ncm91cF9zY2FuX2V4Y2x1c2l2ZV9tYXgoZmxvYXQgeCk7CitmbG9hdCBfX292bGQgd29ya19ncm91cF9zY2FuX2luY2x1c2l2ZV9hZGQoZmxvYXQgeCk7CitmbG9hdCBfX292bGQgd29ya19ncm91cF9zY2FuX2luY2x1c2l2ZV9taW4oZmxvYXQgeCk7CitmbG9hdCBfX292bGQgd29ya19ncm91cF9zY2FuX2luY2x1c2l2ZV9tYXgoZmxvYXQgeCk7CisjaWZkZWYgY2xfa2hyX2ZwNjQKK2RvdWJsZSBfX292bGQgd29ya19ncm91cF9yZWR1Y2VfYWRkKGRvdWJsZSB4KTsKK2RvdWJsZSBfX292bGQgd29ya19ncm91cF9yZWR1Y2VfbWluKGRvdWJsZSB4KTsKK2RvdWJsZSBfX292bGQgd29ya19ncm91cF9yZWR1Y2VfbWF4KGRvdWJsZSB4KTsKK2RvdWJsZSBfX292bGQgd29ya19ncm91cF9zY2FuX2V4Y2x1c2l2ZV9hZGQoZG91YmxlIHgpOworZG91YmxlIF9fb3ZsZCB3b3JrX2dyb3VwX3NjYW5fZXhjbHVzaXZlX21pbihkb3VibGUgeCk7Citkb3VibGUgX19vdmxkIHdvcmtfZ3JvdXBfc2Nhbl9leGNsdXNpdmVfbWF4KGRvdWJsZSB4KTsKK2RvdWJsZSBfX292bGQgd29ya19ncm91cF9zY2FuX2luY2x1c2l2ZV9hZGQoZG91YmxlIHgpOworZG91YmxlIF9fb3ZsZCB3b3JrX2dyb3VwX3NjYW5faW5jbHVzaXZlX21pbihkb3VibGUgeCk7Citkb3VibGUgX19vdmxkIHdvcmtfZ3JvdXBfc2Nhbl9pbmNsdXNpdmVfbWF4KGRvdWJsZSB4KTsKKyNlbmRpZiAvL2NsX2tocl9mcDY0CisKKyNlbmRpZiAvL19fT1BFTkNMX0NfVkVSU0lPTl9fID49IENMX1ZFUlNJT05fMl8wCisKKy8vIE9wZW5DTCB2Mi4wIHM2LjEzLjE2IC0gUGlwZSBGdW5jdGlvbnMKKyNpZiBfX09QRU5DTF9DX1ZFUlNJT05fXyA+PSBDTF9WRVJTSU9OXzJfMAorI2RlZmluZSBQSVBFX1JFU0VSVkVfSURfVkFMSURfQklUICgxVSA8PCAzMCkKKyNkZWZpbmUgQ0xLX05VTExfUkVTRVJWRV9JRCAoX19idWlsdGluX2FzdHlwZSgoKHZvaWQqKShfX1NJWkVfTUFYX18pKSwgcmVzZXJ2ZV9pZF90KSkKK2Jvb2wgX19vdmxkIGlzX3ZhbGlkX3Jlc2VydmVfaWQocmVzZXJ2ZV9pZF90IHJlc2VydmVfaWQpOworI2VuZGlmIC8vX19PUEVOQ0xfQ19WRVJTSU9OX18gPj0gQ0xfVkVSU0lPTl8yXzAKKworCisvLyBPcGVuQ0wgdjIuMCBzNi4xMy4xNyAtIEVucXVldWUgS2VybmVscworI2lmIF9fT1BFTkNMX0NfVkVSU0lPTl9fID49IENMX1ZFUlNJT05fMl8wCisKKyNkZWZpbmUgQ0xfQ09NUExFVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgQ0xfUlVOTklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgQ0xfU1VCTUlUVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgQ0xfUVVFVUVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMKKworI2RlZmluZSBDTEtfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ0xLX0VOUVVFVUVfRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAtMTAxCisjZGVmaW5lIENMS19JTlZBTElEX1FVRVVFICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwMgorI2RlZmluZSBDTEtfSU5WQUxJRF9ORFJBTkdFICAgICAgICAgICAgICAgICAgICAgICAgIC0xNjAKKyNkZWZpbmUgQ0xLX0lOVkFMSURfRVZFTlRfV0FJVF9MSVNUICAgICAgICAgICAgICAgICAtNTcKKyNkZWZpbmUgQ0xLX0RFVklDRV9RVUVVRV9GVUxMICAgICAgICAgICAgICAgICAgICAgICAtMTYxCisjZGVmaW5lIENMS19JTlZBTElEX0FSR19TSVpFICAgICAgICAgICAgICAgICAgICAgICAgLTUxCisjZGVmaW5lIENMS19FVkVOVF9BTExPQ0FUSU9OX0ZBSUxVUkUgICAgICAgICAgICAgICAgLTEwMAorI2RlZmluZSBDTEtfT1VUX09GX1JFU09VUkNFUyAgICAgICAgICAgICAgICAgICAgICAgIC01CisKKyNkZWZpbmUgQ0xLX05VTExfUVVFVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENMS19OVUxMX0VWRU5UIChfX2J1aWx0aW5fYXN0eXBlKCgodm9pZCopKF9fU0laRV9NQVhfXykpLCBjbGtfZXZlbnRfdCkpCisKKy8vIGV4ZWN1dGlvbiBtb2RlbCByZWxhdGVkIGRlZmluaXRpb25zCisjZGVmaW5lIENMS19FTlFVRVVFX0ZMQUdTX05PX1dBSVQgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lIENMS19FTlFVRVVFX0ZMQUdTX1dBSVRfS0VSTkVMICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIENMS19FTlFVRVVFX0ZMQUdTX1dBSVRfV09SS19HUk9VUCAgICAgICAgICAgMHgyCisKK3R5cGVkZWYgaW50IGtlcm5lbF9lbnF1ZXVlX2ZsYWdzX3Q7Cit0eXBlZGVmIGludCBjbGtfcHJvZmlsaW5nX2luZm87CisKKy8vIFByb2ZpbGluZyBpbmZvIG5hbWUgKHNlZSBjYXB0dXJlX2V2ZW50X3Byb2ZpbGluZ19pbmZvKQorI2RlZmluZSBDTEtfUFJPRklMSU5HX0NPTU1BTkRfRVhFQ19USU1FIDB4MQorCisjZGVmaW5lIE1BWF9XT1JLX0RJTSAgICAgICAgMworCisvLyBUb0RvOiBSZW1vdmUgZGVmaW5pdGlvbiBvZiBuZHJhbmdlX3QgaW4gQ2xhbmcgYXMgYW4gb3BhcXVlIHR5cGUgYW5kIGFkZCBiYWNrCisvLyB0aGUgZm9sbG93aW5nIG5kcmFuZ2VfdCBkZWZpbml0aW9uLgorI2lmIDAKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bnNpZ25lZCBpbnQgd29ya0RpbWVuc2lvbjsKKyAgICBzaXplX3QgZ2xvYmFsV29ya09mZnNldFtNQVhfV09SS19ESU1dOworICAgIHNpemVfdCBnbG9iYWxXb3JrU2l6ZVtNQVhfV09SS19ESU1dOworICAgIHNpemVfdCBsb2NhbFdvcmtTaXplW01BWF9XT1JLX0RJTV07Cit9IG5kcmFuZ2VfdDsKKyNlbmRpZgorCituZHJhbmdlX3QgX19vdmxkIG5kcmFuZ2VfMUQoc2l6ZV90KTsKK25kcmFuZ2VfdCBfX292bGQgbmRyYW5nZV8xRChzaXplX3QsIHNpemVfdCk7CituZHJhbmdlX3QgX19vdmxkIG5kcmFuZ2VfMUQoc2l6ZV90LCBzaXplX3QsIHNpemVfdCk7CisKK25kcmFuZ2VfdCBfX292bGQgbmRyYW5nZV8yRChjb25zdCBzaXplX3RbMl0pOworbmRyYW5nZV90IF9fb3ZsZCBuZHJhbmdlXzJEKGNvbnN0IHNpemVfdFsyXSwgY29uc3Qgc2l6ZV90WzJdKTsKK25kcmFuZ2VfdCBfX292bGQgbmRyYW5nZV8yRChjb25zdCBzaXplX3RbMl0sIGNvbnN0IHNpemVfdFsyXSwgY29uc3Qgc2l6ZV90WzJdKTsKKworbmRyYW5nZV90IF9fb3ZsZCBuZHJhbmdlXzNEKGNvbnN0IHNpemVfdFszXSk7CituZHJhbmdlX3QgX19vdmxkIG5kcmFuZ2VfM0QoY29uc3Qgc2l6ZV90WzNdLCBjb25zdCBzaXplX3RbM10pOworbmRyYW5nZV90IF9fb3ZsZCBuZHJhbmdlXzNEKGNvbnN0IHNpemVfdFszXSwgY29uc3Qgc2l6ZV90WzNdLCBjb25zdCBzaXplX3RbM10pOworCitpbnQgX19vdmxkIGVucXVldWVfbWFya2VyKHF1ZXVlX3QsIHVpbnQsIGNvbnN0IF9fcHJpdmF0ZSBjbGtfZXZlbnRfdCosIF9fcHJpdmF0ZSBjbGtfZXZlbnRfdCopOworCit2b2lkIF9fb3ZsZCByZXRhaW5fZXZlbnQoY2xrX2V2ZW50X3QpOworCit2b2lkIF9fb3ZsZCByZWxlYXNlX2V2ZW50KGNsa19ldmVudF90KTsKKworY2xrX2V2ZW50X3QgY3JlYXRlX3VzZXJfZXZlbnQodm9pZCk7CisKK3ZvaWQgX19vdmxkIHNldF91c2VyX2V2ZW50X3N0YXR1cyhjbGtfZXZlbnRfdCBlLCBpbnQgc3RhdGUpOworCitib29sIGlzX3ZhbGlkX2V2ZW50IChjbGtfZXZlbnRfdCBldmVudCk7CisKK3ZvaWQgX19vdmxkIGNhcHR1cmVfZXZlbnRfcHJvZmlsaW5nX2luZm8oY2xrX2V2ZW50X3QsIGNsa19wcm9maWxpbmdfaW5mbywgX19nbG9iYWwgdm9pZCogdmFsdWUpOworCitxdWV1ZV90IF9fb3ZsZCBnZXRfZGVmYXVsdF9xdWV1ZSh2b2lkKTsKKyNlbmRpZiAvL19fT1BFTkNMX0NfVkVSU0lPTl9fID49IENMX1ZFUlNJT05fMl8wCisKKy8vIE9wZW5DTCBFeHRlbnNpb24gdjIuMCBzOS4xNyAtIFN1Yi1ncm91cHMKKworI2lmIGRlZmluZWQoY2xfaW50ZWxfc3ViZ3JvdXBzKSB8fCBkZWZpbmVkKGNsX2tocl9zdWJncm91cHMpCisvLyBTaGFyZWQgU3ViIEdyb3VwIEZ1bmN0aW9ucwordWludCAgICBfX292bGQgZ2V0X3N1Yl9ncm91cF9zaXplKHZvaWQpOwordWludCAgICBfX292bGQgZ2V0X21heF9zdWJfZ3JvdXBfc2l6ZSh2b2lkKTsKK3VpbnQgICAgX19vdmxkIGdldF9udW1fc3ViX2dyb3Vwcyh2b2lkKTsKKyNpZiBfX09QRU5DTF9DX1ZFUlNJT05fXyA+PSBDTF9WRVJTSU9OXzJfMAordWludCAgICBfX292bGQgZ2V0X2VucXVldWVkX251bV9zdWJfZ3JvdXBzKHZvaWQpOworI2VuZGlmIC8vX19PUEVOQ0xfQ19WRVJTSU9OX18gPj0gQ0xfVkVSU0lPTl8yXzAKK3VpbnQgICAgX19vdmxkIGdldF9zdWJfZ3JvdXBfaWQodm9pZCk7Cit1aW50ICAgIF9fb3ZsZCBnZXRfc3ViX2dyb3VwX2xvY2FsX2lkKHZvaWQpOworCit2b2lkICAgIF9fb3ZsZCBzdWJfZ3JvdXBfYmFycmllcihjbF9tZW1fZmVuY2VfZmxhZ3MgZmxhZ3MpOworI2lmIF9fT1BFTkNMX0NfVkVSU0lPTl9fID49IENMX1ZFUlNJT05fMl8wCit2b2lkICAgIF9fb3ZsZCBzdWJfZ3JvdXBfYmFycmllcihjbF9tZW1fZmVuY2VfZmxhZ3MgZmxhZ3MsIG1lbW9yeV9zY29wZSBzY29wZSk7CisjZW5kaWYgLy9fX09QRU5DTF9DX1ZFUlNJT05fXyA+PSBDTF9WRVJTSU9OXzJfMAorCitpbnQgICAgIF9fb3ZsZCBzdWJfZ3JvdXBfYWxsKGludCBwcmVkaWNhdGUpOworaW50ICAgICBfX292bGQgc3ViX2dyb3VwX2FueShpbnQgcHJlZGljYXRlKTsKKworaW50ICAgICBfX292bGQgc3ViX2dyb3VwX2Jyb2FkY2FzdChpbnQgICB4LCB1aW50IHN1Yl9ncm91cF9sb2NhbF9pZCk7Cit1aW50ICAgIF9fb3ZsZCBzdWJfZ3JvdXBfYnJvYWRjYXN0KHVpbnQgIHgsIHVpbnQgc3ViX2dyb3VwX2xvY2FsX2lkKTsKK2xvbmcgICAgX19vdmxkIHN1Yl9ncm91cF9icm9hZGNhc3QobG9uZyAgeCwgdWludCBzdWJfZ3JvdXBfbG9jYWxfaWQpOwordWxvbmcgICBfX292bGQgc3ViX2dyb3VwX2Jyb2FkY2FzdCh1bG9uZyB4LCB1aW50IHN1Yl9ncm91cF9sb2NhbF9pZCk7CitmbG9hdCAgIF9fb3ZsZCBzdWJfZ3JvdXBfYnJvYWRjYXN0KGZsb2F0IHgsIHVpbnQgc3ViX2dyb3VwX2xvY2FsX2lkKTsKKworaW50ICAgICBfX292bGQgc3ViX2dyb3VwX3JlZHVjZV9hZGQoaW50ICAgeCk7Cit1aW50ICAgIF9fb3ZsZCBzdWJfZ3JvdXBfcmVkdWNlX2FkZCh1aW50ICB4KTsKK2xvbmcgICAgX19vdmxkIHN1Yl9ncm91cF9yZWR1Y2VfYWRkKGxvbmcgIHgpOwordWxvbmcgICBfX292bGQgc3ViX2dyb3VwX3JlZHVjZV9hZGQodWxvbmcgeCk7CitmbG9hdCAgIF9fb3ZsZCBzdWJfZ3JvdXBfcmVkdWNlX2FkZChmbG9hdCB4KTsKK2ludCAgICAgX19vdmxkIHN1Yl9ncm91cF9yZWR1Y2VfbWluKGludCAgIHgpOwordWludCAgICBfX292bGQgc3ViX2dyb3VwX3JlZHVjZV9taW4odWludCAgeCk7Citsb25nICAgIF9fb3ZsZCBzdWJfZ3JvdXBfcmVkdWNlX21pbihsb25nICB4KTsKK3Vsb25nICAgX19vdmxkIHN1Yl9ncm91cF9yZWR1Y2VfbWluKHVsb25nIHgpOworZmxvYXQgICBfX292bGQgc3ViX2dyb3VwX3JlZHVjZV9taW4oZmxvYXQgeCk7CitpbnQgICAgIF9fb3ZsZCBzdWJfZ3JvdXBfcmVkdWNlX21heChpbnQgICB4KTsKK3VpbnQgICAgX19vdmxkIHN1Yl9ncm91cF9yZWR1Y2VfbWF4KHVpbnQgIHgpOworbG9uZyAgICBfX292bGQgc3ViX2dyb3VwX3JlZHVjZV9tYXgobG9uZyAgeCk7Cit1bG9uZyAgIF9fb3ZsZCBzdWJfZ3JvdXBfcmVkdWNlX21heCh1bG9uZyB4KTsKK2Zsb2F0ICAgX19vdmxkIHN1Yl9ncm91cF9yZWR1Y2VfbWF4KGZsb2F0IHgpOworCitpbnQgICAgIF9fb3ZsZCBzdWJfZ3JvdXBfc2Nhbl9leGNsdXNpdmVfYWRkKGludCAgIHgpOwordWludCAgICBfX292bGQgc3ViX2dyb3VwX3NjYW5fZXhjbHVzaXZlX2FkZCh1aW50ICB4KTsKK2xvbmcgICAgX19vdmxkIHN1Yl9ncm91cF9zY2FuX2V4Y2x1c2l2ZV9hZGQobG9uZyAgeCk7Cit1bG9uZyAgIF9fb3ZsZCBzdWJfZ3JvdXBfc2Nhbl9leGNsdXNpdmVfYWRkKHVsb25nIHgpOworZmxvYXQgICBfX292bGQgc3ViX2dyb3VwX3NjYW5fZXhjbHVzaXZlX2FkZChmbG9hdCB4KTsKK2ludCAgICAgX19vdmxkIHN1Yl9ncm91cF9zY2FuX2V4Y2x1c2l2ZV9taW4oaW50ICAgeCk7Cit1aW50ICAgIF9fb3ZsZCBzdWJfZ3JvdXBfc2Nhbl9leGNsdXNpdmVfbWluKHVpbnQgIHgpOworbG9uZyAgICBfX292bGQgc3ViX2dyb3VwX3NjYW5fZXhjbHVzaXZlX21pbihsb25nICB4KTsKK3Vsb25nICAgX19vdmxkIHN1Yl9ncm91cF9zY2FuX2V4Y2x1c2l2ZV9taW4odWxvbmcgeCk7CitmbG9hdCAgIF9fb3ZsZCBzdWJfZ3JvdXBfc2Nhbl9leGNsdXNpdmVfbWluKGZsb2F0IHgpOworaW50ICAgICBfX292bGQgc3ViX2dyb3VwX3NjYW5fZXhjbHVzaXZlX21heChpbnQgICB4KTsKK3VpbnQgICAgX19vdmxkIHN1Yl9ncm91cF9zY2FuX2V4Y2x1c2l2ZV9tYXgodWludCAgeCk7Citsb25nICAgIF9fb3ZsZCBzdWJfZ3JvdXBfc2Nhbl9leGNsdXNpdmVfbWF4KGxvbmcgIHgpOwordWxvbmcgICBfX292bGQgc3ViX2dyb3VwX3NjYW5fZXhjbHVzaXZlX21heCh1bG9uZyB4KTsKK2Zsb2F0ICAgX19vdmxkIHN1Yl9ncm91cF9zY2FuX2V4Y2x1c2l2ZV9tYXgoZmxvYXQgeCk7CisKK2ludCAgICAgX19vdmxkIHN1Yl9ncm91cF9zY2FuX2luY2x1c2l2ZV9hZGQoaW50ICAgeCk7Cit1aW50ICAgIF9fb3ZsZCBzdWJfZ3JvdXBfc2Nhbl9pbmNsdXNpdmVfYWRkKHVpbnQgIHgpOworbG9uZyAgICBfX292bGQgc3ViX2dyb3VwX3NjYW5faW5jbHVzaXZlX2FkZChsb25nICB4KTsKK3Vsb25nICAgX19vdmxkIHN1Yl9ncm91cF9zY2FuX2luY2x1c2l2ZV9hZGQodWxvbmcgeCk7CitmbG9hdCAgIF9fb3ZsZCBzdWJfZ3JvdXBfc2Nhbl9pbmNsdXNpdmVfYWRkKGZsb2F0IHgpOworaW50ICAgICBfX292bGQgc3ViX2dyb3VwX3NjYW5faW5jbHVzaXZlX21pbihpbnQgICB4KTsKK3VpbnQgICAgX19vdmxkIHN1Yl9ncm91cF9zY2FuX2luY2x1c2l2ZV9taW4odWludCAgeCk7Citsb25nICAgIF9fb3ZsZCBzdWJfZ3JvdXBfc2Nhbl9pbmNsdXNpdmVfbWluKGxvbmcgIHgpOwordWxvbmcgICBfX292bGQgc3ViX2dyb3VwX3NjYW5faW5jbHVzaXZlX21pbih1bG9uZyB4KTsKK2Zsb2F0ICAgX19vdmxkIHN1Yl9ncm91cF9zY2FuX2luY2x1c2l2ZV9taW4oZmxvYXQgeCk7CitpbnQgICAgIF9fb3ZsZCBzdWJfZ3JvdXBfc2Nhbl9pbmNsdXNpdmVfbWF4KGludCAgIHgpOwordWludCAgICBfX292bGQgc3ViX2dyb3VwX3NjYW5faW5jbHVzaXZlX21heCh1aW50ICB4KTsKK2xvbmcgICAgX19vdmxkIHN1Yl9ncm91cF9zY2FuX2luY2x1c2l2ZV9tYXgobG9uZyAgeCk7Cit1bG9uZyAgIF9fb3ZsZCBzdWJfZ3JvdXBfc2Nhbl9pbmNsdXNpdmVfbWF4KHVsb25nIHgpOworZmxvYXQgICBfX292bGQgc3ViX2dyb3VwX3NjYW5faW5jbHVzaXZlX21heChmbG9hdCB4KTsKKworI2lmZGVmIGNsX2tocl9mcDE2CitoYWxmICAgIF9fb3ZsZCBzdWJfZ3JvdXBfYnJvYWRjYXN0KGhhbGYgeCwgdWludCBzdWJfZ3JvdXBfbG9jYWxfaWQpOworaGFsZiAgICBfX292bGQgc3ViX2dyb3VwX3JlZHVjZV9hZGQoaGFsZiB4KTsKK2hhbGYgICAgX19vdmxkIHN1Yl9ncm91cF9yZWR1Y2VfbWluKGhhbGYgeCk7CitoYWxmICAgIF9fb3ZsZCBzdWJfZ3JvdXBfcmVkdWNlX21heChoYWxmIHgpOworaGFsZiAgICBfX292bGQgc3ViX2dyb3VwX3NjYW5fZXhjbHVzaXZlX2FkZChoYWxmIHgpOworaGFsZiAgICBfX292bGQgc3ViX2dyb3VwX3NjYW5fZXhjbHVzaXZlX21pbihoYWxmIHgpOworaGFsZiAgICBfX292bGQgc3ViX2dyb3VwX3NjYW5fZXhjbHVzaXZlX21heChoYWxmIHgpOworaGFsZiAgICBfX292bGQgc3ViX2dyb3VwX3NjYW5faW5jbHVzaXZlX2FkZChoYWxmIHgpOworaGFsZiAgICBfX292bGQgc3ViX2dyb3VwX3NjYW5faW5jbHVzaXZlX21pbihoYWxmIHgpOworaGFsZiAgICBfX292bGQgc3ViX2dyb3VwX3NjYW5faW5jbHVzaXZlX21heChoYWxmIHgpOworI2VuZGlmIC8vY2xfa2hyX2ZwMTYKKworI2lmZGVmIGNsX2tocl9mcDY0Citkb3VibGUgIF9fb3ZsZCBzdWJfZ3JvdXBfYnJvYWRjYXN0KGRvdWJsZSB4LCB1aW50IHN1Yl9ncm91cF9sb2NhbF9pZCk7Citkb3VibGUgIF9fb3ZsZCBzdWJfZ3JvdXBfcmVkdWNlX2FkZChkb3VibGUgeCk7Citkb3VibGUgIF9fb3ZsZCBzdWJfZ3JvdXBfcmVkdWNlX21pbihkb3VibGUgeCk7Citkb3VibGUgIF9fb3ZsZCBzdWJfZ3JvdXBfcmVkdWNlX21heChkb3VibGUgeCk7Citkb3VibGUgIF9fb3ZsZCBzdWJfZ3JvdXBfc2Nhbl9leGNsdXNpdmVfYWRkKGRvdWJsZSB4KTsKK2RvdWJsZSAgX19vdmxkIHN1Yl9ncm91cF9zY2FuX2V4Y2x1c2l2ZV9taW4oZG91YmxlIHgpOworZG91YmxlICBfX292bGQgc3ViX2dyb3VwX3NjYW5fZXhjbHVzaXZlX21heChkb3VibGUgeCk7Citkb3VibGUgIF9fb3ZsZCBzdWJfZ3JvdXBfc2Nhbl9pbmNsdXNpdmVfYWRkKGRvdWJsZSB4KTsKK2RvdWJsZSAgX19vdmxkIHN1Yl9ncm91cF9zY2FuX2luY2x1c2l2ZV9taW4oZG91YmxlIHgpOworZG91YmxlICBfX292bGQgc3ViX2dyb3VwX3NjYW5faW5jbHVzaXZlX21heChkb3VibGUgeCk7CisjZW5kaWYgLy9jbF9raHJfZnA2NAorCisjZW5kaWYgLy9jbF9raHJfc3ViZ3JvdXBzIGNsX2ludGVsX3N1Ymdyb3VwcworCisvLyBEaXNhYmxlIGFueSBleHRlbnNpb25zIHdlIG1heSBoYXZlIGVuYWJsZWQgcHJldmlvdXNseS4KKyNwcmFnbWEgT1BFTkNMIEVYVEVOU0lPTiBhbGwgOiBkaXNhYmxlCisKKyN1bmRlZiBfX2NuZm4KKyN1bmRlZiBfX292bGQKKyNlbmRpZiAvL19PUEVOQ0xfSF8KZGlmZiAtLWdpdCBhL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL3BrdWludHJpbi5oIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvcGt1aW50cmluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU1NDU5NAotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL3BrdWludHJpbi5oCkBAIC0wLDAgKzEsNDggQEAKKy8qPT09LS0tLS0tLS0tLS0tLSBwa3VpbnRyaW4uaCAtIFBLVSBpbnRyaW5zaWNzIC0tLS0tLS0tLS0tLS0tLS0tLT09PQorICoKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKgorICo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICovCisjaWZuZGVmIF9fSU1NSU5UUklOX0gKKyNlcnJvciAiTmV2ZXIgdXNlIDxwa3VpbnRyaW4uaD4gZGlyZWN0bHk7IGluY2x1ZGUgPGltbWludHJpbi5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9fUEtVSU5UUklOX0gKKyNkZWZpbmUgX19QS1VJTlRSSU5fSAorCisvKiBEZWZpbmUgdGhlIGRlZmF1bHQgYXR0cmlidXRlcyBmb3IgdGhlIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUuICovCisjZGVmaW5lIF9fREVGQVVMVF9GTl9BVFRSUyBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18sIF9fdGFyZ2V0X18oInBrdSIpKSkKKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50IF9fREVGQVVMVF9GTl9BVFRSUworX3JkcGtydV91MzIodm9pZCkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3JkcGtydSgpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX3dycGtydSh1bnNpZ25lZCBpbnQgX192YWwpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl93cnBrcnUoX192YWwpOworfQorCisjdW5kZWYgX19ERUZBVUxUX0ZOX0FUVFJTCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvcG1taW50cmluLmggYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9wbW1pbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjEwNTgwCi0tLSAvZGV2L251bGwKKysrIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvcG1taW50cmluLmgKQEAgLTAsMCArMSwzMTEgQEAKKy8qPT09LS0tLSBwbW1pbnRyaW4uaCAtIFNTRTMgaW50cmluc2ljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKgorICo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICovCisKKyNpZm5kZWYgX19QTU1JTlRSSU5fSAorI2RlZmluZSBfX1BNTUlOVFJJTl9ICisKKyNpbmNsdWRlIDxlbW1pbnRyaW4uaD4KKworLyogRGVmaW5lIHRoZSBkZWZhdWx0IGF0dHJpYnV0ZXMgZm9yIHRoZSBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlLiAqLworI2RlZmluZSBfX0RFRkFVTFRfRk5fQVRUUlMgXAorICBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18sIF9fdGFyZ2V0X18oInNzZTMiKSkpCisKKy8vLyBcYnJpZWYgTG9hZHMgZGF0YSBmcm9tIGFuIHVuYWxpZ25lZCBtZW1vcnkgbG9jYXRpb24gdG8gZWxlbWVudHMgaW4gYSAxMjgtYml0CisvLy8gICAgdmVjdG9yLiBJZiB0aGUgYWRkcmVzcyBvZiB0aGUgZGF0YSBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLCB0aGUKKy8vLyAgICBpbnN0cnVjdGlvbiBtYXkgcmVhZCB0d28gYWRqYWNlbnQgYWxpZ25lZCBibG9ja3Mgb2YgbWVtb3J5IHRvIHJldHJpZXZlCisvLy8gICAgdGhlIHJlcXVlc3RlZCBkYXRhLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZMRERRVSBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX3AKKy8vLyAgICBBIHBvaW50ZXIgdG8gYSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgaW50ZWdlciB2YWx1ZXMuCisvLy8gXHJldHVybnMgQSAxMjgtYml0IHZlY3RvciBjb250YWluaW5nIHRoZSBtb3ZlZCB2YWx1ZXMuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2xkZHF1X3NpMTI4KF9fbTEyOGkgY29uc3QgKl9fcCkKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX2xkZHF1KChjaGFyIGNvbnN0ICopX19wKTsKK30KKworLy8vIFxicmllZiBBZGRzIHRoZSBldmVuLWluZGV4ZWQgdmFsdWVzIGFuZCBzdWJ0cmFjdHMgdGhlIG9kZC1pbmRleGVkIHZhbHVlcyBvZgorLy8vICAgIHR3byAxMjgtYml0IHZlY3RvcnMgb2YgWzQgeCBmbG9hdF0uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVkFERFNVQlBTIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0gY29udGFpbmluZyB0aGUgbGVmdCBzb3VyY2Ugb3BlcmFuZC4KKy8vLyBccGFyYW0gX19iCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSByaWdodCBzb3VyY2Ugb3BlcmFuZC4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgdGhlIGFsdGVybmF0aW5nIHN1bXMgYW5kCisvLy8gICAgZGlmZmVyZW5jZXMgb2YgYm90aCBvcGVyYW5kcy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9hZGRzdWJfcHMoX19tMTI4IF9fYSwgX19tMTI4IF9fYikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2FkZHN1YnBzKChfX3Y0c2YpX19hLCAoX192NHNmKV9fYik7Cit9CisKKy8vLyBcYnJpZWYgSG9yaXpvbnRhbGx5IGFkZHMgdGhlIGFkamFjZW50IHBhaXJzIG9mIHZhbHVlcyBjb250YWluZWQgaW4gdHdvCisvLy8gICAgMTI4LWJpdCB2ZWN0b3JzIG9mIFs0IHggZmxvYXRdLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZIQUREUFMgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIG9uZSBvZiB0aGUgc291cmNlIG9wZXJhbmRzLgorLy8vICAgIFRoZSBob3Jpem9udGFsIHN1bXMgb2YgdGhlIHZhbHVlcyBhcmUgc3RvcmVkIGluIHRoZSBsb3dlciBiaXRzIG9mIHRoZQorLy8vICAgIGRlc3RpbmF0aW9uLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBzb3VyY2Ugb3BlcmFuZHMuCisvLy8gICAgVGhlIGhvcml6b250YWwgc3VtcyBvZiB0aGUgdmFsdWVzIGFyZSBzdG9yZWQgaW4gdGhlIHVwcGVyIGJpdHMgb2YgdGhlCisvLy8gICAgZGVzdGluYXRpb24uCisvLy8gXHJldHVybnMgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSBob3Jpem9udGFsIHN1bXMgb2YKKy8vLyAgICBib3RoIG9wZXJhbmRzLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2hhZGRfcHMoX19tMTI4IF9fYSwgX19tMTI4IF9fYikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2hhZGRwcygoX192NHNmKV9fYSwgKF9fdjRzZilfX2IpOworfQorCisvLy8gXGJyaWVmIEhvcml6b250YWxseSBzdWJ0cmFjdHMgdGhlIGFkamFjZW50IHBhaXJzIG9mIHZhbHVlcyBjb250YWluZWQgaW4gdHdvCisvLy8gICAgMTI4LWJpdCB2ZWN0b3JzIG9mIFs0IHggZmxvYXRdLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZIU1VCUFMgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIG9uZSBvZiB0aGUgc291cmNlIG9wZXJhbmRzLgorLy8vICAgIFRoZSBob3Jpem9udGFsIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIHZhbHVlcyBhcmUgc3RvcmVkIGluIHRoZSBsb3dlcgorLy8vICAgIGJpdHMgb2YgdGhlIGRlc3RpbmF0aW9uLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBzb3VyY2Ugb3BlcmFuZHMuCisvLy8gICAgVGhlIGhvcml6b250YWwgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgdmFsdWVzIGFyZSBzdG9yZWQgaW4gdGhlIHVwcGVyCisvLy8gICAgYml0cyBvZiB0aGUgZGVzdGluYXRpb24uCisvLy8gXHJldHVybnMgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSBob3Jpem9udGFsCisvLy8gICAgZGlmZmVyZW5jZXMgb2YgYm90aCBvcGVyYW5kcy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9oc3ViX3BzKF9fbTEyOCBfX2EsIF9fbTEyOCBfX2IpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9oc3VicHMoKF9fdjRzZilfX2EsIChfX3Y0c2YpX19iKTsKK30KKworLy8vIFxicmllZiBNb3ZlcyBhbmQgZHVwbGljYXRlcyBoaWdoLW9yZGVyIChvZGQtaW5kZXhlZCkgdmFsdWVzIGZyb20gYSAxMjgtYml0CisvLy8gICAgdmVjdG9yIG9mIFs0IHggZmxvYXRdIHRvIGZsb2F0IHZhbHVlcyBzdG9yZWQgaW4gYSAxMjgtYml0IHZlY3RvciBvZgorLy8vICAgIFs0IHggZmxvYXRdLgorLy8vICAgIEJpdHMgWzEyNzo5Nl0gb2YgdGhlIHNvdXJjZSBhcmUgd3JpdHRlbiB0byBiaXRzIFsxMjc6OTZdIGFuZCBbOTU6NjRdIG9mCisvLy8gICAgdGhlIGRlc3RpbmF0aW9uLgorLy8vICAgIEJpdHMgWzYzOjMyXSBvZiB0aGUgc291cmNlIGFyZSB3cml0dGVuIHRvIGJpdHMgWzYzOjMyXSBhbmQgWzMxOjBdIG9mIHRoZQorLy8vICAgIGRlc3RpbmF0aW9uLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZNT1ZTSERVUCBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdLgorLy8vIFxyZXR1cm5zIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0gY29udGFpbmluZyB0aGUgbW92ZWQgYW5kIGR1cGxpY2F0ZWQKKy8vLyAgICB2YWx1ZXMuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbW92ZWhkdXBfcHMoX19tMTI4IF9fYSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3Y0c2YpX19hLCAoX192NHNmKV9fYSwgMSwgMSwgMywgMyk7Cit9CisKKy8vLyBcYnJpZWYgRHVwbGljYXRlcyBsb3ctb3JkZXIgKGV2ZW4taW5kZXhlZCkgdmFsdWVzIGZyb20gYSAxMjgtYml0CisvLy8gICAgdmVjdG9yIG9mIFs0IHggZmxvYXRdIHRvIGZsb2F0IHZhbHVlcyBzdG9yZWQgaW4gYSAxMjgtYml0IHZlY3RvciBvZgorLy8vICAgIFs0IHggZmxvYXRdLgorLy8vICAgIEJpdHMgWzk1OjY0XSBvZiB0aGUgc291cmNlIGFyZSB3cml0dGVuIHRvIGJpdHMgWzEyNzo5Nl0gYW5kIFs5NTo2NF0gb2YKKy8vLyAgICB0aGUgZGVzdGluYXRpb24uCisvLy8gICAgQml0cyBbMzE6MF0gb2YgdGhlIHNvdXJjZSBhcmUgd3JpdHRlbiB0byBiaXRzIFs2MzozMl0gYW5kIFszMTowXSBvZiB0aGUKKy8vLyAgICBkZXN0aW5hdGlvbi4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWTU9WU0xEVVAgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XS4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgdGhlIG1vdmVkIGFuZCBkdXBsaWNhdGVkCisvLy8gICAgdmFsdWVzLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21vdmVsZHVwX3BzKF9fbTEyOCBfX2EpCit7CisgIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcigoX192NHNmKV9fYSwgKF9fdjRzZilfX2EsIDAsIDAsIDIsIDIpOworfQorCisvLy8gXGJyaWVmIEFkZHMgdGhlIGV2ZW4taW5kZXhlZCB2YWx1ZXMgYW5kIHN1YnRyYWN0cyB0aGUgb2RkLWluZGV4ZWQgdmFsdWVzIG9mCisvLy8gICAgdHdvIDEyOC1iaXQgdmVjdG9ycyBvZiBbMiB4IGRvdWJsZV0uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVkFERFNVQlBEIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzIgeCBkb3VibGVdIGNvbnRhaW5pbmcgdGhlIGxlZnQgc291cmNlIG9wZXJhbmQuCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzIgeCBkb3VibGVdIGNvbnRhaW5pbmcgdGhlIHJpZ2h0IHNvdXJjZSBvcGVyYW5kLgorLy8vIFxyZXR1cm5zIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzIgeCBkb3VibGVdIGNvbnRhaW5pbmcgdGhlIGFsdGVybmF0aW5nIHN1bXMKKy8vLyAgICBhbmQgZGlmZmVyZW5jZXMgb2YgYm90aCBvcGVyYW5kcy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fYWRkc3ViX3BkKF9fbTEyOGQgX19hLCBfX20xMjhkIF9fYikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2FkZHN1YnBkKChfX3YyZGYpX19hLCAoX192MmRmKV9fYik7Cit9CisKKy8vLyBcYnJpZWYgSG9yaXpvbnRhbGx5IGFkZHMgdGhlIHBhaXJzIG9mIHZhbHVlcyBjb250YWluZWQgaW4gdHdvIDEyOC1iaXQKKy8vLyAgICB2ZWN0b3JzIG9mIFsyIHggZG91YmxlXS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWSEFERFBEIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzIgeCBkb3VibGVdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBzb3VyY2Ugb3BlcmFuZHMuCisvLy8gICAgVGhlIGhvcml6b250YWwgc3VtIG9mIHRoZSB2YWx1ZXMgaXMgc3RvcmVkIGluIHRoZSBsb3dlciBiaXRzIG9mIHRoZQorLy8vICAgIGRlc3RpbmF0aW9uLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFsyIHggZG91YmxlXSBjb250YWluaW5nIG9uZSBvZiB0aGUgc291cmNlIG9wZXJhbmRzLgorLy8vICAgIFRoZSBob3Jpem9udGFsIHN1bSBvZiB0aGUgdmFsdWVzIGlzIHN0b3JlZCBpbiB0aGUgdXBwZXIgYml0cyBvZiB0aGUKKy8vLyAgICBkZXN0aW5hdGlvbi4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgdmVjdG9yIG9mIFsyIHggZG91YmxlXSBjb250YWluaW5nIHRoZSBob3Jpem9udGFsIHN1bXMgb2YKKy8vLyAgICBib3RoIG9wZXJhbmRzLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9oYWRkX3BkKF9fbTEyOGQgX19hLCBfX20xMjhkIF9fYikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2hhZGRwZCgoX192MmRmKV9fYSwgKF9fdjJkZilfX2IpOworfQorCisvLy8gXGJyaWVmIEhvcml6b250YWxseSBzdWJ0cmFjdHMgdGhlIHBhaXJzIG9mIHZhbHVlcyBjb250YWluZWQgaW4gdHdvIDEyOC1iaXQKKy8vLyAgICB2ZWN0b3JzIG9mIFsyIHggZG91YmxlXS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWSFNVQlBEIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzIgeCBkb3VibGVdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBzb3VyY2Ugb3BlcmFuZHMuCisvLy8gICAgVGhlIGhvcml6b250YWwgZGlmZmVyZW5jZSBvZiB0aGUgdmFsdWVzIGlzIHN0b3JlZCBpbiB0aGUgbG93ZXIgYml0cyBvZgorLy8vICAgIHRoZSBkZXN0aW5hdGlvbi4KKy8vLyBccGFyYW0gX19iCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbMiB4IGRvdWJsZV0gY29udGFpbmluZyBvbmUgb2YgdGhlIHNvdXJjZSBvcGVyYW5kcy4KKy8vLyAgICBUaGUgaG9yaXpvbnRhbCBkaWZmZXJlbmNlIG9mIHRoZSB2YWx1ZXMgaXMgc3RvcmVkIGluIHRoZSB1cHBlciBiaXRzIG9mCisvLy8gICAgdGhlIGRlc3RpbmF0aW9uLgorLy8vIFxyZXR1cm5zIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzIgeCBkb3VibGVdIGNvbnRhaW5pbmcgdGhlIGhvcml6b250YWwKKy8vLyAgICBkaWZmZXJlbmNlcyBvZiBib3RoIG9wZXJhbmRzLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9oc3ViX3BkKF9fbTEyOGQgX19hLCBfX20xMjhkIF9fYikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2hzdWJwZCgoX192MmRmKV9fYSwgKF9fdjJkZilfX2IpOworfQorCisvLy8gXGJyaWVmIE1vdmVzIGFuZCBkdXBsaWNhdGVzIG9uZSBkb3VibGUtcHJlY2lzaW9uIHZhbHVlIHRvIGRvdWJsZS1wcmVjaXNpb24KKy8vLyAgICB2YWx1ZXMgc3RvcmVkIGluIGEgMTI4LWJpdCB2ZWN0b3Igb2YgWzIgeCBkb3VibGVdLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gXGNvZGUKKy8vLyBfX20xMjhkIF9tbV9sb2FkZHVwX3BkKGRvdWJsZSBjb25zdCAqIGRwKTsKKy8vLyBcZW5kY29kZQorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZNT1ZERFVQIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIGRwCisvLy8gICAgQSBwb2ludGVyIHRvIGEgZG91YmxlLXByZWNpc2lvbiB2YWx1ZSB0byBiZSBtb3ZlZCBhbmQgZHVwbGljYXRlZC4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgdmVjdG9yIG9mIFsyIHggZG91YmxlXSBjb250YWluaW5nIHRoZSBtb3ZlZCBhbmQKKy8vLyAgICBkdXBsaWNhdGVkIHZhbHVlcy4KKyNkZWZpbmUgICAgICAgIF9tbV9sb2FkZHVwX3BkKGRwKSAgICAgICAgX21tX2xvYWQxX3BkKGRwKQorCisvLy8gXGJyaWVmIE1vdmVzIGFuZCBkdXBsaWNhdGVzIHRoZSBkb3VibGUtcHJlY2lzaW9uIHZhbHVlIGluIHRoZSBsb3dlciBiaXRzIG9mCisvLy8gICAgYSAxMjgtYml0IHZlY3RvciBvZiBbMiB4IGRvdWJsZV0gdG8gZG91YmxlLXByZWNpc2lvbiB2YWx1ZXMgc3RvcmVkIGluIGEKKy8vLyAgICAxMjgtYml0IHZlY3RvciBvZiBbMiB4IGRvdWJsZV0uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVk1PVkREVVAgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbMiB4IGRvdWJsZV0uIEJpdHMgWzYzOjBdIGFyZSB3cml0dGVuIHRvIGJpdHMKKy8vLyAgICBbMTI3OjY0XSBhbmQgWzYzOjBdIG9mIHRoZSBkZXN0aW5hdGlvbi4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgdmVjdG9yIG9mIFsyIHggZG91YmxlXSBjb250YWluaW5nIHRoZSBtb3ZlZCBhbmQKKy8vLyAgICBkdXBsaWNhdGVkIHZhbHVlcy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbW92ZWR1cF9wZChfX20xMjhkIF9fYSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3YyZGYpX19hLCAoX192MmRmKV9fYSwgMCwgMCk7Cit9CisKKyNkZWZpbmUgX01NX0RFTk9STUFMU19aRVJPX09OICAgKDB4MDA0MCkKKyNkZWZpbmUgX01NX0RFTk9STUFMU19aRVJPX09GRiAgKDB4MDAwMCkKKworI2RlZmluZSBfTU1fREVOT1JNQUxTX1pFUk9fTUFTSyAoMHgwMDQwKQorCisjZGVmaW5lIF9NTV9HRVRfREVOT1JNQUxTX1pFUk9fTU9ERSgpIChfbW1fZ2V0Y3NyKCkgJiBfTU1fREVOT1JNQUxTX1pFUk9fTUFTSykKKyNkZWZpbmUgX01NX1NFVF9ERU5PUk1BTFNfWkVST19NT0RFKHgpIChfbW1fc2V0Y3NyKChfbW1fZ2V0Y3NyKCkgJiB+X01NX0RFTk9STUFMU19aRVJPX01BU0spIHwgKHgpKSkKKworLy8vIFxicmllZiBFc3RhYmxpc2hlcyBhIGxpbmVhciBhZGRyZXNzIG1lbW9yeSByYW5nZSB0byBiZSBtb25pdG9yZWQgYW5kIHB1dHMKKy8vLyAgICB0aGUgcHJvY2Vzc29yIGluIHRoZSBtb25pdG9yIGV2ZW50IHBlbmRpbmcgc3RhdGUuIERhdGEgc3RvcmVkIGluIHRoZQorLy8vICAgIG1vbml0b3JlZCBhZGRyZXNzIHJhbmdlIGNhdXNlcyB0aGUgcHJvY2Vzc29yIHRvIGV4aXQgdGhlIHBlbmRpbmcgc3RhdGUuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgTU9OSVRPUiBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX3AKKy8vLyAgICBUaGUgbWVtb3J5IHJhbmdlIHRvIGJlIG1vbml0b3JlZC4gVGhlIHNpemUgb2YgdGhlIHJhbmdlIGlzIGRldGVybWluZWQgYnkKKy8vLyAgICBDUFVJRCBmdW5jdGlvbiAwMDAwXzAwMDVoLgorLy8vIFxwYXJhbSBfX2V4dGVuc2lvbnMKKy8vLyAgICBPcHRpb25hbCBleHRlbnNpb25zIGZvciB0aGUgbW9uaXRvcmluZyBzdGF0ZS4KKy8vLyBccGFyYW0gX19oaW50cworLy8vICAgIE9wdGlvbmFsIGhpbnRzIGZvciB0aGUgbW9uaXRvcmluZyBzdGF0ZS4KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbW9uaXRvcih2b2lkIGNvbnN0ICpfX3AsIHVuc2lnbmVkIF9fZXh0ZW5zaW9ucywgdW5zaWduZWQgX19oaW50cykKK3sKKyAgX19idWlsdGluX2lhMzJfbW9uaXRvcigodm9pZCAqKV9fcCwgX19leHRlbnNpb25zLCBfX2hpbnRzKTsKK30KKworLy8vIFxicmllZiBVc2VkIHdpdGggdGhlIE1PTklUT1IgaW5zdHJ1Y3Rpb24gdG8gd2FpdCB3aGlsZSB0aGUgcHJvY2Vzc29yIGlzIGluCisvLy8gICAgdGhlIG1vbml0b3IgZXZlbnQgcGVuZGluZyBzdGF0ZS4gRGF0YSBzdG9yZWQgaW4gdGhlIG1vbml0b3JlZCBhZGRyZXNzCisvLy8gICAgcmFuZ2UgY2F1c2VzIHRoZSBwcm9jZXNzb3IgdG8gZXhpdCB0aGUgcGVuZGluZyBzdGF0ZS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBNV0FJVCBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2V4dGVuc2lvbnMKKy8vLyAgICBPcHRpb25hbCBleHRlbnNpb25zIGZvciB0aGUgbW9uaXRvcmluZyBzdGF0ZSwgd2hpY2ggbWF5IHZhcnkgYnkKKy8vLyAgICBwcm9jZXNzb3IuCisvLy8gXHBhcmFtIF9faGludHMKKy8vLyAgICBPcHRpb25hbCBoaW50cyBmb3IgdGhlIG1vbml0b3Jpbmcgc3RhdGUsIHdoaWNoIG1heSB2YXJ5IGJ5IHByb2Nlc3Nvci4KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbXdhaXQodW5zaWduZWQgX19leHRlbnNpb25zLCB1bnNpZ25lZCBfX2hpbnRzKQoreworICBfX2J1aWx0aW5faWEzMl9td2FpdChfX2V4dGVuc2lvbnMsIF9faGludHMpOworfQorCisjdW5kZWYgX19ERUZBVUxUX0ZOX0FUVFJTCisKKyNlbmRpZiAvKiBfX1BNTUlOVFJJTl9IICovCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9wb3BjbnRpbnRyaW4uaCBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL3BvcGNudGludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMmYxNjcKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9wb3BjbnRpbnRyaW4uaApAQCAtMCwwICsxLDk4IEBACisvKj09PS0tLS0gcG9wY250aW50cmluLmggLSBQT1BDTlQgaW50cmluc2ljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICoKKyAqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqLworCisjaWZuZGVmIF9QT1BDTlRJTlRSSU5fSAorI2RlZmluZSBfUE9QQ05USU5UUklOX0gKKworLyogRGVmaW5lIHRoZSBkZWZhdWx0IGF0dHJpYnV0ZXMgZm9yIHRoZSBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlLiAqLworI2RlZmluZSBfX0RFRkFVTFRfRk5fQVRUUlMgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fLCBfX3RhcmdldF9fKCJwb3BjbnQiKSkpCisKKy8vLyBcYnJpZWYgQ291bnRzIHRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgc291cmNlIG9wZXJhbmQgaGF2aW5nIGEgdmFsdWUgb2YgMS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBQT1BDTlQgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19BCisvLy8gICAgQW4gdW5zaWduZWQgMzItYml0IGludGVnZXIgb3BlcmFuZC4KKy8vLyBccmV0dXJucyBBIDMyLWJpdCBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIG51bWJlciBvZiBiaXRzIHdpdGggdmFsdWUgMSBpbiB0aGUKKy8vLyAgICBzb3VyY2Ugb3BlcmFuZC4KK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9wb3BjbnRfdTMyKHVuc2lnbmVkIGludCBfX0EpCit7CisgIHJldHVybiBfX2J1aWx0aW5fcG9wY291bnQoX19BKTsKK30KKworLy8vIFxicmllZiBDb3VudHMgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBzb3VyY2Ugb3BlcmFuZCBoYXZpbmcgYSB2YWx1ZSBvZiAxLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFBPUENOVCBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX0EKKy8vLyAgICBBIHNpZ25lZCAzMi1iaXQgaW50ZWdlciBvcGVyYW5kLgorLy8vIFxyZXR1cm5zIEEgMzItYml0IGludGVnZXIgY29udGFpbmluZyB0aGUgbnVtYmVyIG9mIGJpdHMgd2l0aCB2YWx1ZSAxIGluIHRoZQorLy8vICAgIHNvdXJjZSBvcGVyYW5kLgorc3RhdGljIF9faW5saW5lX18gaW50IF9fREVGQVVMVF9GTl9BVFRSUworX3BvcGNudDMyKGludCBfX0EpCit7CisgIHJldHVybiBfX2J1aWx0aW5fcG9wY291bnQoX19BKTsKK30KKworI2lmZGVmIF9feDg2XzY0X18KKy8vLyBcYnJpZWYgQ291bnRzIHRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgc291cmNlIG9wZXJhbmQgaGF2aW5nIGEgdmFsdWUgb2YgMS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBQT1BDTlQgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19BCisvLy8gICAgQW4gdW5zaWduZWQgNjQtYml0IGludGVnZXIgb3BlcmFuZC4KKy8vLyBccmV0dXJucyBBIDY0LWJpdCBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIG51bWJlciBvZiBiaXRzIHdpdGggdmFsdWUgMSBpbiB0aGUKKy8vLyAgICBzb3VyY2Ugb3BlcmFuZC4KK3N0YXRpYyBfX2lubGluZV9fIGxvbmcgbG9uZyBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9wb3BjbnRfdTY0KHVuc2lnbmVkIGxvbmcgbG9uZyBfX0EpCit7CisgIHJldHVybiBfX2J1aWx0aW5fcG9wY291bnRsbChfX0EpOworfQorCisvLy8gXGJyaWVmIENvdW50cyB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIHNvdXJjZSBvcGVyYW5kIGhhdmluZyBhIHZhbHVlIG9mIDEuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgUE9QQ05UIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fQQorLy8vICAgIEEgc2lnbmVkIDY0LWJpdCBpbnRlZ2VyIG9wZXJhbmQuCisvLy8gXHJldHVybnMgQSA2NC1iaXQgaW50ZWdlciBjb250YWluaW5nIHRoZSBudW1iZXIgb2YgYml0cyB3aXRoIHZhbHVlIDEgaW4gdGhlCisvLy8gICAgc291cmNlIG9wZXJhbmQuCitzdGF0aWMgX19pbmxpbmVfXyBsb25nIGxvbmcgX19ERUZBVUxUX0ZOX0FUVFJTCitfcG9wY250NjQobG9uZyBsb25nIF9fQSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9wb3Bjb3VudGxsKF9fQSk7Cit9CisjZW5kaWYgLyogX194ODZfNjRfXyAqLworCisjdW5kZWYgX19ERUZBVUxUX0ZOX0FUVFJTCisKKyNlbmRpZiAvKiBfUE9QQ05USU5UUklOX0ggKi8KZGlmZiAtLWdpdCBhL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL3ByZmNod2ludHJpbi5oIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvcHJmY2h3aW50cmluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEwMjg1NwotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL3ByZmNod2ludHJpbi5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qPT09LS0tLSBwcmZjaHdpbnRyaW4uaCAtIFBSRUZFVENIVyBpbnRyaW5zaWMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKgorICo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICovCisKKyNpZiAhZGVmaW5lZChfX1g4NklOVFJJTl9IKSAmJiAhZGVmaW5lZChfTU0zRE5PV19IX0lOQ0xVREVEKQorI2Vycm9yICJOZXZlciB1c2UgPHByZmNod2ludHJpbi5oPiBkaXJlY3RseTsgaW5jbHVkZSA8eDg2aW50cmluLmg+IG9yIDxtbTNkbm93Lmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpZm5kZWYgX19QUkZDSFdJTlRSSU5fSAorI2RlZmluZSBfX1BSRkNIV0lOVFJJTl9ICisKKyNpZiBkZWZpbmVkKF9fUFJGQ0hXX18pIHx8IGRlZmluZWQoX18zZE5PV19fKQorc3RhdGljIF9faW5saW5lX18gdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18pKQorX21fcHJlZmV0Y2godm9pZCAqX19QKQoreworICBfX2J1aWx0aW5fcHJlZmV0Y2ggKF9fUCwgMCwgMyAvKiBfTU1fSElOVF9UMCAqLyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fKSkKK19tX3ByZWZldGNodyh2b2lkICpfX1ApCit7CisgIF9fYnVpbHRpbl9wcmVmZXRjaCAoX19QLCAxLCAzIC8qIF9NTV9ISU5UX1QwICovKTsKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19QUkZDSFdJTlRSSU5fSCAqLwpkaWZmIC0tZ2l0IGEvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvcmRzZWVkaW50cmluLmggYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9yZHNlZWRpbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjFmNGVhCi0tLSAvZGV2L251bGwKKysrIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvcmRzZWVkaW50cmluLmgKQEAgLTAsMCArMSw1NiBAQAorLyo9PT0tLS0tIHJkc2VlZGludHJpbi5oIC0gUkRTRUVEIGludHJpbnNpY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqCisgKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisgKi8KKworI2lmbmRlZiBfX1g4NklOVFJJTl9ICisjZXJyb3IgIk5ldmVyIHVzZSA8cmRzZWVkaW50cmluLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDx4ODZpbnRyaW4uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmbmRlZiBfX1JEU0VFRElOVFJJTl9ICisjZGVmaW5lIF9fUkRTRUVESU5UUklOX0gKKworLyogRGVmaW5lIHRoZSBkZWZhdWx0IGF0dHJpYnV0ZXMgZm9yIHRoZSBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlLiAqLworI2RlZmluZSBfX0RFRkFVTFRfRk5fQVRUUlMgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fLCBfX3RhcmdldF9fKCJyZHNlZWQiKSkpCisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0RFRkFVTFRfRk5fQVRUUlMKK19yZHNlZWQxNl9zdGVwKHVuc2lnbmVkIHNob3J0ICpfX3ApCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9yZHNlZWQxNl9zdGVwKF9fcCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0RFRkFVTFRfRk5fQVRUUlMKK19yZHNlZWQzMl9zdGVwKHVuc2lnbmVkIGludCAqX19wKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcmRzZWVkMzJfc3RlcChfX3ApOworfQorCisjaWZkZWYgX194ODZfNjRfXworc3RhdGljIF9faW5saW5lX18gaW50IF9fREVGQVVMVF9GTl9BVFRSUworX3Jkc2VlZDY0X3N0ZXAodW5zaWduZWQgbG9uZyBsb25nICpfX3ApCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9yZHNlZWQ2NF9zdGVwKF9fcCk7Cit9CisjZW5kaWYKKworI3VuZGVmIF9fREVGQVVMVF9GTl9BVFRSUworCisjZW5kaWYgLyogX19SRFNFRURJTlRSSU5fSCAqLwpkaWZmIC0tZ2l0IGEvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvcnRtaW50cmluLmggYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9ydG1pbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmE1OGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvcnRtaW50cmluLmgKQEAgLTAsMCArMSw1OSBAQAorLyo9PT0tLS0tIHJ0bWludHJpbi5oIC0gUlRNIGludHJpbnNpY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqCisgKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisgKi8KKworI2lmbmRlZiBfX0lNTUlOVFJJTl9ICisjZXJyb3IgIk5ldmVyIHVzZSA8cnRtaW50cmluLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxpbW1pbnRyaW4uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmbmRlZiBfX1JUTUlOVFJJTl9ICisjZGVmaW5lIF9fUlRNSU5UUklOX0gKKworI2RlZmluZSBfWEJFR0lOX1NUQVJURUQgICAofjB1KQorI2RlZmluZSBfWEFCT1JUX0VYUExJQ0lUICAoMSA8PCAwKQorI2RlZmluZSBfWEFCT1JUX1JFVFJZICAgICAoMSA8PCAxKQorI2RlZmluZSBfWEFCT1JUX0NPTkZMSUNUICAoMSA8PCAyKQorI2RlZmluZSBfWEFCT1JUX0NBUEFDSVRZICAoMSA8PCAzKQorI2RlZmluZSBfWEFCT1JUX0RFQlVHICAgICAoMSA8PCA0KQorI2RlZmluZSBfWEFCT1JUX05FU1RFRCAgICAoMSA8PCA1KQorI2RlZmluZSBfWEFCT1JUX0NPREUoeCkgICAoKCh4KSA+PiAyNCkgJiAweEZGKQorCisvKiBEZWZpbmUgdGhlIGRlZmF1bHQgYXR0cmlidXRlcyBmb3IgdGhlIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUuICovCisjZGVmaW5lIF9fREVGQVVMVF9GTl9BVFRSUyBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18sIF9fdGFyZ2V0X18oInJ0bSIpKSkKKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50IF9fREVGQVVMVF9GTl9BVFRSUworX3hiZWdpbih2b2lkKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfeGJlZ2luKCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfeGVuZCh2b2lkKQoreworICBfX2J1aWx0aW5faWEzMl94ZW5kKCk7Cit9CisKKyNkZWZpbmUgX3hhYm9ydChpbW0pIF9fYnVpbHRpbl9pYTMyX3hhYm9ydCgoaW1tKSkKKworI3VuZGVmIF9fREVGQVVMVF9GTl9BVFRSUworCisjZW5kaWYgLyogX19SVE1JTlRSSU5fSCAqLwpkaWZmIC0tZ2l0IGEvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvczM5MGludHJpbi5oIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvczM5MGludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MTI3NGMKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9zMzkwaW50cmluLmgKQEAgLTAsMCArMSwzOSBAQAorLyo9PT0tLS0tIHMzOTBpbnRyaW4uaCAtIFN5c3RlbVogaW50cmluc2ljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqCisgKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisgKi8KKworI2lmbmRlZiBfX1MzOTBJTlRSSU5fSAorI2RlZmluZSBfX1MzOTBJTlRSSU5fSAorCisjaWZuZGVmIF9fczM5MF9fCisjZXJyb3IgIjxzMzkwaW50cmluLmg+IGlzIGZvciBzMzkwIG9ubHkiCisjZW5kaWYKKworI2lmZGVmIF9fSFRNX18KKyNpbmNsdWRlIDxodG1pbnRyaW4uaD4KKyNlbmRpZgorCisjaWZkZWYgX19WRUNfXworI2luY2x1ZGUgPHZlY2ludHJpbi5oPgorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1MzOTBJTlRSSU5fSCovCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9zaGFpbnRyaW4uaCBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL3NoYWludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNWQyMTgKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9zaGFpbnRyaW4uaApAQCAtMCwwICsxLDc1IEBACisvKj09PS0tLS0gc2hhaW50cmluLmggLSBTSEEgaW50cmluc2ljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICoKKyAqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqLworCisjaWZuZGVmIF9fSU1NSU5UUklOX0gKKyNlcnJvciAiTmV2ZXIgdXNlIDxzaGFpbnRyaW4uaD4gZGlyZWN0bHk7IGluY2x1ZGUgPGltbWludHJpbi5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9fU0hBSU5UUklOX0gKKyNkZWZpbmUgX19TSEFJTlRSSU5fSAorCisvKiBEZWZpbmUgdGhlIGRlZmF1bHQgYXR0cmlidXRlcyBmb3IgdGhlIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUuICovCisjZGVmaW5lIF9fREVGQVVMVF9GTl9BVFRSUyBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18sIF9fdGFyZ2V0X18oInNoYSIpKSkKKworI2RlZmluZSBfbW1fc2hhMXJuZHM0X2VwdTMyKFYxLCBWMiwgTSkgX19leHRlbnNpb25fXyAoeyBcCisgIF9fYnVpbHRpbl9pYTMyX3NoYTFybmRzNCgoX192NHNpKShfX20xMjhpKShWMSksIChfX3Y0c2kpKF9fbTEyOGkpKFYyKSwgKE0pKTsgfSkKKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zaGExbmV4dGVfZXB1MzIoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfc2hhMW5leHRlKChfX3Y0c2kpX19YLCAoX192NHNpKV9fWSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc2hhMW1zZzFfZXB1MzIoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfc2hhMW1zZzEoKF9fdjRzaSlfX1gsIChfX3Y0c2kpX19ZKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zaGExbXNnMl9lcHUzMihfX20xMjhpIF9fWCwgX19tMTI4aSBfX1kpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9zaGExbXNnMigoX192NHNpKV9fWCwgKF9fdjRzaSlfX1kpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3NoYTI1NnJuZHMyX2VwdTMyKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSwgX19tMTI4aSBfX1opCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9zaGEyNTZybmRzMigoX192NHNpKV9fWCwgKF9fdjRzaSlfX1ksIChfX3Y0c2kpX19aKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zaGEyNTZtc2cxX2VwdTMyKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3NoYTI1Nm1zZzEoKF9fdjRzaSlfX1gsIChfX3Y0c2kpX19ZKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zaGEyNTZtc2cyX2VwdTMyKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3NoYTI1Nm1zZzIoKF9fdjRzaSlfX1gsIChfX3Y0c2kpX19ZKTsKK30KKworI3VuZGVmIF9fREVGQVVMVF9GTl9BVFRSUworCisjZW5kaWYgLyogX19TSEFJTlRSSU5fSCAqLwpkaWZmIC0tZ2l0IGEvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvc21taW50cmluLmggYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9zbW1pbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDhhYjAzCi0tLSAvZGV2L251bGwKKysrIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvc21taW50cmluLmgKQEAgLTAsMCArMSw1MDcgQEAKKy8qPT09LS0tLSBzbW1pbnRyaW4uaCAtIFNTRTQgaW50cmluc2ljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKgorICo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICovCisKKyNpZm5kZWYgX1NNTUlOVFJJTl9ICisjZGVmaW5lIF9TTU1JTlRSSU5fSAorCisjaW5jbHVkZSA8dG1taW50cmluLmg+CisKKy8qIERlZmluZSB0aGUgZGVmYXVsdCBhdHRyaWJ1dGVzIGZvciB0aGUgZnVuY3Rpb25zIGluIHRoaXMgZmlsZS4gKi8KKyNkZWZpbmUgX19ERUZBVUxUX0ZOX0FUVFJTIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXywgX190YXJnZXRfXygic3NlNC4xIikpKQorCisvKiBTU0U0IFJvdW5kaW5nIG1hY3Jvcy4gKi8KKyNkZWZpbmUgX01NX0ZST1VORF9UT19ORUFSRVNUX0lOVCAgICAweDAwCisjZGVmaW5lIF9NTV9GUk9VTkRfVE9fTkVHX0lORiAgICAgICAgMHgwMQorI2RlZmluZSBfTU1fRlJPVU5EX1RPX1BPU19JTkYgICAgICAgIDB4MDIKKyNkZWZpbmUgX01NX0ZST1VORF9UT19aRVJPICAgICAgICAgICAweDAzCisjZGVmaW5lIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTiAgICAgMHgwNAorCisjZGVmaW5lIF9NTV9GUk9VTkRfUkFJU0VfRVhDICAgICAgICAgMHgwMAorI2RlZmluZSBfTU1fRlJPVU5EX05PX0VYQyAgICAgICAgICAgIDB4MDgKKworI2RlZmluZSBfTU1fRlJPVU5EX05JTlQgICAgICAoX01NX0ZST1VORF9SQUlTRV9FWEMgfCBfTU1fRlJPVU5EX1RPX05FQVJFU1RfSU5UKQorI2RlZmluZSBfTU1fRlJPVU5EX0ZMT09SICAgICAoX01NX0ZST1VORF9SQUlTRV9FWEMgfCBfTU1fRlJPVU5EX1RPX05FR19JTkYpCisjZGVmaW5lIF9NTV9GUk9VTkRfQ0VJTCAgICAgIChfTU1fRlJPVU5EX1JBSVNFX0VYQyB8IF9NTV9GUk9VTkRfVE9fUE9TX0lORikKKyNkZWZpbmUgX01NX0ZST1VORF9UUlVOQyAgICAgKF9NTV9GUk9VTkRfUkFJU0VfRVhDIHwgX01NX0ZST1VORF9UT19aRVJPKQorI2RlZmluZSBfTU1fRlJPVU5EX1JJTlQgICAgICAoX01NX0ZST1VORF9SQUlTRV9FWEMgfCBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pCisjZGVmaW5lIF9NTV9GUk9VTkRfTkVBUkJZSU5UIChfTU1fRlJPVU5EX05PX0VYQyB8IF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTikKKworI2RlZmluZSBfbW1fY2VpbF9wcyhYKSAgICAgICBfbW1fcm91bmRfcHMoKFgpLCBfTU1fRlJPVU5EX0NFSUwpCisjZGVmaW5lIF9tbV9jZWlsX3BkKFgpICAgICAgIF9tbV9yb3VuZF9wZCgoWCksIF9NTV9GUk9VTkRfQ0VJTCkKKyNkZWZpbmUgX21tX2NlaWxfc3MoWCwgWSkgICAgX21tX3JvdW5kX3NzKChYKSwgKFkpLCBfTU1fRlJPVU5EX0NFSUwpCisjZGVmaW5lIF9tbV9jZWlsX3NkKFgsIFkpICAgIF9tbV9yb3VuZF9zZCgoWCksIChZKSwgX01NX0ZST1VORF9DRUlMKQorCisjZGVmaW5lIF9tbV9mbG9vcl9wcyhYKSAgICAgIF9tbV9yb3VuZF9wcygoWCksIF9NTV9GUk9VTkRfRkxPT1IpCisjZGVmaW5lIF9tbV9mbG9vcl9wZChYKSAgICAgIF9tbV9yb3VuZF9wZCgoWCksIF9NTV9GUk9VTkRfRkxPT1IpCisjZGVmaW5lIF9tbV9mbG9vcl9zcyhYLCBZKSAgIF9tbV9yb3VuZF9zcygoWCksIChZKSwgX01NX0ZST1VORF9GTE9PUikKKyNkZWZpbmUgX21tX2Zsb29yX3NkKFgsIFkpICAgX21tX3JvdW5kX3NkKChYKSwgKFkpLCBfTU1fRlJPVU5EX0ZMT09SKQorCisjZGVmaW5lIF9tbV9yb3VuZF9wcyhYLCBNKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOClfX2J1aWx0aW5faWEzMl9yb3VuZHBzKChfX3Y0c2YpKF9fbTEyOCkoWCksIChNKSk7IH0pCisKKyNkZWZpbmUgX21tX3JvdW5kX3NzKFgsIFksIE0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX3JvdW5kc3MoKF9fdjRzZikoX19tMTI4KShYKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZikoX19tMTI4KShZKSwgKE0pKTsgfSkKKworI2RlZmluZSBfbW1fcm91bmRfcGQoWCwgTSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX3JvdW5kcGQoKF9fdjJkZikoX19tMTI4ZCkoWCksIChNKSk7IH0pCisKKyNkZWZpbmUgX21tX3JvdW5kX3NkKFgsIFksIE0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9yb3VuZHNkKChfX3YyZGYpKF9fbTEyOGQpKFgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZikoX19tMTI4ZCkoWSksIChNKSk7IH0pCisKKy8qIFNTRTQgUGFja2VkIEJsZW5kaW5nIEludHJpbnNpY3MuICAqLworI2RlZmluZSBfbW1fYmxlbmRfcGQoVjEsIFYyLCBNKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGQpX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjJkZikoX19tMTI4ZCkoVjEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpKF9fbTEyOGQpKFYyKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChNKSAmIDB4MDEpID8gMiA6IDApLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKE0pICYgMHgwMikgPyAzIDogMSkpOyB9KQorCisjZGVmaW5lIF9tbV9ibGVuZF9wcyhWMSwgVjIsIE0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4KV9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3Y0c2YpKF9fbTEyOCkoVjEpLCAoX192NHNmKShfX20xMjgpKFYyKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKE0pICYgMHgwMSkgPyA0IDogMCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChNKSAmIDB4MDIpID8gNSA6IDEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoTSkgJiAweDA0KSA/IDYgOiAyKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKE0pICYgMHgwOCkgPyA3IDogMykpOyB9KQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2JsZW5kdl9wZCAoX19tMTI4ZCBfX1YxLCBfX20xMjhkIF9fVjIsIF9fbTEyOGQgX19NKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX2JsZW5kdnBkICgoX192MmRmKV9fVjEsIChfX3YyZGYpX19WMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZilfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fYmxlbmR2X3BzIChfX20xMjggX19WMSwgX19tMTI4IF9fVjIsIF9fbTEyOCBfX00pCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9ibGVuZHZwcyAoKF9fdjRzZilfX1YxLCAoX192NHNmKV9fVjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZilfX00pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2JsZW5kdl9lcGk4IChfX20xMjhpIF9fVjEsIF9fbTEyOGkgX19WMiwgX19tMTI4aSBfX00pCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcGJsZW5kdmIxMjggKChfX3YxNnFpKV9fVjEsIChfX3YxNnFpKV9fVjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnFpKV9fTSk7Cit9CisKKyNkZWZpbmUgX21tX2JsZW5kX2VwaTE2KFYxLCBWMiwgTSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhpKV9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3Y4aGkpKF9fbTEyOGkpKFYxKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGhpKShfX20xMjhpKShWMiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoTSkgJiAweDAxKSA/ICA4IDogMCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoTSkgJiAweDAyKSA/ICA5IDogMSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoTSkgJiAweDA0KSA/IDEwIDogMiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoTSkgJiAweDA4KSA/IDExIDogMyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoTSkgJiAweDEwKSA/IDEyIDogNCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoTSkgJiAweDIwKSA/IDEzIDogNSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoTSkgJiAweDQwKSA/IDE0IDogNiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoTSkgJiAweDgwKSA/IDE1IDogNykpOyB9KQorCisvKiBTU0U0IER3b3JkIE11bHRpcGx5IEluc3RydWN0aW9ucy4gICovCitzdGF0aWMgX19pbmxpbmVfXyAgX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tdWxsb19lcGkzMiAoX19tMTI4aSBfX1YxLCBfX20xMjhpIF9fVjIpCit7CisgIHJldHVybiAoX19tMTI4aSkgKChfX3Y0c3UpX19WMSAqIChfX3Y0c3UpX19WMik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fICBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX211bF9lcGkzMiAoX19tMTI4aSBfX1YxLCBfX20xMjhpIF9fVjIpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG11bGRxMTI4ICgoX192NHNpKV9fVjEsIChfX3Y0c2kpX19WMik7Cit9CisKKy8qIFNTRTQgRmxvYXRpbmcgUG9pbnQgRG90IFByb2R1Y3QgSW5zdHJ1Y3Rpb25zLiAgKi8KKyNkZWZpbmUgX21tX2RwX3BzKFgsIFksIE0pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9kcHBzKChfX3Y0c2YpKF9fbTEyOCkoWCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKShfX20xMjgpKFkpLCAoTSkpOyB9KQorCisjZGVmaW5lIF9tbV9kcF9wZChYLCBZLCBNKSBfX2V4dGVuc2lvbl9fICh7XAorICAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfZHBwZCgoX192MmRmKShfX20xMjhkKShYKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKShfX20xMjhkKShZKSwgKE0pKTsgfSkKKworLyogU1NFNCBTdHJlYW1pbmcgTG9hZCBIaW50IEluc3RydWN0aW9uLiAgKi8KK3N0YXRpYyBfX2lubGluZV9fICBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3N0cmVhbV9sb2FkX3NpMTI4IChfX20xMjhpIGNvbnN0ICpfX1YpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfbW92bnRkcWEgKChjb25zdCBfX3YyZGkgKikgX19WKTsKK30KKworLyogU1NFNCBQYWNrZWQgSW50ZWdlciBNaW4vTWF4IEluc3RydWN0aW9ucy4gICovCitzdGF0aWMgX19pbmxpbmVfXyAgX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9taW5fZXBpOCAoX19tMTI4aSBfX1YxLCBfX20xMjhpIF9fVjIpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1pbnNiMTI4ICgoX192MTZxaSkgX19WMSwgKF9fdjE2cWkpIF9fVjIpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyAgX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXhfZXBpOCAoX19tMTI4aSBfX1YxLCBfX20xMjhpIF9fVjIpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1heHNiMTI4ICgoX192MTZxaSkgX19WMSwgKF9fdjE2cWkpIF9fVjIpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyAgX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9taW5fZXB1MTYgKF9fbTEyOGkgX19WMSwgX19tMTI4aSBfX1YyKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BtaW51dzEyOCAoKF9fdjhoaSkgX19WMSwgKF9fdjhoaSkgX19WMik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fICBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21heF9lcHUxNiAoX19tMTI4aSBfX1YxLCBfX20xMjhpIF9fVjIpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1heHV3MTI4ICgoX192OGhpKSBfX1YxLCAoX192OGhpKSBfX1YyKTsKK30KKworc3RhdGljIF9faW5saW5lX18gIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWluX2VwaTMyIChfX20xMjhpIF9fVjEsIF9fbTEyOGkgX19WMikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbWluc2QxMjggKChfX3Y0c2kpIF9fVjEsIChfX3Y0c2kpIF9fVjIpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyAgX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXhfZXBpMzIgKF9fbTEyOGkgX19WMSwgX19tMTI4aSBfX1YyKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BtYXhzZDEyOCAoKF9fdjRzaSkgX19WMSwgKF9fdjRzaSkgX19WMik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fICBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21pbl9lcHUzMiAoX19tMTI4aSBfX1YxLCBfX20xMjhpIF9fVjIpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1pbnVkMTI4KChfX3Y0c2kpIF9fVjEsIChfX3Y0c2kpIF9fVjIpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyAgX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYXhfZXB1MzIgKF9fbTEyOGkgX19WMSwgX19tMTI4aSBfX1YyKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BtYXh1ZDEyOCgoX192NHNpKSBfX1YxLCAoX192NHNpKSBfX1YyKTsKK30KKworLyogU1NFNCBJbnNlcnRpb24gYW5kIEV4dHJhY3Rpb24gZnJvbSBYTU0gUmVnaXN0ZXIgSW5zdHJ1Y3Rpb25zLiAgKi8KKyNkZWZpbmUgX21tX2luc2VydF9wcyhYLCBZLCBOKSBfX2J1aWx0aW5faWEzMl9pbnNlcnRwczEyOCgoWCksIChZKSwgKE4pKQorI2RlZmluZSBfbW1fZXh0cmFjdF9wcyhYLCBOKSAoX19leHRlbnNpb25fXyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeyB1bmlvbiB7IGludCBfX2k7IGZsb2F0IF9fZjsgfSBfX3Q7ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3Y0c2YgX19hID0gKF9fdjRzZikoX19tMTI4KShYKTsgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX190Ll9fZiA9IF9fYVsoTikgJiAzXTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdC5fX2k7fSkpCisKKy8qIE1pc2NlbGxhbmVvdXMgaW5zZXJ0IGFuZCBleHRyYWN0IG1hY3Jvcy4gICovCisvKiBFeHRyYWN0IGEgc2luZ2xlLXByZWNpc2lvbiBmbG9hdCBmcm9tIFggYXQgaW5kZXggTiBpbnRvIEQuICAqLworI2RlZmluZSBfTU1fRVhUUkFDVF9GTE9BVChELCBYLCBOKSAoX19leHRlbnNpb25fXyAoeyBfX3Y0c2YgX19hID0gKF9fdjRzZikoWCk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRCkgPSBfX2FbTl07IH0pKQorCisvKiBPciB0b2dldGhlciAyIHNldHMgb2YgaW5kZXhlcyAoWCBhbmQgWSkgd2l0aCB0aGUgemVyb2luZyBiaXRzIChaKSB0byBjcmVhdGUKKyAgIGFuIGluZGV4IHN1aXRhYmxlIGZvciBfbW1faW5zZXJ0X3BzLiAgKi8KKyNkZWZpbmUgX01NX01LX0lOU0VSVFBTX05EWChYLCBZLCBaKSAoKChYKSA8PCA2KSB8ICgoWSkgPDwgNCkgfCAoWikpCisKKy8qIEV4dHJhY3QgYSBmbG9hdCBmcm9tIFggYXQgaW5kZXggTiBpbnRvIHRoZSBmaXJzdCBpbmRleCBvZiB0aGUgcmV0dXJuLiAgKi8KKyNkZWZpbmUgX01NX1BJQ0tfT1VUX1BTKFgsIE4pIF9tbV9pbnNlcnRfcHMgKF9tbV9zZXR6ZXJvX3BzKCksIChYKSwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTU1fTUtfSU5TRVJUUFNfTkRYKChOKSwgMCwgMHgwZSkpCisKKy8qIEluc2VydCBpbnQgaW50byBwYWNrZWQgaW50ZWdlciBhcnJheSBhdCBpbmRleC4gICovCisjZGVmaW5lIF9tbV9pbnNlcnRfZXBpOChYLCBJLCBOKSAoX19leHRlbnNpb25fXyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeyBfX3YxNnFpIF9fYSA9IChfX3YxNnFpKShfX20xMjhpKShYKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYVsoTikgJiAxNV0gPSAoSSk7ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbTEyOGkpX19hO30pKQorI2RlZmluZSBfbW1faW5zZXJ0X2VwaTMyKFgsIEksIE4pIChfX2V4dGVuc2lvbl9fICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHsgX192NHNpIF9fYSA9IChfX3Y0c2kpKF9fbTEyOGkpKFgpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYVsoTikgJiAzXSA9IChJKTsgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tMTI4aSlfX2E7fSkpCisjaWZkZWYgX194ODZfNjRfXworI2RlZmluZSBfbW1faW5zZXJ0X2VwaTY0KFgsIEksIE4pIChfX2V4dGVuc2lvbl9fICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHsgX192MmRpIF9fYSA9IChfX3YyZGkpKF9fbTEyOGkpKFgpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYVsoTikgJiAxXSA9IChJKTsgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19tMTI4aSlfX2E7fSkpCisjZW5kaWYgLyogX194ODZfNjRfXyAqLworCisvKiBFeHRyYWN0IGludCBmcm9tIHBhY2tlZCBpbnRlZ2VyIGFycmF5IGF0IGluZGV4LiAgVGhpcyByZXR1cm5zIHRoZSBlbGVtZW50CisgKiBhcyBhIHplcm8gZXh0ZW5kZWQgdmFsdWUsIHNvIGl0IGlzIHVuc2lnbmVkLgorICovCisjZGVmaW5lIF9tbV9leHRyYWN0X2VwaTgoWCwgTikgKF9fZXh0ZW5zaW9uX18gICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7IF9fdjE2cWkgX19hID0gKF9fdjE2cWkpKF9fbTEyOGkpKFgpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKHVuc2lnbmVkIGNoYXIpIF9fYVsoTikgJiAxNV07fSkpCisjZGVmaW5lIF9tbV9leHRyYWN0X2VwaTMyKFgsIE4pIChfX2V4dGVuc2lvbl9fICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7IF9fdjRzaSBfX2EgPSAoX192NHNpKShfX20xMjhpKShYKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClfX2FbKE4pICYgM107fSkpCisjaWZkZWYgX194ODZfNjRfXworI2RlZmluZSBfbW1fZXh0cmFjdF9lcGk2NChYLCBOKSAoX19leHRlbnNpb25fXyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeyBfX3YyZGkgX19hID0gKF9fdjJkaSkoX19tMTI4aSkoWCk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpX19hWyhOKSAmIDFdO30pKQorI2VuZGlmIC8qIF9feDg2XzY0ICovCisKKy8qIFNTRTQgMTI4LWJpdCBQYWNrZWQgSW50ZWdlciBDb21wYXJpc29ucy4gICovCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fdGVzdHpfc2kxMjgoX19tMTI4aSBfX00sIF9fbTEyOGkgX19WKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcHRlc3R6MTI4KChfX3YyZGkpX19NLCAoX192MmRpKV9fVik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV90ZXN0Y19zaTEyOChfX20xMjhpIF9fTSwgX19tMTI4aSBfX1YpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9wdGVzdGMxMjgoKF9fdjJkaSlfX00sIChfX3YyZGkpX19WKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fREVGQVVMVF9GTl9BVFRSUworX21tX3Rlc3RuemNfc2kxMjgoX19tMTI4aSBfX00sIF9fbTEyOGkgX19WKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcHRlc3RuemMxMjgoKF9fdjJkaSlfX00sIChfX3YyZGkpX19WKTsKK30KKworI2RlZmluZSBfbW1fdGVzdF9hbGxfb25lcyhWKSBfbW1fdGVzdGNfc2kxMjgoKFYpLCBfbW1fY21wZXFfZXBpMzIoKFYpLCAoVikpKQorI2RlZmluZSBfbW1fdGVzdF9taXhfb25lc196ZXJvcyhNLCBWKSBfbW1fdGVzdG56Y19zaTEyOCgoTSksIChWKSkKKyNkZWZpbmUgX21tX3Rlc3RfYWxsX3plcm9zKE0sIFYpIF9tbV90ZXN0el9zaTEyOCAoKE0pLCAoVikpCisKKy8qIFNTRTQgNjQtYml0IFBhY2tlZCBJbnRlZ2VyIENvbXBhcmlzb25zLiAgKi8KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY21wZXFfZXBpNjQoX19tMTI4aSBfX1YxLCBfX20xMjhpIF9fVjIpCit7CisgIHJldHVybiAoX19tMTI4aSkoKF9fdjJkaSlfX1YxID09IChfX3YyZGkpX19WMik7Cit9CisKKy8qIFNTRTQgUGFja2VkIEludGVnZXIgU2lnbi1FeHRlbnNpb24uICAqLworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jdnRlcGk4X2VwaTE2KF9fbTEyOGkgX19WKQoreworICAvKiBUaGlzIGZ1bmN0aW9uIGFsd2F5cyBwZXJmb3JtcyBhIHNpZ25lZCBleHRlbnNpb24sIGJ1dCBfX3YxNnFpIGlzIGEgY2hhcgorICAgICB3aGljaCBtYXkgYmUgc2lnbmVkIG9yIHVuc2lnbmVkLCBzbyB1c2UgX192MTZxcy4gKi8KKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9jb252ZXJ0dmVjdG9yKF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3YxNnFzKV9fViwgKF9fdjE2cXMpX19WLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3KSwgX192OGhpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jdnRlcGk4X2VwaTMyKF9fbTEyOGkgX19WKQoreworICAvKiBUaGlzIGZ1bmN0aW9uIGFsd2F5cyBwZXJmb3JtcyBhIHNpZ25lZCBleHRlbnNpb24sIGJ1dCBfX3YxNnFpIGlzIGEgY2hhcgorICAgICB3aGljaCBtYXkgYmUgc2lnbmVkIG9yIHVuc2lnbmVkLCBzbyB1c2UgX192MTZxcy4gKi8KKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9jb252ZXJ0dmVjdG9yKF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3YxNnFzKV9fViwgKF9fdjE2cXMpX19WLCAwLCAxLCAyLCAzKSwgX192NHNpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jdnRlcGk4X2VwaTY0KF9fbTEyOGkgX19WKQoreworICAvKiBUaGlzIGZ1bmN0aW9uIGFsd2F5cyBwZXJmb3JtcyBhIHNpZ25lZCBleHRlbnNpb24sIGJ1dCBfX3YxNnFpIGlzIGEgY2hhcgorICAgICB3aGljaCBtYXkgYmUgc2lnbmVkIG9yIHVuc2lnbmVkLCBzbyB1c2UgX192MTZxcy4gKi8KKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9jb252ZXJ0dmVjdG9yKF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3YxNnFzKV9fViwgKF9fdjE2cXMpX19WLCAwLCAxKSwgX192MmRpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jdnRlcGkxNl9lcGkzMihfX20xMjhpIF9fVikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9jb252ZXJ0dmVjdG9yKF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3Y4aGkpX19WLCAoX192OGhpKV9fViwgMCwgMSwgMiwgMyksIF9fdjRzaSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY3Z0ZXBpMTZfZXBpNjQoX19tMTI4aSBfX1YpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5fY29udmVydHZlY3RvcihfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcigoX192OGhpKV9fViwgKF9fdjhoaSlfX1YsIDAsIDEpLCBfX3YyZGkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2N2dGVwaTMyX2VwaTY0KF9fbTEyOGkgX19WKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2NvbnZlcnR2ZWN0b3IoX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjRzaSlfX1YsIChfX3Y0c2kpX19WLCAwLCAxKSwgX192MmRpKTsKK30KKworLyogU1NFNCBQYWNrZWQgSW50ZWdlciBaZXJvLUV4dGVuc2lvbi4gICovCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2N2dGVwdThfZXBpMTYoX19tMTI4aSBfX1YpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5fY29udmVydHZlY3RvcihfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcigoX192MTZxdSlfX1YsIChfX3YxNnF1KV9fViwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNyksIF9fdjhoaSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY3Z0ZXB1OF9lcGkzMihfX20xMjhpIF9fVikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9jb252ZXJ0dmVjdG9yKF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3YxNnF1KV9fViwgKF9fdjE2cXUpX19WLCAwLCAxLCAyLCAzKSwgX192NHNpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jdnRlcHU4X2VwaTY0KF9fbTEyOGkgX19WKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2NvbnZlcnR2ZWN0b3IoX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjE2cXUpX19WLCAoX192MTZxdSlfX1YsIDAsIDEpLCBfX3YyZGkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2N2dGVwdTE2X2VwaTMyKF9fbTEyOGkgX19WKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2NvbnZlcnR2ZWN0b3IoX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjhodSlfX1YsIChfX3Y4aHUpX19WLCAwLCAxLCAyLCAzKSwgX192NHNpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jdnRlcHUxNl9lcGk2NChfX20xMjhpIF9fVikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9jb252ZXJ0dmVjdG9yKF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3Y4aHUpX19WLCAoX192OGh1KV9fViwgMCwgMSksIF9fdjJkaSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY3Z0ZXB1MzJfZXBpNjQoX19tMTI4aSBfX1YpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5fY29udmVydHZlY3RvcihfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcigoX192NHN1KV9fViwgKF9fdjRzdSlfX1YsIDAsIDEpLCBfX3YyZGkpOworfQorCisvKiBTU0U0IFBhY2sgd2l0aCBVbnNpZ25lZCBTYXR1cmF0aW9uLiAgKi8KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fcGFja3VzX2VwaTMyKF9fbTEyOGkgX19WMSwgX19tMTI4aSBfX1YyKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BhY2t1c2R3MTI4KChfX3Y0c2kpX19WMSwgKF9fdjRzaSlfX1YyKTsKK30KKworLyogU1NFNCBNdWx0aXBsZSBQYWNrZWQgU3VtcyBvZiBBYnNvbHV0ZSBEaWZmZXJlbmNlLiAgKi8KKyNkZWZpbmUgX21tX21wc2FkYndfZXB1OChYLCBZLCBNKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX21wc2FkYncxMjgoKF9fdjE2cWkpKF9fbTEyOGkpKFgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnFpKShfX20xMjhpKShZKSwgKE0pKTsgfSkKKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9taW5wb3NfZXB1MTYoX19tMTI4aSBfX1YpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcGhtaW5wb3N1dzEyOCgoX192OGhpKV9fVik7Cit9CisKKy8qIEhhbmRsZSB0aGUgc3NlNC4yIGRlZmluaXRpb25zIGhlcmUuICovCisKKy8qIFRoZXNlIGRlZmluaXRpb25zIGFyZSBub3JtYWxseSBpbiBubW1pbnRyaW4uaCwgYnV0IGdjYyBwdXRzIHRoZW0gaW4gaGVyZQorICAgc28gd2UnbGwgZG8gdGhlIHNhbWUuICAqLworCisjdW5kZWYgX19ERUZBVUxUX0ZOX0FUVFJTCisjZGVmaW5lIF9fREVGQVVMVF9GTl9BVFRSUyBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18sIF9fdGFyZ2V0X18oInNzZTQuMiIpKSkKKworLyogVGhlc2Ugc3BlY2lmeSB0aGUgdHlwZSBvZiBkYXRhIHRoYXQgd2UncmUgY29tcGFyaW5nLiAgKi8KKyNkZWZpbmUgX1NJRERfVUJZVEVfT1BTICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIF9TSUREX1VXT1JEX09QUyAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBfU0lERF9TQllURV9PUFMgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgX1NJRERfU1dPUkRfT1BTICAgICAgICAgICAgICAgICAweDAzCisKKy8qIFRoZXNlIHNwZWNpZnkgdGhlIHR5cGUgb2YgY29tcGFyaXNvbiBvcGVyYXRpb24uICAqLworI2RlZmluZSBfU0lERF9DTVBfRVFVQUxfQU5ZICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgX1NJRERfQ01QX1JBTkdFUyAgICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIF9TSUREX0NNUF9FUVVBTF9FQUNIICAgICAgICAgICAgMHgwOAorI2RlZmluZSBfU0lERF9DTVBfRVFVQUxfT1JERVJFRCAgICAgICAgIDB4MGMKKworLyogVGhlc2UgbWFjcm9zIHNwZWNpZnkgdGhlIHBvbGFyaXR5IG9mIHRoZSBvcGVyYXRpb24uICAqLworI2RlZmluZSBfU0lERF9QT1NJVElWRV9QT0xBUklUWSAgICAgICAgIDB4MDAKKyNkZWZpbmUgX1NJRERfTkVHQVRJVkVfUE9MQVJJVFkgICAgICAgICAweDEwCisjZGVmaW5lIF9TSUREX01BU0tFRF9QT1NJVElWRV9QT0xBUklUWSAgMHgyMAorI2RlZmluZSBfU0lERF9NQVNLRURfTkVHQVRJVkVfUE9MQVJJVFkgIDB4MzAKKworLyogVGhlc2UgbWFjcm9zIGFyZSB1c2VkIGluIF9tbV9jbXBYc3RyaSgpIHRvIHNwZWNpZnkgdGhlIHJldHVybi4gICovCisjZGVmaW5lIF9TSUREX0xFQVNUX1NJR05JRklDQU5UICAgICAgICAgMHgwMAorI2RlZmluZSBfU0lERF9NT1NUX1NJR05JRklDQU5UICAgICAgICAgIDB4NDAKKworLyogVGhlc2UgbWFjcm9zIGFyZSB1c2VkIGluIF9tbV9jbXBYc3RyaSgpIHRvIHNwZWNpZnkgdGhlIHJldHVybi4gICovCisjZGVmaW5lIF9TSUREX0JJVF9NQVNLICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBfU0lERF9VTklUX01BU0sgICAgICAgICAgICAgICAgIDB4NDAKKworLyogU1NFNC4yIFBhY2tlZCBDb21wYXJpc29uIEludHJpbnNpY3MuICAqLworI2RlZmluZSBfbW1fY21waXN0cm0oQSwgQiwgTSkgXAorICAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wY21waXN0cm0xMjgoKF9fdjE2cWkpKF9fbTEyOGkpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MTZxaSkoX19tMTI4aSkoQiksIChpbnQpKE0pKQorI2RlZmluZSBfbW1fY21waXN0cmkoQSwgQiwgTSkgXAorICAoaW50KV9fYnVpbHRpbl9pYTMyX3BjbXBpc3RyaTEyOCgoX192MTZxaSkoX19tMTI4aSkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2cWkpKF9fbTEyOGkpKEIpLCAoaW50KShNKSkKKworI2RlZmluZSBfbW1fY21wZXN0cm0oQSwgTEEsIEIsIExCLCBNKSBcCisgIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BjbXBlc3RybTEyOCgoX192MTZxaSkoX19tMTI4aSkoQSksIChpbnQpKExBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2cWkpKF9fbTEyOGkpKEIpLCAoaW50KShMQiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKE0pKQorI2RlZmluZSBfbW1fY21wZXN0cmkoQSwgTEEsIEIsIExCLCBNKSBcCisgIChpbnQpX19idWlsdGluX2lhMzJfcGNtcGVzdHJpMTI4KChfX3YxNnFpKShfX20xMjhpKShBKSwgKGludCkoTEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnFpKShfX20xMjhpKShCKSwgKGludCkoTEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKE0pKQorCisvKiBTU0U0LjIgUGFja2VkIENvbXBhcmlzb24gSW50cmluc2ljcyBhbmQgRUZsYWcgUmVhZGluZy4gICovCisjZGVmaW5lIF9tbV9jbXBpc3RyYShBLCBCLCBNKSBcCisgIChpbnQpX19idWlsdGluX2lhMzJfcGNtcGlzdHJpYTEyOCgoX192MTZxaSkoX19tMTI4aSkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnFpKShfX20xMjhpKShCKSwgKGludCkoTSkpCisjZGVmaW5lIF9tbV9jbXBpc3RyYyhBLCBCLCBNKSBcCisgIChpbnQpX19idWlsdGluX2lhMzJfcGNtcGlzdHJpYzEyOCgoX192MTZxaSkoX19tMTI4aSkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnFpKShfX20xMjhpKShCKSwgKGludCkoTSkpCisjZGVmaW5lIF9tbV9jbXBpc3RybyhBLCBCLCBNKSBcCisgIChpbnQpX19idWlsdGluX2lhMzJfcGNtcGlzdHJpbzEyOCgoX192MTZxaSkoX19tMTI4aSkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnFpKShfX20xMjhpKShCKSwgKGludCkoTSkpCisjZGVmaW5lIF9tbV9jbXBpc3RycyhBLCBCLCBNKSBcCisgIChpbnQpX19idWlsdGluX2lhMzJfcGNtcGlzdHJpczEyOCgoX192MTZxaSkoX19tMTI4aSkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnFpKShfX20xMjhpKShCKSwgKGludCkoTSkpCisjZGVmaW5lIF9tbV9jbXBpc3RyeihBLCBCLCBNKSBcCisgIChpbnQpX19idWlsdGluX2lhMzJfcGNtcGlzdHJpejEyOCgoX192MTZxaSkoX19tMTI4aSkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnFpKShfX20xMjhpKShCKSwgKGludCkoTSkpCisKKyNkZWZpbmUgX21tX2NtcGVzdHJhKEEsIExBLCBCLCBMQiwgTSkgXAorICAoaW50KV9fYnVpbHRpbl9pYTMyX3BjbXBlc3RyaWExMjgoKF9fdjE2cWkpKF9fbTEyOGkpKEEpLCAoaW50KShMQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnFpKShfX20xMjhpKShCKSwgKGludCkoTEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShNKSkKKyNkZWZpbmUgX21tX2NtcGVzdHJjKEEsIExBLCBCLCBMQiwgTSkgXAorICAoaW50KV9fYnVpbHRpbl9pYTMyX3BjbXBlc3RyaWMxMjgoKF9fdjE2cWkpKF9fbTEyOGkpKEEpLCAoaW50KShMQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnFpKShfX20xMjhpKShCKSwgKGludCkoTEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShNKSkKKyNkZWZpbmUgX21tX2NtcGVzdHJvKEEsIExBLCBCLCBMQiwgTSkgXAorICAoaW50KV9fYnVpbHRpbl9pYTMyX3BjbXBlc3RyaW8xMjgoKF9fdjE2cWkpKF9fbTEyOGkpKEEpLCAoaW50KShMQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnFpKShfX20xMjhpKShCKSwgKGludCkoTEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShNKSkKKyNkZWZpbmUgX21tX2NtcGVzdHJzKEEsIExBLCBCLCBMQiwgTSkgXAorICAoaW50KV9fYnVpbHRpbl9pYTMyX3BjbXBlc3RyaXMxMjgoKF9fdjE2cWkpKF9fbTEyOGkpKEEpLCAoaW50KShMQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnFpKShfX20xMjhpKShCKSwgKGludCkoTEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShNKSkKKyNkZWZpbmUgX21tX2NtcGVzdHJ6KEEsIExBLCBCLCBMQiwgTSkgXAorICAoaW50KV9fYnVpbHRpbl9pYTMyX3BjbXBlc3RyaXoxMjgoKF9fdjE2cWkpKF9fbTEyOGkpKEEpLCAoaW50KShMQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YxNnFpKShfX20xMjhpKShCKSwgKGludCkoTEIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShNKSkKKworLyogU1NFNC4yIENvbXBhcmUgUGFja2VkIERhdGEgLS0gR3JlYXRlciBUaGFuLiAgKi8KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY21wZ3RfZXBpNjQoX19tMTI4aSBfX1YxLCBfX20xMjhpIF9fVjIpCit7CisgIHJldHVybiAoX19tMTI4aSkoKF9fdjJkaSlfX1YxID4gKF9fdjJkaSlfX1YyKTsKK30KKworLyogU1NFNC4yIEFjY3VtdWxhdGUgQ1JDMzIuICAqLworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NyYzMyX3U4KHVuc2lnbmVkIGludCBfX0MsIHVuc2lnbmVkIGNoYXIgX19EKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfY3JjMzJxaShfX0MsIF9fRCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jcmMzMl91MTYodW5zaWduZWQgaW50IF9fQywgdW5zaWduZWQgc2hvcnQgX19EKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfY3JjMzJoaShfX0MsIF9fRCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jcmMzMl91MzIodW5zaWduZWQgaW50IF9fQywgdW5zaWduZWQgaW50IF9fRCkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2NyYzMyc2koX19DLCBfX0QpOworfQorCisjaWZkZWYgX194ODZfNjRfXworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZyBsb25nIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NyYzMyX3U2NCh1bnNpZ25lZCBsb25nIGxvbmcgX19DLCB1bnNpZ25lZCBsb25nIGxvbmcgX19EKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfY3JjMzJkaShfX0MsIF9fRCk7Cit9CisjZW5kaWYgLyogX194ODZfNjRfXyAqLworCisjdW5kZWYgX19ERUZBVUxUX0ZOX0FUVFJTCisKKyNpZmRlZiBfX1BPUENOVF9fCisjaW5jbHVkZSA8cG9wY250aW50cmluLmg+CisjZW5kaWYKKworI2VuZGlmIC8qIF9TTU1JTlRSSU5fSCAqLwpkaWZmIC0tZ2l0IGEvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvc3RkYWxpZ24uaCBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL3N0ZGFsaWduLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzczOGQxMgotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL3N0ZGFsaWduLmgKQEAgLTAsMCArMSwzNSBAQAorLyo9PT0tLS0tIHN0ZGFsaWduLmggLSBTdGFuZGFyZCBoZWFkZXIgZm9yIGFsaWdubWVudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKgorICo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICovCisKKyNpZm5kZWYgX19TVERBTElHTl9ICisjZGVmaW5lIF9fU1REQUxJR05fSAorCisjaWZuZGVmIF9fY3BsdXNwbHVzCisjZGVmaW5lIGFsaWduYXMgX0FsaWduYXMKKyNkZWZpbmUgYWxpZ25vZiBfQWxpZ25vZgorI2VuZGlmCisKKyNkZWZpbmUgX19hbGlnbmFzX2lzX2RlZmluZWQgMQorI2RlZmluZSBfX2FsaWdub2ZfaXNfZGVmaW5lZCAxCisKKyNlbmRpZiAvKiBfX1NUREFMSUdOX0ggKi8KZGlmZiAtLWdpdCBhL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL3N0ZGFyZy5oIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvc3RkYXJnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU3ZTE4MwotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL3N0ZGFyZy5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qPT09LS0tLSBzdGRhcmcuaCAtIFZhcmlhYmxlIGFyZ3VtZW50IGhhbmRsaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggRWxpIEZyaWVkbWFuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICoKKyAqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqLworCisjaWZuZGVmIF9fU1REQVJHX0gKKyNkZWZpbmUgX19TVERBUkdfSAorCisjaWZuZGVmIF9WQV9MSVNUCit0eXBlZGVmIF9fYnVpbHRpbl92YV9saXN0IHZhX2xpc3Q7CisjZGVmaW5lIF9WQV9MSVNUCisjZW5kaWYKKyNkZWZpbmUgdmFfc3RhcnQoYXAsIHBhcmFtKSBfX2J1aWx0aW5fdmFfc3RhcnQoYXAsIHBhcmFtKQorI2RlZmluZSB2YV9lbmQoYXApICAgICAgICAgIF9fYnVpbHRpbl92YV9lbmQoYXApCisjZGVmaW5lIHZhX2FyZyhhcCwgdHlwZSkgICAgX19idWlsdGluX3ZhX2FyZyhhcCwgdHlwZSkKKworLyogR0NDIGFsd2F5cyBkZWZpbmVzIF9fdmFfY29weSwgYnV0IGRvZXMgbm90IGRlZmluZSB2YV9jb3B5IHVubGVzcyBpbiBjOTkgbW9kZQorICogb3IgLWFuc2kgaXMgbm90IHNwZWNpZmllZCwgc2luY2UgaXQgd2FzIG5vdCBwYXJ0IG9mIEM5MC4KKyAqLworI2RlZmluZSBfX3ZhX2NvcHkoZCxzKSBfX2J1aWx0aW5fdmFfY29weShkLHMpCisKKyNpZiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwgfHwgX19jcGx1c3BsdXMgPj0gMjAxMTAzTCB8fCAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pCisjZGVmaW5lIHZhX2NvcHkoZGVzdCwgc3JjKSAgX19idWlsdGluX3ZhX2NvcHkoZGVzdCwgc3JjKQorI2VuZGlmCisKKy8qIEhhY2sgcmVxdWlyZWQgdG8gbWFrZSBzdGFuZGFyZCBoZWFkZXJzIHdvcmssIGF0IGxlYXN0IG9uIFVidW50dSAqLworI2lmbmRlZiBfX0dOVUNfVkFfTElTVAorI2RlZmluZSBfX0dOVUNfVkFfTElTVCAxCisjZW5kaWYKK3R5cGVkZWYgX19idWlsdGluX3ZhX2xpc3QgX19nbnVjX3ZhX2xpc3Q7CisKKyNlbmRpZiAvKiBfX1NUREFSR19IICovCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9zdGRhdG9taWMuaCBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL3N0ZGF0b21pYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMzc5ODcKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9zdGRhdG9taWMuaApAQCAtMCwwICsxLDE5MCBAQAorLyo9PT0tLS0tIHN0ZGF0b21pYy5oIC0gU3RhbmRhcmQgaGVhZGVyIGZvciBhdG9taWMgdHlwZXMgYW5kIG9wZXJhdGlvbnMgLS0tLS09PT0KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKgorICo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICovCisKKyNpZm5kZWYgX19DTEFOR19TVERBVE9NSUNfSAorI2RlZmluZSBfX0NMQU5HX1NUREFUT01JQ19ICisKKy8qIElmIHdlJ3JlIGhvc3RlZCwgZmFsbCBiYWNrIHRvIHRoZSBzeXN0ZW0ncyBzdGRhdG9taWMuaC4gRnJlZUJTRCwgZm9yCisgKiBleGFtcGxlLCBhbHJlYWR5IGhhcyBhIENsYW5nLWNvbXBhdGlibGUgc3RkYXRvbWljLmggaGVhZGVyLgorICovCisjaWYgX19TVERDX0hPU1RFRF9fICYmIF9faGFzX2luY2x1ZGVfbmV4dCg8c3RkYXRvbWljLmg+KQorIyBpbmNsdWRlX25leHQgPHN0ZGF0b21pYy5oPgorI2Vsc2UKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIDcuMTcuMSBJbnRyb2R1Y3Rpb24gKi8KKworI2RlZmluZSBBVE9NSUNfQk9PTF9MT0NLX0ZSRUUgICAgICAgX19HQ0NfQVRPTUlDX0JPT0xfTE9DS19GUkVFCisjZGVmaW5lIEFUT01JQ19DSEFSX0xPQ0tfRlJFRSAgICAgICBfX0dDQ19BVE9NSUNfQ0hBUl9MT0NLX0ZSRUUKKyNkZWZpbmUgQVRPTUlDX0NIQVIxNl9UX0xPQ0tfRlJFRSAgIF9fR0NDX0FUT01JQ19DSEFSMTZfVF9MT0NLX0ZSRUUKKyNkZWZpbmUgQVRPTUlDX0NIQVIzMl9UX0xPQ0tfRlJFRSAgIF9fR0NDX0FUT01JQ19DSEFSMzJfVF9MT0NLX0ZSRUUKKyNkZWZpbmUgQVRPTUlDX1dDSEFSX1RfTE9DS19GUkVFICAgIF9fR0NDX0FUT01JQ19XQ0hBUl9UX0xPQ0tfRlJFRQorI2RlZmluZSBBVE9NSUNfU0hPUlRfVF9MT0NLX0ZSRUUgICAgX19HQ0NfQVRPTUlDX1NIT1JUX1RfTE9DS19GUkVFCisjZGVmaW5lIEFUT01JQ19JTlRfVF9MT0NLX0ZSRUUgICAgICBfX0dDQ19BVE9NSUNfSU5UX1RfTE9DS19GUkVFCisjZGVmaW5lIEFUT01JQ19MT05HX1RfTE9DS19GUkVFICAgICBfX0dDQ19BVE9NSUNfTE9OR19UX0xPQ0tfRlJFRQorI2RlZmluZSBBVE9NSUNfTExPTkdfVF9MT0NLX0ZSRUUgICAgX19HQ0NfQVRPTUlDX0xMT05HX1RfTE9DS19GUkVFCisjZGVmaW5lIEFUT01JQ19QT0lOVEVSX1RfTE9DS19GUkVFICBfX0dDQ19BVE9NSUNfUE9JTlRFUl9UX0xPQ0tfRlJFRQorCisvKiA3LjE3LjIgSW5pdGlhbGl6YXRpb24gKi8KKworI2RlZmluZSBBVE9NSUNfVkFSX0lOSVQodmFsdWUpICh2YWx1ZSkKKyNkZWZpbmUgYXRvbWljX2luaXQgX19jMTFfYXRvbWljX2luaXQKKworLyogNy4xNy4zIE9yZGVyIGFuZCBjb25zaXN0ZW5jeSAqLworCit0eXBlZGVmIGVudW0gbWVtb3J5X29yZGVyIHsKKyAgbWVtb3J5X29yZGVyX3JlbGF4ZWQgPSBfX0FUT01JQ19SRUxBWEVELAorICBtZW1vcnlfb3JkZXJfY29uc3VtZSA9IF9fQVRPTUlDX0NPTlNVTUUsCisgIG1lbW9yeV9vcmRlcl9hY3F1aXJlID0gX19BVE9NSUNfQUNRVUlSRSwKKyAgbWVtb3J5X29yZGVyX3JlbGVhc2UgPSBfX0FUT01JQ19SRUxFQVNFLAorICBtZW1vcnlfb3JkZXJfYWNxX3JlbCA9IF9fQVRPTUlDX0FDUV9SRUwsCisgIG1lbW9yeV9vcmRlcl9zZXFfY3N0ID0gX19BVE9NSUNfU0VRX0NTVAorfSBtZW1vcnlfb3JkZXI7CisKKyNkZWZpbmUga2lsbF9kZXBlbmRlbmN5KHkpICh5KQorCisvKiA3LjE3LjQgRmVuY2VzICovCisKKy8qIFRoZXNlIHNob3VsZCBiZSBwcm92aWRlZCBieSB0aGUgbGliYyBpbXBsZW1lbnRhdGlvbi4gKi8KK3ZvaWQgYXRvbWljX3RocmVhZF9mZW5jZShtZW1vcnlfb3JkZXIpOwordm9pZCBhdG9taWNfc2lnbmFsX2ZlbmNlKG1lbW9yeV9vcmRlcik7CisKKyNkZWZpbmUgYXRvbWljX3RocmVhZF9mZW5jZShvcmRlcikgX19jMTFfYXRvbWljX3RocmVhZF9mZW5jZShvcmRlcikKKyNkZWZpbmUgYXRvbWljX3NpZ25hbF9mZW5jZShvcmRlcikgX19jMTFfYXRvbWljX3NpZ25hbF9mZW5jZShvcmRlcikKKworLyogNy4xNy41IExvY2stZnJlZSBwcm9wZXJ0eSAqLworCisjZGVmaW5lIGF0b21pY19pc19sb2NrX2ZyZWUob2JqKSBfX2MxMV9hdG9taWNfaXNfbG9ja19mcmVlKHNpemVvZigqKG9iaikpKQorCisvKiA3LjE3LjYgQXRvbWljIGludGVnZXIgdHlwZXMgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit0eXBlZGVmIF9BdG9taWMoYm9vbCkgICAgICAgICAgICAgICBhdG9taWNfYm9vbDsKKyNlbHNlCit0eXBlZGVmIF9BdG9taWMoX0Jvb2wpICAgICAgICAgICAgICBhdG9taWNfYm9vbDsKKyNlbmRpZgordHlwZWRlZiBfQXRvbWljKGNoYXIpICAgICAgICAgICAgICAgYXRvbWljX2NoYXI7Cit0eXBlZGVmIF9BdG9taWMoc2lnbmVkIGNoYXIpICAgICAgICBhdG9taWNfc2NoYXI7Cit0eXBlZGVmIF9BdG9taWModW5zaWduZWQgY2hhcikgICAgICBhdG9taWNfdWNoYXI7Cit0eXBlZGVmIF9BdG9taWMoc2hvcnQpICAgICAgICAgICAgICBhdG9taWNfc2hvcnQ7Cit0eXBlZGVmIF9BdG9taWModW5zaWduZWQgc2hvcnQpICAgICBhdG9taWNfdXNob3J0OwordHlwZWRlZiBfQXRvbWljKGludCkgICAgICAgICAgICAgICAgYXRvbWljX2ludDsKK3R5cGVkZWYgX0F0b21pYyh1bnNpZ25lZCBpbnQpICAgICAgIGF0b21pY191aW50OwordHlwZWRlZiBfQXRvbWljKGxvbmcpICAgICAgICAgICAgICAgYXRvbWljX2xvbmc7Cit0eXBlZGVmIF9BdG9taWModW5zaWduZWQgbG9uZykgICAgICBhdG9taWNfdWxvbmc7Cit0eXBlZGVmIF9BdG9taWMobG9uZyBsb25nKSAgICAgICAgICBhdG9taWNfbGxvbmc7Cit0eXBlZGVmIF9BdG9taWModW5zaWduZWQgbG9uZyBsb25nKSBhdG9taWNfdWxsb25nOwordHlwZWRlZiBfQXRvbWljKHVpbnRfbGVhc3QxNl90KSAgICAgYXRvbWljX2NoYXIxNl90OwordHlwZWRlZiBfQXRvbWljKHVpbnRfbGVhc3QzMl90KSAgICAgYXRvbWljX2NoYXIzMl90OwordHlwZWRlZiBfQXRvbWljKHdjaGFyX3QpICAgICAgICAgICAgYXRvbWljX3djaGFyX3Q7Cit0eXBlZGVmIF9BdG9taWMoaW50X2xlYXN0OF90KSAgICAgICBhdG9taWNfaW50X2xlYXN0OF90OwordHlwZWRlZiBfQXRvbWljKHVpbnRfbGVhc3Q4X3QpICAgICAgYXRvbWljX3VpbnRfbGVhc3Q4X3Q7Cit0eXBlZGVmIF9BdG9taWMoaW50X2xlYXN0MTZfdCkgICAgICBhdG9taWNfaW50X2xlYXN0MTZfdDsKK3R5cGVkZWYgX0F0b21pYyh1aW50X2xlYXN0MTZfdCkgICAgIGF0b21pY191aW50X2xlYXN0MTZfdDsKK3R5cGVkZWYgX0F0b21pYyhpbnRfbGVhc3QzMl90KSAgICAgIGF0b21pY19pbnRfbGVhc3QzMl90OwordHlwZWRlZiBfQXRvbWljKHVpbnRfbGVhc3QzMl90KSAgICAgYXRvbWljX3VpbnRfbGVhc3QzMl90OwordHlwZWRlZiBfQXRvbWljKGludF9sZWFzdDY0X3QpICAgICAgYXRvbWljX2ludF9sZWFzdDY0X3Q7Cit0eXBlZGVmIF9BdG9taWModWludF9sZWFzdDY0X3QpICAgICBhdG9taWNfdWludF9sZWFzdDY0X3Q7Cit0eXBlZGVmIF9BdG9taWMoaW50X2Zhc3Q4X3QpICAgICAgICBhdG9taWNfaW50X2Zhc3Q4X3Q7Cit0eXBlZGVmIF9BdG9taWModWludF9mYXN0OF90KSAgICAgICBhdG9taWNfdWludF9mYXN0OF90OwordHlwZWRlZiBfQXRvbWljKGludF9mYXN0MTZfdCkgICAgICAgYXRvbWljX2ludF9mYXN0MTZfdDsKK3R5cGVkZWYgX0F0b21pYyh1aW50X2Zhc3QxNl90KSAgICAgIGF0b21pY191aW50X2Zhc3QxNl90OwordHlwZWRlZiBfQXRvbWljKGludF9mYXN0MzJfdCkgICAgICAgYXRvbWljX2ludF9mYXN0MzJfdDsKK3R5cGVkZWYgX0F0b21pYyh1aW50X2Zhc3QzMl90KSAgICAgIGF0b21pY191aW50X2Zhc3QzMl90OwordHlwZWRlZiBfQXRvbWljKGludF9mYXN0NjRfdCkgICAgICAgYXRvbWljX2ludF9mYXN0NjRfdDsKK3R5cGVkZWYgX0F0b21pYyh1aW50X2Zhc3Q2NF90KSAgICAgIGF0b21pY191aW50X2Zhc3Q2NF90OwordHlwZWRlZiBfQXRvbWljKGludHB0cl90KSAgICAgICAgICAgYXRvbWljX2ludHB0cl90OwordHlwZWRlZiBfQXRvbWljKHVpbnRwdHJfdCkgICAgICAgICAgYXRvbWljX3VpbnRwdHJfdDsKK3R5cGVkZWYgX0F0b21pYyhzaXplX3QpICAgICAgICAgICAgIGF0b21pY19zaXplX3Q7Cit0eXBlZGVmIF9BdG9taWMocHRyZGlmZl90KSAgICAgICAgICBhdG9taWNfcHRyZGlmZl90OwordHlwZWRlZiBfQXRvbWljKGludG1heF90KSAgICAgICAgICAgYXRvbWljX2ludG1heF90OwordHlwZWRlZiBfQXRvbWljKHVpbnRtYXhfdCkgICAgICAgICAgYXRvbWljX3VpbnRtYXhfdDsKKworLyogNy4xNy43IE9wZXJhdGlvbnMgb24gYXRvbWljIHR5cGVzICovCisKKyNkZWZpbmUgYXRvbWljX3N0b3JlKG9iamVjdCwgZGVzaXJlZCkgX19jMTFfYXRvbWljX3N0b3JlKG9iamVjdCwgZGVzaXJlZCwgX19BVE9NSUNfU0VRX0NTVCkKKyNkZWZpbmUgYXRvbWljX3N0b3JlX2V4cGxpY2l0IF9fYzExX2F0b21pY19zdG9yZQorCisjZGVmaW5lIGF0b21pY19sb2FkKG9iamVjdCkgX19jMTFfYXRvbWljX2xvYWQob2JqZWN0LCBfX0FUT01JQ19TRVFfQ1NUKQorI2RlZmluZSBhdG9taWNfbG9hZF9leHBsaWNpdCBfX2MxMV9hdG9taWNfbG9hZAorCisjZGVmaW5lIGF0b21pY19leGNoYW5nZShvYmplY3QsIGRlc2lyZWQpIF9fYzExX2F0b21pY19leGNoYW5nZShvYmplY3QsIGRlc2lyZWQsIF9fQVRPTUlDX1NFUV9DU1QpCisjZGVmaW5lIGF0b21pY19leGNoYW5nZV9leHBsaWNpdCBfX2MxMV9hdG9taWNfZXhjaGFuZ2UKKworI2RlZmluZSBhdG9taWNfY29tcGFyZV9leGNoYW5nZV9zdHJvbmcob2JqZWN0LCBleHBlY3RlZCwgZGVzaXJlZCkgX19jMTFfYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKG9iamVjdCwgZXhwZWN0ZWQsIGRlc2lyZWQsIF9fQVRPTUlDX1NFUV9DU1QsIF9fQVRPTUlDX1NFUV9DU1QpCisjZGVmaW5lIGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZ19leHBsaWNpdCBfX2MxMV9hdG9taWNfY29tcGFyZV9leGNoYW5nZV9zdHJvbmcKKworI2RlZmluZSBhdG9taWNfY29tcGFyZV9leGNoYW5nZV93ZWFrKG9iamVjdCwgZXhwZWN0ZWQsIGRlc2lyZWQpIF9fYzExX2F0b21pY19jb21wYXJlX2V4Y2hhbmdlX3dlYWsob2JqZWN0LCBleHBlY3RlZCwgZGVzaXJlZCwgX19BVE9NSUNfU0VRX0NTVCwgX19BVE9NSUNfU0VRX0NTVCkKKyNkZWZpbmUgYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfd2Vha19leHBsaWNpdCBfX2MxMV9hdG9taWNfY29tcGFyZV9leGNoYW5nZV93ZWFrCisKKyNkZWZpbmUgYXRvbWljX2ZldGNoX2FkZChvYmplY3QsIG9wZXJhbmQpIF9fYzExX2F0b21pY19mZXRjaF9hZGQob2JqZWN0LCBvcGVyYW5kLCBfX0FUT01JQ19TRVFfQ1NUKQorI2RlZmluZSBhdG9taWNfZmV0Y2hfYWRkX2V4cGxpY2l0IF9fYzExX2F0b21pY19mZXRjaF9hZGQKKworI2RlZmluZSBhdG9taWNfZmV0Y2hfc3ViKG9iamVjdCwgb3BlcmFuZCkgX19jMTFfYXRvbWljX2ZldGNoX3N1YihvYmplY3QsIG9wZXJhbmQsIF9fQVRPTUlDX1NFUV9DU1QpCisjZGVmaW5lIGF0b21pY19mZXRjaF9zdWJfZXhwbGljaXQgX19jMTFfYXRvbWljX2ZldGNoX3N1YgorCisjZGVmaW5lIGF0b21pY19mZXRjaF9vcihvYmplY3QsIG9wZXJhbmQpIF9fYzExX2F0b21pY19mZXRjaF9vcihvYmplY3QsIG9wZXJhbmQsIF9fQVRPTUlDX1NFUV9DU1QpCisjZGVmaW5lIGF0b21pY19mZXRjaF9vcl9leHBsaWNpdCBfX2MxMV9hdG9taWNfZmV0Y2hfb3IKKworI2RlZmluZSBhdG9taWNfZmV0Y2hfeG9yKG9iamVjdCwgb3BlcmFuZCkgX19jMTFfYXRvbWljX2ZldGNoX3hvcihvYmplY3QsIG9wZXJhbmQsIF9fQVRPTUlDX1NFUV9DU1QpCisjZGVmaW5lIGF0b21pY19mZXRjaF94b3JfZXhwbGljaXQgX19jMTFfYXRvbWljX2ZldGNoX3hvcgorCisjZGVmaW5lIGF0b21pY19mZXRjaF9hbmQob2JqZWN0LCBvcGVyYW5kKSBfX2MxMV9hdG9taWNfZmV0Y2hfYW5kKG9iamVjdCwgb3BlcmFuZCwgX19BVE9NSUNfU0VRX0NTVCkKKyNkZWZpbmUgYXRvbWljX2ZldGNoX2FuZF9leHBsaWNpdCBfX2MxMV9hdG9taWNfZmV0Y2hfYW5kCisKKy8qIDcuMTcuOCBBdG9taWMgZmxhZyB0eXBlIGFuZCBvcGVyYXRpb25zICovCisKK3R5cGVkZWYgc3RydWN0IGF0b21pY19mbGFnIHsgYXRvbWljX2Jvb2wgX1ZhbHVlOyB9IGF0b21pY19mbGFnOworCisjZGVmaW5lIEFUT01JQ19GTEFHX0lOSVQgeyAwIH0KKworLyogVGhlc2Ugc2hvdWxkIGJlIHByb3ZpZGVkIGJ5IHRoZSBsaWJjIGltcGxlbWVudGF0aW9uLiAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitib29sIGF0b21pY19mbGFnX3Rlc3RfYW5kX3NldCh2b2xhdGlsZSBhdG9taWNfZmxhZyAqKTsKK2Jvb2wgYXRvbWljX2ZsYWdfdGVzdF9hbmRfc2V0X2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY19mbGFnICosIG1lbW9yeV9vcmRlcik7CisjZWxzZQorX0Jvb2wgYXRvbWljX2ZsYWdfdGVzdF9hbmRfc2V0KHZvbGF0aWxlIGF0b21pY19mbGFnICopOworX0Jvb2wgYXRvbWljX2ZsYWdfdGVzdF9hbmRfc2V0X2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY19mbGFnICosIG1lbW9yeV9vcmRlcik7CisjZW5kaWYKK3ZvaWQgYXRvbWljX2ZsYWdfY2xlYXIodm9sYXRpbGUgYXRvbWljX2ZsYWcgKik7Cit2b2lkIGF0b21pY19mbGFnX2NsZWFyX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY19mbGFnICosIG1lbW9yeV9vcmRlcik7CisKKyNkZWZpbmUgYXRvbWljX2ZsYWdfdGVzdF9hbmRfc2V0KG9iamVjdCkgX19jMTFfYXRvbWljX2V4Y2hhbmdlKCYob2JqZWN0KS0+X1ZhbHVlLCAxLCBfX0FUT01JQ19TRVFfQ1NUKQorI2RlZmluZSBhdG9taWNfZmxhZ190ZXN0X2FuZF9zZXRfZXhwbGljaXQob2JqZWN0LCBvcmRlcikgX19jMTFfYXRvbWljX2V4Y2hhbmdlKCYob2JqZWN0KS0+X1ZhbHVlLCAxLCBvcmRlcikKKworI2RlZmluZSBhdG9taWNfZmxhZ19jbGVhcihvYmplY3QpIF9fYzExX2F0b21pY19zdG9yZSgmKG9iamVjdCktPl9WYWx1ZSwgMCwgX19BVE9NSUNfU0VRX0NTVCkKKyNkZWZpbmUgYXRvbWljX2ZsYWdfY2xlYXJfZXhwbGljaXQob2JqZWN0LCBvcmRlcikgX19jMTFfYXRvbWljX3N0b3JlKCYob2JqZWN0KS0+X1ZhbHVlLCAwLCBvcmRlcikKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fU1REQ19IT1NURURfXyAqLworI2VuZGlmIC8qIF9fQ0xBTkdfU1REQVRPTUlDX0ggKi8KKwpkaWZmIC0tZ2l0IGEvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvc3RkYm9vbC5oIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvc3RkYm9vbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0Njc4OTMKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9zdGRib29sLmgKQEAgLTAsMCArMSw0NCBAQAorLyo9PT0tLS0tIHN0ZGJvb2wuaCAtIFN0YW5kYXJkIGhlYWRlciBmb3IgYm9vbGVhbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBFbGkgRnJpZWRtYW4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKgorICo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICovCisKKyNpZm5kZWYgX19TVERCT09MX0gKKyNkZWZpbmUgX19TVERCT09MX0gKKworLyogRG9uJ3QgZGVmaW5lIGJvb2wsIHRydWUsIGFuZCBmYWxzZSBpbiBDKyssIGV4Y2VwdCBhcyBhIEdOVSBleHRlbnNpb24uICovCisjaWZuZGVmIF9fY3BsdXNwbHVzCisjZGVmaW5lIGJvb2wgX0Jvb2wKKyNkZWZpbmUgdHJ1ZSAxCisjZGVmaW5lIGZhbHNlIDAKKyNlbGlmIGRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykKKy8qIERlZmluZSBfQm9vbCwgYm9vbCwgZmFsc2UsIHRydWUgYXMgYSBHTlUgZXh0ZW5zaW9uLiAqLworI2RlZmluZSBfQm9vbCBib29sCisjZGVmaW5lIGJvb2wgIGJvb2wKKyNkZWZpbmUgZmFsc2UgZmFsc2UKKyNkZWZpbmUgdHJ1ZSAgdHJ1ZQorI2VuZGlmCisKKyNkZWZpbmUgX19ib29sX3RydWVfZmFsc2VfYXJlX2RlZmluZWQgMQorCisjZW5kaWYgLyogX19TVERCT09MX0ggKi8KZGlmZiAtLWdpdCBhL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL3N0ZGRlZi5oIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvc3RkZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM1NDk5NgotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL3N0ZGRlZi5oCkBAIC0wLDAgKzEsMTM3IEBACisvKj09PS0tLS0gc3RkZGVmLmggLSBCYXNpYyB0eXBlIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IEVsaSBGcmllZG1hbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqCisgKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisgKi8KKworI2lmICFkZWZpbmVkKF9fU1REREVGX0gpIHx8IGRlZmluZWQoX19uZWVkX3B0cmRpZmZfdCkgfHwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkZWZpbmVkKF9fbmVlZF9zaXplX3QpIHx8IGRlZmluZWQoX19uZWVkX3djaGFyX3QpIHx8ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZGVmaW5lZChfX25lZWRfTlVMTCkgfHwgZGVmaW5lZChfX25lZWRfd2ludF90KQorCisjaWYgIWRlZmluZWQoX19uZWVkX3B0cmRpZmZfdCkgJiYgIWRlZmluZWQoX19uZWVkX3NpemVfdCkgJiYgICAgICAgICAgICAgICAgICAgXAorICAgICFkZWZpbmVkKF9fbmVlZF93Y2hhcl90KSAmJiAhZGVmaW5lZChfX25lZWRfTlVMTCkgJiYgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAhZGVmaW5lZChfX25lZWRfd2ludF90KQorLyogQWx3YXlzIGRlZmluZSBtaXNjZWxsYW5lb3VzIHBpZWNlcyB3aGVuIG1vZHVsZXMgYXJlIGF2YWlsYWJsZS4gKi8KKyNpZiAhX19oYXNfZmVhdHVyZShtb2R1bGVzKQorI2RlZmluZSBfX1NURERFRl9ICisjZW5kaWYKKyNkZWZpbmUgX19uZWVkX3B0cmRpZmZfdAorI2RlZmluZSBfX25lZWRfc2l6ZV90CisjZGVmaW5lIF9fbmVlZF93Y2hhcl90CisjZGVmaW5lIF9fbmVlZF9OVUxMCisjZGVmaW5lIF9fbmVlZF9TVERERUZfSF9taXNjCisvKiBfX25lZWRfd2ludF90IGlzIGludGVudGlvbmFsbHkgbm90IGRlZmluZWQgaGVyZS4gKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX25lZWRfcHRyZGlmZl90KQorI2lmICFkZWZpbmVkKF9QVFJESUZGX1QpIHx8IF9faGFzX2ZlYXR1cmUobW9kdWxlcykKKy8qIEFsd2F5cyBkZWZpbmUgcHRyZGlmZl90IHdoZW4gbW9kdWxlcyBhcmUgYXZhaWxhYmxlLiAqLworI2lmICFfX2hhc19mZWF0dXJlKG1vZHVsZXMpCisjZGVmaW5lIF9QVFJESUZGX1QKKyNlbmRpZgordHlwZWRlZiBfX1BUUkRJRkZfVFlQRV9fIHB0cmRpZmZfdDsKKyNlbmRpZgorI3VuZGVmIF9fbmVlZF9wdHJkaWZmX3QKKyNlbmRpZiAvKiBkZWZpbmVkKF9fbmVlZF9wdHJkaWZmX3QpICovCisKKyNpZiBkZWZpbmVkKF9fbmVlZF9zaXplX3QpCisjaWYgIWRlZmluZWQoX1NJWkVfVCkgfHwgX19oYXNfZmVhdHVyZShtb2R1bGVzKQorLyogQWx3YXlzIGRlZmluZSBzaXplX3Qgd2hlbiBtb2R1bGVzIGFyZSBhdmFpbGFibGUuICovCisjaWYgIV9faGFzX2ZlYXR1cmUobW9kdWxlcykKKyNkZWZpbmUgX1NJWkVfVAorI2VuZGlmCit0eXBlZGVmIF9fU0laRV9UWVBFX18gc2l6ZV90OworI2VuZGlmCisjdW5kZWYgX19uZWVkX3NpemVfdAorI2VuZGlmIC8qZGVmaW5lZChfX25lZWRfc2l6ZV90KSAqLworCisjaWYgZGVmaW5lZChfX25lZWRfU1REREVGX0hfbWlzYykKKy8qIElTTzk4OTk6MjAxMSA3LjIwIChDMTEgQW5uZXggSyk6IERlZmluZSByc2l6ZV90IGlmIF9fU1REQ19XQU5UX0xJQl9FWFQxX18gaXMKKyAqIGVuYWJsZWQuICovCisjaWYgKGRlZmluZWQoX19TVERDX1dBTlRfTElCX0VYVDFfXykgJiYgX19TVERDX1dBTlRfTElCX0VYVDFfXyA+PSAxICYmIFwKKyAgICAgIWRlZmluZWQoX1JTSVpFX1QpKSB8fCBfX2hhc19mZWF0dXJlKG1vZHVsZXMpCisvKiBBbHdheXMgZGVmaW5lIHJzaXplX3Qgd2hlbiBtb2R1bGVzIGFyZSBhdmFpbGFibGUuICovCisjaWYgIV9faGFzX2ZlYXR1cmUobW9kdWxlcykKKyNkZWZpbmUgX1JTSVpFX1QKKyNlbmRpZgordHlwZWRlZiBfX1NJWkVfVFlQRV9fIHJzaXplX3Q7CisjZW5kaWYKKyNlbmRpZiAvKiBkZWZpbmVkKF9fbmVlZF9TVERERUZfSF9taXNjKSAqLworCisjaWYgZGVmaW5lZChfX25lZWRfd2NoYXJfdCkKKyNpZm5kZWYgX19jcGx1c3BsdXMKKy8qIEFsd2F5cyBkZWZpbmUgd2NoYXJfdCB3aGVuIG1vZHVsZXMgYXJlIGF2YWlsYWJsZS4gKi8KKyNpZiAhZGVmaW5lZChfV0NIQVJfVCkgfHwgX19oYXNfZmVhdHVyZShtb2R1bGVzKQorI2lmICFfX2hhc19mZWF0dXJlKG1vZHVsZXMpCisjZGVmaW5lIF9XQ0hBUl9UCisjaWYgZGVmaW5lZChfTVNDX0VYVEVOU0lPTlMpCisjZGVmaW5lIF9XQ0hBUl9UX0RFRklORUQKKyNlbmRpZgorI2VuZGlmCit0eXBlZGVmIF9fV0NIQVJfVFlQRV9fIHdjaGFyX3Q7CisjZW5kaWYKKyNlbmRpZgorI3VuZGVmIF9fbmVlZF93Y2hhcl90CisjZW5kaWYgLyogZGVmaW5lZChfX25lZWRfd2NoYXJfdCkgKi8KKworI2lmIGRlZmluZWQoX19uZWVkX05VTEwpCisjdW5kZWYgTlVMTAorI2lmZGVmIF9fY3BsdXNwbHVzCisjICBpZiAhZGVmaW5lZChfX01JTkdXMzJfXykgJiYgIWRlZmluZWQoX01TQ19WRVIpCisjICAgIGRlZmluZSBOVUxMIF9fbnVsbAorIyAgZWxzZQorIyAgICBkZWZpbmUgTlVMTCAwCisjICBlbmRpZgorI2Vsc2UKKyMgIGRlZmluZSBOVUxMICgodm9pZCopMCkKKyNlbmRpZgorI2lmZGVmIF9fY3BsdXNwbHVzCisjaWYgZGVmaW5lZChfTVNDX0VYVEVOU0lPTlMpICYmIGRlZmluZWQoX05BVElWRV9OVUxMUFRSX1NVUFBPUlRFRCkKK25hbWVzcGFjZSBzdGQgeyB0eXBlZGVmIGRlY2x0eXBlKG51bGxwdHIpIG51bGxwdHJfdDsgfQordXNpbmcgOjpzdGQ6Om51bGxwdHJfdDsKKyNlbmRpZgorI2VuZGlmCisjdW5kZWYgX19uZWVkX05VTEwKKyNlbmRpZiAvKiBkZWZpbmVkKF9fbmVlZF9OVUxMKSAqLworCisjaWYgZGVmaW5lZChfX25lZWRfU1REREVGX0hfbWlzYykKKyNpZiBfX1NURENfVkVSU0lPTl9fID49IDIwMTExMkwgfHwgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorI2luY2x1ZGUgIl9fc3RkZGVmX21heF9hbGlnbl90LmgiCisjZW5kaWYKKyNkZWZpbmUgb2Zmc2V0b2YodCwgZCkgX19idWlsdGluX29mZnNldG9mKHQsIGQpCisjdW5kZWYgX19uZWVkX1NURERFRl9IX21pc2MKKyNlbmRpZiAgLyogZGVmaW5lZChfX25lZWRfU1REREVGX0hfbWlzYykgKi8KKworLyogU29tZSBDIGxpYnJhcmllcyBleHBlY3QgdG8gc2VlIGEgd2ludF90IGhlcmUuIE90aGVycyAobm90YWJseSBNaW5HVykgd2lsbCB1c2UKK19fV0lOVF9UWVBFX18gZGlyZWN0bHk7IGFjY29tbW9kYXRlIGJvdGggYnkgcmVxdWlyaW5nIF9fbmVlZF93aW50X3QgKi8KKyNpZiBkZWZpbmVkKF9fbmVlZF93aW50X3QpCisvKiBBbHdheXMgZGVmaW5lIHdpbnRfdCB3aGVuIG1vZHVsZXMgYXJlIGF2YWlsYWJsZS4gKi8KKyNpZiAhZGVmaW5lZChfV0lOVF9UKSB8fCBfX2hhc19mZWF0dXJlKG1vZHVsZXMpCisjaWYgIV9faGFzX2ZlYXR1cmUobW9kdWxlcykKKyNkZWZpbmUgX1dJTlRfVAorI2VuZGlmCit0eXBlZGVmIF9fV0lOVF9UWVBFX18gd2ludF90OworI2VuZGlmCisjdW5kZWYgX19uZWVkX3dpbnRfdAorI2VuZGlmIC8qIF9fbmVlZF93aW50X3QgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9zdGRpbnQuaCBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL3N0ZGludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMmZjYmMKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS9zdGRpbnQuaApAQCAtMCwwICsxLDcwNyBAQAorLyo9PT0tLS0tIHN0ZGludC5oIC0gU3RhbmRhcmQgaGVhZGVyIGZvciBzaXplZCBpbnRlZ2VyIHR5cGVzIC0tLS0tLS0tLS0tLS0tPT09KlwKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgQ2hyaXMgTGF0dG5lcgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqCitcKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qLworCisjaWZuZGVmIF9fQ0xBTkdfU1RESU5UX0gKKyNkZWZpbmUgX19DTEFOR19TVERJTlRfSAorCisvKiBJZiB3ZSdyZSBob3N0ZWQsIGZhbGwgYmFjayB0byB0aGUgc3lzdGVtJ3Mgc3RkaW50LmgsIHdoaWNoIG1pZ2h0IGhhdmUKKyAqIGFkZGl0aW9uYWwgZGVmaW5pdGlvbnMuCisgKi8KKyNpZiBfX1NURENfSE9TVEVEX18gJiYgX19oYXNfaW5jbHVkZV9uZXh0KDxzdGRpbnQuaD4pCisKKy8vIEM5OSA3LjE4LjMgTGltaXRzIG9mIG90aGVyIGludGVnZXIgdHlwZXMKKy8vCisvLyAgRm9vdG5vdGUgMjE5LCAyMjA6IEMrKyBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIGRlZmluZSB0aGVzZSBtYWNyb3Mgb25seSB3aGVuCisvLyAgX19TVERDX0xJTUlUX01BQ1JPUyBpcyBkZWZpbmVkIGJlZm9yZSA8c3RkaW50Lmg+IGlzIGluY2x1ZGVkLgorLy8KKy8vICBGb290bm90ZSAyMjI6IEMrKyBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIGRlZmluZSB0aGVzZSBtYWNyb3Mgb25seSB3aGVuCisvLyAgX19TVERDX0NPTlNUQU5UX01BQ1JPUyBpcyBkZWZpbmVkIGJlZm9yZSA8c3RkaW50Lmg+IGlzIGluY2x1ZGVkLgorLy8KKy8vIEMrKzExIFtjc3RkaW50LnN5bl1wMjoKKy8vCisvLyAgVGhlIG1hY3JvcyBkZWZpbmVkIGJ5IDxjc3RkaW50PiBhcmUgcHJvdmlkZWQgdW5jb25kaXRpb25hbGx5LiBJbiBwYXJ0aWN1bGFyLAorLy8gIHRoZSBzeW1ib2xzIF9fU1REQ19MSU1JVF9NQUNST1MgYW5kIF9fU1REQ19DT05TVEFOVF9NQUNST1MgKG1lbnRpb25lZCBpbgorLy8gIGZvb3Rub3RlcyAyMTksIDIyMCwgYW5kIDIyMiBpbiB0aGUgQyBzdGFuZGFyZCkgcGxheSBubyByb2xlIGluIEMrKy4KKy8vCisvLyBDMTEgcmVtb3ZlZCB0aGUgcHJvYmxlbWF0aWMgZm9vdG5vdGVzLgorLy8KKy8vIFdvcmsgYXJvdW5kIHRoaXMgaW5jb25zaXN0ZW5jeSBieSBhbHdheXMgZGVmaW5pbmcgdGhvc2UgbWFjcm9zIGluIEMrKyBtb2RlLAorLy8gc28gdGhhdCBhIEMgbGlicmFyeSBpbXBsZW1lbnRhdGlvbiB3aGljaCBmb2xsb3dzIHRoZSBDOTkgc3RhbmRhcmQgY2FuIGJlCisvLyB1c2VkIGluIEMrKy4KKyMgaWZkZWYgX19jcGx1c3BsdXMKKyMgIGlmICFkZWZpbmVkKF9fU1REQ19MSU1JVF9NQUNST1MpCisjICAgZGVmaW5lIF9fU1REQ19MSU1JVF9NQUNST1MKKyMgICBkZWZpbmUgX19TVERDX0xJTUlUX01BQ1JPU19ERUZJTkVEX0JZX0NMQU5HCisjICBlbmRpZgorIyAgaWYgIWRlZmluZWQoX19TVERDX0NPTlNUQU5UX01BQ1JPUykKKyMgICBkZWZpbmUgX19TVERDX0NPTlNUQU5UX01BQ1JPUworIyAgIGRlZmluZSBfX1NURENfQ09OU1RBTlRfTUFDUk9TX0RFRklORURfQllfQ0xBTkcKKyMgIGVuZGlmCisjIGVuZGlmCisKKyMgaW5jbHVkZV9uZXh0IDxzdGRpbnQuaD4KKworIyBpZmRlZiBfX1NURENfTElNSVRfTUFDUk9TX0RFRklORURfQllfQ0xBTkcKKyMgIHVuZGVmIF9fU1REQ19MSU1JVF9NQUNST1MKKyMgIHVuZGVmIF9fU1REQ19MSU1JVF9NQUNST1NfREVGSU5FRF9CWV9DTEFORworIyBlbmRpZgorIyBpZmRlZiBfX1NURENfQ09OU1RBTlRfTUFDUk9TX0RFRklORURfQllfQ0xBTkcKKyMgIHVuZGVmIF9fU1REQ19DT05TVEFOVF9NQUNST1MKKyMgIHVuZGVmIF9fU1REQ19DT05TVEFOVF9NQUNST1NfREVGSU5FRF9CWV9DTEFORworIyBlbmRpZgorCisjZWxzZQorCisvKiBDOTkgNy4xOC4xLjEgRXhhY3Qtd2lkdGggaW50ZWdlciB0eXBlcy4KKyAqIEM5OSA3LjE4LjEuMiBNaW5pbXVtLXdpZHRoIGludGVnZXIgdHlwZXMuCisgKiBDOTkgNy4xOC4xLjMgRmFzdGVzdCBtaW5pbXVtLXdpZHRoIGludGVnZXIgdHlwZXMuCisgKgorICogVGhlIHN0YW5kYXJkIHJlcXVpcmVzIHRoYXQgZXhhY3Qtd2lkdGggdHlwZSBiZSBkZWZpbmVkIGZvciA4LSwgMTYtLCAzMi0sIGFuZAorICogNjQtYml0IHR5cGVzIGlmIHRoZXkgYXJlIGltcGxlbWVudGVkLiBPdGhlciBleGFjdCB3aWR0aCB0eXBlcyBhcmUgb3B0aW9uYWwuCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGRlZmluZXMgYW4gZXhhY3Qtd2lkdGggdHlwZXMgZm9yIGV2ZXJ5IGludGVnZXIgd2lkdGgKKyAqIHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gdGhlIHN0YW5kYXJkIGludGVnZXIgdHlwZXMuCisgKgorICogVGhlIHN0YW5kYXJkIGFsc28gcmVxdWlyZXMgbWluaW11bS13aWR0aCB0eXBlcyBiZSBkZWZpbmVkIGZvciA4LSwgMTYtLCAzMi0sCisgKiBhbmQgNjQtYml0IHdpZHRocyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlcmUgYXJlIGNvcnJlc3BvbmRpbmcgZXhhY3Qtd2lkdGgKKyAqIHR5cGVzLgorICoKKyAqIFRvIGFjY29tbW9kYXRlIHRhcmdldHMgdGhhdCBhcmUgbWlzc2luZyB0eXBlcyB0aGF0IGFyZSBleGFjdGx5IDgsIDE2LCAzMiwgb3IKKyAqIDY0IGJpdHMgd2lkZSwgdGhpcyBpbXBsZW1lbnRhdGlvbiB0YWtlcyBhbiBhcHByb2FjaCBvZiBjYXNjYWRpbmcKKyAqIHJlZGVmaW50aW9ucywgcmVkZWZpbmluZyBfX2ludF9sZWFzdE5fdCB0byBzdWNjZXNzaXZlbHkgc21hbGxlciBleGFjdC13aWR0aAorICogdHlwZXMuIEl0IGlzIHRoZXJlZm9yZSBpbXBvcnRhbnQgdGhhdCB0aGUgdHlwZXMgYXJlIGRlZmluZWQgaW4gb3JkZXIgb2YKKyAqIGRlc2NlbmRpbmcgd2lkdGhzLgorICoKKyAqIFdlIGN1cnJlbnRseSBhc3N1bWUgdGhhdCB0aGUgbWluaW11bS13aWR0aCB0eXBlcyBhbmQgdGhlIGZhc3Rlc3QKKyAqIG1pbmltdW0td2lkdGggdHlwZXMgYXJlIHRoZSBzYW1lLiBUaGlzIGlzIGFsbG93ZWQgYnkgdGhlIHN0YW5kYXJkLCBidXQgaXMKKyAqIHN1Ym9wdGltYWwuCisgKgorICogSW4gdmlvbGF0aW9uIG9mIHRoZSBzdGFuZGFyZCwgc29tZSB0YXJnZXRzIGRvIG5vdCBpbXBsZW1lbnQgYSB0eXBlIHRoYXQgaXMKKyAqIHdpZGUgZW5vdWdoIHRvIHJlcHJlc2VudCBhbGwgb2YgdGhlIHJlcXVpcmVkIHdpZHRocyAoOC0sIDE2LSwgMzItLCA2NC1iaXQpLgorICogVG8gYWNjb21tb2RhdGUgdGhlc2UgdGFyZ2V0cywgYSByZXF1aXJlZCBtaW5pbXVtLXdpZHRoIHR5cGUgaXMgb25seQorICogZGVmaW5lZCBpZiB0aGVyZSBleGlzdHMgYW4gZXhhY3Qtd2lkdGggdHlwZSBvZiBlcXVhbCBvciBncmVhdGVyIHdpZHRoLgorICovCisKKyNpZmRlZiBfX0lOVDY0X1RZUEVfXworIyBpZm5kZWYgX19pbnQ4X3RfZGVmaW5lZCAvKiBnbGliYyBzeXMvdHlwZXMuaCBhbHNvIGRlZmluZXMgaW50NjRfdCovCit0eXBlZGVmIF9fSU5UNjRfVFlQRV9fIGludDY0X3Q7CisjIGVuZGlmIC8qIF9faW50OF90X2RlZmluZWQgKi8KK3R5cGVkZWYgX19VSU5UNjRfVFlQRV9fIHVpbnQ2NF90OworIyBkZWZpbmUgX19pbnRfbGVhc3Q2NF90IGludDY0X3QKKyMgZGVmaW5lIF9fdWludF9sZWFzdDY0X3QgdWludDY0X3QKKyMgZGVmaW5lIF9faW50X2xlYXN0MzJfdCBpbnQ2NF90CisjIGRlZmluZSBfX3VpbnRfbGVhc3QzMl90IHVpbnQ2NF90CisjIGRlZmluZSBfX2ludF9sZWFzdDE2X3QgaW50NjRfdAorIyBkZWZpbmUgX191aW50X2xlYXN0MTZfdCB1aW50NjRfdAorIyBkZWZpbmUgX19pbnRfbGVhc3Q4X3QgaW50NjRfdAorIyBkZWZpbmUgX191aW50X2xlYXN0OF90IHVpbnQ2NF90CisjZW5kaWYgLyogX19JTlQ2NF9UWVBFX18gKi8KKworI2lmZGVmIF9faW50X2xlYXN0NjRfdAordHlwZWRlZiBfX2ludF9sZWFzdDY0X3QgaW50X2xlYXN0NjRfdDsKK3R5cGVkZWYgX191aW50X2xlYXN0NjRfdCB1aW50X2xlYXN0NjRfdDsKK3R5cGVkZWYgX19pbnRfbGVhc3Q2NF90IGludF9mYXN0NjRfdDsKK3R5cGVkZWYgX191aW50X2xlYXN0NjRfdCB1aW50X2Zhc3Q2NF90OworI2VuZGlmIC8qIF9faW50X2xlYXN0NjRfdCAqLworCisjaWZkZWYgX19JTlQ1Nl9UWVBFX18KK3R5cGVkZWYgX19JTlQ1Nl9UWVBFX18gaW50NTZfdDsKK3R5cGVkZWYgX19VSU5UNTZfVFlQRV9fIHVpbnQ1Nl90OwordHlwZWRlZiBpbnQ1Nl90IGludF9sZWFzdDU2X3Q7Cit0eXBlZGVmIHVpbnQ1Nl90IHVpbnRfbGVhc3Q1Nl90OwordHlwZWRlZiBpbnQ1Nl90IGludF9mYXN0NTZfdDsKK3R5cGVkZWYgdWludDU2X3QgdWludF9mYXN0NTZfdDsKKyMgZGVmaW5lIF9faW50X2xlYXN0MzJfdCBpbnQ1Nl90CisjIGRlZmluZSBfX3VpbnRfbGVhc3QzMl90IHVpbnQ1Nl90CisjIGRlZmluZSBfX2ludF9sZWFzdDE2X3QgaW50NTZfdAorIyBkZWZpbmUgX191aW50X2xlYXN0MTZfdCB1aW50NTZfdAorIyBkZWZpbmUgX19pbnRfbGVhc3Q4X3QgaW50NTZfdAorIyBkZWZpbmUgX191aW50X2xlYXN0OF90IHVpbnQ1Nl90CisjZW5kaWYgLyogX19JTlQ1Nl9UWVBFX18gKi8KKworCisjaWZkZWYgX19JTlQ0OF9UWVBFX18KK3R5cGVkZWYgX19JTlQ0OF9UWVBFX18gaW50NDhfdDsKK3R5cGVkZWYgX19VSU5UNDhfVFlQRV9fIHVpbnQ0OF90OwordHlwZWRlZiBpbnQ0OF90IGludF9sZWFzdDQ4X3Q7Cit0eXBlZGVmIHVpbnQ0OF90IHVpbnRfbGVhc3Q0OF90OwordHlwZWRlZiBpbnQ0OF90IGludF9mYXN0NDhfdDsKK3R5cGVkZWYgdWludDQ4X3QgdWludF9mYXN0NDhfdDsKKyMgZGVmaW5lIF9faW50X2xlYXN0MzJfdCBpbnQ0OF90CisjIGRlZmluZSBfX3VpbnRfbGVhc3QzMl90IHVpbnQ0OF90CisjIGRlZmluZSBfX2ludF9sZWFzdDE2X3QgaW50NDhfdAorIyBkZWZpbmUgX191aW50X2xlYXN0MTZfdCB1aW50NDhfdAorIyBkZWZpbmUgX19pbnRfbGVhc3Q4X3QgaW50NDhfdAorIyBkZWZpbmUgX191aW50X2xlYXN0OF90IHVpbnQ0OF90CisjZW5kaWYgLyogX19JTlQ0OF9UWVBFX18gKi8KKworCisjaWZkZWYgX19JTlQ0MF9UWVBFX18KK3R5cGVkZWYgX19JTlQ0MF9UWVBFX18gaW50NDBfdDsKK3R5cGVkZWYgX19VSU5UNDBfVFlQRV9fIHVpbnQ0MF90OwordHlwZWRlZiBpbnQ0MF90IGludF9sZWFzdDQwX3Q7Cit0eXBlZGVmIHVpbnQ0MF90IHVpbnRfbGVhc3Q0MF90OwordHlwZWRlZiBpbnQ0MF90IGludF9mYXN0NDBfdDsKK3R5cGVkZWYgdWludDQwX3QgdWludF9mYXN0NDBfdDsKKyMgZGVmaW5lIF9faW50X2xlYXN0MzJfdCBpbnQ0MF90CisjIGRlZmluZSBfX3VpbnRfbGVhc3QzMl90IHVpbnQ0MF90CisjIGRlZmluZSBfX2ludF9sZWFzdDE2X3QgaW50NDBfdAorIyBkZWZpbmUgX191aW50X2xlYXN0MTZfdCB1aW50NDBfdAorIyBkZWZpbmUgX19pbnRfbGVhc3Q4X3QgaW50NDBfdAorIyBkZWZpbmUgX191aW50X2xlYXN0OF90IHVpbnQ0MF90CisjZW5kaWYgLyogX19JTlQ0MF9UWVBFX18gKi8KKworCisjaWZkZWYgX19JTlQzMl9UWVBFX18KKworIyBpZm5kZWYgX19pbnQ4X3RfZGVmaW5lZCAvKiBnbGliYyBzeXMvdHlwZXMuaCBhbHNvIGRlZmluZXMgaW50MzJfdCovCit0eXBlZGVmIF9fSU5UMzJfVFlQRV9fIGludDMyX3Q7CisjIGVuZGlmIC8qIF9faW50OF90X2RlZmluZWQgKi8KKworIyBpZm5kZWYgX191aW50MzJfdF9kZWZpbmVkICAvKiBtb3JlIGdsaWJjIGNvbXBhdGliaWxpdHkgKi8KKyMgZGVmaW5lIF9fdWludDMyX3RfZGVmaW5lZAordHlwZWRlZiBfX1VJTlQzMl9UWVBFX18gdWludDMyX3Q7CisjIGVuZGlmIC8qIF9fdWludDMyX3RfZGVmaW5lZCAqLworCisjIGRlZmluZSBfX2ludF9sZWFzdDMyX3QgaW50MzJfdAorIyBkZWZpbmUgX191aW50X2xlYXN0MzJfdCB1aW50MzJfdAorIyBkZWZpbmUgX19pbnRfbGVhc3QxNl90IGludDMyX3QKKyMgZGVmaW5lIF9fdWludF9sZWFzdDE2X3QgdWludDMyX3QKKyMgZGVmaW5lIF9faW50X2xlYXN0OF90IGludDMyX3QKKyMgZGVmaW5lIF9fdWludF9sZWFzdDhfdCB1aW50MzJfdAorI2VuZGlmIC8qIF9fSU5UMzJfVFlQRV9fICovCisKKyNpZmRlZiBfX2ludF9sZWFzdDMyX3QKK3R5cGVkZWYgX19pbnRfbGVhc3QzMl90IGludF9sZWFzdDMyX3Q7Cit0eXBlZGVmIF9fdWludF9sZWFzdDMyX3QgdWludF9sZWFzdDMyX3Q7Cit0eXBlZGVmIF9faW50X2xlYXN0MzJfdCBpbnRfZmFzdDMyX3Q7Cit0eXBlZGVmIF9fdWludF9sZWFzdDMyX3QgdWludF9mYXN0MzJfdDsKKyNlbmRpZiAvKiBfX2ludF9sZWFzdDMyX3QgKi8KKworI2lmZGVmIF9fSU5UMjRfVFlQRV9fCit0eXBlZGVmIF9fSU5UMjRfVFlQRV9fIGludDI0X3Q7Cit0eXBlZGVmIF9fVUlOVDI0X1RZUEVfXyB1aW50MjRfdDsKK3R5cGVkZWYgaW50MjRfdCBpbnRfbGVhc3QyNF90OwordHlwZWRlZiB1aW50MjRfdCB1aW50X2xlYXN0MjRfdDsKK3R5cGVkZWYgaW50MjRfdCBpbnRfZmFzdDI0X3Q7Cit0eXBlZGVmIHVpbnQyNF90IHVpbnRfZmFzdDI0X3Q7CisjIGRlZmluZSBfX2ludF9sZWFzdDE2X3QgaW50MjRfdAorIyBkZWZpbmUgX191aW50X2xlYXN0MTZfdCB1aW50MjRfdAorIyBkZWZpbmUgX19pbnRfbGVhc3Q4X3QgaW50MjRfdAorIyBkZWZpbmUgX191aW50X2xlYXN0OF90IHVpbnQyNF90CisjZW5kaWYgLyogX19JTlQyNF9UWVBFX18gKi8KKworI2lmZGVmIF9fSU5UMTZfVFlQRV9fCisjaWZuZGVmIF9faW50OF90X2RlZmluZWQgLyogZ2xpYmMgc3lzL3R5cGVzLmggYWxzbyBkZWZpbmVzIGludDE2X3QqLwordHlwZWRlZiBfX0lOVDE2X1RZUEVfXyBpbnQxNl90OworI2VuZGlmIC8qIF9faW50OF90X2RlZmluZWQgKi8KK3R5cGVkZWYgX19VSU5UMTZfVFlQRV9fIHVpbnQxNl90OworIyBkZWZpbmUgX19pbnRfbGVhc3QxNl90IGludDE2X3QKKyMgZGVmaW5lIF9fdWludF9sZWFzdDE2X3QgdWludDE2X3QKKyMgZGVmaW5lIF9faW50X2xlYXN0OF90IGludDE2X3QKKyMgZGVmaW5lIF9fdWludF9sZWFzdDhfdCB1aW50MTZfdAorI2VuZGlmIC8qIF9fSU5UMTZfVFlQRV9fICovCisKKyNpZmRlZiBfX2ludF9sZWFzdDE2X3QKK3R5cGVkZWYgX19pbnRfbGVhc3QxNl90IGludF9sZWFzdDE2X3Q7Cit0eXBlZGVmIF9fdWludF9sZWFzdDE2X3QgdWludF9sZWFzdDE2X3Q7Cit0eXBlZGVmIF9faW50X2xlYXN0MTZfdCBpbnRfZmFzdDE2X3Q7Cit0eXBlZGVmIF9fdWludF9sZWFzdDE2X3QgdWludF9mYXN0MTZfdDsKKyNlbmRpZiAvKiBfX2ludF9sZWFzdDE2X3QgKi8KKworCisjaWZkZWYgX19JTlQ4X1RZUEVfXworI2lmbmRlZiBfX2ludDhfdF9kZWZpbmVkICAvKiBnbGliYyBzeXMvdHlwZXMuaCBhbHNvIGRlZmluZXMgaW50OF90Ki8KK3R5cGVkZWYgX19JTlQ4X1RZUEVfXyBpbnQ4X3Q7CisjZW5kaWYgLyogX19pbnQ4X3RfZGVmaW5lZCAqLwordHlwZWRlZiBfX1VJTlQ4X1RZUEVfXyB1aW50OF90OworIyBkZWZpbmUgX19pbnRfbGVhc3Q4X3QgaW50OF90CisjIGRlZmluZSBfX3VpbnRfbGVhc3Q4X3QgdWludDhfdAorI2VuZGlmIC8qIF9fSU5UOF9UWVBFX18gKi8KKworI2lmZGVmIF9faW50X2xlYXN0OF90Cit0eXBlZGVmIF9faW50X2xlYXN0OF90IGludF9sZWFzdDhfdDsKK3R5cGVkZWYgX191aW50X2xlYXN0OF90IHVpbnRfbGVhc3Q4X3Q7Cit0eXBlZGVmIF9faW50X2xlYXN0OF90IGludF9mYXN0OF90OwordHlwZWRlZiBfX3VpbnRfbGVhc3Q4X3QgdWludF9mYXN0OF90OworI2VuZGlmIC8qIF9faW50X2xlYXN0OF90ICovCisKKy8qIHByZXZlbnQgZ2xpYmMgc3lzL3R5cGVzLmggZnJvbSBkZWZpbmluZyBjb25mbGljdGluZyB0eXBlcyAqLworI2lmbmRlZiBfX2ludDhfdF9kZWZpbmVkCisjIGRlZmluZSBfX2ludDhfdF9kZWZpbmVkCisjZW5kaWYgLyogX19pbnQ4X3RfZGVmaW5lZCAqLworCisvKiBDOTkgNy4xOC4xLjQgSW50ZWdlciB0eXBlcyBjYXBhYmxlIG9mIGhvbGRpbmcgb2JqZWN0IHBvaW50ZXJzLgorICovCisjZGVmaW5lIF9fc3RkaW50X2pvaW4zKGEsYixjKSBhICMjIGIgIyMgYworCisjZGVmaW5lICBfX2ludG5fdChuKSBfX3N0ZGludF9qb2luMyggaW50LCBuLCBfdCkKKyNkZWZpbmUgX191aW50bl90KG4pIF9fc3RkaW50X2pvaW4zKHVpbnQsIG4sIF90KQorCisjaWZuZGVmIF9JTlRQVFJfVAorI2lmbmRlZiBfX2ludHB0cl90X2RlZmluZWQKK3R5cGVkZWYgIF9faW50bl90KF9fSU5UUFRSX1dJRFRIX18pICBpbnRwdHJfdDsKKyNkZWZpbmUgX19pbnRwdHJfdF9kZWZpbmVkCisjZGVmaW5lIF9JTlRQVFJfVAorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBfVUlOVFBUUl9UCit0eXBlZGVmIF9fdWludG5fdChfX0lOVFBUUl9XSURUSF9fKSB1aW50cHRyX3Q7CisjZGVmaW5lIF9VSU5UUFRSX1QKKyNlbmRpZgorCisvKiBDOTkgNy4xOC4xLjUgR3JlYXRlc3Qtd2lkdGggaW50ZWdlciB0eXBlcy4KKyAqLwordHlwZWRlZiBfX0lOVE1BWF9UWVBFX18gIGludG1heF90OwordHlwZWRlZiBfX1VJTlRNQVhfVFlQRV9fIHVpbnRtYXhfdDsKKworLyogQzk5IDcuMTguNCBNYWNyb3MgZm9yIG1pbmltdW0td2lkdGggaW50ZWdlciBjb25zdGFudHMuCisgKgorICogVGhlIHN0YW5kYXJkIHJlcXVpcmVzIHRoYXQgaW50ZWdlciBjb25zdGFudCBtYWNyb3MgYmUgZGVmaW5lZCBmb3IgYWxsIHRoZQorICogbWluaW11bS13aWR0aCB0eXBlcyBkZWZpbmVkIGFib3ZlLiBBcyA4LSwgMTYtLCAzMi0sIGFuZCA2NC1iaXQgbWluaW11bS13aWR0aAorICogdHlwZXMgYXJlIHJlcXVpcmVkLCB0aGUgY29ycmVzcG9uZGluZyBpbnRlZ2VyIGNvbnN0YW50IG1hY3JvcyBhcmUgZGVmaW5lZAorICogaGVyZS4gVGhpcyBpbXBsZW1lbnRhdGlvbiBhbHNvIGRlZmluZXMgbWluaW11bS13aWR0aCB0eXBlcyBmb3IgZXZlcnkgb3RoZXIKKyAqIGludGVnZXIgd2lkdGggdGhhdCB0aGUgdGFyZ2V0IGltcGxlbWVudHMsIHNvIGNvcnJlc3BvbmRpbmcgbWFjcm9zIGFyZQorICogZGVmaW5lZCBiZWxvdywgdG9vLgorICoKKyAqIFRoZXNlIG1hY3JvcyBhcmUgZGVmaW5lZCB1c2luZyB0aGUgc2FtZSBzdWNjZXNzaXZlLXNocmlua2luZyBhcHByb2FjaCBhcworICogdGhlIHR5cGUgZGVmaW5pdGlvbnMgYWJvdmUuIEl0IGlzIGxpa2V3aXNlIGltcG9ydGFudCB0aGF0IG1hY3JvcyBhcmUgZGVmaW5lZAorICogaW4gb3JkZXIgb2YgZGVjZW5kaW5nIHdpZHRoLgorICoKKyAqIE5vdGUgdGhhdCBDKysgc2hvdWxkIG5vdCBjaGVjayBfX1NURENfQ09OU1RBTlRfTUFDUk9TIGhlcmUsIGNvbnRyYXJ5IHRvIHRoZQorICogY2xhaW1zIG9mIHRoZSBDIHN0YW5kYXJkIChzZWUgQysrIDE4LjMuMXAyLCBbY3N0ZGludC5zeW5dKS4KKyAqLworCisjZGVmaW5lIF9faW50X2Nfam9pbihhLCBiKSBhICMjIGIKKyNkZWZpbmUgX19pbnRfYyh2LCBzdWZmaXgpIF9faW50X2Nfam9pbih2LCBzdWZmaXgpCisjZGVmaW5lIF9fdWludF9jKHYsIHN1ZmZpeCkgX19pbnRfY19qb2luKHYjI1UsIHN1ZmZpeCkKKworCisjaWZkZWYgX19JTlQ2NF9UWVBFX18KKyMgaWZkZWYgX19JTlQ2NF9DX1NVRkZJWF9fCisjICBkZWZpbmUgX19pbnQ2NF9jX3N1ZmZpeCBfX0lOVDY0X0NfU1VGRklYX18KKyMgIGRlZmluZSBfX2ludDMyX2Nfc3VmZml4IF9fSU5UNjRfQ19TVUZGSVhfXworIyAgZGVmaW5lIF9faW50MTZfY19zdWZmaXggX19JTlQ2NF9DX1NVRkZJWF9fCisjICBkZWZpbmUgIF9faW50OF9jX3N1ZmZpeCBfX0lOVDY0X0NfU1VGRklYX18KKyMgZWxzZQorIyAgdW5kZWYgX19pbnQ2NF9jX3N1ZmZpeAorIyAgdW5kZWYgX19pbnQzMl9jX3N1ZmZpeAorIyAgdW5kZWYgX19pbnQxNl9jX3N1ZmZpeAorIyAgdW5kZWYgIF9faW50OF9jX3N1ZmZpeAorIyBlbmRpZiAvKiBfX0lOVDY0X0NfU1VGRklYX18gKi8KKyNlbmRpZiAvKiBfX0lOVDY0X1RZUEVfXyAqLworCisjaWZkZWYgX19pbnRfbGVhc3Q2NF90CisjIGlmZGVmIF9faW50NjRfY19zdWZmaXgKKyMgIGRlZmluZSBJTlQ2NF9DKHYpIF9faW50X2ModiwgX19pbnQ2NF9jX3N1ZmZpeCkKKyMgIGRlZmluZSBVSU5UNjRfQyh2KSBfX3VpbnRfYyh2LCBfX2ludDY0X2Nfc3VmZml4KQorIyBlbHNlCisjICBkZWZpbmUgSU5UNjRfQyh2KSB2CisjICBkZWZpbmUgVUlOVDY0X0ModikgdiAjIyBVCisjIGVuZGlmIC8qIF9faW50NjRfY19zdWZmaXggKi8KKyNlbmRpZiAvKiBfX2ludF9sZWFzdDY0X3QgKi8KKworCisjaWZkZWYgX19JTlQ1Nl9UWVBFX18KKyMgaWZkZWYgX19JTlQ1Nl9DX1NVRkZJWF9fCisjICBkZWZpbmUgSU5UNTZfQyh2KSBfX2ludF9jKHYsIF9fSU5UNTZfQ19TVUZGSVhfXykKKyMgIGRlZmluZSBVSU5UNTZfQyh2KSBfX3VpbnRfYyh2LCBfX0lOVDU2X0NfU1VGRklYX18pCisjICBkZWZpbmUgX19pbnQzMl9jX3N1ZmZpeCBfX0lOVDU2X0NfU1VGRklYX18KKyMgIGRlZmluZSBfX2ludDE2X2Nfc3VmZml4IF9fSU5UNTZfQ19TVUZGSVhfXworIyAgZGVmaW5lIF9faW50OF9jX3N1ZmZpeCAgX19JTlQ1Nl9DX1NVRkZJWF9fCisjIGVsc2UKKyMgIGRlZmluZSBJTlQ1Nl9DKHYpIHYKKyMgIGRlZmluZSBVSU5UNTZfQyh2KSB2ICMjIFUKKyMgIHVuZGVmIF9faW50MzJfY19zdWZmaXgKKyMgIHVuZGVmIF9faW50MTZfY19zdWZmaXgKKyMgIHVuZGVmICBfX2ludDhfY19zdWZmaXgKKyMgZW5kaWYgLyogX19JTlQ1Nl9DX1NVRkZJWF9fICovCisjZW5kaWYgLyogX19JTlQ1Nl9UWVBFX18gKi8KKworCisjaWZkZWYgX19JTlQ0OF9UWVBFX18KKyMgaWZkZWYgX19JTlQ0OF9DX1NVRkZJWF9fCisjICBkZWZpbmUgSU5UNDhfQyh2KSBfX2ludF9jKHYsIF9fSU5UNDhfQ19TVUZGSVhfXykKKyMgIGRlZmluZSBVSU5UNDhfQyh2KSBfX3VpbnRfYyh2LCBfX0lOVDQ4X0NfU1VGRklYX18pCisjICBkZWZpbmUgX19pbnQzMl9jX3N1ZmZpeCBfX0lOVDQ4X0NfU1VGRklYX18KKyMgIGRlZmluZSBfX2ludDE2X2Nfc3VmZml4IF9fSU5UNDhfQ19TVUZGSVhfXworIyAgZGVmaW5lIF9faW50OF9jX3N1ZmZpeCAgX19JTlQ0OF9DX1NVRkZJWF9fCisjIGVsc2UKKyMgIGRlZmluZSBJTlQ0OF9DKHYpIHYKKyMgIGRlZmluZSBVSU5UNDhfQyh2KSB2ICMjIFUKKyMgIHVuZGVmIF9faW50MzJfY19zdWZmaXgKKyMgIHVuZGVmIF9faW50MTZfY19zdWZmaXgKKyMgIHVuZGVmICBfX2ludDhfY19zdWZmaXgKKyMgZW5kaWYgLyogX19JTlQ0OF9DX1NVRkZJWF9fICovCisjZW5kaWYgLyogX19JTlQ0OF9UWVBFX18gKi8KKworCisjaWZkZWYgX19JTlQ0MF9UWVBFX18KKyMgaWZkZWYgX19JTlQ0MF9DX1NVRkZJWF9fCisjICBkZWZpbmUgSU5UNDBfQyh2KSBfX2ludF9jKHYsIF9fSU5UNDBfQ19TVUZGSVhfXykKKyMgIGRlZmluZSBVSU5UNDBfQyh2KSBfX3VpbnRfYyh2LCBfX0lOVDQwX0NfU1VGRklYX18pCisjICBkZWZpbmUgX19pbnQzMl9jX3N1ZmZpeCBfX0lOVDQwX0NfU1VGRklYX18KKyMgIGRlZmluZSBfX2ludDE2X2Nfc3VmZml4IF9fSU5UNDBfQ19TVUZGSVhfXworIyAgZGVmaW5lIF9faW50OF9jX3N1ZmZpeCAgX19JTlQ0MF9DX1NVRkZJWF9fCisjIGVsc2UKKyMgIGRlZmluZSBJTlQ0MF9DKHYpIHYKKyMgIGRlZmluZSBVSU5UNDBfQyh2KSB2ICMjIFUKKyMgIHVuZGVmIF9faW50MzJfY19zdWZmaXgKKyMgIHVuZGVmIF9faW50MTZfY19zdWZmaXgKKyMgIHVuZGVmICBfX2ludDhfY19zdWZmaXgKKyMgZW5kaWYgLyogX19JTlQ0MF9DX1NVRkZJWF9fICovCisjZW5kaWYgLyogX19JTlQ0MF9UWVBFX18gKi8KKworCisjaWZkZWYgX19JTlQzMl9UWVBFX18KKyMgaWZkZWYgX19JTlQzMl9DX1NVRkZJWF9fCisjICBkZWZpbmUgX19pbnQzMl9jX3N1ZmZpeCBfX0lOVDMyX0NfU1VGRklYX18KKyMgIGRlZmluZSBfX2ludDE2X2Nfc3VmZml4IF9fSU5UMzJfQ19TVUZGSVhfXworIyAgZGVmaW5lIF9faW50OF9jX3N1ZmZpeCAgX19JTlQzMl9DX1NVRkZJWF9fCisjZWxzZQorIyAgdW5kZWYgX19pbnQzMl9jX3N1ZmZpeAorIyAgdW5kZWYgX19pbnQxNl9jX3N1ZmZpeAorIyAgdW5kZWYgIF9faW50OF9jX3N1ZmZpeAorIyBlbmRpZiAvKiBfX0lOVDMyX0NfU1VGRklYX18gKi8KKyNlbmRpZiAvKiBfX0lOVDMyX1RZUEVfXyAqLworCisjaWZkZWYgX19pbnRfbGVhc3QzMl90CisjIGlmZGVmIF9faW50MzJfY19zdWZmaXgKKyMgIGRlZmluZSBJTlQzMl9DKHYpIF9faW50X2ModiwgX19pbnQzMl9jX3N1ZmZpeCkKKyMgIGRlZmluZSBVSU5UMzJfQyh2KSBfX3VpbnRfYyh2LCBfX2ludDMyX2Nfc3VmZml4KQorIyBlbHNlCisjICBkZWZpbmUgSU5UMzJfQyh2KSB2CisjICBkZWZpbmUgVUlOVDMyX0ModikgdiAjIyBVCisjIGVuZGlmIC8qIF9faW50MzJfY19zdWZmaXggKi8KKyNlbmRpZiAvKiBfX2ludF9sZWFzdDMyX3QgKi8KKworCisjaWZkZWYgX19JTlQyNF9UWVBFX18KKyMgaWZkZWYgX19JTlQyNF9DX1NVRkZJWF9fCisjICBkZWZpbmUgSU5UMjRfQyh2KSBfX2ludF9jKHYsIF9fSU5UMjRfQ19TVUZGSVhfXykKKyMgIGRlZmluZSBVSU5UMjRfQyh2KSBfX3VpbnRfYyh2LCBfX0lOVDI0X0NfU1VGRklYX18pCisjICBkZWZpbmUgX19pbnQxNl9jX3N1ZmZpeCBfX0lOVDI0X0NfU1VGRklYX18KKyMgIGRlZmluZSBfX2ludDhfY19zdWZmaXggIF9fSU5UMjRfQ19TVUZGSVhfXworIyBlbHNlCisjICBkZWZpbmUgSU5UMjRfQyh2KSB2CisjICBkZWZpbmUgVUlOVDI0X0ModikgdiAjIyBVCisjICB1bmRlZiBfX2ludDE2X2Nfc3VmZml4CisjICB1bmRlZiAgX19pbnQ4X2Nfc3VmZml4CisjIGVuZGlmIC8qIF9fSU5UMjRfQ19TVUZGSVhfXyAqLworI2VuZGlmIC8qIF9fSU5UMjRfVFlQRV9fICovCisKKworI2lmZGVmIF9fSU5UMTZfVFlQRV9fCisjIGlmZGVmIF9fSU5UMTZfQ19TVUZGSVhfXworIyAgZGVmaW5lIF9faW50MTZfY19zdWZmaXggX19JTlQxNl9DX1NVRkZJWF9fCisjICBkZWZpbmUgX19pbnQ4X2Nfc3VmZml4ICBfX0lOVDE2X0NfU1VGRklYX18KKyNlbHNlCisjICB1bmRlZiBfX2ludDE2X2Nfc3VmZml4CisjICB1bmRlZiAgX19pbnQ4X2Nfc3VmZml4CisjIGVuZGlmIC8qIF9fSU5UMTZfQ19TVUZGSVhfXyAqLworI2VuZGlmIC8qIF9fSU5UMTZfVFlQRV9fICovCisKKyNpZmRlZiBfX2ludF9sZWFzdDE2X3QKKyMgaWZkZWYgX19pbnQxNl9jX3N1ZmZpeAorIyAgZGVmaW5lIElOVDE2X0ModikgX19pbnRfYyh2LCBfX2ludDE2X2Nfc3VmZml4KQorIyAgZGVmaW5lIFVJTlQxNl9DKHYpIF9fdWludF9jKHYsIF9faW50MTZfY19zdWZmaXgpCisjIGVsc2UKKyMgIGRlZmluZSBJTlQxNl9DKHYpIHYKKyMgIGRlZmluZSBVSU5UMTZfQyh2KSB2ICMjIFUKKyMgZW5kaWYgLyogX19pbnQxNl9jX3N1ZmZpeCAqLworI2VuZGlmIC8qIF9faW50X2xlYXN0MTZfdCAqLworCisKKyNpZmRlZiBfX0lOVDhfVFlQRV9fCisjIGlmZGVmIF9fSU5UOF9DX1NVRkZJWF9fCisjICBkZWZpbmUgX19pbnQ4X2Nfc3VmZml4IF9fSU5UOF9DX1NVRkZJWF9fCisjZWxzZQorIyAgdW5kZWYgIF9faW50OF9jX3N1ZmZpeAorIyBlbmRpZiAvKiBfX0lOVDhfQ19TVUZGSVhfXyAqLworI2VuZGlmIC8qIF9fSU5UOF9UWVBFX18gKi8KKworI2lmZGVmIF9faW50X2xlYXN0OF90CisjIGlmZGVmIF9faW50OF9jX3N1ZmZpeAorIyAgZGVmaW5lIElOVDhfQyh2KSBfX2ludF9jKHYsIF9faW50OF9jX3N1ZmZpeCkKKyMgIGRlZmluZSBVSU5UOF9DKHYpIF9fdWludF9jKHYsIF9faW50OF9jX3N1ZmZpeCkKKyMgZWxzZQorIyAgZGVmaW5lIElOVDhfQyh2KSB2CisjICBkZWZpbmUgVUlOVDhfQyh2KSB2ICMjIFUKKyMgZW5kaWYgLyogX19pbnQ4X2Nfc3VmZml4ICovCisjZW5kaWYgLyogX19pbnRfbGVhc3Q4X3QgKi8KKworCisvKiBDOTkgNy4xOC4yLjEgTGltaXRzIG9mIGV4YWN0LXdpZHRoIGludGVnZXIgdHlwZXMuCisgKiBDOTkgNy4xOC4yLjIgTGltaXRzIG9mIG1pbmltdW0td2lkdGggaW50ZWdlciB0eXBlcy4KKyAqIEM5OSA3LjE4LjIuMyBMaW1pdHMgb2YgZmFzdGVzdCBtaW5pbXVtLXdpZHRoIGludGVnZXIgdHlwZXMuCisgKgorICogVGhlIHByZXNlbmNlIG9mIGxpbWl0IG1hY3JvcyBhcmUgY29tcGxldGVseSBvcHRpb25hbCBpbiBDOTkuICBUaGlzCisgKiBpbXBsZW1lbnRhdGlvbiBkZWZpbmVzIGxpbWl0cyBmb3IgYWxsIG9mIHRoZSB0eXBlcyAoZXhhY3QtIGFuZAorICogbWluaW11bS13aWR0aCkgdGhhdCBpdCBkZWZpbmVzIGFib3ZlLCB1c2luZyB0aGUgbGltaXRzIG9mIHRoZSBtaW5pbXVtLXdpZHRoCisgKiB0eXBlIGZvciBhbnkgdHlwZXMgdGhhdCBkbyBub3QgaGF2ZSBleGFjdC13aWR0aCByZXByZXNlbnRhdGlvbnMuCisgKgorICogQXMgaW4gdGhlIHR5cGUgZGVmaW5pdGlvbnMsIHRoaXMgc2VjdGlvbiB0YWtlcyBhbiBhcHByb2FjaCBvZgorICogc3VjY2Vzc2l2ZS1zaHJpbmtpbmcgdG8gZGV0ZXJtaW5lIHdoaWNoIGxpbWl0cyB0byB1c2UgZm9yIHRoZSBzdGFuZGFyZCAoOCwKKyAqIDE2LCAzMiwgNjQpIGJpdCB3aWR0aHMgd2hlbiB0aGV5IGRvbid0IGhhdmUgZXhhY3QgcmVwcmVzZW50YXRpb25zLiBJdCBpcworICogdGhlcmVmb3JlIGltcG9ydGFudCB0aGF0IHRoZSBkZWZpbnRpb25zIGJlIGtlcHQgaW4gb3JkZXIgb2YgZGVjZW5kaW5nCisgKiB3aWR0aHMuCisgKgorICogTm90ZSB0aGF0IEMrKyBzaG91bGQgbm90IGNoZWNrIF9fU1REQ19MSU1JVF9NQUNST1MgaGVyZSwgY29udHJhcnkgdG8gdGhlCisgKiBjbGFpbXMgb2YgdGhlIEMgc3RhbmRhcmQgKHNlZSBDKysgMTguMy4xcDIsIFtjc3RkaW50LnN5bl0pLgorICovCisKKyNpZmRlZiBfX0lOVDY0X1RZUEVfXworIyBkZWZpbmUgSU5UNjRfTUFYICAgICAgICAgICBJTlQ2NF9DKCA5MjIzMzcyMDM2ODU0Nzc1ODA3KQorIyBkZWZpbmUgSU5UNjRfTUlOICAgICAgICAgKC1JTlQ2NF9DKCA5MjIzMzcyMDM2ODU0Nzc1ODA3KS0xKQorIyBkZWZpbmUgVUlOVDY0X01BWCAgICAgICAgIFVJTlQ2NF9DKDE4NDQ2NzQ0MDczNzA5NTUxNjE1KQorIyBkZWZpbmUgX19JTlRfTEVBU1Q2NF9NSU4gICBJTlQ2NF9NSU4KKyMgZGVmaW5lIF9fSU5UX0xFQVNUNjRfTUFYICAgSU5UNjRfTUFYCisjIGRlZmluZSBfX1VJTlRfTEVBU1Q2NF9NQVggVUlOVDY0X01BWAorIyBkZWZpbmUgX19JTlRfTEVBU1QzMl9NSU4gICBJTlQ2NF9NSU4KKyMgZGVmaW5lIF9fSU5UX0xFQVNUMzJfTUFYICAgSU5UNjRfTUFYCisjIGRlZmluZSBfX1VJTlRfTEVBU1QzMl9NQVggVUlOVDY0X01BWAorIyBkZWZpbmUgX19JTlRfTEVBU1QxNl9NSU4gICBJTlQ2NF9NSU4KKyMgZGVmaW5lIF9fSU5UX0xFQVNUMTZfTUFYICAgSU5UNjRfTUFYCisjIGRlZmluZSBfX1VJTlRfTEVBU1QxNl9NQVggVUlOVDY0X01BWAorIyBkZWZpbmUgX19JTlRfTEVBU1Q4X01JTiAgICBJTlQ2NF9NSU4KKyMgZGVmaW5lIF9fSU5UX0xFQVNUOF9NQVggICAgSU5UNjRfTUFYCisjIGRlZmluZSBfX1VJTlRfTEVBU1Q4X01BWCAgVUlOVDY0X01BWAorI2VuZGlmIC8qIF9fSU5UNjRfVFlQRV9fICovCisKKyNpZmRlZiBfX0lOVF9MRUFTVDY0X01JTgorIyBkZWZpbmUgSU5UX0xFQVNUNjRfTUlOICAgX19JTlRfTEVBU1Q2NF9NSU4KKyMgZGVmaW5lIElOVF9MRUFTVDY0X01BWCAgIF9fSU5UX0xFQVNUNjRfTUFYCisjIGRlZmluZSBVSU5UX0xFQVNUNjRfTUFYIF9fVUlOVF9MRUFTVDY0X01BWAorIyBkZWZpbmUgSU5UX0ZBU1Q2NF9NSU4gICAgX19JTlRfTEVBU1Q2NF9NSU4KKyMgZGVmaW5lIElOVF9GQVNUNjRfTUFYICAgIF9fSU5UX0xFQVNUNjRfTUFYCisjIGRlZmluZSBVSU5UX0ZBU1Q2NF9NQVggIF9fVUlOVF9MRUFTVDY0X01BWAorI2VuZGlmIC8qIF9fSU5UX0xFQVNUNjRfTUlOICovCisKKworI2lmZGVmIF9fSU5UNTZfVFlQRV9fCisjIGRlZmluZSBJTlQ1Nl9NQVggICAgICAgICAgIElOVDU2X0MoMzYwMjg3OTcwMTg5NjM5NjcpCisjIGRlZmluZSBJTlQ1Nl9NSU4gICAgICAgICAoLUlOVDU2X0MoMzYwMjg3OTcwMTg5NjM5NjcpLTEpCisjIGRlZmluZSBVSU5UNTZfTUFYICAgICAgICAgVUlOVDU2X0MoNzIwNTc1OTQwMzc5Mjc5MzUpCisjIGRlZmluZSBJTlRfTEVBU1Q1Nl9NSU4gICAgIElOVDU2X01JTgorIyBkZWZpbmUgSU5UX0xFQVNUNTZfTUFYICAgICBJTlQ1Nl9NQVgKKyMgZGVmaW5lIFVJTlRfTEVBU1Q1Nl9NQVggICBVSU5UNTZfTUFYCisjIGRlZmluZSBJTlRfRkFTVDU2X01JTiAgICAgIElOVDU2X01JTgorIyBkZWZpbmUgSU5UX0ZBU1Q1Nl9NQVggICAgICBJTlQ1Nl9NQVgKKyMgZGVmaW5lIFVJTlRfRkFTVDU2X01BWCAgICBVSU5UNTZfTUFYCisjIGRlZmluZSBfX0lOVF9MRUFTVDMyX01JTiAgIElOVDU2X01JTgorIyBkZWZpbmUgX19JTlRfTEVBU1QzMl9NQVggICBJTlQ1Nl9NQVgKKyMgZGVmaW5lIF9fVUlOVF9MRUFTVDMyX01BWCBVSU5UNTZfTUFYCisjIGRlZmluZSBfX0lOVF9MRUFTVDE2X01JTiAgIElOVDU2X01JTgorIyBkZWZpbmUgX19JTlRfTEVBU1QxNl9NQVggICBJTlQ1Nl9NQVgKKyMgZGVmaW5lIF9fVUlOVF9MRUFTVDE2X01BWCBVSU5UNTZfTUFYCisjIGRlZmluZSBfX0lOVF9MRUFTVDhfTUlOICAgIElOVDU2X01JTgorIyBkZWZpbmUgX19JTlRfTEVBU1Q4X01BWCAgICBJTlQ1Nl9NQVgKKyMgZGVmaW5lIF9fVUlOVF9MRUFTVDhfTUFYICBVSU5UNTZfTUFYCisjZW5kaWYgLyogX19JTlQ1Nl9UWVBFX18gKi8KKworCisjaWZkZWYgX19JTlQ0OF9UWVBFX18KKyMgZGVmaW5lIElOVDQ4X01BWCAgICAgICAgICAgSU5UNDhfQygxNDA3Mzc0ODgzNTUzMjcpCisjIGRlZmluZSBJTlQ0OF9NSU4gICAgICAgICAoLUlOVDQ4X0MoMTQwNzM3NDg4MzU1MzI3KS0xKQorIyBkZWZpbmUgVUlOVDQ4X01BWCAgICAgICAgIFVJTlQ0OF9DKDI4MTQ3NDk3NjcxMDY1NSkKKyMgZGVmaW5lIElOVF9MRUFTVDQ4X01JTiAgICAgSU5UNDhfTUlOCisjIGRlZmluZSBJTlRfTEVBU1Q0OF9NQVggICAgIElOVDQ4X01BWAorIyBkZWZpbmUgVUlOVF9MRUFTVDQ4X01BWCAgIFVJTlQ0OF9NQVgKKyMgZGVmaW5lIElOVF9GQVNUNDhfTUlOICAgICAgSU5UNDhfTUlOCisjIGRlZmluZSBJTlRfRkFTVDQ4X01BWCAgICAgIElOVDQ4X01BWAorIyBkZWZpbmUgVUlOVF9GQVNUNDhfTUFYICAgIFVJTlQ0OF9NQVgKKyMgZGVmaW5lIF9fSU5UX0xFQVNUMzJfTUlOICAgSU5UNDhfTUlOCisjIGRlZmluZSBfX0lOVF9MRUFTVDMyX01BWCAgIElOVDQ4X01BWAorIyBkZWZpbmUgX19VSU5UX0xFQVNUMzJfTUFYIFVJTlQ0OF9NQVgKKyMgZGVmaW5lIF9fSU5UX0xFQVNUMTZfTUlOICAgSU5UNDhfTUlOCisjIGRlZmluZSBfX0lOVF9MRUFTVDE2X01BWCAgIElOVDQ4X01BWAorIyBkZWZpbmUgX19VSU5UX0xFQVNUMTZfTUFYIFVJTlQ0OF9NQVgKKyMgZGVmaW5lIF9fSU5UX0xFQVNUOF9NSU4gICAgSU5UNDhfTUlOCisjIGRlZmluZSBfX0lOVF9MRUFTVDhfTUFYICAgIElOVDQ4X01BWAorIyBkZWZpbmUgX19VSU5UX0xFQVNUOF9NQVggIFVJTlQ0OF9NQVgKKyNlbmRpZiAvKiBfX0lOVDQ4X1RZUEVfXyAqLworCisKKyNpZmRlZiBfX0lOVDQwX1RZUEVfXworIyBkZWZpbmUgSU5UNDBfTUFYICAgICAgICAgICBJTlQ0MF9DKDU0OTc1NTgxMzg4NykKKyMgZGVmaW5lIElOVDQwX01JTiAgICAgICAgICgtSU5UNDBfQyg1NDk3NTU4MTM4ODcpLTEpCisjIGRlZmluZSBVSU5UNDBfTUFYICAgICAgICAgVUlOVDQwX0MoMTA5OTUxMTYyNzc3NSkKKyMgZGVmaW5lIElOVF9MRUFTVDQwX01JTiAgICAgSU5UNDBfTUlOCisjIGRlZmluZSBJTlRfTEVBU1Q0MF9NQVggICAgIElOVDQwX01BWAorIyBkZWZpbmUgVUlOVF9MRUFTVDQwX01BWCAgIFVJTlQ0MF9NQVgKKyMgZGVmaW5lIElOVF9GQVNUNDBfTUlOICAgICAgSU5UNDBfTUlOCisjIGRlZmluZSBJTlRfRkFTVDQwX01BWCAgICAgIElOVDQwX01BWAorIyBkZWZpbmUgVUlOVF9GQVNUNDBfTUFYICAgIFVJTlQ0MF9NQVgKKyMgZGVmaW5lIF9fSU5UX0xFQVNUMzJfTUlOICAgSU5UNDBfTUlOCisjIGRlZmluZSBfX0lOVF9MRUFTVDMyX01BWCAgIElOVDQwX01BWAorIyBkZWZpbmUgX19VSU5UX0xFQVNUMzJfTUFYIFVJTlQ0MF9NQVgKKyMgZGVmaW5lIF9fSU5UX0xFQVNUMTZfTUlOICAgSU5UNDBfTUlOCisjIGRlZmluZSBfX0lOVF9MRUFTVDE2X01BWCAgIElOVDQwX01BWAorIyBkZWZpbmUgX19VSU5UX0xFQVNUMTZfTUFYIFVJTlQ0MF9NQVgKKyMgZGVmaW5lIF9fSU5UX0xFQVNUOF9NSU4gICAgSU5UNDBfTUlOCisjIGRlZmluZSBfX0lOVF9MRUFTVDhfTUFYICAgIElOVDQwX01BWAorIyBkZWZpbmUgX19VSU5UX0xFQVNUOF9NQVggIFVJTlQ0MF9NQVgKKyNlbmRpZiAvKiBfX0lOVDQwX1RZUEVfXyAqLworCisKKyNpZmRlZiBfX0lOVDMyX1RZUEVfXworIyBkZWZpbmUgSU5UMzJfTUFYICAgICAgICAgICBJTlQzMl9DKDIxNDc0ODM2NDcpCisjIGRlZmluZSBJTlQzMl9NSU4gICAgICAgICAoLUlOVDMyX0MoMjE0NzQ4MzY0NyktMSkKKyMgZGVmaW5lIFVJTlQzMl9NQVggICAgICAgICBVSU5UMzJfQyg0Mjk0OTY3Mjk1KQorIyBkZWZpbmUgX19JTlRfTEVBU1QzMl9NSU4gICBJTlQzMl9NSU4KKyMgZGVmaW5lIF9fSU5UX0xFQVNUMzJfTUFYICAgSU5UMzJfTUFYCisjIGRlZmluZSBfX1VJTlRfTEVBU1QzMl9NQVggVUlOVDMyX01BWAorIyBkZWZpbmUgX19JTlRfTEVBU1QxNl9NSU4gICBJTlQzMl9NSU4KKyMgZGVmaW5lIF9fSU5UX0xFQVNUMTZfTUFYICAgSU5UMzJfTUFYCisjIGRlZmluZSBfX1VJTlRfTEVBU1QxNl9NQVggVUlOVDMyX01BWAorIyBkZWZpbmUgX19JTlRfTEVBU1Q4X01JTiAgICBJTlQzMl9NSU4KKyMgZGVmaW5lIF9fSU5UX0xFQVNUOF9NQVggICAgSU5UMzJfTUFYCisjIGRlZmluZSBfX1VJTlRfTEVBU1Q4X01BWCAgVUlOVDMyX01BWAorI2VuZGlmIC8qIF9fSU5UMzJfVFlQRV9fICovCisKKyNpZmRlZiBfX0lOVF9MRUFTVDMyX01JTgorIyBkZWZpbmUgSU5UX0xFQVNUMzJfTUlOICAgX19JTlRfTEVBU1QzMl9NSU4KKyMgZGVmaW5lIElOVF9MRUFTVDMyX01BWCAgIF9fSU5UX0xFQVNUMzJfTUFYCisjIGRlZmluZSBVSU5UX0xFQVNUMzJfTUFYIF9fVUlOVF9MRUFTVDMyX01BWAorIyBkZWZpbmUgSU5UX0ZBU1QzMl9NSU4gICAgX19JTlRfTEVBU1QzMl9NSU4KKyMgZGVmaW5lIElOVF9GQVNUMzJfTUFYICAgIF9fSU5UX0xFQVNUMzJfTUFYCisjIGRlZmluZSBVSU5UX0ZBU1QzMl9NQVggIF9fVUlOVF9MRUFTVDMyX01BWAorI2VuZGlmIC8qIF9fSU5UX0xFQVNUMzJfTUlOICovCisKKworI2lmZGVmIF9fSU5UMjRfVFlQRV9fCisjIGRlZmluZSBJTlQyNF9NQVggICAgICAgICAgIElOVDI0X0MoODM4ODYwNykKKyMgZGVmaW5lIElOVDI0X01JTiAgICAgICAgICgtSU5UMjRfQyg4Mzg4NjA3KS0xKQorIyBkZWZpbmUgVUlOVDI0X01BWCAgICAgICAgIFVJTlQyNF9DKDE2Nzc3MjE1KQorIyBkZWZpbmUgSU5UX0xFQVNUMjRfTUlOICAgICBJTlQyNF9NSU4KKyMgZGVmaW5lIElOVF9MRUFTVDI0X01BWCAgICAgSU5UMjRfTUFYCisjIGRlZmluZSBVSU5UX0xFQVNUMjRfTUFYICAgVUlOVDI0X01BWAorIyBkZWZpbmUgSU5UX0ZBU1QyNF9NSU4gICAgICBJTlQyNF9NSU4KKyMgZGVmaW5lIElOVF9GQVNUMjRfTUFYICAgICAgSU5UMjRfTUFYCisjIGRlZmluZSBVSU5UX0ZBU1QyNF9NQVggICAgVUlOVDI0X01BWAorIyBkZWZpbmUgX19JTlRfTEVBU1QxNl9NSU4gICBJTlQyNF9NSU4KKyMgZGVmaW5lIF9fSU5UX0xFQVNUMTZfTUFYICAgSU5UMjRfTUFYCisjIGRlZmluZSBfX1VJTlRfTEVBU1QxNl9NQVggVUlOVDI0X01BWAorIyBkZWZpbmUgX19JTlRfTEVBU1Q4X01JTiAgICBJTlQyNF9NSU4KKyMgZGVmaW5lIF9fSU5UX0xFQVNUOF9NQVggICAgSU5UMjRfTUFYCisjIGRlZmluZSBfX1VJTlRfTEVBU1Q4X01BWCAgVUlOVDI0X01BWAorI2VuZGlmIC8qIF9fSU5UMjRfVFlQRV9fICovCisKKworI2lmZGVmIF9fSU5UMTZfVFlQRV9fCisjZGVmaW5lIElOVDE2X01BWCAgICAgICAgICAgIElOVDE2X0MoMzI3NjcpCisjZGVmaW5lIElOVDE2X01JTiAgICAgICAgICAoLUlOVDE2X0MoMzI3NjcpLTEpCisjZGVmaW5lIFVJTlQxNl9NQVggICAgICAgICAgVUlOVDE2X0MoNjU1MzUpCisjIGRlZmluZSBfX0lOVF9MRUFTVDE2X01JTiAgIElOVDE2X01JTgorIyBkZWZpbmUgX19JTlRfTEVBU1QxNl9NQVggICBJTlQxNl9NQVgKKyMgZGVmaW5lIF9fVUlOVF9MRUFTVDE2X01BWCBVSU5UMTZfTUFYCisjIGRlZmluZSBfX0lOVF9MRUFTVDhfTUlOICAgIElOVDE2X01JTgorIyBkZWZpbmUgX19JTlRfTEVBU1Q4X01BWCAgICBJTlQxNl9NQVgKKyMgZGVmaW5lIF9fVUlOVF9MRUFTVDhfTUFYICBVSU5UMTZfTUFYCisjZW5kaWYgLyogX19JTlQxNl9UWVBFX18gKi8KKworI2lmZGVmIF9fSU5UX0xFQVNUMTZfTUlOCisjIGRlZmluZSBJTlRfTEVBU1QxNl9NSU4gICBfX0lOVF9MRUFTVDE2X01JTgorIyBkZWZpbmUgSU5UX0xFQVNUMTZfTUFYICAgX19JTlRfTEVBU1QxNl9NQVgKKyMgZGVmaW5lIFVJTlRfTEVBU1QxNl9NQVggX19VSU5UX0xFQVNUMTZfTUFYCisjIGRlZmluZSBJTlRfRkFTVDE2X01JTiAgICBfX0lOVF9MRUFTVDE2X01JTgorIyBkZWZpbmUgSU5UX0ZBU1QxNl9NQVggICAgX19JTlRfTEVBU1QxNl9NQVgKKyMgZGVmaW5lIFVJTlRfRkFTVDE2X01BWCAgX19VSU5UX0xFQVNUMTZfTUFYCisjZW5kaWYgLyogX19JTlRfTEVBU1QxNl9NSU4gKi8KKworCisjaWZkZWYgX19JTlQ4X1RZUEVfXworIyBkZWZpbmUgSU5UOF9NQVggICAgICAgICAgICBJTlQ4X0MoMTI3KQorIyBkZWZpbmUgSU5UOF9NSU4gICAgICAgICAgKC1JTlQ4X0MoMTI3KS0xKQorIyBkZWZpbmUgVUlOVDhfTUFYICAgICAgICAgIFVJTlQ4X0MoMjU1KQorIyBkZWZpbmUgX19JTlRfTEVBU1Q4X01JTiAgICBJTlQ4X01JTgorIyBkZWZpbmUgX19JTlRfTEVBU1Q4X01BWCAgICBJTlQ4X01BWAorIyBkZWZpbmUgX19VSU5UX0xFQVNUOF9NQVggIFVJTlQ4X01BWAorI2VuZGlmIC8qIF9fSU5UOF9UWVBFX18gKi8KKworI2lmZGVmIF9fSU5UX0xFQVNUOF9NSU4KKyMgZGVmaW5lIElOVF9MRUFTVDhfTUlOICAgX19JTlRfTEVBU1Q4X01JTgorIyBkZWZpbmUgSU5UX0xFQVNUOF9NQVggICBfX0lOVF9MRUFTVDhfTUFYCisjIGRlZmluZSBVSU5UX0xFQVNUOF9NQVggX19VSU5UX0xFQVNUOF9NQVgKKyMgZGVmaW5lIElOVF9GQVNUOF9NSU4gICAgX19JTlRfTEVBU1Q4X01JTgorIyBkZWZpbmUgSU5UX0ZBU1Q4X01BWCAgICBfX0lOVF9MRUFTVDhfTUFYCisjIGRlZmluZSBVSU5UX0ZBU1Q4X01BWCAgX19VSU5UX0xFQVNUOF9NQVgKKyNlbmRpZiAvKiBfX0lOVF9MRUFTVDhfTUlOICovCisKKy8qIFNvbWUgdXRpbGl0eSBtYWNyb3MgKi8KKyNkZWZpbmUgIF9fSU5UTl9NSU4obikgIF9fc3RkaW50X2pvaW4zKCBJTlQsIG4sIF9NSU4pCisjZGVmaW5lICBfX0lOVE5fTUFYKG4pICBfX3N0ZGludF9qb2luMyggSU5ULCBuLCBfTUFYKQorI2RlZmluZSBfX1VJTlROX01BWChuKSAgX19zdGRpbnRfam9pbjMoVUlOVCwgbiwgX01BWCkKKyNkZWZpbmUgIF9fSU5UTl9DKG4sIHYpIF9fc3RkaW50X2pvaW4zKCBJTlQsIG4sIF9DKHYpKQorI2RlZmluZSBfX1VJTlROX0MobiwgdikgX19zdGRpbnRfam9pbjMoVUlOVCwgbiwgX0ModikpCisKKy8qIEM5OSA3LjE4LjIuNCBMaW1pdHMgb2YgaW50ZWdlciB0eXBlcyBjYXBhYmxlIG9mIGhvbGRpbmcgb2JqZWN0IHBvaW50ZXJzLiAqLworLyogQzk5IDcuMTguMyBMaW1pdHMgb2Ygb3RoZXIgaW50ZWdlciB0eXBlcy4gKi8KKworI2RlZmluZSAgSU5UUFRSX01JTiAgX19JTlROX01JTihfX0lOVFBUUl9XSURUSF9fKQorI2RlZmluZSAgSU5UUFRSX01BWCAgX19JTlROX01BWChfX0lOVFBUUl9XSURUSF9fKQorI2RlZmluZSBVSU5UUFRSX01BWCBfX1VJTlROX01BWChfX0lOVFBUUl9XSURUSF9fKQorI2RlZmluZSBQVFJESUZGX01JTiAgX19JTlROX01JTihfX1BUUkRJRkZfV0lEVEhfXykKKyNkZWZpbmUgUFRSRElGRl9NQVggIF9fSU5UTl9NQVgoX19QVFJESUZGX1dJRFRIX18pCisjZGVmaW5lICAgIFNJWkVfTUFYIF9fVUlOVE5fTUFYKF9fU0laRV9XSURUSF9fKQorCisvKiBJU085ODk5OjIwMTEgNy4yMCAoQzExIEFubmV4IEspOiBEZWZpbmUgUlNJWkVfTUFYIGlmIF9fU1REQ19XQU5UX0xJQl9FWFQxX18KKyAqIGlzIGVuYWJsZWQuICovCisjaWYgZGVmaW5lZChfX1NURENfV0FOVF9MSUJfRVhUMV9fKSAmJiBfX1NURENfV0FOVF9MSUJfRVhUMV9fID49IDEKKyNkZWZpbmUgICBSU0laRV9NQVggICAgICAgICAgICAoU0laRV9NQVggPj4gMSkKKyNlbmRpZgorCisvKiBDOTkgNy4xOC4yLjUgTGltaXRzIG9mIGdyZWF0ZXN0LXdpZHRoIGludGVnZXIgdHlwZXMuICovCisjZGVmaW5lIElOVE1BWF9NSU4gICBfX0lOVE5fTUlOKF9fSU5UTUFYX1dJRFRIX18pCisjZGVmaW5lIElOVE1BWF9NQVggICBfX0lOVE5fTUFYKF9fSU5UTUFYX1dJRFRIX18pCisjZGVmaW5lIFVJTlRNQVhfTUFYIF9fVUlOVE5fTUFYKF9fSU5UTUFYX1dJRFRIX18pCisKKy8qIEM5OSA3LjE4LjMgTGltaXRzIG9mIG90aGVyIGludGVnZXIgdHlwZXMuICovCisjZGVmaW5lIFNJR19BVE9NSUNfTUlOIF9fSU5UTl9NSU4oX19TSUdfQVRPTUlDX1dJRFRIX18pCisjZGVmaW5lIFNJR19BVE9NSUNfTUFYIF9fSU5UTl9NQVgoX19TSUdfQVRPTUlDX1dJRFRIX18pCisjaWZkZWYgX19XSU5UX1VOU0lHTkVEX18KKyMgZGVmaW5lIFdJTlRfTUlOICAgICAgIF9fVUlOVE5fQyhfX1dJTlRfV0lEVEhfXywgMCkKKyMgZGVmaW5lIFdJTlRfTUFYICAgICAgIF9fVUlOVE5fTUFYKF9fV0lOVF9XSURUSF9fKQorI2Vsc2UKKyMgZGVmaW5lIFdJTlRfTUlOICAgICAgIF9fSU5UTl9NSU4oX19XSU5UX1dJRFRIX18pCisjIGRlZmluZSBXSU5UX01BWCAgICAgICBfX0lOVE5fTUFYKF9fV0lOVF9XSURUSF9fKQorI2VuZGlmCisKKyNpZm5kZWYgV0NIQVJfTUFYCisjIGRlZmluZSBXQ0hBUl9NQVggX19XQ0hBUl9NQVhfXworI2VuZGlmCisjaWZuZGVmIFdDSEFSX01JTgorIyBpZiBfX1dDSEFSX01BWF9fID09IF9fSU5UTl9NQVgoX19XQ0hBUl9XSURUSF9fKQorIyAgZGVmaW5lIFdDSEFSX01JTiBfX0lOVE5fTUlOKF9fV0NIQVJfV0lEVEhfXykKKyMgZWxzZQorIyAgZGVmaW5lIFdDSEFSX01JTiBfX1VJTlROX0MoX19XQ0hBUl9XSURUSF9fLCAwKQorIyBlbmRpZgorI2VuZGlmCisKKy8qIDcuMTguNC4yIE1hY3JvcyBmb3IgZ3JlYXRlc3Qtd2lkdGggaW50ZWdlciBjb25zdGFudHMuICovCisjZGVmaW5lIElOVE1BWF9DKHYpICAgX19JTlROX0MoX19JTlRNQVhfV0lEVEhfXywgdikKKyNkZWZpbmUgVUlOVE1BWF9DKHYpIF9fVUlOVE5fQyhfX0lOVE1BWF9XSURUSF9fLCB2KQorCisjZW5kaWYgLyogX19TVERDX0hPU1RFRF9fICovCisjZW5kaWYgLyogX19DTEFOR19TVERJTlRfSCAqLwpkaWZmIC0tZ2l0IGEvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvc3Rkbm9yZXR1cm4uaCBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL3N0ZG5vcmV0dXJuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdhMzAxZAotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL3N0ZG5vcmV0dXJuLmgKQEAgLTAsMCArMSwzMCBAQAorLyo9PT0tLS0tIHN0ZG5vcmV0dXJuLmggLSBTdGFuZGFyZCBoZWFkZXIgZm9yIG5vcmV0dXJuIG1hY3JvIC0tLS0tLS0tLS0tLS0tLT09PQorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqCisgKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisgKi8KKworI2lmbmRlZiBfX1NURE5PUkVUVVJOX0gKKyNkZWZpbmUgX19TVEROT1JFVFVSTl9ICisKKyNkZWZpbmUgbm9yZXR1cm4gX05vcmV0dXJuCisjZGVmaW5lIF9fbm9yZXR1cm5faXNfZGVmaW5lZCAxCisKKyNlbmRpZiAvKiBfX1NURE5PUkVUVVJOX0ggKi8KZGlmZiAtLWdpdCBhL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL3RibWludHJpbi5oIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvdGJtaW50cmluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQwZDc0NgotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL3RibWludHJpbi5oCkBAIC0wLDAgKzEsMTU0IEBACisvKj09PS0tLS0gdGJtaW50cmluLmggLSBUQk0gaW50cmluc2ljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICoKKyAqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqLworCisjaWZuZGVmIF9fWDg2SU5UUklOX0gKKyNlcnJvciAiTmV2ZXIgdXNlIDx0Ym1pbnRyaW4uaD4gZGlyZWN0bHk7IGluY2x1ZGUgPHg4NmludHJpbi5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9fVEJNSU5UUklOX0gKKyNkZWZpbmUgX19UQk1JTlRSSU5fSAorCisvKiBEZWZpbmUgdGhlIGRlZmF1bHQgYXR0cmlidXRlcyBmb3IgdGhlIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUuICovCisjZGVmaW5lIF9fREVGQVVMVF9GTl9BVFRSUyBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18sIF9fdGFyZ2V0X18oInRibSIpKSkKKworI2RlZmluZSBfX2JleHRyaV91MzIoYSwgYikgXAorICAoKHVuc2lnbmVkIGludClfX2J1aWx0aW5faWEzMl9iZXh0cmlfdTMyKCh1bnNpZ25lZCBpbnQpKGEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCkoYikpKQorCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQgX19ERUZBVUxUX0ZOX0FUVFJTCitfX2JsY2ZpbGxfdTMyKHVuc2lnbmVkIGludCBfX2EpCit7CisgIHJldHVybiBfX2EgJiAoX19hICsgMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludCBfX0RFRkFVTFRfRk5fQVRUUlMKK19fYmxjaV91MzIodW5zaWduZWQgaW50IF9fYSkKK3sKKyAgcmV0dXJuIF9fYSB8IH4oX19hICsgMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludCBfX0RFRkFVTFRfRk5fQVRUUlMKK19fYmxjaWNfdTMyKHVuc2lnbmVkIGludCBfX2EpCit7CisgIHJldHVybiB+X19hICYgKF9fYSArIDEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQgX19ERUZBVUxUX0ZOX0FUVFJTCitfX2JsY21za191MzIodW5zaWduZWQgaW50IF9fYSkKK3sKKyAgcmV0dXJuIF9fYSBeIChfX2EgKyAxKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50IF9fREVGQVVMVF9GTl9BVFRSUworX19ibGNzX3UzMih1bnNpZ25lZCBpbnQgX19hKQoreworICByZXR1cm4gX19hIHwgKF9fYSArIDEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQgX19ERUZBVUxUX0ZOX0FUVFJTCitfX2Jsc2ZpbGxfdTMyKHVuc2lnbmVkIGludCBfX2EpCit7CisgIHJldHVybiBfX2EgfCAoX19hIC0gMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludCBfX0RFRkFVTFRfRk5fQVRUUlMKK19fYmxzaWNfdTMyKHVuc2lnbmVkIGludCBfX2EpCit7CisgIHJldHVybiB+X19hIHwgKF9fYSAtIDEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQgX19ERUZBVUxUX0ZOX0FUVFJTCitfX3QxbXNrY191MzIodW5zaWduZWQgaW50IF9fYSkKK3sKKyAgcmV0dXJuIH5fX2EgfCAoX19hICsgMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludCBfX0RFRkFVTFRfRk5fQVRUUlMKK19fdHptc2tfdTMyKHVuc2lnbmVkIGludCBfX2EpCit7CisgIHJldHVybiB+X19hICYgKF9fYSAtIDEpOworfQorCisjaWZkZWYgX194ODZfNjRfXworI2RlZmluZSBfX2JleHRyaV91NjQoYSwgYikgXAorICAoKHVuc2lnbmVkIGxvbmcgbG9uZylfX2J1aWx0aW5faWEzMl9iZXh0cmlfdTY0KCh1bnNpZ25lZCBsb25nIGxvbmcpKGEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykoYikpKQorCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nIGxvbmcgX19ERUZBVUxUX0ZOX0FUVFJTCitfX2JsY2ZpbGxfdTY0KHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EpCit7CisgIHJldHVybiBfX2EgJiAoX19hICsgMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcgbG9uZyBfX0RFRkFVTFRfRk5fQVRUUlMKK19fYmxjaV91NjQodW5zaWduZWQgbG9uZyBsb25nIF9fYSkKK3sKKyAgcmV0dXJuIF9fYSB8IH4oX19hICsgMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcgbG9uZyBfX0RFRkFVTFRfRk5fQVRUUlMKK19fYmxjaWNfdTY0KHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EpCit7CisgIHJldHVybiB+X19hICYgKF9fYSArIDEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nIGxvbmcgX19ERUZBVUxUX0ZOX0FUVFJTCitfX2JsY21za191NjQodW5zaWduZWQgbG9uZyBsb25nIF9fYSkKK3sKKyAgcmV0dXJuIF9fYSBeIChfX2EgKyAxKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZyBsb25nIF9fREVGQVVMVF9GTl9BVFRSUworX19ibGNzX3U2NCh1bnNpZ25lZCBsb25nIGxvbmcgX19hKQoreworICByZXR1cm4gX19hIHwgKF9fYSArIDEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nIGxvbmcgX19ERUZBVUxUX0ZOX0FUVFJTCitfX2Jsc2ZpbGxfdTY0KHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EpCit7CisgIHJldHVybiBfX2EgfCAoX19hIC0gMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcgbG9uZyBfX0RFRkFVTFRfRk5fQVRUUlMKK19fYmxzaWNfdTY0KHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EpCit7CisgIHJldHVybiB+X19hIHwgKF9fYSAtIDEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nIGxvbmcgX19ERUZBVUxUX0ZOX0FUVFJTCitfX3QxbXNrY191NjQodW5zaWduZWQgbG9uZyBsb25nIF9fYSkKK3sKKyAgcmV0dXJuIH5fX2EgfCAoX19hICsgMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcgbG9uZyBfX0RFRkFVTFRfRk5fQVRUUlMKK19fdHptc2tfdTY0KHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EpCit7CisgIHJldHVybiB+X19hICYgKF9fYSAtIDEpOworfQorI2VuZGlmCisKKyN1bmRlZiBfX0RFRkFVTFRfRk5fQVRUUlMKKworI2VuZGlmIC8qIF9fVEJNSU5UUklOX0ggKi8KZGlmZiAtLWdpdCBhL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL3RnbWF0aC5oIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvdGdtYXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE4ZTExOAotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL3RnbWF0aC5oCkBAIC0wLDAgKzEsMTM3NCBAQAorLyo9PT0tLS0tIHRnbWF0aC5oIC0gU3RhbmRhcmQgaGVhZGVyIGZvciB0eXBlIGdlbmVyaWMgbWF0aCAtLS0tLS0tLS0tLS0tLS0tPT09KlwKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSG93YXJkIEhpbm5hbnQKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKgorXCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ki8KKworI2lmbmRlZiBfX1RHTUFUSF9ICisjZGVmaW5lIF9fVEdNQVRIX0gKKworLyogQzk5IDcuMjIgVHlwZS1nZW5lcmljIG1hdGggPHRnbWF0aC5oPi4gKi8KKyNpbmNsdWRlIDxtYXRoLmg+CisKKy8qIEMrKyBoYW5kbGVzIHR5cGUgZ2VuZXJpY2l0eSB3aXRoIG92ZXJsb2FkaW5nIGluIG1hdGguaC4gKi8KKyNpZm5kZWYgX19jcGx1c3BsdXMKKyNpbmNsdWRlIDxjb21wbGV4Lmg+CisKKyNkZWZpbmUgX1RHX0FUVFJTcCBfX2F0dHJpYnV0ZV9fKChfX292ZXJsb2FkYWJsZV9fKSkKKyNkZWZpbmUgX1RHX0FUVFJTIF9fYXR0cmlidXRlX18oKF9fb3ZlcmxvYWRhYmxlX18sIF9fYWx3YXlzX2lubGluZV9fKSkKKworLy8gcHJvbW90aW9uCisKK3R5cGVkZWYgdm9pZCBfQXJndW1lbnRfdHlwZV9pc19ub3RfYXJpdGhtZXRpYzsKK3N0YXRpYyBfQXJndW1lbnRfdHlwZV9pc19ub3RfYXJpdGhtZXRpYyBfX3RnX3Byb21vdGUoLi4uKQorICBfX2F0dHJpYnV0ZV9fKChfX3VuYXZhaWxhYmxlX18sX19vdmVybG9hZGFibGVfXykpOworc3RhdGljIGRvdWJsZSAgICAgICAgICAgICAgIF9UR19BVFRSU3AgX190Z19wcm9tb3RlKGludCk7CitzdGF0aWMgZG91YmxlICAgICAgICAgICAgICAgX1RHX0FUVFJTcCBfX3RnX3Byb21vdGUodW5zaWduZWQgaW50KTsKK3N0YXRpYyBkb3VibGUgICAgICAgICAgICAgICBfVEdfQVRUUlNwIF9fdGdfcHJvbW90ZShsb25nKTsKK3N0YXRpYyBkb3VibGUgICAgICAgICAgICAgICBfVEdfQVRUUlNwIF9fdGdfcHJvbW90ZSh1bnNpZ25lZCBsb25nKTsKK3N0YXRpYyBkb3VibGUgICAgICAgICAgICAgICBfVEdfQVRUUlNwIF9fdGdfcHJvbW90ZShsb25nIGxvbmcpOworc3RhdGljIGRvdWJsZSAgICAgICAgICAgICAgIF9UR19BVFRSU3AgX190Z19wcm9tb3RlKHVuc2lnbmVkIGxvbmcgbG9uZyk7CitzdGF0aWMgZmxvYXQgICAgICAgICAgICAgICAgX1RHX0FUVFJTcCBfX3RnX3Byb21vdGUoZmxvYXQpOworc3RhdGljIGRvdWJsZSAgICAgICAgICAgICAgIF9UR19BVFRSU3AgX190Z19wcm9tb3RlKGRvdWJsZSk7CitzdGF0aWMgbG9uZyBkb3VibGUgICAgICAgICAgX1RHX0FUVFJTcCBfX3RnX3Byb21vdGUobG9uZyBkb3VibGUpOworc3RhdGljIGZsb2F0IF9Db21wbGV4ICAgICAgIF9UR19BVFRSU3AgX190Z19wcm9tb3RlKGZsb2F0IF9Db21wbGV4KTsKK3N0YXRpYyBkb3VibGUgX0NvbXBsZXggICAgICBfVEdfQVRUUlNwIF9fdGdfcHJvbW90ZShkb3VibGUgX0NvbXBsZXgpOworc3RhdGljIGxvbmcgZG91YmxlIF9Db21wbGV4IF9UR19BVFRSU3AgX190Z19wcm9tb3RlKGxvbmcgZG91YmxlIF9Db21wbGV4KTsKKworI2RlZmluZSBfX3RnX3Byb21vdGUxKF9feCkgICAgICAgICAgIChfX3R5cGVvZl9fKF9fdGdfcHJvbW90ZShfX3gpKSkKKyNkZWZpbmUgX190Z19wcm9tb3RlMihfX3gsIF9feSkgICAgICAoX190eXBlb2ZfXyhfX3RnX3Byb21vdGUoX194KSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3RnX3Byb21vdGUoX195KSkpCisjZGVmaW5lIF9fdGdfcHJvbW90ZTMoX194LCBfX3ksIF9feikgKF9fdHlwZW9mX18oX190Z19wcm9tb3RlKF9feCkgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX190Z19wcm9tb3RlKF9feSkgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX190Z19wcm9tb3RlKF9feikpKQorCisvLyBhY29zCisKK3N0YXRpYyBmbG9hdAorICAgIF9UR19BVFRSUworICAgIF9fdGdfYWNvcyhmbG9hdCBfX3gpIHtyZXR1cm4gYWNvc2YoX194KTt9CisKK3N0YXRpYyBkb3VibGUKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2Fjb3MoZG91YmxlIF9feCkge3JldHVybiBhY29zKF9feCk7fQorCitzdGF0aWMgbG9uZyBkb3VibGUKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2Fjb3MobG9uZyBkb3VibGUgX194KSB7cmV0dXJuIGFjb3NsKF9feCk7fQorCitzdGF0aWMgZmxvYXQgX0NvbXBsZXgKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2Fjb3MoZmxvYXQgX0NvbXBsZXggX194KSB7cmV0dXJuIGNhY29zZihfX3gpO30KKworc3RhdGljIGRvdWJsZSBfQ29tcGxleAorICAgIF9UR19BVFRSUworICAgIF9fdGdfYWNvcyhkb3VibGUgX0NvbXBsZXggX194KSB7cmV0dXJuIGNhY29zKF9feCk7fQorCitzdGF0aWMgbG9uZyBkb3VibGUgX0NvbXBsZXgKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2Fjb3MobG9uZyBkb3VibGUgX0NvbXBsZXggX194KSB7cmV0dXJuIGNhY29zbChfX3gpO30KKworI3VuZGVmIGFjb3MKKyNkZWZpbmUgYWNvcyhfX3gpIF9fdGdfYWNvcyhfX3RnX3Byb21vdGUxKChfX3gpKShfX3gpKQorCisvLyBhc2luCisKK3N0YXRpYyBmbG9hdAorICAgIF9UR19BVFRSUworICAgIF9fdGdfYXNpbihmbG9hdCBfX3gpIHtyZXR1cm4gYXNpbmYoX194KTt9CisKK3N0YXRpYyBkb3VibGUKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2FzaW4oZG91YmxlIF9feCkge3JldHVybiBhc2luKF9feCk7fQorCitzdGF0aWMgbG9uZyBkb3VibGUKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2FzaW4obG9uZyBkb3VibGUgX194KSB7cmV0dXJuIGFzaW5sKF9feCk7fQorCitzdGF0aWMgZmxvYXQgX0NvbXBsZXgKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2FzaW4oZmxvYXQgX0NvbXBsZXggX194KSB7cmV0dXJuIGNhc2luZihfX3gpO30KKworc3RhdGljIGRvdWJsZSBfQ29tcGxleAorICAgIF9UR19BVFRSUworICAgIF9fdGdfYXNpbihkb3VibGUgX0NvbXBsZXggX194KSB7cmV0dXJuIGNhc2luKF9feCk7fQorCitzdGF0aWMgbG9uZyBkb3VibGUgX0NvbXBsZXgKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2FzaW4obG9uZyBkb3VibGUgX0NvbXBsZXggX194KSB7cmV0dXJuIGNhc2lubChfX3gpO30KKworI3VuZGVmIGFzaW4KKyNkZWZpbmUgYXNpbihfX3gpIF9fdGdfYXNpbihfX3RnX3Byb21vdGUxKChfX3gpKShfX3gpKQorCisvLyBhdGFuCisKK3N0YXRpYyBmbG9hdAorICAgIF9UR19BVFRSUworICAgIF9fdGdfYXRhbihmbG9hdCBfX3gpIHtyZXR1cm4gYXRhbmYoX194KTt9CisKK3N0YXRpYyBkb3VibGUKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2F0YW4oZG91YmxlIF9feCkge3JldHVybiBhdGFuKF9feCk7fQorCitzdGF0aWMgbG9uZyBkb3VibGUKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2F0YW4obG9uZyBkb3VibGUgX194KSB7cmV0dXJuIGF0YW5sKF9feCk7fQorCitzdGF0aWMgZmxvYXQgX0NvbXBsZXgKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2F0YW4oZmxvYXQgX0NvbXBsZXggX194KSB7cmV0dXJuIGNhdGFuZihfX3gpO30KKworc3RhdGljIGRvdWJsZSBfQ29tcGxleAorICAgIF9UR19BVFRSUworICAgIF9fdGdfYXRhbihkb3VibGUgX0NvbXBsZXggX194KSB7cmV0dXJuIGNhdGFuKF9feCk7fQorCitzdGF0aWMgbG9uZyBkb3VibGUgX0NvbXBsZXgKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2F0YW4obG9uZyBkb3VibGUgX0NvbXBsZXggX194KSB7cmV0dXJuIGNhdGFubChfX3gpO30KKworI3VuZGVmIGF0YW4KKyNkZWZpbmUgYXRhbihfX3gpIF9fdGdfYXRhbihfX3RnX3Byb21vdGUxKChfX3gpKShfX3gpKQorCisvLyBhY29zaAorCitzdGF0aWMgZmxvYXQKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2Fjb3NoKGZsb2F0IF9feCkge3JldHVybiBhY29zaGYoX194KTt9CisKK3N0YXRpYyBkb3VibGUKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2Fjb3NoKGRvdWJsZSBfX3gpIHtyZXR1cm4gYWNvc2goX194KTt9CisKK3N0YXRpYyBsb25nIGRvdWJsZQorICAgIF9UR19BVFRSUworICAgIF9fdGdfYWNvc2gobG9uZyBkb3VibGUgX194KSB7cmV0dXJuIGFjb3NobChfX3gpO30KKworc3RhdGljIGZsb2F0IF9Db21wbGV4CisgICAgX1RHX0FUVFJTCisgICAgX190Z19hY29zaChmbG9hdCBfQ29tcGxleCBfX3gpIHtyZXR1cm4gY2Fjb3NoZihfX3gpO30KKworc3RhdGljIGRvdWJsZSBfQ29tcGxleAorICAgIF9UR19BVFRSUworICAgIF9fdGdfYWNvc2goZG91YmxlIF9Db21wbGV4IF9feCkge3JldHVybiBjYWNvc2goX194KTt9CisKK3N0YXRpYyBsb25nIGRvdWJsZSBfQ29tcGxleAorICAgIF9UR19BVFRSUworICAgIF9fdGdfYWNvc2gobG9uZyBkb3VibGUgX0NvbXBsZXggX194KSB7cmV0dXJuIGNhY29zaGwoX194KTt9CisKKyN1bmRlZiBhY29zaAorI2RlZmluZSBhY29zaChfX3gpIF9fdGdfYWNvc2goX190Z19wcm9tb3RlMSgoX194KSkoX194KSkKKworLy8gYXNpbmgKKworc3RhdGljIGZsb2F0CisgICAgX1RHX0FUVFJTCisgICAgX190Z19hc2luaChmbG9hdCBfX3gpIHtyZXR1cm4gYXNpbmhmKF9feCk7fQorCitzdGF0aWMgZG91YmxlCisgICAgX1RHX0FUVFJTCisgICAgX190Z19hc2luaChkb3VibGUgX194KSB7cmV0dXJuIGFzaW5oKF9feCk7fQorCitzdGF0aWMgbG9uZyBkb3VibGUKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2FzaW5oKGxvbmcgZG91YmxlIF9feCkge3JldHVybiBhc2luaGwoX194KTt9CisKK3N0YXRpYyBmbG9hdCBfQ29tcGxleAorICAgIF9UR19BVFRSUworICAgIF9fdGdfYXNpbmgoZmxvYXQgX0NvbXBsZXggX194KSB7cmV0dXJuIGNhc2luaGYoX194KTt9CisKK3N0YXRpYyBkb3VibGUgX0NvbXBsZXgKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2FzaW5oKGRvdWJsZSBfQ29tcGxleCBfX3gpIHtyZXR1cm4gY2FzaW5oKF9feCk7fQorCitzdGF0aWMgbG9uZyBkb3VibGUgX0NvbXBsZXgKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2FzaW5oKGxvbmcgZG91YmxlIF9Db21wbGV4IF9feCkge3JldHVybiBjYXNpbmhsKF9feCk7fQorCisjdW5kZWYgYXNpbmgKKyNkZWZpbmUgYXNpbmgoX194KSBfX3RnX2FzaW5oKF9fdGdfcHJvbW90ZTEoKF9feCkpKF9feCkpCisKKy8vIGF0YW5oCisKK3N0YXRpYyBmbG9hdAorICAgIF9UR19BVFRSUworICAgIF9fdGdfYXRhbmgoZmxvYXQgX194KSB7cmV0dXJuIGF0YW5oZihfX3gpO30KKworc3RhdGljIGRvdWJsZQorICAgIF9UR19BVFRSUworICAgIF9fdGdfYXRhbmgoZG91YmxlIF9feCkge3JldHVybiBhdGFuaChfX3gpO30KKworc3RhdGljIGxvbmcgZG91YmxlCisgICAgX1RHX0FUVFJTCisgICAgX190Z19hdGFuaChsb25nIGRvdWJsZSBfX3gpIHtyZXR1cm4gYXRhbmhsKF9feCk7fQorCitzdGF0aWMgZmxvYXQgX0NvbXBsZXgKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2F0YW5oKGZsb2F0IF9Db21wbGV4IF9feCkge3JldHVybiBjYXRhbmhmKF9feCk7fQorCitzdGF0aWMgZG91YmxlIF9Db21wbGV4CisgICAgX1RHX0FUVFJTCisgICAgX190Z19hdGFuaChkb3VibGUgX0NvbXBsZXggX194KSB7cmV0dXJuIGNhdGFuaChfX3gpO30KKworc3RhdGljIGxvbmcgZG91YmxlIF9Db21wbGV4CisgICAgX1RHX0FUVFJTCisgICAgX190Z19hdGFuaChsb25nIGRvdWJsZSBfQ29tcGxleCBfX3gpIHtyZXR1cm4gY2F0YW5obChfX3gpO30KKworI3VuZGVmIGF0YW5oCisjZGVmaW5lIGF0YW5oKF9feCkgX190Z19hdGFuaChfX3RnX3Byb21vdGUxKChfX3gpKShfX3gpKQorCisvLyBjb3MKKworc3RhdGljIGZsb2F0CisgICAgX1RHX0FUVFJTCisgICAgX190Z19jb3MoZmxvYXQgX194KSB7cmV0dXJuIGNvc2YoX194KTt9CisKK3N0YXRpYyBkb3VibGUKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2Nvcyhkb3VibGUgX194KSB7cmV0dXJuIGNvcyhfX3gpO30KKworc3RhdGljIGxvbmcgZG91YmxlCisgICAgX1RHX0FUVFJTCisgICAgX190Z19jb3MobG9uZyBkb3VibGUgX194KSB7cmV0dXJuIGNvc2woX194KTt9CisKK3N0YXRpYyBmbG9hdCBfQ29tcGxleAorICAgIF9UR19BVFRSUworICAgIF9fdGdfY29zKGZsb2F0IF9Db21wbGV4IF9feCkge3JldHVybiBjY29zZihfX3gpO30KKworc3RhdGljIGRvdWJsZSBfQ29tcGxleAorICAgIF9UR19BVFRSUworICAgIF9fdGdfY29zKGRvdWJsZSBfQ29tcGxleCBfX3gpIHtyZXR1cm4gY2NvcyhfX3gpO30KKworc3RhdGljIGxvbmcgZG91YmxlIF9Db21wbGV4CisgICAgX1RHX0FUVFJTCisgICAgX190Z19jb3MobG9uZyBkb3VibGUgX0NvbXBsZXggX194KSB7cmV0dXJuIGNjb3NsKF9feCk7fQorCisjdW5kZWYgY29zCisjZGVmaW5lIGNvcyhfX3gpIF9fdGdfY29zKF9fdGdfcHJvbW90ZTEoKF9feCkpKF9feCkpCisKKy8vIHNpbgorCitzdGF0aWMgZmxvYXQKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX3NpbihmbG9hdCBfX3gpIHtyZXR1cm4gc2luZihfX3gpO30KKworc3RhdGljIGRvdWJsZQorICAgIF9UR19BVFRSUworICAgIF9fdGdfc2luKGRvdWJsZSBfX3gpIHtyZXR1cm4gc2luKF9feCk7fQorCitzdGF0aWMgbG9uZyBkb3VibGUKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX3Npbihsb25nIGRvdWJsZSBfX3gpIHtyZXR1cm4gc2lubChfX3gpO30KKworc3RhdGljIGZsb2F0IF9Db21wbGV4CisgICAgX1RHX0FUVFJTCisgICAgX190Z19zaW4oZmxvYXQgX0NvbXBsZXggX194KSB7cmV0dXJuIGNzaW5mKF9feCk7fQorCitzdGF0aWMgZG91YmxlIF9Db21wbGV4CisgICAgX1RHX0FUVFJTCisgICAgX190Z19zaW4oZG91YmxlIF9Db21wbGV4IF9feCkge3JldHVybiBjc2luKF9feCk7fQorCitzdGF0aWMgbG9uZyBkb3VibGUgX0NvbXBsZXgKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX3Npbihsb25nIGRvdWJsZSBfQ29tcGxleCBfX3gpIHtyZXR1cm4gY3NpbmwoX194KTt9CisKKyN1bmRlZiBzaW4KKyNkZWZpbmUgc2luKF9feCkgX190Z19zaW4oX190Z19wcm9tb3RlMSgoX194KSkoX194KSkKKworLy8gdGFuCisKK3N0YXRpYyBmbG9hdAorICAgIF9UR19BVFRSUworICAgIF9fdGdfdGFuKGZsb2F0IF9feCkge3JldHVybiB0YW5mKF9feCk7fQorCitzdGF0aWMgZG91YmxlCisgICAgX1RHX0FUVFJTCisgICAgX190Z190YW4oZG91YmxlIF9feCkge3JldHVybiB0YW4oX194KTt9CisKK3N0YXRpYyBsb25nIGRvdWJsZQorICAgIF9UR19BVFRSUworICAgIF9fdGdfdGFuKGxvbmcgZG91YmxlIF9feCkge3JldHVybiB0YW5sKF9feCk7fQorCitzdGF0aWMgZmxvYXQgX0NvbXBsZXgKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX3RhbihmbG9hdCBfQ29tcGxleCBfX3gpIHtyZXR1cm4gY3RhbmYoX194KTt9CisKK3N0YXRpYyBkb3VibGUgX0NvbXBsZXgKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX3Rhbihkb3VibGUgX0NvbXBsZXggX194KSB7cmV0dXJuIGN0YW4oX194KTt9CisKK3N0YXRpYyBsb25nIGRvdWJsZSBfQ29tcGxleAorICAgIF9UR19BVFRSUworICAgIF9fdGdfdGFuKGxvbmcgZG91YmxlIF9Db21wbGV4IF9feCkge3JldHVybiBjdGFubChfX3gpO30KKworI3VuZGVmIHRhbgorI2RlZmluZSB0YW4oX194KSBfX3RnX3RhbihfX3RnX3Byb21vdGUxKChfX3gpKShfX3gpKQorCisvLyBjb3NoCisKK3N0YXRpYyBmbG9hdAorICAgIF9UR19BVFRSUworICAgIF9fdGdfY29zaChmbG9hdCBfX3gpIHtyZXR1cm4gY29zaGYoX194KTt9CisKK3N0YXRpYyBkb3VibGUKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2Nvc2goZG91YmxlIF9feCkge3JldHVybiBjb3NoKF9feCk7fQorCitzdGF0aWMgbG9uZyBkb3VibGUKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2Nvc2gobG9uZyBkb3VibGUgX194KSB7cmV0dXJuIGNvc2hsKF9feCk7fQorCitzdGF0aWMgZmxvYXQgX0NvbXBsZXgKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2Nvc2goZmxvYXQgX0NvbXBsZXggX194KSB7cmV0dXJuIGNjb3NoZihfX3gpO30KKworc3RhdGljIGRvdWJsZSBfQ29tcGxleAorICAgIF9UR19BVFRSUworICAgIF9fdGdfY29zaChkb3VibGUgX0NvbXBsZXggX194KSB7cmV0dXJuIGNjb3NoKF9feCk7fQorCitzdGF0aWMgbG9uZyBkb3VibGUgX0NvbXBsZXgKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2Nvc2gobG9uZyBkb3VibGUgX0NvbXBsZXggX194KSB7cmV0dXJuIGNjb3NobChfX3gpO30KKworI3VuZGVmIGNvc2gKKyNkZWZpbmUgY29zaChfX3gpIF9fdGdfY29zaChfX3RnX3Byb21vdGUxKChfX3gpKShfX3gpKQorCisvLyBzaW5oCisKK3N0YXRpYyBmbG9hdAorICAgIF9UR19BVFRSUworICAgIF9fdGdfc2luaChmbG9hdCBfX3gpIHtyZXR1cm4gc2luaGYoX194KTt9CisKK3N0YXRpYyBkb3VibGUKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX3NpbmgoZG91YmxlIF9feCkge3JldHVybiBzaW5oKF9feCk7fQorCitzdGF0aWMgbG9uZyBkb3VibGUKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX3NpbmgobG9uZyBkb3VibGUgX194KSB7cmV0dXJuIHNpbmhsKF9feCk7fQorCitzdGF0aWMgZmxvYXQgX0NvbXBsZXgKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX3NpbmgoZmxvYXQgX0NvbXBsZXggX194KSB7cmV0dXJuIGNzaW5oZihfX3gpO30KKworc3RhdGljIGRvdWJsZSBfQ29tcGxleAorICAgIF9UR19BVFRSUworICAgIF9fdGdfc2luaChkb3VibGUgX0NvbXBsZXggX194KSB7cmV0dXJuIGNzaW5oKF9feCk7fQorCitzdGF0aWMgbG9uZyBkb3VibGUgX0NvbXBsZXgKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX3NpbmgobG9uZyBkb3VibGUgX0NvbXBsZXggX194KSB7cmV0dXJuIGNzaW5obChfX3gpO30KKworI3VuZGVmIHNpbmgKKyNkZWZpbmUgc2luaChfX3gpIF9fdGdfc2luaChfX3RnX3Byb21vdGUxKChfX3gpKShfX3gpKQorCisvLyB0YW5oCisKK3N0YXRpYyBmbG9hdAorICAgIF9UR19BVFRSUworICAgIF9fdGdfdGFuaChmbG9hdCBfX3gpIHtyZXR1cm4gdGFuaGYoX194KTt9CisKK3N0YXRpYyBkb3VibGUKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX3RhbmgoZG91YmxlIF9feCkge3JldHVybiB0YW5oKF9feCk7fQorCitzdGF0aWMgbG9uZyBkb3VibGUKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX3RhbmgobG9uZyBkb3VibGUgX194KSB7cmV0dXJuIHRhbmhsKF9feCk7fQorCitzdGF0aWMgZmxvYXQgX0NvbXBsZXgKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX3RhbmgoZmxvYXQgX0NvbXBsZXggX194KSB7cmV0dXJuIGN0YW5oZihfX3gpO30KKworc3RhdGljIGRvdWJsZSBfQ29tcGxleAorICAgIF9UR19BVFRSUworICAgIF9fdGdfdGFuaChkb3VibGUgX0NvbXBsZXggX194KSB7cmV0dXJuIGN0YW5oKF9feCk7fQorCitzdGF0aWMgbG9uZyBkb3VibGUgX0NvbXBsZXgKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX3RhbmgobG9uZyBkb3VibGUgX0NvbXBsZXggX194KSB7cmV0dXJuIGN0YW5obChfX3gpO30KKworI3VuZGVmIHRhbmgKKyNkZWZpbmUgdGFuaChfX3gpIF9fdGdfdGFuaChfX3RnX3Byb21vdGUxKChfX3gpKShfX3gpKQorCisvLyBleHAKKworc3RhdGljIGZsb2F0CisgICAgX1RHX0FUVFJTCisgICAgX190Z19leHAoZmxvYXQgX194KSB7cmV0dXJuIGV4cGYoX194KTt9CisKK3N0YXRpYyBkb3VibGUKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2V4cChkb3VibGUgX194KSB7cmV0dXJuIGV4cChfX3gpO30KKworc3RhdGljIGxvbmcgZG91YmxlCisgICAgX1RHX0FUVFJTCisgICAgX190Z19leHAobG9uZyBkb3VibGUgX194KSB7cmV0dXJuIGV4cGwoX194KTt9CisKK3N0YXRpYyBmbG9hdCBfQ29tcGxleAorICAgIF9UR19BVFRSUworICAgIF9fdGdfZXhwKGZsb2F0IF9Db21wbGV4IF9feCkge3JldHVybiBjZXhwZihfX3gpO30KKworc3RhdGljIGRvdWJsZSBfQ29tcGxleAorICAgIF9UR19BVFRSUworICAgIF9fdGdfZXhwKGRvdWJsZSBfQ29tcGxleCBfX3gpIHtyZXR1cm4gY2V4cChfX3gpO30KKworc3RhdGljIGxvbmcgZG91YmxlIF9Db21wbGV4CisgICAgX1RHX0FUVFJTCisgICAgX190Z19leHAobG9uZyBkb3VibGUgX0NvbXBsZXggX194KSB7cmV0dXJuIGNleHBsKF9feCk7fQorCisjdW5kZWYgZXhwCisjZGVmaW5lIGV4cChfX3gpIF9fdGdfZXhwKF9fdGdfcHJvbW90ZTEoKF9feCkpKF9feCkpCisKKy8vIGxvZworCitzdGF0aWMgZmxvYXQKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2xvZyhmbG9hdCBfX3gpIHtyZXR1cm4gbG9nZihfX3gpO30KKworc3RhdGljIGRvdWJsZQorICAgIF9UR19BVFRSUworICAgIF9fdGdfbG9nKGRvdWJsZSBfX3gpIHtyZXR1cm4gbG9nKF9feCk7fQorCitzdGF0aWMgbG9uZyBkb3VibGUKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2xvZyhsb25nIGRvdWJsZSBfX3gpIHtyZXR1cm4gbG9nbChfX3gpO30KKworc3RhdGljIGZsb2F0IF9Db21wbGV4CisgICAgX1RHX0FUVFJTCisgICAgX190Z19sb2coZmxvYXQgX0NvbXBsZXggX194KSB7cmV0dXJuIGNsb2dmKF9feCk7fQorCitzdGF0aWMgZG91YmxlIF9Db21wbGV4CisgICAgX1RHX0FUVFJTCisgICAgX190Z19sb2coZG91YmxlIF9Db21wbGV4IF9feCkge3JldHVybiBjbG9nKF9feCk7fQorCitzdGF0aWMgbG9uZyBkb3VibGUgX0NvbXBsZXgKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2xvZyhsb25nIGRvdWJsZSBfQ29tcGxleCBfX3gpIHtyZXR1cm4gY2xvZ2woX194KTt9CisKKyN1bmRlZiBsb2cKKyNkZWZpbmUgbG9nKF9feCkgX190Z19sb2coX190Z19wcm9tb3RlMSgoX194KSkoX194KSkKKworLy8gcG93CisKK3N0YXRpYyBmbG9hdAorICAgIF9UR19BVFRSUworICAgIF9fdGdfcG93KGZsb2F0IF9feCwgZmxvYXQgX195KSB7cmV0dXJuIHBvd2YoX194LCBfX3kpO30KKworc3RhdGljIGRvdWJsZQorICAgIF9UR19BVFRSUworICAgIF9fdGdfcG93KGRvdWJsZSBfX3gsIGRvdWJsZSBfX3kpIHtyZXR1cm4gcG93KF9feCwgX195KTt9CisKK3N0YXRpYyBsb25nIGRvdWJsZQorICAgIF9UR19BVFRSUworICAgIF9fdGdfcG93KGxvbmcgZG91YmxlIF9feCwgbG9uZyBkb3VibGUgX195KSB7cmV0dXJuIHBvd2woX194LCBfX3kpO30KKworc3RhdGljIGZsb2F0IF9Db21wbGV4CisgICAgX1RHX0FUVFJTCisgICAgX190Z19wb3coZmxvYXQgX0NvbXBsZXggX194LCBmbG9hdCBfQ29tcGxleCBfX3kpIHtyZXR1cm4gY3Bvd2YoX194LCBfX3kpO30KKworc3RhdGljIGRvdWJsZSBfQ29tcGxleAorICAgIF9UR19BVFRSUworICAgIF9fdGdfcG93KGRvdWJsZSBfQ29tcGxleCBfX3gsIGRvdWJsZSBfQ29tcGxleCBfX3kpIHtyZXR1cm4gY3BvdyhfX3gsIF9feSk7fQorCitzdGF0aWMgbG9uZyBkb3VibGUgX0NvbXBsZXgKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX3Bvdyhsb25nIGRvdWJsZSBfQ29tcGxleCBfX3gsIGxvbmcgZG91YmxlIF9Db21wbGV4IF9feSkKKyAgICB7cmV0dXJuIGNwb3dsKF9feCwgX195KTt9CisKKyN1bmRlZiBwb3cKKyNkZWZpbmUgcG93KF9feCwgX195KSBfX3RnX3BvdyhfX3RnX3Byb21vdGUyKChfX3gpLCAoX195KSkoX194KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdGdfcHJvbW90ZTIoKF9feCksIChfX3kpKShfX3kpKQorCisvLyBzcXJ0CisKK3N0YXRpYyBmbG9hdAorICAgIF9UR19BVFRSUworICAgIF9fdGdfc3FydChmbG9hdCBfX3gpIHtyZXR1cm4gc3FydGYoX194KTt9CisKK3N0YXRpYyBkb3VibGUKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX3NxcnQoZG91YmxlIF9feCkge3JldHVybiBzcXJ0KF9feCk7fQorCitzdGF0aWMgbG9uZyBkb3VibGUKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX3NxcnQobG9uZyBkb3VibGUgX194KSB7cmV0dXJuIHNxcnRsKF9feCk7fQorCitzdGF0aWMgZmxvYXQgX0NvbXBsZXgKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX3NxcnQoZmxvYXQgX0NvbXBsZXggX194KSB7cmV0dXJuIGNzcXJ0ZihfX3gpO30KKworc3RhdGljIGRvdWJsZSBfQ29tcGxleAorICAgIF9UR19BVFRSUworICAgIF9fdGdfc3FydChkb3VibGUgX0NvbXBsZXggX194KSB7cmV0dXJuIGNzcXJ0KF9feCk7fQorCitzdGF0aWMgbG9uZyBkb3VibGUgX0NvbXBsZXgKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX3NxcnQobG9uZyBkb3VibGUgX0NvbXBsZXggX194KSB7cmV0dXJuIGNzcXJ0bChfX3gpO30KKworI3VuZGVmIHNxcnQKKyNkZWZpbmUgc3FydChfX3gpIF9fdGdfc3FydChfX3RnX3Byb21vdGUxKChfX3gpKShfX3gpKQorCisvLyBmYWJzCisKK3N0YXRpYyBmbG9hdAorICAgIF9UR19BVFRSUworICAgIF9fdGdfZmFicyhmbG9hdCBfX3gpIHtyZXR1cm4gZmFic2YoX194KTt9CisKK3N0YXRpYyBkb3VibGUKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2ZhYnMoZG91YmxlIF9feCkge3JldHVybiBmYWJzKF9feCk7fQorCitzdGF0aWMgbG9uZyBkb3VibGUKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2ZhYnMobG9uZyBkb3VibGUgX194KSB7cmV0dXJuIGZhYnNsKF9feCk7fQorCitzdGF0aWMgZmxvYXQKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2ZhYnMoZmxvYXQgX0NvbXBsZXggX194KSB7cmV0dXJuIGNhYnNmKF9feCk7fQorCitzdGF0aWMgZG91YmxlCisgICAgX1RHX0FUVFJTCisgICAgX190Z19mYWJzKGRvdWJsZSBfQ29tcGxleCBfX3gpIHtyZXR1cm4gY2FicyhfX3gpO30KKworc3RhdGljIGxvbmcgZG91YmxlCisgICAgX1RHX0FUVFJTCisgICAgX190Z19mYWJzKGxvbmcgZG91YmxlIF9Db21wbGV4IF9feCkge3JldHVybiBjYWJzbChfX3gpO30KKworI3VuZGVmIGZhYnMKKyNkZWZpbmUgZmFicyhfX3gpIF9fdGdfZmFicyhfX3RnX3Byb21vdGUxKChfX3gpKShfX3gpKQorCisvLyBhdGFuMgorCitzdGF0aWMgZmxvYXQKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2F0YW4yKGZsb2F0IF9feCwgZmxvYXQgX195KSB7cmV0dXJuIGF0YW4yZihfX3gsIF9feSk7fQorCitzdGF0aWMgZG91YmxlCisgICAgX1RHX0FUVFJTCisgICAgX190Z19hdGFuMihkb3VibGUgX194LCBkb3VibGUgX195KSB7cmV0dXJuIGF0YW4yKF9feCwgX195KTt9CisKK3N0YXRpYyBsb25nIGRvdWJsZQorICAgIF9UR19BVFRSUworICAgIF9fdGdfYXRhbjIobG9uZyBkb3VibGUgX194LCBsb25nIGRvdWJsZSBfX3kpIHtyZXR1cm4gYXRhbjJsKF9feCwgX195KTt9CisKKyN1bmRlZiBhdGFuMgorI2RlZmluZSBhdGFuMihfX3gsIF9feSkgX190Z19hdGFuMihfX3RnX3Byb21vdGUyKChfX3gpLCAoX195KSkoX194KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3RnX3Byb21vdGUyKChfX3gpLCAoX195KSkoX195KSkKKworLy8gY2JydAorCitzdGF0aWMgZmxvYXQKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2NicnQoZmxvYXQgX194KSB7cmV0dXJuIGNicnRmKF9feCk7fQorCitzdGF0aWMgZG91YmxlCisgICAgX1RHX0FUVFJTCisgICAgX190Z19jYnJ0KGRvdWJsZSBfX3gpIHtyZXR1cm4gY2JydChfX3gpO30KKworc3RhdGljIGxvbmcgZG91YmxlCisgICAgX1RHX0FUVFJTCisgICAgX190Z19jYnJ0KGxvbmcgZG91YmxlIF9feCkge3JldHVybiBjYnJ0bChfX3gpO30KKworI3VuZGVmIGNicnQKKyNkZWZpbmUgY2JydChfX3gpIF9fdGdfY2JydChfX3RnX3Byb21vdGUxKChfX3gpKShfX3gpKQorCisvLyBjZWlsCisKK3N0YXRpYyBmbG9hdAorICAgIF9UR19BVFRSUworICAgIF9fdGdfY2VpbChmbG9hdCBfX3gpIHtyZXR1cm4gY2VpbGYoX194KTt9CisKK3N0YXRpYyBkb3VibGUKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2NlaWwoZG91YmxlIF9feCkge3JldHVybiBjZWlsKF9feCk7fQorCitzdGF0aWMgbG9uZyBkb3VibGUKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2NlaWwobG9uZyBkb3VibGUgX194KSB7cmV0dXJuIGNlaWxsKF9feCk7fQorCisjdW5kZWYgY2VpbAorI2RlZmluZSBjZWlsKF9feCkgX190Z19jZWlsKF9fdGdfcHJvbW90ZTEoKF9feCkpKF9feCkpCisKKy8vIGNvcHlzaWduCisKK3N0YXRpYyBmbG9hdAorICAgIF9UR19BVFRSUworICAgIF9fdGdfY29weXNpZ24oZmxvYXQgX194LCBmbG9hdCBfX3kpIHtyZXR1cm4gY29weXNpZ25mKF9feCwgX195KTt9CisKK3N0YXRpYyBkb3VibGUKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2NvcHlzaWduKGRvdWJsZSBfX3gsIGRvdWJsZSBfX3kpIHtyZXR1cm4gY29weXNpZ24oX194LCBfX3kpO30KKworc3RhdGljIGxvbmcgZG91YmxlCisgICAgX1RHX0FUVFJTCisgICAgX190Z19jb3B5c2lnbihsb25nIGRvdWJsZSBfX3gsIGxvbmcgZG91YmxlIF9feSkge3JldHVybiBjb3B5c2lnbmwoX194LCBfX3kpO30KKworI3VuZGVmIGNvcHlzaWduCisjZGVmaW5lIGNvcHlzaWduKF9feCwgX195KSBfX3RnX2NvcHlzaWduKF9fdGdfcHJvbW90ZTIoKF9feCksIChfX3kpKShfX3gpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdGdfcHJvbW90ZTIoKF9feCksIChfX3kpKShfX3kpKQorCisvLyBlcmYKKworc3RhdGljIGZsb2F0CisgICAgX1RHX0FUVFJTCisgICAgX190Z19lcmYoZmxvYXQgX194KSB7cmV0dXJuIGVyZmYoX194KTt9CisKK3N0YXRpYyBkb3VibGUKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2VyZihkb3VibGUgX194KSB7cmV0dXJuIGVyZihfX3gpO30KKworc3RhdGljIGxvbmcgZG91YmxlCisgICAgX1RHX0FUVFJTCisgICAgX190Z19lcmYobG9uZyBkb3VibGUgX194KSB7cmV0dXJuIGVyZmwoX194KTt9CisKKyN1bmRlZiBlcmYKKyNkZWZpbmUgZXJmKF9feCkgX190Z19lcmYoX190Z19wcm9tb3RlMSgoX194KSkoX194KSkKKworLy8gZXJmYworCitzdGF0aWMgZmxvYXQKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2VyZmMoZmxvYXQgX194KSB7cmV0dXJuIGVyZmNmKF9feCk7fQorCitzdGF0aWMgZG91YmxlCisgICAgX1RHX0FUVFJTCisgICAgX190Z19lcmZjKGRvdWJsZSBfX3gpIHtyZXR1cm4gZXJmYyhfX3gpO30KKworc3RhdGljIGxvbmcgZG91YmxlCisgICAgX1RHX0FUVFJTCisgICAgX190Z19lcmZjKGxvbmcgZG91YmxlIF9feCkge3JldHVybiBlcmZjbChfX3gpO30KKworI3VuZGVmIGVyZmMKKyNkZWZpbmUgZXJmYyhfX3gpIF9fdGdfZXJmYyhfX3RnX3Byb21vdGUxKChfX3gpKShfX3gpKQorCisvLyBleHAyCisKK3N0YXRpYyBmbG9hdAorICAgIF9UR19BVFRSUworICAgIF9fdGdfZXhwMihmbG9hdCBfX3gpIHtyZXR1cm4gZXhwMmYoX194KTt9CisKK3N0YXRpYyBkb3VibGUKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2V4cDIoZG91YmxlIF9feCkge3JldHVybiBleHAyKF9feCk7fQorCitzdGF0aWMgbG9uZyBkb3VibGUKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2V4cDIobG9uZyBkb3VibGUgX194KSB7cmV0dXJuIGV4cDJsKF9feCk7fQorCisjdW5kZWYgZXhwMgorI2RlZmluZSBleHAyKF9feCkgX190Z19leHAyKF9fdGdfcHJvbW90ZTEoKF9feCkpKF9feCkpCisKKy8vIGV4cG0xCisKK3N0YXRpYyBmbG9hdAorICAgIF9UR19BVFRSUworICAgIF9fdGdfZXhwbTEoZmxvYXQgX194KSB7cmV0dXJuIGV4cG0xZihfX3gpO30KKworc3RhdGljIGRvdWJsZQorICAgIF9UR19BVFRSUworICAgIF9fdGdfZXhwbTEoZG91YmxlIF9feCkge3JldHVybiBleHBtMShfX3gpO30KKworc3RhdGljIGxvbmcgZG91YmxlCisgICAgX1RHX0FUVFJTCisgICAgX190Z19leHBtMShsb25nIGRvdWJsZSBfX3gpIHtyZXR1cm4gZXhwbTFsKF9feCk7fQorCisjdW5kZWYgZXhwbTEKKyNkZWZpbmUgZXhwbTEoX194KSBfX3RnX2V4cG0xKF9fdGdfcHJvbW90ZTEoKF9feCkpKF9feCkpCisKKy8vIGZkaW0KKworc3RhdGljIGZsb2F0CisgICAgX1RHX0FUVFJTCisgICAgX190Z19mZGltKGZsb2F0IF9feCwgZmxvYXQgX195KSB7cmV0dXJuIGZkaW1mKF9feCwgX195KTt9CisKK3N0YXRpYyBkb3VibGUKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2ZkaW0oZG91YmxlIF9feCwgZG91YmxlIF9feSkge3JldHVybiBmZGltKF9feCwgX195KTt9CisKK3N0YXRpYyBsb25nIGRvdWJsZQorICAgIF9UR19BVFRSUworICAgIF9fdGdfZmRpbShsb25nIGRvdWJsZSBfX3gsIGxvbmcgZG91YmxlIF9feSkge3JldHVybiBmZGltbChfX3gsIF9feSk7fQorCisjdW5kZWYgZmRpbQorI2RlZmluZSBmZGltKF9feCwgX195KSBfX3RnX2ZkaW0oX190Z19wcm9tb3RlMigoX194KSwgKF9feSkpKF9feCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdGdfcHJvbW90ZTIoKF9feCksIChfX3kpKShfX3kpKQorCisvLyBmbG9vcgorCitzdGF0aWMgZmxvYXQKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2Zsb29yKGZsb2F0IF9feCkge3JldHVybiBmbG9vcmYoX194KTt9CisKK3N0YXRpYyBkb3VibGUKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2Zsb29yKGRvdWJsZSBfX3gpIHtyZXR1cm4gZmxvb3IoX194KTt9CisKK3N0YXRpYyBsb25nIGRvdWJsZQorICAgIF9UR19BVFRSUworICAgIF9fdGdfZmxvb3IobG9uZyBkb3VibGUgX194KSB7cmV0dXJuIGZsb29ybChfX3gpO30KKworI3VuZGVmIGZsb29yCisjZGVmaW5lIGZsb29yKF9feCkgX190Z19mbG9vcihfX3RnX3Byb21vdGUxKChfX3gpKShfX3gpKQorCisvLyBmbWEKKworc3RhdGljIGZsb2F0CisgICAgX1RHX0FUVFJTCisgICAgX190Z19mbWEoZmxvYXQgX194LCBmbG9hdCBfX3ksIGZsb2F0IF9feikKKyAgICB7cmV0dXJuIGZtYWYoX194LCBfX3ksIF9feik7fQorCitzdGF0aWMgZG91YmxlCisgICAgX1RHX0FUVFJTCisgICAgX190Z19mbWEoZG91YmxlIF9feCwgZG91YmxlIF9feSwgZG91YmxlIF9feikKKyAgICB7cmV0dXJuIGZtYShfX3gsIF9feSwgX196KTt9CisKK3N0YXRpYyBsb25nIGRvdWJsZQorICAgIF9UR19BVFRSUworICAgIF9fdGdfZm1hKGxvbmcgZG91YmxlIF9feCxsb25nIGRvdWJsZSBfX3ksIGxvbmcgZG91YmxlIF9feikKKyAgICB7cmV0dXJuIGZtYWwoX194LCBfX3ksIF9feik7fQorCisjdW5kZWYgZm1hCisjZGVmaW5lIGZtYShfX3gsIF9feSwgX196KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfX3RnX2ZtYShfX3RnX3Byb21vdGUzKChfX3gpLCAoX195KSwgKF9feikpKF9feCksIFwKKyAgICAgICAgICAgICAgICAgX190Z19wcm9tb3RlMygoX194KSwgKF9feSksIChfX3opKShfX3kpLCBcCisgICAgICAgICAgICAgICAgIF9fdGdfcHJvbW90ZTMoKF9feCksIChfX3kpLCAoX196KSkoX196KSkKKworLy8gZm1heAorCitzdGF0aWMgZmxvYXQKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2ZtYXgoZmxvYXQgX194LCBmbG9hdCBfX3kpIHtyZXR1cm4gZm1heGYoX194LCBfX3kpO30KKworc3RhdGljIGRvdWJsZQorICAgIF9UR19BVFRSUworICAgIF9fdGdfZm1heChkb3VibGUgX194LCBkb3VibGUgX195KSB7cmV0dXJuIGZtYXgoX194LCBfX3kpO30KKworc3RhdGljIGxvbmcgZG91YmxlCisgICAgX1RHX0FUVFJTCisgICAgX190Z19mbWF4KGxvbmcgZG91YmxlIF9feCwgbG9uZyBkb3VibGUgX195KSB7cmV0dXJuIGZtYXhsKF9feCwgX195KTt9CisKKyN1bmRlZiBmbWF4CisjZGVmaW5lIGZtYXgoX194LCBfX3kpIF9fdGdfZm1heChfX3RnX3Byb21vdGUyKChfX3gpLCAoX195KSkoX194KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX190Z19wcm9tb3RlMigoX194KSwgKF9feSkpKF9feSkpCisKKy8vIGZtaW4KKworc3RhdGljIGZsb2F0CisgICAgX1RHX0FUVFJTCisgICAgX190Z19mbWluKGZsb2F0IF9feCwgZmxvYXQgX195KSB7cmV0dXJuIGZtaW5mKF9feCwgX195KTt9CisKK3N0YXRpYyBkb3VibGUKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2ZtaW4oZG91YmxlIF9feCwgZG91YmxlIF9feSkge3JldHVybiBmbWluKF9feCwgX195KTt9CisKK3N0YXRpYyBsb25nIGRvdWJsZQorICAgIF9UR19BVFRSUworICAgIF9fdGdfZm1pbihsb25nIGRvdWJsZSBfX3gsIGxvbmcgZG91YmxlIF9feSkge3JldHVybiBmbWlubChfX3gsIF9feSk7fQorCisjdW5kZWYgZm1pbgorI2RlZmluZSBmbWluKF9feCwgX195KSBfX3RnX2ZtaW4oX190Z19wcm9tb3RlMigoX194KSwgKF9feSkpKF9feCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdGdfcHJvbW90ZTIoKF9feCksIChfX3kpKShfX3kpKQorCisvLyBmbW9kCisKK3N0YXRpYyBmbG9hdAorICAgIF9UR19BVFRSUworICAgIF9fdGdfZm1vZChmbG9hdCBfX3gsIGZsb2F0IF9feSkge3JldHVybiBmbW9kZihfX3gsIF9feSk7fQorCitzdGF0aWMgZG91YmxlCisgICAgX1RHX0FUVFJTCisgICAgX190Z19mbW9kKGRvdWJsZSBfX3gsIGRvdWJsZSBfX3kpIHtyZXR1cm4gZm1vZChfX3gsIF9feSk7fQorCitzdGF0aWMgbG9uZyBkb3VibGUKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2Ztb2QobG9uZyBkb3VibGUgX194LCBsb25nIGRvdWJsZSBfX3kpIHtyZXR1cm4gZm1vZGwoX194LCBfX3kpO30KKworI3VuZGVmIGZtb2QKKyNkZWZpbmUgZm1vZChfX3gsIF9feSkgX190Z19mbW9kKF9fdGdfcHJvbW90ZTIoKF9feCksIChfX3kpKShfX3gpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3RnX3Byb21vdGUyKChfX3gpLCAoX195KSkoX195KSkKKworLy8gZnJleHAKKworc3RhdGljIGZsb2F0CisgICAgX1RHX0FUVFJTCisgICAgX190Z19mcmV4cChmbG9hdCBfX3gsIGludCogX195KSB7cmV0dXJuIGZyZXhwZihfX3gsIF9feSk7fQorCitzdGF0aWMgZG91YmxlCisgICAgX1RHX0FUVFJTCisgICAgX190Z19mcmV4cChkb3VibGUgX194LCBpbnQqIF9feSkge3JldHVybiBmcmV4cChfX3gsIF9feSk7fQorCitzdGF0aWMgbG9uZyBkb3VibGUKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2ZyZXhwKGxvbmcgZG91YmxlIF9feCwgaW50KiBfX3kpIHtyZXR1cm4gZnJleHBsKF9feCwgX195KTt9CisKKyN1bmRlZiBmcmV4cAorI2RlZmluZSBmcmV4cChfX3gsIF9feSkgX190Z19mcmV4cChfX3RnX3Byb21vdGUxKChfX3gpKShfX3gpLCBfX3kpCisKKy8vIGh5cG90CisKK3N0YXRpYyBmbG9hdAorICAgIF9UR19BVFRSUworICAgIF9fdGdfaHlwb3QoZmxvYXQgX194LCBmbG9hdCBfX3kpIHtyZXR1cm4gaHlwb3RmKF9feCwgX195KTt9CisKK3N0YXRpYyBkb3VibGUKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2h5cG90KGRvdWJsZSBfX3gsIGRvdWJsZSBfX3kpIHtyZXR1cm4gaHlwb3QoX194LCBfX3kpO30KKworc3RhdGljIGxvbmcgZG91YmxlCisgICAgX1RHX0FUVFJTCisgICAgX190Z19oeXBvdChsb25nIGRvdWJsZSBfX3gsIGxvbmcgZG91YmxlIF9feSkge3JldHVybiBoeXBvdGwoX194LCBfX3kpO30KKworI3VuZGVmIGh5cG90CisjZGVmaW5lIGh5cG90KF9feCwgX195KSBfX3RnX2h5cG90KF9fdGdfcHJvbW90ZTIoKF9feCksIChfX3kpKShfX3gpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdGdfcHJvbW90ZTIoKF9feCksIChfX3kpKShfX3kpKQorCisvLyBpbG9nYgorCitzdGF0aWMgaW50CisgICAgX1RHX0FUVFJTCisgICAgX190Z19pbG9nYihmbG9hdCBfX3gpIHtyZXR1cm4gaWxvZ2JmKF9feCk7fQorCitzdGF0aWMgaW50CisgICAgX1RHX0FUVFJTCisgICAgX190Z19pbG9nYihkb3VibGUgX194KSB7cmV0dXJuIGlsb2diKF9feCk7fQorCitzdGF0aWMgaW50CisgICAgX1RHX0FUVFJTCisgICAgX190Z19pbG9nYihsb25nIGRvdWJsZSBfX3gpIHtyZXR1cm4gaWxvZ2JsKF9feCk7fQorCisjdW5kZWYgaWxvZ2IKKyNkZWZpbmUgaWxvZ2IoX194KSBfX3RnX2lsb2diKF9fdGdfcHJvbW90ZTEoKF9feCkpKF9feCkpCisKKy8vIGxkZXhwCisKK3N0YXRpYyBmbG9hdAorICAgIF9UR19BVFRSUworICAgIF9fdGdfbGRleHAoZmxvYXQgX194LCBpbnQgX195KSB7cmV0dXJuIGxkZXhwZihfX3gsIF9feSk7fQorCitzdGF0aWMgZG91YmxlCisgICAgX1RHX0FUVFJTCisgICAgX190Z19sZGV4cChkb3VibGUgX194LCBpbnQgX195KSB7cmV0dXJuIGxkZXhwKF9feCwgX195KTt9CisKK3N0YXRpYyBsb25nIGRvdWJsZQorICAgIF9UR19BVFRSUworICAgIF9fdGdfbGRleHAobG9uZyBkb3VibGUgX194LCBpbnQgX195KSB7cmV0dXJuIGxkZXhwbChfX3gsIF9feSk7fQorCisjdW5kZWYgbGRleHAKKyNkZWZpbmUgbGRleHAoX194LCBfX3kpIF9fdGdfbGRleHAoX190Z19wcm9tb3RlMSgoX194KSkoX194KSwgX195KQorCisvLyBsZ2FtbWEKKworc3RhdGljIGZsb2F0CisgICAgX1RHX0FUVFJTCisgICAgX190Z19sZ2FtbWEoZmxvYXQgX194KSB7cmV0dXJuIGxnYW1tYWYoX194KTt9CisKK3N0YXRpYyBkb3VibGUKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2xnYW1tYShkb3VibGUgX194KSB7cmV0dXJuIGxnYW1tYShfX3gpO30KKworc3RhdGljIGxvbmcgZG91YmxlCisgICAgX1RHX0FUVFJTCisgICAgX190Z19sZ2FtbWEobG9uZyBkb3VibGUgX194KSB7cmV0dXJuIGxnYW1tYWwoX194KTt9CisKKyN1bmRlZiBsZ2FtbWEKKyNkZWZpbmUgbGdhbW1hKF9feCkgX190Z19sZ2FtbWEoX190Z19wcm9tb3RlMSgoX194KSkoX194KSkKKworLy8gbGxyaW50CisKK3N0YXRpYyBsb25nIGxvbmcKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2xscmludChmbG9hdCBfX3gpIHtyZXR1cm4gbGxyaW50ZihfX3gpO30KKworc3RhdGljIGxvbmcgbG9uZworICAgIF9UR19BVFRSUworICAgIF9fdGdfbGxyaW50KGRvdWJsZSBfX3gpIHtyZXR1cm4gbGxyaW50KF9feCk7fQorCitzdGF0aWMgbG9uZyBsb25nCisgICAgX1RHX0FUVFJTCisgICAgX190Z19sbHJpbnQobG9uZyBkb3VibGUgX194KSB7cmV0dXJuIGxscmludGwoX194KTt9CisKKyN1bmRlZiBsbHJpbnQKKyNkZWZpbmUgbGxyaW50KF9feCkgX190Z19sbHJpbnQoX190Z19wcm9tb3RlMSgoX194KSkoX194KSkKKworLy8gbGxyb3VuZAorCitzdGF0aWMgbG9uZyBsb25nCisgICAgX1RHX0FUVFJTCisgICAgX190Z19sbHJvdW5kKGZsb2F0IF9feCkge3JldHVybiBsbHJvdW5kZihfX3gpO30KKworc3RhdGljIGxvbmcgbG9uZworICAgIF9UR19BVFRSUworICAgIF9fdGdfbGxyb3VuZChkb3VibGUgX194KSB7cmV0dXJuIGxscm91bmQoX194KTt9CisKK3N0YXRpYyBsb25nIGxvbmcKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2xscm91bmQobG9uZyBkb3VibGUgX194KSB7cmV0dXJuIGxscm91bmRsKF9feCk7fQorCisjdW5kZWYgbGxyb3VuZAorI2RlZmluZSBsbHJvdW5kKF9feCkgX190Z19sbHJvdW5kKF9fdGdfcHJvbW90ZTEoKF9feCkpKF9feCkpCisKKy8vIGxvZzEwCisKK3N0YXRpYyBmbG9hdAorICAgIF9UR19BVFRSUworICAgIF9fdGdfbG9nMTAoZmxvYXQgX194KSB7cmV0dXJuIGxvZzEwZihfX3gpO30KKworc3RhdGljIGRvdWJsZQorICAgIF9UR19BVFRSUworICAgIF9fdGdfbG9nMTAoZG91YmxlIF9feCkge3JldHVybiBsb2cxMChfX3gpO30KKworc3RhdGljIGxvbmcgZG91YmxlCisgICAgX1RHX0FUVFJTCisgICAgX190Z19sb2cxMChsb25nIGRvdWJsZSBfX3gpIHtyZXR1cm4gbG9nMTBsKF9feCk7fQorCisjdW5kZWYgbG9nMTAKKyNkZWZpbmUgbG9nMTAoX194KSBfX3RnX2xvZzEwKF9fdGdfcHJvbW90ZTEoKF9feCkpKF9feCkpCisKKy8vIGxvZzFwCisKK3N0YXRpYyBmbG9hdAorICAgIF9UR19BVFRSUworICAgIF9fdGdfbG9nMXAoZmxvYXQgX194KSB7cmV0dXJuIGxvZzFwZihfX3gpO30KKworc3RhdGljIGRvdWJsZQorICAgIF9UR19BVFRSUworICAgIF9fdGdfbG9nMXAoZG91YmxlIF9feCkge3JldHVybiBsb2cxcChfX3gpO30KKworc3RhdGljIGxvbmcgZG91YmxlCisgICAgX1RHX0FUVFJTCisgICAgX190Z19sb2cxcChsb25nIGRvdWJsZSBfX3gpIHtyZXR1cm4gbG9nMXBsKF9feCk7fQorCisjdW5kZWYgbG9nMXAKKyNkZWZpbmUgbG9nMXAoX194KSBfX3RnX2xvZzFwKF9fdGdfcHJvbW90ZTEoKF9feCkpKF9feCkpCisKKy8vIGxvZzIKKworc3RhdGljIGZsb2F0CisgICAgX1RHX0FUVFJTCisgICAgX190Z19sb2cyKGZsb2F0IF9feCkge3JldHVybiBsb2cyZihfX3gpO30KKworc3RhdGljIGRvdWJsZQorICAgIF9UR19BVFRSUworICAgIF9fdGdfbG9nMihkb3VibGUgX194KSB7cmV0dXJuIGxvZzIoX194KTt9CisKK3N0YXRpYyBsb25nIGRvdWJsZQorICAgIF9UR19BVFRSUworICAgIF9fdGdfbG9nMihsb25nIGRvdWJsZSBfX3gpIHtyZXR1cm4gbG9nMmwoX194KTt9CisKKyN1bmRlZiBsb2cyCisjZGVmaW5lIGxvZzIoX194KSBfX3RnX2xvZzIoX190Z19wcm9tb3RlMSgoX194KSkoX194KSkKKworLy8gbG9nYgorCitzdGF0aWMgZmxvYXQKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2xvZ2IoZmxvYXQgX194KSB7cmV0dXJuIGxvZ2JmKF9feCk7fQorCitzdGF0aWMgZG91YmxlCisgICAgX1RHX0FUVFJTCisgICAgX190Z19sb2diKGRvdWJsZSBfX3gpIHtyZXR1cm4gbG9nYihfX3gpO30KKworc3RhdGljIGxvbmcgZG91YmxlCisgICAgX1RHX0FUVFJTCisgICAgX190Z19sb2diKGxvbmcgZG91YmxlIF9feCkge3JldHVybiBsb2dibChfX3gpO30KKworI3VuZGVmIGxvZ2IKKyNkZWZpbmUgbG9nYihfX3gpIF9fdGdfbG9nYihfX3RnX3Byb21vdGUxKChfX3gpKShfX3gpKQorCisvLyBscmludAorCitzdGF0aWMgbG9uZworICAgIF9UR19BVFRSUworICAgIF9fdGdfbHJpbnQoZmxvYXQgX194KSB7cmV0dXJuIGxyaW50ZihfX3gpO30KKworc3RhdGljIGxvbmcKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2xyaW50KGRvdWJsZSBfX3gpIHtyZXR1cm4gbHJpbnQoX194KTt9CisKK3N0YXRpYyBsb25nCisgICAgX1RHX0FUVFJTCisgICAgX190Z19scmludChsb25nIGRvdWJsZSBfX3gpIHtyZXR1cm4gbHJpbnRsKF9feCk7fQorCisjdW5kZWYgbHJpbnQKKyNkZWZpbmUgbHJpbnQoX194KSBfX3RnX2xyaW50KF9fdGdfcHJvbW90ZTEoKF9feCkpKF9feCkpCisKKy8vIGxyb3VuZAorCitzdGF0aWMgbG9uZworICAgIF9UR19BVFRSUworICAgIF9fdGdfbHJvdW5kKGZsb2F0IF9feCkge3JldHVybiBscm91bmRmKF9feCk7fQorCitzdGF0aWMgbG9uZworICAgIF9UR19BVFRSUworICAgIF9fdGdfbHJvdW5kKGRvdWJsZSBfX3gpIHtyZXR1cm4gbHJvdW5kKF9feCk7fQorCitzdGF0aWMgbG9uZworICAgIF9UR19BVFRSUworICAgIF9fdGdfbHJvdW5kKGxvbmcgZG91YmxlIF9feCkge3JldHVybiBscm91bmRsKF9feCk7fQorCisjdW5kZWYgbHJvdW5kCisjZGVmaW5lIGxyb3VuZChfX3gpIF9fdGdfbHJvdW5kKF9fdGdfcHJvbW90ZTEoKF9feCkpKF9feCkpCisKKy8vIG5lYXJieWludAorCitzdGF0aWMgZmxvYXQKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX25lYXJieWludChmbG9hdCBfX3gpIHtyZXR1cm4gbmVhcmJ5aW50ZihfX3gpO30KKworc3RhdGljIGRvdWJsZQorICAgIF9UR19BVFRSUworICAgIF9fdGdfbmVhcmJ5aW50KGRvdWJsZSBfX3gpIHtyZXR1cm4gbmVhcmJ5aW50KF9feCk7fQorCitzdGF0aWMgbG9uZyBkb3VibGUKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX25lYXJieWludChsb25nIGRvdWJsZSBfX3gpIHtyZXR1cm4gbmVhcmJ5aW50bChfX3gpO30KKworI3VuZGVmIG5lYXJieWludAorI2RlZmluZSBuZWFyYnlpbnQoX194KSBfX3RnX25lYXJieWludChfX3RnX3Byb21vdGUxKChfX3gpKShfX3gpKQorCisvLyBuZXh0YWZ0ZXIKKworc3RhdGljIGZsb2F0CisgICAgX1RHX0FUVFJTCisgICAgX190Z19uZXh0YWZ0ZXIoZmxvYXQgX194LCBmbG9hdCBfX3kpIHtyZXR1cm4gbmV4dGFmdGVyZihfX3gsIF9feSk7fQorCitzdGF0aWMgZG91YmxlCisgICAgX1RHX0FUVFJTCisgICAgX190Z19uZXh0YWZ0ZXIoZG91YmxlIF9feCwgZG91YmxlIF9feSkge3JldHVybiBuZXh0YWZ0ZXIoX194LCBfX3kpO30KKworc3RhdGljIGxvbmcgZG91YmxlCisgICAgX1RHX0FUVFJTCisgICAgX190Z19uZXh0YWZ0ZXIobG9uZyBkb3VibGUgX194LCBsb25nIGRvdWJsZSBfX3kpIHtyZXR1cm4gbmV4dGFmdGVybChfX3gsIF9feSk7fQorCisjdW5kZWYgbmV4dGFmdGVyCisjZGVmaW5lIG5leHRhZnRlcihfX3gsIF9feSkgX190Z19uZXh0YWZ0ZXIoX190Z19wcm9tb3RlMigoX194KSwgKF9feSkpKF9feCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3RnX3Byb21vdGUyKChfX3gpLCAoX195KSkoX195KSkKKworLy8gbmV4dHRvd2FyZAorCitzdGF0aWMgZmxvYXQKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX25leHR0b3dhcmQoZmxvYXQgX194LCBsb25nIGRvdWJsZSBfX3kpIHtyZXR1cm4gbmV4dHRvd2FyZGYoX194LCBfX3kpO30KKworc3RhdGljIGRvdWJsZQorICAgIF9UR19BVFRSUworICAgIF9fdGdfbmV4dHRvd2FyZChkb3VibGUgX194LCBsb25nIGRvdWJsZSBfX3kpIHtyZXR1cm4gbmV4dHRvd2FyZChfX3gsIF9feSk7fQorCitzdGF0aWMgbG9uZyBkb3VibGUKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX25leHR0b3dhcmQobG9uZyBkb3VibGUgX194LCBsb25nIGRvdWJsZSBfX3kpIHtyZXR1cm4gbmV4dHRvd2FyZGwoX194LCBfX3kpO30KKworI3VuZGVmIG5leHR0b3dhcmQKKyNkZWZpbmUgbmV4dHRvd2FyZChfX3gsIF9feSkgX190Z19uZXh0dG93YXJkKF9fdGdfcHJvbW90ZTEoKF9feCkpKF9feCksIChfX3kpKQorCisvLyByZW1haW5kZXIKKworc3RhdGljIGZsb2F0CisgICAgX1RHX0FUVFJTCisgICAgX190Z19yZW1haW5kZXIoZmxvYXQgX194LCBmbG9hdCBfX3kpIHtyZXR1cm4gcmVtYWluZGVyZihfX3gsIF9feSk7fQorCitzdGF0aWMgZG91YmxlCisgICAgX1RHX0FUVFJTCisgICAgX190Z19yZW1haW5kZXIoZG91YmxlIF9feCwgZG91YmxlIF9feSkge3JldHVybiByZW1haW5kZXIoX194LCBfX3kpO30KKworc3RhdGljIGxvbmcgZG91YmxlCisgICAgX1RHX0FUVFJTCisgICAgX190Z19yZW1haW5kZXIobG9uZyBkb3VibGUgX194LCBsb25nIGRvdWJsZSBfX3kpIHtyZXR1cm4gcmVtYWluZGVybChfX3gsIF9feSk7fQorCisjdW5kZWYgcmVtYWluZGVyCisjZGVmaW5lIHJlbWFpbmRlcihfX3gsIF9feSkgX190Z19yZW1haW5kZXIoX190Z19wcm9tb3RlMigoX194KSwgKF9feSkpKF9feCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3RnX3Byb21vdGUyKChfX3gpLCAoX195KSkoX195KSkKKworLy8gcmVtcXVvCisKK3N0YXRpYyBmbG9hdAorICAgIF9UR19BVFRSUworICAgIF9fdGdfcmVtcXVvKGZsb2F0IF9feCwgZmxvYXQgX195LCBpbnQqIF9feikKKyAgICB7cmV0dXJuIHJlbXF1b2YoX194LCBfX3ksIF9feik7fQorCitzdGF0aWMgZG91YmxlCisgICAgX1RHX0FUVFJTCisgICAgX190Z19yZW1xdW8oZG91YmxlIF9feCwgZG91YmxlIF9feSwgaW50KiBfX3opCisgICAge3JldHVybiByZW1xdW8oX194LCBfX3ksIF9feik7fQorCitzdGF0aWMgbG9uZyBkb3VibGUKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX3JlbXF1byhsb25nIGRvdWJsZSBfX3gsbG9uZyBkb3VibGUgX195LCBpbnQqIF9feikKKyAgICB7cmV0dXJuIHJlbXF1b2woX194LCBfX3ksIF9feik7fQorCisjdW5kZWYgcmVtcXVvCisjZGVmaW5lIHJlbXF1byhfX3gsIF9feSwgX196KSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9fdGdfcmVtcXVvKF9fdGdfcHJvbW90ZTIoKF9feCksIChfX3kpKShfX3gpLCBcCisgICAgICAgICAgICAgICAgICAgIF9fdGdfcHJvbW90ZTIoKF9feCksIChfX3kpKShfX3kpLCBcCisgICAgICAgICAgICAgICAgICAgIChfX3opKQorCisvLyByaW50CisKK3N0YXRpYyBmbG9hdAorICAgIF9UR19BVFRSUworICAgIF9fdGdfcmludChmbG9hdCBfX3gpIHtyZXR1cm4gcmludGYoX194KTt9CisKK3N0YXRpYyBkb3VibGUKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX3JpbnQoZG91YmxlIF9feCkge3JldHVybiByaW50KF9feCk7fQorCitzdGF0aWMgbG9uZyBkb3VibGUKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX3JpbnQobG9uZyBkb3VibGUgX194KSB7cmV0dXJuIHJpbnRsKF9feCk7fQorCisjdW5kZWYgcmludAorI2RlZmluZSByaW50KF9feCkgX190Z19yaW50KF9fdGdfcHJvbW90ZTEoKF9feCkpKF9feCkpCisKKy8vIHJvdW5kCisKK3N0YXRpYyBmbG9hdAorICAgIF9UR19BVFRSUworICAgIF9fdGdfcm91bmQoZmxvYXQgX194KSB7cmV0dXJuIHJvdW5kZihfX3gpO30KKworc3RhdGljIGRvdWJsZQorICAgIF9UR19BVFRSUworICAgIF9fdGdfcm91bmQoZG91YmxlIF9feCkge3JldHVybiByb3VuZChfX3gpO30KKworc3RhdGljIGxvbmcgZG91YmxlCisgICAgX1RHX0FUVFJTCisgICAgX190Z19yb3VuZChsb25nIGRvdWJsZSBfX3gpIHtyZXR1cm4gcm91bmRsKF9feCk7fQorCisjdW5kZWYgcm91bmQKKyNkZWZpbmUgcm91bmQoX194KSBfX3RnX3JvdW5kKF9fdGdfcHJvbW90ZTEoKF9feCkpKF9feCkpCisKKy8vIHNjYWxibgorCitzdGF0aWMgZmxvYXQKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX3NjYWxibihmbG9hdCBfX3gsIGludCBfX3kpIHtyZXR1cm4gc2NhbGJuZihfX3gsIF9feSk7fQorCitzdGF0aWMgZG91YmxlCisgICAgX1RHX0FUVFJTCisgICAgX190Z19zY2FsYm4oZG91YmxlIF9feCwgaW50IF9feSkge3JldHVybiBzY2FsYm4oX194LCBfX3kpO30KKworc3RhdGljIGxvbmcgZG91YmxlCisgICAgX1RHX0FUVFJTCisgICAgX190Z19zY2FsYm4obG9uZyBkb3VibGUgX194LCBpbnQgX195KSB7cmV0dXJuIHNjYWxibmwoX194LCBfX3kpO30KKworI3VuZGVmIHNjYWxibgorI2RlZmluZSBzY2FsYm4oX194LCBfX3kpIF9fdGdfc2NhbGJuKF9fdGdfcHJvbW90ZTEoKF9feCkpKF9feCksIF9feSkKKworLy8gc2NhbGJsbgorCitzdGF0aWMgZmxvYXQKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX3NjYWxibG4oZmxvYXQgX194LCBsb25nIF9feSkge3JldHVybiBzY2FsYmxuZihfX3gsIF9feSk7fQorCitzdGF0aWMgZG91YmxlCisgICAgX1RHX0FUVFJTCisgICAgX190Z19zY2FsYmxuKGRvdWJsZSBfX3gsIGxvbmcgX195KSB7cmV0dXJuIHNjYWxibG4oX194LCBfX3kpO30KKworc3RhdGljIGxvbmcgZG91YmxlCisgICAgX1RHX0FUVFJTCisgICAgX190Z19zY2FsYmxuKGxvbmcgZG91YmxlIF9feCwgbG9uZyBfX3kpIHtyZXR1cm4gc2NhbGJsbmwoX194LCBfX3kpO30KKworI3VuZGVmIHNjYWxibG4KKyNkZWZpbmUgc2NhbGJsbihfX3gsIF9feSkgX190Z19zY2FsYmxuKF9fdGdfcHJvbW90ZTEoKF9feCkpKF9feCksIF9feSkKKworLy8gdGdhbW1hCisKK3N0YXRpYyBmbG9hdAorICAgIF9UR19BVFRSUworICAgIF9fdGdfdGdhbW1hKGZsb2F0IF9feCkge3JldHVybiB0Z2FtbWFmKF9feCk7fQorCitzdGF0aWMgZG91YmxlCisgICAgX1RHX0FUVFJTCisgICAgX190Z190Z2FtbWEoZG91YmxlIF9feCkge3JldHVybiB0Z2FtbWEoX194KTt9CisKK3N0YXRpYyBsb25nIGRvdWJsZQorICAgIF9UR19BVFRSUworICAgIF9fdGdfdGdhbW1hKGxvbmcgZG91YmxlIF9feCkge3JldHVybiB0Z2FtbWFsKF9feCk7fQorCisjdW5kZWYgdGdhbW1hCisjZGVmaW5lIHRnYW1tYShfX3gpIF9fdGdfdGdhbW1hKF9fdGdfcHJvbW90ZTEoKF9feCkpKF9feCkpCisKKy8vIHRydW5jCisKK3N0YXRpYyBmbG9hdAorICAgIF9UR19BVFRSUworICAgIF9fdGdfdHJ1bmMoZmxvYXQgX194KSB7cmV0dXJuIHRydW5jZihfX3gpO30KKworc3RhdGljIGRvdWJsZQorICAgIF9UR19BVFRSUworICAgIF9fdGdfdHJ1bmMoZG91YmxlIF9feCkge3JldHVybiB0cnVuYyhfX3gpO30KKworc3RhdGljIGxvbmcgZG91YmxlCisgICAgX1RHX0FUVFJTCisgICAgX190Z190cnVuYyhsb25nIGRvdWJsZSBfX3gpIHtyZXR1cm4gdHJ1bmNsKF9feCk7fQorCisjdW5kZWYgdHJ1bmMKKyNkZWZpbmUgdHJ1bmMoX194KSBfX3RnX3RydW5jKF9fdGdfcHJvbW90ZTEoKF9feCkpKF9feCkpCisKKy8vIGNhcmcKKworc3RhdGljIGZsb2F0CisgICAgX1RHX0FUVFJTCisgICAgX190Z19jYXJnKGZsb2F0IF9feCkge3JldHVybiBhdGFuMmYoMC5GLCBfX3gpO30KKworc3RhdGljIGRvdWJsZQorICAgIF9UR19BVFRSUworICAgIF9fdGdfY2FyZyhkb3VibGUgX194KSB7cmV0dXJuIGF0YW4yKDAuLCBfX3gpO30KKworc3RhdGljIGxvbmcgZG91YmxlCisgICAgX1RHX0FUVFJTCisgICAgX190Z19jYXJnKGxvbmcgZG91YmxlIF9feCkge3JldHVybiBhdGFuMmwoMC5MLCBfX3gpO30KKworc3RhdGljIGZsb2F0CisgICAgX1RHX0FUVFJTCisgICAgX190Z19jYXJnKGZsb2F0IF9Db21wbGV4IF9feCkge3JldHVybiBjYXJnZihfX3gpO30KKworc3RhdGljIGRvdWJsZQorICAgIF9UR19BVFRSUworICAgIF9fdGdfY2FyZyhkb3VibGUgX0NvbXBsZXggX194KSB7cmV0dXJuIGNhcmcoX194KTt9CisKK3N0YXRpYyBsb25nIGRvdWJsZQorICAgIF9UR19BVFRSUworICAgIF9fdGdfY2FyZyhsb25nIGRvdWJsZSBfQ29tcGxleCBfX3gpIHtyZXR1cm4gY2FyZ2woX194KTt9CisKKyN1bmRlZiBjYXJnCisjZGVmaW5lIGNhcmcoX194KSBfX3RnX2NhcmcoX190Z19wcm9tb3RlMSgoX194KSkoX194KSkKKworLy8gY2ltYWcKKworc3RhdGljIGZsb2F0CisgICAgX1RHX0FUVFJTCisgICAgX190Z19jaW1hZyhmbG9hdCBfX3gpIHtyZXR1cm4gMDt9CisKK3N0YXRpYyBkb3VibGUKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2NpbWFnKGRvdWJsZSBfX3gpIHtyZXR1cm4gMDt9CisKK3N0YXRpYyBsb25nIGRvdWJsZQorICAgIF9UR19BVFRSUworICAgIF9fdGdfY2ltYWcobG9uZyBkb3VibGUgX194KSB7cmV0dXJuIDA7fQorCitzdGF0aWMgZmxvYXQKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2NpbWFnKGZsb2F0IF9Db21wbGV4IF9feCkge3JldHVybiBjaW1hZ2YoX194KTt9CisKK3N0YXRpYyBkb3VibGUKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2NpbWFnKGRvdWJsZSBfQ29tcGxleCBfX3gpIHtyZXR1cm4gY2ltYWcoX194KTt9CisKK3N0YXRpYyBsb25nIGRvdWJsZQorICAgIF9UR19BVFRSUworICAgIF9fdGdfY2ltYWcobG9uZyBkb3VibGUgX0NvbXBsZXggX194KSB7cmV0dXJuIGNpbWFnbChfX3gpO30KKworI3VuZGVmIGNpbWFnCisjZGVmaW5lIGNpbWFnKF9feCkgX190Z19jaW1hZyhfX3RnX3Byb21vdGUxKChfX3gpKShfX3gpKQorCisvLyBjb25qCisKK3N0YXRpYyBmbG9hdCBfQ29tcGxleAorICAgIF9UR19BVFRSUworICAgIF9fdGdfY29uaihmbG9hdCBfX3gpIHtyZXR1cm4gX194O30KKworc3RhdGljIGRvdWJsZSBfQ29tcGxleAorICAgIF9UR19BVFRSUworICAgIF9fdGdfY29uaihkb3VibGUgX194KSB7cmV0dXJuIF9feDt9CisKK3N0YXRpYyBsb25nIGRvdWJsZSBfQ29tcGxleAorICAgIF9UR19BVFRSUworICAgIF9fdGdfY29uaihsb25nIGRvdWJsZSBfX3gpIHtyZXR1cm4gX194O30KKworc3RhdGljIGZsb2F0IF9Db21wbGV4CisgICAgX1RHX0FUVFJTCisgICAgX190Z19jb25qKGZsb2F0IF9Db21wbGV4IF9feCkge3JldHVybiBjb25qZihfX3gpO30KKworc3RhdGljIGRvdWJsZSBfQ29tcGxleAorICAgIF9UR19BVFRSUworICAgIF9fdGdfY29uaihkb3VibGUgX0NvbXBsZXggX194KSB7cmV0dXJuIGNvbmooX194KTt9CisKK3N0YXRpYyBsb25nIGRvdWJsZSBfQ29tcGxleAorICAgIF9UR19BVFRSUworICAgIF9fdGdfY29uaihsb25nIGRvdWJsZSBfQ29tcGxleCBfX3gpIHtyZXR1cm4gY29uamwoX194KTt9CisKKyN1bmRlZiBjb25qCisjZGVmaW5lIGNvbmooX194KSBfX3RnX2NvbmooX190Z19wcm9tb3RlMSgoX194KSkoX194KSkKKworLy8gY3Byb2oKKworc3RhdGljIGZsb2F0IF9Db21wbGV4CisgICAgX1RHX0FUVFJTCisgICAgX190Z19jcHJvaihmbG9hdCBfX3gpIHtyZXR1cm4gY3Byb2pmKF9feCk7fQorCitzdGF0aWMgZG91YmxlIF9Db21wbGV4CisgICAgX1RHX0FUVFJTCisgICAgX190Z19jcHJvaihkb3VibGUgX194KSB7cmV0dXJuIGNwcm9qKF9feCk7fQorCitzdGF0aWMgbG9uZyBkb3VibGUgX0NvbXBsZXgKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2Nwcm9qKGxvbmcgZG91YmxlIF9feCkge3JldHVybiBjcHJvamwoX194KTt9CisKK3N0YXRpYyBmbG9hdCBfQ29tcGxleAorICAgIF9UR19BVFRSUworICAgIF9fdGdfY3Byb2ooZmxvYXQgX0NvbXBsZXggX194KSB7cmV0dXJuIGNwcm9qZihfX3gpO30KKworc3RhdGljIGRvdWJsZSBfQ29tcGxleAorICAgIF9UR19BVFRSUworICAgIF9fdGdfY3Byb2ooZG91YmxlIF9Db21wbGV4IF9feCkge3JldHVybiBjcHJvaihfX3gpO30KKworc3RhdGljIGxvbmcgZG91YmxlIF9Db21wbGV4CisgICAgX1RHX0FUVFJTCisgICAgX190Z19jcHJvaihsb25nIGRvdWJsZSBfQ29tcGxleCBfX3gpIHtyZXR1cm4gY3Byb2psKF9feCk7fQorCisjdW5kZWYgY3Byb2oKKyNkZWZpbmUgY3Byb2ooX194KSBfX3RnX2Nwcm9qKF9fdGdfcHJvbW90ZTEoKF9feCkpKF9feCkpCisKKy8vIGNyZWFsCisKK3N0YXRpYyBmbG9hdAorICAgIF9UR19BVFRSUworICAgIF9fdGdfY3JlYWwoZmxvYXQgX194KSB7cmV0dXJuIF9feDt9CisKK3N0YXRpYyBkb3VibGUKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2NyZWFsKGRvdWJsZSBfX3gpIHtyZXR1cm4gX194O30KKworc3RhdGljIGxvbmcgZG91YmxlCisgICAgX1RHX0FUVFJTCisgICAgX190Z19jcmVhbChsb25nIGRvdWJsZSBfX3gpIHtyZXR1cm4gX194O30KKworc3RhdGljIGZsb2F0CisgICAgX1RHX0FUVFJTCisgICAgX190Z19jcmVhbChmbG9hdCBfQ29tcGxleCBfX3gpIHtyZXR1cm4gY3JlYWxmKF9feCk7fQorCitzdGF0aWMgZG91YmxlCisgICAgX1RHX0FUVFJTCisgICAgX190Z19jcmVhbChkb3VibGUgX0NvbXBsZXggX194KSB7cmV0dXJuIGNyZWFsKF9feCk7fQorCitzdGF0aWMgbG9uZyBkb3VibGUKKyAgICBfVEdfQVRUUlMKKyAgICBfX3RnX2NyZWFsKGxvbmcgZG91YmxlIF9Db21wbGV4IF9feCkge3JldHVybiBjcmVhbGwoX194KTt9CisKKyN1bmRlZiBjcmVhbAorI2RlZmluZSBjcmVhbChfX3gpIF9fdGdfY3JlYWwoX190Z19wcm9tb3RlMSgoX194KSkoX194KSkKKworI3VuZGVmIF9UR19BVFRSU3AKKyN1bmRlZiBfVEdfQVRUUlMKKworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisjZW5kaWYgLyogX19UR01BVEhfSCAqLwpkaWZmIC0tZ2l0IGEvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvdG1taW50cmluLmggYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS90bW1pbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzI3OTZiCi0tLSAvZGV2L251bGwKKysrIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvdG1taW50cmluLmgKQEAgLTAsMCArMSw3NzMgQEAKKy8qPT09LS0tLSB0bW1pbnRyaW4uaCAtIFNTU0UzIGludHJpbnNpY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKgorICo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICovCisKKyNpZm5kZWYgX19UTU1JTlRSSU5fSAorI2RlZmluZSBfX1RNTUlOVFJJTl9ICisKKyNpbmNsdWRlIDxwbW1pbnRyaW4uaD4KKworLyogRGVmaW5lIHRoZSBkZWZhdWx0IGF0dHJpYnV0ZXMgZm9yIHRoZSBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlLiAqLworI2RlZmluZSBfX0RFRkFVTFRfRk5fQVRUUlMgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fLCBfX3RhcmdldF9fKCJzc3NlMyIpKSkKKworLy8vIFxicmllZiBDb21wdXRlcyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgZWFjaCBvZiB0aGUgcGFja2VkIDgtYml0IHNpZ25lZAorLy8vICAgIGludGVnZXJzIGluIHRoZSBzb3VyY2Ugb3BlcmFuZCBhbmQgc3RvcmVzIHRoZSA4LWJpdCB1bnNpZ25lZCBpbnRlZ2VyCisvLy8gICAgcmVzdWx0cyBpbiB0aGUgZGVzdGluYXRpb24uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgUEFCU0IgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSA2NC1iaXQgdmVjdG9yIG9mIFs4IHggaThdLgorLy8vIFxyZXR1cm5zIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIGFic29sdXRlIHZhbHVlcyBvZiB0aGUKKy8vLyAgICBlbGVtZW50cyBpbiB0aGUgb3BlcmFuZC4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2Fic19waTgoX19tNjQgX19hKQoreworICAgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcGFic2IoKF9fdjhxaSlfX2EpOworfQorCisvLy8gXGJyaWVmIENvbXB1dGVzIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBlYWNoIG9mIHRoZSBwYWNrZWQgOC1iaXQgc2lnbmVkCisvLy8gICAgaW50ZWdlcnMgaW4gdGhlIHNvdXJjZSBvcGVyYW5kIGFuZCBzdG9yZXMgdGhlIDgtYml0IHVuc2lnbmVkIGludGVnZXIKKy8vLyAgICByZXN1bHRzIGluIHRoZSBkZXN0aW5hdGlvbi4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWUEFCU0IgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbMTYgeCBpOF0uCisvLy8gXHJldHVybnMgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIGFic29sdXRlIHZhbHVlcyBvZiB0aGUKKy8vLyAgICBlbGVtZW50cyBpbiB0aGUgb3BlcmFuZC4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fYWJzX2VwaTgoX19tMTI4aSBfX2EpCit7CisgICAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BhYnNiMTI4KChfX3YxNnFpKV9fYSk7Cit9CisKKy8vLyBcYnJpZWYgQ29tcHV0ZXMgdGhlIGFic29sdXRlIHZhbHVlIG9mIGVhY2ggb2YgdGhlIHBhY2tlZCAxNi1iaXQgc2lnbmVkCisvLy8gICAgaW50ZWdlcnMgaW4gdGhlIHNvdXJjZSBvcGVyYW5kIGFuZCBzdG9yZXMgdGhlIDE2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyCisvLy8gICAgcmVzdWx0cyBpbiB0aGUgZGVzdGluYXRpb24uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgUEFCU1cgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSA2NC1iaXQgdmVjdG9yIG9mIFs0IHggaTE2XS4KKy8vLyBccmV0dXJucyBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIHRoZSBhYnNvbHV0ZSB2YWx1ZXMgb2YgdGhlCisvLy8gICAgZWxlbWVudHMgaW4gdGhlIG9wZXJhbmQuCitzdGF0aWMgX19pbmxpbmVfXyBfX202NCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9hYnNfcGkxNihfX202NCBfX2EpCit7CisgICAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9wYWJzdygoX192NGhpKV9fYSk7Cit9CisKKy8vLyBcYnJpZWYgQ29tcHV0ZXMgdGhlIGFic29sdXRlIHZhbHVlIG9mIGVhY2ggb2YgdGhlIHBhY2tlZCAxNi1iaXQgc2lnbmVkCisvLy8gICAgaW50ZWdlcnMgaW4gdGhlIHNvdXJjZSBvcGVyYW5kIGFuZCBzdG9yZXMgdGhlIDE2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyCisvLy8gICAgcmVzdWx0cyBpbiB0aGUgZGVzdGluYXRpb24uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVlBBQlNXIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzggeCBpMTZdLgorLy8vIFxyZXR1cm5zIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIHRoZSBhYnNvbHV0ZSB2YWx1ZXMgb2YgdGhlCisvLy8gICAgZWxlbWVudHMgaW4gdGhlIG9wZXJhbmQuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2Fic19lcGkxNihfX20xMjhpIF9fYSkKK3sKKyAgICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcGFic3cxMjgoKF9fdjhoaSlfX2EpOworfQorCisvLy8gXGJyaWVmIENvbXB1dGVzIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBlYWNoIG9mIHRoZSBwYWNrZWQgMzItYml0IHNpZ25lZAorLy8vICAgIGludGVnZXJzIGluIHRoZSBzb3VyY2Ugb3BlcmFuZCBhbmQgc3RvcmVzIHRoZSAzMi1iaXQgdW5zaWduZWQgaW50ZWdlcgorLy8vICAgIHJlc3VsdHMgaW4gdGhlIGRlc3RpbmF0aW9uLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFBBQlNEIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgNjQtYml0IHZlY3RvciBvZiBbMiB4IGkzMl0uCisvLy8gXHJldHVybnMgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgYWJzb2x1dGUgdmFsdWVzIG9mIHRoZQorLy8vICAgIGVsZW1lbnRzIGluIHRoZSBvcGVyYW5kLgorc3RhdGljIF9faW5saW5lX18gX19tNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fYWJzX3BpMzIoX19tNjQgX19hKQoreworICAgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcGFic2QoKF9fdjJzaSlfX2EpOworfQorCisvLy8gXGJyaWVmIENvbXB1dGVzIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBlYWNoIG9mIHRoZSBwYWNrZWQgMzItYml0IHNpZ25lZAorLy8vICAgIGludGVnZXJzIGluIHRoZSBzb3VyY2Ugb3BlcmFuZCBhbmQgc3RvcmVzIHRoZSAzMi1iaXQgdW5zaWduZWQgaW50ZWdlcgorLy8vICAgIHJlc3VsdHMgaW4gdGhlIGRlc3RpbmF0aW9uLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZQQUJTRCBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggaTMyXS4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgYWJzb2x1dGUgdmFsdWVzIG9mIHRoZQorLy8vICAgIGVsZW1lbnRzIGluIHRoZSBvcGVyYW5kLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9hYnNfZXBpMzIoX19tMTI4aSBfX2EpCit7CisgICAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BhYnNkMTI4KChfX3Y0c2kpX19hKTsKK30KKworLy8vIFxicmllZiBDb25jYXRlbmF0ZXMgdGhlIHR3byAxMjgtYml0IGludGVnZXIgdmVjdG9yIG9wZXJhbmRzLCBhbmQKKy8vLyAgICByaWdodC1zaGlmdHMgdGhlIHJlc3VsdCBieSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHNwZWNpZmllZCBpbiB0aGUgaW1tZWRpYXRlCisvLy8gICAgb3BlcmFuZC4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFxjb2RlCisvLy8gX19tMTI4aSBfbW1fYWxpZ25yX2VwaTgoX19tMTI4aSBhLCBfX20xMjhpIGIsIGNvbnN0IGludCBuKTsKKy8vLyBcZW5kY29kZQorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFBBTElHTlIgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzE2IHggaThdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBzb3VyY2Ugb3BlcmFuZHMuCisvLy8gXHBhcmFtIGIKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFsxNiB4IGk4XSBjb250YWluaW5nIG9uZSBvZiB0aGUgc291cmNlIG9wZXJhbmRzLgorLy8vIFxwYXJhbSBuCisvLy8gICAgQW4gaW1tZWRpYXRlIG9wZXJhbmQgc3BlY2lmeWluZyBob3cgbWFueSBieXRlcyB0byByaWdodC1zaGlmdCB0aGUgcmVzdWx0LgorLy8vIFxyZXR1cm5zIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIHRoZSBjb25jYXRlbmF0ZWQgcmlnaHQtc2hpZnRlZAorLy8vICAgIHZhbHVlLgorI2RlZmluZSBfbW1fYWxpZ25yX2VwaTgoYSwgYiwgbikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BhbGlnbnIxMjgoKF9fdjE2cWkpKF9fbTEyOGkpKGEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2cWkpKF9fbTEyOGkpKGIpLCAobikpOyB9KQorCisvLy8gXGJyaWVmIENvbmNhdGVuYXRlcyB0aGUgdHdvIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvcGVyYW5kcywgYW5kIHJpZ2h0LXNoaWZ0cworLy8vICAgIHRoZSByZXN1bHQgYnkgdGhlIG51bWJlciBvZiBieXRlcyBzcGVjaWZpZWQgaW4gdGhlIGltbWVkaWF0ZSBvcGVyYW5kLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gXGNvZGUKKy8vLyBfX202NCBfbW1fYWxpZ25yX3BpOChfX202NCBhLCBfX202NCBiLCBjb25zdCBpbnQgbik7CisvLy8gXGVuZGNvZGUKKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBQQUxJR05SIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIGEKKy8vLyAgICBBIDY0LWJpdCB2ZWN0b3Igb2YgWzggeCBpOF0gY29udGFpbmluZyBvbmUgb2YgdGhlIHNvdXJjZSBvcGVyYW5kcy4KKy8vLyBccGFyYW0gYgorLy8vICAgIEEgNjQtYml0IHZlY3RvciBvZiBbOCB4IGk4XSBjb250YWluaW5nIG9uZSBvZiB0aGUgc291cmNlIG9wZXJhbmRzLgorLy8vIFxwYXJhbSBuCisvLy8gICAgQW4gaW1tZWRpYXRlIG9wZXJhbmQgc3BlY2lmeWluZyBob3cgbWFueSBieXRlcyB0byByaWdodC1zaGlmdCB0aGUgcmVzdWx0LgorLy8vIFxyZXR1cm5zIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIGNvbmNhdGVuYXRlZCByaWdodC1zaGlmdGVkCisvLy8gICAgdmFsdWUuCisjZGVmaW5lIF9tbV9hbGlnbnJfcGk4KGEsIGIsIG4pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tNjQpX19idWlsdGluX2lhMzJfcGFsaWducigoX192OHFpKShfX202NCkoYSksIChfX3Y4cWkpKF9fbTY0KShiKSwgKG4pKTsgfSkKKworLy8vIFxicmllZiBIb3Jpem9udGFsbHkgYWRkcyB0aGUgYWRqYWNlbnQgcGFpcnMgb2YgdmFsdWVzIGNvbnRhaW5lZCBpbiAyIHBhY2tlZAorLy8vICAgIDEyOC1iaXQgdmVjdG9ycyBvZiBbOCB4IGkxNl0uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVlBIQUREVyBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs4IHggaTE2XSBjb250YWluaW5nIG9uZSBvZiB0aGUgc291cmNlIG9wZXJhbmRzLiBUaGUKKy8vLyAgICBob3Jpem9udGFsIHN1bXMgb2YgdGhlIHZhbHVlcyBhcmUgc3RvcmVkIGluIHRoZSBsb3dlciBiaXRzIG9mIHRoZQorLy8vICAgIGRlc3RpbmF0aW9uLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs4IHggaTE2XSBjb250YWluaW5nIG9uZSBvZiB0aGUgc291cmNlIG9wZXJhbmRzLiBUaGUKKy8vLyAgICBob3Jpem9udGFsIHN1bXMgb2YgdGhlIHZhbHVlcyBhcmUgc3RvcmVkIGluIHRoZSB1cHBlciBiaXRzIG9mIHRoZQorLy8vICAgIGRlc3RpbmF0aW9uLgorLy8vIFxyZXR1cm5zIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzggeCBpMTZdIGNvbnRhaW5pbmcgdGhlIGhvcml6b250YWwgc3VtcyBvZgorLy8vICAgIGJvdGggb3BlcmFuZHMuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2hhZGRfZXBpMTYoX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKQoreworICAgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9waGFkZHcxMjgoKF9fdjhoaSlfX2EsIChfX3Y4aGkpX19iKTsKK30KKworLy8vIFxicmllZiBIb3Jpem9udGFsbHkgYWRkcyB0aGUgYWRqYWNlbnQgcGFpcnMgb2YgdmFsdWVzIGNvbnRhaW5lZCBpbiAyIHBhY2tlZAorLy8vICAgIDEyOC1iaXQgdmVjdG9ycyBvZiBbNCB4IGkzMl0uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVlBIQURERCBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggaTMyXSBjb250YWluaW5nIG9uZSBvZiB0aGUgc291cmNlIG9wZXJhbmRzLiBUaGUKKy8vLyAgICBob3Jpem9udGFsIHN1bXMgb2YgdGhlIHZhbHVlcyBhcmUgc3RvcmVkIGluIHRoZSBsb3dlciBiaXRzIG9mIHRoZQorLy8vICAgIGRlc3RpbmF0aW9uLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggaTMyXSBjb250YWluaW5nIG9uZSBvZiB0aGUgc291cmNlIG9wZXJhbmRzLiBUaGUKKy8vLyAgICBob3Jpem9udGFsIHN1bXMgb2YgdGhlIHZhbHVlcyBhcmUgc3RvcmVkIGluIHRoZSB1cHBlciBiaXRzIG9mIHRoZQorLy8vICAgIGRlc3RpbmF0aW9uLgorLy8vIFxyZXR1cm5zIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBpMzJdIGNvbnRhaW5pbmcgdGhlIGhvcml6b250YWwgc3VtcyBvZgorLy8vICAgIGJvdGggb3BlcmFuZHMuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2hhZGRfZXBpMzIoX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKQoreworICAgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9waGFkZGQxMjgoKF9fdjRzaSlfX2EsIChfX3Y0c2kpX19iKTsKK30KKworLy8vIFxicmllZiBIb3Jpem9udGFsbHkgYWRkcyB0aGUgYWRqYWNlbnQgcGFpcnMgb2YgdmFsdWVzIGNvbnRhaW5lZCBpbiAyIHBhY2tlZAorLy8vICAgIDY0LWJpdCB2ZWN0b3JzIG9mIFs0IHggaTE2XS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBQSEFERFcgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSA2NC1iaXQgdmVjdG9yIG9mIFs0IHggaTE2XSBjb250YWluaW5nIG9uZSBvZiB0aGUgc291cmNlIG9wZXJhbmRzLiBUaGUKKy8vLyAgICBob3Jpem9udGFsIHN1bXMgb2YgdGhlIHZhbHVlcyBhcmUgc3RvcmVkIGluIHRoZSBsb3dlciBiaXRzIG9mIHRoZQorLy8vICAgIGRlc3RpbmF0aW9uLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDY0LWJpdCB2ZWN0b3Igb2YgWzQgeCBpMTZdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBzb3VyY2Ugb3BlcmFuZHMuIFRoZQorLy8vICAgIGhvcml6b250YWwgc3VtcyBvZiB0aGUgdmFsdWVzIGFyZSBzdG9yZWQgaW4gdGhlIHVwcGVyIGJpdHMgb2YgdGhlCisvLy8gICAgZGVzdGluYXRpb24uCisvLy8gXHJldHVybnMgQSA2NC1iaXQgdmVjdG9yIG9mIFs0IHggaTE2XSBjb250YWluaW5nIHRoZSBob3Jpem9udGFsIHN1bXMgb2YgYm90aAorLy8vICAgIG9wZXJhbmRzLgorc3RhdGljIF9faW5saW5lX18gX19tNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1faGFkZF9waTE2KF9fbTY0IF9fYSwgX19tNjQgX19iKQoreworICAgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcGhhZGR3KChfX3Y0aGkpX19hLCAoX192NGhpKV9fYik7Cit9CisKKy8vLyBcYnJpZWYgSG9yaXpvbnRhbGx5IGFkZHMgdGhlIGFkamFjZW50IHBhaXJzIG9mIHZhbHVlcyBjb250YWluZWQgaW4gMiBwYWNrZWQKKy8vLyAgICA2NC1iaXQgdmVjdG9ycyBvZiBbMiB4IGkzMl0uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgUEhBREREIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgNjQtYml0IHZlY3RvciBvZiBbMiB4IGkzMl0gY29udGFpbmluZyBvbmUgb2YgdGhlIHNvdXJjZSBvcGVyYW5kcy4gVGhlCisvLy8gICAgaG9yaXpvbnRhbCBzdW1zIG9mIHRoZSB2YWx1ZXMgYXJlIHN0b3JlZCBpbiB0aGUgbG93ZXIgYml0cyBvZiB0aGUKKy8vLyAgICBkZXN0aW5hdGlvbi4KKy8vLyBccGFyYW0gX19iCisvLy8gICAgQSA2NC1iaXQgdmVjdG9yIG9mIFsyIHggaTMyXSBjb250YWluaW5nIG9uZSBvZiB0aGUgc291cmNlIG9wZXJhbmRzLiBUaGUKKy8vLyAgICBob3Jpem9udGFsIHN1bXMgb2YgdGhlIHZhbHVlcyBhcmUgc3RvcmVkIGluIHRoZSB1cHBlciBiaXRzIG9mIHRoZQorLy8vICAgIGRlc3RpbmF0aW9uLgorLy8vIFxyZXR1cm5zIEEgNjQtYml0IHZlY3RvciBvZiBbMiB4IGkzMl0gY29udGFpbmluZyB0aGUgaG9yaXpvbnRhbCBzdW1zIG9mIGJvdGgKKy8vLyAgICBvcGVyYW5kcy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2hhZGRfcGkzMihfX202NCBfX2EsIF9fbTY0IF9fYikKK3sKKyAgICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BoYWRkZCgoX192MnNpKV9fYSwgKF9fdjJzaSlfX2IpOworfQorCisvLy8gXGJyaWVmIEhvcml6b250YWxseSBhZGRzIHRoZSBhZGphY2VudCBwYWlycyBvZiB2YWx1ZXMgY29udGFpbmVkIGluIDIgcGFja2VkCisvLy8gICAgMTI4LWJpdCB2ZWN0b3JzIG9mIFs4IHggaTE2XS4gUG9zaXRpdmUgc3VtcyBncmVhdGVyIHRoYW4gN0ZGRmggYXJlCisvLy8gICAgc2F0dXJhdGVkIHRvIDdGRkZoLiBOZWdhdGl2ZSBzdW1zIGxlc3MgdGhhbiA4MDAwaCBhcmUgc2F0dXJhdGVkIHRvIDgwMDBoLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZQSEFERFNXIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzggeCBpMTZdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBzb3VyY2Ugb3BlcmFuZHMuIFRoZQorLy8vICAgIGhvcml6b250YWwgc3VtcyBvZiB0aGUgdmFsdWVzIGFyZSBzdG9yZWQgaW4gdGhlIGxvd2VyIGJpdHMgb2YgdGhlCisvLy8gICAgZGVzdGluYXRpb24uCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzggeCBpMTZdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBzb3VyY2Ugb3BlcmFuZHMuIFRoZQorLy8vICAgIGhvcml6b250YWwgc3VtcyBvZiB0aGUgdmFsdWVzIGFyZSBzdG9yZWQgaW4gdGhlIHVwcGVyIGJpdHMgb2YgdGhlCisvLy8gICAgZGVzdGluYXRpb24uCisvLy8gXHJldHVybnMgQSAxMjgtYml0IHZlY3RvciBvZiBbOCB4IGkxNl0gY29udGFpbmluZyB0aGUgaG9yaXpvbnRhbCBzYXR1cmF0ZWQKKy8vLyAgICBzdW1zIG9mIGJvdGggb3BlcmFuZHMuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2hhZGRzX2VwaTE2KF9fbTEyOGkgX19hLCBfX20xMjhpIF9fYikKK3sKKyAgICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcGhhZGRzdzEyOCgoX192OGhpKV9fYSwgKF9fdjhoaSlfX2IpOworfQorCisvLy8gXGJyaWVmIEhvcml6b250YWxseSBhZGRzIHRoZSBhZGphY2VudCBwYWlycyBvZiB2YWx1ZXMgY29udGFpbmVkIGluIDIgcGFja2VkCisvLy8gICAgNjQtYml0IHZlY3RvcnMgb2YgWzQgeCBpMTZdLiBQb3NpdGl2ZSBzdW1zIGdyZWF0ZXIgdGhhbiA3RkZGaCBhcmUKKy8vLyAgICBzYXR1cmF0ZWQgdG8gN0ZGRmguIE5lZ2F0aXZlIHN1bXMgbGVzcyB0aGFuIDgwMDBoIGFyZSBzYXR1cmF0ZWQgdG8gODAwMGguCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgUEhBRERTVyBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDY0LWJpdCB2ZWN0b3Igb2YgWzQgeCBpMTZdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBzb3VyY2Ugb3BlcmFuZHMuIFRoZQorLy8vICAgIGhvcml6b250YWwgc3VtcyBvZiB0aGUgdmFsdWVzIGFyZSBzdG9yZWQgaW4gdGhlIGxvd2VyIGJpdHMgb2YgdGhlCisvLy8gICAgZGVzdGluYXRpb24uCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgNjQtYml0IHZlY3RvciBvZiBbNCB4IGkxNl0gY29udGFpbmluZyBvbmUgb2YgdGhlIHNvdXJjZSBvcGVyYW5kcy4gVGhlCisvLy8gICAgaG9yaXpvbnRhbCBzdW1zIG9mIHRoZSB2YWx1ZXMgYXJlIHN0b3JlZCBpbiB0aGUgdXBwZXIgYml0cyBvZiB0aGUKKy8vLyAgICBkZXN0aW5hdGlvbi4KKy8vLyBccmV0dXJucyBBIDY0LWJpdCB2ZWN0b3Igb2YgWzQgeCBpMTZdIGNvbnRhaW5pbmcgdGhlIGhvcml6b250YWwgc2F0dXJhdGVkCisvLy8gICAgc3VtcyBvZiBib3RoIG9wZXJhbmRzLgorc3RhdGljIF9faW5saW5lX18gX19tNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1faGFkZHNfcGkxNihfX202NCBfX2EsIF9fbTY0IF9fYikKK3sKKyAgICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BoYWRkc3coKF9fdjRoaSlfX2EsIChfX3Y0aGkpX19iKTsKK30KKworLy8vIFxicmllZiBIb3Jpem9udGFsbHkgc3VidHJhY3RzIHRoZSBhZGphY2VudCBwYWlycyBvZiB2YWx1ZXMgY29udGFpbmVkIGluIDIKKy8vLyAgICBwYWNrZWQgMTI4LWJpdCB2ZWN0b3JzIG9mIFs4IHggaTE2XS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWUEhTVUJXIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzggeCBpMTZdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBzb3VyY2Ugb3BlcmFuZHMuIFRoZQorLy8vICAgIGhvcml6b250YWwgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgdmFsdWVzIGFyZSBzdG9yZWQgaW4gdGhlIGxvd2VyIGJpdHMgb2YKKy8vLyAgICB0aGUgZGVzdGluYXRpb24uCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzggeCBpMTZdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBzb3VyY2Ugb3BlcmFuZHMuIFRoZQorLy8vICAgIGhvcml6b250YWwgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgdmFsdWVzIGFyZSBzdG9yZWQgaW4gdGhlIHVwcGVyIGJpdHMgb2YKKy8vLyAgICB0aGUgZGVzdGluYXRpb24uCisvLy8gXHJldHVybnMgQSAxMjgtYml0IHZlY3RvciBvZiBbOCB4IGkxNl0gY29udGFpbmluZyB0aGUgaG9yaXpvbnRhbCBkaWZmZXJlbmNlcworLy8vICAgIG9mIGJvdGggb3BlcmFuZHMuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2hzdWJfZXBpMTYoX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKQoreworICAgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9waHN1YncxMjgoKF9fdjhoaSlfX2EsIChfX3Y4aGkpX19iKTsKK30KKworLy8vIFxicmllZiBIb3Jpem9udGFsbHkgc3VidHJhY3RzIHRoZSBhZGphY2VudCBwYWlycyBvZiB2YWx1ZXMgY29udGFpbmVkIGluIDIKKy8vLyAgICBwYWNrZWQgMTI4LWJpdCB2ZWN0b3JzIG9mIFs0IHggaTMyXS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWUEhTVUJEIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBpMzJdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBzb3VyY2Ugb3BlcmFuZHMuIFRoZQorLy8vICAgIGhvcml6b250YWwgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgdmFsdWVzIGFyZSBzdG9yZWQgaW4gdGhlIGxvd2VyIGJpdHMgb2YKKy8vLyAgICB0aGUgZGVzdGluYXRpb24uCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBpMzJdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBzb3VyY2Ugb3BlcmFuZHMuIFRoZQorLy8vICAgIGhvcml6b250YWwgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgdmFsdWVzIGFyZSBzdG9yZWQgaW4gdGhlIHVwcGVyIGJpdHMgb2YKKy8vLyAgICB0aGUgZGVzdGluYXRpb24uCisvLy8gXHJldHVybnMgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGkzMl0gY29udGFpbmluZyB0aGUgaG9yaXpvbnRhbCBkaWZmZXJlbmNlcworLy8vICAgIG9mIGJvdGggb3BlcmFuZHMuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2hzdWJfZXBpMzIoX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKQoreworICAgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9waHN1YmQxMjgoKF9fdjRzaSlfX2EsIChfX3Y0c2kpX19iKTsKK30KKworLy8vIFxicmllZiBIb3Jpem9udGFsbHkgc3VidHJhY3RzIHRoZSBhZGphY2VudCBwYWlycyBvZiB2YWx1ZXMgY29udGFpbmVkIGluIDIKKy8vLyAgICBwYWNrZWQgNjQtYml0IHZlY3RvcnMgb2YgWzQgeCBpMTZdLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFBIU1VCVyBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDY0LWJpdCB2ZWN0b3Igb2YgWzQgeCBpMTZdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBzb3VyY2Ugb3BlcmFuZHMuIFRoZQorLy8vICAgIGhvcml6b250YWwgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgdmFsdWVzIGFyZSBzdG9yZWQgaW4gdGhlIGxvd2VyIGJpdHMgb2YKKy8vLyAgICB0aGUgZGVzdGluYXRpb24uCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgNjQtYml0IHZlY3RvciBvZiBbNCB4IGkxNl0gY29udGFpbmluZyBvbmUgb2YgdGhlIHNvdXJjZSBvcGVyYW5kcy4gVGhlCisvLy8gICAgaG9yaXpvbnRhbCBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSB2YWx1ZXMgYXJlIHN0b3JlZCBpbiB0aGUgdXBwZXIgYml0cyBvZgorLy8vICAgIHRoZSBkZXN0aW5hdGlvbi4KKy8vLyBccmV0dXJucyBBIDY0LWJpdCB2ZWN0b3Igb2YgWzQgeCBpMTZdIGNvbnRhaW5pbmcgdGhlIGhvcml6b250YWwgZGlmZmVyZW5jZXMKKy8vLyAgICBvZiBib3RoIG9wZXJhbmRzLgorc3RhdGljIF9faW5saW5lX18gX19tNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1faHN1Yl9waTE2KF9fbTY0IF9fYSwgX19tNjQgX19iKQoreworICAgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcGhzdWJ3KChfX3Y0aGkpX19hLCAoX192NGhpKV9fYik7Cit9CisKKy8vLyBcYnJpZWYgSG9yaXpvbnRhbGx5IHN1YnRyYWN0cyB0aGUgYWRqYWNlbnQgcGFpcnMgb2YgdmFsdWVzIGNvbnRhaW5lZCBpbiAyCisvLy8gICAgcGFja2VkIDY0LWJpdCB2ZWN0b3JzIG9mIFsyIHggaTMyXS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBQSFNVQkQgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSA2NC1iaXQgdmVjdG9yIG9mIFsyIHggaTMyXSBjb250YWluaW5nIG9uZSBvZiB0aGUgc291cmNlIG9wZXJhbmRzLiBUaGUKKy8vLyAgICBob3Jpem9udGFsIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIHZhbHVlcyBhcmUgc3RvcmVkIGluIHRoZSBsb3dlciBiaXRzIG9mCisvLy8gICAgdGhlIGRlc3RpbmF0aW9uLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDY0LWJpdCB2ZWN0b3Igb2YgWzIgeCBpMzJdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBzb3VyY2Ugb3BlcmFuZHMuIFRoZQorLy8vICAgIGhvcml6b250YWwgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgdmFsdWVzIGFyZSBzdG9yZWQgaW4gdGhlIHVwcGVyIGJpdHMgb2YKKy8vLyAgICB0aGUgZGVzdGluYXRpb24uCisvLy8gXHJldHVybnMgQSA2NC1iaXQgdmVjdG9yIG9mIFsyIHggaTMyXSBjb250YWluaW5nIHRoZSBob3Jpem9udGFsIGRpZmZlcmVuY2VzCisvLy8gICAgb2YgYm90aCBvcGVyYW5kcy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2hzdWJfcGkzMihfX202NCBfX2EsIF9fbTY0IF9fYikKK3sKKyAgICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3Boc3ViZCgoX192MnNpKV9fYSwgKF9fdjJzaSlfX2IpOworfQorCisvLy8gXGJyaWVmIEhvcml6b250YWxseSBzdWJ0cmFjdHMgdGhlIGFkamFjZW50IHBhaXJzIG9mIHZhbHVlcyBjb250YWluZWQgaW4gMgorLy8vICAgIHBhY2tlZCAxMjgtYml0IHZlY3RvcnMgb2YgWzggeCBpMTZdLiBQb3NpdGl2ZSBkaWZmZXJlbmNlcyBncmVhdGVyIHRoYW4KKy8vLyAgICA3RkZGaCBhcmUgc2F0dXJhdGVkIHRvIDdGRkZoLiBOZWdhdGl2ZSBkaWZmZXJlbmNlcyBsZXNzIHRoYW4gODAwMGggYXJlCisvLy8gICAgc2F0dXJhdGVkIHRvIDgwMDBoLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZQSFNVQlNXIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzggeCBpMTZdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBzb3VyY2Ugb3BlcmFuZHMuIFRoZQorLy8vICAgIGhvcml6b250YWwgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgdmFsdWVzIGFyZSBzdG9yZWQgaW4gdGhlIGxvd2VyIGJpdHMgb2YKKy8vLyAgICB0aGUgZGVzdGluYXRpb24uCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzggeCBpMTZdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBzb3VyY2Ugb3BlcmFuZHMuIFRoZQorLy8vICAgIGhvcml6b250YWwgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgdmFsdWVzIGFyZSBzdG9yZWQgaW4gdGhlIHVwcGVyIGJpdHMgb2YKKy8vLyAgICB0aGUgZGVzdGluYXRpb24uCisvLy8gXHJldHVybnMgQSAxMjgtYml0IHZlY3RvciBvZiBbOCB4IGkxNl0gY29udGFpbmluZyB0aGUgaG9yaXpvbnRhbCBzYXR1cmF0ZWQKKy8vLyAgICBkaWZmZXJlbmNlcyBvZiBib3RoIG9wZXJhbmRzLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9oc3Vic19lcGkxNihfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IpCit7CisgICAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3Boc3Vic3cxMjgoKF9fdjhoaSlfX2EsIChfX3Y4aGkpX19iKTsKK30KKworLy8vIFxicmllZiBIb3Jpem9udGFsbHkgc3VidHJhY3RzIHRoZSBhZGphY2VudCBwYWlycyBvZiB2YWx1ZXMgY29udGFpbmVkIGluIDIKKy8vLyAgICBwYWNrZWQgNjQtYml0IHZlY3RvcnMgb2YgWzQgeCBpMTZdLiBQb3NpdGl2ZSBkaWZmZXJlbmNlcyBncmVhdGVyIHRoYW4KKy8vLyAgICA3RkZGaCBhcmUgc2F0dXJhdGVkIHRvIDdGRkZoLiBOZWdhdGl2ZSBkaWZmZXJlbmNlcyBsZXNzIHRoYW4gODAwMGggYXJlCisvLy8gICAgc2F0dXJhdGVkIHRvIDgwMDBoLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFBIU1VCU1cgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSA2NC1iaXQgdmVjdG9yIG9mIFs0IHggaTE2XSBjb250YWluaW5nIG9uZSBvZiB0aGUgc291cmNlIG9wZXJhbmRzLiBUaGUKKy8vLyAgICBob3Jpem9udGFsIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIHZhbHVlcyBhcmUgc3RvcmVkIGluIHRoZSBsb3dlciBiaXRzIG9mCisvLy8gICAgdGhlIGRlc3RpbmF0aW9uLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDY0LWJpdCB2ZWN0b3Igb2YgWzQgeCBpMTZdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBzb3VyY2Ugb3BlcmFuZHMuIFRoZQorLy8vICAgIGhvcml6b250YWwgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgdmFsdWVzIGFyZSBzdG9yZWQgaW4gdGhlIHVwcGVyIGJpdHMgb2YKKy8vLyAgICB0aGUgZGVzdGluYXRpb24uCisvLy8gXHJldHVybnMgQSA2NC1iaXQgdmVjdG9yIG9mIFs0IHggaTE2XSBjb250YWluaW5nIHRoZSBob3Jpem9udGFsIHNhdHVyYXRlZAorLy8vICAgIGRpZmZlcmVuY2VzIG9mIGJvdGggb3BlcmFuZHMuCitzdGF0aWMgX19pbmxpbmVfXyBfX202NCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9oc3Vic19waTE2KF9fbTY0IF9fYSwgX19tNjQgX19iKQoreworICAgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcGhzdWJzdygoX192NGhpKV9fYSwgKF9fdjRoaSlfX2IpOworfQorCisvLy8gXGJyaWVmIE11bHRpcGxpZXMgY29ycmVzcG9uZGluZyBwYWlycyBvZiBwYWNrZWQgOC1iaXQgdW5zaWduZWQgaW50ZWdlcgorLy8vICAgIHZhbHVlcyBjb250YWluZWQgaW4gdGhlIGZpcnN0IHNvdXJjZSBvcGVyYW5kIGFuZCBwYWNrZWQgOC1iaXQgc2lnbmVkCisvLy8gICAgaW50ZWdlciB2YWx1ZXMgY29udGFpbmVkIGluIHRoZSBzZWNvbmQgc291cmNlIG9wZXJhbmQsIGFkZHMgcGFpcnMgb2YKKy8vLyAgICBjb250aWd1b3VzIHByb2R1Y3RzIHdpdGggc2lnbmVkIHNhdHVyYXRpb24sIGFuZCB3cml0ZXMgdGhlIDE2LWJpdCBzdW1zIHRvCisvLy8gICAgdGhlIGNvcnJlc3BvbmRpbmcgYml0cyBpbiB0aGUgZGVzdGluYXRpb24uIEZvciBleGFtcGxlLCBiaXRzIFs3OjBdIG9mCisvLy8gICAgYm90aCBvcGVyYW5kcyBhcmUgbXVsdGlwbGllZCwgYml0cyBbMTU6OF0gb2YgYm90aCBvcGVyYW5kcyBhcmUKKy8vLyAgICBtdWx0aXBsaWVkLCBhbmQgdGhlIHN1bSBvZiBib3RoIHJlc3VsdHMgaXMgd3JpdHRlbiB0byBiaXRzIFsxNTowXSBvZiB0aGUKKy8vLyAgICBkZXN0aW5hdGlvbi4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWUE1BRERVQlNXIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIHRoZSBmaXJzdCBzb3VyY2Ugb3BlcmFuZC4KKy8vLyBccGFyYW0gX19iCisvLy8gICAgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIHNlY29uZCBzb3VyY2Ugb3BlcmFuZC4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgc3VtcyBvZiBwcm9kdWN0cyBvZiBib3RoCisvLy8gICAgb3BlcmFuZHM6CisvLy8gICAgUjAgOj0gKF9fYTAgKiBfX2IwKSArIChfX2ExICogX19iMSkKKy8vLyAgICBSMSA6PSAoX19hMiAqIF9fYjIpICsgKF9fYTMgKiBfX2IzKQorLy8vICAgIFIyIDo9IChfX2E0ICogX19iNCkgKyAoX19hNSAqIF9fYjUpCisvLy8gICAgUjMgOj0gKF9fYTYgKiBfX2I2KSArIChfX2E3ICogX19iNykKKy8vLyAgICBSNCA6PSAoX19hOCAqIF9fYjgpICsgKF9fYTkgKiBfX2I5KQorLy8vICAgIFI1IDo9IChfX2ExMCAqIF9fYjEwKSArIChfX2ExMSAqIF9fYjExKQorLy8vICAgIFI2IDo9IChfX2ExMiAqIF9fYjEyKSArIChfX2ExMyAqIF9fYjEzKQorLy8vICAgIFI3IDo9IChfX2ExNCAqIF9fYjE0KSArIChfX2ExNSAqIF9fYjE1KQorc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYWRkdWJzX2VwaTE2KF9fbTEyOGkgX19hLCBfX20xMjhpIF9fYikKK3sKKyAgICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcG1hZGR1YnN3MTI4KChfX3YxNnFpKV9fYSwgKF9fdjE2cWkpX19iKTsKK30KKworLy8vIFxicmllZiBNdWx0aXBsaWVzIGNvcnJlc3BvbmRpbmcgcGFpcnMgb2YgcGFja2VkIDgtYml0IHVuc2lnbmVkIGludGVnZXIKKy8vLyAgICB2YWx1ZXMgY29udGFpbmVkIGluIHRoZSBmaXJzdCBzb3VyY2Ugb3BlcmFuZCBhbmQgcGFja2VkIDgtYml0IHNpZ25lZAorLy8vICAgIGludGVnZXIgdmFsdWVzIGNvbnRhaW5lZCBpbiB0aGUgc2Vjb25kIHNvdXJjZSBvcGVyYW5kLCBhZGRzIHBhaXJzIG9mCisvLy8gICAgY29udGlndW91cyBwcm9kdWN0cyB3aXRoIHNpZ25lZCBzYXR1cmF0aW9uLCBhbmQgd3JpdGVzIHRoZSAxNi1iaXQgc3VtcyB0bworLy8vICAgIHRoZSBjb3JyZXNwb25kaW5nIGJpdHMgaW4gdGhlIGRlc3RpbmF0aW9uLiBGb3IgZXhhbXBsZSwgYml0cyBbNzowXSBvZgorLy8vICAgIGJvdGggb3BlcmFuZHMgYXJlIG11bHRpcGxpZWQsIGJpdHMgWzE1OjhdIG9mIGJvdGggb3BlcmFuZHMgYXJlCisvLy8gICAgbXVsdGlwbGllZCwgYW5kIHRoZSBzdW0gb2YgYm90aCByZXN1bHRzIGlzIHdyaXR0ZW4gdG8gYml0cyBbMTU6MF0gb2YgdGhlCisvLy8gICAgZGVzdGluYXRpb24uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgUE1BRERVQlNXIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIGZpcnN0IHNvdXJjZSBvcGVyYW5kLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIHRoZSBzZWNvbmQgc291cmNlIG9wZXJhbmQuCisvLy8gXHJldHVybnMgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgc3VtcyBvZiBwcm9kdWN0cyBvZiBib3RoCisvLy8gICAgb3BlcmFuZHM6CisvLy8gICAgUjAgOj0gKF9fYTAgKiBfX2IwKSArIChfX2ExICogX19iMSkKKy8vLyAgICBSMSA6PSAoX19hMiAqIF9fYjIpICsgKF9fYTMgKiBfX2IzKQorLy8vICAgIFIyIDo9IChfX2E0ICogX19iNCkgKyAoX19hNSAqIF9fYjUpCisvLy8gICAgUjMgOj0gKF9fYTYgKiBfX2I2KSArIChfX2E3ICogX19iNykKK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hZGR1YnNfcGkxNihfX202NCBfX2EsIF9fbTY0IF9fYikKK3sKKyAgICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BtYWRkdWJzdygoX192OHFpKV9fYSwgKF9fdjhxaSlfX2IpOworfQorCisvLy8gXGJyaWVmIE11bHRpcGxpZXMgcGFja2VkIDE2LWJpdCBzaWduZWQgaW50ZWdlciB2YWx1ZXMsIHRydW5jYXRlcyB0aGUgMzItYml0CisvLy8gICAgcHJvZHVjdHMgdG8gdGhlIDE4IG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBieSByaWdodC1zaGlmdGluZywgcm91bmRzIHRoZQorLy8vICAgIHRydW5jYXRlZCB2YWx1ZSBieSBhZGRpbmcgMSwgYW5kIHdyaXRlcyBiaXRzIFsxNjoxXSB0byB0aGUgZGVzdGluYXRpb24uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVlBNVUxIUlNXIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzggeCBpMTZdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBzb3VyY2Ugb3BlcmFuZHMuCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzggeCBpMTZdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBzb3VyY2Ugb3BlcmFuZHMuCisvLy8gXHJldHVybnMgQSAxMjgtYml0IHZlY3RvciBvZiBbOCB4IGkxNl0gY29udGFpbmluZyB0aGUgcm91bmRlZCBhbmQgc2NhbGVkCisvLy8gICAgcHJvZHVjdHMgb2YgYm90aCBvcGVyYW5kcy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbXVsaHJzX2VwaTE2KF9fbTEyOGkgX19hLCBfX20xMjhpIF9fYikKK3sKKyAgICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcG11bGhyc3cxMjgoKF9fdjhoaSlfX2EsIChfX3Y4aGkpX19iKTsKK30KKworLy8vIFxicmllZiBNdWx0aXBsaWVzIHBhY2tlZCAxNi1iaXQgc2lnbmVkIGludGVnZXIgdmFsdWVzLCB0cnVuY2F0ZXMgdGhlIDMyLWJpdAorLy8vICAgIHByb2R1Y3RzIHRvIHRoZSAxOCBtb3N0IHNpZ25pZmljYW50IGJpdHMgYnkgcmlnaHQtc2hpZnRpbmcsIHJvdW5kcyB0aGUKKy8vLyAgICB0cnVuY2F0ZWQgdmFsdWUgYnkgYWRkaW5nIDEsIGFuZCB3cml0ZXMgYml0cyBbMTY6MV0gdG8gdGhlIGRlc3RpbmF0aW9uLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFBNVUxIUlNXIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgNjQtYml0IHZlY3RvciBvZiBbNCB4IGkxNl0gY29udGFpbmluZyBvbmUgb2YgdGhlIHNvdXJjZSBvcGVyYW5kcy4KKy8vLyBccGFyYW0gX19iCisvLy8gICAgQSA2NC1iaXQgdmVjdG9yIG9mIFs0IHggaTE2XSBjb250YWluaW5nIG9uZSBvZiB0aGUgc291cmNlIG9wZXJhbmRzLgorLy8vIFxyZXR1cm5zIEEgNjQtYml0IHZlY3RvciBvZiBbNCB4IGkxNl0gY29udGFpbmluZyB0aGUgcm91bmRlZCBhbmQgc2NhbGVkCisvLy8gICAgcHJvZHVjdHMgb2YgYm90aCBvcGVyYW5kcy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tX211bGhyc19waTE2KF9fbTY0IF9fYSwgX19tNjQgX19iKQoreworICAgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcG11bGhyc3coKF9fdjRoaSlfX2EsIChfX3Y0aGkpX19iKTsKK30KKworLy8vIFxicmllZiBDb3BpZXMgdGhlIDgtYml0IGludGVnZXJzIGZyb20gYSAxMjgtYml0IGludGVnZXIgdmVjdG9yIHRvIHRoZQorLy8vICAgIGRlc3RpbmF0aW9uIG9yIGNsZWFycyA4LWJpdCB2YWx1ZXMgaW4gdGhlIGRlc3RpbmF0aW9uLCBhcyBzcGVjaWZpZWQgYnkKKy8vLyAgICB0aGUgc2Vjb25kIHNvdXJjZSBvcGVyYW5kLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZQU0hVRkIgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIHZhbHVlcyB0byBiZSBjb3BpZWQuCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIGNvbnRyb2wgYnl0ZXMgY29ycmVzcG9uZGluZyB0bworLy8vICAgIHBvc2l0aW9ucyBpbiB0aGUgZGVzdGluYXRpb246CisvLy8gICAgQml0IDc6CisvLy8gICAgMTogQ2xlYXIgdGhlIGNvcnJlc3BvbmRpbmcgYnl0ZSBpbiB0aGUgZGVzdGluYXRpb24uCisvLy8gICAgMDogQ29weSB0aGUgc2VsZWN0ZWQgc291cmNlIGJ5dGUgdG8gdGhlIGNvcnJlc3BvbmRpbmcgYnl0ZSBpbiB0aGUKKy8vLyAgICBkZXN0aW5hdGlvbi4KKy8vLyAgICBCaXRzIFs2OjRdIFJlc2VydmVkLgorLy8vICAgIEJpdHMgWzM6MF0gc2VsZWN0IHRoZSBzb3VyY2UgYnl0ZSB0byBiZSBjb3BpZWQuCisvLy8gXHJldHVybnMgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIGNvcGllZCBvciBjbGVhcmVkIHZhbHVlcy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc2h1ZmZsZV9lcGk4KF9fbTEyOGkgX19hLCBfX20xMjhpIF9fYikKK3sKKyAgICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHNodWZiMTI4KChfX3YxNnFpKV9fYSwgKF9fdjE2cWkpX19iKTsKK30KKworLy8vIFxicmllZiBDb3BpZXMgdGhlIDgtYml0IGludGVnZXJzIGZyb20gYSA2NC1iaXQgaW50ZWdlciB2ZWN0b3IgdG8gdGhlCisvLy8gICAgZGVzdGluYXRpb24gb3IgY2xlYXJzIDgtYml0IHZhbHVlcyBpbiB0aGUgZGVzdGluYXRpb24sIGFzIHNwZWNpZmllZCBieQorLy8vICAgIHRoZSBzZWNvbmQgc291cmNlIG9wZXJhbmQuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgUFNIVUZCIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIHZhbHVlcyB0byBiZSBjb3BpZWQuCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgY29udHJvbCBieXRlcyBjb3JyZXNwb25kaW5nIHRvCisvLy8gICAgcG9zaXRpb25zIGluIHRoZSBkZXN0aW5hdGlvbjoKKy8vLyAgICBCaXQgNzoKKy8vLyAgICAxOiBDbGVhciB0aGUgY29ycmVzcG9uZGluZyBieXRlIGluIHRoZSBkZXN0aW5hdGlvbi4KKy8vLyAgICAwOiBDb3B5IHRoZSBzZWxlY3RlZCBzb3VyY2UgYnl0ZSB0byB0aGUgY29ycmVzcG9uZGluZyBieXRlIGluIHRoZQorLy8vICAgIGRlc3RpbmF0aW9uLgorLy8vICAgIEJpdHMgWzM6MF0gc2VsZWN0IHRoZSBzb3VyY2UgYnl0ZSB0byBiZSBjb3BpZWQuCisvLy8gXHJldHVybnMgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgY29waWVkIG9yIGNsZWFyZWQgdmFsdWVzLgorc3RhdGljIF9faW5saW5lX18gX19tNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc2h1ZmZsZV9waTgoX19tNjQgX19hLCBfX202NCBfX2IpCit7CisgICAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9wc2h1ZmIoKF9fdjhxaSlfX2EsIChfX3Y4cWkpX19iKTsKK30KKworLy8vIFxicmllZiBGb3IgZWFjaCA4LWJpdCBpbnRlZ2VyIGluIHRoZSBmaXJzdCBzb3VyY2Ugb3BlcmFuZCwgcGVyZm9ybSBvbmUgb2YKKy8vLyAgICB0aGUgZm9sbG93aW5nIGFjdGlvbnMgYXMgc3BlY2lmaWVkIGJ5IHRoZSBzZWNvbmQgc291cmNlIG9wZXJhbmQ6IElmIHRoZQorLy8vICAgIGJ5dGUgaW4gdGhlIHNlY29uZCBzb3VyY2UgaXMgbmVnYXRpdmUsIGNhbGN1bGF0ZSB0aGUgdHdvJ3MgY29tcGxlbWVudCBvZgorLy8vICAgIHRoZSBjb3JyZXNwb25kaW5nIGJ5dGUgaW4gdGhlIGZpcnN0IHNvdXJjZSwgYW5kIHdyaXRlIHRoYXQgdmFsdWUgdG8gdGhlCisvLy8gICAgZGVzdGluYXRpb24uIElmIHRoZSBieXRlIGluIHRoZSBzZWNvbmQgc291cmNlIGlzIHBvc2l0aXZlLCBjb3B5IHRoZQorLy8vICAgIGNvcnJlc3BvbmRpbmcgYnl0ZSBmcm9tIHRoZSBmaXJzdCBzb3VyY2UgdG8gdGhlIGRlc3RpbmF0aW9uLiBJZiB0aGUgYnl0ZQorLy8vICAgIGluIHRoZSBzZWNvbmQgc291cmNlIGlzIHplcm8sIGNsZWFyIHRoZSBjb3JyZXNwb25kaW5nIGJ5dGUgaW4gdGhlCisvLy8gICAgZGVzdGluYXRpb24uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVlBTSUdOQiBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgdmFsdWVzIHRvIGJlIGNvcGllZC4KKy8vLyBccGFyYW0gX19iCisvLy8gICAgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgY29udHJvbCBieXRlcyBjb3JyZXNwb25kaW5nIHRvCisvLy8gICAgcG9zaXRpb25zIGluIHRoZSBkZXN0aW5hdGlvbi4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgcmVzdWx0YW50IHZhbHVlcy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc2lnbl9lcGk4KF9fbTEyOGkgX19hLCBfX20xMjhpIF9fYikKK3sKKyAgICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHNpZ25iMTI4KChfX3YxNnFpKV9fYSwgKF9fdjE2cWkpX19iKTsKK30KKworLy8vIFxicmllZiBGb3IgZWFjaCAxNi1iaXQgaW50ZWdlciBpbiB0aGUgZmlyc3Qgc291cmNlIG9wZXJhbmQsIHBlcmZvcm0gb25lIG9mCisvLy8gICAgdGhlIGZvbGxvd2luZyBhY3Rpb25zIGFzIHNwZWNpZmllZCBieSB0aGUgc2Vjb25kIHNvdXJjZSBvcGVyYW5kOiBJZiB0aGUKKy8vLyAgICB3b3JkIGluIHRoZSBzZWNvbmQgc291cmNlIGlzIG5lZ2F0aXZlLCBjYWxjdWxhdGUgdGhlIHR3bydzIGNvbXBsZW1lbnQgb2YKKy8vLyAgICB0aGUgY29ycmVzcG9uZGluZyB3b3JkIGluIHRoZSBmaXJzdCBzb3VyY2UsIGFuZCB3cml0ZSB0aGF0IHZhbHVlIHRvIHRoZQorLy8vICAgIGRlc3RpbmF0aW9uLiBJZiB0aGUgd29yZCBpbiB0aGUgc2Vjb25kIHNvdXJjZSBpcyBwb3NpdGl2ZSwgY29weSB0aGUKKy8vLyAgICBjb3JyZXNwb25kaW5nIHdvcmQgZnJvbSB0aGUgZmlyc3Qgc291cmNlIHRvIHRoZSBkZXN0aW5hdGlvbi4gSWYgdGhlIHdvcmQKKy8vLyAgICBpbiB0aGUgc2Vjb25kIHNvdXJjZSBpcyB6ZXJvLCBjbGVhciB0aGUgY29ycmVzcG9uZGluZyB3b3JkIGluIHRoZQorLy8vICAgIGRlc3RpbmF0aW9uLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZQU0lHTlcgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIHZhbHVlcyB0byBiZSBjb3BpZWQuCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIGNvbnRyb2wgd29yZHMgY29ycmVzcG9uZGluZyB0bworLy8vICAgIHBvc2l0aW9ucyBpbiB0aGUgZGVzdGluYXRpb24uCisvLy8gXHJldHVybnMgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIHJlc3VsdGFudCB2YWx1ZXMuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3NpZ25fZXBpMTYoX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKQoreworICAgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc2lnbncxMjgoKF9fdjhoaSlfX2EsIChfX3Y4aGkpX19iKTsKK30KKworLy8vIFxicmllZiBGb3IgZWFjaCAzMi1iaXQgaW50ZWdlciBpbiB0aGUgZmlyc3Qgc291cmNlIG9wZXJhbmQsIHBlcmZvcm0gb25lIG9mCisvLy8gICAgdGhlIGZvbGxvd2luZyBhY3Rpb25zIGFzIHNwZWNpZmllZCBieSB0aGUgc2Vjb25kIHNvdXJjZSBvcGVyYW5kOiBJZiB0aGUKKy8vLyAgICBkb3VibGV3b3JkIGluIHRoZSBzZWNvbmQgc291cmNlIGlzIG5lZ2F0aXZlLCBjYWxjdWxhdGUgdGhlIHR3bydzCisvLy8gICAgY29tcGxlbWVudCBvZiB0aGUgY29ycmVzcG9uZGluZyB3b3JkIGluIHRoZSBmaXJzdCBzb3VyY2UsIGFuZCB3cml0ZSB0aGF0CisvLy8gICAgdmFsdWUgdG8gdGhlIGRlc3RpbmF0aW9uLiBJZiB0aGUgZG91Ymxld29yZCBpbiB0aGUgc2Vjb25kIHNvdXJjZSBpcworLy8vICAgIHBvc2l0aXZlLCBjb3B5IHRoZSBjb3JyZXNwb25kaW5nIHdvcmQgZnJvbSB0aGUgZmlyc3Qgc291cmNlIHRvIHRoZQorLy8vICAgIGRlc3RpbmF0aW9uLiBJZiB0aGUgZG91Ymxld29yZCBpbiB0aGUgc2Vjb25kIHNvdXJjZSBpcyB6ZXJvLCBjbGVhciB0aGUKKy8vLyAgICBjb3JyZXNwb25kaW5nIHdvcmQgaW4gdGhlIGRlc3RpbmF0aW9uLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZQU0lHTkQgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIHZhbHVlcyB0byBiZSBjb3BpZWQuCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgMTI4LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIGNvbnRyb2wgZG91Ymxld29yZHMgY29ycmVzcG9uZGluZyB0bworLy8vICAgIHBvc2l0aW9ucyBpbiB0aGUgZGVzdGluYXRpb24uCisvLy8gXHJldHVybnMgQSAxMjgtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIHJlc3VsdGFudCB2YWx1ZXMuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3NpZ25fZXBpMzIoX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iKQoreworICAgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc2lnbmQxMjgoKF9fdjRzaSlfX2EsIChfX3Y0c2kpX19iKTsKK30KKworLy8vIFxicmllZiBGb3IgZWFjaCA4LWJpdCBpbnRlZ2VyIGluIHRoZSBmaXJzdCBzb3VyY2Ugb3BlcmFuZCwgcGVyZm9ybSBvbmUgb2YKKy8vLyAgICB0aGUgZm9sbG93aW5nIGFjdGlvbnMgYXMgc3BlY2lmaWVkIGJ5IHRoZSBzZWNvbmQgc291cmNlIG9wZXJhbmQ6IElmIHRoZQorLy8vICAgIGJ5dGUgaW4gdGhlIHNlY29uZCBzb3VyY2UgaXMgbmVnYXRpdmUsIGNhbGN1bGF0ZSB0aGUgdHdvJ3MgY29tcGxlbWVudCBvZgorLy8vICAgIHRoZSBjb3JyZXNwb25kaW5nIGJ5dGUgaW4gdGhlIGZpcnN0IHNvdXJjZSwgYW5kIHdyaXRlIHRoYXQgdmFsdWUgdG8gdGhlCisvLy8gICAgZGVzdGluYXRpb24uIElmIHRoZSBieXRlIGluIHRoZSBzZWNvbmQgc291cmNlIGlzIHBvc2l0aXZlLCBjb3B5IHRoZQorLy8vICAgIGNvcnJlc3BvbmRpbmcgYnl0ZSBmcm9tIHRoZSBmaXJzdCBzb3VyY2UgdG8gdGhlIGRlc3RpbmF0aW9uLiBJZiB0aGUgYnl0ZQorLy8vICAgIGluIHRoZSBzZWNvbmQgc291cmNlIGlzIHplcm8sIGNsZWFyIHRoZSBjb3JyZXNwb25kaW5nIGJ5dGUgaW4gdGhlCisvLy8gICAgZGVzdGluYXRpb24uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgUFNJR05CIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIHZhbHVlcyB0byBiZSBjb3BpZWQuCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgY29udHJvbCBieXRlcyBjb3JyZXNwb25kaW5nIHRvCisvLy8gICAgcG9zaXRpb25zIGluIHRoZSBkZXN0aW5hdGlvbi4KKy8vLyBccmV0dXJucyBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIHRoZSByZXN1bHRhbnQgdmFsdWVzLgorc3RhdGljIF9faW5saW5lX18gX19tNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc2lnbl9waTgoX19tNjQgX19hLCBfX202NCBfX2IpCit7CisgICAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9wc2lnbmIoKF9fdjhxaSlfX2EsIChfX3Y4cWkpX19iKTsKK30KKworLy8vIFxicmllZiBGb3IgZWFjaCAxNi1iaXQgaW50ZWdlciBpbiB0aGUgZmlyc3Qgc291cmNlIG9wZXJhbmQsIHBlcmZvcm0gb25lIG9mCisvLy8gICAgdGhlIGZvbGxvd2luZyBhY3Rpb25zIGFzIHNwZWNpZmllZCBieSB0aGUgc2Vjb25kIHNvdXJjZSBvcGVyYW5kOiBJZiB0aGUKKy8vLyAgICB3b3JkIGluIHRoZSBzZWNvbmQgc291cmNlIGlzIG5lZ2F0aXZlLCBjYWxjdWxhdGUgdGhlIHR3bydzIGNvbXBsZW1lbnQgb2YKKy8vLyAgICB0aGUgY29ycmVzcG9uZGluZyB3b3JkIGluIHRoZSBmaXJzdCBzb3VyY2UsIGFuZCB3cml0ZSB0aGF0IHZhbHVlIHRvIHRoZQorLy8vICAgIGRlc3RpbmF0aW9uLiBJZiB0aGUgd29yZCBpbiB0aGUgc2Vjb25kIHNvdXJjZSBpcyBwb3NpdGl2ZSwgY29weSB0aGUKKy8vLyAgICBjb3JyZXNwb25kaW5nIHdvcmQgZnJvbSB0aGUgZmlyc3Qgc291cmNlIHRvIHRoZSBkZXN0aW5hdGlvbi4gSWYgdGhlIHdvcmQKKy8vLyAgICBpbiB0aGUgc2Vjb25kIHNvdXJjZSBpcyB6ZXJvLCBjbGVhciB0aGUgY29ycmVzcG9uZGluZyB3b3JkIGluIHRoZQorLy8vICAgIGRlc3RpbmF0aW9uLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFBTSUdOVyBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIHRoZSB2YWx1ZXMgdG8gYmUgY29waWVkLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIGNvbnRyb2wgd29yZHMgY29ycmVzcG9uZGluZyB0bworLy8vICAgIHBvc2l0aW9ucyBpbiB0aGUgZGVzdGluYXRpb24uCisvLy8gXHJldHVybnMgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgcmVzdWx0YW50IHZhbHVlcy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tX3NpZ25fcGkxNihfX202NCBfX2EsIF9fbTY0IF9fYikKK3sKKyAgICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BzaWdudygoX192NGhpKV9fYSwgKF9fdjRoaSlfX2IpOworfQorCisvLy8gXGJyaWVmIEZvciBlYWNoIDMyLWJpdCBpbnRlZ2VyIGluIHRoZSBmaXJzdCBzb3VyY2Ugb3BlcmFuZCwgcGVyZm9ybSBvbmUgb2YKKy8vLyAgICB0aGUgZm9sbG93aW5nIGFjdGlvbnMgYXMgc3BlY2lmaWVkIGJ5IHRoZSBzZWNvbmQgc291cmNlIG9wZXJhbmQ6IElmIHRoZQorLy8vICAgIGRvdWJsZXdvcmQgaW4gdGhlIHNlY29uZCBzb3VyY2UgaXMgbmVnYXRpdmUsIGNhbGN1bGF0ZSB0aGUgdHdvJ3MKKy8vLyAgICBjb21wbGVtZW50IG9mIHRoZSBjb3JyZXNwb25kaW5nIGRvdWJsZXdvcmQgaW4gdGhlIGZpcnN0IHNvdXJjZSwgYW5kCisvLy8gICAgd3JpdGUgdGhhdCB2YWx1ZSB0byB0aGUgZGVzdGluYXRpb24uIElmIHRoZSBkb3VibGV3b3JkIGluIHRoZSBzZWNvbmQKKy8vLyAgICBzb3VyY2UgaXMgcG9zaXRpdmUsIGNvcHkgdGhlIGNvcnJlc3BvbmRpbmcgZG91Ymxld29yZCBmcm9tIHRoZSBmaXJzdAorLy8vICAgIHNvdXJjZSB0byB0aGUgZGVzdGluYXRpb24uIElmIHRoZSBkb3VibGV3b3JkIGluIHRoZSBzZWNvbmQgc291cmNlIGlzCisvLy8gICAgemVybywgY2xlYXIgdGhlIGNvcnJlc3BvbmRpbmcgZG91Ymxld29yZCBpbiB0aGUgZGVzdGluYXRpb24uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgUFNJR05EIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIHZhbHVlcyB0byBiZSBjb3BpZWQuCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdHdvIGNvbnRyb2wgZG91Ymxld29yZHMgY29ycmVzcG9uZGluZworLy8vICAgIHRvIHBvc2l0aW9ucyBpbiB0aGUgZGVzdGluYXRpb24uCisvLy8gXHJldHVybnMgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgcmVzdWx0YW50IHZhbHVlcy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tX3NpZ25fcGkzMihfX202NCBfX2EsIF9fbTY0IF9fYikKK3sKKyAgICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BzaWduZCgoX192MnNpKV9fYSwgKF9fdjJzaSlfX2IpOworfQorCisjdW5kZWYgX19ERUZBVUxUX0ZOX0FUVFJTCisKKyNlbmRpZiAvKiBfX1RNTUlOVFJJTl9IICovCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS91bndpbmQuaCBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL3Vud2luZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNzRhMzQKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS91bndpbmQuaApAQCAtMCwwICsxLDI5OSBAQAorLyo9PT0tLS0tIHVud2luZC5oIC0gU3RhY2sgdW53aW5kaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKgorICo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICovCisKKy8qIFNlZSAiRGF0YSBEZWZpbml0aW9ucyBmb3IgbGliZ2NjX3MiIGluIHRoZSBMaW51eCBTdGFuZGFyZCBCYXNlLiovCisKKyNpZm5kZWYgX19DTEFOR19VTldJTkRfSAorI2RlZmluZSBfX0NMQU5HX1VOV0lORF9ICisKKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykgJiYgX19oYXNfaW5jbHVkZV9uZXh0KDx1bndpbmQuaD4pCisvKiBEYXJ3aW4gKGZyb20gMTEueCBvbikgcHJvdmlkZSBhbiB1bndpbmQuaC4gSWYgdGhhdCdzIGF2YWlsYWJsZSwKKyAqIHVzZSBpdC4gbGlidW53aW5kIHdyYXBzIHNvbWUgb2YgaXRzIGRlZmluaXRpb25zIGluICNpZmRlZiBfR05VX1NPVVJDRSwKKyAqIHNvIGRlZmluZSB0aGF0IGFyb3VuZCB0aGUgaW5jbHVkZS4qLworIyBpZm5kZWYgX0dOVV9TT1VSQ0UKKyMgIGRlZmluZSBfU0hPVUxEX1VOREVGSU5FX0dOVV9TT1VSQ0UKKyMgIGRlZmluZSBfR05VX1NPVVJDRQorIyBlbmRpZgorLy8gbGlidW53aW5kJ3MgdW53aW5kLmggcmVmbGVjdHMgdGhlIGN1cnJlbnQgdmlzaWJpbGl0eS4gIEhvd2V2ZXIsIE1vemlsbGEKKy8vIGJ1aWxkcyB3aXRoIC1mdmlzaWJpbGl0eT1oaWRkZW4gYW5kIHJlbGllcyBvbiBnY2MncyB1bndpbmQuaCB0byByZXNldCB0aGUKKy8vIHZpc2liaWxpdHkgdG8gZGVmYXVsdCBhbmQgZXhwb3J0IGl0cyBjb250ZW50cy4gIGdjYyBhbHNvIGFsbG93cyB1c2VycyB0bworLy8gb3ZlcnJpZGUgaXRzIG92ZXJyaWRlIGJ5ICNkZWZpbmluZyBISURFX0VYUE9SVFMgKGJ1dCBub3RlLCB0aGlzIG9ubHkgb2JleXMKKy8vIHRoZSB1c2VyJ3MgLWZ2aXNpYmlsaXR5IHNldHRpbmc7IGl0IGRvZXNuJ3QgaGlkZSBhbnkgZXhwb3J0cyBvbiBpdHMgb3duKS4gIFdlCisvLyBpbWl0YXRlIGdjYydzIGhlYWRlciBoZXJlOgorIyBpZmRlZiBISURFX0VYUE9SVFMKKyMgIGluY2x1ZGVfbmV4dCA8dW53aW5kLmg+CisjIGVsc2UKKyMgIHByYWdtYSBHQ0MgdmlzaWJpbGl0eSBwdXNoKGRlZmF1bHQpCisjICBpbmNsdWRlX25leHQgPHVud2luZC5oPgorIyAgcHJhZ21hIEdDQyB2aXNpYmlsaXR5IHBvcAorIyBlbmRpZgorIyBpZmRlZiBfU0hPVUxEX1VOREVGSU5FX0dOVV9TT1VSQ0UKKyMgIHVuZGVmIF9HTlVfU09VUkNFCisjICB1bmRlZiBfU0hPVUxEX1VOREVGSU5FX0dOVV9TT1VSQ0UKKyMgZW5kaWYKKyNlbHNlCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJdCBpcyBhIGJpdCBzdHJhbmdlIGZvciBhIGhlYWRlciB0byBwbGF5IHdpdGggdGhlIHZpc2liaWxpdHkgb2YgdGhlCisgICBzeW1ib2xzIGl0IGRlY2xhcmVzLCBidXQgdGhpcyBtYXRjaGVzIGdjYydzIGJlaGF2aW9yIGFuZCBzb21lIHByb2dyYW1zCisgICBkZXBlbmQgb24gaXQgKi8KKyNpZm5kZWYgSElERV9FWFBPUlRTCisjcHJhZ21hIEdDQyB2aXNpYmlsaXR5IHB1c2goZGVmYXVsdCkKKyNlbmRpZgorCit0eXBlZGVmIHVpbnRwdHJfdCBfVW53aW5kX1dvcmQ7Cit0eXBlZGVmIGludHB0cl90IF9VbndpbmRfU3dvcmQ7Cit0eXBlZGVmIHVpbnRwdHJfdCBfVW53aW5kX1B0cjsKK3R5cGVkZWYgdWludHB0cl90IF9VbndpbmRfSW50ZXJuYWxfUHRyOwordHlwZWRlZiB1aW50NjRfdCBfVW53aW5kX0V4Y2VwdGlvbl9DbGFzczsKKwordHlwZWRlZiBpbnRwdHJfdCBfc2xlYjEyOF90OwordHlwZWRlZiB1aW50cHRyX3QgX3VsZWIxMjhfdDsKKworc3RydWN0IF9VbndpbmRfQ29udGV4dDsKK3N0cnVjdCBfVW53aW5kX0V4Y2VwdGlvbjsKK3R5cGVkZWYgZW51bSB7CisgIF9VUkNfTk9fUkVBU09OID0gMCwKKyNpZiBkZWZpbmVkKF9fYXJtX18pICYmICFkZWZpbmVkKF9fVVNJTkdfU0pMSl9FWENFUFRJT05TX18pICYmIFwKKyAgICAhZGVmaW5lZChfX0FSTV9EV0FSRl9FSF9fKQorICBfVVJDX09LID0gMCwgLyogdXNlZCBieSBBUk0gRUhBQkkgKi8KKyNlbmRpZgorICBfVVJDX0ZPUkVJR05fRVhDRVBUSU9OX0NBVUdIVCA9IDEsCisKKyAgX1VSQ19GQVRBTF9QSEFTRTJfRVJST1IgPSAyLAorICBfVVJDX0ZBVEFMX1BIQVNFMV9FUlJPUiA9IDMsCisgIF9VUkNfTk9STUFMX1NUT1AgPSA0LAorCisgIF9VUkNfRU5EX09GX1NUQUNLID0gNSwKKyAgX1VSQ19IQU5ETEVSX0ZPVU5EID0gNiwKKyAgX1VSQ19JTlNUQUxMX0NPTlRFWFQgPSA3LAorICBfVVJDX0NPTlRJTlVFX1VOV0lORCA9IDgsCisjaWYgZGVmaW5lZChfX2FybV9fKSAmJiAhZGVmaW5lZChfX1VTSU5HX1NKTEpfRVhDRVBUSU9OU19fKSAmJiBcCisgICAgIWRlZmluZWQoX19BUk1fRFdBUkZfRUhfXykKKyAgX1VSQ19GQUlMVVJFID0gOSAvKiB1c2VkIGJ5IEFSTSBFSEFCSSAqLworI2VuZGlmCit9IF9VbndpbmRfUmVhc29uX0NvZGU7CisKK3R5cGVkZWYgZW51bSB7CisgIF9VQV9TRUFSQ0hfUEhBU0UgPSAxLAorICBfVUFfQ0xFQU5VUF9QSEFTRSA9IDIsCisKKyAgX1VBX0hBTkRMRVJfRlJBTUUgPSA0LAorICBfVUFfRk9SQ0VfVU5XSU5EID0gOCwKKyAgX1VBX0VORF9PRl9TVEFDSyA9IDE2IC8qIGdjYyBleHRlbnNpb24gdG8gQysrIEFCSSAqLworfSBfVW53aW5kX0FjdGlvbjsKKwordHlwZWRlZiB2b2lkICgqX1Vud2luZF9FeGNlcHRpb25fQ2xlYW51cF9GbikoX1Vud2luZF9SZWFzb25fQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfVW53aW5kX0V4Y2VwdGlvbiAqKTsKKworc3RydWN0IF9VbndpbmRfRXhjZXB0aW9uIHsKKyAgX1Vud2luZF9FeGNlcHRpb25fQ2xhc3MgZXhjZXB0aW9uX2NsYXNzOworICBfVW53aW5kX0V4Y2VwdGlvbl9DbGVhbnVwX0ZuIGV4Y2VwdGlvbl9jbGVhbnVwOworICBfVW53aW5kX1dvcmQgcHJpdmF0ZV8xOworICBfVW53aW5kX1dvcmQgcHJpdmF0ZV8yOworICAvKiBUaGUgSXRhbml1bSBBQkkgcmVxdWlyZXMgdGhhdCBfVW53aW5kX0V4Y2VwdGlvbiBvYmplY3RzIGFyZSAiZG91YmxlLXdvcmQKKyAgICogYWxpZ25lZCIuICBHQ0MgaGFzIGludGVycHJldGVkIHRoaXMgdG8gbWVhbiAidXNlIHRoZSBtYXhpbXVtIHVzZWZ1bAorICAgKiBhbGlnbm1lbnQgZm9yIHRoZSB0YXJnZXQiOyBzbyBkbyB3ZS4gKi8KK30gX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18pKTsKKwordHlwZWRlZiBfVW53aW5kX1JlYXNvbl9Db2RlICgqX1Vud2luZF9TdG9wX0ZuKShpbnQsIF9VbndpbmRfQWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVW53aW5kX0V4Y2VwdGlvbl9DbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IF9VbndpbmRfRXhjZXB0aW9uICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfVW53aW5kX0NvbnRleHQgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKTsKKwordHlwZWRlZiBfVW53aW5kX1JlYXNvbl9Db2RlICgqX1Vud2luZF9QZXJzb25hbGl0eV9GbikoCisgICAgaW50LCBfVW53aW5kX0FjdGlvbiwgX1Vud2luZF9FeGNlcHRpb25fQ2xhc3MsIHN0cnVjdCBfVW53aW5kX0V4Y2VwdGlvbiAqLAorICAgIHN0cnVjdCBfVW53aW5kX0NvbnRleHQgKik7Cit0eXBlZGVmIF9VbndpbmRfUGVyc29uYWxpdHlfRm4gX19wZXJzb25hbGl0eV9yb3V0aW5lOworCit0eXBlZGVmIF9VbndpbmRfUmVhc29uX0NvZGUgKCpfVW53aW5kX1RyYWNlX0ZuKShzdHJ1Y3QgX1Vud2luZF9Db250ZXh0ICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopOworCisjaWYgZGVmaW5lZChfX2FybV9fKSAmJiAhZGVmaW5lZChfX0FQUExFX18pCisKK3R5cGVkZWYgZW51bSB7CisgIF9VVlJTQ19DT1JFID0gMCwgICAgICAgIC8qIGludGVnZXIgcmVnaXN0ZXIgKi8KKyAgX1VWUlNDX1ZGUCA9IDEsICAgICAgICAgLyogdmZwICovCisgIF9VVlJTQ19XTU1YRCA9IDMsICAgICAgIC8qIEludGVsIFdNTVggZGF0YSByZWdpc3RlciAqLworICBfVVZSU0NfV01NWEMgPSA0ICAgICAgICAvKiBJbnRlbCBXTU1YIGNvbnRyb2wgcmVnaXN0ZXIgKi8KK30gX1Vud2luZF9WUlNfUmVnQ2xhc3M7CisKK3R5cGVkZWYgZW51bSB7CisgIF9VVlJTRF9VSU5UMzIgPSAwLAorICBfVVZSU0RfVkZQWCA9IDEsCisgIF9VVlJTRF9VSU5UNjQgPSAzLAorICBfVVZSU0RfRkxPQVQgPSA0LAorICBfVVZSU0RfRE9VQkxFID0gNQorfSBfVW53aW5kX1ZSU19EYXRhUmVwcmVzZW50YXRpb247CisKK3R5cGVkZWYgZW51bSB7CisgIF9VVlJTUl9PSyA9IDAsCisgIF9VVlJTUl9OT1RfSU1QTEVNRU5URUQgPSAxLAorICBfVVZSU1JfRkFJTEVEID0gMgorfSBfVW53aW5kX1ZSU19SZXN1bHQ7CisKKyNpZiAhZGVmaW5lZChfX1VTSU5HX1NKTEpfRVhDRVBUSU9OU19fKSAmJiAhZGVmaW5lZChfX0FSTV9EV0FSRl9FSF9fKQordHlwZWRlZiB1aW50MzJfdCBfVW53aW5kX1N0YXRlOworI2RlZmluZSBfVVNfVklSVFVBTF9VTldJTkRfRlJBTUUgICgoX1Vud2luZF9TdGF0ZSkwKQorI2RlZmluZSBfVVNfVU5XSU5EX0ZSQU1FX1NUQVJUSU5HICgoX1Vud2luZF9TdGF0ZSkxKQorI2RlZmluZSBfVVNfVU5XSU5EX0ZSQU1FX1JFU1VNRSAgICgoX1Vud2luZF9TdGF0ZSkyKQorI2RlZmluZSBfVVNfQUNUSU9OX01BU0sgICAgICAgICAgICgoX1Vud2luZF9TdGF0ZSkzKQorI2RlZmluZSBfVVNfRk9SQ0VfVU5XSU5EICAgICAgICAgICgoX1Vud2luZF9TdGF0ZSk4KQorI2VuZGlmCisKK19VbndpbmRfVlJTX1Jlc3VsdCBfVW53aW5kX1ZSU19HZXQoc3RydWN0IF9VbndpbmRfQ29udGV4dCAqX19jb250ZXh0LAorICBfVW53aW5kX1ZSU19SZWdDbGFzcyBfX3JlZ2NsYXNzLAorICB1aW50MzJfdCBfX3JlZ25vLAorICBfVW53aW5kX1ZSU19EYXRhUmVwcmVzZW50YXRpb24gX19yZXByZXNlbnRhdGlvbiwKKyAgdm9pZCAqX192YWx1ZXApOworCitfVW53aW5kX1ZSU19SZXN1bHQgX1Vud2luZF9WUlNfU2V0KHN0cnVjdCBfVW53aW5kX0NvbnRleHQgKl9fY29udGV4dCwKKyAgX1Vud2luZF9WUlNfUmVnQ2xhc3MgX19yZWdjbGFzcywKKyAgdWludDMyX3QgX19yZWdubywKKyAgX1Vud2luZF9WUlNfRGF0YVJlcHJlc2VudGF0aW9uIF9fcmVwcmVzZW50YXRpb24sCisgIHZvaWQgKl9fdmFsdWVwKTsKKworc3RhdGljIF9faW5saW5lX18KK19VbndpbmRfV29yZCBfVW53aW5kX0dldEdSKHN0cnVjdCBfVW53aW5kX0NvbnRleHQgKl9fY29udGV4dCwgaW50IF9faW5kZXgpIHsKKyAgX1Vud2luZF9Xb3JkIF9fdmFsdWU7CisgIF9VbndpbmRfVlJTX0dldChfX2NvbnRleHQsIF9VVlJTQ19DT1JFLCBfX2luZGV4LCBfVVZSU0RfVUlOVDMyLCAmX192YWx1ZSk7CisgIHJldHVybiBfX3ZhbHVlOworfQorCitzdGF0aWMgX19pbmxpbmVfXwordm9pZCBfVW53aW5kX1NldEdSKHN0cnVjdCBfVW53aW5kX0NvbnRleHQgKl9fY29udGV4dCwgaW50IF9faW5kZXgsCisgICAgICAgICAgICAgICAgICAgX1Vud2luZF9Xb3JkIF9fdmFsdWUpIHsKKyAgX1Vud2luZF9WUlNfU2V0KF9fY29udGV4dCwgX1VWUlNDX0NPUkUsIF9faW5kZXgsIF9VVlJTRF9VSU5UMzIsICZfX3ZhbHVlKTsKK30KKworc3RhdGljIF9faW5saW5lX18KK19VbndpbmRfV29yZCBfVW53aW5kX0dldElQKHN0cnVjdCBfVW53aW5kX0NvbnRleHQgKl9fY29udGV4dCkgeworICBfVW53aW5kX1dvcmQgX19pcCA9IF9VbndpbmRfR2V0R1IoX19jb250ZXh0LCAxNSk7CisgIHJldHVybiBfX2lwICYgfihfVW53aW5kX1dvcmQpKDB4MSk7IC8qIFJlbW92ZSB0aHVtYiBtb2RlIGJpdC4gKi8KK30KKworc3RhdGljIF9faW5saW5lX18KK3ZvaWQgX1Vud2luZF9TZXRJUChzdHJ1Y3QgX1Vud2luZF9Db250ZXh0ICpfX2NvbnRleHQsIF9VbndpbmRfV29yZCBfX3ZhbHVlKSB7CisgIF9VbndpbmRfV29yZCBfX3RodW1iX21vZGVfYml0ID0gX1Vud2luZF9HZXRHUihfX2NvbnRleHQsIDE1KSAmIDB4MTsKKyAgX1Vud2luZF9TZXRHUihfX2NvbnRleHQsIDE1LCBfX3ZhbHVlIHwgX190aHVtYl9tb2RlX2JpdCk7Cit9CisjZWxzZQorX1Vud2luZF9Xb3JkIF9VbndpbmRfR2V0R1Ioc3RydWN0IF9VbndpbmRfQ29udGV4dCAqLCBpbnQpOwordm9pZCBfVW53aW5kX1NldEdSKHN0cnVjdCBfVW53aW5kX0NvbnRleHQgKiwgaW50LCBfVW53aW5kX1dvcmQpOworCitfVW53aW5kX1dvcmQgX1Vud2luZF9HZXRJUChzdHJ1Y3QgX1Vud2luZF9Db250ZXh0ICopOwordm9pZCBfVW53aW5kX1NldElQKHN0cnVjdCBfVW53aW5kX0NvbnRleHQgKiwgX1Vud2luZF9Xb3JkKTsKKyNlbmRpZgorCisKK19VbndpbmRfV29yZCBfVW53aW5kX0dldElQSW5mbyhzdHJ1Y3QgX1Vud2luZF9Db250ZXh0ICosIGludCAqKTsKKworX1Vud2luZF9Xb3JkIF9VbndpbmRfR2V0Q0ZBKHN0cnVjdCBfVW53aW5kX0NvbnRleHQgKik7CisKK19VbndpbmRfV29yZCBfVW53aW5kX0dldEJTUChzdHJ1Y3QgX1Vud2luZF9Db250ZXh0ICopOworCit2b2lkICpfVW53aW5kX0dldExhbmd1YWdlU3BlY2lmaWNEYXRhKHN0cnVjdCBfVW53aW5kX0NvbnRleHQgKik7CisKK19VbndpbmRfUHRyIF9VbndpbmRfR2V0UmVnaW9uU3RhcnQoc3RydWN0IF9VbndpbmRfQ29udGV4dCAqKTsKKworLyogRFdBUkYgRUggZnVuY3Rpb25zOyBjdXJyZW50bHkgbm90IGF2YWlsYWJsZSBvbiBEYXJ3aW4vQVJNICovCisjaWYgIWRlZmluZWQoX19BUFBMRV9fKSB8fCAhZGVmaW5lZChfX2FybV9fKQorCitfVW53aW5kX1JlYXNvbl9Db2RlIF9VbndpbmRfUmFpc2VFeGNlcHRpb24oc3RydWN0IF9VbndpbmRfRXhjZXB0aW9uICopOworX1Vud2luZF9SZWFzb25fQ29kZSBfVW53aW5kX0ZvcmNlZFVud2luZChzdHJ1Y3QgX1Vud2luZF9FeGNlcHRpb24gKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1Vud2luZF9TdG9wX0ZuLCB2b2lkICopOwordm9pZCBfVW53aW5kX0RlbGV0ZUV4Y2VwdGlvbihzdHJ1Y3QgX1Vud2luZF9FeGNlcHRpb24gKik7Cit2b2lkIF9VbndpbmRfUmVzdW1lKHN0cnVjdCBfVW53aW5kX0V4Y2VwdGlvbiAqKTsKK19VbndpbmRfUmVhc29uX0NvZGUgX1Vud2luZF9SZXN1bWVfb3JfUmV0aHJvdyhzdHJ1Y3QgX1Vud2luZF9FeGNlcHRpb24gKik7CisKKyNlbmRpZgorCitfVW53aW5kX1JlYXNvbl9Db2RlIF9VbndpbmRfQmFja3RyYWNlKF9VbndpbmRfVHJhY2VfRm4sIHZvaWQgKik7CisKKy8qIHNldGptcCgzKS9sb25nam1wKDMpIHN0dWZmICovCit0eXBlZGVmIHN0cnVjdCBTakxqX0Z1bmN0aW9uX0NvbnRleHQgKl9VbndpbmRfRnVuY3Rpb25Db250ZXh0X3Q7CisKK3ZvaWQgX1Vud2luZF9TakxqX1JlZ2lzdGVyKF9VbndpbmRfRnVuY3Rpb25Db250ZXh0X3QpOwordm9pZCBfVW53aW5kX1NqTGpfVW5yZWdpc3RlcihfVW53aW5kX0Z1bmN0aW9uQ29udGV4dF90KTsKK19VbndpbmRfUmVhc29uX0NvZGUgX1Vud2luZF9TakxqX1JhaXNlRXhjZXB0aW9uKHN0cnVjdCBfVW53aW5kX0V4Y2VwdGlvbiAqKTsKK19VbndpbmRfUmVhc29uX0NvZGUgX1Vud2luZF9TakxqX0ZvcmNlZFVud2luZChzdHJ1Y3QgX1Vud2luZF9FeGNlcHRpb24gKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVW53aW5kX1N0b3BfRm4sIHZvaWQgKik7Cit2b2lkIF9VbndpbmRfU2pMal9SZXN1bWUoc3RydWN0IF9VbndpbmRfRXhjZXB0aW9uICopOworX1Vud2luZF9SZWFzb25fQ29kZSBfVW53aW5kX1NqTGpfUmVzdW1lX29yX1JldGhyb3coc3RydWN0IF9VbndpbmRfRXhjZXB0aW9uICopOworCit2b2lkICpfVW53aW5kX0ZpbmRFbmNsb3NpbmdGdW5jdGlvbih2b2lkICopOworCisjaWZkZWYgX19BUFBMRV9fCisKK19VbndpbmRfUHRyIF9VbndpbmRfR2V0RGF0YVJlbEJhc2Uoc3RydWN0IF9VbndpbmRfQ29udGV4dCAqKQorICAgIF9fYXR0cmlidXRlX18oKF9fdW5hdmFpbGFibGVfXykpOworX1Vud2luZF9QdHIgX1Vud2luZF9HZXRUZXh0UmVsQmFzZShzdHJ1Y3QgX1Vud2luZF9Db250ZXh0ICopCisgICAgX19hdHRyaWJ1dGVfXygoX191bmF2YWlsYWJsZV9fKSk7CisKKy8qIERhcndpbi1zcGVjaWZpYyBmdW5jdGlvbnMgKi8KK3ZvaWQgX19yZWdpc3Rlcl9mcmFtZShjb25zdCB2b2lkICopOwordm9pZCBfX2RlcmVnaXN0ZXJfZnJhbWUoY29uc3Qgdm9pZCAqKTsKKworc3RydWN0IGR3YXJmX2VoX2Jhc2VzIHsKKyAgdWludHB0cl90IHRiYXNlOworICB1aW50cHRyX3QgZGJhc2U7CisgIHVpbnRwdHJfdCBmdW5jOworfTsKK3ZvaWQgKl9VbndpbmRfRmluZF9GREUoY29uc3Qgdm9pZCAqLCBzdHJ1Y3QgZHdhcmZfZWhfYmFzZXMgKik7CisKK3ZvaWQgX19yZWdpc3Rlcl9mcmFtZV9pbmZvX2Jhc2VzKGNvbnN0IHZvaWQgKiwgdm9pZCAqLCB2b2lkICosIHZvaWQgKikKKyAgX19hdHRyaWJ1dGVfXygoX191bmF2YWlsYWJsZV9fKSk7Cit2b2lkIF9fcmVnaXN0ZXJfZnJhbWVfaW5mbyhjb25zdCB2b2lkICosIHZvaWQgKikgX19hdHRyaWJ1dGVfXygoX191bmF2YWlsYWJsZV9fKSk7Cit2b2lkIF9fcmVnaXN0ZXJfZnJhbWVfaW5mb190YWJsZV9iYXNlcyhjb25zdCB2b2lkICosIHZvaWQqLCB2b2lkICosIHZvaWQgKikKKyAgX19hdHRyaWJ1dGVfXygoX191bmF2YWlsYWJsZV9fKSk7Cit2b2lkIF9fcmVnaXN0ZXJfZnJhbWVfaW5mb190YWJsZShjb25zdCB2b2lkICosIHZvaWQgKikKKyAgX19hdHRyaWJ1dGVfXygoX191bmF2YWlsYWJsZV9fKSk7Cit2b2lkIF9fcmVnaXN0ZXJfZnJhbWVfdGFibGUoY29uc3Qgdm9pZCAqKSBfX2F0dHJpYnV0ZV9fKChfX3VuYXZhaWxhYmxlX18pKTsKK3ZvaWQgX19kZXJlZ2lzdGVyX2ZyYW1lX2luZm8oY29uc3Qgdm9pZCAqKSBfX2F0dHJpYnV0ZV9fKChfX3VuYXZhaWxhYmxlX18pKTsKK3ZvaWQgX19kZXJlZ2lzdGVyX2ZyYW1lX2luZm9fYmFzZXMoY29uc3Qgdm9pZCAqKV9fYXR0cmlidXRlX18oKF9fdW5hdmFpbGFibGVfXykpOworCisjZWxzZQorCitfVW53aW5kX1B0ciBfVW53aW5kX0dldERhdGFSZWxCYXNlKHN0cnVjdCBfVW53aW5kX0NvbnRleHQgKik7CitfVW53aW5kX1B0ciBfVW53aW5kX0dldFRleHRSZWxCYXNlKHN0cnVjdCBfVW53aW5kX0NvbnRleHQgKik7CisKKyNlbmRpZgorCisKKyNpZm5kZWYgSElERV9FWFBPUlRTCisjcHJhZ21hIEdDQyB2aXNpYmlsaXR5IHBvcAorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgorCisjZW5kaWYgLyogX19DTEFOR19VTldJTkRfSCAqLwpkaWZmIC0tZ2l0IGEvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvdmFkZWZzLmggYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS92YWRlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmU5YTc0Ci0tLSAvZGV2L251bGwKKysrIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvdmFkZWZzLmgKQEAgLTAsMCArMSw2NSBAQAorLyogPT09LS0tLS0tLS0gdmFkZWZzLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICoKKyAqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqLworCisvKiBPbmx5IGluY2x1ZGUgdGhpcyBpZiB3ZSBhcmUgYWltaW5nIGZvciBNU1ZDIGNvbXBhdGliaWxpdHkuICovCisjaWZuZGVmIF9NU0NfVkVSCisjaW5jbHVkZV9uZXh0IDx2YWRlZnMuaD4KKyNlbHNlCisKKyNpZm5kZWYgX19jbGFuZ192YWRlZnNfaAorI2RlZmluZSBfX2NsYW5nX3ZhZGVmc19oCisKKyNpbmNsdWRlX25leHQgPHZhZGVmcy5oPgorCisvKiBPdmVycmlkZSBtYWNyb3MgZnJvbSB2YWRlZnMuaCB3aXRoIGRlZmluaXRpb25zIHRoYXQgd29yayB3aXRoIENsYW5nLiAqLworI2lmZGVmIF9jcnRfdmFfc3RhcnQKKyN1bmRlZiBfY3J0X3ZhX3N0YXJ0CisjZGVmaW5lIF9jcnRfdmFfc3RhcnQoYXAsIHBhcmFtKSBfX2J1aWx0aW5fdmFfc3RhcnQoYXAsIHBhcmFtKQorI2VuZGlmCisjaWZkZWYgX2NydF92YV9lbmQKKyN1bmRlZiBfY3J0X3ZhX2VuZAorI2RlZmluZSBfY3J0X3ZhX2VuZChhcCkgICAgICAgICAgX19idWlsdGluX3ZhX2VuZChhcCkKKyNlbmRpZgorI2lmZGVmIF9jcnRfdmFfYXJnCisjdW5kZWYgX2NydF92YV9hcmcKKyNkZWZpbmUgX2NydF92YV9hcmcoYXAsIHR5cGUpICAgIF9fYnVpbHRpbl92YV9hcmcoYXAsIHR5cGUpCisjZW5kaWYKKworLyogVlMgMjAxNSBzd2l0Y2hlZCB0byBkb3VibGUgdW5kZXJzY29yZSBuYW1lcywgd2hpY2ggaXMgYW4gaW1wcm92ZW1lbnQsIGJ1dCBub3cKKyAqIHdlIGhhdmUgdG8gaW50ZXJjZXB0IHRob3NlIG5hbWVzIHRvby4KKyAqLworI2lmZGVmIF9fY3J0X3ZhX3N0YXJ0CisjdW5kZWYgX19jcnRfdmFfc3RhcnQKKyNkZWZpbmUgX19jcnRfdmFfc3RhcnQoYXAsIHBhcmFtKSBfX2J1aWx0aW5fdmFfc3RhcnQoYXAsIHBhcmFtKQorI2VuZGlmCisjaWZkZWYgX19jcnRfdmFfZW5kCisjdW5kZWYgX19jcnRfdmFfZW5kCisjZGVmaW5lIF9fY3J0X3ZhX2VuZChhcCkgICAgICAgICAgX19idWlsdGluX3ZhX2VuZChhcCkKKyNlbmRpZgorI2lmZGVmIF9fY3J0X3ZhX2FyZworI3VuZGVmIF9fY3J0X3ZhX2FyZworI2RlZmluZSBfX2NydF92YV9hcmcoYXAsIHR5cGUpICAgIF9fYnVpbHRpbl92YV9hcmcoYXAsIHR5cGUpCisjZW5kaWYKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL3ZhcmFyZ3MuaCBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL3ZhcmFyZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTQ3N2QwCi0tLSAvZGV2L251bGwKKysrIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUvdmFyYXJncy5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qPT09LS0tLSB2YXJhcmdzLmggLSBWYXJpYWJsZSBhcmd1bWVudCBoYW5kbGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisqCisqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorKgorKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyoKKyogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyogVEhFIFNPRlRXQVJFLgorKgorKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisqLworI2lmbmRlZiBfX1ZBUkFSR1NfSAorI2RlZmluZSBfX1ZBUkFSR1NfSAorICAjZXJyb3IgIlBsZWFzZSB1c2UgPHN0ZGFyZy5oPiBpbnN0ZWFkIG9mIDx2YXJhcmdzLmg+IgorI2VuZGlmCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS92ZWNpbnRyaW4uaCBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL3ZlY2ludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhN2FjYjQKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS92ZWNpbnRyaW4uaApAQCAtMCwwICsxLDg5NDYgQEAKKy8qPT09LS0tLSB2ZWNpbnRyaW4uaCAtIFZlY3RvciBpbnRyaW5zaWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKgorICo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICovCisKKyNpZiBkZWZpbmVkKF9fczM5MHhfXykgJiYgZGVmaW5lZChfX1ZFQ19fKQorCisjZGVmaW5lIF9fQVRUUlNfYWkgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKQorI2RlZmluZSBfX0FUVFJTX28gX19hdHRyaWJ1dGVfXygoX19vdmVybG9hZGFibGVfXykpCisjZGVmaW5lIF9fQVRUUlNfb19haSBfX2F0dHJpYnV0ZV9fKChfX292ZXJsb2FkYWJsZV9fLCBfX2Fsd2F5c19pbmxpbmVfXykpCisKKyNkZWZpbmUgX19jb25zdGFudChQQVJNKSBcCisgIF9fYXR0cmlidXRlX18oKF9fZW5hYmxlX2lmX18gKChQQVJNKSA9PSAoUEFSTSksIFwKKyAgICAgImFyZ3VtZW50IG11c3QgYmUgYSBjb25zdGFudCBpbnRlZ2VyIikpKQorI2RlZmluZSBfX2NvbnN0YW50X3JhbmdlKFBBUk0sIExPVywgSElHSCkgXAorICBfX2F0dHJpYnV0ZV9fKChfX2VuYWJsZV9pZl9fICgoUEFSTSkgPj0gKExPVykgJiYgKFBBUk0pIDw9IChISUdIKSwgXAorICAgICAiYXJndW1lbnQgbXVzdCBiZSBhIGNvbnN0YW50IGludGVnZXIgZnJvbSAiICNMT1cgIiB0byAiICNISUdIKSkpCisjZGVmaW5lIF9fY29uc3RhbnRfcG93Ml9yYW5nZShQQVJNLCBMT1csIEhJR0gpIFwKKyAgX19hdHRyaWJ1dGVfXygoX19lbmFibGVfaWZfXyAoKFBBUk0pID49IChMT1cpICYmIChQQVJNKSA8PSAoSElHSCkgJiYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBBUk0pICYgKChQQVJNKSAtIDEpKSA9PSAwLCBcCisgICAgICJhcmd1bWVudCBtdXN0IGJlIGEgY29uc3RhbnQgcG93ZXIgb2YgMiBmcm9tICIgI0xPVyAiIHRvICIgI0hJR0gpKSkKKworLyotLSBfX2xjYmIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitleHRlcm4gX19BVFRSU19vIHVuc2lnbmVkIGludAorX19sY2JiKGNvbnN0IHZvaWQgKl9fcHRyLCB1bnNpZ25lZCBzaG9ydCBfX2xlbikKKyAgX19jb25zdGFudF9wb3cyX3JhbmdlKF9fbGVuLCA2NCwgNDA5Nik7CisKKyNkZWZpbmUgX19sY2JiKFgsIFkpICgoX190eXBlb2ZfXygoX19sY2JiKSgoWCksIChZKSkpKSBcCisgIF9fYnVpbHRpbl9zMzkwX2xjYmIoKFgpLCBfX2J1aWx0aW5fY29uc3RhbnRfcCgoWSkpPyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFkpID09IDY0ID8gMCA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoWSkgPT0gMTI4ID8gMSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoWSkgPT0gMjU2ID8gMiA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoWSkgPT0gNTEyID8gMyA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoWSkgPT0gMTAyNCA/IDQgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFkpID09IDIwNDggPyA1IDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChZKSA9PSA0MDk2ID8gNiA6IDApIDogMCkpCisKKy8qLS0gdmVjX2V4dHJhY3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgc2lnbmVkIGNoYXIKK3ZlY19leHRyYWN0KHZlY3RvciBzaWduZWQgY2hhciBfX3ZlYywgaW50IF9faW5kZXgpIHsKKyAgcmV0dXJuIF9fdmVjW19faW5kZXggJiAxNV07Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHVuc2lnbmVkIGNoYXIKK3ZlY19leHRyYWN0KHZlY3RvciBib29sIGNoYXIgX192ZWMsIGludCBfX2luZGV4KSB7CisgIHJldHVybiBfX3ZlY1tfX2luZGV4ICYgMTVdOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB1bnNpZ25lZCBjaGFyCit2ZWNfZXh0cmFjdCh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX3ZlYywgaW50IF9faW5kZXgpIHsKKyAgcmV0dXJuIF9fdmVjW19faW5kZXggJiAxNV07Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHNpZ25lZCBzaG9ydAordmVjX2V4dHJhY3QodmVjdG9yIHNpZ25lZCBzaG9ydCBfX3ZlYywgaW50IF9faW5kZXgpIHsKKyAgcmV0dXJuIF9fdmVjW19faW5kZXggJiA3XTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdW5zaWduZWQgc2hvcnQKK3ZlY19leHRyYWN0KHZlY3RvciBib29sIHNob3J0IF9fdmVjLCBpbnQgX19pbmRleCkgeworICByZXR1cm4gX192ZWNbX19pbmRleCAmIDddOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB1bnNpZ25lZCBzaG9ydAordmVjX2V4dHJhY3QodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fdmVjLCBpbnQgX19pbmRleCkgeworICByZXR1cm4gX192ZWNbX19pbmRleCAmIDddOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBzaWduZWQgaW50Cit2ZWNfZXh0cmFjdCh2ZWN0b3Igc2lnbmVkIGludCBfX3ZlYywgaW50IF9faW5kZXgpIHsKKyAgcmV0dXJuIF9fdmVjW19faW5kZXggJiAzXTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdW5zaWduZWQgaW50Cit2ZWNfZXh0cmFjdCh2ZWN0b3IgYm9vbCBpbnQgX192ZWMsIGludCBfX2luZGV4KSB7CisgIHJldHVybiBfX3ZlY1tfX2luZGV4ICYgM107Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHVuc2lnbmVkIGludAordmVjX2V4dHJhY3QodmVjdG9yIHVuc2lnbmVkIGludCBfX3ZlYywgaW50IF9faW5kZXgpIHsKKyAgcmV0dXJuIF9fdmVjW19faW5kZXggJiAzXTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgc2lnbmVkIGxvbmcgbG9uZwordmVjX2V4dHJhY3QodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX192ZWMsIGludCBfX2luZGV4KSB7CisgIHJldHVybiBfX3ZlY1tfX2luZGV4ICYgMV07Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHVuc2lnbmVkIGxvbmcgbG9uZwordmVjX2V4dHJhY3QodmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fdmVjLCBpbnQgX19pbmRleCkgeworICByZXR1cm4gX192ZWNbX19pbmRleCAmIDFdOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB1bnNpZ25lZCBsb25nIGxvbmcKK3ZlY19leHRyYWN0KHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX192ZWMsIGludCBfX2luZGV4KSB7CisgIHJldHVybiBfX3ZlY1tfX2luZGV4ICYgMV07Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGRvdWJsZQordmVjX2V4dHJhY3QodmVjdG9yIGRvdWJsZSBfX3ZlYywgaW50IF9faW5kZXgpIHsKKyAgcmV0dXJuIF9fdmVjW19faW5kZXggJiAxXTsKK30KKworLyotLSB2ZWNfaW5zZXJ0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGNoYXIKK3ZlY19pbnNlcnQoc2lnbmVkIGNoYXIgX19zY2FsYXIsIHZlY3RvciBzaWduZWQgY2hhciBfX3ZlYywgaW50IF9faW5kZXgpIHsKKyAgX192ZWNbX19pbmRleCAmIDE1XSA9IF9fc2NhbGFyOworICByZXR1cm4gX192ZWM7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBjaGFyCit2ZWNfaW5zZXJ0KHVuc2lnbmVkIGNoYXIgX19zY2FsYXIsIHZlY3RvciBib29sIGNoYXIgX192ZWMsIGludCBfX2luZGV4KSB7CisgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fbmV3dmVjID0gKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fdmVjOworICBfX25ld3ZlY1tfX2luZGV4ICYgMTVdID0gKHVuc2lnbmVkIGNoYXIpX19zY2FsYXI7CisgIHJldHVybiBfX25ld3ZlYzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGNoYXIKK3ZlY19pbnNlcnQodW5zaWduZWQgY2hhciBfX3NjYWxhciwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX192ZWMsIGludCBfX2luZGV4KSB7CisgIF9fdmVjW19faW5kZXggJiAxNV0gPSBfX3NjYWxhcjsKKyAgcmV0dXJuIF9fdmVjOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIHNob3J0Cit2ZWNfaW5zZXJ0KHNpZ25lZCBzaG9ydCBfX3NjYWxhciwgdmVjdG9yIHNpZ25lZCBzaG9ydCBfX3ZlYywgaW50IF9faW5kZXgpIHsKKyAgX192ZWNbX19pbmRleCAmIDddID0gX19zY2FsYXI7CisgIHJldHVybiBfX3ZlYzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIHNob3J0Cit2ZWNfaW5zZXJ0KHVuc2lnbmVkIHNob3J0IF9fc2NhbGFyLCB2ZWN0b3IgYm9vbCBzaG9ydCBfX3ZlYywgaW50IF9faW5kZXgpIHsKKyAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fbmV3dmVjID0gKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX3ZlYzsKKyAgX19uZXd2ZWNbX19pbmRleCAmIDddID0gKHVuc2lnbmVkIHNob3J0KV9fc2NhbGFyOworICByZXR1cm4gX19uZXd2ZWM7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBzaG9ydAordmVjX2luc2VydCh1bnNpZ25lZCBzaG9ydCBfX3NjYWxhciwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fdmVjLCBpbnQgX19pbmRleCkgeworICBfX3ZlY1tfX2luZGV4ICYgN10gPSBfX3NjYWxhcjsKKyAgcmV0dXJuIF9fdmVjOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGludAordmVjX2luc2VydChzaWduZWQgaW50IF9fc2NhbGFyLCB2ZWN0b3Igc2lnbmVkIGludCBfX3ZlYywgaW50IF9faW5kZXgpIHsKKyAgX192ZWNbX19pbmRleCAmIDNdID0gX19zY2FsYXI7CisgIHJldHVybiBfX3ZlYzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGludAordmVjX2luc2VydCh1bnNpZ25lZCBpbnQgX19zY2FsYXIsIHZlY3RvciBib29sIGludCBfX3ZlYywgaW50IF9faW5kZXgpIHsKKyAgdmVjdG9yIHVuc2lnbmVkIGludCBfX25ld3ZlYyA9ICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fdmVjOworICBfX25ld3ZlY1tfX2luZGV4ICYgM10gPSBfX3NjYWxhcjsKKyAgcmV0dXJuIF9fbmV3dmVjOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgaW50Cit2ZWNfaW5zZXJ0KHVuc2lnbmVkIGludCBfX3NjYWxhciwgdmVjdG9yIHVuc2lnbmVkIGludCBfX3ZlYywgaW50IF9faW5kZXgpIHsKKyAgX192ZWNbX19pbmRleCAmIDNdID0gX19zY2FsYXI7CisgIHJldHVybiBfX3ZlYzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcKK3ZlY19pbnNlcnQoc2lnbmVkIGxvbmcgbG9uZyBfX3NjYWxhciwgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX192ZWMsCisgICAgICAgICAgIGludCBfX2luZGV4KSB7CisgIF9fdmVjW19faW5kZXggJiAxXSA9IF9fc2NhbGFyOworICByZXR1cm4gX192ZWM7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcKK3ZlY19pbnNlcnQodW5zaWduZWQgbG9uZyBsb25nIF9fc2NhbGFyLCB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX192ZWMsCisgICAgICAgICAgIGludCBfX2luZGV4KSB7CisgIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19uZXd2ZWMgPSAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX3ZlYzsKKyAgX19uZXd2ZWNbX19pbmRleCAmIDFdID0gX19zY2FsYXI7CisgIHJldHVybiBfX25ld3ZlYzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZwordmVjX2luc2VydCh1bnNpZ25lZCBsb25nIGxvbmcgX19zY2FsYXIsIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX192ZWMsCisgICAgICAgICAgIGludCBfX2luZGV4KSB7CisgIF9fdmVjW19faW5kZXggJiAxXSA9IF9fc2NhbGFyOworICByZXR1cm4gX192ZWM7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBkb3VibGUKK3ZlY19pbnNlcnQoZG91YmxlIF9fc2NhbGFyLCB2ZWN0b3IgZG91YmxlIF9fdmVjLCBpbnQgX19pbmRleCkgeworICBfX3ZlY1tfX2luZGV4ICYgMV0gPSBfX3NjYWxhcjsKKyAgcmV0dXJuIF9fdmVjOworfQorCisvKi0tIHZlY19wcm9tb3RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgY2hhcgordmVjX3Byb21vdGUoc2lnbmVkIGNoYXIgX19zY2FsYXIsIGludCBfX2luZGV4KSB7CisgIGNvbnN0IHZlY3RvciBzaWduZWQgY2hhciBfX3plcm8gPSAodmVjdG9yIHNpZ25lZCBjaGFyKTA7CisgIHZlY3RvciBzaWduZWQgY2hhciBfX3ZlYyA9IF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9femVybywgX196ZXJvLAorICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKTsKKyAgX192ZWNbX19pbmRleCAmIDE1XSA9IF9fc2NhbGFyOworICByZXR1cm4gX192ZWM7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBjaGFyCit2ZWNfcHJvbW90ZSh1bnNpZ25lZCBjaGFyIF9fc2NhbGFyLCBpbnQgX19pbmRleCkgeworICBjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX3plcm8gPSAodmVjdG9yIHVuc2lnbmVkIGNoYXIpMDsKKyAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX192ZWMgPSBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX3plcm8sIF9femVybywKKyAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSk7CisgIF9fdmVjW19faW5kZXggJiAxNV0gPSBfX3NjYWxhcjsKKyAgcmV0dXJuIF9fdmVjOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIHNob3J0Cit2ZWNfcHJvbW90ZShzaWduZWQgc2hvcnQgX19zY2FsYXIsIGludCBfX2luZGV4KSB7CisgIGNvbnN0IHZlY3RvciBzaWduZWQgc2hvcnQgX196ZXJvID0gKHZlY3RvciBzaWduZWQgc2hvcnQpMDsKKyAgdmVjdG9yIHNpZ25lZCBzaG9ydCBfX3ZlYyA9IF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9femVybywgX196ZXJvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpOworICBfX3ZlY1tfX2luZGV4ICYgN10gPSBfX3NjYWxhcjsKKyAgcmV0dXJuIF9fdmVjOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgc2hvcnQKK3ZlY19wcm9tb3RlKHVuc2lnbmVkIHNob3J0IF9fc2NhbGFyLCBpbnQgX19pbmRleCkgeworICBjb25zdCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX196ZXJvID0gKHZlY3RvciB1bnNpZ25lZCBzaG9ydCkwOworICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX192ZWMgPSBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX3plcm8sIF9femVybywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpOworICBfX3ZlY1tfX2luZGV4ICYgN10gPSBfX3NjYWxhcjsKKyAgcmV0dXJuIF9fdmVjOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGludAordmVjX3Byb21vdGUoc2lnbmVkIGludCBfX3NjYWxhciwgaW50IF9faW5kZXgpIHsKKyAgY29uc3QgdmVjdG9yIHNpZ25lZCBpbnQgX196ZXJvID0gKHZlY3RvciBzaWduZWQgaW50KTA7CisgIHZlY3RvciBzaWduZWQgaW50IF9fdmVjID0gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX196ZXJvLCBfX3plcm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEpOworICBfX3ZlY1tfX2luZGV4ICYgM10gPSBfX3NjYWxhcjsKKyAgcmV0dXJuIF9fdmVjOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgaW50Cit2ZWNfcHJvbW90ZSh1bnNpZ25lZCBpbnQgX19zY2FsYXIsIGludCBfX2luZGV4KSB7CisgIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBpbnQgX196ZXJvID0gKHZlY3RvciB1bnNpZ25lZCBpbnQpMDsKKyAgdmVjdG9yIHVuc2lnbmVkIGludCBfX3ZlYyA9IF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9femVybywgX196ZXJvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEpOworICBfX3ZlY1tfX2luZGV4ICYgM10gPSBfX3NjYWxhcjsKKyAgcmV0dXJuIF9fdmVjOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZwordmVjX3Byb21vdGUoc2lnbmVkIGxvbmcgbG9uZyBfX3NjYWxhciwgaW50IF9faW5kZXgpIHsKKyAgY29uc3QgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX196ZXJvID0gKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKTA7CisgIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fdmVjID0gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX196ZXJvLCBfX3plcm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsIC0xKTsKKyAgX192ZWNbX19pbmRleCAmIDFdID0gX19zY2FsYXI7CisgIHJldHVybiBfX3ZlYzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZwordmVjX3Byb21vdGUodW5zaWduZWQgbG9uZyBsb25nIF9fc2NhbGFyLCBpbnQgX19pbmRleCkgeworICBjb25zdCB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9femVybyA9ICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKTA7CisgIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX192ZWMgPSBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX3plcm8sIF9femVybywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCAtMSk7CisgIF9fdmVjW19faW5kZXggJiAxXSA9IF9fc2NhbGFyOworICByZXR1cm4gX192ZWM7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBkb3VibGUKK3ZlY19wcm9tb3RlKGRvdWJsZSBfX3NjYWxhciwgaW50IF9faW5kZXgpIHsKKyAgY29uc3QgdmVjdG9yIGRvdWJsZSBfX3plcm8gPSAodmVjdG9yIGRvdWJsZSkwOworICB2ZWN0b3IgZG91YmxlIF9fdmVjID0gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX196ZXJvLCBfX3plcm8sIC0xLCAtMSk7CisgIF9fdmVjW19faW5kZXggJiAxXSA9IF9fc2NhbGFyOworICByZXR1cm4gX192ZWM7Cit9CisKKy8qLS0gdmVjX2luc2VydF9hbmRfemVybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBjaGFyCit2ZWNfaW5zZXJ0X2FuZF96ZXJvKGNvbnN0IHNpZ25lZCBjaGFyICpfX3B0cikgeworICB2ZWN0b3Igc2lnbmVkIGNoYXIgX192ZWMgPSAodmVjdG9yIHNpZ25lZCBjaGFyKTA7CisgIF9fdmVjWzddID0gKl9fcHRyOworICByZXR1cm4gX192ZWM7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBjaGFyCit2ZWNfaW5zZXJ0X2FuZF96ZXJvKGNvbnN0IHVuc2lnbmVkIGNoYXIgKl9fcHRyKSB7CisgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fdmVjID0gKHZlY3RvciB1bnNpZ25lZCBjaGFyKTA7CisgIF9fdmVjWzddID0gKl9fcHRyOworICByZXR1cm4gX192ZWM7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgc2hvcnQKK3ZlY19pbnNlcnRfYW5kX3plcm8oY29uc3Qgc2lnbmVkIHNob3J0ICpfX3B0cikgeworICB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fdmVjID0gKHZlY3RvciBzaWduZWQgc2hvcnQpMDsKKyAgX192ZWNbM10gPSAqX19wdHI7CisgIHJldHVybiBfX3ZlYzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIHNob3J0Cit2ZWNfaW5zZXJ0X2FuZF96ZXJvKGNvbnN0IHVuc2lnbmVkIHNob3J0ICpfX3B0cikgeworICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX192ZWMgPSAodmVjdG9yIHVuc2lnbmVkIHNob3J0KTA7CisgIF9fdmVjWzNdID0gKl9fcHRyOworICByZXR1cm4gX192ZWM7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgaW50Cit2ZWNfaW5zZXJ0X2FuZF96ZXJvKGNvbnN0IHNpZ25lZCBpbnQgKl9fcHRyKSB7CisgIHZlY3RvciBzaWduZWQgaW50IF9fdmVjID0gKHZlY3RvciBzaWduZWQgaW50KTA7CisgIF9fdmVjWzFdID0gKl9fcHRyOworICByZXR1cm4gX192ZWM7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBpbnQKK3ZlY19pbnNlcnRfYW5kX3plcm8oY29uc3QgdW5zaWduZWQgaW50ICpfX3B0cikgeworICB2ZWN0b3IgdW5zaWduZWQgaW50IF9fdmVjID0gKHZlY3RvciB1bnNpZ25lZCBpbnQpMDsKKyAgX192ZWNbMV0gPSAqX19wdHI7CisgIHJldHVybiBfX3ZlYzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcKK3ZlY19pbnNlcnRfYW5kX3plcm8oY29uc3Qgc2lnbmVkIGxvbmcgbG9uZyAqX19wdHIpIHsKKyAgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX192ZWMgPSAodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpMDsKKyAgX192ZWNbMF0gPSAqX19wdHI7CisgIHJldHVybiBfX3ZlYzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZwordmVjX2luc2VydF9hbmRfemVybyhjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKl9fcHRyKSB7CisgIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX192ZWMgPSAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZykwOworICBfX3ZlY1swXSA9ICpfX3B0cjsKKyAgcmV0dXJuIF9fdmVjOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgZG91YmxlCit2ZWNfaW5zZXJ0X2FuZF96ZXJvKGNvbnN0IGRvdWJsZSAqX19wdHIpIHsKKyAgdmVjdG9yIGRvdWJsZSBfX3ZlYyA9ICh2ZWN0b3IgZG91YmxlKTA7CisgIF9fdmVjWzBdID0gKl9fcHRyOworICByZXR1cm4gX192ZWM7Cit9CisKKy8qLS0gdmVjX3Blcm0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBjaGFyCit2ZWNfcGVybSh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iLAorICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19jKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYnVpbHRpbl9zMzkwX3ZwZXJtKAorICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iLCBfX2MpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgY2hhcgordmVjX3Blcm0odmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IsCisgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2MpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2J1aWx0aW5fczM5MF92cGVybSgKKyAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYiwgX19jKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgY2hhcgordmVjX3Blcm0odmVjdG9yIGJvb2wgY2hhciBfX2EsIHZlY3RvciBib29sIGNoYXIgX19iLAorICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19jKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgY2hhcilfX2J1aWx0aW5fczM5MF92cGVybSgKKyAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYiwgX19jKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBzaG9ydAordmVjX3Blcm0odmVjdG9yIHNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBzaWduZWQgc2hvcnQgX19iLAorICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19jKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBzaG9ydClfX2J1aWx0aW5fczM5MF92cGVybSgKKyAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYiwgX19jKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIHNob3J0Cit2ZWNfcGVybSh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iLAorICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19jKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYnVpbHRpbl9zMzkwX3ZwZXJtKAorICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iLCBfX2MpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBzaG9ydAordmVjX3Blcm0odmVjdG9yIGJvb2wgc2hvcnQgX19hLCB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IsCisgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2MpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBzaG9ydClfX2J1aWx0aW5fczM5MF92cGVybSgKKyAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYiwgX19jKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBpbnQKK3ZlY19wZXJtKHZlY3RvciBzaWduZWQgaW50IF9fYSwgdmVjdG9yIHNpZ25lZCBpbnQgX19iLAorICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19jKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBpbnQpX19idWlsdGluX3MzOTBfdnBlcm0oCisgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBpbnQKK3ZlY19wZXJtKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYiwKKyAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYykgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBpbnQpX19idWlsdGluX3MzOTBfdnBlcm0oCisgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIGludAordmVjX3Blcm0odmVjdG9yIGJvb2wgaW50IF9fYSwgdmVjdG9yIGJvb2wgaW50IF9fYiwKKyAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYykgeworICByZXR1cm4gKHZlY3RvciBib29sIGludClfX2J1aWx0aW5fczM5MF92cGVybSgKKyAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYiwgX19jKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcKK3ZlY19wZXJtKHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19iLAorICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19jKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpX19idWlsdGluX3MzOTBfdnBlcm0oCisgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcKK3ZlY19wZXJtKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYiwKKyAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYykgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19idWlsdGluX3MzOTBfdnBlcm0oCisgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIGxvbmcgbG9uZwordmVjX3Blcm0odmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYiwKKyAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYykgeworICByZXR1cm4gKHZlY3RvciBib29sIGxvbmcgbG9uZylfX2J1aWx0aW5fczM5MF92cGVybSgKKyAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYiwgX19jKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGRvdWJsZQordmVjX3Blcm0odmVjdG9yIGRvdWJsZSBfX2EsIHZlY3RvciBkb3VibGUgX19iLAorICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19jKSB7CisgIHJldHVybiAodmVjdG9yIGRvdWJsZSlfX2J1aWx0aW5fczM5MF92cGVybSgKKyAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYiwgX19jKTsKK30KKworLyotLSB2ZWNfcGVybWkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitleHRlcm4gX19BVFRSU19vIHZlY3RvciBzaWduZWQgbG9uZyBsb25nCit2ZWNfcGVybWkodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2IsIGludCBfX2MpCisgIF9fY29uc3RhbnRfcmFuZ2UoX19jLCAwLCAzKTsKKworZXh0ZXJuIF9fQVRUUlNfbyB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nCit2ZWNfcGVybWkodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iLCBpbnQgX19jKQorICBfX2NvbnN0YW50X3JhbmdlKF9fYywgMCwgMyk7CisKK2V4dGVybiBfX0FUVFJTX28gdmVjdG9yIGJvb2wgbG9uZyBsb25nCit2ZWNfcGVybWkodmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYiwgaW50IF9fYykKKyAgX19jb25zdGFudF9yYW5nZShfX2MsIDAsIDMpOworCitleHRlcm4gX19BVFRSU19vIHZlY3RvciBkb3VibGUKK3ZlY19wZXJtaSh2ZWN0b3IgZG91YmxlIF9fYSwgdmVjdG9yIGRvdWJsZSBfX2IsIGludCBfX2MpCisgIF9fY29uc3RhbnRfcmFuZ2UoX19jLCAwLCAzKTsKKworI2RlZmluZSB2ZWNfcGVybWkoWCwgWSwgWikgKChfX3R5cGVvZl9fKCh2ZWNfcGVybWkpKChYKSwgKFkpLCAoWikpKSkgXAorICBfX2J1aWx0aW5fczM5MF92cGRpKCh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKShYKSwgXAorICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKShZKSwgXAorICAgICAgICAgICAgICAgICAgICAgICgoKFopICYgMikgPDwgMSkgfCAoKFopICYgMSkpKQorCisvKi0tIHZlY19zZWwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgY2hhcgordmVjX3NlbCh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iLAorICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2MpIHsKKyAgcmV0dXJuICgodmVjdG9yIHNpZ25lZCBjaGFyKV9fYyAmIF9fYikgfCAofih2ZWN0b3Igc2lnbmVkIGNoYXIpX19jICYgX19hKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBjaGFyCit2ZWNfc2VsKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciBzaWduZWQgY2hhciBfX2IsIHZlY3RvciBib29sIGNoYXIgX19jKSB7CisgIHJldHVybiAoKHZlY3RvciBzaWduZWQgY2hhcilfX2MgJiBfX2IpIHwgKH4odmVjdG9yIHNpZ25lZCBjaGFyKV9fYyAmIF9fYSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIGNoYXIKK3ZlY19zZWwodmVjdG9yIGJvb2wgY2hhciBfX2EsIHZlY3RvciBib29sIGNoYXIgX19iLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2MpIHsKKyAgcmV0dXJuICgodmVjdG9yIGJvb2wgY2hhcilfX2MgJiBfX2IpIHwgKH4odmVjdG9yIGJvb2wgY2hhcilfX2MgJiBfX2EpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBjaGFyCit2ZWNfc2VsKHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3IgYm9vbCBjaGFyIF9fYiwgdmVjdG9yIGJvb2wgY2hhciBfX2MpIHsKKyAgcmV0dXJuIChfX2MgJiBfX2IpIHwgKH5fX2MgJiBfX2EpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgY2hhcgordmVjX3NlbCh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYiwKKyAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19jKSB7CisgIHJldHVybiAoX19jICYgX19iKSB8ICh+X19jICYgX19hKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGNoYXIKK3ZlY19zZWwodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IsCisgICAgICAgIHZlY3RvciBib29sIGNoYXIgX19jKSB7CisgIHJldHVybiAoKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYyAmIF9fYikgfCAofih2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2MgJiBfX2EpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIHNob3J0Cit2ZWNfc2VsKHZlY3RvciBzaWduZWQgc2hvcnQgX19hLCB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYiwKKyAgICAgICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYykgeworICByZXR1cm4gKCh2ZWN0b3Igc2lnbmVkIHNob3J0KV9fYyAmIF9fYikgfCAofih2ZWN0b3Igc2lnbmVkIHNob3J0KV9fYyAmIF9fYSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgc2hvcnQKK3ZlY19zZWwodmVjdG9yIHNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBzaWduZWQgc2hvcnQgX19iLAorICAgICAgICB2ZWN0b3IgYm9vbCBzaG9ydCBfX2MpIHsKKyAgcmV0dXJuICgodmVjdG9yIHNpZ25lZCBzaG9ydClfX2MgJiBfX2IpIHwgKH4odmVjdG9yIHNpZ25lZCBzaG9ydClfX2MgJiBfX2EpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBzaG9ydAordmVjX3NlbCh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIHZlY3RvciBib29sIHNob3J0IF9fYiwKKyAgICAgICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYykgeworICByZXR1cm4gKCh2ZWN0b3IgYm9vbCBzaG9ydClfX2MgJiBfX2IpIHwgKH4odmVjdG9yIGJvb2wgc2hvcnQpX19jICYgX19hKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgc2hvcnQKK3ZlY19zZWwodmVjdG9yIGJvb2wgc2hvcnQgX19hLCB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IsIHZlY3RvciBib29sIHNob3J0IF9fYykgeworICByZXR1cm4gKF9fYyAmIF9fYikgfCAofl9fYyAmIF9fYSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBzaG9ydAordmVjX3NlbCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iLAorICAgICAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19jKSB7CisgIHJldHVybiAoX19jICYgX19iKSB8ICh+X19jICYgX19hKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIHNob3J0Cit2ZWNfc2VsKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IsCisgICAgICAgIHZlY3RvciBib29sIHNob3J0IF9fYykgeworICByZXR1cm4gKCgodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYyAmIF9fYikgfAorICAgICAgICAgICh+KHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2MgJiBfX2EpKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBpbnQKK3ZlY19zZWwodmVjdG9yIHNpZ25lZCBpbnQgX19hLCB2ZWN0b3Igc2lnbmVkIGludCBfX2IsCisgICAgICAgIHZlY3RvciB1bnNpZ25lZCBpbnQgX19jKSB7CisgIHJldHVybiAoKHZlY3RvciBzaWduZWQgaW50KV9fYyAmIF9fYikgfCAofih2ZWN0b3Igc2lnbmVkIGludClfX2MgJiBfX2EpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGludAordmVjX3NlbCh2ZWN0b3Igc2lnbmVkIGludCBfX2EsIHZlY3RvciBzaWduZWQgaW50IF9fYiwgdmVjdG9yIGJvb2wgaW50IF9fYykgeworICByZXR1cm4gKCh2ZWN0b3Igc2lnbmVkIGludClfX2MgJiBfX2IpIHwgKH4odmVjdG9yIHNpZ25lZCBpbnQpX19jICYgX19hKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgaW50Cit2ZWNfc2VsKHZlY3RvciBib29sIGludCBfX2EsIHZlY3RvciBib29sIGludCBfX2IsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19jKSB7CisgIHJldHVybiAoKHZlY3RvciBib29sIGludClfX2MgJiBfX2IpIHwgKH4odmVjdG9yIGJvb2wgaW50KV9fYyAmIF9fYSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIGludAordmVjX3NlbCh2ZWN0b3IgYm9vbCBpbnQgX19hLCB2ZWN0b3IgYm9vbCBpbnQgX19iLCB2ZWN0b3IgYm9vbCBpbnQgX19jKSB7CisgIHJldHVybiAoX19jICYgX19iKSB8ICh+X19jICYgX19hKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGludAordmVjX3NlbCh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IsCisgICAgICAgIHZlY3RvciB1bnNpZ25lZCBpbnQgX19jKSB7CisgIHJldHVybiAoX19jICYgX19iKSB8ICh+X19jICYgX19hKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGludAordmVjX3NlbCh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IsIHZlY3RvciBib29sIGludCBfX2MpIHsKKyAgcmV0dXJuICgodmVjdG9yIHVuc2lnbmVkIGludClfX2MgJiBfX2IpIHwgKH4odmVjdG9yIHVuc2lnbmVkIGludClfX2MgJiBfX2EpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZwordmVjX3NlbCh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYiwKKyAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2MpIHsKKyAgcmV0dXJuICgoKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYyAmIF9fYikgfAorICAgICAgICAgICh+KHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYyAmIF9fYSkpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZwordmVjX3NlbCh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYiwKKyAgICAgICAgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYykgeworICByZXR1cm4gKCgodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpX19jICYgX19iKSB8CisgICAgICAgICAgKH4odmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpX19jICYgX19hKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIGxvbmcgbG9uZwordmVjX3NlbCh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19iLAorICAgICAgICB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYykgeworICByZXR1cm4gKCgodmVjdG9yIGJvb2wgbG9uZyBsb25nKV9fYyAmIF9fYikgfAorICAgICAgICAgICh+KHZlY3RvciBib29sIGxvbmcgbG9uZylfX2MgJiBfX2EpKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgbG9uZyBsb25nCit2ZWNfc2VsKHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2IsCisgICAgICAgIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2MpIHsKKyAgcmV0dXJuIChfX2MgJiBfX2IpIHwgKH5fX2MgJiBfX2EpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nCit2ZWNfc2VsKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYiwKKyAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2MpIHsKKyAgcmV0dXJuIChfX2MgJiBfX2IpIHwgKH5fX2MgJiBfX2EpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nCit2ZWNfc2VsKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYiwKKyAgICAgICAgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYykgeworICByZXR1cm4gKCgodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2MgJiBfX2IpIHwKKyAgICAgICAgICAofih2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYyAmIF9fYSkpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgZG91YmxlCit2ZWNfc2VsKHZlY3RvciBkb3VibGUgX19hLCB2ZWN0b3IgZG91YmxlIF9fYiwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2MpIHsKKyAgcmV0dXJuICh2ZWN0b3IgZG91YmxlKSgoX19jICYgKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19iKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgKH5fX2MgJiAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2EpKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGRvdWJsZQordmVjX3NlbCh2ZWN0b3IgZG91YmxlIF9fYSwgdmVjdG9yIGRvdWJsZSBfX2IsIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2MpIHsKKyAgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2FjID0gKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19hOworICB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYmMgPSAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2I7CisgIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19jYyA9ICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYzsKKyAgcmV0dXJuICh2ZWN0b3IgZG91YmxlKSgoX19jYyAmIF9fYmMpIHwgKH5fX2NjICYgX19hYykpOworfQorCisvKi0tIHZlY19nYXRoZXJfZWxlbWVudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgaW50Cit2ZWNfZ2F0aGVyX2VsZW1lbnQodmVjdG9yIHNpZ25lZCBpbnQgX192ZWMsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc2lnbmVkIGludCAqX19wdHIsIGludCBfX2luZGV4KQorICBfX2NvbnN0YW50X3JhbmdlKF9faW5kZXgsIDAsIDMpIHsKKyAgX192ZWNbX19pbmRleF0gPSAqKGNvbnN0IHNpZ25lZCBpbnQgKikoCisgICAgKF9fSU5UUFRSX1RZUEVfXylfX3B0ciArIChfX0lOVFBUUl9UWVBFX18pX19vZmZzZXRbX19pbmRleF0pOworICByZXR1cm4gX192ZWM7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIGludAordmVjX2dhdGhlcl9lbGVtZW50KHZlY3RvciBib29sIGludCBfX3ZlYywgdmVjdG9yIHVuc2lnbmVkIGludCBfX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgKl9fcHRyLCBpbnQgX19pbmRleCkKKyAgX19jb25zdGFudF9yYW5nZShfX2luZGV4LCAwLCAzKSB7CisgIF9fdmVjW19faW5kZXhdID0gKihjb25zdCB1bnNpZ25lZCBpbnQgKikoCisgICAgKF9fSU5UUFRSX1RZUEVfXylfX3B0ciArIChfX0lOVFBUUl9UWVBFX18pX19vZmZzZXRbX19pbmRleF0pOworICByZXR1cm4gX192ZWM7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBpbnQKK3ZlY19nYXRoZXJfZWxlbWVudCh2ZWN0b3IgdW5zaWduZWQgaW50IF9fdmVjLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCAqX19wdHIsIGludCBfX2luZGV4KQorICBfX2NvbnN0YW50X3JhbmdlKF9faW5kZXgsIDAsIDMpIHsKKyAgX192ZWNbX19pbmRleF0gPSAqKGNvbnN0IHVuc2lnbmVkIGludCAqKSgKKyAgICAoX19JTlRQVFJfVFlQRV9fKV9fcHRyICsgKF9fSU5UUFRSX1RZUEVfXylfX29mZnNldFtfX2luZGV4XSk7CisgIHJldHVybiBfX3ZlYzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcKK3ZlY19nYXRoZXJfZWxlbWVudCh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX3ZlYywKKyAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpZ25lZCBsb25nIGxvbmcgKl9fcHRyLCBpbnQgX19pbmRleCkKKyAgX19jb25zdGFudF9yYW5nZShfX2luZGV4LCAwLCAxKSB7CisgIF9fdmVjW19faW5kZXhdID0gKihjb25zdCBzaWduZWQgbG9uZyBsb25nICopKAorICAgIChfX0lOVFBUUl9UWVBFX18pX19wdHIgKyAoX19JTlRQVFJfVFlQRV9fKV9fb2Zmc2V0W19faW5kZXhdKTsKKyAgcmV0dXJuIF9fdmVjOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBsb25nIGxvbmcKK3ZlY19nYXRoZXJfZWxlbWVudCh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX192ZWMsCisgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKl9fcHRyLCBpbnQgX19pbmRleCkKKyAgX19jb25zdGFudF9yYW5nZShfX2luZGV4LCAwLCAxKSB7CisgIF9fdmVjW19faW5kZXhdID0gKihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKikoCisgICAgKF9fSU5UUFRSX1RZUEVfXylfX3B0ciArIChfX0lOVFBUUl9UWVBFX18pX19vZmZzZXRbX19pbmRleF0pOworICByZXR1cm4gX192ZWM7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcKK3ZlY19nYXRoZXJfZWxlbWVudCh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fdmVjLAorICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICpfX3B0ciwgaW50IF9faW5kZXgpCisgIF9fY29uc3RhbnRfcmFuZ2UoX19pbmRleCwgMCwgMSkgeworICBfX3ZlY1tfX2luZGV4XSA9ICooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopKAorICAgIChfX0lOVFBUUl9UWVBFX18pX19wdHIgKyAoX19JTlRQVFJfVFlQRV9fKV9fb2Zmc2V0W19faW5kZXhdKTsKKyAgcmV0dXJuIF9fdmVjOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgZG91YmxlCit2ZWNfZ2F0aGVyX2VsZW1lbnQodmVjdG9yIGRvdWJsZSBfX3ZlYywgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgKl9fcHRyLCBpbnQgX19pbmRleCkKKyAgX19jb25zdGFudF9yYW5nZShfX2luZGV4LCAwLCAxKSB7CisgIF9fdmVjW19faW5kZXhdID0gKihjb25zdCBkb3VibGUgKikoCisgICAgKF9fSU5UUFRSX1RZUEVfXylfX3B0ciArIChfX0lOVFBUUl9UWVBFX18pX19vZmZzZXRbX19pbmRleF0pOworICByZXR1cm4gX192ZWM7Cit9CisKKy8qLS0gdmVjX3NjYXR0ZXJfZWxlbWVudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdm9pZAordmVjX3NjYXR0ZXJfZWxlbWVudCh2ZWN0b3Igc2lnbmVkIGludCBfX3ZlYywgdmVjdG9yIHVuc2lnbmVkIGludCBfX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgc2lnbmVkIGludCAqX19wdHIsIGludCBfX2luZGV4KQorICBfX2NvbnN0YW50X3JhbmdlKF9faW5kZXgsIDAsIDMpIHsKKyAgKihzaWduZWQgaW50ICopKChfX0lOVFBUUl9UWVBFX18pX19wdHIgKyBfX29mZnNldFtfX2luZGV4XSkgPQorICAgIF9fdmVjW19faW5kZXhdOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2b2lkCit2ZWNfc2NhdHRlcl9lbGVtZW50KHZlY3RvciBib29sIGludCBfX3ZlYywgdmVjdG9yIHVuc2lnbmVkIGludCBfX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpfX3B0ciwgaW50IF9faW5kZXgpCisgIF9fY29uc3RhbnRfcmFuZ2UoX19pbmRleCwgMCwgMykgeworICAqKHVuc2lnbmVkIGludCAqKSgoX19JTlRQVFJfVFlQRV9fKV9fcHRyICsgX19vZmZzZXRbX19pbmRleF0pID0KKyAgICBfX3ZlY1tfX2luZGV4XTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdm9pZAordmVjX3NjYXR0ZXJfZWxlbWVudCh2ZWN0b3IgdW5zaWduZWQgaW50IF9fdmVjLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKl9fcHRyLCBpbnQgX19pbmRleCkKKyAgX19jb25zdGFudF9yYW5nZShfX2luZGV4LCAwLCAzKSB7CisgICoodW5zaWduZWQgaW50ICopKChfX0lOVFBUUl9UWVBFX18pX19wdHIgKyBfX29mZnNldFtfX2luZGV4XSkgPQorICAgIF9fdmVjW19faW5kZXhdOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2b2lkCit2ZWNfc2NhdHRlcl9lbGVtZW50KHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fdmVjLAorICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICBzaWduZWQgbG9uZyBsb25nICpfX3B0ciwgaW50IF9faW5kZXgpCisgIF9fY29uc3RhbnRfcmFuZ2UoX19pbmRleCwgMCwgMSkgeworICAqKHNpZ25lZCBsb25nIGxvbmcgKikoKF9fSU5UUFRSX1RZUEVfXylfX3B0ciArIF9fb2Zmc2V0W19faW5kZXhdKSA9CisgICAgX192ZWNbX19pbmRleF07Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZvaWQKK3ZlY19zY2F0dGVyX2VsZW1lbnQodmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fdmVjLAorICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgKl9fcHRyLCBpbnQgX19pbmRleCkKKyAgX19jb25zdGFudF9yYW5nZShfX2luZGV4LCAwLCAxKSB7CisgICoodW5zaWduZWQgbG9uZyBsb25nICopKChfX0lOVFBUUl9UWVBFX18pX19wdHIgKyBfX29mZnNldFtfX2luZGV4XSkgPQorICAgIF9fdmVjW19faW5kZXhdOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2b2lkCit2ZWNfc2NhdHRlcl9lbGVtZW50KHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX192ZWMsCisgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAqX19wdHIsIGludCBfX2luZGV4KQorICBfX2NvbnN0YW50X3JhbmdlKF9faW5kZXgsIDAsIDEpIHsKKyAgKih1bnNpZ25lZCBsb25nIGxvbmcgKikoKF9fSU5UUFRSX1RZUEVfXylfX3B0ciArIF9fb2Zmc2V0W19faW5kZXhdKSA9CisgICAgX192ZWNbX19pbmRleF07Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZvaWQKK3ZlY19zY2F0dGVyX2VsZW1lbnQodmVjdG9yIGRvdWJsZSBfX3ZlYywgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlICpfX3B0ciwgaW50IF9faW5kZXgpCisgIF9fY29uc3RhbnRfcmFuZ2UoX19pbmRleCwgMCwgMSkgeworICAqKGRvdWJsZSAqKSgoX19JTlRQVFJfVFlQRV9fKV9fcHRyICsgX19vZmZzZXRbX19pbmRleF0pID0KKyAgICBfX3ZlY1tfX2luZGV4XTsKK30KKworLyotLSB2ZWNfeGxkMiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGNoYXIKK3ZlY194bGQyKGxvbmcgX19vZmZzZXQsIGNvbnN0IHNpZ25lZCBjaGFyICpfX3B0cikgeworICByZXR1cm4gKihjb25zdCB2ZWN0b3Igc2lnbmVkIGNoYXIgKikoKF9fSU5UUFRSX1RZUEVfXylfX3B0ciArIF9fb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGNoYXIKK3ZlY194bGQyKGxvbmcgX19vZmZzZXQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKl9fcHRyKSB7CisgIHJldHVybiAqKGNvbnN0IHZlY3RvciB1bnNpZ25lZCBjaGFyICopKChfX0lOVFBUUl9UWVBFX18pX19wdHIgKyBfX29mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgc2hvcnQKK3ZlY194bGQyKGxvbmcgX19vZmZzZXQsIGNvbnN0IHNpZ25lZCBzaG9ydCAqX19wdHIpIHsKKyAgcmV0dXJuICooY29uc3QgdmVjdG9yIHNpZ25lZCBzaG9ydCAqKSgoX19JTlRQVFJfVFlQRV9fKV9fcHRyICsgX19vZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgc2hvcnQKK3ZlY194bGQyKGxvbmcgX19vZmZzZXQsIGNvbnN0IHVuc2lnbmVkIHNob3J0ICpfX3B0cikgeworICByZXR1cm4gKihjb25zdCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgKikoKF9fSU5UUFRSX1RZUEVfXylfX3B0ciArIF9fb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBpbnQKK3ZlY194bGQyKGxvbmcgX19vZmZzZXQsIGNvbnN0IHNpZ25lZCBpbnQgKl9fcHRyKSB7CisgIHJldHVybiAqKGNvbnN0IHZlY3RvciBzaWduZWQgaW50ICopKChfX0lOVFBUUl9UWVBFX18pX19wdHIgKyBfX29mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBpbnQKK3ZlY194bGQyKGxvbmcgX19vZmZzZXQsIGNvbnN0IHVuc2lnbmVkIGludCAqX19wdHIpIHsKKyAgcmV0dXJuICooY29uc3QgdmVjdG9yIHVuc2lnbmVkIGludCAqKSgoX19JTlRQVFJfVFlQRV9fKV9fcHRyICsgX19vZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZwordmVjX3hsZDIobG9uZyBfX29mZnNldCwgY29uc3Qgc2lnbmVkIGxvbmcgbG9uZyAqX19wdHIpIHsKKyAgcmV0dXJuICooY29uc3QgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgKikoKF9fSU5UUFRSX1RZUEVfXylfX3B0ciArIF9fb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZwordmVjX3hsZDIobG9uZyBfX29mZnNldCwgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICpfX3B0cikgeworICByZXR1cm4gKihjb25zdCB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nICopKChfX0lOVFBUUl9UWVBFX18pX19wdHIgKyBfX29mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBkb3VibGUKK3ZlY194bGQyKGxvbmcgX19vZmZzZXQsIGNvbnN0IGRvdWJsZSAqX19wdHIpIHsKKyAgcmV0dXJuICooY29uc3QgdmVjdG9yIGRvdWJsZSAqKSgoX19JTlRQVFJfVFlQRV9fKV9fcHRyICsgX19vZmZzZXQpOworfQorCisvKi0tIHZlY194bHc0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgY2hhcgordmVjX3hsdzQobG9uZyBfX29mZnNldCwgY29uc3Qgc2lnbmVkIGNoYXIgKl9fcHRyKSB7CisgIHJldHVybiAqKGNvbnN0IHZlY3RvciBzaWduZWQgY2hhciAqKSgoX19JTlRQVFJfVFlQRV9fKV9fcHRyICsgX19vZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgY2hhcgordmVjX3hsdzQobG9uZyBfX29mZnNldCwgY29uc3QgdW5zaWduZWQgY2hhciAqX19wdHIpIHsKKyAgcmV0dXJuICooY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgKikoKF9fSU5UUFRSX1RZUEVfXylfX3B0ciArIF9fb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBzaG9ydAordmVjX3hsdzQobG9uZyBfX29mZnNldCwgY29uc3Qgc2lnbmVkIHNob3J0ICpfX3B0cikgeworICByZXR1cm4gKihjb25zdCB2ZWN0b3Igc2lnbmVkIHNob3J0ICopKChfX0lOVFBUUl9UWVBFX18pX19wdHIgKyBfX29mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBzaG9ydAordmVjX3hsdzQobG9uZyBfX29mZnNldCwgY29uc3QgdW5zaWduZWQgc2hvcnQgKl9fcHRyKSB7CisgIHJldHVybiAqKGNvbnN0IHZlY3RvciB1bnNpZ25lZCBzaG9ydCAqKSgoX19JTlRQVFJfVFlQRV9fKV9fcHRyICsgX19vZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGludAordmVjX3hsdzQobG9uZyBfX29mZnNldCwgY29uc3Qgc2lnbmVkIGludCAqX19wdHIpIHsKKyAgcmV0dXJuICooY29uc3QgdmVjdG9yIHNpZ25lZCBpbnQgKikoKF9fSU5UUFRSX1RZUEVfXylfX3B0ciArIF9fb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGludAordmVjX3hsdzQobG9uZyBfX29mZnNldCwgY29uc3QgdW5zaWduZWQgaW50ICpfX3B0cikgeworICByZXR1cm4gKihjb25zdCB2ZWN0b3IgdW5zaWduZWQgaW50ICopKChfX0lOVFBUUl9UWVBFX18pX19wdHIgKyBfX29mZnNldCk7Cit9CisKKy8qLS0gdmVjX3hzdGQyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdm9pZAordmVjX3hzdGQyKHZlY3RvciBzaWduZWQgY2hhciBfX3ZlYywgbG9uZyBfX29mZnNldCwgc2lnbmVkIGNoYXIgKl9fcHRyKSB7CisgICoodmVjdG9yIHNpZ25lZCBjaGFyICopKChfX0lOVFBUUl9UWVBFX18pX19wdHIgKyBfX29mZnNldCkgPSBfX3ZlYzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdm9pZAordmVjX3hzdGQyKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fdmVjLCBsb25nIF9fb2Zmc2V0LCB1bnNpZ25lZCBjaGFyICpfX3B0cikgeworICAqKHZlY3RvciB1bnNpZ25lZCBjaGFyICopKChfX0lOVFBUUl9UWVBFX18pX19wdHIgKyBfX29mZnNldCkgPSBfX3ZlYzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdm9pZAordmVjX3hzdGQyKHZlY3RvciBzaWduZWQgc2hvcnQgX192ZWMsIGxvbmcgX19vZmZzZXQsIHNpZ25lZCBzaG9ydCAqX19wdHIpIHsKKyAgKih2ZWN0b3Igc2lnbmVkIHNob3J0ICopKChfX0lOVFBUUl9UWVBFX18pX19wdHIgKyBfX29mZnNldCkgPSBfX3ZlYzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdm9pZAordmVjX3hzdGQyKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX3ZlYywgbG9uZyBfX29mZnNldCwgdW5zaWduZWQgc2hvcnQgKl9fcHRyKSB7CisgICoodmVjdG9yIHVuc2lnbmVkIHNob3J0ICopKChfX0lOVFBUUl9UWVBFX18pX19wdHIgKyBfX29mZnNldCkgPSBfX3ZlYzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdm9pZAordmVjX3hzdGQyKHZlY3RvciBzaWduZWQgaW50IF9fdmVjLCBsb25nIF9fb2Zmc2V0LCBzaWduZWQgaW50ICpfX3B0cikgeworICAqKHZlY3RvciBzaWduZWQgaW50ICopKChfX0lOVFBUUl9UWVBFX18pX19wdHIgKyBfX29mZnNldCkgPSBfX3ZlYzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdm9pZAordmVjX3hzdGQyKHZlY3RvciB1bnNpZ25lZCBpbnQgX192ZWMsIGxvbmcgX19vZmZzZXQsIHVuc2lnbmVkIGludCAqX19wdHIpIHsKKyAgKih2ZWN0b3IgdW5zaWduZWQgaW50ICopKChfX0lOVFBUUl9UWVBFX18pX19wdHIgKyBfX29mZnNldCkgPSBfX3ZlYzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdm9pZAordmVjX3hzdGQyKHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fdmVjLCBsb25nIF9fb2Zmc2V0LAorICAgICAgICAgIHNpZ25lZCBsb25nIGxvbmcgKl9fcHRyKSB7CisgICoodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgKikoKF9fSU5UUFRSX1RZUEVfXylfX3B0ciArIF9fb2Zmc2V0KSA9IF9fdmVjOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2b2lkCit2ZWNfeHN0ZDIodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX3ZlYywgbG9uZyBfX29mZnNldCwKKyAgICAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgKl9fcHRyKSB7CisgICoodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyAqKSgoX19JTlRQVFJfVFlQRV9fKV9fcHRyICsgX19vZmZzZXQpID0KKyAgICBfX3ZlYzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdm9pZAordmVjX3hzdGQyKHZlY3RvciBkb3VibGUgX192ZWMsIGxvbmcgX19vZmZzZXQsIGRvdWJsZSAqX19wdHIpIHsKKyAgKih2ZWN0b3IgZG91YmxlICopKChfX0lOVFBUUl9UWVBFX18pX19wdHIgKyBfX29mZnNldCkgPSBfX3ZlYzsKK30KKworLyotLSB2ZWNfeHN0dzQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2b2lkCit2ZWNfeHN0dzQodmVjdG9yIHNpZ25lZCBjaGFyIF9fdmVjLCBsb25nIF9fb2Zmc2V0LCBzaWduZWQgY2hhciAqX19wdHIpIHsKKyAgKih2ZWN0b3Igc2lnbmVkIGNoYXIgKikoKF9fSU5UUFRSX1RZUEVfXylfX3B0ciArIF9fb2Zmc2V0KSA9IF9fdmVjOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2b2lkCit2ZWNfeHN0dzQodmVjdG9yIHVuc2lnbmVkIGNoYXIgX192ZWMsIGxvbmcgX19vZmZzZXQsIHVuc2lnbmVkIGNoYXIgKl9fcHRyKSB7CisgICoodmVjdG9yIHVuc2lnbmVkIGNoYXIgKikoKF9fSU5UUFRSX1RZUEVfXylfX3B0ciArIF9fb2Zmc2V0KSA9IF9fdmVjOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2b2lkCit2ZWNfeHN0dzQodmVjdG9yIHNpZ25lZCBzaG9ydCBfX3ZlYywgbG9uZyBfX29mZnNldCwgc2lnbmVkIHNob3J0ICpfX3B0cikgeworICAqKHZlY3RvciBzaWduZWQgc2hvcnQgKikoKF9fSU5UUFRSX1RZUEVfXylfX3B0ciArIF9fb2Zmc2V0KSA9IF9fdmVjOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2b2lkCit2ZWNfeHN0dzQodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fdmVjLCBsb25nIF9fb2Zmc2V0LCB1bnNpZ25lZCBzaG9ydCAqX19wdHIpIHsKKyAgKih2ZWN0b3IgdW5zaWduZWQgc2hvcnQgKikoKF9fSU5UUFRSX1RZUEVfXylfX3B0ciArIF9fb2Zmc2V0KSA9IF9fdmVjOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2b2lkCit2ZWNfeHN0dzQodmVjdG9yIHNpZ25lZCBpbnQgX192ZWMsIGxvbmcgX19vZmZzZXQsIHNpZ25lZCBpbnQgKl9fcHRyKSB7CisgICoodmVjdG9yIHNpZ25lZCBpbnQgKikoKF9fSU5UUFRSX1RZUEVfXylfX3B0ciArIF9fb2Zmc2V0KSA9IF9fdmVjOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2b2lkCit2ZWNfeHN0dzQodmVjdG9yIHVuc2lnbmVkIGludCBfX3ZlYywgbG9uZyBfX29mZnNldCwgdW5zaWduZWQgaW50ICpfX3B0cikgeworICAqKHZlY3RvciB1bnNpZ25lZCBpbnQgKikoKF9fSU5UUFRSX1RZUEVfXylfX3B0ciArIF9fb2Zmc2V0KSA9IF9fdmVjOworfQorCisvKi0tIHZlY19sb2FkX2JuZHJ5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2V4dGVybiBfX0FUVFJTX28gdmVjdG9yIHNpZ25lZCBjaGFyCit2ZWNfbG9hZF9ibmRyeShjb25zdCBzaWduZWQgY2hhciAqX19wdHIsIHVuc2lnbmVkIHNob3J0IF9fbGVuKQorICBfX2NvbnN0YW50X3BvdzJfcmFuZ2UoX19sZW4sIDY0LCA0MDk2KTsKKworZXh0ZXJuIF9fQVRUUlNfbyB2ZWN0b3IgdW5zaWduZWQgY2hhcgordmVjX2xvYWRfYm5kcnkoY29uc3QgdW5zaWduZWQgY2hhciAqX19wdHIsIHVuc2lnbmVkIHNob3J0IF9fbGVuKQorICBfX2NvbnN0YW50X3BvdzJfcmFuZ2UoX19sZW4sIDY0LCA0MDk2KTsKKworZXh0ZXJuIF9fQVRUUlNfbyB2ZWN0b3Igc2lnbmVkIHNob3J0Cit2ZWNfbG9hZF9ibmRyeShjb25zdCBzaWduZWQgc2hvcnQgKl9fcHRyLCB1bnNpZ25lZCBzaG9ydCBfX2xlbikKKyAgX19jb25zdGFudF9wb3cyX3JhbmdlKF9fbGVuLCA2NCwgNDA5Nik7CisKK2V4dGVybiBfX0FUVFJTX28gdmVjdG9yIHVuc2lnbmVkIHNob3J0Cit2ZWNfbG9hZF9ibmRyeShjb25zdCB1bnNpZ25lZCBzaG9ydCAqX19wdHIsIHVuc2lnbmVkIHNob3J0IF9fbGVuKQorICBfX2NvbnN0YW50X3BvdzJfcmFuZ2UoX19sZW4sIDY0LCA0MDk2KTsKKworZXh0ZXJuIF9fQVRUUlNfbyB2ZWN0b3Igc2lnbmVkIGludAordmVjX2xvYWRfYm5kcnkoY29uc3Qgc2lnbmVkIGludCAqX19wdHIsIHVuc2lnbmVkIHNob3J0IF9fbGVuKQorICBfX2NvbnN0YW50X3BvdzJfcmFuZ2UoX19sZW4sIDY0LCA0MDk2KTsKKworZXh0ZXJuIF9fQVRUUlNfbyB2ZWN0b3IgdW5zaWduZWQgaW50Cit2ZWNfbG9hZF9ibmRyeShjb25zdCB1bnNpZ25lZCBpbnQgKl9fcHRyLCB1bnNpZ25lZCBzaG9ydCBfX2xlbikKKyAgX19jb25zdGFudF9wb3cyX3JhbmdlKF9fbGVuLCA2NCwgNDA5Nik7CisKK2V4dGVybiBfX0FUVFJTX28gdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcKK3ZlY19sb2FkX2JuZHJ5KGNvbnN0IHNpZ25lZCBsb25nIGxvbmcgKl9fcHRyLCB1bnNpZ25lZCBzaG9ydCBfX2xlbikKKyAgX19jb25zdGFudF9wb3cyX3JhbmdlKF9fbGVuLCA2NCwgNDA5Nik7CisKK2V4dGVybiBfX0FUVFJTX28gdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZwordmVjX2xvYWRfYm5kcnkoY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICpfX3B0ciwgdW5zaWduZWQgc2hvcnQgX19sZW4pCisgIF9fY29uc3RhbnRfcG93Ml9yYW5nZShfX2xlbiwgNjQsIDQwOTYpOworCitleHRlcm4gX19BVFRSU19vIHZlY3RvciBkb3VibGUKK3ZlY19sb2FkX2JuZHJ5KGNvbnN0IGRvdWJsZSAqX19wdHIsIHVuc2lnbmVkIHNob3J0IF9fbGVuKQorICBfX2NvbnN0YW50X3BvdzJfcmFuZ2UoX19sZW4sIDY0LCA0MDk2KTsKKworI2RlZmluZSB2ZWNfbG9hZF9ibmRyeShYLCBZKSAoKF9fdHlwZW9mX18oKHZlY19sb2FkX2JuZHJ5KSgoWCksIChZKSkpKSBcCisgIF9fYnVpbHRpbl9zMzkwX3ZsYmIoKFgpLCAoKFkpID09IDY0ID8gMCA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoWSkgPT0gMTI4ID8gMSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoWSkgPT0gMjU2ID8gMiA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoWSkgPT0gNTEyID8gMyA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoWSkgPT0gMTAyNCA/IDQgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFkpID09IDIwNDggPyA1IDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChZKSA9PSA0MDk2ID8gNiA6IC0xKSkpCisKKy8qLS0gdmVjX2xvYWRfbGVuIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBjaGFyCit2ZWNfbG9hZF9sZW4oY29uc3Qgc2lnbmVkIGNoYXIgKl9fcHRyLCB1bnNpZ25lZCBpbnQgX19sZW4pIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGNoYXIpX19idWlsdGluX3MzOTBfdmxsKF9fbGVuLCBfX3B0cik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBjaGFyCit2ZWNfbG9hZF9sZW4oY29uc3QgdW5zaWduZWQgY2hhciAqX19wdHIsIHVuc2lnbmVkIGludCBfX2xlbikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYnVpbHRpbl9zMzkwX3ZsbChfX2xlbiwgX19wdHIpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIHNob3J0Cit2ZWNfbG9hZF9sZW4oY29uc3Qgc2lnbmVkIHNob3J0ICpfX3B0ciwgdW5zaWduZWQgaW50IF9fbGVuKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBzaG9ydClfX2J1aWx0aW5fczM5MF92bGwoX19sZW4sIF9fcHRyKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIHNob3J0Cit2ZWNfbG9hZF9sZW4oY29uc3QgdW5zaWduZWQgc2hvcnQgKl9fcHRyLCB1bnNpZ25lZCBpbnQgX19sZW4pIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19idWlsdGluX3MzOTBfdmxsKF9fbGVuLCBfX3B0cik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgaW50Cit2ZWNfbG9hZF9sZW4oY29uc3Qgc2lnbmVkIGludCAqX19wdHIsIHVuc2lnbmVkIGludCBfX2xlbikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgaW50KV9fYnVpbHRpbl9zMzkwX3ZsbChfX2xlbiwgX19wdHIpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgaW50Cit2ZWNfbG9hZF9sZW4oY29uc3QgdW5zaWduZWQgaW50ICpfX3B0ciwgdW5zaWduZWQgaW50IF9fbGVuKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGludClfX2J1aWx0aW5fczM5MF92bGwoX19sZW4sIF9fcHRyKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcKK3ZlY19sb2FkX2xlbihjb25zdCBzaWduZWQgbG9uZyBsb25nICpfX3B0ciwgdW5zaWduZWQgaW50IF9fbGVuKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpX19idWlsdGluX3MzOTBfdmxsKF9fbGVuLCBfX3B0cik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcKK3ZlY19sb2FkX2xlbihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKl9fcHRyLCB1bnNpZ25lZCBpbnQgX19sZW4pIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYnVpbHRpbl9zMzkwX3ZsbChfX2xlbiwgX19wdHIpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgZG91YmxlCit2ZWNfbG9hZF9sZW4oY29uc3QgZG91YmxlICpfX3B0ciwgdW5zaWduZWQgaW50IF9fbGVuKSB7CisgIHJldHVybiAodmVjdG9yIGRvdWJsZSlfX2J1aWx0aW5fczM5MF92bGwoX19sZW4sIF9fcHRyKTsKK30KKworLyotLSB2ZWNfc3RvcmVfbGVuIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2b2lkCit2ZWNfc3RvcmVfbGVuKHZlY3RvciBzaWduZWQgY2hhciBfX3ZlYywgc2lnbmVkIGNoYXIgKl9fcHRyLAorICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgX19sZW4pIHsKKyAgX19idWlsdGluX3MzOTBfdnN0bCgodmVjdG9yIHNpZ25lZCBjaGFyKV9fdmVjLCBfX2xlbiwgX19wdHIpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2b2lkCit2ZWNfc3RvcmVfbGVuKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fdmVjLCB1bnNpZ25lZCBjaGFyICpfX3B0ciwKKyAgICAgICAgICAgICAgdW5zaWduZWQgaW50IF9fbGVuKSB7CisgIF9fYnVpbHRpbl9zMzkwX3ZzdGwoKHZlY3RvciBzaWduZWQgY2hhcilfX3ZlYywgX19sZW4sIF9fcHRyKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdm9pZAordmVjX3N0b3JlX2xlbih2ZWN0b3Igc2lnbmVkIHNob3J0IF9fdmVjLCBzaWduZWQgc2hvcnQgKl9fcHRyLAorICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgX19sZW4pIHsKKyAgX19idWlsdGluX3MzOTBfdnN0bCgodmVjdG9yIHNpZ25lZCBjaGFyKV9fdmVjLCBfX2xlbiwgX19wdHIpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2b2lkCit2ZWNfc3RvcmVfbGVuKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX3ZlYywgdW5zaWduZWQgc2hvcnQgKl9fcHRyLAorICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgX19sZW4pIHsKKyAgX19idWlsdGluX3MzOTBfdnN0bCgodmVjdG9yIHNpZ25lZCBjaGFyKV9fdmVjLCBfX2xlbiwgX19wdHIpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2b2lkCit2ZWNfc3RvcmVfbGVuKHZlY3RvciBzaWduZWQgaW50IF9fdmVjLCBzaWduZWQgaW50ICpfX3B0ciwKKyAgICAgICAgICAgICAgdW5zaWduZWQgaW50IF9fbGVuKSB7CisgIF9fYnVpbHRpbl9zMzkwX3ZzdGwoKHZlY3RvciBzaWduZWQgY2hhcilfX3ZlYywgX19sZW4sIF9fcHRyKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdm9pZAordmVjX3N0b3JlX2xlbih2ZWN0b3IgdW5zaWduZWQgaW50IF9fdmVjLCB1bnNpZ25lZCBpbnQgKl9fcHRyLAorICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgX19sZW4pIHsKKyAgX19idWlsdGluX3MzOTBfdnN0bCgodmVjdG9yIHNpZ25lZCBjaGFyKV9fdmVjLCBfX2xlbiwgX19wdHIpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2b2lkCit2ZWNfc3RvcmVfbGVuKHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fdmVjLCBzaWduZWQgbG9uZyBsb25nICpfX3B0ciwKKyAgICAgICAgICAgICAgdW5zaWduZWQgaW50IF9fbGVuKSB7CisgIF9fYnVpbHRpbl9zMzkwX3ZzdGwoKHZlY3RvciBzaWduZWQgY2hhcilfX3ZlYywgX19sZW4sIF9fcHRyKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdm9pZAordmVjX3N0b3JlX2xlbih2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fdmVjLCB1bnNpZ25lZCBsb25nIGxvbmcgKl9fcHRyLAorICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgX19sZW4pIHsKKyAgX19idWlsdGluX3MzOTBfdnN0bCgodmVjdG9yIHNpZ25lZCBjaGFyKV9fdmVjLCBfX2xlbiwgX19wdHIpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2b2lkCit2ZWNfc3RvcmVfbGVuKHZlY3RvciBkb3VibGUgX192ZWMsIGRvdWJsZSAqX19wdHIsCisgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBfX2xlbikgeworICBfX2J1aWx0aW5fczM5MF92c3RsKCh2ZWN0b3Igc2lnbmVkIGNoYXIpX192ZWMsIF9fbGVuLCBfX3B0cik7Cit9CisKKy8qLS0gdmVjX2xvYWRfcGFpciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcKK3ZlY19sb2FkX3BhaXIoc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpKF9fYSwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZwordmVjX2xvYWRfcGFpcih1bnNpZ25lZCBsb25nIGxvbmcgX19hLCB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZykoX19hLCBfX2IpOworfQorCisvKi0tIHZlY19nZW5tYXNrIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBjaGFyCit2ZWNfZ2VubWFzayh1bnNpZ25lZCBzaG9ydCBfX21hc2spCisgIF9fY29uc3RhbnQoX19tYXNrKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKAorICAgIF9fbWFzayAmIDB4ODAwMCA/IDB4ZmYgOiAwLAorICAgIF9fbWFzayAmIDB4NDAwMCA/IDB4ZmYgOiAwLAorICAgIF9fbWFzayAmIDB4MjAwMCA/IDB4ZmYgOiAwLAorICAgIF9fbWFzayAmIDB4MTAwMCA/IDB4ZmYgOiAwLAorICAgIF9fbWFzayAmIDB4MDgwMCA/IDB4ZmYgOiAwLAorICAgIF9fbWFzayAmIDB4MDQwMCA/IDB4ZmYgOiAwLAorICAgIF9fbWFzayAmIDB4MDIwMCA/IDB4ZmYgOiAwLAorICAgIF9fbWFzayAmIDB4MDEwMCA/IDB4ZmYgOiAwLAorICAgIF9fbWFzayAmIDB4MDA4MCA/IDB4ZmYgOiAwLAorICAgIF9fbWFzayAmIDB4MDA0MCA/IDB4ZmYgOiAwLAorICAgIF9fbWFzayAmIDB4MDAyMCA/IDB4ZmYgOiAwLAorICAgIF9fbWFzayAmIDB4MDAxMCA/IDB4ZmYgOiAwLAorICAgIF9fbWFzayAmIDB4MDAwOCA/IDB4ZmYgOiAwLAorICAgIF9fbWFzayAmIDB4MDAwNCA/IDB4ZmYgOiAwLAorICAgIF9fbWFzayAmIDB4MDAwMiA/IDB4ZmYgOiAwLAorICAgIF9fbWFzayAmIDB4MDAwMSA/IDB4ZmYgOiAwKTsKK30KKworLyotLSB2ZWNfZ2VubWFza3NfKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgY2hhcgordmVjX2dlbm1hc2tzXzgodW5zaWduZWQgY2hhciBfX2ZpcnN0LCB1bnNpZ25lZCBjaGFyIF9fbGFzdCkKKyAgX19jb25zdGFudChfX2ZpcnN0KSBfX2NvbnN0YW50KF9fbGFzdCkgeworICB1bnNpZ25lZCBjaGFyIF9fYml0MSA9IF9fZmlyc3QgJiA3OworICB1bnNpZ25lZCBjaGFyIF9fYml0MiA9IF9fbGFzdCAmIDc7CisgIHVuc2lnbmVkIGNoYXIgX19tYXNrMSA9ICh1bnNpZ25lZCBjaGFyKSgxVSA8PCAoNyAtIF9fYml0MSkgPDwgMSkgLSAxOworICB1bnNpZ25lZCBjaGFyIF9fbWFzazIgPSAodW5zaWduZWQgY2hhcikoMVUgPDwgKDcgLSBfX2JpdDIpKSAtIDE7CisgIHVuc2lnbmVkIGNoYXIgX192YWx1ZSA9IChfX2JpdDEgPD0gX19iaXQyID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbWFzazEgJiB+X19tYXNrMiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX21hc2sxIHwgfl9fbWFzazIpOworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fdmFsdWU7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBzaG9ydAordmVjX2dlbm1hc2tzXzE2KHVuc2lnbmVkIGNoYXIgX19maXJzdCwgdW5zaWduZWQgY2hhciBfX2xhc3QpCisgIF9fY29uc3RhbnQoX19maXJzdCkgX19jb25zdGFudChfX2xhc3QpIHsKKyAgdW5zaWduZWQgY2hhciBfX2JpdDEgPSBfX2ZpcnN0ICYgMTU7CisgIHVuc2lnbmVkIGNoYXIgX19iaXQyID0gX19sYXN0ICYgMTU7CisgIHVuc2lnbmVkIHNob3J0IF9fbWFzazEgPSAodW5zaWduZWQgc2hvcnQpKDFVIDw8ICgxNSAtIF9fYml0MSkgPDwgMSkgLSAxOworICB1bnNpZ25lZCBzaG9ydCBfX21hc2syID0gKHVuc2lnbmVkIHNob3J0KSgxVSA8PCAoMTUgLSBfX2JpdDIpKSAtIDE7CisgIHVuc2lnbmVkIHNob3J0IF9fdmFsdWUgPSAoX19iaXQxIDw9IF9fYml0MiA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tYXNrMSAmIH5fX21hc2syIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX21hc2sxIHwgfl9fbWFzazIpOworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX3ZhbHVlOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgaW50Cit2ZWNfZ2VubWFza3NfMzIodW5zaWduZWQgY2hhciBfX2ZpcnN0LCB1bnNpZ25lZCBjaGFyIF9fbGFzdCkKKyAgX19jb25zdGFudChfX2ZpcnN0KSBfX2NvbnN0YW50KF9fbGFzdCkgeworICB1bnNpZ25lZCBjaGFyIF9fYml0MSA9IF9fZmlyc3QgJiAzMTsKKyAgdW5zaWduZWQgY2hhciBfX2JpdDIgPSBfX2xhc3QgJiAzMTsKKyAgdW5zaWduZWQgaW50IF9fbWFzazEgPSAoMVUgPDwgKDMxIC0gX19iaXQxKSA8PCAxKSAtIDE7CisgIHVuc2lnbmVkIGludCBfX21hc2syID0gKDFVIDw8ICgzMSAtIF9fYml0MikpIC0gMTsKKyAgdW5zaWduZWQgaW50IF9fdmFsdWUgPSAoX19iaXQxIDw9IF9fYml0MiA/CisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbWFzazEgJiB+X19tYXNrMiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbWFzazEgfCB+X19tYXNrMik7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGludClfX3ZhbHVlOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nCit2ZWNfZ2VubWFza3NfNjQodW5zaWduZWQgY2hhciBfX2ZpcnN0LCB1bnNpZ25lZCBjaGFyIF9fbGFzdCkKKyAgX19jb25zdGFudChfX2ZpcnN0KSBfX2NvbnN0YW50KF9fbGFzdCkgeworICB1bnNpZ25lZCBjaGFyIF9fYml0MSA9IF9fZmlyc3QgJiA2MzsKKyAgdW5zaWduZWQgY2hhciBfX2JpdDIgPSBfX2xhc3QgJiA2MzsKKyAgdW5zaWduZWQgbG9uZyBsb25nIF9fbWFzazEgPSAoMVVMTCA8PCAoNjMgLSBfX2JpdDEpIDw8IDEpIC0gMTsKKyAgdW5zaWduZWQgbG9uZyBsb25nIF9fbWFzazIgPSAoMVVMTCA8PCAoNjMgLSBfX2JpdDIpKSAtIDE7CisgIHVuc2lnbmVkIGxvbmcgbG9uZyBfX3ZhbHVlID0gKF9fYml0MSA8PSBfX2JpdDIgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX21hc2sxICYgfl9fbWFzazIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX21hc2sxIHwgfl9fbWFzazIpOworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX192YWx1ZTsKK30KKworLyotLSB2ZWNfc3BsYXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGNoYXIKK3ZlY19zcGxhdCh2ZWN0b3Igc2lnbmVkIGNoYXIgX192ZWMsIGludCBfX2luZGV4KQorICBfX2NvbnN0YW50X3JhbmdlKF9faW5kZXgsIDAsIDE1KSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBjaGFyKV9fdmVjW19faW5kZXhdOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBjaGFyCit2ZWNfc3BsYXQodmVjdG9yIGJvb2wgY2hhciBfX3ZlYywgaW50IF9faW5kZXgpCisgIF9fY29uc3RhbnRfcmFuZ2UoX19pbmRleCwgMCwgMTUpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBjaGFyKSh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX3ZlY1tfX2luZGV4XTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGNoYXIKK3ZlY19zcGxhdCh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX3ZlYywgaW50IF9faW5kZXgpCisgIF9fY29uc3RhbnRfcmFuZ2UoX19pbmRleCwgMCwgMTUpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX3ZlY1tfX2luZGV4XTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBzaG9ydAordmVjX3NwbGF0KHZlY3RvciBzaWduZWQgc2hvcnQgX192ZWMsIGludCBfX2luZGV4KQorICBfX2NvbnN0YW50X3JhbmdlKF9faW5kZXgsIDAsIDcpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIHNob3J0KV9fdmVjW19faW5kZXhdOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBzaG9ydAordmVjX3NwbGF0KHZlY3RvciBib29sIHNob3J0IF9fdmVjLCBpbnQgX19pbmRleCkKKyAgX19jb25zdGFudF9yYW5nZShfX2luZGV4LCAwLCA3KSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgc2hvcnQpKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX3ZlY1tfX2luZGV4XTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIHNob3J0Cit2ZWNfc3BsYXQodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fdmVjLCBpbnQgX19pbmRleCkKKyAgX19jb25zdGFudF9yYW5nZShfX2luZGV4LCAwLCA3KSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fdmVjW19faW5kZXhdOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGludAordmVjX3NwbGF0KHZlY3RvciBzaWduZWQgaW50IF9fdmVjLCBpbnQgX19pbmRleCkKKyAgX19jb25zdGFudF9yYW5nZShfX2luZGV4LCAwLCAzKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBpbnQpX192ZWNbX19pbmRleF07Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIGludAordmVjX3NwbGF0KHZlY3RvciBib29sIGludCBfX3ZlYywgaW50IF9faW5kZXgpCisgIF9fY29uc3RhbnRfcmFuZ2UoX19pbmRleCwgMCwgMykgeworICByZXR1cm4gKHZlY3RvciBib29sIGludCkodmVjdG9yIHVuc2lnbmVkIGludClfX3ZlY1tfX2luZGV4XTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGludAordmVjX3NwbGF0KHZlY3RvciB1bnNpZ25lZCBpbnQgX192ZWMsIGludCBfX2luZGV4KQorICBfX2NvbnN0YW50X3JhbmdlKF9faW5kZXgsIDAsIDMpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fdmVjW19faW5kZXhdOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZwordmVjX3NwbGF0KHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fdmVjLCBpbnQgX19pbmRleCkKKyAgX19jb25zdGFudF9yYW5nZShfX2luZGV4LCAwLCAxKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpX192ZWNbX19pbmRleF07Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIGxvbmcgbG9uZwordmVjX3NwbGF0KHZlY3RvciBib29sIGxvbmcgbG9uZyBfX3ZlYywgaW50IF9faW5kZXgpCisgIF9fY29uc3RhbnRfcmFuZ2UoX19pbmRleCwgMCwgMSkgeworICByZXR1cm4gKHZlY3RvciBib29sIGxvbmcgbG9uZykodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX3ZlY1tfX2luZGV4XTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZwordmVjX3NwbGF0KHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX192ZWMsIGludCBfX2luZGV4KQorICBfX2NvbnN0YW50X3JhbmdlKF9faW5kZXgsIDAsIDEpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fdmVjW19faW5kZXhdOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgZG91YmxlCit2ZWNfc3BsYXQodmVjdG9yIGRvdWJsZSBfX3ZlYywgaW50IF9faW5kZXgpCisgIF9fY29uc3RhbnRfcmFuZ2UoX19pbmRleCwgMCwgMSkgeworICByZXR1cm4gKHZlY3RvciBkb3VibGUpX192ZWNbX19pbmRleF07Cit9CisKKy8qLS0gdmVjX3NwbGF0X3MqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX2FpIHZlY3RvciBzaWduZWQgY2hhcgordmVjX3NwbGF0X3M4KHNpZ25lZCBjaGFyIF9fc2NhbGFyKQorICBfX2NvbnN0YW50KF9fc2NhbGFyKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBjaGFyKV9fc2NhbGFyOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfYWkgdmVjdG9yIHNpZ25lZCBzaG9ydAordmVjX3NwbGF0X3MxNihzaWduZWQgc2hvcnQgX19zY2FsYXIpCisgIF9fY29uc3RhbnQoX19zY2FsYXIpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIHNob3J0KV9fc2NhbGFyOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfYWkgdmVjdG9yIHNpZ25lZCBpbnQKK3ZlY19zcGxhdF9zMzIoc2lnbmVkIHNob3J0IF9fc2NhbGFyKQorICBfX2NvbnN0YW50KF9fc2NhbGFyKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBpbnQpKHNpZ25lZCBpbnQpX19zY2FsYXI7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19haSB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZwordmVjX3NwbGF0X3M2NChzaWduZWQgc2hvcnQgX19zY2FsYXIpCisgIF9fY29uc3RhbnQoX19zY2FsYXIpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZykoc2lnbmVkIGxvbmcpX19zY2FsYXI7Cit9CisKKy8qLS0gdmVjX3NwbGF0X3UqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX2FpIHZlY3RvciB1bnNpZ25lZCBjaGFyCit2ZWNfc3BsYXRfdTgodW5zaWduZWQgY2hhciBfX3NjYWxhcikKKyAgX19jb25zdGFudChfX3NjYWxhcikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fc2NhbGFyOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfYWkgdmVjdG9yIHVuc2lnbmVkIHNob3J0Cit2ZWNfc3BsYXRfdTE2KHVuc2lnbmVkIHNob3J0IF9fc2NhbGFyKQorICBfX2NvbnN0YW50KF9fc2NhbGFyKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fc2NhbGFyOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfYWkgdmVjdG9yIHVuc2lnbmVkIGludAordmVjX3NwbGF0X3UzMihzaWduZWQgc2hvcnQgX19zY2FsYXIpCisgIF9fY29uc3RhbnQoX19zY2FsYXIpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgaW50KShzaWduZWQgaW50KV9fc2NhbGFyOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfYWkgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZwordmVjX3NwbGF0X3U2NChzaWduZWQgc2hvcnQgX19zY2FsYXIpCisgIF9fY29uc3RhbnQoX19zY2FsYXIpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKShzaWduZWQgbG9uZyBsb25nKV9fc2NhbGFyOworfQorCisvKi0tIHZlY19zcGxhdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgY2hhcgordmVjX3NwbGF0cyhzaWduZWQgY2hhciBfX3NjYWxhcikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgY2hhcilfX3NjYWxhcjsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGNoYXIKK3ZlY19zcGxhdHModW5zaWduZWQgY2hhciBfX3NjYWxhcikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fc2NhbGFyOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIHNob3J0Cit2ZWNfc3BsYXRzKHNpZ25lZCBzaG9ydCBfX3NjYWxhcikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgc2hvcnQpX19zY2FsYXI7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBzaG9ydAordmVjX3NwbGF0cyh1bnNpZ25lZCBzaG9ydCBfX3NjYWxhcikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX3NjYWxhcjsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBpbnQKK3ZlY19zcGxhdHMoc2lnbmVkIGludCBfX3NjYWxhcikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgaW50KV9fc2NhbGFyOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgaW50Cit2ZWNfc3BsYXRzKHVuc2lnbmVkIGludCBfX3NjYWxhcikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBpbnQpX19zY2FsYXI7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgbG9uZyBsb25nCit2ZWNfc3BsYXRzKHNpZ25lZCBsb25nIGxvbmcgX19zY2FsYXIpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZylfX3NjYWxhcjsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZwordmVjX3NwbGF0cyh1bnNpZ25lZCBsb25nIGxvbmcgX19zY2FsYXIpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fc2NhbGFyOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgZG91YmxlCit2ZWNfc3BsYXRzKGRvdWJsZSBfX3NjYWxhcikgeworICByZXR1cm4gKHZlY3RvciBkb3VibGUpX19zY2FsYXI7Cit9CisKKy8qLS0gdmVjX2V4dGVuZF9zNjQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcKK3ZlY19leHRlbmRfczY0KHZlY3RvciBzaWduZWQgY2hhciBfX2EpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZykoX19hWzddLCBfX2FbMTVdKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcKK3ZlY19leHRlbmRfczY0KHZlY3RvciBzaWduZWQgc2hvcnQgX19hKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpKF9fYVszXSwgX19hWzddKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcKK3ZlY19leHRlbmRfczY0KHZlY3RvciBzaWduZWQgaW50IF9fYSkgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKShfX2FbMV0sIF9fYVszXSk7Cit9CisKKy8qLS0gdmVjX21lcmdlaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBjaGFyCit2ZWNfbWVyZ2VoKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGNoYXIpKAorICAgIF9fYVswXSwgX19iWzBdLCBfX2FbMV0sIF9fYlsxXSwgX19hWzJdLCBfX2JbMl0sIF9fYVszXSwgX19iWzNdLAorICAgIF9fYVs0XSwgX19iWzRdLCBfX2FbNV0sIF9fYls1XSwgX19hWzZdLCBfX2JbNl0sIF9fYVs3XSwgX19iWzddKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgY2hhcgordmVjX21lcmdlaCh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBjaGFyKSgKKyAgICBfX2FbMF0sIF9fYlswXSwgX19hWzFdLCBfX2JbMV0sIF9fYVsyXSwgX19iWzJdLCBfX2FbM10sIF9fYlszXSwKKyAgICBfX2FbNF0sIF9fYls0XSwgX19hWzVdLCBfX2JbNV0sIF9fYVs2XSwgX19iWzZdLCBfX2FbN10sIF9fYls3XSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBjaGFyCit2ZWNfbWVyZ2VoKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKAorICAgIF9fYVswXSwgX19iWzBdLCBfX2FbMV0sIF9fYlsxXSwgX19hWzJdLCBfX2JbMl0sIF9fYVszXSwgX19iWzNdLAorICAgIF9fYVs0XSwgX19iWzRdLCBfX2FbNV0sIF9fYls1XSwgX19hWzZdLCBfX2JbNl0sIF9fYVs3XSwgX19iWzddKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBzaG9ydAordmVjX21lcmdlaCh2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIHNob3J0KSgKKyAgICBfX2FbMF0sIF9fYlswXSwgX19hWzFdLCBfX2JbMV0sIF9fYVsyXSwgX19iWzJdLCBfX2FbM10sIF9fYlszXSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIHNob3J0Cit2ZWNfbWVyZ2VoKHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgc2hvcnQpKAorICAgIF9fYVswXSwgX19iWzBdLCBfX2FbMV0sIF9fYlsxXSwgX19hWzJdLCBfX2JbMl0sIF9fYVszXSwgX19iWzNdKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIHNob3J0Cit2ZWNfbWVyZ2VoKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpKAorICAgIF9fYVswXSwgX19iWzBdLCBfX2FbMV0sIF9fYlsxXSwgX19hWzJdLCBfX2JbMl0sIF9fYVszXSwgX19iWzNdKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBpbnQKK3ZlY19tZXJnZWgodmVjdG9yIHNpZ25lZCBpbnQgX19hLCB2ZWN0b3Igc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGludCkoX19hWzBdLCBfX2JbMF0sIF9fYVsxXSwgX19iWzFdKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgaW50Cit2ZWNfbWVyZ2VoKHZlY3RvciBib29sIGludCBfX2EsIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBpbnQpKF9fYVswXSwgX19iWzBdLCBfX2FbMV0sIF9fYlsxXSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBpbnQKK3ZlY19tZXJnZWgodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGludCkoX19hWzBdLCBfX2JbMF0sIF9fYVsxXSwgX19iWzFdKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcKK3ZlY19tZXJnZWgodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZykoX19hWzBdLCBfX2JbMF0pOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBsb25nIGxvbmcKK3ZlY19tZXJnZWgodmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIGxvbmcgbG9uZykoX19hWzBdLCBfX2JbMF0pOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nCit2ZWNfbWVyZ2VoKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpKF9fYVswXSwgX19iWzBdKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGRvdWJsZQordmVjX21lcmdlaCh2ZWN0b3IgZG91YmxlIF9fYSwgdmVjdG9yIGRvdWJsZSBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgZG91YmxlKShfX2FbMF0sIF9fYlswXSk7Cit9CisKKy8qLS0gdmVjX21lcmdlbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBjaGFyCit2ZWNfbWVyZ2VsKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGNoYXIpKAorICAgIF9fYVs4XSwgX19iWzhdLCBfX2FbOV0sIF9fYls5XSwgX19hWzEwXSwgX19iWzEwXSwgX19hWzExXSwgX19iWzExXSwKKyAgICBfX2FbMTJdLCBfX2JbMTJdLCBfX2FbMTNdLCBfX2JbMTNdLCBfX2FbMTRdLCBfX2JbMTRdLCBfX2FbMTVdLCBfX2JbMTVdKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgY2hhcgordmVjX21lcmdlbCh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBjaGFyKSgKKyAgICBfX2FbOF0sIF9fYls4XSwgX19hWzldLCBfX2JbOV0sIF9fYVsxMF0sIF9fYlsxMF0sIF9fYVsxMV0sIF9fYlsxMV0sCisgICAgX19hWzEyXSwgX19iWzEyXSwgX19hWzEzXSwgX19iWzEzXSwgX19hWzE0XSwgX19iWzE0XSwgX19hWzE1XSwgX19iWzE1XSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBjaGFyCit2ZWNfbWVyZ2VsKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKAorICAgIF9fYVs4XSwgX19iWzhdLCBfX2FbOV0sIF9fYls5XSwgX19hWzEwXSwgX19iWzEwXSwgX19hWzExXSwgX19iWzExXSwKKyAgICBfX2FbMTJdLCBfX2JbMTJdLCBfX2FbMTNdLCBfX2JbMTNdLCBfX2FbMTRdLCBfX2JbMTRdLCBfX2FbMTVdLCBfX2JbMTVdKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBzaG9ydAordmVjX21lcmdlbCh2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIHNob3J0KSgKKyAgICBfX2FbNF0sIF9fYls0XSwgX19hWzVdLCBfX2JbNV0sIF9fYVs2XSwgX19iWzZdLCBfX2FbN10sIF9fYls3XSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIHNob3J0Cit2ZWNfbWVyZ2VsKHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgc2hvcnQpKAorICAgIF9fYVs0XSwgX19iWzRdLCBfX2FbNV0sIF9fYls1XSwgX19hWzZdLCBfX2JbNl0sIF9fYVs3XSwgX19iWzddKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIHNob3J0Cit2ZWNfbWVyZ2VsKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpKAorICAgIF9fYVs0XSwgX19iWzRdLCBfX2FbNV0sIF9fYls1XSwgX19hWzZdLCBfX2JbNl0sIF9fYVs3XSwgX19iWzddKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBpbnQKK3ZlY19tZXJnZWwodmVjdG9yIHNpZ25lZCBpbnQgX19hLCB2ZWN0b3Igc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGludCkoX19hWzJdLCBfX2JbMl0sIF9fYVszXSwgX19iWzNdKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgaW50Cit2ZWNfbWVyZ2VsKHZlY3RvciBib29sIGludCBfX2EsIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBpbnQpKF9fYVsyXSwgX19iWzJdLCBfX2FbM10sIF9fYlszXSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBpbnQKK3ZlY19tZXJnZWwodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGludCkoX19hWzJdLCBfX2JbMl0sIF9fYVszXSwgX19iWzNdKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcKK3ZlY19tZXJnZWwodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZykoX19hWzFdLCBfX2JbMV0pOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBsb25nIGxvbmcKK3ZlY19tZXJnZWwodmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIGxvbmcgbG9uZykoX19hWzFdLCBfX2JbMV0pOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nCit2ZWNfbWVyZ2VsKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpKF9fYVsxXSwgX19iWzFdKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGRvdWJsZQordmVjX21lcmdlbCh2ZWN0b3IgZG91YmxlIF9fYSwgdmVjdG9yIGRvdWJsZSBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgZG91YmxlKShfX2FbMV0sIF9fYlsxXSk7Cit9CisKKy8qLS0gdmVjX3BhY2sgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBjaGFyCit2ZWNfcGFjayh2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYWMgPSAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYTsKKyAgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYmMgPSAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYjsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGNoYXIpKAorICAgIF9fYWNbMV0sIF9fYWNbM10sIF9fYWNbNV0sIF9fYWNbN10sIF9fYWNbOV0sIF9fYWNbMTFdLCBfX2FjWzEzXSwgX19hY1sxNV0sCisgICAgX19iY1sxXSwgX19iY1szXSwgX19iY1s1XSwgX19iY1s3XSwgX19iY1s5XSwgX19iY1sxMV0sIF9fYmNbMTNdLCBfX2JjWzE1XSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIGNoYXIKK3ZlY19wYWNrKHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIHZlY3RvciBib29sIGNoYXIgX19hYyA9ICh2ZWN0b3IgYm9vbCBjaGFyKV9fYTsKKyAgdmVjdG9yIGJvb2wgY2hhciBfX2JjID0gKHZlY3RvciBib29sIGNoYXIpX19iOworICByZXR1cm4gKHZlY3RvciBib29sIGNoYXIpKAorICAgIF9fYWNbMV0sIF9fYWNbM10sIF9fYWNbNV0sIF9fYWNbN10sIF9fYWNbOV0sIF9fYWNbMTFdLCBfX2FjWzEzXSwgX19hY1sxNV0sCisgICAgX19iY1sxXSwgX19iY1szXSwgX19iY1s1XSwgX19iY1s3XSwgX19iY1s5XSwgX19iY1sxMV0sIF9fYmNbMTNdLCBfX2JjWzE1XSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBjaGFyCit2ZWNfcGFjayh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYWMgPSAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hOworICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2JjID0gKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYjsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoCisgICAgX19hY1sxXSwgX19hY1szXSwgX19hY1s1XSwgX19hY1s3XSwgX19hY1s5XSwgX19hY1sxMV0sIF9fYWNbMTNdLCBfX2FjWzE1XSwKKyAgICBfX2JjWzFdLCBfX2JjWzNdLCBfX2JjWzVdLCBfX2JjWzddLCBfX2JjWzldLCBfX2JjWzExXSwgX19iY1sxM10sIF9fYmNbMTVdKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBzaG9ydAordmVjX3BhY2sodmVjdG9yIHNpZ25lZCBpbnQgX19hLCB2ZWN0b3Igc2lnbmVkIGludCBfX2IpIHsKKyAgdmVjdG9yIHNpZ25lZCBzaG9ydCBfX2FjID0gKHZlY3RvciBzaWduZWQgc2hvcnQpX19hOworICB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYmMgPSAodmVjdG9yIHNpZ25lZCBzaG9ydClfX2I7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBzaG9ydCkoCisgICAgX19hY1sxXSwgX19hY1szXSwgX19hY1s1XSwgX19hY1s3XSwKKyAgICBfX2JjWzFdLCBfX2JjWzNdLCBfX2JjWzVdLCBfX2JjWzddKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgc2hvcnQKK3ZlY19wYWNrKHZlY3RvciBib29sIGludCBfX2EsIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgdmVjdG9yIGJvb2wgc2hvcnQgX19hYyA9ICh2ZWN0b3IgYm9vbCBzaG9ydClfX2E7CisgIHZlY3RvciBib29sIHNob3J0IF9fYmMgPSAodmVjdG9yIGJvb2wgc2hvcnQpX19iOworICByZXR1cm4gKHZlY3RvciBib29sIHNob3J0KSgKKyAgICBfX2FjWzFdLCBfX2FjWzNdLCBfX2FjWzVdLCBfX2FjWzddLAorICAgIF9fYmNbMV0sIF9fYmNbM10sIF9fYmNbNV0sIF9fYmNbN10pOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgc2hvcnQKK3ZlY19wYWNrKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hYyA9ICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19hOworICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iYyA9ICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19iOworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBzaG9ydCkoCisgICAgX19hY1sxXSwgX19hY1szXSwgX19hY1s1XSwgX19hY1s3XSwKKyAgICBfX2JjWzFdLCBfX2JjWzNdLCBfX2JjWzVdLCBfX2JjWzddKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBpbnQKK3ZlY19wYWNrKHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHZlY3RvciBzaWduZWQgaW50IF9fYWMgPSAodmVjdG9yIHNpZ25lZCBpbnQpX19hOworICB2ZWN0b3Igc2lnbmVkIGludCBfX2JjID0gKHZlY3RvciBzaWduZWQgaW50KV9fYjsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGludCkoX19hY1sxXSwgX19hY1szXSwgX19iY1sxXSwgX19iY1szXSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIGludAordmVjX3BhY2sodmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICB2ZWN0b3IgYm9vbCBpbnQgX19hYyA9ICh2ZWN0b3IgYm9vbCBpbnQpX19hOworICB2ZWN0b3IgYm9vbCBpbnQgX19iYyA9ICh2ZWN0b3IgYm9vbCBpbnQpX19iOworICByZXR1cm4gKHZlY3RvciBib29sIGludCkoX19hY1sxXSwgX19hY1szXSwgX19iY1sxXSwgX19iY1szXSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBpbnQKK3ZlY19wYWNrKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYikgeworICB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYWMgPSAodmVjdG9yIHVuc2lnbmVkIGludClfX2E7CisgIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iYyA9ICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYjsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgaW50KShfX2FjWzFdLCBfX2FjWzNdLCBfX2JjWzFdLCBfX2JjWzNdKTsKK30KKworLyotLSB2ZWNfcGFja3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGNoYXIKK3ZlY19wYWNrcyh2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3Zwa3NoKF9fYSwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGNoYXIKK3ZlY19wYWNrcyh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92cGtsc2goX19hLCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIHNob3J0Cit2ZWNfcGFja3ModmVjdG9yIHNpZ25lZCBpbnQgX19hLCB2ZWN0b3Igc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3Zwa3NmKF9fYSwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIHNob3J0Cit2ZWNfcGFja3ModmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92cGtsc2YoX19hLCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGludAordmVjX3BhY2tzKHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92cGtzZyhfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBpbnQKK3ZlY19wYWNrcyh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3Zwa2xzZyhfX2EsIF9fYik7Cit9CisKKy8qLS0gdmVjX3BhY2tzX2NjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBjaGFyCit2ZWNfcGFja3NfY2ModmVjdG9yIHNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBzaWduZWQgc2hvcnQgX19iLCBpbnQgKl9fY2MpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3Zwa3NocyhfX2EsIF9fYiwgX19jYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBjaGFyCit2ZWNfcGFja3NfY2ModmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYiwgaW50ICpfX2NjKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92cGtsc2hzKF9fYSwgX19iLCBfX2NjKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBzaG9ydAordmVjX3BhY2tzX2NjKHZlY3RvciBzaWduZWQgaW50IF9fYSwgdmVjdG9yIHNpZ25lZCBpbnQgX19iLCBpbnQgKl9fY2MpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3Zwa3NmcyhfX2EsIF9fYiwgX19jYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBzaG9ydAordmVjX3BhY2tzX2NjKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYiwgaW50ICpfX2NjKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92cGtsc2ZzKF9fYSwgX19iLCBfX2NjKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBpbnQKK3ZlY19wYWNrc19jYyh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYiwKKyAgICAgICAgICAgICBpbnQgKl9fY2MpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3Zwa3NncyhfX2EsIF9fYiwgX19jYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBpbnQKK3ZlY19wYWNrc19jYyh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IsCisgICAgICAgICAgICAgaW50ICpfX2NjKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92cGtsc2dzKF9fYSwgX19iLCBfX2NjKTsKK30KKworLyotLSB2ZWNfcGFja3N1IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgY2hhcgordmVjX3BhY2tzdSh2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgY29uc3QgdmVjdG9yIHNpZ25lZCBzaG9ydCBfX3plcm8gPSAodmVjdG9yIHNpZ25lZCBzaG9ydCkwOworICByZXR1cm4gX19idWlsdGluX3MzOTBfdnBrbHNoKAorICAgICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpKF9fYSA+PSBfX3plcm8pICYgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2EsCisgICAgKHZlY3RvciB1bnNpZ25lZCBzaG9ydCkoX19iID49IF9femVybykgJiAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBjaGFyCit2ZWNfcGFja3N1KHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3Zwa2xzaChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBzaG9ydAordmVjX3BhY2tzdSh2ZWN0b3Igc2lnbmVkIGludCBfX2EsIHZlY3RvciBzaWduZWQgaW50IF9fYikgeworICBjb25zdCB2ZWN0b3Igc2lnbmVkIGludCBfX3plcm8gPSAodmVjdG9yIHNpZ25lZCBpbnQpMDsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3Zwa2xzZigKKyAgICAodmVjdG9yIHVuc2lnbmVkIGludCkoX19hID49IF9femVybykgJiAodmVjdG9yIHVuc2lnbmVkIGludClfX2EsCisgICAgKHZlY3RvciB1bnNpZ25lZCBpbnQpKF9fYiA+PSBfX3plcm8pICYgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIHNob3J0Cit2ZWNfcGFja3N1KHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdnBrbHNmKF9fYSwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGludAordmVjX3BhY2tzdSh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYikgeworICBjb25zdCB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX3plcm8gPSAodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpMDsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3Zwa2xzZygKKyAgICAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZykoX19hID49IF9femVybykgJgorICAgICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYSwKKyAgICAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZykoX19iID49IF9femVybykgJgorICAgICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBpbnQKK3ZlY19wYWNrc3UodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92cGtsc2coX19hLCBfX2IpOworfQorCisvKi0tIHZlY19wYWNrc3VfY2MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBjaGFyCit2ZWNfcGFja3N1X2NjKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IsIGludCAqX19jYykgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdnBrbHNocyhfX2EsIF9fYiwgX19jYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBzaG9ydAordmVjX3BhY2tzdV9jYyh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IsIGludCAqX19jYykgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdnBrbHNmcyhfX2EsIF9fYiwgX19jYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBpbnQKK3ZlY19wYWNrc3VfY2ModmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iLAorICAgICAgICAgICAgICBpbnQgKl9fY2MpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3Zwa2xzZ3MoX19hLCBfX2IsIF9fY2MpOworfQorCisvKi0tIHZlY191bnBhY2toIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgc2hvcnQKK3ZlY191bnBhY2toKHZlY3RvciBzaWduZWQgY2hhciBfX2EpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3Z1cGhiKF9fYSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIHNob3J0Cit2ZWNfdW5wYWNraCh2ZWN0b3IgYm9vbCBjaGFyIF9fYSkgeworICByZXR1cm4gKHZlY3RvciBib29sIHNob3J0KV9fYnVpbHRpbl9zMzkwX3Z1cGhiKCh2ZWN0b3Igc2lnbmVkIGNoYXIpX19hKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIHNob3J0Cit2ZWNfdW5wYWNraCh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3Z1cGxoYihfX2EpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGludAordmVjX3VucGFja2godmVjdG9yIHNpZ25lZCBzaG9ydCBfX2EpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3Z1cGhoKF9fYSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIGludAordmVjX3VucGFja2godmVjdG9yIGJvb2wgc2hvcnQgX19hKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgaW50KV9fYnVpbHRpbl9zMzkwX3Z1cGhoKCh2ZWN0b3Igc2lnbmVkIHNob3J0KV9fYSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBpbnQKK3ZlY191bnBhY2toKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3Z1cGxoaChfX2EpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZwordmVjX3VucGFja2godmVjdG9yIHNpZ25lZCBpbnQgX19hKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92dXBoZihfX2EpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBsb25nIGxvbmcKK3ZlY191bnBhY2toKHZlY3RvciBib29sIGludCBfX2EpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBsb25nIGxvbmcpX19idWlsdGluX3MzOTBfdnVwaGYoKHZlY3RvciBzaWduZWQgaW50KV9fYSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcKK3ZlY191bnBhY2toKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92dXBsaGYoX19hKTsKK30KKworLyotLSB2ZWNfdW5wYWNrbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIHNob3J0Cit2ZWNfdW5wYWNrbCh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92dXBsYihfX2EpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBzaG9ydAordmVjX3VucGFja2wodmVjdG9yIGJvb2wgY2hhciBfX2EpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBzaG9ydClfX2J1aWx0aW5fczM5MF92dXBsYigodmVjdG9yIHNpZ25lZCBjaGFyKV9fYSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBzaG9ydAordmVjX3VucGFja2wodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92dXBsbGIoX19hKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBpbnQKK3ZlY191bnBhY2tsKHZlY3RvciBzaWduZWQgc2hvcnQgX19hKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92dXBsaHcoX19hKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgaW50Cit2ZWNfdW5wYWNrbCh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBpbnQpX19idWlsdGluX3MzOTBfdnVwbGh3KCh2ZWN0b3Igc2lnbmVkIHNob3J0KV9fYSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBpbnQKK3ZlY191bnBhY2tsKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3Z1cGxsaChfX2EpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZwordmVjX3VucGFja2wodmVjdG9yIHNpZ25lZCBpbnQgX19hKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92dXBsZihfX2EpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBsb25nIGxvbmcKK3ZlY191bnBhY2tsKHZlY3RvciBib29sIGludCBfX2EpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBsb25nIGxvbmcpX19idWlsdGluX3MzOTBfdnVwbGYoKHZlY3RvciBzaWduZWQgaW50KV9fYSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcKK3ZlY191bnBhY2tsKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92dXBsbGYoX19hKTsKK30KKworLyotLSB2ZWNfY21wZXEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBjaGFyCit2ZWNfY21wZXEodmVjdG9yIGJvb2wgY2hhciBfX2EsIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgY2hhcikoX19hID09IF9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIGNoYXIKK3ZlY19jbXBlcSh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgY2hhcikoX19hID09IF9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIGNoYXIKK3ZlY19jbXBlcSh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIGNoYXIpKF9fYSA9PSBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBzaG9ydAordmVjX2NtcGVxKHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgc2hvcnQpKF9fYSA9PSBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBzaG9ydAordmVjX2NtcGVxKHZlY3RvciBzaWduZWQgc2hvcnQgX19hLCB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIHNob3J0KShfX2EgPT0gX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgc2hvcnQKK3ZlY19jbXBlcSh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgc2hvcnQpKF9fYSA9PSBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBpbnQKK3ZlY19jbXBlcSh2ZWN0b3IgYm9vbCBpbnQgX19hLCB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgaW50KShfX2EgPT0gX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgaW50Cit2ZWNfY21wZXEodmVjdG9yIHNpZ25lZCBpbnQgX19hLCB2ZWN0b3Igc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBpbnQpKF9fYSA9PSBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBpbnQKK3ZlY19jbXBlcSh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBpbnQpKF9fYSA9PSBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBsb25nIGxvbmcKK3ZlY19jbXBlcSh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgbG9uZyBsb25nKShfX2EgPT0gX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgbG9uZyBsb25nCit2ZWNfY21wZXEodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBsb25nIGxvbmcpKF9fYSA9PSBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBsb25nIGxvbmcKK3ZlY19jbXBlcSh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBsb25nIGxvbmcpKF9fYSA9PSBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBsb25nIGxvbmcKK3ZlY19jbXBlcSh2ZWN0b3IgZG91YmxlIF9fYSwgdmVjdG9yIGRvdWJsZSBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBsb25nIGxvbmcpKF9fYSA9PSBfX2IpOworfQorCisvKi0tIHZlY19jbXBnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIGNoYXIKK3ZlY19jbXBnZSh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgY2hhcikoX19hID49IF9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIGNoYXIKK3ZlY19jbXBnZSh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIGNoYXIpKF9fYSA+PSBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBzaG9ydAordmVjX2NtcGdlKHZlY3RvciBzaWduZWQgc2hvcnQgX19hLCB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIHNob3J0KShfX2EgPj0gX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgc2hvcnQKK3ZlY19jbXBnZSh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgc2hvcnQpKF9fYSA+PSBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBpbnQKK3ZlY19jbXBnZSh2ZWN0b3Igc2lnbmVkIGludCBfX2EsIHZlY3RvciBzaWduZWQgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIGludCkoX19hID49IF9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIGludAordmVjX2NtcGdlKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIGludCkoX19hID49IF9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIGxvbmcgbG9uZwordmVjX2NtcGdlKHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgbG9uZyBsb25nKShfX2EgPj0gX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgbG9uZyBsb25nCit2ZWNfY21wZ2UodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgbG9uZyBsb25nKShfX2EgPj0gX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgbG9uZyBsb25nCit2ZWNfY21wZ2UodmVjdG9yIGRvdWJsZSBfX2EsIHZlY3RvciBkb3VibGUgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgbG9uZyBsb25nKShfX2EgPj0gX19iKTsKK30KKworLyotLSB2ZWNfY21wZ3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBjaGFyCit2ZWNfY21wZ3QodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIGNoYXIpKF9fYSA+IF9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIGNoYXIKK3ZlY19jbXBndCh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIGNoYXIpKF9fYSA+IF9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIHNob3J0Cit2ZWNfY21wZ3QodmVjdG9yIHNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBzaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgc2hvcnQpKF9fYSA+IF9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIHNob3J0Cit2ZWNfY21wZ3QodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIHNob3J0KShfX2EgPiBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBpbnQKK3ZlY19jbXBndCh2ZWN0b3Igc2lnbmVkIGludCBfX2EsIHZlY3RvciBzaWduZWQgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIGludCkoX19hID4gX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgaW50Cit2ZWNfY21wZ3QodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgaW50KShfX2EgPiBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBsb25nIGxvbmcKK3ZlY19jbXBndCh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIGxvbmcgbG9uZykoX19hID4gX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgbG9uZyBsb25nCit2ZWNfY21wZ3QodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgbG9uZyBsb25nKShfX2EgPiBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBsb25nIGxvbmcKK3ZlY19jbXBndCh2ZWN0b3IgZG91YmxlIF9fYSwgdmVjdG9yIGRvdWJsZSBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBsb25nIGxvbmcpKF9fYSA+IF9fYik7Cit9CisKKy8qLS0gdmVjX2NtcGxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgY2hhcgordmVjX2NtcGxlKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBjaGFyKShfX2EgPD0gX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgY2hhcgordmVjX2NtcGxlKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgY2hhcikoX19hIDw9IF9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIHNob3J0Cit2ZWNfY21wbGUodmVjdG9yIHNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBzaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgc2hvcnQpKF9fYSA8PSBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBzaG9ydAordmVjX2NtcGxlKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBzaG9ydCkoX19hIDw9IF9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIGludAordmVjX2NtcGxlKHZlY3RvciBzaWduZWQgaW50IF9fYSwgdmVjdG9yIHNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgaW50KShfX2EgPD0gX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgaW50Cit2ZWNfY21wbGUodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgaW50KShfX2EgPD0gX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgbG9uZyBsb25nCit2ZWNfY21wbGUodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBsb25nIGxvbmcpKF9fYSA8PSBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBsb25nIGxvbmcKK3ZlY19jbXBsZSh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBsb25nIGxvbmcpKF9fYSA8PSBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBsb25nIGxvbmcKK3ZlY19jbXBsZSh2ZWN0b3IgZG91YmxlIF9fYSwgdmVjdG9yIGRvdWJsZSBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBsb25nIGxvbmcpKF9fYSA8PSBfX2IpOworfQorCisvKi0tIHZlY19jbXBsdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIGNoYXIKK3ZlY19jbXBsdCh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgY2hhcikoX19hIDwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgY2hhcgordmVjX2NtcGx0KHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgY2hhcikoX19hIDwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgc2hvcnQKK3ZlY19jbXBsdCh2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBzaG9ydCkoX19hIDwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgc2hvcnQKK3ZlY19jbXBsdCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgc2hvcnQpKF9fYSA8IF9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIGludAordmVjX2NtcGx0KHZlY3RvciBzaWduZWQgaW50IF9fYSwgdmVjdG9yIHNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgaW50KShfX2EgPCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBpbnQKK3ZlY19jbXBsdCh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBpbnQpKF9fYSA8IF9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIGxvbmcgbG9uZwordmVjX2NtcGx0KHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgbG9uZyBsb25nKShfX2EgPCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBsb25nIGxvbmcKK3ZlY19jbXBsdCh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBsb25nIGxvbmcpKF9fYSA8IF9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIGxvbmcgbG9uZwordmVjX2NtcGx0KHZlY3RvciBkb3VibGUgX19hLCB2ZWN0b3IgZG91YmxlIF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIGxvbmcgbG9uZykoX19hIDwgX19iKTsKK30KKworLyotLSB2ZWNfYWxsX2VxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfZXEodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNlcWJzKF9fYSwgX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9lcSh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNlcWJzKF9fYSwgKHZlY3RvciBzaWduZWQgY2hhcilfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2VxKHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2VxYnMoKHZlY3RvciBzaWduZWQgY2hhcilfX2EsIF9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfZXEodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjZXFicygodmVjdG9yIHNpZ25lZCBjaGFyKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Igc2lnbmVkIGNoYXIpX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9lcSh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2VxYnMoKHZlY3RvciBzaWduZWQgY2hhcilfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfZXEodmVjdG9yIGJvb2wgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNlcWJzKCh2ZWN0b3Igc2lnbmVkIGNoYXIpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBzaWduZWQgY2hhcilfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2VxKHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNlcWJzKCh2ZWN0b3Igc2lnbmVkIGNoYXIpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBzaWduZWQgY2hhcilfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2VxKHZlY3RvciBzaWduZWQgc2hvcnQgX19hLCB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNlcWhzKF9fYSwgX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9lcSh2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2VxaHMoX19hLCAodmVjdG9yIHNpZ25lZCBzaG9ydClfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2VxKHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIHNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjZXFocygodmVjdG9yIHNpZ25lZCBzaG9ydClfX2EsIF9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfZXEodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNlcWhzKCh2ZWN0b3Igc2lnbmVkIHNob3J0KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Igc2lnbmVkIHNob3J0KV9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfZXEodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2VxaHMoKHZlY3RvciBzaWduZWQgc2hvcnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBzaWduZWQgc2hvcnQpX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9lcSh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjZXFocygodmVjdG9yIHNpZ25lZCBzaG9ydClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHNpZ25lZCBzaG9ydClfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2VxKHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2VxaHMoKHZlY3RvciBzaWduZWQgc2hvcnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBzaWduZWQgc2hvcnQpX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9lcSh2ZWN0b3Igc2lnbmVkIGludCBfX2EsIHZlY3RvciBzaWduZWQgaW50IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNlcWZzKF9fYSwgX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9lcSh2ZWN0b3Igc2lnbmVkIGludCBfX2EsIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjZXFmcyhfX2EsICh2ZWN0b3Igc2lnbmVkIGludClfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2VxKHZlY3RvciBib29sIGludCBfX2EsIHZlY3RvciBzaWduZWQgaW50IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNlcWZzKCh2ZWN0b3Igc2lnbmVkIGludClfX2EsIF9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfZXEodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2VxZnMoKHZlY3RvciBzaWduZWQgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Igc2lnbmVkIGludClfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2VxKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2VxZnMoKHZlY3RvciBzaWduZWQgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Igc2lnbmVkIGludClfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2VxKHZlY3RvciBib29sIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2VxZnMoKHZlY3RvciBzaWduZWQgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Igc2lnbmVkIGludClfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2VxKHZlY3RvciBib29sIGludCBfX2EsIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjZXFmcygodmVjdG9yIHNpZ25lZCBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBzaWduZWQgaW50KV9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfZXEodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjZXFncyhfX2EsIF9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfZXEodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2VxZ3MoX19hLCAodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9lcSh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLCB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjZXFncygodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpX19hLCBfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2VxKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNlcWdzKCh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZylfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9lcSh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNlcWdzKCh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZylfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9lcSh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNlcWdzKCh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZylfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9lcSh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2VxZ3MoKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZylfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2VxKHZlY3RvciBkb3VibGUgX19hLCB2ZWN0b3IgZG91YmxlIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmZjZWRicyhfX2EsIF9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAwOworfQorCisvKi0tIHZlY19hbGxfbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9uZSh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2VxYnMoX19hLCBfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX25lKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2VxYnMoX19hLCAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAzOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfbmUodmVjdG9yIGJvb2wgY2hhciBfX2EsIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjZXFicygodmVjdG9yIHNpZ25lZCBjaGFyKV9fYSwgX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDM7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9uZSh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNlcWJzKCh2ZWN0b3Igc2lnbmVkIGNoYXIpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBzaWduZWQgY2hhcilfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX25lKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjZXFicygodmVjdG9yIHNpZ25lZCBjaGFyKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Igc2lnbmVkIGNoYXIpX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDM7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9uZSh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2VxYnMoKHZlY3RvciBzaWduZWQgY2hhcilfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAzOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfbmUodmVjdG9yIGJvb2wgY2hhciBfX2EsIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2VxYnMoKHZlY3RvciBzaWduZWQgY2hhcilfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAzOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfbmUodmVjdG9yIHNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBzaWduZWQgc2hvcnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2VxaHMoX19hLCBfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX25lKHZlY3RvciBzaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjZXFocyhfX2EsICh2ZWN0b3Igc2lnbmVkIHNob3J0KV9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAzOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfbmUodmVjdG9yIGJvb2wgc2hvcnQgX19hLCB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNlcWhzKCh2ZWN0b3Igc2lnbmVkIHNob3J0KV9fYSwgX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDM7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9uZSh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2VxaHMoKHZlY3RvciBzaWduZWQgc2hvcnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBzaWduZWQgc2hvcnQpX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDM7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9uZSh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjZXFocygodmVjdG9yIHNpZ25lZCBzaG9ydClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHNpZ25lZCBzaG9ydClfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX25lKHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNlcWhzKCh2ZWN0b3Igc2lnbmVkIHNob3J0KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Igc2lnbmVkIHNob3J0KV9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAzOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfbmUodmVjdG9yIGJvb2wgc2hvcnQgX19hLCB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjZXFocygodmVjdG9yIHNpZ25lZCBzaG9ydClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHNpZ25lZCBzaG9ydClfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX25lKHZlY3RvciBzaWduZWQgaW50IF9fYSwgdmVjdG9yIHNpZ25lZCBpbnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2VxZnMoX19hLCBfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX25lKHZlY3RvciBzaWduZWQgaW50IF9fYSwgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNlcWZzKF9fYSwgKHZlY3RvciBzaWduZWQgaW50KV9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAzOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfbmUodmVjdG9yIGJvb2wgaW50IF9fYSwgdmVjdG9yIHNpZ25lZCBpbnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2VxZnMoKHZlY3RvciBzaWduZWQgaW50KV9fYSwgX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDM7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9uZSh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjZXFmcygodmVjdG9yIHNpZ25lZCBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBzaWduZWQgaW50KV9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAzOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfbmUodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjZXFmcygodmVjdG9yIHNpZ25lZCBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBzaWduZWQgaW50KV9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAzOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfbmUodmVjdG9yIGJvb2wgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjZXFmcygodmVjdG9yIHNpZ25lZCBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBzaWduZWQgaW50KV9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAzOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfbmUodmVjdG9yIGJvb2wgaW50IF9fYSwgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNlcWZzKCh2ZWN0b3Igc2lnbmVkIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHNpZ25lZCBpbnQpX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDM7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9uZSh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNlcWdzKF9fYSwgX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDM7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9uZSh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjZXFncyhfX2EsICh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZylfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX25lKHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNlcWdzKCh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZylfX2EsIF9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAzOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfbmUodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2VxZ3MoKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZylfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX25lKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2VxZ3MoKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZylfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX25lKHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2VxZ3MoKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZylfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX25lKHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjZXFncygodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAzOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfbmUodmVjdG9yIGRvdWJsZSBfX2EsIHZlY3RvciBkb3VibGUgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92ZmNlZGJzKF9fYSwgX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDM7Cit9CisKKy8qLS0gdmVjX2FsbF9nZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2dlKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGJzKF9fYiwgX19hLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDM7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9nZSh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNoYnMoKHZlY3RvciBzaWduZWQgY2hhcilfX2IsIF9fYSwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAzOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfZ2UodmVjdG9yIGJvb2wgY2hhciBfX2EsIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGJzKF9fYiwgKHZlY3RvciBzaWduZWQgY2hhcilfX2EsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2dlKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hsYnMoX19iLCBfX2EsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2dlKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGxicygodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iLCBfX2EsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2dlKHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGxicyhfX2IsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2dlKHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNobGJzKCh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDM7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9nZSh2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGhzKF9fYiwgX19hLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDM7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9nZSh2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hocygodmVjdG9yIHNpZ25lZCBzaG9ydClfX2IsIF9fYSwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAzOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfZ2UodmVjdG9yIGJvb2wgc2hvcnQgX19hLCB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNoaHMoX19iLCAodmVjdG9yIHNpZ25lZCBzaG9ydClfX2EsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2dlKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGxocyhfX2IsIF9fYSwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAzOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfZ2UodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hsaHMoKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2IsIF9fYSwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAzOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfZ2UodmVjdG9yIGJvb2wgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hsaHMoX19iLCAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYSwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAzOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfZ2UodmVjdG9yIGJvb2wgc2hvcnQgX19hLCB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGxocygodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19hLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDM7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9nZSh2ZWN0b3Igc2lnbmVkIGludCBfX2EsIHZlY3RvciBzaWduZWQgaW50IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNoZnMoX19iLCBfX2EsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2dlKHZlY3RvciBzaWduZWQgaW50IF9fYSwgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNoZnMoKHZlY3RvciBzaWduZWQgaW50KV9fYiwgX19hLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDM7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9nZSh2ZWN0b3IgYm9vbCBpbnQgX19hLCB2ZWN0b3Igc2lnbmVkIGludCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGZzKF9fYiwgKHZlY3RvciBzaWduZWQgaW50KV9fYSwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAzOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfZ2UodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hsZnMoX19iLCBfX2EsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2dlKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hsZnMoKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iLCBfX2EsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2dlKHZlY3RvciBib29sIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hsZnMoX19iLCAodmVjdG9yIHVuc2lnbmVkIGludClfX2EsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2dlKHZlY3RvciBib29sIGludCBfX2EsIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGxmcygodmVjdG9yIHVuc2lnbmVkIGludClfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGludClfX2EsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2dlKHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hncyhfX2IsIF9fYSwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAzOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfZ2UodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hncygodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpX19iLCBfX2EsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2dlKHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNoZ3MoX19iLCAodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpX19hLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDM7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9nZSh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGxncyhfX2IsIF9fYSwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAzOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfZ2UodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGxncygodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2IsIF9fYSwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAzOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfZ2UodmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGxncyhfX2IsICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYSwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAzOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfZ2UodmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNobGdzKCh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYSwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAzOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfZ2UodmVjdG9yIGRvdWJsZSBfX2EsIHZlY3RvciBkb3VibGUgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92ZmNoZWRicyhfX2EsIF9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAwOworfQorCisvKi0tIHZlY19hbGxfZ3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9ndCh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hicyhfX2EsIF9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfZ3QodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGJzKF9fYSwgKHZlY3RvciBzaWduZWQgY2hhcilfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2d0KHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hicygodmVjdG9yIHNpZ25lZCBjaGFyKV9fYSwgX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9ndCh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNobGJzKF9fYSwgX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9ndCh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hsYnMoX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9ndCh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hsYnMoKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9ndCh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGxicygodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfZ3QodmVjdG9yIHNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBzaWduZWQgc2hvcnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hocyhfX2EsIF9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfZ3QodmVjdG9yIHNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNoaHMoX19hLCAodmVjdG9yIHNpZ25lZCBzaG9ydClfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2d0KHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIHNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGhzKCh2ZWN0b3Igc2lnbmVkIHNob3J0KV9fYSwgX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9ndCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hsaHMoX19hLCBfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2d0KHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNobGhzKF9fYSwgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2d0KHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNobGhzKCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19hLCBfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2d0KHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hsaHMoKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfZ3QodmVjdG9yIHNpZ25lZCBpbnQgX19hLCB2ZWN0b3Igc2lnbmVkIGludCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGZzKF9fYSwgX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9ndCh2ZWN0b3Igc2lnbmVkIGludCBfX2EsIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGZzKF9fYSwgKHZlY3RvciBzaWduZWQgaW50KV9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfZ3QodmVjdG9yIGJvb2wgaW50IF9fYSwgdmVjdG9yIHNpZ25lZCBpbnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hmcygodmVjdG9yIHNpZ25lZCBpbnQpX19hLCBfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2d0KHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNobGZzKF9fYSwgX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9ndCh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNobGZzKF9fYSwgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9ndCh2ZWN0b3IgYm9vbCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNobGZzKCh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSwgX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9ndCh2ZWN0b3IgYm9vbCBpbnQgX19hLCB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hsZnMoKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9ndCh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNoZ3MoX19hLCBfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2d0KHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNoZ3MoX19hLCAodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9ndCh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLCB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGdzKCh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZylfX2EsIF9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfZ3QodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hsZ3MoX19hLCBfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2d0KHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hsZ3MoX19hLCAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2d0KHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hsZ3MoKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19hLCBfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2d0KHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGxncygodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2d0KHZlY3RvciBkb3VibGUgX19hLCB2ZWN0b3IgZG91YmxlIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmZjaGRicyhfX2EsIF9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAwOworfQorCisvKi0tIHZlY19hbGxfbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9sZSh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hicyhfX2EsIF9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAzOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfbGUodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGJzKF9fYSwgKHZlY3RvciBzaWduZWQgY2hhcilfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2xlKHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hicygodmVjdG9yIHNpZ25lZCBjaGFyKV9fYSwgX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDM7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9sZSh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNobGJzKF9fYSwgX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDM7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9sZSh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hsYnMoX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDM7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9sZSh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hsYnMoKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDM7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9sZSh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGxicygodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAzOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfbGUodmVjdG9yIHNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBzaWduZWQgc2hvcnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hocyhfX2EsIF9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAzOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfbGUodmVjdG9yIHNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNoaHMoX19hLCAodmVjdG9yIHNpZ25lZCBzaG9ydClfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2xlKHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIHNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGhzKCh2ZWN0b3Igc2lnbmVkIHNob3J0KV9fYSwgX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDM7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9sZSh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hsaHMoX19hLCBfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2xlKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNobGhzKF9fYSwgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2xlKHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNobGhzKCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19hLCBfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2xlKHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hsaHMoKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAzOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfbGUodmVjdG9yIHNpZ25lZCBpbnQgX19hLCB2ZWN0b3Igc2lnbmVkIGludCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGZzKF9fYSwgX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDM7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9sZSh2ZWN0b3Igc2lnbmVkIGludCBfX2EsIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGZzKF9fYSwgKHZlY3RvciBzaWduZWQgaW50KV9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAzOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfbGUodmVjdG9yIGJvb2wgaW50IF9fYSwgdmVjdG9yIHNpZ25lZCBpbnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hmcygodmVjdG9yIHNpZ25lZCBpbnQpX19hLCBfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2xlKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNobGZzKF9fYSwgX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDM7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9sZSh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNobGZzKF9fYSwgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDM7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9sZSh2ZWN0b3IgYm9vbCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNobGZzKCh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSwgX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDM7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9sZSh2ZWN0b3IgYm9vbCBpbnQgX19hLCB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hsZnMoKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDM7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9sZSh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNoZ3MoX19hLCBfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2xlKHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNoZ3MoX19hLCAodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDM7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9sZSh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLCB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGdzKCh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZylfX2EsIF9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAzOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfbGUodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hsZ3MoX19hLCBfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2xlKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hsZ3MoX19hLCAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2xlKHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hsZ3MoKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19hLCBfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2xlKHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGxncygodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2xlKHZlY3RvciBkb3VibGUgX19hLCB2ZWN0b3IgZG91YmxlIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmZjaGVkYnMoX19iLCBfX2EsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMDsKK30KKworLyotLSB2ZWNfYWxsX2x0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfbHQodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNoYnMoX19iLCBfX2EsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2x0KHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hicygodmVjdG9yIHNpZ25lZCBjaGFyKV9fYiwgX19hLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9sdCh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNoYnMoX19iLCAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYSwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfbHQodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGxicyhfX2IsIF9fYSwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfbHQodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNobGJzKCh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IsIF9fYSwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfbHQodmVjdG9yIGJvb2wgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNobGJzKF9fYiwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfbHQodmVjdG9yIGJvb2wgY2hhciBfX2EsIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hsYnMoKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2x0KHZlY3RvciBzaWduZWQgc2hvcnQgX19hLCB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNoaHMoX19iLCBfX2EsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2x0KHZlY3RvciBzaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGhzKCh2ZWN0b3Igc2lnbmVkIHNob3J0KV9fYiwgX19hLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9sdCh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIHZlY3RvciBzaWduZWQgc2hvcnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hocyhfX2IsICh2ZWN0b3Igc2lnbmVkIHNob3J0KV9fYSwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfbHQodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNobGhzKF9fYiwgX19hLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9sdCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGxocygodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYiwgX19hLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9sdCh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGxocyhfX2IsICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19hLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9sdCh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNobGhzKCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2EsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2x0KHZlY3RvciBzaWduZWQgaW50IF9fYSwgdmVjdG9yIHNpZ25lZCBpbnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hmcyhfX2IsIF9fYSwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfbHQodmVjdG9yIHNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hmcygodmVjdG9yIHNpZ25lZCBpbnQpX19iLCBfX2EsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2x0KHZlY3RvciBib29sIGludCBfX2EsIHZlY3RvciBzaWduZWQgaW50IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNoZnMoX19iLCAodmVjdG9yIHNpZ25lZCBpbnQpX19hLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9sdCh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGxmcyhfX2IsIF9fYSwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfbHQodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGxmcygodmVjdG9yIHVuc2lnbmVkIGludClfX2IsIF9fYSwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfbHQodmVjdG9yIGJvb2wgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGxmcyhfX2IsICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfbHQodmVjdG9yIGJvb2wgaW50IF9fYSwgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNobGZzKCh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfbHQodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGdzKF9fYiwgX19hLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9sdCh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGdzKCh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZylfX2IsIF9fYSwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbGxfbHQodmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hncyhfX2IsICh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZylfX2EsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYWxsX2x0KHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNobGdzKF9fYiwgX19hLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9sdCh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNobGdzKCh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYiwgX19hLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9sdCh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNobGdzKF9fYiwgKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19hLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9sdCh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hsZ3MoKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19hLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FsbF9sdCh2ZWN0b3IgZG91YmxlIF9fYSwgdmVjdG9yIGRvdWJsZSBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZmY2hkYnMoX19iLCBfX2EsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMDsKK30KKworLyotLSB2ZWNfYWxsX25nZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfYWkgaW50Cit2ZWNfYWxsX25nZSh2ZWN0b3IgZG91YmxlIF9fYSwgdmVjdG9yIGRvdWJsZSBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZmY2hlZGJzKF9fYSwgX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDM7Cit9CisKKy8qLS0gdmVjX2FsbF9uZ3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX2FpIGludAordmVjX2FsbF9uZ3QodmVjdG9yIGRvdWJsZSBfX2EsIHZlY3RvciBkb3VibGUgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92ZmNoZGJzKF9fYSwgX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjID09IDM7Cit9CisKKy8qLS0gdmVjX2FsbF9ubGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX2FpIGludAordmVjX2FsbF9ubGUodmVjdG9yIGRvdWJsZSBfX2EsIHZlY3RvciBkb3VibGUgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92ZmNoZWRicyhfX2IsIF9fYSwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAzOworfQorCisvKi0tIHZlY19hbGxfbmx0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19haSBpbnQKK3ZlY19hbGxfbmx0KHZlY3RvciBkb3VibGUgX19hLCB2ZWN0b3IgZG91YmxlIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmZjaGRicyhfX2IsIF9fYSwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAzOworfQorCisvKi0tIHZlY19hbGxfbmFuIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19haSBpbnQKK3ZlY19hbGxfbmFuKHZlY3RvciBkb3VibGUgX19hKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92ZnRjaWRiKF9fYSwgMTUsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPT0gMDsKK30KKworLyotLSB2ZWNfYWxsX251bWVyaWMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfYWkgaW50Cit2ZWNfYWxsX251bWVyaWModmVjdG9yIGRvdWJsZSBfX2EpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZmdGNpZGIoX19hLCAxNSwgJl9fY2MpOworICByZXR1cm4gX19jYyA9PSAzOworfQorCisvKi0tIHZlY19hbnlfZXEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9lcSh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2VxYnMoX19hLCBfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPD0gMTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2VxKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2VxYnMoX19hLCAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA8PSAxOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfZXEodmVjdG9yIGJvb2wgY2hhciBfX2EsIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjZXFicygodmVjdG9yIHNpZ25lZCBjaGFyKV9fYSwgX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjIDw9IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9lcSh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNlcWJzKCh2ZWN0b3Igc2lnbmVkIGNoYXIpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBzaWduZWQgY2hhcilfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPD0gMTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2VxKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjZXFicygodmVjdG9yIHNpZ25lZCBjaGFyKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Igc2lnbmVkIGNoYXIpX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjIDw9IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9lcSh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2VxYnMoKHZlY3RvciBzaWduZWQgY2hhcilfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA8PSAxOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfZXEodmVjdG9yIGJvb2wgY2hhciBfX2EsIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2VxYnMoKHZlY3RvciBzaWduZWQgY2hhcilfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA8PSAxOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfZXEodmVjdG9yIHNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBzaWduZWQgc2hvcnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2VxaHMoX19hLCBfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPD0gMTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2VxKHZlY3RvciBzaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjZXFocyhfX2EsICh2ZWN0b3Igc2lnbmVkIHNob3J0KV9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA8PSAxOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfZXEodmVjdG9yIGJvb2wgc2hvcnQgX19hLCB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNlcWhzKCh2ZWN0b3Igc2lnbmVkIHNob3J0KV9fYSwgX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjIDw9IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9lcSh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2VxaHMoKHZlY3RvciBzaWduZWQgc2hvcnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBzaWduZWQgc2hvcnQpX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjIDw9IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9lcSh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjZXFocygodmVjdG9yIHNpZ25lZCBzaG9ydClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHNpZ25lZCBzaG9ydClfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPD0gMTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2VxKHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNlcWhzKCh2ZWN0b3Igc2lnbmVkIHNob3J0KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Igc2lnbmVkIHNob3J0KV9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA8PSAxOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfZXEodmVjdG9yIGJvb2wgc2hvcnQgX19hLCB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjZXFocygodmVjdG9yIHNpZ25lZCBzaG9ydClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHNpZ25lZCBzaG9ydClfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPD0gMTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2VxKHZlY3RvciBzaWduZWQgaW50IF9fYSwgdmVjdG9yIHNpZ25lZCBpbnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2VxZnMoX19hLCBfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPD0gMTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2VxKHZlY3RvciBzaWduZWQgaW50IF9fYSwgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNlcWZzKF9fYSwgKHZlY3RvciBzaWduZWQgaW50KV9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA8PSAxOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfZXEodmVjdG9yIGJvb2wgaW50IF9fYSwgdmVjdG9yIHNpZ25lZCBpbnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2VxZnMoKHZlY3RvciBzaWduZWQgaW50KV9fYSwgX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjIDw9IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9lcSh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjZXFmcygodmVjdG9yIHNpZ25lZCBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBzaWduZWQgaW50KV9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA8PSAxOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfZXEodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjZXFmcygodmVjdG9yIHNpZ25lZCBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBzaWduZWQgaW50KV9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA8PSAxOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfZXEodmVjdG9yIGJvb2wgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjZXFmcygodmVjdG9yIHNpZ25lZCBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBzaWduZWQgaW50KV9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA8PSAxOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfZXEodmVjdG9yIGJvb2wgaW50IF9fYSwgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNlcWZzKCh2ZWN0b3Igc2lnbmVkIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHNpZ25lZCBpbnQpX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjIDw9IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9lcSh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNlcWdzKF9fYSwgX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjIDw9IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9lcSh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjZXFncyhfX2EsICh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZylfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPD0gMTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2VxKHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNlcWdzKCh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZylfX2EsIF9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA8PSAxOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfZXEodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2VxZ3MoKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZylfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPD0gMTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2VxKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2VxZ3MoKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZylfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPD0gMTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2VxKHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2VxZ3MoKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZylfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPD0gMTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2VxKHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjZXFncygodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA8PSAxOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfZXEodmVjdG9yIGRvdWJsZSBfX2EsIHZlY3RvciBkb3VibGUgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92ZmNlZGJzKF9fYSwgX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjIDw9IDE7Cit9CisKKy8qLS0gdmVjX2FueV9uZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X25lKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjZXFicyhfX2EsIF9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyAhPSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfbmUodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjZXFicyhfX2EsICh2ZWN0b3Igc2lnbmVkIGNoYXIpX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjICE9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9uZSh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNlcWJzKCh2ZWN0b3Igc2lnbmVkIGNoYXIpX19hLCBfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgIT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X25lKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2VxYnMoKHZlY3RvciBzaWduZWQgY2hhcilfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyAhPSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfbmUodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNlcWJzKCh2ZWN0b3Igc2lnbmVkIGNoYXIpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBzaWduZWQgY2hhcilfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgIT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X25lKHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjZXFicygodmVjdG9yIHNpZ25lZCBjaGFyKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Igc2lnbmVkIGNoYXIpX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjICE9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9uZSh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjZXFicygodmVjdG9yIHNpZ25lZCBjaGFyKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Igc2lnbmVkIGNoYXIpX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjICE9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9uZSh2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjZXFocyhfX2EsIF9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyAhPSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfbmUodmVjdG9yIHNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNlcWhzKF9fYSwgKHZlY3RvciBzaWduZWQgc2hvcnQpX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjICE9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9uZSh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIHZlY3RvciBzaWduZWQgc2hvcnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2VxaHMoKHZlY3RvciBzaWduZWQgc2hvcnQpX19hLCBfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgIT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X25lKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjZXFocygodmVjdG9yIHNpZ25lZCBzaG9ydClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHNpZ25lZCBzaG9ydClfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgIT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X25lKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNlcWhzKCh2ZWN0b3Igc2lnbmVkIHNob3J0KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Igc2lnbmVkIHNob3J0KV9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyAhPSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfbmUodmVjdG9yIGJvb2wgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2VxaHMoKHZlY3RvciBzaWduZWQgc2hvcnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBzaWduZWQgc2hvcnQpX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjICE9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9uZSh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNlcWhzKCh2ZWN0b3Igc2lnbmVkIHNob3J0KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Igc2lnbmVkIHNob3J0KV9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyAhPSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfbmUodmVjdG9yIHNpZ25lZCBpbnQgX19hLCB2ZWN0b3Igc2lnbmVkIGludCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjZXFmcyhfX2EsIF9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyAhPSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfbmUodmVjdG9yIHNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2VxZnMoX19hLCAodmVjdG9yIHNpZ25lZCBpbnQpX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjICE9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9uZSh2ZWN0b3IgYm9vbCBpbnQgX19hLCB2ZWN0b3Igc2lnbmVkIGludCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjZXFmcygodmVjdG9yIHNpZ25lZCBpbnQpX19hLCBfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgIT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X25lKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNlcWZzKCh2ZWN0b3Igc2lnbmVkIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHNpZ25lZCBpbnQpX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjICE9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9uZSh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNlcWZzKCh2ZWN0b3Igc2lnbmVkIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHNpZ25lZCBpbnQpX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjICE9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9uZSh2ZWN0b3IgYm9vbCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNlcWZzKCh2ZWN0b3Igc2lnbmVkIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHNpZ25lZCBpbnQpX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjICE9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9uZSh2ZWN0b3IgYm9vbCBpbnQgX19hLCB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2VxZnMoKHZlY3RvciBzaWduZWQgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3Igc2lnbmVkIGludClfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgIT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X25lKHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2VxZ3MoX19hLCBfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgIT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X25lKHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNlcWdzKF9fYSwgKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyAhPSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfbmUodmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2VxZ3MoKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYSwgX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjICE9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9uZSh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjZXFncygodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyAhPSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfbmUodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjZXFncygodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyAhPSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfbmUodmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjZXFncygodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyAhPSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfbmUodmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNlcWdzKCh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZylfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjICE9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9uZSh2ZWN0b3IgZG91YmxlIF9fYSwgdmVjdG9yIGRvdWJsZSBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZmY2VkYnMoX19hLCBfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgIT0gMDsKK30KKworLyotLSB2ZWNfYW55X2dlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfZ2UodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNoYnMoX19iLCBfX2EsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgIT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2dlKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hicygodmVjdG9yIHNpZ25lZCBjaGFyKV9fYiwgX19hLCAmX19jYyk7CisgIHJldHVybiBfX2NjICE9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9nZSh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNoYnMoX19iLCAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYSwgJl9fY2MpOworICByZXR1cm4gX19jYyAhPSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfZ2UodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGxicyhfX2IsIF9fYSwgJl9fY2MpOworICByZXR1cm4gX19jYyAhPSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfZ2UodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNobGJzKCh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IsIF9fYSwgJl9fY2MpOworICByZXR1cm4gX19jYyAhPSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfZ2UodmVjdG9yIGJvb2wgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNobGJzKF9fYiwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgJl9fY2MpOworICByZXR1cm4gX19jYyAhPSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfZ2UodmVjdG9yIGJvb2wgY2hhciBfX2EsIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hsYnMoKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgIT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2dlKHZlY3RvciBzaWduZWQgc2hvcnQgX19hLCB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNoaHMoX19iLCBfX2EsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgIT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2dlKHZlY3RvciBzaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGhzKCh2ZWN0b3Igc2lnbmVkIHNob3J0KV9fYiwgX19hLCAmX19jYyk7CisgIHJldHVybiBfX2NjICE9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9nZSh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIHZlY3RvciBzaWduZWQgc2hvcnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hocyhfX2IsICh2ZWN0b3Igc2lnbmVkIHNob3J0KV9fYSwgJl9fY2MpOworICByZXR1cm4gX19jYyAhPSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfZ2UodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNobGhzKF9fYiwgX19hLCAmX19jYyk7CisgIHJldHVybiBfX2NjICE9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9nZSh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGxocygodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYiwgX19hLCAmX19jYyk7CisgIHJldHVybiBfX2NjICE9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9nZSh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGxocyhfX2IsICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19hLCAmX19jYyk7CisgIHJldHVybiBfX2NjICE9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9nZSh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNobGhzKCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2EsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgIT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2dlKHZlY3RvciBzaWduZWQgaW50IF9fYSwgdmVjdG9yIHNpZ25lZCBpbnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hmcyhfX2IsIF9fYSwgJl9fY2MpOworICByZXR1cm4gX19jYyAhPSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfZ2UodmVjdG9yIHNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hmcygodmVjdG9yIHNpZ25lZCBpbnQpX19iLCBfX2EsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgIT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2dlKHZlY3RvciBib29sIGludCBfX2EsIHZlY3RvciBzaWduZWQgaW50IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNoZnMoX19iLCAodmVjdG9yIHNpZ25lZCBpbnQpX19hLCAmX19jYyk7CisgIHJldHVybiBfX2NjICE9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9nZSh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGxmcyhfX2IsIF9fYSwgJl9fY2MpOworICByZXR1cm4gX19jYyAhPSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfZ2UodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGxmcygodmVjdG9yIHVuc2lnbmVkIGludClfX2IsIF9fYSwgJl9fY2MpOworICByZXR1cm4gX19jYyAhPSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfZ2UodmVjdG9yIGJvb2wgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGxmcyhfX2IsICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSwgJl9fY2MpOworICByZXR1cm4gX19jYyAhPSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfZ2UodmVjdG9yIGJvb2wgaW50IF9fYSwgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNobGZzKCh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSwgJl9fY2MpOworICByZXR1cm4gX19jYyAhPSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfZ2UodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGdzKF9fYiwgX19hLCAmX19jYyk7CisgIHJldHVybiBfX2NjICE9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9nZSh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGdzKCh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZylfX2IsIF9fYSwgJl9fY2MpOworICByZXR1cm4gX19jYyAhPSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfZ2UodmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hncyhfX2IsICh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZylfX2EsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgIT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2dlKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNobGdzKF9fYiwgX19hLCAmX19jYyk7CisgIHJldHVybiBfX2NjICE9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9nZSh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNobGdzKCh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYiwgX19hLCAmX19jYyk7CisgIHJldHVybiBfX2NjICE9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9nZSh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNobGdzKF9fYiwgKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19hLCAmX19jYyk7CisgIHJldHVybiBfX2NjICE9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9nZSh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hsZ3MoKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19hLCAmX19jYyk7CisgIHJldHVybiBfX2NjICE9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9nZSh2ZWN0b3IgZG91YmxlIF9fYSwgdmVjdG9yIGRvdWJsZSBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZmY2hlZGJzKF9fYSwgX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjIDw9IDE7Cit9CisKKy8qLS0gdmVjX2FueV9ndCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2d0KHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGJzKF9fYSwgX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjIDw9IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9ndCh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNoYnMoX19hLCAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA8PSAxOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfZ3QodmVjdG9yIGJvb2wgY2hhciBfX2EsIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGJzKCh2ZWN0b3Igc2lnbmVkIGNoYXIpX19hLCBfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPD0gMTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2d0KHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hsYnMoX19hLCBfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPD0gMTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2d0KHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGxicyhfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPD0gMTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2d0KHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGxicygodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCBfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPD0gMTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2d0KHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNobGJzKCh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjIDw9IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9ndCh2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGhzKF9fYSwgX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjIDw9IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9ndCh2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hocyhfX2EsICh2ZWN0b3Igc2lnbmVkIHNob3J0KV9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA8PSAxOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfZ3QodmVjdG9yIGJvb2wgc2hvcnQgX19hLCB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNoaHMoKHZlY3RvciBzaWduZWQgc2hvcnQpX19hLCBfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPD0gMTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2d0KHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGxocyhfX2EsIF9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA8PSAxOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfZ3QodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hsaHMoX19hLCAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA8PSAxOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfZ3QodmVjdG9yIGJvb2wgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hsaHMoKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2EsIF9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA8PSAxOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfZ3QodmVjdG9yIGJvb2wgc2hvcnQgX19hLCB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGxocygodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjIDw9IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9ndCh2ZWN0b3Igc2lnbmVkIGludCBfX2EsIHZlY3RvciBzaWduZWQgaW50IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNoZnMoX19hLCBfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPD0gMTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2d0KHZlY3RvciBzaWduZWQgaW50IF9fYSwgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNoZnMoX19hLCAodmVjdG9yIHNpZ25lZCBpbnQpX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjIDw9IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9ndCh2ZWN0b3IgYm9vbCBpbnQgX19hLCB2ZWN0b3Igc2lnbmVkIGludCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGZzKCh2ZWN0b3Igc2lnbmVkIGludClfX2EsIF9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA8PSAxOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfZ3QodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hsZnMoX19hLCBfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPD0gMTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2d0KHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hsZnMoX19hLCAodmVjdG9yIHVuc2lnbmVkIGludClfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPD0gMTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2d0KHZlY3RvciBib29sIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hsZnMoKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hLCBfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPD0gMTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2d0KHZlY3RvciBib29sIGludCBfX2EsIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGxmcygodmVjdG9yIHVuc2lnbmVkIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGludClfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPD0gMTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2d0KHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hncyhfX2EsIF9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA8PSAxOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfZ3QodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hncyhfX2EsICh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZylfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPD0gMTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2d0KHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNoZ3MoKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYSwgX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjIDw9IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9ndCh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGxncyhfX2EsIF9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA8PSAxOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfZ3QodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGxncyhfX2EsICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA8PSAxOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfZ3QodmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGxncygodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2EsIF9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA8PSAxOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfZ3QodmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNobGdzKCh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyA8PSAxOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfZ3QodmVjdG9yIGRvdWJsZSBfX2EsIHZlY3RvciBkb3VibGUgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92ZmNoZGJzKF9fYSwgX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjIDw9IDE7Cit9CisKKy8qLS0gdmVjX2FueV9sZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2xlKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGJzKF9fYSwgX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjICE9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9sZSh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNoYnMoX19hLCAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyAhPSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfbGUodmVjdG9yIGJvb2wgY2hhciBfX2EsIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGJzKCh2ZWN0b3Igc2lnbmVkIGNoYXIpX19hLCBfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgIT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2xlKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hsYnMoX19hLCBfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgIT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2xlKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGxicyhfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgIT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2xlKHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGxicygodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCBfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgIT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2xlKHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNobGJzKCh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjICE9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9sZSh2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGhzKF9fYSwgX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjICE9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9sZSh2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hocyhfX2EsICh2ZWN0b3Igc2lnbmVkIHNob3J0KV9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyAhPSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfbGUodmVjdG9yIGJvb2wgc2hvcnQgX19hLCB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNoaHMoKHZlY3RvciBzaWduZWQgc2hvcnQpX19hLCBfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgIT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2xlKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGxocyhfX2EsIF9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyAhPSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfbGUodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hsaHMoX19hLCAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyAhPSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfbGUodmVjdG9yIGJvb2wgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hsaHMoKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2EsIF9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyAhPSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfbGUodmVjdG9yIGJvb2wgc2hvcnQgX19hLCB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGxocygodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjICE9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9sZSh2ZWN0b3Igc2lnbmVkIGludCBfX2EsIHZlY3RvciBzaWduZWQgaW50IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNoZnMoX19hLCBfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgIT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2xlKHZlY3RvciBzaWduZWQgaW50IF9fYSwgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNoZnMoX19hLCAodmVjdG9yIHNpZ25lZCBpbnQpX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjICE9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9sZSh2ZWN0b3IgYm9vbCBpbnQgX19hLCB2ZWN0b3Igc2lnbmVkIGludCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGZzKCh2ZWN0b3Igc2lnbmVkIGludClfX2EsIF9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyAhPSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfbGUodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hsZnMoX19hLCBfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgIT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2xlKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hsZnMoX19hLCAodmVjdG9yIHVuc2lnbmVkIGludClfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgIT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2xlKHZlY3RvciBib29sIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hsZnMoKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hLCBfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgIT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2xlKHZlY3RvciBib29sIGludCBfX2EsIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGxmcygodmVjdG9yIHVuc2lnbmVkIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGludClfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgIT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2xlKHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hncyhfX2EsIF9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyAhPSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfbGUodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hncyhfX2EsICh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZylfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgIT0gMDsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2xlKHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNoZ3MoKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYSwgX19iLCAmX19jYyk7CisgIHJldHVybiBfX2NjICE9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9sZSh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGxncyhfX2EsIF9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyAhPSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfbGUodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGxncyhfX2EsICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyAhPSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfbGUodmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGxncygodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2EsIF9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyAhPSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfbGUodmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNobGdzKCh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYiwgJl9fY2MpOworICByZXR1cm4gX19jYyAhPSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfbGUodmVjdG9yIGRvdWJsZSBfX2EsIHZlY3RvciBkb3VibGUgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92ZmNoZWRicyhfX2IsIF9fYSwgJl9fY2MpOworICByZXR1cm4gX19jYyA8PSAxOworfQorCisvKi0tIHZlY19hbnlfbHQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9sdCh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hicyhfX2IsIF9fYSwgJl9fY2MpOworICByZXR1cm4gX19jYyA8PSAxOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfbHQodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGJzKCh2ZWN0b3Igc2lnbmVkIGNoYXIpX19iLCBfX2EsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPD0gMTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2x0KHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hicyhfX2IsICh2ZWN0b3Igc2lnbmVkIGNoYXIpX19hLCAmX19jYyk7CisgIHJldHVybiBfX2NjIDw9IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9sdCh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNobGJzKF9fYiwgX19hLCAmX19jYyk7CisgIHJldHVybiBfX2NjIDw9IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9sdCh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hsYnMoKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYiwgX19hLCAmX19jYyk7CisgIHJldHVybiBfX2NjIDw9IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9sdCh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hsYnMoX19iLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAmX19jYyk7CisgIHJldHVybiBfX2NjIDw9IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9sdCh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGxicygodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgJl9fY2MpOworICByZXR1cm4gX19jYyA8PSAxOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfbHQodmVjdG9yIHNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBzaWduZWQgc2hvcnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hocyhfX2IsIF9fYSwgJl9fY2MpOworICByZXR1cm4gX19jYyA8PSAxOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfbHQodmVjdG9yIHNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNoaHMoKHZlY3RvciBzaWduZWQgc2hvcnQpX19iLCBfX2EsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPD0gMTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2x0KHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIHNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGhzKF9fYiwgKHZlY3RvciBzaWduZWQgc2hvcnQpX19hLCAmX19jYyk7CisgIHJldHVybiBfX2NjIDw9IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9sdCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hsaHMoX19iLCBfX2EsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPD0gMTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2x0KHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNobGhzKCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19iLCBfX2EsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPD0gMTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2x0KHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNobGhzKF9fYiwgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2EsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPD0gMTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2x0KHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hsaHMoKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYSwgJl9fY2MpOworICByZXR1cm4gX19jYyA8PSAxOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfbHQodmVjdG9yIHNpZ25lZCBpbnQgX19hLCB2ZWN0b3Igc2lnbmVkIGludCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGZzKF9fYiwgX19hLCAmX19jYyk7CisgIHJldHVybiBfX2NjIDw9IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9sdCh2ZWN0b3Igc2lnbmVkIGludCBfX2EsIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGZzKCh2ZWN0b3Igc2lnbmVkIGludClfX2IsIF9fYSwgJl9fY2MpOworICByZXR1cm4gX19jYyA8PSAxOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfbHQodmVjdG9yIGJvb2wgaW50IF9fYSwgdmVjdG9yIHNpZ25lZCBpbnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hmcyhfX2IsICh2ZWN0b3Igc2lnbmVkIGludClfX2EsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPD0gMTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2x0KHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNobGZzKF9fYiwgX19hLCAmX19jYyk7CisgIHJldHVybiBfX2NjIDw9IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9sdCh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNobGZzKCh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYiwgX19hLCAmX19jYyk7CisgIHJldHVybiBfX2NjIDw9IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9sdCh2ZWN0b3IgYm9vbCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNobGZzKF9fYiwgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hLCAmX19jYyk7CisgIHJldHVybiBfX2NjIDw9IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9sdCh2ZWN0b3IgYm9vbCBpbnQgX19hLCB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hsZnMoKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hLCAmX19jYyk7CisgIHJldHVybiBfX2NjIDw9IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9sdCh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNoZ3MoX19iLCBfX2EsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPD0gMTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2x0KHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmNoZ3MoKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYiwgX19hLCAmX19jYyk7CisgIHJldHVybiBfX2NjIDw9IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX2FueV9sdCh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLCB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGdzKF9fYiwgKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYSwgJl9fY2MpOworICByZXR1cm4gX19jYyA8PSAxOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY19hbnlfbHQodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hsZ3MoX19iLCBfX2EsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPD0gMTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2x0KHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hsZ3MoKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19iLCBfX2EsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPD0gMTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2x0KHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92Y2hsZ3MoX19iLCAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2EsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPD0gMTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2x0KHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZjaGxncygodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2EsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgPD0gMTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfYW55X2x0KHZlY3RvciBkb3VibGUgX19hLCB2ZWN0b3IgZG91YmxlIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmZjaGRicyhfX2IsIF9fYSwgJl9fY2MpOworICByZXR1cm4gX19jYyA8PSAxOworfQorCisvKi0tIHZlY19hbnlfbmdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19haSBpbnQKK3ZlY19hbnlfbmdlKHZlY3RvciBkb3VibGUgX19hLCB2ZWN0b3IgZG91YmxlIF9fYikgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmZjaGVkYnMoX19hLCBfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgIT0gMDsKK30KKworLyotLSB2ZWNfYW55X25ndCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfYWkgaW50Cit2ZWNfYW55X25ndCh2ZWN0b3IgZG91YmxlIF9fYSwgdmVjdG9yIGRvdWJsZSBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZmY2hkYnMoX19hLCBfX2IsICZfX2NjKTsKKyAgcmV0dXJuIF9fY2MgIT0gMDsKK30KKworLyotLSB2ZWNfYW55X25sZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfYWkgaW50Cit2ZWNfYW55X25sZSh2ZWN0b3IgZG91YmxlIF9fYSwgdmVjdG9yIGRvdWJsZSBfX2IpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZmY2hlZGJzKF9fYiwgX19hLCAmX19jYyk7CisgIHJldHVybiBfX2NjICE9IDA7Cit9CisKKy8qLS0gdmVjX2FueV9ubHQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX2FpIGludAordmVjX2FueV9ubHQodmVjdG9yIGRvdWJsZSBfX2EsIHZlY3RvciBkb3VibGUgX19iKSB7CisgIGludCBfX2NjOworICBfX2J1aWx0aW5fczM5MF92ZmNoZGJzKF9fYiwgX19hLCAmX19jYyk7CisgIHJldHVybiBfX2NjICE9IDA7Cit9CisKKy8qLS0gdmVjX2FueV9uYW4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX2FpIGludAordmVjX2FueV9uYW4odmVjdG9yIGRvdWJsZSBfX2EpIHsKKyAgaW50IF9fY2M7CisgIF9fYnVpbHRpbl9zMzkwX3ZmdGNpZGIoX19hLCAxNSwgJl9fY2MpOworICByZXR1cm4gX19jYyAhPSAzOworfQorCisvKi0tIHZlY19hbnlfbnVtZXJpYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19haSBpbnQKK3ZlY19hbnlfbnVtZXJpYyh2ZWN0b3IgZG91YmxlIF9fYSkgeworICBpbnQgX19jYzsKKyAgX19idWlsdGluX3MzOTBfdmZ0Y2lkYihfX2EsIDE1LCAmX19jYyk7CisgIHJldHVybiBfX2NjICE9IDA7Cit9CisKKy8qLS0gdmVjX2FuZGMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgY2hhcgordmVjX2FuZGModmVjdG9yIGJvb2wgY2hhciBfX2EsIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2EgJiB+X19iOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGNoYXIKK3ZlY19hbmRjKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYSAmIH5fX2I7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgY2hhcgordmVjX2FuZGModmVjdG9yIGJvb2wgY2hhciBfX2EsIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYSAmIH5fX2I7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgY2hhcgordmVjX2FuZGModmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYSAmIH5fX2I7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBjaGFyCit2ZWNfYW5kYyh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19hICYgfl9fYjsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGNoYXIKK3ZlY19hbmRjKHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYSAmIH5fX2I7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBjaGFyCit2ZWNfYW5kYyh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2EgJiB+X19iOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBzaG9ydAordmVjX2FuZGModmVjdG9yIGJvb2wgc2hvcnQgX19hLCB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYSAmIH5fX2I7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgc2hvcnQKK3ZlY19hbmRjKHZlY3RvciBzaWduZWQgc2hvcnQgX19hLCB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gX19hICYgfl9fYjsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBzaG9ydAordmVjX2FuZGModmVjdG9yIGJvb2wgc2hvcnQgX19hLCB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gX19hICYgfl9fYjsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBzaG9ydAordmVjX2FuZGModmVjdG9yIHNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICByZXR1cm4gX19hICYgfl9fYjsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIHNob3J0Cit2ZWNfYW5kYyh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2EgJiB+X19iOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgc2hvcnQKK3ZlY19hbmRjKHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gX19hICYgfl9fYjsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIHNob3J0Cit2ZWNfYW5kYyh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYSAmIH5fX2I7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIGludAordmVjX2FuZGModmVjdG9yIGJvb2wgaW50IF9fYSwgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICByZXR1cm4gX19hICYgfl9fYjsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBpbnQKK3ZlY19hbmRjKHZlY3RvciBzaWduZWQgaW50IF9fYSwgdmVjdG9yIHNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiBfX2EgJiB+X19iOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGludAordmVjX2FuZGModmVjdG9yIGJvb2wgaW50IF9fYSwgdmVjdG9yIHNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiBfX2EgJiB+X19iOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGludAordmVjX2FuZGModmVjdG9yIHNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIHJldHVybiBfX2EgJiB+X19iOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgaW50Cit2ZWNfYW5kYyh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYSAmIH5fX2I7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBpbnQKK3ZlY19hbmRjKHZlY3RvciBib29sIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiBfX2EgJiB+X19iOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgaW50Cit2ZWNfYW5kYyh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICByZXR1cm4gX19hICYgfl9fYjsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgbG9uZyBsb25nCit2ZWNfYW5kYyh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2EgJiB+X19iOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZwordmVjX2FuZGModmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYSAmIH5fX2I7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgbG9uZyBsb25nCit2ZWNfYW5kYyh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLCB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYSAmIH5fX2I7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgbG9uZyBsb25nCit2ZWNfYW5kYyh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYSAmIH5fX2I7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcKK3ZlY19hbmRjKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19hICYgfl9fYjsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZwordmVjX2FuZGModmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYSAmIH5fX2I7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcKK3ZlY19hbmRjKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2EgJiB+X19iOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgZG91YmxlCit2ZWNfYW5kYyh2ZWN0b3IgZG91YmxlIF9fYSwgdmVjdG9yIGRvdWJsZSBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgZG91YmxlKSgodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2EgJgorICAgICAgICAgICAgICAgICAgICAgICAgIH4odmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgZG91YmxlCit2ZWNfYW5kYyh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgZG91YmxlIF9fYikgeworICByZXR1cm4gKHZlY3RvciBkb3VibGUpKCh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYSAmCisgICAgICAgICAgICAgICAgICAgICAgICAgfih2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBkb3VibGUKK3ZlY19hbmRjKHZlY3RvciBkb3VibGUgX19hLCB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGRvdWJsZSkoKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19hICYKKyAgICAgICAgICAgICAgICAgICAgICAgICB+KHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19iKTsKK30KKworLyotLSB2ZWNfbm9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBjaGFyCit2ZWNfbm9yKHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICByZXR1cm4gfihfX2EgfCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGNoYXIKK3ZlY19ub3IodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gfihfX2EgfCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGNoYXIKK3ZlY19ub3IodmVjdG9yIGJvb2wgY2hhciBfX2EsIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIH4oX19hIHwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBjaGFyCit2ZWNfbm9yKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIHJldHVybiB+KF9fYSB8IF9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBjaGFyCit2ZWNfbm9yKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiB+KF9fYSB8IF9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBjaGFyCit2ZWNfbm9yKHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIH4oX19hIHwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGNoYXIKK3ZlY19ub3IodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICByZXR1cm4gfihfX2EgfCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBzaG9ydAordmVjX25vcih2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICByZXR1cm4gfihfX2EgfCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIHNob3J0Cit2ZWNfbm9yKHZlY3RvciBzaWduZWQgc2hvcnQgX19hLCB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gfihfX2EgfCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIHNob3J0Cit2ZWNfbm9yKHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIHNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIH4oX19hIHwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBzaG9ydAordmVjX25vcih2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIHJldHVybiB+KF9fYSB8IF9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBzaG9ydAordmVjX25vcih2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiB+KF9fYSB8IF9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBzaG9ydAordmVjX25vcih2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIH4oX19hIHwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIHNob3J0Cit2ZWNfbm9yKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICByZXR1cm4gfihfX2EgfCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBpbnQKK3ZlY19ub3IodmVjdG9yIGJvb2wgaW50IF9fYSwgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICByZXR1cm4gfihfX2EgfCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGludAordmVjX25vcih2ZWN0b3Igc2lnbmVkIGludCBfX2EsIHZlY3RvciBzaWduZWQgaW50IF9fYikgeworICByZXR1cm4gfihfX2EgfCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGludAordmVjX25vcih2ZWN0b3IgYm9vbCBpbnQgX19hLCB2ZWN0b3Igc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuIH4oX19hIHwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBpbnQKK3ZlY19ub3IodmVjdG9yIHNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIHJldHVybiB+KF9fYSB8IF9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBpbnQKK3ZlY19ub3IodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiB+KF9fYSB8IF9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBpbnQKK3ZlY19ub3IodmVjdG9yIGJvb2wgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuIH4oX19hIHwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGludAordmVjX25vcih2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICByZXR1cm4gfihfX2EgfCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBsb25nIGxvbmcKK3ZlY19ub3IodmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gfihfX2EgfCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZwordmVjX25vcih2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gfihfX2EgfCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZwordmVjX25vcih2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLCB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIH4oX19hIHwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcKK3ZlY19ub3IodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiB+KF9fYSB8IF9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcKK3ZlY19ub3IodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiB+KF9fYSB8IF9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcKK3ZlY19ub3IodmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIH4oX19hIHwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZwordmVjX25vcih2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gfihfX2EgfCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgZG91YmxlCit2ZWNfbm9yKHZlY3RvciBkb3VibGUgX19hLCB2ZWN0b3IgZG91YmxlIF9fYikgeworICByZXR1cm4gKHZlY3RvciBkb3VibGUpfigodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2EgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgZG91YmxlCit2ZWNfbm9yKHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBkb3VibGUgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGRvdWJsZSl+KCh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBkb3VibGUKK3ZlY19ub3IodmVjdG9yIGRvdWJsZSBfX2EsIHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgZG91YmxlKX4oKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19hIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19iKTsKK30KKworLyotLSB2ZWNfY250bHogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgY2hhcgordmVjX2NudGx6KHZlY3RvciBzaWduZWQgY2hhciBfX2EpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZjbHpiKCh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgY2hhcgordmVjX2NudGx6KHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSkgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmNsemIoX19hKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIHNob3J0Cit2ZWNfY250bHoodmVjdG9yIHNpZ25lZCBzaG9ydCBfX2EpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZjbHpoKCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19hKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIHNob3J0Cit2ZWNfY250bHoodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSkgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmNsemgoX19hKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGludAordmVjX2NudGx6KHZlY3RvciBzaWduZWQgaW50IF9fYSkgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmNsemYoKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGludAordmVjX2NudGx6KHZlY3RvciB1bnNpZ25lZCBpbnQgX19hKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92Y2x6ZihfX2EpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nCit2ZWNfY250bHoodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92Y2x6ZygodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2EpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nCit2ZWNfY250bHoodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZjbHpnKF9fYSk7Cit9CisKKy8qLS0gdmVjX2NudHR6IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGNoYXIKK3ZlY19jbnR0eih2ZWN0b3Igc2lnbmVkIGNoYXIgX19hKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92Y3R6YigodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGNoYXIKK3ZlY19jbnR0eih2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZjdHpiKF9fYSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBzaG9ydAordmVjX2NudHR6KHZlY3RvciBzaWduZWQgc2hvcnQgX19hKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92Y3R6aCgodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBzaG9ydAordmVjX2NudHR6KHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZjdHpoKF9fYSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBpbnQKK3ZlY19jbnR0eih2ZWN0b3Igc2lnbmVkIGludCBfX2EpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZjdHpmKCh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBpbnQKK3ZlY19jbnR0eih2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSkgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmN0emYoX19hKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZwordmVjX2NudHR6KHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSkgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmN0emcoKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19hKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZwordmVjX2NudHR6KHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92Y3R6ZyhfX2EpOworfQorCisvKi0tIHZlY19wb3BjbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBjaGFyCit2ZWNfcG9wY250KHZlY3RvciBzaWduZWQgY2hhciBfX2EpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3Zwb3BjdGIoKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBjaGFyCit2ZWNfcG9wY250KHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSkgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdnBvcGN0YihfX2EpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgc2hvcnQKK3ZlY19wb3BjbnQodmVjdG9yIHNpZ25lZCBzaG9ydCBfX2EpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3Zwb3BjdGgoKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2EpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgc2hvcnQKK3ZlY19wb3BjbnQodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSkgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdnBvcGN0aChfX2EpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgaW50Cit2ZWNfcG9wY250KHZlY3RvciBzaWduZWQgaW50IF9fYSkgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdnBvcGN0ZigodmVjdG9yIHVuc2lnbmVkIGludClfX2EpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgaW50Cit2ZWNfcG9wY250KHZlY3RvciB1bnNpZ25lZCBpbnQgX19hKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92cG9wY3RmKF9fYSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcKK3ZlY19wb3BjbnQodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92cG9wY3RnKCh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcKK3ZlY19wb3BjbnQodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3Zwb3BjdGcoX19hKTsKK30KKworLyotLSB2ZWNfcmwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGNoYXIKK3ZlY19ybCh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGNoYXIpX19idWlsdGluX3MzOTBfdmVybGx2YigKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgY2hhcgordmVjX3JsKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92ZXJsbHZiKF9fYSwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBzaG9ydAordmVjX3JsKHZlY3RvciBzaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBzaG9ydClfX2J1aWx0aW5fczM5MF92ZXJsbHZoKAorICAgICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19hLCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgc2hvcnQKK3ZlY19ybCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92ZXJsbHZoKF9fYSwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBpbnQKK3ZlY19ybCh2ZWN0b3Igc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBpbnQpX19idWlsdGluX3MzOTBfdmVybGx2ZigKKyAgICAodmVjdG9yIHVuc2lnbmVkIGludClfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBpbnQKK3ZlY19ybCh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZlcmxsdmYoX19hLCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZwordmVjX3JsKHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZylfX2J1aWx0aW5fczM5MF92ZXJsbHZnKAorICAgICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYSwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZwordmVjX3JsKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmVybGx2ZyhfX2EsIF9fYik7Cit9CisKKy8qLS0gdmVjX3JsaSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBjaGFyCit2ZWNfcmxpKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHVuc2lnbmVkIGxvbmcgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYnVpbHRpbl9zMzkwX3ZlcmxsYigKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAoaW50KV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBjaGFyCit2ZWNfcmxpKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdW5zaWduZWQgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZlcmxsYihfX2EsIChpbnQpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBzaG9ydAordmVjX3JsaSh2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYSwgdW5zaWduZWQgbG9uZyBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIHNob3J0KV9fYnVpbHRpbl9zMzkwX3ZlcmxsaCgKKyAgICAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYSwgKGludClfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgc2hvcnQKK3ZlY19ybGkodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdW5zaWduZWQgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZlcmxsaChfX2EsIChpbnQpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBpbnQKK3ZlY19ybGkodmVjdG9yIHNpZ25lZCBpbnQgX19hLCB1bnNpZ25lZCBsb25nIF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgaW50KV9fYnVpbHRpbl9zMzkwX3ZlcmxsZigKKyAgICAodmVjdG9yIHVuc2lnbmVkIGludClfX2EsIChpbnQpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGludAordmVjX3JsaSh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdW5zaWduZWQgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZlcmxsZihfX2EsIChpbnQpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcKK3ZlY19ybGkodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hLCB1bnNpZ25lZCBsb25nIF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYnVpbHRpbl9zMzkwX3ZlcmxsZygKKyAgICAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2EsIChpbnQpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZwordmVjX3JsaSh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdW5zaWduZWQgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZlcmxsZyhfX2EsIChpbnQpX19iKTsKK30KKworLyotLSB2ZWNfcmxfbWFzayAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitleHRlcm4gX19BVFRSU19vIHZlY3RvciBzaWduZWQgY2hhcgordmVjX3JsX21hc2sodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iLAorICAgICAgICAgICAgdW5zaWduZWQgY2hhciBfX2MpIF9fY29uc3RhbnQoX19jKTsKKworZXh0ZXJuIF9fQVRUUlNfbyB2ZWN0b3IgdW5zaWduZWQgY2hhcgordmVjX3JsX21hc2sodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IsCisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIF9fYykgX19jb25zdGFudChfX2MpOworCitleHRlcm4gX19BVFRSU19vIHZlY3RvciBzaWduZWQgc2hvcnQKK3ZlY19ybF9tYXNrKHZlY3RvciBzaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iLAorICAgICAgICAgICAgdW5zaWduZWQgY2hhciBfX2MpIF9fY29uc3RhbnQoX19jKTsKKworZXh0ZXJuIF9fQVRUUlNfbyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQKK3ZlY19ybF9tYXNrKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IsCisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIF9fYykgX19jb25zdGFudChfX2MpOworCitleHRlcm4gX19BVFRSU19vIHZlY3RvciBzaWduZWQgaW50Cit2ZWNfcmxfbWFzayh2ZWN0b3Igc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iLAorICAgICAgICAgICAgdW5zaWduZWQgY2hhciBfX2MpIF9fY29uc3RhbnQoX19jKTsKKworZXh0ZXJuIF9fQVRUUlNfbyB2ZWN0b3IgdW5zaWduZWQgaW50Cit2ZWNfcmxfbWFzayh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IsCisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIF9fYykgX19jb25zdGFudChfX2MpOworCitleHRlcm4gX19BVFRSU19vIHZlY3RvciBzaWduZWQgbG9uZyBsb25nCit2ZWNfcmxfbWFzayh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iLAorICAgICAgICAgICAgdW5zaWduZWQgY2hhciBfX2MpIF9fY29uc3RhbnQoX19jKTsKKworZXh0ZXJuIF9fQVRUUlNfbyB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nCit2ZWNfcmxfbWFzayh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IsCisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIF9fYykgX19jb25zdGFudChfX2MpOworCisjZGVmaW5lIHZlY19ybF9tYXNrKFgsIFksIFopICgoX190eXBlb2ZfXygodmVjX3JsX21hc2spKChYKSwgKFkpLCAoWikpKSkgXAorICBfX2V4dGVuc2lvbl9fICh7IFwKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX3JlczsgXAorICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9feCA9ICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoWCk7IFwKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX3kgPSAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKFkpOyBcCisgICAgc3dpdGNoIChzaXplb2YgKChYKVswXSkpIHsgXAorICAgIGNhc2UgMTogX19yZXMgPSAodmVjdG9yIHVuc2lnbmVkIGNoYXIpIF9fYnVpbHRpbl9zMzkwX3ZlcmltYiggXAorICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX3gsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX3gsIFwKKyAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX195LCAoWikpOyBicmVhazsgXAorICAgIGNhc2UgMjogX19yZXMgPSAodmVjdG9yIHVuc2lnbmVkIGNoYXIpIF9fYnVpbHRpbl9zMzkwX3ZlcmltaCggXAorICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX194LCAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9feCwgXAorICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX195LCAoWikpOyBicmVhazsgXAorICAgIGNhc2UgNDogX19yZXMgPSAodmVjdG9yIHVuc2lnbmVkIGNoYXIpIF9fYnVpbHRpbl9zMzkwX3ZlcmltZiggXAorICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgaW50KV9feCwgKHZlY3RvciB1bnNpZ25lZCBpbnQpX194LCBcCisgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBpbnQpX195LCAoWikpOyBicmVhazsgXAorICAgIGRlZmF1bHQ6IF9fcmVzID0gKHZlY3RvciB1bnNpZ25lZCBjaGFyKSBfX2J1aWx0aW5fczM5MF92ZXJpbWcoIFwKKyAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX3gsICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9feCwgXAorICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9feSwgKFopKTsgYnJlYWs7IFwKKyAgICB9IF9fcmVzOyB9KSkKKworLyotLSB2ZWNfc2xsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGNoYXIKK3ZlY19zbGwodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYnVpbHRpbl9zMzkwX3ZzbCgKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGNoYXIKK3ZlY19zbGwodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgY2hhcilfX2J1aWx0aW5fczM5MF92c2woCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgY2hhcgordmVjX3NsbCh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgY2hhcilfX2J1aWx0aW5fczM5MF92c2woCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIGNoYXIKK3ZlY19zbGwodmVjdG9yIGJvb2wgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIGNoYXIpX19idWlsdGluX3MzOTBfdnNsKAorICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIGNoYXIKK3ZlY19zbGwodmVjdG9yIGJvb2wgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBjaGFyKV9fYnVpbHRpbl9zMzkwX3ZzbCgKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgY2hhcgordmVjX3NsbCh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBjaGFyKV9fYnVpbHRpbl9zMzkwX3ZzbCgKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGNoYXIKK3ZlY19zbGwodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZzbChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBjaGFyCit2ZWNfc2xsKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdnNsKF9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBjaGFyCit2ZWNfc2xsKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZzbChfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIHNob3J0Cit2ZWNfc2xsKHZlY3RvciBzaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIHNob3J0KV9fYnVpbHRpbl9zMzkwX3ZzbCgKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIHNob3J0Cit2ZWNfc2xsKHZlY3RvciBzaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBzaG9ydClfX2J1aWx0aW5fczM5MF92c2woCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgc2hvcnQKK3ZlY19zbGwodmVjdG9yIHNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBzaG9ydClfX2J1aWx0aW5fczM5MF92c2woCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIHNob3J0Cit2ZWNfc2xsKHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgc2hvcnQpX19idWlsdGluX3MzOTBfdnNsKAorICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIHNob3J0Cit2ZWNfc2xsKHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIHNob3J0KV9fYnVpbHRpbl9zMzkwX3ZzbCgKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgc2hvcnQKK3ZlY19zbGwodmVjdG9yIGJvb2wgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIHNob3J0KV9fYnVpbHRpbl9zMzkwX3ZzbCgKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIHNob3J0Cit2ZWNfc2xsKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2J1aWx0aW5fczM5MF92c2woCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIHNob3J0Cit2ZWNfc2xsKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19idWlsdGluX3MzOTBfdnNsKAorICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgc2hvcnQKK3ZlY19zbGwodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19idWlsdGluX3MzOTBfdnNsKAorICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGludAordmVjX3NsbCh2ZWN0b3Igc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgaW50KV9fYnVpbHRpbl9zMzkwX3ZzbCgKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGludAordmVjX3NsbCh2ZWN0b3Igc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGludClfX2J1aWx0aW5fczM5MF92c2woCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgaW50Cit2ZWNfc2xsKHZlY3RvciBzaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGludClfX2J1aWx0aW5fczM5MF92c2woCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIGludAordmVjX3NsbCh2ZWN0b3IgYm9vbCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBpbnQpX19idWlsdGluX3MzOTBfdnNsKAorICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIGludAordmVjX3NsbCh2ZWN0b3IgYm9vbCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgaW50KV9fYnVpbHRpbl9zMzkwX3ZzbCgKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgaW50Cit2ZWNfc2xsKHZlY3RvciBib29sIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgaW50KV9fYnVpbHRpbl9zMzkwX3ZzbCgKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGludAordmVjX3NsbCh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGludClfX2J1aWx0aW5fczM5MF92c2woCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGludAordmVjX3NsbCh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBpbnQpX19idWlsdGluX3MzOTBfdnNsKAorICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgaW50Cit2ZWNfc2xsKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBpbnQpX19idWlsdGluX3MzOTBfdnNsKAorICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZwordmVjX3NsbCh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYnVpbHRpbl9zMzkwX3ZzbCgKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZwordmVjX3NsbCh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZylfX2J1aWx0aW5fczM5MF92c2woCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgbG9uZyBsb25nCit2ZWNfc2xsKHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZylfX2J1aWx0aW5fczM5MF92c2woCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIGxvbmcgbG9uZwordmVjX3NsbCh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBsb25nIGxvbmcpX19idWlsdGluX3MzOTBfdnNsKAorICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIGxvbmcgbG9uZwordmVjX3NsbCh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgbG9uZyBsb25nKV9fYnVpbHRpbl9zMzkwX3ZzbCgKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgbG9uZyBsb25nCit2ZWNfc2xsKHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgbG9uZyBsb25nKV9fYnVpbHRpbl9zMzkwX3ZzbCgKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZwordmVjX3NsbCh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2J1aWx0aW5fczM5MF92c2woCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZwordmVjX3NsbCh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19idWlsdGluX3MzOTBfdnNsKAorICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nCit2ZWNfc2xsKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19idWlsdGluX3MzOTBfdnNsKAorICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IpOworfQorCisvKi0tIHZlY19zbGIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgY2hhcgordmVjX3NsYih2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYnVpbHRpbl9zMzkwX3ZzbGIoCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgY2hhcgordmVjX3NsYih2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGNoYXIpX19idWlsdGluX3MzOTBfdnNsYigKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgY2hhcgordmVjX3NsYih2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZzbGIoX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGNoYXIKK3ZlY19zbGIodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZzbGIoX19hLCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIHNob3J0Cit2ZWNfc2xiKHZlY3RvciBzaWduZWQgc2hvcnQgX19hLCB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgc2hvcnQpX19idWlsdGluX3MzOTBfdnNsYigKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBzaG9ydAordmVjX3NsYih2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgc2hvcnQpX19idWlsdGluX3MzOTBfdnNsYigKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIHNob3J0Cit2ZWNfc2xiKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBzaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYnVpbHRpbl9zMzkwX3ZzbGIoCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBzaG9ydAordmVjX3NsYih2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYnVpbHRpbl9zMzkwX3ZzbGIoCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgaW50Cit2ZWNfc2xiKHZlY3RvciBzaWduZWQgaW50IF9fYSwgdmVjdG9yIHNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBpbnQpX19idWlsdGluX3MzOTBfdnNsYigKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBpbnQKK3ZlY19zbGIodmVjdG9yIHNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgaW50KV9fYnVpbHRpbl9zMzkwX3ZzbGIoCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBpbnQKK3ZlY19zbGIodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciBzaWduZWQgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBpbnQpX19idWlsdGluX3MzOTBfdnNsYigKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGludAordmVjX3NsYih2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYnVpbHRpbl9zMzkwX3ZzbGIoCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgbG9uZyBsb25nCit2ZWNfc2xiKHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpX19idWlsdGluX3MzOTBfdnNsYigKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcKK3ZlY19zbGIodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYnVpbHRpbl9zMzkwX3ZzbGIoCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcKK3ZlY19zbGIodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcpX19idWlsdGluX3MzOTBfdnNsYigKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZwordmVjX3NsYih2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYnVpbHRpbl9zMzkwX3ZzbGIoCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBkb3VibGUKK3ZlY19zbGIodmVjdG9yIGRvdWJsZSBfX2EsIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gKHZlY3RvciBkb3VibGUpX19idWlsdGluX3MzOTBfdnNsYigKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGRvdWJsZQordmVjX3NsYih2ZWN0b3IgZG91YmxlIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgZG91YmxlKV9fYnVpbHRpbl9zMzkwX3ZzbGIoCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKKy8qLS0gdmVjX3NsZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworZXh0ZXJuIF9fQVRUUlNfbyB2ZWN0b3Igc2lnbmVkIGNoYXIKK3ZlY19zbGQodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYiwgaW50IF9fYykKKyAgX19jb25zdGFudF9yYW5nZShfX2MsIDAsIDE1KTsKKworZXh0ZXJuIF9fQVRUUlNfbyB2ZWN0b3IgdW5zaWduZWQgY2hhcgordmVjX3NsZCh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYiwgaW50IF9fYykKKyAgX19jb25zdGFudF9yYW5nZShfX2MsIDAsIDE1KTsKKworZXh0ZXJuIF9fQVRUUlNfbyB2ZWN0b3Igc2lnbmVkIHNob3J0Cit2ZWNfc2xkKHZlY3RvciBzaWduZWQgc2hvcnQgX19hLCB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYiwgaW50IF9fYykKKyAgX19jb25zdGFudF9yYW5nZShfX2MsIDAsIDE1KTsKKworZXh0ZXJuIF9fQVRUUlNfbyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQKK3ZlY19zbGQodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYiwgaW50IF9fYykKKyAgX19jb25zdGFudF9yYW5nZShfX2MsIDAsIDE1KTsKKworZXh0ZXJuIF9fQVRUUlNfbyB2ZWN0b3Igc2lnbmVkIGludAordmVjX3NsZCh2ZWN0b3Igc2lnbmVkIGludCBfX2EsIHZlY3RvciBzaWduZWQgaW50IF9fYiwgaW50IF9fYykKKyAgX19jb25zdGFudF9yYW5nZShfX2MsIDAsIDE1KTsKKworZXh0ZXJuIF9fQVRUUlNfbyB2ZWN0b3IgdW5zaWduZWQgaW50Cit2ZWNfc2xkKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYiwgaW50IF9fYykKKyAgX19jb25zdGFudF9yYW5nZShfX2MsIDAsIDE1KTsKKworZXh0ZXJuIF9fQVRUUlNfbyB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZwordmVjX3NsZCh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYiwgaW50IF9fYykKKyAgX19jb25zdGFudF9yYW5nZShfX2MsIDAsIDE1KTsKKworZXh0ZXJuIF9fQVRUUlNfbyB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nCit2ZWNfc2xkKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYiwgaW50IF9fYykKKyAgX19jb25zdGFudF9yYW5nZShfX2MsIDAsIDE1KTsKKworZXh0ZXJuIF9fQVRUUlNfbyB2ZWN0b3IgZG91YmxlCit2ZWNfc2xkKHZlY3RvciBkb3VibGUgX19hLCB2ZWN0b3IgZG91YmxlIF9fYiwgaW50IF9fYykKKyAgX19jb25zdGFudF9yYW5nZShfX2MsIDAsIDE1KTsKKworI2RlZmluZSB2ZWNfc2xkKFgsIFksIFopICgoX190eXBlb2ZfXygodmVjX3NsZCkoKFgpLCAoWSksIChaKSkpKSBcCisgIF9fYnVpbHRpbl9zMzkwX3ZzbGRiKCh2ZWN0b3IgdW5zaWduZWQgY2hhcikoWCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKShZKSwgKFopKSkKKworLyotLSB2ZWNfc2xkdyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitleHRlcm4gX19BVFRSU19vIHZlY3RvciBzaWduZWQgY2hhcgordmVjX3NsZHcodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYiwgaW50IF9fYykKKyAgX19jb25zdGFudF9yYW5nZShfX2MsIDAsIDMpOworCitleHRlcm4gX19BVFRSU19vIHZlY3RvciB1bnNpZ25lZCBjaGFyCit2ZWNfc2xkdyh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYiwgaW50IF9fYykKKyAgX19jb25zdGFudF9yYW5nZShfX2MsIDAsIDMpOworCitleHRlcm4gX19BVFRSU19vIHZlY3RvciBzaWduZWQgc2hvcnQKK3ZlY19zbGR3KHZlY3RvciBzaWduZWQgc2hvcnQgX19hLCB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYiwgaW50IF9fYykKKyAgX19jb25zdGFudF9yYW5nZShfX2MsIDAsIDMpOworCitleHRlcm4gX19BVFRSU19vIHZlY3RvciB1bnNpZ25lZCBzaG9ydAordmVjX3NsZHcodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYiwgaW50IF9fYykKKyAgX19jb25zdGFudF9yYW5nZShfX2MsIDAsIDMpOworCitleHRlcm4gX19BVFRSU19vIHZlY3RvciBzaWduZWQgaW50Cit2ZWNfc2xkdyh2ZWN0b3Igc2lnbmVkIGludCBfX2EsIHZlY3RvciBzaWduZWQgaW50IF9fYiwgaW50IF9fYykKKyAgX19jb25zdGFudF9yYW5nZShfX2MsIDAsIDMpOworCitleHRlcm4gX19BVFRSU19vIHZlY3RvciB1bnNpZ25lZCBpbnQKK3ZlY19zbGR3KHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYiwgaW50IF9fYykKKyAgX19jb25zdGFudF9yYW5nZShfX2MsIDAsIDMpOworCitleHRlcm4gX19BVFRSU19vIHZlY3RvciBzaWduZWQgbG9uZyBsb25nCit2ZWNfc2xkdyh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYiwgaW50IF9fYykKKyAgX19jb25zdGFudF9yYW5nZShfX2MsIDAsIDMpOworCitleHRlcm4gX19BVFRSU19vIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcKK3ZlY19zbGR3KHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYiwgaW50IF9fYykKKyAgX19jb25zdGFudF9yYW5nZShfX2MsIDAsIDMpOworCitleHRlcm4gX19BVFRSU19vIHZlY3RvciBkb3VibGUKK3ZlY19zbGR3KHZlY3RvciBkb3VibGUgX19hLCB2ZWN0b3IgZG91YmxlIF9fYiwgaW50IF9fYykKKyAgX19jb25zdGFudF9yYW5nZShfX2MsIDAsIDMpOworCisjZGVmaW5lIHZlY19zbGR3KFgsIFksIFopICgoX190eXBlb2ZfXygodmVjX3NsZHcpKChYKSwgKFkpLCAoWikpKSkgXAorICBfX2J1aWx0aW5fczM5MF92c2xkYigodmVjdG9yIHVuc2lnbmVkIGNoYXIpKFgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoWSksIChaKSAqIDQpKQorCisvKi0tIHZlY19zcmFsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgY2hhcgordmVjX3NyYWwodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYnVpbHRpbl9zMzkwX3ZzcmEoCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBjaGFyCit2ZWNfc3JhbCh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYnVpbHRpbl9zMzkwX3ZzcmEoCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgY2hhcgordmVjX3NyYWwodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGNoYXIpX19idWlsdGluX3MzOTBfdnNyYSgKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgY2hhcgordmVjX3NyYWwodmVjdG9yIGJvb2wgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIGNoYXIpX19idWlsdGluX3MzOTBfdnNyYSgKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBjaGFyCit2ZWNfc3JhbCh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIGNoYXIpX19idWlsdGluX3MzOTBfdnNyYSgKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgY2hhcgordmVjX3NyYWwodmVjdG9yIGJvb2wgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgY2hhcilfX2J1aWx0aW5fczM5MF92c3JhKAorICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgY2hhcgordmVjX3NyYWwodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZzcmEoX19hLCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgY2hhcgordmVjX3NyYWwodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92c3JhKF9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBjaGFyCit2ZWNfc3JhbCh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92c3JhKF9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgc2hvcnQKK3ZlY19zcmFsKHZlY3RvciBzaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIHNob3J0KV9fYnVpbHRpbl9zMzkwX3ZzcmEoCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBzaG9ydAordmVjX3NyYWwodmVjdG9yIHNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIHNob3J0KV9fYnVpbHRpbl9zMzkwX3ZzcmEoCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgc2hvcnQKK3ZlY19zcmFsKHZlY3RvciBzaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgc2hvcnQpX19idWlsdGluX3MzOTBfdnNyYSgKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgc2hvcnQKK3ZlY19zcmFsKHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgc2hvcnQpX19idWlsdGluX3MzOTBfdnNyYSgKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBzaG9ydAordmVjX3NyYWwodmVjdG9yIGJvb2wgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgc2hvcnQpX19idWlsdGluX3MzOTBfdnNyYSgKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgc2hvcnQKK3ZlY19zcmFsKHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBzaG9ydClfX2J1aWx0aW5fczM5MF92c3JhKAorICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgc2hvcnQKK3ZlY19zcmFsKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2J1aWx0aW5fczM5MF92c3JhKAorICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBzaG9ydAordmVjX3NyYWwodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2J1aWx0aW5fczM5MF92c3JhKAorICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgc2hvcnQKK3ZlY19zcmFsKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYnVpbHRpbl9zMzkwX3ZzcmEoCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgaW50Cit2ZWNfc3JhbCh2ZWN0b3Igc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgaW50KV9fYnVpbHRpbl9zMzkwX3ZzcmEoCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBpbnQKK3ZlY19zcmFsKHZlY3RvciBzaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgaW50KV9fYnVpbHRpbl9zMzkwX3ZzcmEoCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgaW50Cit2ZWNfc3JhbCh2ZWN0b3Igc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBpbnQpX19idWlsdGluX3MzOTBfdnNyYSgKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgaW50Cit2ZWNfc3JhbCh2ZWN0b3IgYm9vbCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBpbnQpX19idWlsdGluX3MzOTBfdnNyYSgKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBpbnQKK3ZlY19zcmFsKHZlY3RvciBib29sIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBpbnQpX19idWlsdGluX3MzOTBfdnNyYSgKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgaW50Cit2ZWNfc3JhbCh2ZWN0b3IgYm9vbCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIGludClfX2J1aWx0aW5fczM5MF92c3JhKAorICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgaW50Cit2ZWNfc3JhbCh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGludClfX2J1aWx0aW5fczM5MF92c3JhKAorICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBpbnQKK3ZlY19zcmFsKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGludClfX2J1aWx0aW5fczM5MF92c3JhKAorICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgaW50Cit2ZWNfc3JhbCh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYnVpbHRpbl9zMzkwX3ZzcmEoCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgbG9uZyBsb25nCit2ZWNfc3JhbCh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYnVpbHRpbl9zMzkwX3ZzcmEoCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcKK3ZlY19zcmFsKHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYnVpbHRpbl9zMzkwX3ZzcmEoCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgbG9uZyBsb25nCit2ZWNfc3JhbCh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpX19idWlsdGluX3MzOTBfdnNyYSgKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgbG9uZyBsb25nCit2ZWNfc3JhbCh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBsb25nIGxvbmcpX19idWlsdGluX3MzOTBfdnNyYSgKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBsb25nIGxvbmcKK3ZlY19zcmFsKHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBsb25nIGxvbmcpX19idWlsdGluX3MzOTBfdnNyYSgKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgbG9uZyBsb25nCit2ZWNfc3JhbCh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIGxvbmcgbG9uZylfX2J1aWx0aW5fczM5MF92c3JhKAorICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nCit2ZWNfc3JhbCh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2J1aWx0aW5fczM5MF92c3JhKAorICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcKK3ZlY19zcmFsKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2J1aWx0aW5fczM5MF92c3JhKAorICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nCit2ZWNfc3JhbCh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYnVpbHRpbl9zMzkwX3ZzcmEoCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKKy8qLS0gdmVjX3NyYWIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBjaGFyCit2ZWNfc3JhYih2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYnVpbHRpbl9zMzkwX3ZzcmFiKAorICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGNoYXIKK3ZlY19zcmFiKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgY2hhcilfX2J1aWx0aW5fczM5MF92c3JhYigKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgY2hhcgordmVjX3NyYWIodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92c3JhYihfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgY2hhcgordmVjX3NyYWIodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZzcmFiKF9fYSwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBzaG9ydAordmVjX3NyYWIodmVjdG9yIHNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBzaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBzaG9ydClfX2J1aWx0aW5fczM5MF92c3JhYigKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBzaG9ydAordmVjX3NyYWIodmVjdG9yIHNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIHNob3J0KV9fYnVpbHRpbl9zMzkwX3ZzcmFiKAorICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgc2hvcnQKK3ZlY19zcmFiKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBzaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYnVpbHRpbl9zMzkwX3ZzcmFiKAorICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgc2hvcnQKK3ZlY19zcmFiKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19idWlsdGluX3MzOTBfdnNyYWIoCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgaW50Cit2ZWNfc3JhYih2ZWN0b3Igc2lnbmVkIGludCBfX2EsIHZlY3RvciBzaWduZWQgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgaW50KV9fYnVpbHRpbl9zMzkwX3ZzcmFiKAorICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGludAordmVjX3NyYWIodmVjdG9yIHNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgaW50KV9fYnVpbHRpbl9zMzkwX3ZzcmFiKAorICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgaW50Cit2ZWNfc3JhYih2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGludClfX2J1aWx0aW5fczM5MF92c3JhYigKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGludAordmVjX3NyYWIodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGludClfX2J1aWx0aW5fczM5MF92c3JhYigKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcKK3ZlY19zcmFiKHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpX19idWlsdGluX3MzOTBfdnNyYWIoCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgbG9uZyBsb25nCit2ZWNfc3JhYih2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpX19idWlsdGluX3MzOTBfdnNyYWIoCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcKK3ZlY19zcmFiKHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYnVpbHRpbl9zMzkwX3ZzcmFiKAorICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nCit2ZWNfc3JhYih2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYnVpbHRpbl9zMzkwX3ZzcmFiKAorICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgZG91YmxlCit2ZWNfc3JhYih2ZWN0b3IgZG91YmxlIF9fYSwgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGRvdWJsZSlfX2J1aWx0aW5fczM5MF92c3JhYigKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGRvdWJsZQordmVjX3NyYWIodmVjdG9yIGRvdWJsZSBfX2EsIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGRvdWJsZSlfX2J1aWx0aW5fczM5MF92c3JhYigKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworLyotLSB2ZWNfc3JsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGNoYXIKK3ZlY19zcmwodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYnVpbHRpbl9zMzkwX3ZzcmwoCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBjaGFyCit2ZWNfc3JsKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGNoYXIpX19idWlsdGluX3MzOTBfdnNybCgKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBjaGFyCit2ZWNfc3JsKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYnVpbHRpbl9zMzkwX3ZzcmwoCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIGNoYXIKK3ZlY19zcmwodmVjdG9yIGJvb2wgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIGNoYXIpX19idWlsdGluX3MzOTBfdnNybCgKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBjaGFyCit2ZWNfc3JsKHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgY2hhcilfX2J1aWx0aW5fczM5MF92c3JsKAorICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBjaGFyCit2ZWNfc3JsKHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIGNoYXIpX19idWlsdGluX3MzOTBfdnNybCgKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGNoYXIKK3ZlY19zcmwodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZzcmwoX19hLCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgY2hhcgordmVjX3NybCh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZzcmwoX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGNoYXIKK3ZlY19zcmwodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdnNybChfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIHNob3J0Cit2ZWNfc3JsKHZlY3RvciBzaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIHNob3J0KV9fYnVpbHRpbl9zMzkwX3ZzcmwoCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBzaG9ydAordmVjX3NybCh2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgc2hvcnQpX19idWlsdGluX3MzOTBfdnNybCgKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBzaG9ydAordmVjX3NybCh2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIHNob3J0KV9fYnVpbHRpbl9zMzkwX3ZzcmwoCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIHNob3J0Cit2ZWNfc3JsKHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgc2hvcnQpX19idWlsdGluX3MzOTBfdnNybCgKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBzaG9ydAordmVjX3NybCh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBzaG9ydClfX2J1aWx0aW5fczM5MF92c3JsKAorICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBzaG9ydAordmVjX3NybCh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgc2hvcnQpX19idWlsdGluX3MzOTBfdnNybCgKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIHNob3J0Cit2ZWNfc3JsKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2J1aWx0aW5fczM5MF92c3JsKAorICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBzaG9ydAordmVjX3NybCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYnVpbHRpbl9zMzkwX3ZzcmwoCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBzaG9ydAordmVjX3NybCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2J1aWx0aW5fczM5MF92c3JsKAorICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGludAordmVjX3NybCh2ZWN0b3Igc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgaW50KV9fYnVpbHRpbl9zMzkwX3ZzcmwoCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBpbnQKK3ZlY19zcmwodmVjdG9yIHNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBpbnQpX19idWlsdGluX3MzOTBfdnNybCgKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBpbnQKK3ZlY19zcmwodmVjdG9yIHNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgaW50KV9fYnVpbHRpbl9zMzkwX3ZzcmwoCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIGludAordmVjX3NybCh2ZWN0b3IgYm9vbCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBpbnQpX19idWlsdGluX3MzOTBfdnNybCgKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBpbnQKK3ZlY19zcmwodmVjdG9yIGJvb2wgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIGludClfX2J1aWx0aW5fczM5MF92c3JsKAorICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBpbnQKK3ZlY19zcmwodmVjdG9yIGJvb2wgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBpbnQpX19idWlsdGluX3MzOTBfdnNybCgKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGludAordmVjX3NybCh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGludClfX2J1aWx0aW5fczM5MF92c3JsKAorICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBpbnQKK3ZlY19zcmwodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYnVpbHRpbl9zMzkwX3ZzcmwoCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBpbnQKK3ZlY19zcmwodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGludClfX2J1aWx0aW5fczM5MF92c3JsKAorICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZwordmVjX3NybCh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYnVpbHRpbl9zMzkwX3ZzcmwoCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcKK3ZlY19zcmwodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpX19idWlsdGluX3MzOTBfdnNybCgKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcKK3ZlY19zcmwodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYnVpbHRpbl9zMzkwX3ZzcmwoCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIGxvbmcgbG9uZwordmVjX3NybCh2ZWN0b3IgYm9vbCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBsb25nIGxvbmcpX19idWlsdGluX3MzOTBfdnNybCgKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBsb25nIGxvbmcKK3ZlY19zcmwodmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIGxvbmcgbG9uZylfX2J1aWx0aW5fczM5MF92c3JsKAorICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBsb25nIGxvbmcKK3ZlY19zcmwodmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBsb25nIGxvbmcpX19idWlsdGluX3MzOTBfdnNybCgKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZwordmVjX3NybCh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2J1aWx0aW5fczM5MF92c3JsKAorICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcKK3ZlY19zcmwodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYnVpbHRpbl9zMzkwX3ZzcmwoCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcKK3ZlY19zcmwodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2J1aWx0aW5fczM5MF92c3JsKAorICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IpOworfQorCisvKi0tIHZlY19zcmIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgY2hhcgordmVjX3NyYih2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYnVpbHRpbl9zMzkwX3ZzcmxiKAorICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGNoYXIKK3ZlY19zcmIodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYnVpbHRpbl9zMzkwX3ZzcmxiKAorICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBjaGFyCit2ZWNfc3JiKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdnNybGIoX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGNoYXIKK3ZlY19zcmIodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZzcmxiKF9fYSwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBzaG9ydAordmVjX3NyYih2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIHNob3J0KV9fYnVpbHRpbl9zMzkwX3ZzcmxiKAorICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIHNob3J0Cit2ZWNfc3JiKHZlY3RvciBzaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBzaG9ydClfX2J1aWx0aW5fczM5MF92c3JsYigKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIHNob3J0Cit2ZWNfc3JiKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBzaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYnVpbHRpbl9zMzkwX3ZzcmxiKAorICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgc2hvcnQKK3ZlY19zcmIodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2J1aWx0aW5fczM5MF92c3JsYigKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBpbnQKK3ZlY19zcmIodmVjdG9yIHNpZ25lZCBpbnQgX19hLCB2ZWN0b3Igc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGludClfX2J1aWx0aW5fczM5MF92c3JsYigKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBpbnQKK3ZlY19zcmIodmVjdG9yIHNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgaW50KV9fYnVpbHRpbl9zMzkwX3ZzcmxiKAorICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgaW50Cit2ZWNfc3JiKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3Igc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYnVpbHRpbl9zMzkwX3ZzcmxiKAorICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgaW50Cit2ZWNfc3JiKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciB1bnNpZ25lZCBpbnQpX19idWlsdGluX3MzOTBfdnNybGIoCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgbG9uZyBsb25nCit2ZWNfc3JiKHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpX19idWlsdGluX3MzOTBfdnNybGIoCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgbG9uZyBsb25nCit2ZWNfc3JiKHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZylfX2J1aWx0aW5fczM5MF92c3JsYigKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZwordmVjX3NyYih2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2J1aWx0aW5fczM5MF92c3JsYigKKyAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZwordmVjX3NyYih2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYnVpbHRpbl9zMzkwX3ZzcmxiKAorICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgZG91YmxlCit2ZWNfc3JiKHZlY3RvciBkb3VibGUgX19hLCB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgZG91YmxlKV9fYnVpbHRpbl9zMzkwX3ZzcmxiKAorICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgZG91YmxlCit2ZWNfc3JiKHZlY3RvciBkb3VibGUgX19hLCB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gKHZlY3RvciBkb3VibGUpX19idWlsdGluX3MzOTBfdnNybGIoCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKKy8qLS0gdmVjX2FicyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBjaGFyCit2ZWNfYWJzKHZlY3RvciBzaWduZWQgY2hhciBfX2EpIHsKKyAgcmV0dXJuIHZlY19zZWwoX19hLCAtX19hLCB2ZWNfY21wbHQoX19hLCAodmVjdG9yIHNpZ25lZCBjaGFyKTApKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBzaG9ydAordmVjX2Ficyh2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYSkgeworICByZXR1cm4gdmVjX3NlbChfX2EsIC1fX2EsIHZlY19jbXBsdChfX2EsICh2ZWN0b3Igc2lnbmVkIHNob3J0KTApKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBpbnQKK3ZlY19hYnModmVjdG9yIHNpZ25lZCBpbnQgX19hKSB7CisgIHJldHVybiB2ZWNfc2VsKF9fYSwgLV9fYSwgdmVjX2NtcGx0KF9fYSwgKHZlY3RvciBzaWduZWQgaW50KTApKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcKK3ZlY19hYnModmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hKSB7CisgIHJldHVybiB2ZWNfc2VsKF9fYSwgLV9fYSwgdmVjX2NtcGx0KF9fYSwgKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKTApKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGRvdWJsZQordmVjX2Ficyh2ZWN0b3IgZG91YmxlIF9fYSkgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmZscGRiKF9fYSk7Cit9CisKKy8qLS0gdmVjX25hYnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX2FpIHZlY3RvciBkb3VibGUKK3ZlY19uYWJzKHZlY3RvciBkb3VibGUgX19hKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92ZmxuZGIoX19hKTsKK30KKworLyotLSB2ZWNfbWF4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGNoYXIKK3ZlY19tYXgodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gdmVjX3NlbChfX2IsIF9fYSwgdmVjX2NtcGd0KF9fYSwgX19iKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgY2hhcgordmVjX21heCh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iYyA9ICh2ZWN0b3Igc2lnbmVkIGNoYXIpX19iOworICByZXR1cm4gdmVjX3NlbChfX2JjLCBfX2EsIHZlY19jbXBndChfX2EsIF9fYmMpKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBjaGFyCit2ZWNfbWF4KHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHZlY3RvciBzaWduZWQgY2hhciBfX2FjID0gKHZlY3RvciBzaWduZWQgY2hhcilfX2E7CisgIHJldHVybiB2ZWNfc2VsKF9fYiwgX19hYywgdmVjX2NtcGd0KF9fYWMsIF9fYikpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgY2hhcgordmVjX21heCh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gdmVjX3NlbChfX2IsIF9fYSwgdmVjX2NtcGd0KF9fYSwgX19iKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBjaGFyCit2ZWNfbWF4KHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iYyA9ICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2I7CisgIHJldHVybiB2ZWNfc2VsKF9fYmMsIF9fYSwgdmVjX2NtcGd0KF9fYSwgX19iYykpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgY2hhcgordmVjX21heCh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYWMgPSAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hOworICByZXR1cm4gdmVjX3NlbChfX2IsIF9fYWMsIHZlY19jbXBndChfX2FjLCBfX2IpKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBzaG9ydAordmVjX21heCh2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIHZlY19zZWwoX19iLCBfX2EsIHZlY19jbXBndChfX2EsIF9fYikpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIHNob3J0Cit2ZWNfbWF4KHZlY3RvciBzaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IpIHsKKyAgdmVjdG9yIHNpZ25lZCBzaG9ydCBfX2JjID0gKHZlY3RvciBzaWduZWQgc2hvcnQpX19iOworICByZXR1cm4gdmVjX3NlbChfX2JjLCBfX2EsIHZlY19jbXBndChfX2EsIF9fYmMpKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBzaG9ydAordmVjX21heCh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIHZlY3RvciBzaWduZWQgc2hvcnQgX19iKSB7CisgIHZlY3RvciBzaWduZWQgc2hvcnQgX19hYyA9ICh2ZWN0b3Igc2lnbmVkIHNob3J0KV9fYTsKKyAgcmV0dXJuIHZlY19zZWwoX19iLCBfX2FjLCB2ZWNfY21wZ3QoX19hYywgX19iKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBzaG9ydAordmVjX21heCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiB2ZWNfc2VsKF9fYiwgX19hLCB2ZWNfY21wZ3QoX19hLCBfX2IpKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIHNob3J0Cit2ZWNfbWF4KHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iYyA9ICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19iOworICByZXR1cm4gdmVjX3NlbChfX2JjLCBfX2EsIHZlY19jbXBndChfX2EsIF9fYmMpKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIHNob3J0Cit2ZWNfbWF4KHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hYyA9ICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19hOworICByZXR1cm4gdmVjX3NlbChfX2IsIF9fYWMsIHZlY19jbXBndChfX2FjLCBfX2IpKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBpbnQKK3ZlY19tYXgodmVjdG9yIHNpZ25lZCBpbnQgX19hLCB2ZWN0b3Igc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuIHZlY19zZWwoX19iLCBfX2EsIHZlY19jbXBndChfX2EsIF9fYikpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGludAordmVjX21heCh2ZWN0b3Igc2lnbmVkIGludCBfX2EsIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgdmVjdG9yIHNpZ25lZCBpbnQgX19iYyA9ICh2ZWN0b3Igc2lnbmVkIGludClfX2I7CisgIHJldHVybiB2ZWNfc2VsKF9fYmMsIF9fYSwgdmVjX2NtcGd0KF9fYSwgX19iYykpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGludAordmVjX21heCh2ZWN0b3IgYm9vbCBpbnQgX19hLCB2ZWN0b3Igc2lnbmVkIGludCBfX2IpIHsKKyAgdmVjdG9yIHNpZ25lZCBpbnQgX19hYyA9ICh2ZWN0b3Igc2lnbmVkIGludClfX2E7CisgIHJldHVybiB2ZWNfc2VsKF9fYiwgX19hYywgdmVjX2NtcGd0KF9fYWMsIF9fYikpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgaW50Cit2ZWNfbWF4KHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gdmVjX3NlbChfX2IsIF9fYSwgdmVjX2NtcGd0KF9fYSwgX19iKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBpbnQKK3ZlY19tYXgodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgdmVjdG9yIHVuc2lnbmVkIGludCBfX2JjID0gKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iOworICByZXR1cm4gdmVjX3NlbChfX2JjLCBfX2EsIHZlY19jbXBndChfX2EsIF9fYmMpKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGludAordmVjX21heCh2ZWN0b3IgYm9vbCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYWMgPSAodmVjdG9yIHVuc2lnbmVkIGludClfX2E7CisgIHJldHVybiB2ZWNfc2VsKF9fYiwgX19hYywgdmVjX2NtcGd0KF9fYWMsIF9fYikpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZwordmVjX21heCh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gdmVjX3NlbChfX2IsIF9fYSwgdmVjX2NtcGd0KF9fYSwgX19iKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgbG9uZyBsb25nCit2ZWNfbWF4KHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2JjID0gKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYjsKKyAgcmV0dXJuIHZlY19zZWwoX19iYywgX19hLCB2ZWNfY21wZ3QoX19hLCBfX2JjKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgbG9uZyBsb25nCit2ZWNfbWF4KHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYikgeworICB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2FjID0gKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYTsKKyAgcmV0dXJuIHZlY19zZWwoX19iLCBfX2FjLCB2ZWNfY21wZ3QoX19hYywgX19iKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcKK3ZlY19tYXgodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiB2ZWNfc2VsKF9fYiwgX19hLCB2ZWNfY21wZ3QoX19hLCBfX2IpKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZwordmVjX21heCh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYmMgPSAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2I7CisgIHJldHVybiB2ZWNfc2VsKF9fYmMsIF9fYSwgdmVjX2NtcGd0KF9fYSwgX19iYykpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nCit2ZWNfbWF4KHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hYyA9ICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYTsKKyAgcmV0dXJuIHZlY19zZWwoX19iLCBfX2FjLCB2ZWNfY21wZ3QoX19hYywgX19iKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBkb3VibGUKK3ZlY19tYXgodmVjdG9yIGRvdWJsZSBfX2EsIHZlY3RvciBkb3VibGUgX19iKSB7CisgIHJldHVybiB2ZWNfc2VsKF9fYiwgX19hLCB2ZWNfY21wZ3QoX19hLCBfX2IpKTsKK30KKworLyotLSB2ZWNfbWluIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGNoYXIKK3ZlY19taW4odmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gdmVjX3NlbChfX2EsIF9fYiwgdmVjX2NtcGd0KF9fYSwgX19iKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgY2hhcgordmVjX21pbih2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iYyA9ICh2ZWN0b3Igc2lnbmVkIGNoYXIpX19iOworICByZXR1cm4gdmVjX3NlbChfX2EsIF9fYmMsIHZlY19jbXBndChfX2EsIF9fYmMpKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBjaGFyCit2ZWNfbWluKHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHZlY3RvciBzaWduZWQgY2hhciBfX2FjID0gKHZlY3RvciBzaWduZWQgY2hhcilfX2E7CisgIHJldHVybiB2ZWNfc2VsKF9fYWMsIF9fYiwgdmVjX2NtcGd0KF9fYWMsIF9fYikpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgY2hhcgordmVjX21pbih2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gdmVjX3NlbChfX2EsIF9fYiwgdmVjX2NtcGd0KF9fYSwgX19iKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBjaGFyCit2ZWNfbWluKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iYyA9ICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2I7CisgIHJldHVybiB2ZWNfc2VsKF9fYSwgX19iYywgdmVjX2NtcGd0KF9fYSwgX19iYykpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgY2hhcgordmVjX21pbih2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYWMgPSAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hOworICByZXR1cm4gdmVjX3NlbChfX2FjLCBfX2IsIHZlY19jbXBndChfX2FjLCBfX2IpKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBzaG9ydAordmVjX21pbih2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIHZlY19zZWwoX19hLCBfX2IsIHZlY19jbXBndChfX2EsIF9fYikpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIHNob3J0Cit2ZWNfbWluKHZlY3RvciBzaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IpIHsKKyAgdmVjdG9yIHNpZ25lZCBzaG9ydCBfX2JjID0gKHZlY3RvciBzaWduZWQgc2hvcnQpX19iOworICByZXR1cm4gdmVjX3NlbChfX2EsIF9fYmMsIHZlY19jbXBndChfX2EsIF9fYmMpKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBzaG9ydAordmVjX21pbih2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIHZlY3RvciBzaWduZWQgc2hvcnQgX19iKSB7CisgIHZlY3RvciBzaWduZWQgc2hvcnQgX19hYyA9ICh2ZWN0b3Igc2lnbmVkIHNob3J0KV9fYTsKKyAgcmV0dXJuIHZlY19zZWwoX19hYywgX19iLCB2ZWNfY21wZ3QoX19hYywgX19iKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBzaG9ydAordmVjX21pbih2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiB2ZWNfc2VsKF9fYSwgX19iLCB2ZWNfY21wZ3QoX19hLCBfX2IpKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIHNob3J0Cit2ZWNfbWluKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iYyA9ICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19iOworICByZXR1cm4gdmVjX3NlbChfX2EsIF9fYmMsIHZlY19jbXBndChfX2EsIF9fYmMpKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIHNob3J0Cit2ZWNfbWluKHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hYyA9ICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19hOworICByZXR1cm4gdmVjX3NlbChfX2FjLCBfX2IsIHZlY19jbXBndChfX2FjLCBfX2IpKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBpbnQKK3ZlY19taW4odmVjdG9yIHNpZ25lZCBpbnQgX19hLCB2ZWN0b3Igc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuIHZlY19zZWwoX19hLCBfX2IsIHZlY19jbXBndChfX2EsIF9fYikpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGludAordmVjX21pbih2ZWN0b3Igc2lnbmVkIGludCBfX2EsIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgdmVjdG9yIHNpZ25lZCBpbnQgX19iYyA9ICh2ZWN0b3Igc2lnbmVkIGludClfX2I7CisgIHJldHVybiB2ZWNfc2VsKF9fYSwgX19iYywgdmVjX2NtcGd0KF9fYSwgX19iYykpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGludAordmVjX21pbih2ZWN0b3IgYm9vbCBpbnQgX19hLCB2ZWN0b3Igc2lnbmVkIGludCBfX2IpIHsKKyAgdmVjdG9yIHNpZ25lZCBpbnQgX19hYyA9ICh2ZWN0b3Igc2lnbmVkIGludClfX2E7CisgIHJldHVybiB2ZWNfc2VsKF9fYWMsIF9fYiwgdmVjX2NtcGd0KF9fYWMsIF9fYikpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgaW50Cit2ZWNfbWluKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gdmVjX3NlbChfX2EsIF9fYiwgdmVjX2NtcGd0KF9fYSwgX19iKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBpbnQKK3ZlY19taW4odmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgdmVjdG9yIHVuc2lnbmVkIGludCBfX2JjID0gKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iOworICByZXR1cm4gdmVjX3NlbChfX2EsIF9fYmMsIHZlY19jbXBndChfX2EsIF9fYmMpKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGludAordmVjX21pbih2ZWN0b3IgYm9vbCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYWMgPSAodmVjdG9yIHVuc2lnbmVkIGludClfX2E7CisgIHJldHVybiB2ZWNfc2VsKF9fYWMsIF9fYiwgdmVjX2NtcGd0KF9fYWMsIF9fYikpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZwordmVjX21pbih2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gdmVjX3NlbChfX2EsIF9fYiwgdmVjX2NtcGd0KF9fYSwgX19iKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgbG9uZyBsb25nCit2ZWNfbWluKHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2JjID0gKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYjsKKyAgcmV0dXJuIHZlY19zZWwoX19hLCBfX2JjLCB2ZWNfY21wZ3QoX19hLCBfX2JjKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgbG9uZyBsb25nCit2ZWNfbWluKHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYikgeworICB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2FjID0gKHZlY3RvciBzaWduZWQgbG9uZyBsb25nKV9fYTsKKyAgcmV0dXJuIHZlY19zZWwoX19hYywgX19iLCB2ZWNfY21wZ3QoX19hYywgX19iKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcKK3ZlY19taW4odmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiB2ZWNfc2VsKF9fYSwgX19iLCB2ZWNfY21wZ3QoX19hLCBfX2IpKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZwordmVjX21pbih2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIGJvb2wgbG9uZyBsb25nIF9fYikgeworICB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYmMgPSAodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZylfX2I7CisgIHJldHVybiB2ZWNfc2VsKF9fYSwgX19iYywgdmVjX2NtcGd0KF9fYSwgX19iYykpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nCit2ZWNfbWluKHZlY3RvciBib29sIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hYyA9ICh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKV9fYTsKKyAgcmV0dXJuIHZlY19zZWwoX19hYywgX19iLCB2ZWNfY21wZ3QoX19hYywgX19iKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBkb3VibGUKK3ZlY19taW4odmVjdG9yIGRvdWJsZSBfX2EsIHZlY3RvciBkb3VibGUgX19iKSB7CisgIHJldHVybiB2ZWNfc2VsKF9fYSwgX19iLCB2ZWNfY21wZ3QoX19hLCBfX2IpKTsKK30KKworLyotLSB2ZWNfYWRkX3UxMjggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfYWkgdmVjdG9yIHVuc2lnbmVkIGNoYXIKK3ZlY19hZGRfdTEyOCh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmFxKF9fYSwgX19iKTsKK30KKworLyotLSB2ZWNfYWRkYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgY2hhcgordmVjX2FkZGModmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZhY2NiKF9fYSwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIHNob3J0Cit2ZWNfYWRkYyh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92YWNjaChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBpbnQKK3ZlY19hZGRjKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmFjY2YoX19hLCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nCit2ZWNfYWRkYyh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZhY2NnKF9fYSwgX19iKTsKK30KKworLyotLSB2ZWNfYWRkY191MTI4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfYWkgdmVjdG9yIHVuc2lnbmVkIGNoYXIKK3ZlY19hZGRjX3UxMjgodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZhY2NxKF9fYSwgX19iKTsKK30KKworLyotLSB2ZWNfYWRkZV91MTI4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfYWkgdmVjdG9yIHVuc2lnbmVkIGNoYXIKK3ZlY19hZGRlX3UxMjgodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IsCisgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYykgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmFjcShfX2EsIF9fYiwgX19jKTsKK30KKworLyotLSB2ZWNfYWRkZWNfdTEyOCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfYWkgdmVjdG9yIHVuc2lnbmVkIGNoYXIKK3ZlY19hZGRlY191MTI4KHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iLAorICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19jKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92YWNjY3EoX19hLCBfX2IsIF9fYyk7Cit9CisKKy8qLS0gdmVjX2F2ZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBjaGFyCit2ZWNfYXZnKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciBzaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZhdmdiKF9fYSwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBzaG9ydAordmVjX2F2Zyh2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZhdmdoKF9fYSwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBpbnQKK3ZlY19hdmcodmVjdG9yIHNpZ25lZCBpbnQgX19hLCB2ZWN0b3Igc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZhdmdmKF9fYSwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcKK3ZlY19hdmcodmVjdG9yIHNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZhdmdnKF9fYSwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGNoYXIKK3ZlY19hdmcodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZhdmdsYihfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBzaG9ydAordmVjX2F2Zyh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92YXZnbGgoX19hLCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgaW50Cit2ZWNfYXZnKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmF2Z2xmKF9fYSwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZwordmVjX2F2Zyh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZhdmdsZyhfX2EsIF9fYik7Cit9CisKKy8qLS0gdmVjX2NoZWNrc3VtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX2FpIHZlY3RvciB1bnNpZ25lZCBpbnQKK3ZlY19jaGVja3N1bSh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3Zja3NtKF9fYSwgX19iKTsKK30KKworLyotLSB2ZWNfZ2Ztc3VtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgc2hvcnQKK3ZlY19nZm1zdW0odmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZnZm1iKF9fYSwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGludAordmVjX2dmbXN1bSh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92Z2ZtaChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcKK3ZlY19nZm1zdW0odmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92Z2ZtZihfX2EsIF9fYik7Cit9CisKKy8qLS0gdmVjX2dmbXN1bV8xMjggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGNoYXIKK3ZlY19nZm1zdW1fMTI4KHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19hLCB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmdmbWcoX19hLCBfX2IpOworfQorCisvKi0tIHZlY19nZm1zdW1fYWNjdW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBzaG9ydAordmVjX2dmbXN1bV9hY2N1bSh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYiwKKyAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYykgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmdmbWFiKF9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgaW50Cit2ZWNfZ2Ztc3VtX2FjY3VtKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IsCisgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBpbnQgX19jKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92Z2ZtYWgoX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcKK3ZlY19nZm1zdW1fYWNjdW0odmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iLAorICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYykgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmdmbWFmKF9fYSwgX19iLCBfX2MpOworfQorCisvKi0tIHZlY19nZm1zdW1fYWNjdW1fMTI4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBjaGFyCit2ZWNfZ2Ztc3VtX2FjY3VtXzEyOCh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iLAorICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19jKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92Z2ZtYWcoX19hLCBfX2IsIF9fYyk7Cit9CisKKy8qLS0gdmVjX21sYWRkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBjaGFyCit2ZWNfbWxhZGQodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYiwKKyAgICAgICAgICB2ZWN0b3Igc2lnbmVkIGNoYXIgX19jKSB7CisgIHJldHVybiBfX2EgKiBfX2IgKyBfX2M7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgY2hhcgordmVjX21sYWRkKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYiwKKyAgICAgICAgICB2ZWN0b3Igc2lnbmVkIGNoYXIgX19jKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYSAqIF9fYiArIF9fYzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBjaGFyCit2ZWNfbWxhZGQodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iLAorICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYykgeworICByZXR1cm4gX19hICogKHZlY3RvciBzaWduZWQgY2hhcilfX2IgKyAodmVjdG9yIHNpZ25lZCBjaGFyKV9fYzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGNoYXIKK3ZlY19tbGFkZCh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYiwKKyAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2MpIHsKKyAgcmV0dXJuIF9fYSAqIF9fYiArIF9fYzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBzaG9ydAordmVjX21sYWRkKHZlY3RvciBzaWduZWQgc2hvcnQgX19hLCB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYiwKKyAgICAgICAgICB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYykgeworICByZXR1cm4gX19hICogX19iICsgX19jOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIHNob3J0Cit2ZWNfbWxhZGQodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHNpZ25lZCBzaG9ydCBfX2IsCisgICAgICAgICAgdmVjdG9yIHNpZ25lZCBzaG9ydCBfX2MpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIHNob3J0KV9fYSAqIF9fYiArIF9fYzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBzaG9ydAordmVjX21sYWRkKHZlY3RvciBzaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iLAorICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2MpIHsKKyAgcmV0dXJuIF9fYSAqICh2ZWN0b3Igc2lnbmVkIHNob3J0KV9fYiArICh2ZWN0b3Igc2lnbmVkIHNob3J0KV9fYzsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIHNob3J0Cit2ZWNfbWxhZGQodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYiwKKyAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19jKSB7CisgIHJldHVybiBfX2EgKiBfX2IgKyBfX2M7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgaW50Cit2ZWNfbWxhZGQodmVjdG9yIHNpZ25lZCBpbnQgX19hLCB2ZWN0b3Igc2lnbmVkIGludCBfX2IsCisgICAgICAgICAgdmVjdG9yIHNpZ25lZCBpbnQgX19jKSB7CisgIHJldHVybiBfX2EgKiBfX2IgKyBfX2M7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgaW50Cit2ZWNfbWxhZGQodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciBzaWduZWQgaW50IF9fYiwKKyAgICAgICAgICB2ZWN0b3Igc2lnbmVkIGludCBfX2MpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGludClfX2EgKiBfX2IgKyBfX2M7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgaW50Cit2ZWNfbWxhZGQodmVjdG9yIHNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYiwKKyAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYykgeworICByZXR1cm4gX19hICogKHZlY3RvciBzaWduZWQgaW50KV9fYiArICh2ZWN0b3Igc2lnbmVkIGludClfX2M7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBpbnQKK3ZlY19tbGFkZCh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IsCisgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGludCBfX2MpIHsKKyAgcmV0dXJuIF9fYSAqIF9fYiArIF9fYzsKK30KKworLyotLSB2ZWNfbWhhZGQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGNoYXIKK3ZlY19taGFkZCh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iLAorICAgICAgICAgIHZlY3RvciBzaWduZWQgY2hhciBfX2MpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZtYWhiKF9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgY2hhcgordmVjX21oYWRkKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iLAorICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYykgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdm1hbGhiKF9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIHNob3J0Cit2ZWNfbWhhZGQodmVjdG9yIHNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBzaWduZWQgc2hvcnQgX19iLAorICAgICAgICAgIHZlY3RvciBzaWduZWQgc2hvcnQgX19jKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92bWFoaChfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIHNob3J0Cit2ZWNfbWhhZGQodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYiwKKyAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19jKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92bWFsaGgoX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgaW50Cit2ZWNfbWhhZGQodmVjdG9yIHNpZ25lZCBpbnQgX19hLCB2ZWN0b3Igc2lnbmVkIGludCBfX2IsCisgICAgICAgICAgdmVjdG9yIHNpZ25lZCBpbnQgX19jKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92bWFoZihfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGludAordmVjX21oYWRkKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYiwKKyAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYykgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdm1hbGhmKF9fYSwgX19iLCBfX2MpOworfQorCisvKi0tIHZlY19tZWFkZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgc2hvcnQKK3ZlY19tZWFkZCh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iLAorICAgICAgICAgIHZlY3RvciBzaWduZWQgc2hvcnQgX19jKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92bWFlYihfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIHNob3J0Cit2ZWNfbWVhZGQodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IsCisgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYykgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdm1hbGViKF9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGludAordmVjX21lYWRkKHZlY3RvciBzaWduZWQgc2hvcnQgX19hLCB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYiwKKyAgICAgICAgICB2ZWN0b3Igc2lnbmVkIGludCBfX2MpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZtYWVoKF9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgaW50Cit2ZWNfbWVhZGQodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYiwKKyAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYykgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdm1hbGVoKF9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZwordmVjX21lYWRkKHZlY3RvciBzaWduZWQgaW50IF9fYSwgdmVjdG9yIHNpZ25lZCBpbnQgX19iLAorICAgICAgICAgIHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYykgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdm1hZWYoX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcKK3ZlY19tZWFkZCh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IsCisgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2MpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZtYWxlZihfX2EsIF9fYiwgX19jKTsKK30KKworLyotLSB2ZWNfbW9hZGQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIHNob3J0Cit2ZWNfbW9hZGQodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYiwKKyAgICAgICAgICB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYykgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdm1hb2IoX19hLCBfX2IsIF9fYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBzaG9ydAordmVjX21vYWRkKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iLAorICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2MpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZtYWxvYihfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBpbnQKK3ZlY19tb2FkZCh2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHNpZ25lZCBzaG9ydCBfX2IsCisgICAgICAgICAgdmVjdG9yIHNpZ25lZCBpbnQgX19jKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92bWFvaChfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGludAordmVjX21vYWRkKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IsCisgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGludCBfX2MpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZtYWxvaChfX2EsIF9fYiwgX19jKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcKK3ZlY19tb2FkZCh2ZWN0b3Igc2lnbmVkIGludCBfX2EsIHZlY3RvciBzaWduZWQgaW50IF9fYiwKKyAgICAgICAgICB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2MpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZtYW9mKF9fYSwgX19iLCBfX2MpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nCit2ZWNfbW9hZGQodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iLAorICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19jKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92bWFsb2YoX19hLCBfX2IsIF9fYyk7Cit9CisKKy8qLS0gdmVjX211bGggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBjaGFyCit2ZWNfbXVsaCh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92bWhiKF9fYSwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGNoYXIKK3ZlY19tdWxoKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92bWxoYihfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgc2hvcnQKK3ZlY19tdWxoKHZlY3RvciBzaWduZWQgc2hvcnQgX19hLCB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdm1oaChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBzaG9ydAordmVjX211bGgodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdm1saGgoX19hLCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGludAordmVjX211bGgodmVjdG9yIHNpZ25lZCBpbnQgX19hLCB2ZWN0b3Igc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZtaGYoX19hLCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgaW50Cit2ZWNfbXVsaCh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZtbGhmKF9fYSwgX19iKTsKK30KKworLyotLSB2ZWNfbXVsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIHNob3J0Cit2ZWNfbXVsZSh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92bWViKF9fYSwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIHNob3J0Cit2ZWNfbXVsZSh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdm1sZWIoX19hLCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGludAordmVjX211bGUodmVjdG9yIHNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBzaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92bWVoKF9fYSwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGludAordmVjX211bGUodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdm1sZWgoX19hLCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZwordmVjX211bGUodmVjdG9yIHNpZ25lZCBpbnQgX19hLCB2ZWN0b3Igc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZtZWYoX19hLCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nCit2ZWNfbXVsZSh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZtbGVmKF9fYSwgX19iKTsKK30KKworLyotLSB2ZWNfbXVsbyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIHNob3J0Cit2ZWNfbXVsbyh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92bW9iKF9fYSwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIHNob3J0Cit2ZWNfbXVsbyh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdm1sb2IoX19hLCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGludAordmVjX211bG8odmVjdG9yIHNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBzaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92bW9oKF9fYSwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGludAordmVjX211bG8odmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdm1sb2goX19hLCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZwordmVjX211bG8odmVjdG9yIHNpZ25lZCBpbnQgX19hLCB2ZWN0b3Igc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3Ztb2YoX19hLCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nCit2ZWNfbXVsbyh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZtbG9mKF9fYSwgX19iKTsKK30KKworLyotLSB2ZWNfc3ViX3UxMjggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfYWkgdmVjdG9yIHVuc2lnbmVkIGNoYXIKK3ZlY19zdWJfdTEyOCh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdnNxKF9fYSwgX19iKTsKK30KKworLyotLSB2ZWNfc3ViYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgY2hhcgordmVjX3N1YmModmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZzY2JpYihfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBzaG9ydAordmVjX3N1YmModmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdnNjYmloKF9fYSwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGludAordmVjX3N1YmModmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92c2NiaWYoX19hLCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nCit2ZWNfc3ViYyh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZzY2JpZyhfX2EsIF9fYik7Cit9CisKKy8qLS0gdmVjX3N1YmNfdTEyOCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX2FpIHZlY3RvciB1bnNpZ25lZCBjaGFyCit2ZWNfc3ViY191MTI4KHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92c2NiaXEoX19hLCBfX2IpOworfQorCisvKi0tIHZlY19zdWJlX3UxMjggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19haSB2ZWN0b3IgdW5zaWduZWQgY2hhcgordmVjX3N1YmVfdTEyOCh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYiwKKyAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19jKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92c2JpcShfX2EsIF9fYiwgX19jKTsKK30KKworLyotLSB2ZWNfc3ViZWNfdTEyOCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfYWkgdmVjdG9yIHVuc2lnbmVkIGNoYXIKK3ZlY19zdWJlY191MTI4KHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iLAorICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19jKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92c2JjYmlxKF9fYSwgX19iLCBfX2MpOworfQorCisvKi0tIHZlY19zdW0yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcKK3ZlY19zdW0yKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZzdW1naChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcKK3ZlY19zdW0yKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdnN1bWdmKF9fYSwgX19iKTsKK30KKworLyotLSB2ZWNfc3VtX3UxMjggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgY2hhcgordmVjX3N1bV91MTI4KHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdnN1bXFmKF9fYSwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGNoYXIKK3ZlY19zdW1fdTEyOCh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZzdW1xZyhfX2EsIF9fYik7Cit9CisKKy8qLS0gdmVjX3N1bTQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGludAordmVjX3N1bTQodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZzdW1iKF9fYSwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGludAordmVjX3N1bTQodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdnN1bWgoX19hLCBfX2IpOworfQorCisvKi0tIHZlY190ZXN0X21hc2sgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX3Rlc3RfbWFzayh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3Z0bSgodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY190ZXN0X21hc2sodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3Z0bShfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX3Rlc3RfbWFzayh2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdnRtKCh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIGludAordmVjX3Rlc3RfbWFzayh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92dG0oKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfdGVzdF9tYXNrKHZlY3RvciBzaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3Z0bSgodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY190ZXN0X21hc2sodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92dG0oKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfdGVzdF9tYXNrKHZlY3RvciBzaWduZWQgbG9uZyBsb25nIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3Z0bSgodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSBpbnQKK3ZlY190ZXN0X21hc2sodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92dG0oKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgaW50Cit2ZWNfdGVzdF9tYXNrKHZlY3RvciBkb3VibGUgX19hLCB2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nIF9fYikgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdnRtKCh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKKy8qLS0gdmVjX21hZGQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX2FpIHZlY3RvciBkb3VibGUKK3ZlY19tYWRkKHZlY3RvciBkb3VibGUgX19hLCB2ZWN0b3IgZG91YmxlIF9fYiwgdmVjdG9yIGRvdWJsZSBfX2MpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZmbWFkYihfX2EsIF9fYiwgX19jKTsKK30KKworLyotLSB2ZWNfbXN1YiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfYWkgdmVjdG9yIGRvdWJsZQordmVjX21zdWIodmVjdG9yIGRvdWJsZSBfX2EsIHZlY3RvciBkb3VibGUgX19iLCB2ZWN0b3IgZG91YmxlIF9fYykgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmZtc2RiKF9fYSwgX19iLCBfX2MpOworfQorCisvKi0tIHZlY19zcXJ0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19haSB2ZWN0b3IgZG91YmxlCit2ZWNfc3FydCh2ZWN0b3IgZG91YmxlIF9fYSkgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmZzcWRiKF9fYSk7Cit9CisKKy8qLS0gdmVjX2xkMmYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX2FpIHZlY3RvciBkb3VibGUKK3ZlY19sZDJmKGNvbnN0IGZsb2F0ICpfX3B0cikgeworICB0eXBlZGVmIGZsb2F0IF9fdjJmMzIgX19hdHRyaWJ1dGVfXygoX192ZWN0b3Jfc2l6ZV9fKDgpKSk7CisgIHJldHVybiBfX2J1aWx0aW5fY29udmVydHZlY3RvcigqKGNvbnN0IF9fdjJmMzIgKilfX3B0ciwgdmVjdG9yIGRvdWJsZSk7Cit9CisKKy8qLS0gdmVjX3N0MmYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX2FpIHZvaWQKK3ZlY19zdDJmKHZlY3RvciBkb3VibGUgX19hLCBmbG9hdCAqX19wdHIpIHsKKyAgdHlwZWRlZiBmbG9hdCBfX3YyZjMyIF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXyg4KSkpOworICAqKF9fdjJmMzIgKilfX3B0ciA9IF9fYnVpbHRpbl9jb252ZXJ0dmVjdG9yKF9fYSwgX192MmYzMik7Cit9CisKKy8qLS0gdmVjX2N0ZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGRvdWJsZQordmVjX2N0ZCh2ZWN0b3Igc2lnbmVkIGxvbmcgbG9uZyBfX2EsIGludCBfX2IpCisgIF9fY29uc3RhbnRfcmFuZ2UoX19iLCAwLCAzMSkgeworICB2ZWN0b3IgZG91YmxlIF9fY29udiA9IF9fYnVpbHRpbl9jb252ZXJ0dmVjdG9yKF9fYSwgdmVjdG9yIGRvdWJsZSk7CisgIF9fY29udiAqPSAodmVjdG9yIGRvdWJsZSkodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZykoKDB4M2ZmVUxMIC0gX19iKSA8PCA1Mik7CisgIHJldHVybiBfX2NvbnY7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBkb3VibGUKK3ZlY19jdGQodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsIGludCBfX2IpCisgIF9fY29uc3RhbnRfcmFuZ2UoX19iLCAwLCAzMSkgeworICB2ZWN0b3IgZG91YmxlIF9fY29udiA9IF9fYnVpbHRpbl9jb252ZXJ0dmVjdG9yKF9fYSwgdmVjdG9yIGRvdWJsZSk7CisgIF9fY29udiAqPSAodmVjdG9yIGRvdWJsZSkodmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZykoKDB4M2ZmVUxMIC0gX19iKSA8PCA1Mik7CisgIHJldHVybiBfX2NvbnY7Cit9CisKKy8qLS0gdmVjX2N0c2wgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcKK3ZlY19jdHNsKHZlY3RvciBkb3VibGUgX19hLCBpbnQgX19iKQorICBfX2NvbnN0YW50X3JhbmdlKF9fYiwgMCwgMzEpIHsKKyAgX19hICo9ICh2ZWN0b3IgZG91YmxlKSh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKSgoMHgzZmZVTEwgKyBfX2IpIDw8IDUyKTsKKyAgcmV0dXJuIF9fYnVpbHRpbl9jb252ZXJ0dmVjdG9yKF9fYSwgdmVjdG9yIHNpZ25lZCBsb25nIGxvbmcpOworfQorCisvKi0tIHZlY19jdHVsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcKK3ZlY19jdHVsKHZlY3RvciBkb3VibGUgX19hLCBpbnQgX19iKQorICBfX2NvbnN0YW50X3JhbmdlKF9fYiwgMCwgMzEpIHsKKyAgX19hICo9ICh2ZWN0b3IgZG91YmxlKSh2ZWN0b3IgdW5zaWduZWQgbG9uZyBsb25nKSgoMHgzZmZVTEwgKyBfX2IpIDw8IDUyKTsKKyAgcmV0dXJuIF9fYnVpbHRpbl9jb252ZXJ0dmVjdG9yKF9fYSwgdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyk7Cit9CisKKy8qLS0gdmVjX3JvdW5kcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX2FpIHZlY3RvciBkb3VibGUKK3ZlY19yb3VuZHAodmVjdG9yIGRvdWJsZSBfX2EpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZmaWRiKF9fYSwgNCwgNik7Cit9CisKKy8qLS0gdmVjX2NlaWwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX2FpIHZlY3RvciBkb3VibGUKK3ZlY19jZWlsKHZlY3RvciBkb3VibGUgX19hKSB7CisgIC8vIE9uIHRoaXMgcGxhdGZvcm0sIHZlY19jZWlsIG5ldmVyIHRyaWdnZXJzIHRoZSBJRUVFLWluZXhhY3QgZXhjZXB0aW9uLgorICByZXR1cm4gX19idWlsdGluX3MzOTBfdmZpZGIoX19hLCA0LCA2KTsKK30KKworLyotLSB2ZWNfcm91bmRtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfYWkgdmVjdG9yIGRvdWJsZQordmVjX3JvdW5kbSh2ZWN0b3IgZG91YmxlIF9fYSkgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmZpZGIoX19hLCA0LCA3KTsKK30KKworLyotLSB2ZWNfZmxvb3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfYWkgdmVjdG9yIGRvdWJsZQordmVjX2Zsb29yKHZlY3RvciBkb3VibGUgX19hKSB7CisgIC8vIE9uIHRoaXMgcGxhdGZvcm0sIHZlY19mbG9vciBuZXZlciB0cmlnZ2VycyB0aGUgSUVFRS1pbmV4YWN0IGV4Y2VwdGlvbi4KKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZmaWRiKF9fYSwgNCwgNyk7Cit9CisKKy8qLS0gdmVjX3JvdW5keiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX2FpIHZlY3RvciBkb3VibGUKK3ZlY19yb3VuZHoodmVjdG9yIGRvdWJsZSBfX2EpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZmaWRiKF9fYSwgNCwgNSk7Cit9CisKKy8qLS0gdmVjX3RydW5jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX2FpIHZlY3RvciBkb3VibGUKK3ZlY190cnVuYyh2ZWN0b3IgZG91YmxlIF9fYSkgeworICAvLyBPbiB0aGlzIHBsYXRmb3JtLCB2ZWNfdHJ1bmMgbmV2ZXIgdHJpZ2dlcnMgdGhlIElFRUUtaW5leGFjdCBleGNlcHRpb24uCisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92ZmlkYihfX2EsIDQsIDUpOworfQorCisvKi0tIHZlY19yb3VuZGMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19haSB2ZWN0b3IgZG91YmxlCit2ZWNfcm91bmRjKHZlY3RvciBkb3VibGUgX19hKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92ZmlkYihfX2EsIDQsIDApOworfQorCisvKi0tIHZlY19yb3VuZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19haSB2ZWN0b3IgZG91YmxlCit2ZWNfcm91bmQodmVjdG9yIGRvdWJsZSBfX2EpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZmaWRiKF9fYSwgNCwgNCk7Cit9CisKKy8qLS0gdmVjX2ZwX3Rlc3RfZGF0YV9jbGFzcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSB2ZWNfZnBfdGVzdF9kYXRhX2NsYXNzKFgsIFksIFopIFwKKyAgKCh2ZWN0b3IgYm9vbCBsb25nIGxvbmcpX19idWlsdGluX3MzOTBfdmZ0Y2lkYigoWCksIChZKSwgKFopKSkKKworLyotLSB2ZWNfY3BfdW50aWxfemVybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGNoYXIKK3ZlY19jcF91bnRpbF96ZXJvKHZlY3RvciBzaWduZWQgY2hhciBfX2EpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGNoYXIpX19idWlsdGluX3MzOTBfdmlzdHJiKCh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBjaGFyCit2ZWNfY3BfdW50aWxfemVybyh2ZWN0b3IgYm9vbCBjaGFyIF9fYSkgeworICByZXR1cm4gKHZlY3RvciBib29sIGNoYXIpX19idWlsdGluX3MzOTBfdmlzdHJiKCh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgY2hhcgordmVjX2NwX3VudGlsX3plcm8odmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92aXN0cmIoX19hKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBzaG9ydAordmVjX2NwX3VudGlsX3plcm8odmVjdG9yIHNpZ25lZCBzaG9ydCBfX2EpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIHNob3J0KV9fYnVpbHRpbl9zMzkwX3Zpc3RyaCgodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIHNob3J0Cit2ZWNfY3BfdW50aWxfemVybyh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBzaG9ydClfX2J1aWx0aW5fczM5MF92aXN0cmgoKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2EpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgc2hvcnQKK3ZlY19jcF91bnRpbF96ZXJvKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3Zpc3RyaChfX2EpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGludAordmVjX2NwX3VudGlsX3plcm8odmVjdG9yIHNpZ25lZCBpbnQgX19hKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBpbnQpX19idWlsdGluX3MzOTBfdmlzdHJmKCh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIGludAordmVjX2NwX3VudGlsX3plcm8odmVjdG9yIGJvb2wgaW50IF9fYSkgeworICByZXR1cm4gKHZlY3RvciBib29sIGludClfX2J1aWx0aW5fczM5MF92aXN0cmYoKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGludAordmVjX2NwX3VudGlsX3plcm8odmVjdG9yIHVuc2lnbmVkIGludCBfX2EpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3Zpc3RyZihfX2EpOworfQorCisvKi0tIHZlY19jcF91bnRpbF96ZXJvX2NjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgY2hhcgordmVjX2NwX3VudGlsX3plcm9fY2ModmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgaW50ICpfX2NjKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBjaGFyKQorICAgIF9fYnVpbHRpbl9zMzkwX3Zpc3RyYnMoKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgX19jYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIGNoYXIKK3ZlY19jcF91bnRpbF96ZXJvX2NjKHZlY3RvciBib29sIGNoYXIgX19hLCBpbnQgKl9fY2MpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBjaGFyKQorICAgIF9fYnVpbHRpbl9zMzkwX3Zpc3RyYnMoKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwgX19jYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBjaGFyCit2ZWNfY3BfdW50aWxfemVyb19jYyh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIGludCAqX19jYykgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmlzdHJicyhfX2EsIF9fY2MpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIHNob3J0Cit2ZWNfY3BfdW50aWxfemVyb19jYyh2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYSwgaW50ICpfX2NjKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBzaG9ydCkKKyAgICBfX2J1aWx0aW5fczM5MF92aXN0cmhzKCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19hLCBfX2NjKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgc2hvcnQKK3ZlY19jcF91bnRpbF96ZXJvX2NjKHZlY3RvciBib29sIHNob3J0IF9fYSwgaW50ICpfX2NjKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgc2hvcnQpCisgICAgX19idWlsdGluX3MzOTBfdmlzdHJocygodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYSwgX19jYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBzaG9ydAordmVjX2NwX3VudGlsX3plcm9fY2ModmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgaW50ICpfX2NjKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92aXN0cmhzKF9fYSwgX19jYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgaW50Cit2ZWNfY3BfdW50aWxfemVyb19jYyh2ZWN0b3Igc2lnbmVkIGludCBfX2EsIGludCAqX19jYykgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgaW50KQorICAgIF9fYnVpbHRpbl9zMzkwX3Zpc3RyZnMoKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hLCBfX2NjKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgaW50Cit2ZWNfY3BfdW50aWxfemVyb19jYyh2ZWN0b3IgYm9vbCBpbnQgX19hLCBpbnQgKl9fY2MpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBpbnQpX19idWlsdGluX3MzOTBfdmlzdHJmcygodmVjdG9yIHVuc2lnbmVkIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19jYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBpbnQKK3ZlY19jcF91bnRpbF96ZXJvX2NjKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCBpbnQgKl9fY2MpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3Zpc3RyZnMoX19hLCBfX2NjKTsKK30KKworLyotLSB2ZWNfY21wZXFfaWR4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGNoYXIKK3ZlY19jbXBlcV9pZHgodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgY2hhcikKKyAgICBfX2J1aWx0aW5fczM5MF92ZmVlYigodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgY2hhcgordmVjX2NtcGVxX2lkeCh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZmZWViKCh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGNoYXIKK3ZlY19jbXBlcV9pZHgodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZmZWViKF9fYSwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBzaG9ydAordmVjX2NtcGVxX2lkeCh2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIHNob3J0KQorICAgIF9fYnVpbHRpbl9zMzkwX3ZmZWVoKCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIHNob3J0Cit2ZWNfY21wZXFfaWR4KHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92ZmVlaCgodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIHNob3J0Cit2ZWNfY21wZXFfaWR4KHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZmZWVoKF9fYSwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBpbnQKK3ZlY19jbXBlcV9pZHgodmVjdG9yIHNpZ25lZCBpbnQgX19hLCB2ZWN0b3Igc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGludCkKKyAgICBfX2J1aWx0aW5fczM5MF92ZmVlZigodmVjdG9yIHVuc2lnbmVkIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGludAordmVjX2NtcGVxX2lkeCh2ZWN0b3IgYm9vbCBpbnQgX19hLCB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92ZmVlZigodmVjdG9yIHVuc2lnbmVkIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGludClfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgaW50Cit2ZWNfY21wZXFfaWR4KHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmZlZWYoX19hLCBfX2IpOworfQorCisvKi0tIHZlY19jbXBlcV9pZHhfY2MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgY2hhcgordmVjX2NtcGVxX2lkeF9jYyh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iLCBpbnQgKl9fY2MpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGNoYXIpCisgICAgX19idWlsdGluX3MzOTBfdmZlZWJzKCh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IsIF9fY2MpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgY2hhcgordmVjX2NtcGVxX2lkeF9jYyh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIGJvb2wgY2hhciBfX2IsIGludCAqX19jYykgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmZlZWJzKCh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYiwgX19jYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBjaGFyCit2ZWNfY21wZXFfaWR4X2NjKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iLAorICAgICAgICAgICAgICAgICBpbnQgKl9fY2MpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZmZWVicyhfX2EsIF9fYiwgX19jYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgc2hvcnQKK3ZlY19jbXBlcV9pZHhfY2ModmVjdG9yIHNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBzaWduZWQgc2hvcnQgX19iLCBpbnQgKl9fY2MpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIHNob3J0KQorICAgIF9fYnVpbHRpbl9zMzkwX3ZmZWVocygodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2IsIF9fY2MpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgc2hvcnQKK3ZlY19jbXBlcV9pZHhfY2ModmVjdG9yIGJvb2wgc2hvcnQgX19hLCB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IsIGludCAqX19jYykgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmZlZWhzKCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19iLCBfX2NjKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIHNob3J0Cit2ZWNfY21wZXFfaWR4X2NjKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IsCisgICAgICAgICAgICAgICAgIGludCAqX19jYykgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmZlZWhzKF9fYSwgX19iLCBfX2NjKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBpbnQKK3ZlY19jbXBlcV9pZHhfY2ModmVjdG9yIHNpZ25lZCBpbnQgX19hLCB2ZWN0b3Igc2lnbmVkIGludCBfX2IsIGludCAqX19jYykgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgaW50KQorICAgIF9fYnVpbHRpbl9zMzkwX3ZmZWVmcygodmVjdG9yIHVuc2lnbmVkIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYiwgX19jYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBpbnQKK3ZlY19jbXBlcV9pZHhfY2ModmVjdG9yIGJvb2wgaW50IF9fYSwgdmVjdG9yIGJvb2wgaW50IF9fYiwgaW50ICpfX2NjKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92ZmVlZnMoKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYiwgX19jYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBpbnQKK3ZlY19jbXBlcV9pZHhfY2ModmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iLCBpbnQgKl9fY2MpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZmZWVmcyhfX2EsIF9fYiwgX19jYyk7Cit9CisKKy8qLS0gdmVjX2NtcGVxX29yXzBfaWR4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBjaGFyCit2ZWNfY21wZXFfb3JfMF9pZHgodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgY2hhcikKKyAgICBfX2J1aWx0aW5fczM5MF92ZmVlemIoKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBjaGFyCit2ZWNfY21wZXFfb3JfMF9pZHgodmVjdG9yIGJvb2wgY2hhciBfX2EsIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92ZmVlemIoKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGNoYXIKK3ZlY19jbXBlcV9vcl8wX2lkeCh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmZlZXpiKF9fYSwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBzaG9ydAordmVjX2NtcGVxX29yXzBfaWR4KHZlY3RvciBzaWduZWQgc2hvcnQgX19hLCB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgc2hvcnQpCisgICAgX19idWlsdGluX3MzOTBfdmZlZXpoKCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBzaG9ydAordmVjX2NtcGVxX29yXzBfaWR4KHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92ZmVlemgoKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgc2hvcnQKK3ZlY19jbXBlcV9vcl8wX2lkeCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92ZmVlemgoX19hLCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGludAordmVjX2NtcGVxX29yXzBfaWR4KHZlY3RvciBzaWduZWQgaW50IF9fYSwgdmVjdG9yIHNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBpbnQpCisgICAgX19idWlsdGluX3MzOTBfdmZlZXpmKCh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGludAordmVjX2NtcGVxX29yXzBfaWR4KHZlY3RvciBib29sIGludCBfX2EsIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZmZWV6ZigodmVjdG9yIHVuc2lnbmVkIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGludAordmVjX2NtcGVxX29yXzBfaWR4KHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmZlZXpmKF9fYSwgX19iKTsKK30KKworLyotLSB2ZWNfY21wZXFfb3JfMF9pZHhfY2MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGNoYXIKK3ZlY19jbXBlcV9vcl8wX2lkeF9jYyh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iLAorICAgICAgICAgICAgICAgICAgICAgIGludCAqX19jYykgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgY2hhcikKKyAgICBfX2J1aWx0aW5fczM5MF92ZmVlemJzKCh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iLCBfX2NjKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGNoYXIKK3ZlY19jbXBlcV9vcl8wX2lkeF9jYyh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIGJvb2wgY2hhciBfX2IsIGludCAqX19jYykgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmZlZXpicygodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iLCBfX2NjKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGNoYXIKK3ZlY19jbXBlcV9vcl8wX2lkeF9jYyh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgKl9fY2MpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZmZWV6YnMoX19hLCBfX2IsIF9fY2MpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIHNob3J0Cit2ZWNfY21wZXFfb3JfMF9pZHhfY2ModmVjdG9yIHNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBzaWduZWQgc2hvcnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgIGludCAqX19jYykgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgc2hvcnQpCisgICAgX19idWlsdGluX3MzOTBfdmZlZXpocygodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19iLCBfX2NjKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIHNob3J0Cit2ZWNfY21wZXFfb3JfMF9pZHhfY2ModmVjdG9yIGJvb2wgc2hvcnQgX19hLCB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IsIGludCAqX19jYykgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmZlZXpocygodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2IsIF9fY2MpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgc2hvcnQKK3ZlY19jbXBlcV9vcl8wX2lkeF9jYyh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgIGludCAqX19jYykgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmZlZXpocyhfX2EsIF9fYiwgX19jYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgaW50Cit2ZWNfY21wZXFfb3JfMF9pZHhfY2ModmVjdG9yIHNpZ25lZCBpbnQgX19hLCB2ZWN0b3Igc2lnbmVkIGludCBfX2IsIGludCAqX19jYykgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgaW50KQorICAgIF9fYnVpbHRpbl9zMzkwX3ZmZWV6ZnMoKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iLCBfX2NjKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGludAordmVjX2NtcGVxX29yXzBfaWR4X2NjKHZlY3RvciBib29sIGludCBfX2EsIHZlY3RvciBib29sIGludCBfX2IsIGludCAqX19jYykgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmZlZXpmcygodmVjdG9yIHVuc2lnbmVkIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYiwgX19jYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBpbnQKK3ZlY19jbXBlcV9vcl8wX2lkeF9jYyh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICpfX2NjKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92ZmVlemZzKF9fYSwgX19iLCBfX2NjKTsKK30KKworLyotLSB2ZWNfY21wbmVfaWR4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGNoYXIKK3ZlY19jbXBuZV9pZHgodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgY2hhcikKKyAgICBfX2J1aWx0aW5fczM5MF92ZmVuZWIoKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBjaGFyCit2ZWNfY21wbmVfaWR4KHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmZlbmViKCh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBjaGFyCit2ZWNfY21wbmVfaWR4KHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92ZmVuZWIoX19hLCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIHNob3J0Cit2ZWNfY21wbmVfaWR4KHZlY3RvciBzaWduZWQgc2hvcnQgX19hLCB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgc2hvcnQpCisgICAgX19idWlsdGluX3MzOTBfdmZlbmVoKCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBzaG9ydAordmVjX2NtcG5lX2lkeCh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmZlbmVoKCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIHNob3J0Cit2ZWNfY21wbmVfaWR4KHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZmZW5laChfX2EsIF9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgaW50Cit2ZWNfY21wbmVfaWR4KHZlY3RvciBzaWduZWQgaW50IF9fYSwgdmVjdG9yIHNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBpbnQpCisgICAgX19idWlsdGluX3MzOTBfdmZlbmVmKCh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGludAordmVjX2NtcG5lX2lkeCh2ZWN0b3IgYm9vbCBpbnQgX19hLCB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92ZmVuZWYoKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBpbnQKK3ZlY19jbXBuZV9pZHgodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92ZmVuZWYoX19hLCBfX2IpOworfQorCisvKi0tIHZlY19jbXBuZV9pZHhfY2MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgY2hhcgordmVjX2NtcG5lX2lkeF9jYyh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iLCBpbnQgKl9fY2MpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGNoYXIpCisgICAgX19idWlsdGluX3MzOTBfdmZlbmVicygodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYiwgX19jYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBjaGFyCit2ZWNfY21wbmVfaWR4X2NjKHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3IgYm9vbCBjaGFyIF9fYiwgaW50ICpfX2NjKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92ZmVuZWJzKCh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IsIF9fY2MpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgY2hhcgordmVjX2NtcG5lX2lkeF9jYyh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYiwKKyAgICAgICAgICAgICAgICAgaW50ICpfX2NjKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92ZmVuZWJzKF9fYSwgX19iLCBfX2NjKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBzaG9ydAordmVjX2NtcG5lX2lkeF9jYyh2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHNpZ25lZCBzaG9ydCBfX2IsIGludCAqX19jYykgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgc2hvcnQpCisgICAgX19idWlsdGluX3MzOTBfdmZlbmVocygodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19iLCBfX2NjKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIHNob3J0Cit2ZWNfY21wbmVfaWR4X2NjKHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIGJvb2wgc2hvcnQgX19iLCBpbnQgKl9fY2MpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZmZW5laHMoKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19iLCBfX2NjKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIHNob3J0Cit2ZWNfY21wbmVfaWR4X2NjKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IsCisgICAgICAgICAgICAgICAgIGludCAqX19jYykgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmZlbmVocyhfX2EsIF9fYiwgX19jYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgaW50Cit2ZWNfY21wbmVfaWR4X2NjKHZlY3RvciBzaWduZWQgaW50IF9fYSwgdmVjdG9yIHNpZ25lZCBpbnQgX19iLCBpbnQgKl9fY2MpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGludCkKKyAgICBfX2J1aWx0aW5fczM5MF92ZmVuZWZzKCh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYiwgX19jYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBpbnQKK3ZlY19jbXBuZV9pZHhfY2ModmVjdG9yIGJvb2wgaW50IF9fYSwgdmVjdG9yIGJvb2wgaW50IF9fYiwgaW50ICpfX2NjKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92ZmVuZWZzKCh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iLCBfX2NjKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGludAordmVjX2NtcG5lX2lkeF9jYyh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IsIGludCAqX19jYykgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmZlbmVmcyhfX2EsIF9fYiwgX19jYyk7Cit9CisKKy8qLS0gdmVjX2NtcG5lX29yXzBfaWR4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBjaGFyCit2ZWNfY21wbmVfb3JfMF9pZHgodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgY2hhcikKKyAgICBfX2J1aWx0aW5fczM5MF92ZmVuZXpiKCh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGNoYXIKK3ZlY19jbXBuZV9vcl8wX2lkeCh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZmZW5lemIoKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBjaGFyCit2ZWNfY21wbmVfb3JfMF9pZHgodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZmZW5lemIoX19hLCBfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIHNob3J0Cit2ZWNfY21wbmVfb3JfMF9pZHgodmVjdG9yIHNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBzaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBzaG9ydCkKKyAgICBfX2J1aWx0aW5fczM5MF92ZmVuZXpoKCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgc2hvcnQKK3ZlY19jbXBuZV9vcl8wX2lkeCh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIHZlY3RvciBib29sIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmZlbmV6aCgodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgc2hvcnQKK3ZlY19jbXBuZV9vcl8wX2lkeCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92ZmVuZXpoKF9fYSwgX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBpbnQKK3ZlY19jbXBuZV9vcl8wX2lkeCh2ZWN0b3Igc2lnbmVkIGludCBfX2EsIHZlY3RvciBzaWduZWQgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgaW50KQorICAgIF9fYnVpbHRpbl9zMzkwX3ZmZW5lemYoKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGludAordmVjX2NtcG5lX29yXzBfaWR4KHZlY3RvciBib29sIGludCBfX2EsIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZmZW5lemYoKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGludClfX2IpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgaW50Cit2ZWNfY21wbmVfb3JfMF9pZHgodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92ZmVuZXpmKF9fYSwgX19iKTsKK30KKworLyotLSB2ZWNfY21wbmVfb3JfMF9pZHhfY2MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGNoYXIKK3ZlY19jbXBuZV9vcl8wX2lkeF9jYyh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iLAorICAgICAgICAgICAgICAgICAgICAgIGludCAqX19jYykgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgY2hhcikKKyAgICBfX2J1aWx0aW5fczM5MF92ZmVuZXpicygodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IsIF9fY2MpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgY2hhcgordmVjX2NtcG5lX29yXzBfaWR4X2NjKHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3IgYm9vbCBjaGFyIF9fYiwgaW50ICpfX2NjKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92ZmVuZXpicygodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYiwgX19jYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBjaGFyCit2ZWNfY21wbmVfb3JfMF9pZHhfY2ModmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICpfX2NjKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92ZmVuZXpicyhfX2EsIF9fYiwgX19jYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgc2hvcnQKK3ZlY19jbXBuZV9vcl8wX2lkeF9jYyh2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHNpZ25lZCBzaG9ydCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICpfX2NjKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBzaG9ydCkKKyAgICBfX2J1aWx0aW5fczM5MF92ZmVuZXpocygodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYiwgX19jYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBzaG9ydAordmVjX2NtcG5lX29yXzBfaWR4X2NjKHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIGJvb2wgc2hvcnQgX19iLCBpbnQgKl9fY2MpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZmZW5lemhzKCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2IsIF9fY2MpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgc2hvcnQKK3ZlY19jbXBuZV9vcl8wX2lkeF9jYyh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgIGludCAqX19jYykgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmZlbmV6aHMoX19hLCBfX2IsIF9fY2MpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGludAordmVjX2NtcG5lX29yXzBfaWR4X2NjKHZlY3RvciBzaWduZWQgaW50IF9fYSwgdmVjdG9yIHNpZ25lZCBpbnQgX19iLCBpbnQgKl9fY2MpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGludCkKKyAgICBfX2J1aWx0aW5fczM5MF92ZmVuZXpmcygodmVjdG9yIHVuc2lnbmVkIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iLCBfX2NjKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGludAordmVjX2NtcG5lX29yXzBfaWR4X2NjKHZlY3RvciBib29sIGludCBfX2EsIHZlY3RvciBib29sIGludCBfX2IsIGludCAqX19jYykgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmZlbmV6ZnMoKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iLCBfX2NjKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGludAordmVjX2NtcG5lX29yXzBfaWR4X2NjKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgKl9fY2MpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZmZW5lemZzKF9fYSwgX19iLCBfX2NjKTsKK30KKworLyotLSB2ZWNfY21wcmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBjaGFyCit2ZWNfY21wcmcodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IsCisgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19jKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgY2hhcilfX2J1aWx0aW5fczM5MF92c3RyY2IoX19hLCBfX2IsIF9fYywgNCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIHNob3J0Cit2ZWNfY21wcmcodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYiwKKyAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19jKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgc2hvcnQpX19idWlsdGluX3MzOTBfdnN0cmNoKF9fYSwgX19iLCBfX2MsIDQpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBpbnQKK3ZlY19jbXByZyh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IsCisgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGludCBfX2MpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBpbnQpX19idWlsdGluX3MzOTBfdnN0cmNmKF9fYSwgX19iLCBfX2MsIDQpOworfQorCisvKi0tIHZlY19jbXByZ19jYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIGNoYXIKK3ZlY19jbXByZ19jYyh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYiwKKyAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2MsIGludCAqX19jYykgeworICByZXR1cm4gKHZlY3RvciBib29sIGNoYXIpX19idWlsdGluX3MzOTBfdnN0cmNicyhfX2EsIF9fYiwgX19jLCA0LCBfX2NjKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgc2hvcnQKK3ZlY19jbXByZ19jYyh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iLAorICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2MsIGludCAqX19jYykgeworICByZXR1cm4gKHZlY3RvciBib29sIHNob3J0KV9fYnVpbHRpbl9zMzkwX3ZzdHJjaHMoX19hLCBfX2IsIF9fYywgNCwgX19jYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIGludAordmVjX2NtcHJnX2NjKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYiwKKyAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYywgaW50ICpfX2NjKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgaW50KV9fYnVpbHRpbl9zMzkwX3ZzdHJjZnMoX19hLCBfX2IsIF9fYywgNCwgX19jYyk7Cit9CisKKy8qLS0gdmVjX2NtcHJnX2lkeCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGNoYXIKK3ZlY19jbXByZ19pZHgodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IsCisgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYykgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdnN0cmNiKF9fYSwgX19iLCBfX2MsIDApOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgc2hvcnQKK3ZlY19jbXByZ19pZHgodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYiwKKyAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYykgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdnN0cmNoKF9fYSwgX19iLCBfX2MsIDApOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgaW50Cit2ZWNfY21wcmdfaWR4KHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYiwKKyAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGludCBfX2MpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZzdHJjZihfX2EsIF9fYiwgX19jLCAwKTsKK30KKworLyotLSB2ZWNfY21wcmdfaWR4X2NjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgY2hhcgordmVjX2NtcHJnX2lkeF9jYyh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYiwKKyAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19jLCBpbnQgKl9fY2MpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZzdHJjYnMoX19hLCBfX2IsIF9fYywgMCwgX19jYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBzaG9ydAordmVjX2NtcHJnX2lkeF9jYyh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iLAorICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19jLCBpbnQgKl9fY2MpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZzdHJjaHMoX19hLCBfX2IsIF9fYywgMCwgX19jYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBpbnQKK3ZlY19jbXByZ19pZHhfY2ModmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iLAorICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYywgaW50ICpfX2NjKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92c3RyY2ZzKF9fYSwgX19iLCBfX2MsIDAsIF9fY2MpOworfQorCisvKi0tIHZlY19jbXByZ19vcl8wX2lkeCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBjaGFyCit2ZWNfY21wcmdfb3JfMF9pZHgodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IsCisgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19jKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92c3RyY3piKF9fYSwgX19iLCBfX2MsIDApOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgc2hvcnQKK3ZlY19jbXByZ19vcl8wX2lkeCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iLAorICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2MpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZzdHJjemgoX19hLCBfX2IsIF9fYywgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBpbnQKK3ZlY19jbXByZ19vcl8wX2lkeCh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGludCBfX2MpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZzdHJjemYoX19hLCBfX2IsIF9fYywgMCk7Cit9CisKKy8qLS0gdmVjX2NtcHJnX29yXzBfaWR4X2NjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGNoYXIKK3ZlY19jbXByZ19vcl8wX2lkeF9jYyh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2MsIGludCAqX19jYykgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdnN0cmN6YnMoX19hLCBfX2IsIF9fYywgMCwgX19jYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBzaG9ydAordmVjX2NtcHJnX29yXzBfaWR4X2NjKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYywgaW50ICpfX2NjKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92c3RyY3pocyhfX2EsIF9fYiwgX19jLCAwLCBfX2NjKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGludAordmVjX2NtcHJnX29yXzBfaWR4X2NjKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYywgaW50ICpfX2NjKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92c3RyY3pmcyhfX2EsIF9fYiwgX19jLCAwLCBfX2NjKTsKK30KKworLyotLSB2ZWNfY21wbnJnIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBjaGFyCit2ZWNfY21wbnJnKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iLAorICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2MpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBjaGFyKV9fYnVpbHRpbl9zMzkwX3ZzdHJjYihfX2EsIF9fYiwgX19jLCAxMik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIHNob3J0Cit2ZWNfY21wbnJnKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IsCisgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2MpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBzaG9ydClfX2J1aWx0aW5fczM5MF92c3RyY2goX19hLCBfX2IsIF9fYywgMTIpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBpbnQKK3ZlY19jbXBucmcodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iLAorICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYykgeworICByZXR1cm4gKHZlY3RvciBib29sIGludClfX2J1aWx0aW5fczM5MF92c3RyY2YoX19hLCBfX2IsIF9fYywgMTIpOworfQorCisvKi0tIHZlY19jbXBucmdfY2MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIGNoYXIKK3ZlY19jbXBucmdfY2ModmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IsCisgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYywgaW50ICpfX2NjKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgY2hhcilfX2J1aWx0aW5fczM5MF92c3RyY2JzKF9fYSwgX19iLCBfX2MsIDEyLCBfX2NjKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgc2hvcnQKK3ZlY19jbXBucmdfY2ModmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYiwKKyAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYywgaW50ICpfX2NjKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgc2hvcnQpX19idWlsdGluX3MzOTBfdnN0cmNocyhfX2EsIF9fYiwgX19jLCAxMiwgX19jYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIGludAordmVjX2NtcG5yZ19jYyh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IsCisgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBpbnQgX19jLCBpbnQgKl9fY2MpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBpbnQpX19idWlsdGluX3MzOTBfdnN0cmNmcyhfX2EsIF9fYiwgX19jLCAxMiwgX19jYyk7Cit9CisKKy8qLS0gdmVjX2NtcG5yZ19pZHggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGNoYXIKK3ZlY19jbXBucmdfaWR4KHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iLAorICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19jKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92c3RyY2IoX19hLCBfX2IsIF9fYywgOCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBzaG9ydAordmVjX2NtcG5yZ19pZHgodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYiwKKyAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2MpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZzdHJjaChfX2EsIF9fYiwgX19jLCA4KTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGludAordmVjX2NtcG5yZ19pZHgodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iLAorICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGludCBfX2MpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZzdHJjZihfX2EsIF9fYiwgX19jLCA4KTsKK30KKworLyotLSB2ZWNfY21wbnJnX2lkeF9jYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgY2hhcgordmVjX2NtcG5yZ19pZHhfY2ModmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IsCisgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2MsIGludCAqX19jYykgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdnN0cmNicyhfX2EsIF9fYiwgX19jLCA4LCBfX2NjKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIHNob3J0Cit2ZWNfY21wbnJnX2lkeF9jYyh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iLAorICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYywgaW50ICpfX2NjKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92c3RyY2hzKF9fYSwgX19iLCBfX2MsIDgsIF9fY2MpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgaW50Cit2ZWNfY21wbnJnX2lkeF9jYyh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IsCisgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYywgaW50ICpfX2NjKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92c3RyY2ZzKF9fYSwgX19iLCBfX2MsIDgsIF9fY2MpOworfQorCisvKi0tIHZlY19jbXBucmdfb3JfMF9pZHggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBjaGFyCit2ZWNfY21wbnJnX29yXzBfaWR4KHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iLAorICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2MpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZzdHJjemIoX19hLCBfX2IsIF9fYywgOCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBzaG9ydAordmVjX2NtcG5yZ19vcl8wX2lkeCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iLAorICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19jKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92c3RyY3poKF9fYSwgX19iLCBfX2MsIDgpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgaW50Cit2ZWNfY21wbnJnX29yXzBfaWR4KHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGludCBfX2MpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZzdHJjemYoX19hLCBfX2IsIF9fYywgOCk7Cit9CisKKy8qLS0gdmVjX2NtcG5yZ19vcl8wX2lkeF9jYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGNoYXIKK3ZlY19jbXBucmdfb3JfMF9pZHhfY2ModmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYywgaW50ICpfX2NjKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92c3RyY3picyhfX2EsIF9fYiwgX19jLCA4LCBfX2NjKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIHNob3J0Cit2ZWNfY21wbnJnX29yXzBfaWR4X2NjKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2MsIGludCAqX19jYykgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdnN0cmN6aHMoX19hLCBfX2IsIF9fYywgOCwgX19jYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBpbnQKK3ZlY19jbXBucmdfb3JfMF9pZHhfY2ModmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYywgaW50ICpfX2NjKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92c3RyY3pmcyhfX2EsIF9fYiwgX19jLCA4LCBfX2NjKTsKK30KKworLyotLSB2ZWNfZmluZF9hbnlfZXEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBjaGFyCit2ZWNfZmluZF9hbnlfZXEodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIGNoYXIpCisgICAgX19idWlsdGluX3MzOTBfdmZhZWIoKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iLCA0KTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgY2hhcgordmVjX2ZpbmRfYW55X2VxKHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIGNoYXIpCisgICAgX19idWlsdGluX3MzOTBfdmZhZWIoKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iLCA0KTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgY2hhcgordmVjX2ZpbmRfYW55X2VxKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgY2hhcilfX2J1aWx0aW5fczM5MF92ZmFlYihfX2EsIF9fYiwgNCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIHNob3J0Cit2ZWNfZmluZF9hbnlfZXEodmVjdG9yIHNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBzaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgc2hvcnQpCisgICAgX19idWlsdGluX3MzOTBfdmZhZWgoKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2IsIDQpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBzaG9ydAordmVjX2ZpbmRfYW55X2VxKHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgc2hvcnQpCisgICAgX19idWlsdGluX3MzOTBfdmZhZWgoKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2IsIDQpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBzaG9ydAordmVjX2ZpbmRfYW55X2VxKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBzaG9ydClfX2J1aWx0aW5fczM5MF92ZmFlaChfX2EsIF9fYiwgNCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIGludAordmVjX2ZpbmRfYW55X2VxKHZlY3RvciBzaWduZWQgaW50IF9fYSwgdmVjdG9yIHNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgaW50KQorICAgIF9fYnVpbHRpbl9zMzkwX3ZmYWVmKCh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGludClfX2IsIDQpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBpbnQKK3ZlY19maW5kX2FueV9lcSh2ZWN0b3IgYm9vbCBpbnQgX19hLCB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgaW50KQorICAgIF9fYnVpbHRpbl9zMzkwX3ZmYWVmKCh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGludClfX2IsIDQpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBpbnQKK3ZlY19maW5kX2FueV9lcSh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBpbnQpX19idWlsdGluX3MzOTBfdmZhZWYoX19hLCBfX2IsIDQpOworfQorCisvKi0tIHZlY19maW5kX2FueV9lcV9jYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIGNoYXIKK3ZlY19maW5kX2FueV9lcV9jYyh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iLCBpbnQgKl9fY2MpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBjaGFyKQorICAgIF9fYnVpbHRpbl9zMzkwX3ZmYWVicygodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iLCA0LCBfX2NjKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgY2hhcgordmVjX2ZpbmRfYW55X2VxX2NjKHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3IgYm9vbCBjaGFyIF9fYiwgaW50ICpfX2NjKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgY2hhcikKKyAgICBfX2J1aWx0aW5fczM5MF92ZmFlYnMoKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYiwgNCwgX19jYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIGNoYXIKK3ZlY19maW5kX2FueV9lcV9jYyh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYiwKKyAgICAgICAgICAgICAgICAgICBpbnQgKl9fY2MpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBjaGFyKV9fYnVpbHRpbl9zMzkwX3ZmYWVicyhfX2EsIF9fYiwgNCwgX19jYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIHNob3J0Cit2ZWNfZmluZF9hbnlfZXFfY2ModmVjdG9yIHNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBzaWduZWQgc2hvcnQgX19iLAorICAgICAgICAgICAgICAgICAgIGludCAqX19jYykgeworICByZXR1cm4gKHZlY3RvciBib29sIHNob3J0KQorICAgIF9fYnVpbHRpbl9zMzkwX3ZmYWVocygodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2IsIDQsIF9fY2MpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBzaG9ydAordmVjX2ZpbmRfYW55X2VxX2NjKHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIGJvb2wgc2hvcnQgX19iLCBpbnQgKl9fY2MpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBzaG9ydCkKKyAgICBfX2J1aWx0aW5fczM5MF92ZmFlaHMoKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19iLCA0LCBfX2NjKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgc2hvcnQKK3ZlY19maW5kX2FueV9lcV9jYyh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iLAorICAgICAgICAgICAgICAgICAgIGludCAqX19jYykgeworICByZXR1cm4gKHZlY3RvciBib29sIHNob3J0KV9fYnVpbHRpbl9zMzkwX3ZmYWVocyhfX2EsIF9fYiwgNCwgX19jYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIGludAordmVjX2ZpbmRfYW55X2VxX2NjKHZlY3RvciBzaWduZWQgaW50IF9fYSwgdmVjdG9yIHNpZ25lZCBpbnQgX19iLCBpbnQgKl9fY2MpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBpbnQpCisgICAgX19idWlsdGluX3MzOTBfdmZhZWZzKCh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iLCA0LCBfX2NjKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgaW50Cit2ZWNfZmluZF9hbnlfZXFfY2ModmVjdG9yIGJvb2wgaW50IF9fYSwgdmVjdG9yIGJvb2wgaW50IF9fYiwgaW50ICpfX2NjKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgaW50KQorICAgIF9fYnVpbHRpbl9zMzkwX3ZmYWVmcygodmVjdG9yIHVuc2lnbmVkIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYiwgNCwgX19jYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIGludAordmVjX2ZpbmRfYW55X2VxX2NjKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICBpbnQgKl9fY2MpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBpbnQpX19idWlsdGluX3MzOTBfdmZhZWZzKF9fYSwgX19iLCA0LCBfX2NjKTsKK30KKworLyotLSB2ZWNfZmluZF9hbnlfZXFfaWR4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGNoYXIKK3ZlY19maW5kX2FueV9lcV9pZHgodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgY2hhcikKKyAgICBfX2J1aWx0aW5fczM5MF92ZmFlYigodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IsIDApOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgY2hhcgordmVjX2ZpbmRfYW55X2VxX2lkeCh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZmYWViKCh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iLCAwKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGNoYXIKK3ZlY19maW5kX2FueV9lcV9pZHgodmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZmYWViKF9fYSwgX19iLCAwKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBzaG9ydAordmVjX2ZpbmRfYW55X2VxX2lkeCh2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIHNob3J0KQorICAgIF9fYnVpbHRpbl9zMzkwX3ZmYWVoKCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19iLCAwKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIHNob3J0Cit2ZWNfZmluZF9hbnlfZXFfaWR4KHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92ZmFlaCgodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19iLCAwKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIHNob3J0Cit2ZWNfZmluZF9hbnlfZXFfaWR4KHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZmYWVoKF9fYSwgX19iLCAwKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBpbnQKK3ZlY19maW5kX2FueV9lcV9pZHgodmVjdG9yIHNpZ25lZCBpbnQgX19hLCB2ZWN0b3Igc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGludCkKKyAgICBfX2J1aWx0aW5fczM5MF92ZmFlZigodmVjdG9yIHVuc2lnbmVkIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iLCAwKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGludAordmVjX2ZpbmRfYW55X2VxX2lkeCh2ZWN0b3IgYm9vbCBpbnQgX19hLCB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92ZmFlZigodmVjdG9yIHVuc2lnbmVkIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGludClfX2IsIDApOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgaW50Cit2ZWNfZmluZF9hbnlfZXFfaWR4KHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmZhZWYoX19hLCBfX2IsIDApOworfQorCisvKi0tIHZlY19maW5kX2FueV9lcV9pZHhfY2MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgY2hhcgordmVjX2ZpbmRfYW55X2VxX2lkeF9jYyh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgKl9fY2MpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGNoYXIpCisgICAgX19idWlsdGluX3MzOTBfdmZhZWJzKCh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IsIDAsIF9fY2MpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgY2hhcgordmVjX2ZpbmRfYW55X2VxX2lkeF9jYyh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIGJvb2wgY2hhciBfX2IsIGludCAqX19jYykgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmZhZWJzKCh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYiwgMCwgX19jYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBjaGFyCit2ZWNfZmluZF9hbnlfZXFfaWR4X2NjKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgKl9fY2MpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZmYWVicyhfX2EsIF9fYiwgMCwgX19jYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgc2hvcnQKK3ZlY19maW5kX2FueV9lcV9pZHhfY2ModmVjdG9yIHNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBzaWduZWQgc2hvcnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgKl9fY2MpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIHNob3J0KQorICAgIF9fYnVpbHRpbl9zMzkwX3ZmYWVocygodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2IsIDAsIF9fY2MpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgc2hvcnQKK3ZlY19maW5kX2FueV9lcV9pZHhfY2ModmVjdG9yIGJvb2wgc2hvcnQgX19hLCB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAqX19jYykgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmZhZWhzKCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19iLCAwLCBfX2NjKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIHNob3J0Cit2ZWNfZmluZF9hbnlfZXFfaWR4X2NjKHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAqX19jYykgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmZhZWhzKF9fYSwgX19iLCAwLCBfX2NjKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBpbnQKK3ZlY19maW5kX2FueV9lcV9pZHhfY2ModmVjdG9yIHNpZ25lZCBpbnQgX19hLCB2ZWN0b3Igc2lnbmVkIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAqX19jYykgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgaW50KQorICAgIF9fYnVpbHRpbl9zMzkwX3ZmYWVmcygodmVjdG9yIHVuc2lnbmVkIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYiwgMCwgX19jYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBpbnQKK3ZlY19maW5kX2FueV9lcV9pZHhfY2ModmVjdG9yIGJvb2wgaW50IF9fYSwgdmVjdG9yIGJvb2wgaW50IF9fYiwgaW50ICpfX2NjKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92ZmFlZnMoKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYiwgMCwgX19jYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBpbnQKK3ZlY19maW5kX2FueV9lcV9pZHhfY2ModmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgKl9fY2MpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZmYWVmcyhfX2EsIF9fYiwgMCwgX19jYyk7Cit9CisKKy8qLS0gdmVjX2ZpbmRfYW55X2VxX29yXzBfaWR4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBjaGFyCit2ZWNfZmluZF9hbnlfZXFfb3JfMF9pZHgodmVjdG9yIHNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgY2hhcikKKyAgICBfX2J1aWx0aW5fczM5MF92ZmFlemIoKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYiwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBjaGFyCit2ZWNfZmluZF9hbnlfZXFfb3JfMF9pZHgodmVjdG9yIGJvb2wgY2hhciBfX2EsIHZlY3RvciBib29sIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92ZmFlemIoKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iLCAwKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGNoYXIKK3ZlY19maW5kX2FueV9lcV9vcl8wX2lkeCh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmZhZXpiKF9fYSwgX19iLCAwKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBzaG9ydAordmVjX2ZpbmRfYW55X2VxX29yXzBfaWR4KHZlY3RvciBzaWduZWQgc2hvcnQgX19hLCB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgc2hvcnQpCisgICAgX19idWlsdGluX3MzOTBfdmZhZXpoKCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYiwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBzaG9ydAordmVjX2ZpbmRfYW55X2VxX29yXzBfaWR4KHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92ZmFlemgoKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2IsIDApOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgc2hvcnQKK3ZlY19maW5kX2FueV9lcV9vcl8wX2lkeCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92ZmFlemgoX19hLCBfX2IsIDApOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGludAordmVjX2ZpbmRfYW55X2VxX29yXzBfaWR4KHZlY3RvciBzaWduZWQgaW50IF9fYSwgdmVjdG9yIHNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBpbnQpCisgICAgX19idWlsdGluX3MzOTBfdmZhZXpmKCh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iLCAwKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGludAordmVjX2ZpbmRfYW55X2VxX29yXzBfaWR4KHZlY3RvciBib29sIGludCBfX2EsIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZmYWV6ZigodmVjdG9yIHVuc2lnbmVkIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iLCAwKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGludAordmVjX2ZpbmRfYW55X2VxX29yXzBfaWR4KHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmZhZXpmKF9fYSwgX19iLCAwKTsKK30KKworLyotLSB2ZWNfZmluZF9hbnlfZXFfb3JfMF9pZHhfY2MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGNoYXIKK3ZlY19maW5kX2FueV9lcV9vcl8wX2lkeF9jYyh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqX19jYykgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgY2hhcikKKyAgICBfX2J1aWx0aW5fczM5MF92ZmFlemJzKCh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iLCAwLCBfX2NjKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGNoYXIKK3ZlY19maW5kX2FueV9lcV9vcl8wX2lkeF9jYyh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIGJvb2wgY2hhciBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpfX2NjKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92ZmFlemJzKCh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IsIDAsIF9fY2MpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgY2hhcgordmVjX2ZpbmRfYW55X2VxX29yXzBfaWR4X2NjKHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqX19jYykgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmZhZXpicyhfX2EsIF9fYiwgMCwgX19jYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgc2hvcnQKK3ZlY19maW5kX2FueV9lcV9vcl8wX2lkeF9jYyh2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHNpZ25lZCBzaG9ydCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpfX2NjKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBzaG9ydCkKKyAgICBfX2J1aWx0aW5fczM5MF92ZmFlemhzKCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2IsIDAsIF9fY2MpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgc2hvcnQKK3ZlY19maW5kX2FueV9lcV9vcl8wX2lkeF9jYyh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIHZlY3RvciBib29sIHNob3J0IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKl9fY2MpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZmYWV6aHMoKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19iLCAwLCBfX2NjKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIHNob3J0Cit2ZWNfZmluZF9hbnlfZXFfb3JfMF9pZHhfY2ModmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iLCBpbnQgKl9fY2MpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZmYWV6aHMoX19hLCBfX2IsIDAsIF9fY2MpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGludAordmVjX2ZpbmRfYW55X2VxX29yXzBfaWR4X2NjKHZlY3RvciBzaWduZWQgaW50IF9fYSwgdmVjdG9yIHNpZ25lZCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqX19jYykgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgaW50KQorICAgIF9fYnVpbHRpbl9zMzkwX3ZmYWV6ZnMoKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iLCAwLCBfX2NjKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGludAordmVjX2ZpbmRfYW55X2VxX29yXzBfaWR4X2NjKHZlY3RvciBib29sIGludCBfX2EsIHZlY3RvciBib29sIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpfX2NjKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92ZmFlemZzKCh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iLCAwLCBfX2NjKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGludAordmVjX2ZpbmRfYW55X2VxX29yXzBfaWR4X2NjKHZlY3RvciB1bnNpZ25lZCBpbnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKl9fY2MpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZmYWV6ZnMoX19hLCBfX2IsIDAsIF9fY2MpOworfQorCisvKi0tIHZlY19maW5kX2FueV9uZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIGNoYXIKK3ZlY19maW5kX2FueV9uZSh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgY2hhcikKKyAgICBfX2J1aWx0aW5fczM5MF92ZmFlYigodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IsIDEyKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgY2hhcgordmVjX2ZpbmRfYW55X25lKHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIGNoYXIpCisgICAgX19idWlsdGluX3MzOTBfdmZhZWIoKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iLCAxMik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIGNoYXIKK3ZlY19maW5kX2FueV9uZSh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gKHZlY3RvciBib29sIGNoYXIpX19idWlsdGluX3MzOTBfdmZhZWIoX19hLCBfX2IsIDEyKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgc2hvcnQKK3ZlY19maW5kX2FueV9uZSh2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBzaG9ydCkKKyAgICBfX2J1aWx0aW5fczM5MF92ZmFlaCgodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYiwgMTIpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBzaG9ydAordmVjX2ZpbmRfYW55X25lKHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIGJvb2wgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgc2hvcnQpCisgICAgX19idWlsdGluX3MzOTBfdmZhZWgoKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2IsIDEyKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgc2hvcnQKK3ZlY19maW5kX2FueV9uZSh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLCB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgc2hvcnQpX19idWlsdGluX3MzOTBfdmZhZWgoX19hLCBfX2IsIDEyKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgaW50Cit2ZWNfZmluZF9hbnlfbmUodmVjdG9yIHNpZ25lZCBpbnQgX19hLCB2ZWN0b3Igc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBpbnQpCisgICAgX19idWlsdGluX3MzOTBfdmZhZWYoKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYiwgMTIpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBpbnQKK3ZlY19maW5kX2FueV9uZSh2ZWN0b3IgYm9vbCBpbnQgX19hLCB2ZWN0b3IgYm9vbCBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgaW50KQorICAgIF9fYnVpbHRpbl9zMzkwX3ZmYWVmKCh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGludClfX2IsIDEyKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgaW50Cit2ZWNfZmluZF9hbnlfbmUodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgaW50KV9fYnVpbHRpbl9zMzkwX3ZmYWVmKF9fYSwgX19iLCAxMik7Cit9CisKKy8qLS0gdmVjX2ZpbmRfYW55X25lX2NjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgY2hhcgordmVjX2ZpbmRfYW55X25lX2NjKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciBzaWduZWQgY2hhciBfX2IsIGludCAqX19jYykgeworICByZXR1cm4gKHZlY3RvciBib29sIGNoYXIpCisgICAgX19idWlsdGluX3MzOTBfdmZhZWJzKCh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IsIDEyLCBfX2NjKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgY2hhcgordmVjX2ZpbmRfYW55X25lX2NjKHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3IgYm9vbCBjaGFyIF9fYiwgaW50ICpfX2NjKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgY2hhcikKKyAgICBfX2J1aWx0aW5fczM5MF92ZmFlYnMoKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYiwgMTIsIF9fY2MpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBjaGFyCit2ZWNfZmluZF9hbnlfbmVfY2ModmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IsCisgICAgICAgICAgICAgICAgICAgaW50ICpfX2NjKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgY2hhcilfX2J1aWx0aW5fczM5MF92ZmFlYnMoX19hLCBfX2IsIDEyLCBfX2NjKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgc2hvcnQKK3ZlY19maW5kX2FueV9uZV9jYyh2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHNpZ25lZCBzaG9ydCBfX2IsCisgICAgICAgICAgICAgICAgICAgaW50ICpfX2NjKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgc2hvcnQpCisgICAgX19idWlsdGluX3MzOTBfdmZhZWhzKCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYiwgMTIsIF9fY2MpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBzaG9ydAordmVjX2ZpbmRfYW55X25lX2NjKHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIGJvb2wgc2hvcnQgX19iLCBpbnQgKl9fY2MpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBzaG9ydCkKKyAgICBfX2J1aWx0aW5fczM5MF92ZmFlaHMoKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19iLCAxMiwgX19jYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBib29sIHNob3J0Cit2ZWNfZmluZF9hbnlfbmVfY2ModmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYiwKKyAgICAgICAgICAgICAgICAgICBpbnQgKl9fY2MpIHsKKyAgcmV0dXJuICh2ZWN0b3IgYm9vbCBzaG9ydClfX2J1aWx0aW5fczM5MF92ZmFlaHMoX19hLCBfX2IsIDEyLCBfX2NjKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgaW50Cit2ZWNfZmluZF9hbnlfbmVfY2ModmVjdG9yIHNpZ25lZCBpbnQgX19hLCB2ZWN0b3Igc2lnbmVkIGludCBfX2IsIGludCAqX19jYykgeworICByZXR1cm4gKHZlY3RvciBib29sIGludCkKKyAgICBfX2J1aWx0aW5fczM5MF92ZmFlZnMoKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGludClfX2IsIDEyLCBfX2NjKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIGJvb2wgaW50Cit2ZWNfZmluZF9hbnlfbmVfY2ModmVjdG9yIGJvb2wgaW50IF9fYSwgdmVjdG9yIGJvb2wgaW50IF9fYiwgaW50ICpfX2NjKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgaW50KQorICAgIF9fYnVpbHRpbl9zMzkwX3ZmYWVmcygodmVjdG9yIHVuc2lnbmVkIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYiwgMTIsIF9fY2MpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgYm9vbCBpbnQKK3ZlY19maW5kX2FueV9uZV9jYyh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgaW50ICpfX2NjKSB7CisgIHJldHVybiAodmVjdG9yIGJvb2wgaW50KV9fYnVpbHRpbl9zMzkwX3ZmYWVmcyhfX2EsIF9fYiwgMTIsIF9fY2MpOworfQorCisvKi0tIHZlY19maW5kX2FueV9uZV9pZHggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgY2hhcgordmVjX2ZpbmRfYW55X25lX2lkeCh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBjaGFyKQorICAgIF9fYnVpbHRpbl9zMzkwX3ZmYWViKCh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYiwgOCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBjaGFyCit2ZWNfZmluZF9hbnlfbmVfaWR4KHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3IgYm9vbCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmZhZWIoKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IsIDgpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgY2hhcgordmVjX2ZpbmRfYW55X25lX2lkeCh2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2EsIHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYikgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmZhZWIoX19hLCBfX2IsIDgpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIHNob3J0Cit2ZWNfZmluZF9hbnlfbmVfaWR4KHZlY3RvciBzaWduZWQgc2hvcnQgX19hLCB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgc2hvcnQpCisgICAgX19idWlsdGluX3MzOTBfdmZhZWgoKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2IsIDgpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgc2hvcnQKK3ZlY19maW5kX2FueV9uZV9pZHgodmVjdG9yIGJvb2wgc2hvcnQgX19hLCB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZmYWVoKCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2IsIDgpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgc2hvcnQKK3ZlY19maW5kX2FueV9uZV9pZHgodmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYikgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmZhZWgoX19hLCBfX2IsIDgpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGludAordmVjX2ZpbmRfYW55X25lX2lkeCh2ZWN0b3Igc2lnbmVkIGludCBfX2EsIHZlY3RvciBzaWduZWQgaW50IF9fYikgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgaW50KQorICAgIF9fYnVpbHRpbl9zMzkwX3ZmYWVmKCh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGludClfX2IsIDgpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgaW50Cit2ZWNfZmluZF9hbnlfbmVfaWR4KHZlY3RvciBib29sIGludCBfX2EsIHZlY3RvciBib29sIGludCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZmYWVmKCh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYiwgOCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBpbnQKK3ZlY19maW5kX2FueV9uZV9pZHgodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92ZmFlZihfX2EsIF9fYiwgOCk7Cit9CisKKy8qLS0gdmVjX2ZpbmRfYW55X25lX2lkeF9jYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBjaGFyCit2ZWNfZmluZF9hbnlfbmVfaWR4X2NjKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciBzaWduZWQgY2hhciBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAqX19jYykgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgY2hhcikKKyAgICBfX2J1aWx0aW5fczM5MF92ZmFlYnMoKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYiwgOCwgX19jYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBjaGFyCit2ZWNfZmluZF9hbnlfbmVfaWR4X2NjKHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3IgYm9vbCBjaGFyIF9fYiwgaW50ICpfX2NjKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92ZmFlYnMoKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iLCA4LCBfX2NjKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGNoYXIKK3ZlY19maW5kX2FueV9uZV9pZHhfY2ModmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAqX19jYykgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmZhZWJzKF9fYSwgX19iLCA4LCBfX2NjKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBzaG9ydAordmVjX2ZpbmRfYW55X25lX2lkeF9jYyh2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHNpZ25lZCBzaG9ydCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAqX19jYykgeworICByZXR1cm4gKHZlY3RvciBzaWduZWQgc2hvcnQpCisgICAgX19idWlsdGluX3MzOTBfdmZhZWhzKCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYiwgOCwgX19jYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBzaG9ydAordmVjX2ZpbmRfYW55X25lX2lkeF9jYyh2ZWN0b3IgYm9vbCBzaG9ydCBfX2EsIHZlY3RvciBib29sIHNob3J0IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICpfX2NjKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92ZmFlaHMoKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2IsIDgsIF9fY2MpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgc2hvcnQKK3ZlY19maW5kX2FueV9uZV9pZHhfY2ModmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYSwgdmVjdG9yIHVuc2lnbmVkIHNob3J0IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICpfX2NjKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92ZmFlaHMoX19hLCBfX2IsIDgsIF9fY2MpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGludAordmVjX2ZpbmRfYW55X25lX2lkeF9jYyh2ZWN0b3Igc2lnbmVkIGludCBfX2EsIHZlY3RvciBzaWduZWQgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICpfX2NjKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBpbnQpCisgICAgX19idWlsdGluX3MzOTBfdmZhZWZzKCh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iLCA4LCBfX2NjKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGludAordmVjX2ZpbmRfYW55X25lX2lkeF9jYyh2ZWN0b3IgYm9vbCBpbnQgX19hLCB2ZWN0b3IgYm9vbCBpbnQgX19iLCBpbnQgKl9fY2MpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZmYWVmcygodmVjdG9yIHVuc2lnbmVkIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBpbnQpX19iLCA4LCBfX2NjKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGludAordmVjX2ZpbmRfYW55X25lX2lkeF9jYyh2ZWN0b3IgdW5zaWduZWQgaW50IF9fYSwgdmVjdG9yIHVuc2lnbmVkIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAqX19jYykgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmZhZWZzKF9fYSwgX19iLCA4LCBfX2NjKTsKK30KKworLyotLSB2ZWNfZmluZF9hbnlfbmVfb3JfMF9pZHggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIGNoYXIKK3ZlY19maW5kX2FueV9uZV9vcl8wX2lkeCh2ZWN0b3Igc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3Igc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBjaGFyKQorICAgIF9fYnVpbHRpbl9zMzkwX3ZmYWV6YigodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19iLCA4KTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIGNoYXIKK3ZlY19maW5kX2FueV9uZV9vcl8wX2lkeCh2ZWN0b3IgYm9vbCBjaGFyIF9fYSwgdmVjdG9yIGJvb2wgY2hhciBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZmYWV6YigodmVjdG9yIHVuc2lnbmVkIGNoYXIpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IsIDgpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgY2hhcgordmVjX2ZpbmRfYW55X25lX29yXzBfaWR4KHZlY3RvciB1bnNpZ25lZCBjaGFyIF9fYSwgdmVjdG9yIHVuc2lnbmVkIGNoYXIgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92ZmFlemIoX19hLCBfX2IsIDgpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3Igc2lnbmVkIHNob3J0Cit2ZWNfZmluZF9hbnlfbmVfb3JfMF9pZHgodmVjdG9yIHNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciBzaWduZWQgc2hvcnQgX19iKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBzaG9ydCkKKyAgICBfX2J1aWx0aW5fczM5MF92ZmFlemgoKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpX19iLCA4KTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHVuc2lnbmVkIHNob3J0Cit2ZWNfZmluZF9hbnlfbmVfb3JfMF9pZHgodmVjdG9yIGJvb2wgc2hvcnQgX19hLCB2ZWN0b3IgYm9vbCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZmYWV6aCgodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYiwgOCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBzaG9ydAordmVjX2ZpbmRfYW55X25lX29yXzBfaWR4KHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2EsIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZmYWV6aChfX2EsIF9fYiwgOCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgaW50Cit2ZWNfZmluZF9hbnlfbmVfb3JfMF9pZHgodmVjdG9yIHNpZ25lZCBpbnQgX19hLCB2ZWN0b3Igc2lnbmVkIGludCBfX2IpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIGludCkKKyAgICBfX2J1aWx0aW5fczM5MF92ZmFlemYoKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGludClfX2IsIDgpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgaW50Cit2ZWNfZmluZF9hbnlfbmVfb3JfMF9pZHgodmVjdG9yIGJvb2wgaW50IF9fYSwgdmVjdG9yIGJvb2wgaW50IF9fYikgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmZhZXpmKCh2ZWN0b3IgdW5zaWduZWQgaW50KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGludClfX2IsIDgpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgaW50Cit2ZWNfZmluZF9hbnlfbmVfb3JfMF9pZHgodmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92ZmFlemYoX19hLCBfX2IsIDgpOworfQorCisvKi0tIHZlY19maW5kX2FueV9uZV9vcl8wX2lkeF9jYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgY2hhcgordmVjX2ZpbmRfYW55X25lX29yXzBfaWR4X2NjKHZlY3RvciBzaWduZWQgY2hhciBfX2EsIHZlY3RvciBzaWduZWQgY2hhciBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpfX2NjKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBjaGFyKQorICAgIF9fYnVpbHRpbl9zMzkwX3ZmYWV6YnMoKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcilfX2IsIDgsIF9fY2MpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgY2hhcgordmVjX2ZpbmRfYW55X25lX29yXzBfaWR4X2NjKHZlY3RvciBib29sIGNoYXIgX19hLCB2ZWN0b3IgYm9vbCBjaGFyIF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKl9fY2MpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZmYWV6YnMoKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKV9fYiwgOCwgX19jYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBjaGFyCit2ZWNfZmluZF9hbnlfbmVfb3JfMF9pZHhfY2ModmVjdG9yIHVuc2lnbmVkIGNoYXIgX19hLCB2ZWN0b3IgdW5zaWduZWQgY2hhciBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpfX2NjKSB7CisgIHJldHVybiBfX2J1aWx0aW5fczM5MF92ZmFlemJzKF9fYSwgX19iLCA4LCBfX2NjKTsKK30KKworc3RhdGljIGlubGluZSBfX0FUVFJTX29fYWkgdmVjdG9yIHNpZ25lZCBzaG9ydAordmVjX2ZpbmRfYW55X25lX29yXzBfaWR4X2NjKHZlY3RvciBzaWduZWQgc2hvcnQgX19hLCB2ZWN0b3Igc2lnbmVkIHNob3J0IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKl9fY2MpIHsKKyAgcmV0dXJuICh2ZWN0b3Igc2lnbmVkIHNob3J0KQorICAgIF9fYnVpbHRpbl9zMzkwX3ZmYWV6aHMoKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYiwgOCwgX19jYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciB1bnNpZ25lZCBzaG9ydAordmVjX2ZpbmRfYW55X25lX29yXzBfaWR4X2NjKHZlY3RvciBib29sIHNob3J0IF9fYSwgdmVjdG9yIGJvb2wgc2hvcnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqX19jYykgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmZhZXpocygodmVjdG9yIHVuc2lnbmVkIHNob3J0KV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBzaG9ydClfX2IsIDgsIF9fY2MpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgc2hvcnQKK3ZlY19maW5kX2FueV9uZV9vcl8wX2lkeF9jYyh2ZWN0b3IgdW5zaWduZWQgc2hvcnQgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBfX2IsIGludCAqX19jYykgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmZhZXpocyhfX2EsIF9fYiwgOCwgX19jYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19BVFRSU19vX2FpIHZlY3RvciBzaWduZWQgaW50Cit2ZWNfZmluZF9hbnlfbmVfb3JfMF9pZHhfY2ModmVjdG9yIHNpZ25lZCBpbnQgX19hLCB2ZWN0b3Igc2lnbmVkIGludCBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpfX2NjKSB7CisgIHJldHVybiAodmVjdG9yIHNpZ25lZCBpbnQpCisgICAgX19idWlsdGluX3MzOTBfdmZhZXpmcygodmVjdG9yIHVuc2lnbmVkIGludClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGludClfX2IsIDgsIF9fY2MpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgaW50Cit2ZWNfZmluZF9hbnlfbmVfb3JfMF9pZHhfY2ModmVjdG9yIGJvb2wgaW50IF9fYSwgdmVjdG9yIGJvb2wgaW50IF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKl9fY2MpIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zMzkwX3ZmYWV6ZnMoKHZlY3RvciB1bnNpZ25lZCBpbnQpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGludClfX2IsIDgsIF9fY2MpOworfQorCitzdGF0aWMgaW5saW5lIF9fQVRUUlNfb19haSB2ZWN0b3IgdW5zaWduZWQgaW50Cit2ZWNfZmluZF9hbnlfbmVfb3JfMF9pZHhfY2ModmVjdG9yIHVuc2lnbmVkIGludCBfX2EsIHZlY3RvciB1bnNpZ25lZCBpbnQgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqX19jYykgeworICByZXR1cm4gX19idWlsdGluX3MzOTBfdmZhZXpmcyhfX2EsIF9fYiwgOCwgX19jYyk7Cit9CisKKyN1bmRlZiBfX2NvbnN0YW50X3BvdzJfcmFuZ2UKKyN1bmRlZiBfX2NvbnN0YW50X3JhbmdlCisjdW5kZWYgX19jb25zdGFudAorI3VuZGVmIF9fQVRUUlNfbworI3VuZGVmIF9fQVRUUlNfb19haQorI3VuZGVmIF9fQVRUUlNfYWkKKworI2Vsc2UKKworI2Vycm9yICJVc2UgLWZ6dmVjdG9yIHRvIGVuYWJsZSB2ZWN0b3IgZXh0ZW5zaW9ucyIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS93bW1pbnRyaW4uaCBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL3dtbWludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZDkzMTAKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS93bW1pbnRyaW4uaApAQCAtMCwwICsxLDMzIEBACisvKj09PS0tLS0gd21taW50cmluLmggLSBBRVMgaW50cmluc2ljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKgorICo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICovCisKKyNpZm5kZWYgX1dNTUlOVFJJTl9ICisjZGVmaW5lIF9XTU1JTlRSSU5fSAorCisjaW5jbHVkZSA8ZW1taW50cmluLmg+CisKKyNpbmNsdWRlIDxfX3dtbWludHJpbl9hZXMuaD4KKworI2luY2x1ZGUgPF9fd21taW50cmluX3BjbG11bC5oPgorCisjZW5kaWYgLyogX1dNTUlOVFJJTl9IICovCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS94ODZpbnRyaW4uaCBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL3g4NmludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxYTQwNGYKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS94ODZpbnRyaW4uaApAQCAtMCwwICsxLDg1IEBACisvKj09PS0tLS0geDg2aW50cmluLmggLSBYODYgaW50cmluc2ljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICoKKyAqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqLworCisjaWZuZGVmIF9fWDg2SU5UUklOX0gKKyNkZWZpbmUgX19YODZJTlRSSU5fSAorCisjaW5jbHVkZSA8aWEzMmludHJpbi5oPgorCisjaW5jbHVkZSA8aW1taW50cmluLmg+CisKKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX19oYXNfZmVhdHVyZShtb2R1bGVzKSB8fCBkZWZpbmVkKF9fM2ROT1dfXykKKyNpbmNsdWRlIDxtbTNkbm93Lmg+CisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfX2hhc19mZWF0dXJlKG1vZHVsZXMpIHx8IGRlZmluZWQoX19CTUlfXykKKyNpbmNsdWRlIDxibWlpbnRyaW4uaD4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9faGFzX2ZlYXR1cmUobW9kdWxlcykgfHwgZGVmaW5lZChfX0JNSTJfXykKKyNpbmNsdWRlIDxibWkyaW50cmluLmg+CisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfX2hhc19mZWF0dXJlKG1vZHVsZXMpIHx8IGRlZmluZWQoX19MWkNOVF9fKQorI2luY2x1ZGUgPGx6Y250aW50cmluLmg+CisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfX2hhc19mZWF0dXJlKG1vZHVsZXMpIHx8IGRlZmluZWQoX19QT1BDTlRfXykKKyNpbmNsdWRlIDxwb3BjbnRpbnRyaW4uaD4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9faGFzX2ZlYXR1cmUobW9kdWxlcykgfHwgZGVmaW5lZChfX1JEU0VFRF9fKQorI2luY2x1ZGUgPHJkc2VlZGludHJpbi5oPgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX19oYXNfZmVhdHVyZShtb2R1bGVzKSB8fCBkZWZpbmVkKF9fUFJGQ0hXX18pCisjaW5jbHVkZSA8cHJmY2h3aW50cmluLmg+CisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfX2hhc19mZWF0dXJlKG1vZHVsZXMpIHx8IGRlZmluZWQoX19TU0U0QV9fKQorI2luY2x1ZGUgPGFtbWludHJpbi5oPgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX19oYXNfZmVhdHVyZShtb2R1bGVzKSB8fCBkZWZpbmVkKF9fRk1BNF9fKQorI2luY2x1ZGUgPGZtYTRpbnRyaW4uaD4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9faGFzX2ZlYXR1cmUobW9kdWxlcykgfHwgZGVmaW5lZChfX1hPUF9fKQorI2luY2x1ZGUgPHhvcGludHJpbi5oPgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX19oYXNfZmVhdHVyZShtb2R1bGVzKSB8fCBkZWZpbmVkKF9fVEJNX18pCisjaW5jbHVkZSA8dGJtaW50cmluLmg+CisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfX2hhc19mZWF0dXJlKG1vZHVsZXMpIHx8IGRlZmluZWQoX19GMTZDX18pCisjaW5jbHVkZSA8ZjE2Y2ludHJpbi5oPgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX19oYXNfZmVhdHVyZShtb2R1bGVzKSB8fCBkZWZpbmVkKF9fTVdBSVRYX18pCisjaW5jbHVkZSA8bXdhaXR4aW50cmluLmg+CisjZW5kaWYKKworLyogRklYTUU6IExXUCAqLworCisjZW5kaWYgLyogX19YODZJTlRSSU5fSCAqLwpkaWZmIC0tZ2l0IGEvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUveG1taW50cmluLmggYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS94bW1pbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTEwZThiCi0tLSAvZGV2L251bGwKKysrIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUveG1taW50cmluLmgKQEAgLTAsMCArMSwyODkzIEBACisvKj09PS0tLS0geG1taW50cmluLmggLSBTU0UgaW50cmluc2ljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICoKKyAqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqLworCisjaWZuZGVmIF9fWE1NSU5UUklOX0gKKyNkZWZpbmUgX19YTU1JTlRSSU5fSAorCisjaW5jbHVkZSA8bW1pbnRyaW4uaD4KKwordHlwZWRlZiBpbnQgX192NHNpIF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXygxNikpKTsKK3R5cGVkZWYgZmxvYXQgX192NHNmIF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXygxNikpKTsKK3R5cGVkZWYgZmxvYXQgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXygxNikpKTsKKworLyogVW5zaWduZWQgdHlwZXMgKi8KK3R5cGVkZWYgdW5zaWduZWQgaW50IF9fdjRzdSBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oMTYpKSk7CisKKy8qIFRoaXMgaGVhZGVyIHNob3VsZCBvbmx5IGJlIGluY2x1ZGVkIGluIGEgaG9zdGVkIGVudmlyb25tZW50IGFzIGl0IGRlcGVuZHMgb24KKyAqIGEgc3RhbmRhcmQgbGlicmFyeSB0byBwcm92aWRlIGFsbG9jYXRpb24gcm91dGluZXMuICovCisjaWYgX19TVERDX0hPU1RFRF9fCisjaW5jbHVkZSA8bW1fbWFsbG9jLmg+CisjZW5kaWYKKworLyogRGVmaW5lIHRoZSBkZWZhdWx0IGF0dHJpYnV0ZXMgZm9yIHRoZSBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlLiAqLworI2RlZmluZSBfX0RFRkFVTFRfRk5fQVRUUlMgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fLCBfX3RhcmdldF9fKCJzc2UiKSkpCisKKy8vLyBcYnJpZWYgQWRkcyB0aGUgMzItYml0IGZsb2F0IHZhbHVlcyBpbiB0aGUgbG93LW9yZGVyIGJpdHMgb2YgdGhlIG9wZXJhbmRzLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZBRERTUyAvIEFERFNTIGluc3RydWN0aW9ucy4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBzb3VyY2Ugb3BlcmFuZHMuCisvLy8gICAgVGhlIGxvd2VyIDMyIGJpdHMgb2YgdGhpcyBvcGVyYW5kIGFyZSB1c2VkIGluIHRoZSBjYWxjdWxhdGlvbi4KKy8vLyBccGFyYW0gX19iCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIG9uZSBvZiB0aGUgc291cmNlIG9wZXJhbmRzLgorLy8vICAgIFRoZSBsb3dlciAzMiBiaXRzIG9mIHRoaXMgb3BlcmFuZCBhcmUgdXNlZCBpbiB0aGUgY2FsY3VsYXRpb24uCisvLy8gXHJldHVybnMgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSB3aG9zZSBsb3dlciAzMiBiaXRzIGNvbnRhaW4gdGhlIHN1bQorLy8vICAgIG9mIHRoZSBsb3dlciAzMiBiaXRzIG9mIGJvdGggb3BlcmFuZHMuIFRoZSB1cHBlciA5NiBiaXRzIGFyZSBjb3BpZWQgZnJvbQorLy8vICAgIHRoZSB1cHBlciA5NiBiaXRzIG9mIHRoZSBmaXJzdCBzb3VyY2Ugb3BlcmFuZC4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9hZGRfc3MoX19tMTI4IF9fYSwgX19tMTI4IF9fYikKK3sKKyAgX19hWzBdICs9IF9fYlswXTsKKyAgcmV0dXJuIF9fYTsKK30KKworLy8vIFxicmllZiBBZGRzIHR3byAxMjgtYml0IHZlY3RvcnMgb2YgWzQgeCBmbG9hdF0sIGFuZCByZXR1cm5zIHRoZSByZXN1bHRzIG9mCisvLy8gICAgdGhlIGFkZGl0aW9uLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZBRERQUyAvIEFERFBTIGluc3RydWN0aW9ucy4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBzb3VyY2Ugb3BlcmFuZHMuCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0gY29udGFpbmluZyBvbmUgb2YgdGhlIHNvdXJjZSBvcGVyYW5kcy4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgdGhlIHN1bXMgb2YgYm90aAorLy8vICAgIG9wZXJhbmRzLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2FkZF9wcyhfX20xMjggX19hLCBfX20xMjggX19iKQoreworICByZXR1cm4gKF9fbTEyOCkoKF9fdjRzZilfX2EgKyAoX192NHNmKV9fYik7Cit9CisKKy8vLyBcYnJpZWYgU3VidHJhY3RzIHRoZSAzMi1iaXQgZmxvYXQgdmFsdWUgaW4gdGhlIGxvdy1vcmRlciBiaXRzIG9mIHRoZSBzZWNvbmQKKy8vLyAgICBvcGVyYW5kIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgaW4gdGhlIGZpcnN0IG9wZXJhbmQuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVlNVQlNTIC8gU1VCU1MgaW5zdHJ1Y3Rpb25zLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0gY29udGFpbmluZyB0aGUgbWludWVuZC4gVGhlIGxvd2VyIDMyIGJpdHMKKy8vLyAgICBvZiB0aGlzIG9wZXJhbmQgYXJlIHVzZWQgaW4gdGhlIGNhbGN1bGF0aW9uLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgdGhlIHN1YnRyYWhlbmQuIFRoZSBsb3dlciAzMgorLy8vICAgIGJpdHMgb2YgdGhpcyBvcGVyYW5kIGFyZSB1c2VkIGluIHRoZSBjYWxjdWxhdGlvbi4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIHdob3NlIGxvd2VyIDMyIGJpdHMgY29udGFpbiB0aGUKKy8vLyAgICBkaWZmZXJlbmNlIG9mIHRoZSBsb3dlciAzMiBiaXRzIG9mIGJvdGggb3BlcmFuZHMuIFRoZSB1cHBlciA5NiBiaXRzIGFyZQorLy8vICAgIGNvcGllZCBmcm9tIHRoZSB1cHBlciA5NiBiaXRzIG9mIHRoZSBmaXJzdCBzb3VyY2Ugb3BlcmFuZC4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zdWJfc3MoX19tMTI4IF9fYSwgX19tMTI4IF9fYikKK3sKKyAgX19hWzBdIC09IF9fYlswXTsKKyAgcmV0dXJuIF9fYTsKK30KKworLy8vIFxicmllZiBTdWJ0cmFjdHMgZWFjaCBvZiB0aGUgdmFsdWVzIG9mIHRoZSBzZWNvbmQgb3BlcmFuZCBmcm9tIHRoZSBmaXJzdAorLy8vICAgIG9wZXJhbmQsIGJvdGggb2Ygd2hpY2ggYXJlIDEyOC1iaXQgdmVjdG9ycyBvZiBbNCB4IGZsb2F0XSBhbmQgcmV0dXJucworLy8vICAgIHRoZSByZXN1bHRzIG9mIHRoZSBzdWJ0cmFjdGlvbi4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWU1VCUFMgLyBTVUJQUyBpbnN0cnVjdGlvbnMuCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSBtaW51ZW5kLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgdGhlIHN1YnRyYWhlbmQuCisvLy8gXHJldHVybnMgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuCisvLy8gICAgYm90aCBvcGVyYW5kcy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zdWJfcHMoX19tMTI4IF9fYSwgX19tMTI4IF9fYikKK3sKKyAgcmV0dXJuIChfX20xMjgpKChfX3Y0c2YpX19hIC0gKF9fdjRzZilfX2IpOworfQorCisvLy8gXGJyaWVmIE11bHRpcGxpZXMgdHdvIDMyLWJpdCBmbG9hdCB2YWx1ZXMgaW4gdGhlIGxvdy1vcmRlciBiaXRzIG9mIHRoZQorLy8vICAgIG9wZXJhbmRzLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZNVUxTUyAvIE1VTFNTIGluc3RydWN0aW9ucy4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBzb3VyY2Ugb3BlcmFuZHMuCisvLy8gICAgVGhlIGxvd2VyIDMyIGJpdHMgb2YgdGhpcyBvcGVyYW5kIGFyZSB1c2VkIGluIHRoZSBjYWxjdWxhdGlvbi4KKy8vLyBccGFyYW0gX19iCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIG9uZSBvZiB0aGUgc291cmNlIG9wZXJhbmRzLgorLy8vICAgIFRoZSBsb3dlciAzMiBiaXRzIG9mIHRoaXMgb3BlcmFuZCBhcmUgdXNlZCBpbiB0aGUgY2FsY3VsYXRpb24uCisvLy8gXHJldHVybnMgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSBwcm9kdWN0IG9mIHRoZSBsb3dlcgorLy8vICAgIDMyIGJpdHMgb2YgYm90aCBvcGVyYW5kcy4gVGhlIHVwcGVyIDk2IGJpdHMgYXJlIGNvcGllZCBmcm9tIHRoZSB1cHBlciA5NgorLy8vICAgIGJpdHMgb2YgdGhlIGZpcnN0IHNvdXJjZSBvcGVyYW5kLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX211bF9zcyhfX20xMjggX19hLCBfX20xMjggX19iKQoreworICBfX2FbMF0gKj0gX19iWzBdOworICByZXR1cm4gX19hOworfQorCisvLy8gXGJyaWVmIE11bHRpcGxpZXMgdHdvIDEyOC1iaXQgdmVjdG9ycyBvZiBbNCB4IGZsb2F0XSBhbmQgcmV0dXJucyB0aGUKKy8vLyAgICByZXN1bHRzIG9mIHRoZSBtdWx0aXBsaWNhdGlvbi4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWTVVMUFMgLyBNVUxQUyBpbnN0cnVjdGlvbnMuCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIG9uZSBvZiB0aGUgc291cmNlIG9wZXJhbmRzLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBzb3VyY2Ugb3BlcmFuZHMuCisvLy8gXHJldHVybnMgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSBwcm9kdWN0cyBvZiBib3RoCisvLy8gICAgb3BlcmFuZHMuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbXVsX3BzKF9fbTEyOCBfX2EsIF9fbTEyOCBfX2IpCit7CisgIHJldHVybiAoX19tMTI4KSgoX192NHNmKV9fYSAqIChfX3Y0c2YpX19iKTsKK30KKworLy8vIFxicmllZiBEaXZpZGVzIHRoZSB2YWx1ZSBpbiB0aGUgbG93LW9yZGVyIDMyIGJpdHMgb2YgdGhlIGZpcnN0IG9wZXJhbmQgYnkKKy8vLyAgICB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBpbiB0aGUgc2Vjb25kIG9wZXJhbmQuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVkRJVlNTIC8gRElWU1MgaW5zdHJ1Y3Rpb25zLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0gY29udGFpbmluZyB0aGUgZGl2aWRlbmQuIFRoZSBsb3dlciAzMgorLy8vICAgIGJpdHMgb2YgdGhpcyBvcGVyYW5kIGFyZSB1c2VkIGluIHRoZSBjYWxjdWxhdGlvbi4KKy8vLyBccGFyYW0gX19iCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSBkaXZpc29yLiBUaGUgbG93ZXIgMzIgYml0cworLy8vICAgIG9mIHRoaXMgb3BlcmFuZCBhcmUgdXNlZCBpbiB0aGUgY2FsY3VsYXRpb24uCisvLy8gXHJldHVybnMgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSBxdW90aWVudHMgb2YgdGhlCisvLy8gICAgbG93ZXIgMzIgYml0cyBvZiBib3RoIG9wZXJhbmRzLiBUaGUgdXBwZXIgOTYgYml0cyBhcmUgY29waWVkIGZyb20gdGhlCisvLy8gICAgdXBwZXIgOTYgYml0cyBvZiB0aGUgZmlyc3Qgc291cmNlIG9wZXJhbmQuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fZGl2X3NzKF9fbTEyOCBfX2EsIF9fbTEyOCBfX2IpCit7CisgIF9fYVswXSAvPSBfX2JbMF07CisgIHJldHVybiBfX2E7Cit9CisKKy8vLyBcYnJpZWYgRGl2aWRlcyB0d28gMTI4LWJpdCB2ZWN0b3JzIG9mIFs0IHggZmxvYXRdLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZESVZQUyAvIERJVlBTIGluc3RydWN0aW9ucy4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgdGhlIGRpdmlkZW5kLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgdGhlIGRpdmlzb3IuCisvLy8gXHJldHVybnMgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSBxdW90aWVudHMgb2YgYm90aAorLy8vICAgIG9wZXJhbmRzLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2Rpdl9wcyhfX20xMjggX19hLCBfX20xMjggX19iKQoreworICByZXR1cm4gKF9fbTEyOCkoKF9fdjRzZilfX2EgLyAoX192NHNmKV9fYik7Cit9CisKKy8vLyBcYnJpZWYgQ2FsY3VsYXRlcyB0aGUgc3F1YXJlIHJvb3Qgb2YgdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgbG93LW9yZGVyIGJpdHMKKy8vLyAgICBvZiBhIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZTUVJUU1MgLyBTUVJUU1MgaW5zdHJ1Y3Rpb25zLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0uIFRoZSBsb3dlciAzMiBiaXRzIG9mIHRoaXMgb3BlcmFuZCBhcmUKKy8vLyAgICB1c2VkIGluIHRoZSBjYWxjdWxhdGlvbi4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgdGhlIHNxdWFyZSByb290IG9mIHRoZQorLy8vICAgIHZhbHVlIGluIHRoZSBsb3ctb3JkZXIgYml0cyBvZiB0aGUgb3BlcmFuZC4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zcXJ0X3NzKF9fbTEyOCBfX2EpCit7CisgIF9fbTEyOCBfX2MgPSBfX2J1aWx0aW5faWEzMl9zcXJ0c3MoKF9fdjRzZilfX2EpOworICByZXR1cm4gKF9fbTEyOCkgeyBfX2NbMF0sIF9fYVsxXSwgX19hWzJdLCBfX2FbM10gfTsKK30KKworLy8vIFxicmllZiBDYWxjdWxhdGVzIHRoZSBzcXVhcmUgcm9vdHMgb2YgdGhlIHZhbHVlcyBzdG9yZWQgaW4gYSAxMjgtYml0IHZlY3RvcgorLy8vICAgIG9mIFs0IHggZmxvYXRdLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZTUVJUUFMgLyBTUVJUUFMgaW5zdHJ1Y3Rpb25zLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0uCisvLy8gXHJldHVybnMgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSBzcXVhcmUgcm9vdHMgb2YgdGhlCisvLy8gICAgdmFsdWVzIGluIHRoZSBvcGVyYW5kLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX3NxcnRfcHMoX19tMTI4IF9fYSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3NxcnRwcygoX192NHNmKV9fYSk7Cit9CisKKy8vLyBcYnJpZWYgQ2FsY3VsYXRlcyB0aGUgYXBwcm94aW1hdGUgcmVjaXByb2NhbCBvZiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZQorLy8vICAgIGxvdy1vcmRlciBiaXRzIG9mIGEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVlJDUFNTIC8gUkNQU1MgaW5zdHJ1Y3Rpb25zLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0uIFRoZSBsb3dlciAzMiBiaXRzIG9mIHRoaXMgb3BlcmFuZCBhcmUKKy8vLyAgICB1c2VkIGluIHRoZSBjYWxjdWxhdGlvbi4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgdGhlIGFwcHJveGltYXRlCisvLy8gICAgcmVjaXByb2NhbCBvZiB0aGUgdmFsdWUgaW4gdGhlIGxvdy1vcmRlciBiaXRzIG9mIHRoZSBvcGVyYW5kLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX3JjcF9zcyhfX20xMjggX19hKQoreworICBfX20xMjggX19jID0gX19idWlsdGluX2lhMzJfcmNwc3MoKF9fdjRzZilfX2EpOworICByZXR1cm4gKF9fbTEyOCkgeyBfX2NbMF0sIF9fYVsxXSwgX19hWzJdLCBfX2FbM10gfTsKK30KKworLy8vIFxicmllZiBDYWxjdWxhdGVzIHRoZSBhcHByb3hpbWF0ZSByZWNpcHJvY2FscyBvZiB0aGUgdmFsdWVzIHN0b3JlZCBpbiBhCisvLy8gICAgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVlJDUFBTIC8gUkNQUFMgaW5zdHJ1Y3Rpb25zLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0uCisvLy8gXHJldHVybnMgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSBhcHByb3hpbWF0ZQorLy8vICAgIHJlY2lwcm9jYWxzIG9mIHRoZSB2YWx1ZXMgaW4gdGhlIG9wZXJhbmQuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fcmNwX3BzKF9fbTEyOCBfX2EpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9yY3BwcygoX192NHNmKV9fYSk7Cit9CisKKy8vLyBcYnJpZWYgQ2FsY3VsYXRlcyB0aGUgYXBwcm94aW1hdGUgcmVjaXByb2NhbCBvZiB0aGUgc3F1YXJlIHJvb3Qgb2YgdGhlIHZhbHVlCisvLy8gICAgc3RvcmVkIGluIHRoZSBsb3ctb3JkZXIgYml0cyBvZiBhIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZSU1FSVFNTIC8gUlNRUlRTUyBpbnN0cnVjdGlvbnMuCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XS4gVGhlIGxvd2VyIDMyIGJpdHMgb2YgdGhpcyBvcGVyYW5kIGFyZQorLy8vICAgIHVzZWQgaW4gdGhlIGNhbGN1bGF0aW9uLgorLy8vIFxyZXR1cm5zIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0gY29udGFpbmluZyB0aGUgYXBwcm94aW1hdGUKKy8vLyAgICByZWNpcHJvY2FsIG9mIHRoZSBzcXVhcmUgcm9vdCBvZiB0aGUgdmFsdWUgaW4gdGhlIGxvdy1vcmRlciBiaXRzIG9mIHRoZQorLy8vICAgIG9wZXJhbmQuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fcnNxcnRfc3MoX19tMTI4IF9fYSkKK3sKKyAgX19tMTI4IF9fYyA9IF9fYnVpbHRpbl9pYTMyX3JzcXJ0c3MoKF9fdjRzZilfX2EpOworICByZXR1cm4gKF9fbTEyOCkgeyBfX2NbMF0sIF9fYVsxXSwgX19hWzJdLCBfX2FbM10gfTsKK30KKworLy8vIFxicmllZiBDYWxjdWxhdGVzIHRoZSBhcHByb3hpbWF0ZSByZWNpcHJvY2FscyBvZiB0aGUgc3F1YXJlIHJvb3RzIG9mIHRoZQorLy8vICAgIHZhbHVlcyBzdG9yZWQgaW4gYSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWUlNRUlRQUyAvIFJTUVJUUFMgaW5zdHJ1Y3Rpb25zLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0uCisvLy8gXHJldHVybnMgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSBhcHByb3hpbWF0ZQorLy8vICAgIHJlY2lwcm9jYWxzIG9mIHRoZSBzcXVhcmUgcm9vdHMgb2YgdGhlIHZhbHVlcyBpbiB0aGUgb3BlcmFuZC4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9yc3FydF9wcyhfX20xMjggX19hKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcnNxcnRwcygoX192NHNmKV9fYSk7Cit9CisKKy8vLyBcYnJpZWYgQ29tcGFyZXMgdHdvIDMyLWJpdCBmbG9hdCB2YWx1ZXMgaW4gdGhlIGxvdy1vcmRlciBiaXRzIG9mIGJvdGgKKy8vLyAgICBvcGVyYW5kcyBhbmQgcmV0dXJucyB0aGUgbGVzc2VyIHZhbHVlIGluIHRoZSBsb3ctb3JkZXIgYml0cyBvZiB0aGUKKy8vLyAgICB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVk1JTlNTIC8gTUlOU1MgaW5zdHJ1Y3Rpb25zLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0gY29udGFpbmluZyBvbmUgb2YgdGhlIG9wZXJhbmRzLiBUaGUgbG93ZXIKKy8vLyAgICAzMiBiaXRzIG9mIHRoaXMgb3BlcmFuZCBhcmUgdXNlZCBpbiB0aGUgY29tcGFyaXNvbi4KKy8vLyBccGFyYW0gX19iCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIG9uZSBvZiB0aGUgb3BlcmFuZHMuIFRoZSBsb3dlcgorLy8vICAgIDMyIGJpdHMgb2YgdGhpcyBvcGVyYW5kIGFyZSB1c2VkIGluIHRoZSBjb21wYXJpc29uLgorLy8vIFxyZXR1cm5zIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0gd2hvc2UgbG93ZXIgMzIgYml0cyBjb250YWluIHRoZQorLy8vICAgIG1pbmltdW0gdmFsdWUgYmV0d2VlbiBib3RoIG9wZXJhbmRzLiBUaGUgdXBwZXIgOTYgYml0cyBhcmUgY29waWVkIGZyb20KKy8vLyAgICB0aGUgdXBwZXIgOTYgYml0cyBvZiB0aGUgZmlyc3Qgc291cmNlIG9wZXJhbmQuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWluX3NzKF9fbTEyOCBfX2EsIF9fbTEyOCBfX2IpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9taW5zcygoX192NHNmKV9fYSwgKF9fdjRzZilfX2IpOworfQorCisvLy8gXGJyaWVmIENvbXBhcmVzIHR3byAxMjgtYml0IHZlY3RvcnMgb2YgWzQgeCBmbG9hdF0gYW5kIHJldHVybnMgdGhlCisvLy8gICAgbGVzc2VyIG9mIGVhY2ggcGFpciBvZiB2YWx1ZXMuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVk1JTlBTIC8gTUlOUFMgaW5zdHJ1Y3Rpb25zLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0gY29udGFpbmluZyBvbmUgb2YgdGhlIG9wZXJhbmRzLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBvcGVyYW5kcy4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgdGhlIG1pbmltdW0gdmFsdWVzCisvLy8gICAgYmV0d2VlbiBib3RoIG9wZXJhbmRzLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21pbl9wcyhfX20xMjggX19hLCBfX20xMjggX19iKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfbWlucHMoKF9fdjRzZilfX2EsIChfX3Y0c2YpX19iKTsKK30KKworLy8vIFxicmllZiBDb21wYXJlcyB0d28gMzItYml0IGZsb2F0IHZhbHVlcyBpbiB0aGUgbG93LW9yZGVyIGJpdHMgb2YgYm90aAorLy8vICAgIG9wZXJhbmRzIGFuZCByZXR1cm5zIHRoZSBncmVhdGVyIHZhbHVlIGluIHRoZSBsb3ctb3JkZXIgYml0cyBvZgorLy8vICAgIGEgdmVjdG9yIFs0IHggZmxvYXRdLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZNQVhTUyAvIE1BWFNTIGluc3RydWN0aW9ucy4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBvcGVyYW5kcy4gVGhlIGxvd2VyCisvLy8gICAgMzIgYml0cyBvZiB0aGlzIG9wZXJhbmQgYXJlIHVzZWQgaW4gdGhlIGNvbXBhcmlzb24uCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0gY29udGFpbmluZyBvbmUgb2YgdGhlIG9wZXJhbmRzLiBUaGUgbG93ZXIKKy8vLyAgICAzMiBiaXRzIG9mIHRoaXMgb3BlcmFuZCBhcmUgdXNlZCBpbiB0aGUgY29tcGFyaXNvbi4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIHdob3NlIGxvd2VyIDMyIGJpdHMgY29udGFpbiB0aGUKKy8vLyAgICBtYXhpbXVtIHZhbHVlIGJldHdlZW4gYm90aCBvcGVyYW5kcy4gVGhlIHVwcGVyIDk2IGJpdHMgYXJlIGNvcGllZCBmcm9tCisvLy8gICAgdGhlIHVwcGVyIDk2IGJpdHMgb2YgdGhlIGZpcnN0IHNvdXJjZSBvcGVyYW5kLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21heF9zcyhfX20xMjggX19hLCBfX20xMjggX19iKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfbWF4c3MoKF9fdjRzZilfX2EsIChfX3Y0c2YpX19iKTsKK30KKworLy8vIFxicmllZiBDb21wYXJlcyB0d28gMTI4LWJpdCB2ZWN0b3JzIG9mIFs0IHggZmxvYXRdIGFuZCByZXR1cm5zIHRoZSBncmVhdGVyCisvLy8gICAgb2YgZWFjaCBwYWlyIG9mIHZhbHVlcy4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWTUFYUFMgLyBNQVhQUyBpbnN0cnVjdGlvbnMuCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIG9uZSBvZiB0aGUgb3BlcmFuZHMuCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0gY29udGFpbmluZyBvbmUgb2YgdGhlIG9wZXJhbmRzLgorLy8vIFxyZXR1cm5zIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0gY29udGFpbmluZyB0aGUgbWF4aW11bSB2YWx1ZXMKKy8vLyAgICBiZXR3ZWVuIGJvdGggb3BlcmFuZHMuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWF4X3BzKF9fbTEyOCBfX2EsIF9fbTEyOCBfX2IpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9tYXhwcygoX192NHNmKV9fYSwgKF9fdjRzZilfX2IpOworfQorCisvLy8gXGJyaWVmIFBlcmZvcm1zIGEgYml0d2lzZSBBTkQgb2YgdHdvIDEyOC1iaXQgdmVjdG9ycyBvZiBbNCB4IGZsb2F0XS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWQU5EUFMgLyBBTkRQUyBpbnN0cnVjdGlvbnMuCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBjb250YWluaW5nIG9uZSBvZiB0aGUgc291cmNlIG9wZXJhbmRzLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBzb3VyY2Ugb3BlcmFuZHMuCisvLy8gXHJldHVybnMgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSBiaXR3aXNlIEFORCBvZiB0aGUKKy8vLyAgICB2YWx1ZXMgYmV0d2VlbiBib3RoIG9wZXJhbmRzLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2FuZF9wcyhfX20xMjggX19hLCBfX20xMjggX19iKQoreworICByZXR1cm4gKF9fbTEyOCkoKF9fdjRzdSlfX2EgJiAoX192NHN1KV9fYik7Cit9CisKKy8vLyBcYnJpZWYgUGVyZm9ybXMgYSBiaXR3aXNlIEFORCBvZiB0d28gMTI4LWJpdCB2ZWN0b3JzIG9mIFs0IHggZmxvYXRdLCB1c2luZworLy8vICAgIHRoZSBvbmUncyBjb21wbGVtZW50IG9mIHRoZSB2YWx1ZXMgY29udGFpbmVkIGluIHRoZSBmaXJzdCBzb3VyY2UKKy8vLyAgICBvcGVyYW5kLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZBTkROUFMgLyBBTkROUFMgaW5zdHJ1Y3Rpb25zLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0gY29udGFpbmluZyB0aGUgZmlyc3Qgc291cmNlIG9wZXJhbmQuIFRoZQorLy8vICAgIG9uZSdzIGNvbXBsZW1lbnQgb2YgdGhpcyB2YWx1ZSBpcyB1c2VkIGluIHRoZSBiaXR3aXNlIEFORC4KKy8vLyBccGFyYW0gX19iCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSBzZWNvbmQgc291cmNlIG9wZXJhbmQuCisvLy8gXHJldHVybnMgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSBiaXR3aXNlIEFORCBvZiB0aGUKKy8vLyAgICBvbmUncyBjb21wbGVtZW50IG9mIHRoZSBmaXJzdCBvcGVyYW5kIGFuZCB0aGUgdmFsdWVzIGluIHRoZSBzZWNvbmQKKy8vLyAgICBvcGVyYW5kLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2FuZG5vdF9wcyhfX20xMjggX19hLCBfX20xMjggX19iKQoreworICByZXR1cm4gKF9fbTEyOCkofihfX3Y0c3UpX19hICYgKF9fdjRzdSlfX2IpOworfQorCisvLy8gXGJyaWVmIFBlcmZvcm1zIGEgYml0d2lzZSBPUiBvZiB0d28gMTI4LWJpdCB2ZWN0b3JzIG9mIFs0IHggZmxvYXRdLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZPUlBTIC8gT1JQUyBpbnN0cnVjdGlvbnMuCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIG9uZSBvZiB0aGUgc291cmNlIG9wZXJhbmRzLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBzb3VyY2Ugb3BlcmFuZHMuCisvLy8gXHJldHVybnMgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSBiaXR3aXNlIE9SIG9mIHRoZQorLy8vICAgIHZhbHVlcyBiZXR3ZWVuIGJvdGggb3BlcmFuZHMuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fb3JfcHMoX19tMTI4IF9fYSwgX19tMTI4IF9fYikKK3sKKyAgcmV0dXJuIChfX20xMjgpKChfX3Y0c3UpX19hIHwgKF9fdjRzdSlfX2IpOworfQorCisvLy8gXGJyaWVmIFBlcmZvcm1zIGEgYml0d2lzZSBleGNsdXNpdmUgT1Igb2YgdHdvIDEyOC1iaXQgdmVjdG9ycyBvZgorLy8vICAgIFs0IHggZmxvYXRdLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZYT1JQUyAvIFhPUlBTIGluc3RydWN0aW9ucy4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBzb3VyY2Ugb3BlcmFuZHMuCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0gY29udGFpbmluZyBvbmUgb2YgdGhlIHNvdXJjZSBvcGVyYW5kcy4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgdGhlIGJpdHdpc2UgZXhjbHVzaXZlIE9SCisvLy8gICAgb2YgdGhlIHZhbHVlcyBiZXR3ZWVuIGJvdGggb3BlcmFuZHMuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1feG9yX3BzKF9fbTEyOCBfX2EsIF9fbTEyOCBfX2IpCit7CisgIHJldHVybiAoX19tMTI4KSgoX192NHN1KV9fYSBeIChfX3Y0c3UpX19iKTsKK30KKworLy8vIFxicmllZiBDb21wYXJlcyB0d28gMzItYml0IGZsb2F0IHZhbHVlcyBpbiB0aGUgbG93LW9yZGVyIGJpdHMgb2YgYm90aAorLy8vICAgIG9wZXJhbmRzIGZvciBlcXVhbGl0eSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uIGluIHRoZQorLy8vICAgIGxvdy1vcmRlciBiaXRzIG9mIGEgdmVjdG9yIFs0IHggZmxvYXRdLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZDTVBFUVNTIC8gQ01QRVFTUyBpbnN0cnVjdGlvbnMuCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIG9uZSBvZiB0aGUgb3BlcmFuZHMuIFRoZSBsb3dlcgorLy8vICAgIDMyIGJpdHMgb2YgdGhpcyBvcGVyYW5kIGFyZSB1c2VkIGluIHRoZSBjb21wYXJpc29uLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBvcGVyYW5kcy4gVGhlIGxvd2VyCisvLy8gICAgMzIgYml0cyBvZiB0aGlzIG9wZXJhbmQgYXJlIHVzZWQgaW4gdGhlIGNvbXBhcmlzb24uCisvLy8gXHJldHVybnMgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSBjb21wYXJpc29uIHJlc3VsdHMKKy8vLyAgICBpbiB0aGUgbG93LW9yZGVyIGJpdHMuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY21wZXFfc3MoX19tMTI4IF9fYSwgX19tMTI4IF9fYikKK3sKKyAgcmV0dXJuIChfX20xMjgpX19idWlsdGluX2lhMzJfY21wZXFzcygoX192NHNmKV9fYSwgKF9fdjRzZilfX2IpOworfQorCisvLy8gXGJyaWVmIENvbXBhcmVzIGVhY2ggb2YgdGhlIGNvcnJlc3BvbmRpbmcgMzItYml0IGZsb2F0IHZhbHVlcyBvZiB0aGUKKy8vLyAgICAxMjgtYml0IHZlY3RvcnMgb2YgWzQgeCBmbG9hdF0gZm9yIGVxdWFsaXR5LgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZDTVBFUVBTIC8gQ01QRVFQUyBpbnN0cnVjdGlvbnMuCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XS4KKy8vLyBccGFyYW0gX19iCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XS4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgdGhlIGNvbXBhcmlzb24gcmVzdWx0cy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbXBlcV9wcyhfX20xMjggX19hLCBfX20xMjggX19iKQoreworICByZXR1cm4gKF9fbTEyOClfX2J1aWx0aW5faWEzMl9jbXBlcXBzKChfX3Y0c2YpX19hLCAoX192NHNmKV9fYik7Cit9CisKKy8vLyBcYnJpZWYgQ29tcGFyZXMgdHdvIDMyLWJpdCBmbG9hdCB2YWx1ZXMgaW4gdGhlIGxvdy1vcmRlciBiaXRzIG9mIGJvdGgKKy8vLyAgICBvcGVyYW5kcyB0byBkZXRlcm1pbmUgaWYgdGhlIHZhbHVlIGluIHRoZSBmaXJzdCBvcGVyYW5kIGlzIGxlc3MgdGhhbiB0aGUKKy8vLyAgICBjb3JyZXNwb25kaW5nIHZhbHVlIGluIHRoZSBzZWNvbmQgb3BlcmFuZCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZQorLy8vICAgIGNvbXBhcmlzb24gaW4gdGhlIGxvdy1vcmRlciBiaXRzIG9mIGEgdmVjdG9yIG9mIFs0IHggZmxvYXRdLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZDTVBMVFNTIC8gQ01QTFRTUyBpbnN0cnVjdGlvbnMuCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIG9uZSBvZiB0aGUgb3BlcmFuZHMuIFRoZSBsb3dlcgorLy8vICAgIDMyIGJpdHMgb2YgdGhpcyBvcGVyYW5kIGFyZSB1c2VkIGluIHRoZSBjb21wYXJpc29uLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBvcGVyYW5kcy4gVGhlIGxvd2VyCisvLy8gICAgMzIgYml0cyBvZiB0aGlzIG9wZXJhbmQgYXJlIHVzZWQgaW4gdGhlIGNvbXBhcmlzb24uCisvLy8gXHJldHVybnMgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSBjb21wYXJpc29uIHJlc3VsdHMKKy8vLyAgICBpbiB0aGUgbG93LW9yZGVyIGJpdHMuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY21wbHRfc3MoX19tMTI4IF9fYSwgX19tMTI4IF9fYikKK3sKKyAgcmV0dXJuIChfX20xMjgpX19idWlsdGluX2lhMzJfY21wbHRzcygoX192NHNmKV9fYSwgKF9fdjRzZilfX2IpOworfQorCisvLy8gXGJyaWVmIENvbXBhcmVzIGVhY2ggb2YgdGhlIGNvcnJlc3BvbmRpbmcgMzItYml0IGZsb2F0IHZhbHVlcyBvZiB0aGUKKy8vLyAgICAxMjgtYml0IHZlY3RvcnMgb2YgWzQgeCBmbG9hdF0gdG8gZGV0ZXJtaW5lIGlmIHRoZSB2YWx1ZXMgaW4gdGhlIGZpcnN0CisvLy8gICAgb3BlcmFuZCBhcmUgbGVzcyB0aGFuIHRob3NlIGluIHRoZSBzZWNvbmQgb3BlcmFuZC4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWQ01QTFRQUyAvIENNUExUUFMgaW5zdHJ1Y3Rpb25zLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0uCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0uCisvLy8gXHJldHVybnMgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSBjb21wYXJpc29uIHJlc3VsdHMuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY21wbHRfcHMoX19tMTI4IF9fYSwgX19tMTI4IF9fYikKK3sKKyAgcmV0dXJuIChfX20xMjgpX19idWlsdGluX2lhMzJfY21wbHRwcygoX192NHNmKV9fYSwgKF9fdjRzZilfX2IpOworfQorCisvLy8gXGJyaWVmIENvbXBhcmVzIHR3byAzMi1iaXQgZmxvYXQgdmFsdWVzIGluIHRoZSBsb3ctb3JkZXIgYml0cyBvZiBib3RoCisvLy8gICAgb3BlcmFuZHMgdG8gZGV0ZXJtaW5lIGlmIHRoZSB2YWx1ZSBpbiB0aGUgZmlyc3Qgb3BlcmFuZCBpcyBsZXNzIHRoYW4gb3IKKy8vLyAgICBlcXVhbCB0byB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBpbiB0aGUgc2Vjb25kIG9wZXJhbmQgYW5kIHJldHVybnMgdGhlCisvLy8gICAgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uIGluIHRoZSBsb3ctb3JkZXIgYml0cyBvZiBhIHZlY3RvciBvZgorLy8vICAgIFs0IHggZmxvYXRdLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZDTVBMRVNTIC8gQ01QTEVTUyBpbnN0cnVjdGlvbnMuCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIG9uZSBvZiB0aGUgb3BlcmFuZHMuIFRoZSBsb3dlcgorLy8vICAgIDMyIGJpdHMgb2YgdGhpcyBvcGVyYW5kIGFyZSB1c2VkIGluIHRoZSBjb21wYXJpc29uLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBvcGVyYW5kcy4gVGhlIGxvd2VyCisvLy8gICAgMzIgYml0cyBvZiB0aGlzIG9wZXJhbmQgYXJlIHVzZWQgaW4gdGhlIGNvbXBhcmlzb24uCisvLy8gXHJldHVybnMgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSBjb21wYXJpc29uIHJlc3VsdHMKKy8vLyAgICBpbiB0aGUgbG93LW9yZGVyIGJpdHMuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY21wbGVfc3MoX19tMTI4IF9fYSwgX19tMTI4IF9fYikKK3sKKyAgcmV0dXJuIChfX20xMjgpX19idWlsdGluX2lhMzJfY21wbGVzcygoX192NHNmKV9fYSwgKF9fdjRzZilfX2IpOworfQorCisvLy8gXGJyaWVmIENvbXBhcmVzIGVhY2ggb2YgdGhlIGNvcnJlc3BvbmRpbmcgMzItYml0IGZsb2F0IHZhbHVlcyBvZiB0aGUKKy8vLyAgICAxMjgtYml0IHZlY3RvcnMgb2YgWzQgeCBmbG9hdF0gdG8gZGV0ZXJtaW5lIGlmIHRoZSB2YWx1ZXMgaW4gdGhlIGZpcnN0CisvLy8gICAgb3BlcmFuZCBhcmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRob3NlIGluIHRoZSBzZWNvbmQgb3BlcmFuZC4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWQ01QTEVQUyAvIENNUExFUFMgaW5zdHJ1Y3Rpb25zLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0uCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0uCisvLy8gXHJldHVybnMgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSBjb21wYXJpc29uIHJlc3VsdHMuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY21wbGVfcHMoX19tMTI4IF9fYSwgX19tMTI4IF9fYikKK3sKKyAgcmV0dXJuIChfX20xMjgpX19idWlsdGluX2lhMzJfY21wbGVwcygoX192NHNmKV9fYSwgKF9fdjRzZilfX2IpOworfQorCisvLy8gXGJyaWVmIENvbXBhcmVzIHR3byAzMi1iaXQgZmxvYXQgdmFsdWVzIGluIHRoZSBsb3ctb3JkZXIgYml0cyBvZiBib3RoCisvLy8gICAgb3BlcmFuZHMgdG8gZGV0ZXJtaW5lIGlmIHRoZSB2YWx1ZSBpbiB0aGUgZmlyc3Qgb3BlcmFuZCBpcyBncmVhdGVyIHRoYW4KKy8vLyAgICB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBpbiB0aGUgc2Vjb25kIG9wZXJhbmQgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBvZgorLy8vICAgIHRoZSBjb21wYXJpc29uIGluIHRoZSBsb3ctb3JkZXIgYml0cyBvZiBhIHZlY3RvciBvZiBbNCB4IGZsb2F0XS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWQ01QTFRTUyAvIENNUExUU1MgaW5zdHJ1Y3Rpb25zLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0gY29udGFpbmluZyBvbmUgb2YgdGhlIG9wZXJhbmRzLiBUaGUgbG93ZXIKKy8vLyAgICAzMiBiaXRzIG9mIHRoaXMgb3BlcmFuZCBhcmUgdXNlZCBpbiB0aGUgY29tcGFyaXNvbi4KKy8vLyBccGFyYW0gX19iCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIG9uZSBvZiB0aGUgb3BlcmFuZHMuIFRoZSBsb3dlcgorLy8vICAgIDMyIGJpdHMgb2YgdGhpcyBvcGVyYW5kIGFyZSB1c2VkIGluIHRoZSBjb21wYXJpc29uLgorLy8vIFxyZXR1cm5zIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0gY29udGFpbmluZyB0aGUgY29tcGFyaXNvbiByZXN1bHRzCisvLy8gICAgaW4gdGhlIGxvdy1vcmRlciBiaXRzLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NtcGd0X3NzKF9fbTEyOCBfX2EsIF9fbTEyOCBfX2IpCit7CisgIHJldHVybiAoX19tMTI4KV9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3Y0c2YpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKV9fYnVpbHRpbl9pYTMyX2NtcGx0c3MoKF9fdjRzZilfX2IsIChfX3Y0c2YpX19hKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwgMSwgMiwgMyk7Cit9CisKKy8vLyBcYnJpZWYgQ29tcGFyZXMgZWFjaCBvZiB0aGUgY29ycmVzcG9uZGluZyAzMi1iaXQgZmxvYXQgdmFsdWVzIG9mIHRoZQorLy8vICAgIDEyOC1iaXQgdmVjdG9ycyBvZiBbNCB4IGZsb2F0XSB0byBkZXRlcm1pbmUgaWYgdGhlIHZhbHVlcyBpbiB0aGUgZmlyc3QKKy8vLyAgICBvcGVyYW5kIGFyZSBncmVhdGVyIHRoYW4gdGhvc2UgaW4gdGhlIHNlY29uZCBvcGVyYW5kLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZDTVBMVFBTIC8gQ01QTFRQUyBpbnN0cnVjdGlvbnMuCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XS4KKy8vLyBccGFyYW0gX19iCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XS4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgdGhlIGNvbXBhcmlzb24gcmVzdWx0cy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbXBndF9wcyhfX20xMjggX19hLCBfX20xMjggX19iKQoreworICByZXR1cm4gKF9fbTEyOClfX2J1aWx0aW5faWEzMl9jbXBsdHBzKChfX3Y0c2YpX19iLCAoX192NHNmKV9fYSk7Cit9CisKKy8vLyBcYnJpZWYgQ29tcGFyZXMgdHdvIDMyLWJpdCBmbG9hdCB2YWx1ZXMgaW4gdGhlIGxvdy1vcmRlciBiaXRzIG9mIGJvdGgKKy8vLyAgICBvcGVyYW5kcyB0byBkZXRlcm1pbmUgaWYgdGhlIHZhbHVlIGluIHRoZSBmaXJzdCBvcGVyYW5kIGlzIGdyZWF0ZXIgdGhhbgorLy8vICAgIG9yIGVxdWFsIHRvIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGluIHRoZSBzZWNvbmQgb3BlcmFuZCBhbmQgcmV0dXJucworLy8vICAgIHRoZSByZXN1bHQgb2YgdGhlIGNvbXBhcmlzb24gaW4gdGhlIGxvdy1vcmRlciBiaXRzIG9mIGEgdmVjdG9yIG9mCisvLy8gICAgWzQgeCBmbG9hdF0uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVkNNUExFU1MgLyBDTVBMRVNTIGluc3RydWN0aW9ucy4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBvcGVyYW5kcy4gVGhlIGxvd2VyCisvLy8gICAgMzIgYml0cyBvZiB0aGlzIG9wZXJhbmQgYXJlIHVzZWQgaW4gdGhlIGNvbXBhcmlzb24uCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0gY29udGFpbmluZyBvbmUgb2YgdGhlIG9wZXJhbmRzLiBUaGUgbG93ZXIKKy8vLyAgICAzMiBiaXRzIG9mIHRoaXMgb3BlcmFuZCBhcmUgdXNlZCBpbiB0aGUgY29tcGFyaXNvbi4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgdGhlIGNvbXBhcmlzb24gcmVzdWx0cworLy8vICAgIGluIHRoZSBsb3ctb3JkZXIgYml0cy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbXBnZV9zcyhfX20xMjggX19hLCBfX20xMjggX19iKQoreworICByZXR1cm4gKF9fbTEyOClfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcigoX192NHNmKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZilfX2J1aWx0aW5faWEzMl9jbXBsZXNzKChfX3Y0c2YpX19iLCAoX192NHNmKV9fYSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsIDEsIDIsIDMpOworfQorCisvLy8gXGJyaWVmIENvbXBhcmVzIGVhY2ggb2YgdGhlIGNvcnJlc3BvbmRpbmcgMzItYml0IGZsb2F0IHZhbHVlcyBvZiB0aGUKKy8vLyAgICAxMjgtYml0IHZlY3RvcnMgb2YgWzQgeCBmbG9hdF0gdG8gZGV0ZXJtaW5lIGlmIHRoZSB2YWx1ZXMgaW4gdGhlIGZpcnN0CisvLy8gICAgb3BlcmFuZCBhcmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRob3NlIGluIHRoZSBzZWNvbmQgb3BlcmFuZC4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWQ01QTEVQUyAvIENNUExFUFMgaW5zdHJ1Y3Rpb25zLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0uCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0uCisvLy8gXHJldHVybnMgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSBjb21wYXJpc29uIHJlc3VsdHMuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY21wZ2VfcHMoX19tMTI4IF9fYSwgX19tMTI4IF9fYikKK3sKKyAgcmV0dXJuIChfX20xMjgpX19idWlsdGluX2lhMzJfY21wbGVwcygoX192NHNmKV9fYiwgKF9fdjRzZilfX2EpOworfQorCisvLy8gXGJyaWVmIENvbXBhcmVzIHR3byAzMi1iaXQgZmxvYXQgdmFsdWVzIGluIHRoZSBsb3ctb3JkZXIgYml0cyBvZiBib3RoCisvLy8gICAgb3BlcmFuZHMgZm9yIGluZXF1YWxpdHkgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyaXNvbiBpbiB0aGUKKy8vLyAgICBsb3ctb3JkZXIgYml0cyBvZiBhIHZlY3RvciBvZiBbNCB4IGZsb2F0XS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWQ01QTkVRU1MgLyBDTVBORVFTUyBpbnN0cnVjdGlvbnMuCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIG9uZSBvZiB0aGUgb3BlcmFuZHMuIFRoZSBsb3dlcgorLy8vICAgIDMyIGJpdHMgb2YgdGhpcyBvcGVyYW5kIGFyZSB1c2VkIGluIHRoZSBjb21wYXJpc29uLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBvcGVyYW5kcy4gVGhlIGxvd2VyCisvLy8gICAgMzIgYml0cyBvZiB0aGlzIG9wZXJhbmQgYXJlIHVzZWQgaW4gdGhlIGNvbXBhcmlzb24uCisvLy8gXHJldHVybnMgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSBjb21wYXJpc29uIHJlc3VsdHMKKy8vLyAgICBpbiB0aGUgbG93LW9yZGVyIGJpdHMuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY21wbmVxX3NzKF9fbTEyOCBfX2EsIF9fbTEyOCBfX2IpCit7CisgIHJldHVybiAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX2NtcG5lcXNzKChfX3Y0c2YpX19hLCAoX192NHNmKV9fYik7Cit9CisKKy8vLyBcYnJpZWYgQ29tcGFyZXMgZWFjaCBvZiB0aGUgY29ycmVzcG9uZGluZyAzMi1iaXQgZmxvYXQgdmFsdWVzIG9mIHRoZQorLy8vICAgIDEyOC1iaXQgdmVjdG9ycyBvZiBbNCB4IGZsb2F0XSBmb3IgaW5lcXVhbGl0eS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWQ01QTkVRUFMgLyBDTVBORVFQUyBpbnN0cnVjdGlvbnMuCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XS4KKy8vLyBccGFyYW0gX19iCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XS4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgdGhlIGNvbXBhcmlzb24gcmVzdWx0cy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbXBuZXFfcHMoX19tMTI4IF9fYSwgX19tMTI4IF9fYikKK3sKKyAgcmV0dXJuIChfX20xMjgpX19idWlsdGluX2lhMzJfY21wbmVxcHMoKF9fdjRzZilfX2EsIChfX3Y0c2YpX19iKTsKK30KKworLy8vIFxicmllZiBDb21wYXJlcyB0d28gMzItYml0IGZsb2F0IHZhbHVlcyBpbiB0aGUgbG93LW9yZGVyIGJpdHMgb2YgYm90aAorLy8vICAgIG9wZXJhbmRzIHRvIGRldGVybWluZSBpZiB0aGUgdmFsdWUgaW4gdGhlIGZpcnN0IG9wZXJhbmQgaXMgbm90IGxlc3MgdGhhbgorLy8vICAgIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGluIHRoZSBzZWNvbmQgb3BlcmFuZCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IG9mCisvLy8gICAgdGhlIGNvbXBhcmlzb24gaW4gdGhlIGxvdy1vcmRlciBiaXRzIG9mIGEgdmVjdG9yIG9mIFs0IHggZmxvYXRdLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZDTVBOTFRTUyAvIENNUE5MVFNTIGluc3RydWN0aW9ucy4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBvcGVyYW5kcy4gVGhlIGxvd2VyCisvLy8gICAgMzIgYml0cyBvZiB0aGlzIG9wZXJhbmQgYXJlIHVzZWQgaW4gdGhlIGNvbXBhcmlzb24uCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0gY29udGFpbmluZyBvbmUgb2YgdGhlIG9wZXJhbmRzLiBUaGUgbG93ZXIKKy8vLyAgICAzMiBiaXRzIG9mIHRoaXMgb3BlcmFuZCBhcmUgdXNlZCBpbiB0aGUgY29tcGFyaXNvbi4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgdGhlIGNvbXBhcmlzb24gcmVzdWx0cworLy8vICAgIGluIHRoZSBsb3ctb3JkZXIgYml0cy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbXBubHRfc3MoX19tMTI4IF9fYSwgX19tMTI4IF9fYikKK3sKKyAgcmV0dXJuIChfX20xMjgpX19idWlsdGluX2lhMzJfY21wbmx0c3MoKF9fdjRzZilfX2EsIChfX3Y0c2YpX19iKTsKK30KKworLy8vIFxicmllZiBDb21wYXJlcyBlYWNoIG9mIHRoZSBjb3JyZXNwb25kaW5nIDMyLWJpdCBmbG9hdCB2YWx1ZXMgb2YgdGhlCisvLy8gICAgMTI4LWJpdCB2ZWN0b3JzIG9mIFs0IHggZmxvYXRdIHRvIGRldGVybWluZSBpZiB0aGUgdmFsdWVzIGluIHRoZSBmaXJzdAorLy8vICAgIG9wZXJhbmQgYXJlIG5vdCBsZXNzIHRoYW4gdGhvc2UgaW4gdGhlIHNlY29uZCBvcGVyYW5kLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZDTVBOTFRQUyAvIENNUE5MVFBTIGluc3RydWN0aW9ucy4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdLgorLy8vIFxyZXR1cm5zIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0gY29udGFpbmluZyB0aGUgY29tcGFyaXNvbiByZXN1bHRzLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NtcG5sdF9wcyhfX20xMjggX19hLCBfX20xMjggX19iKQoreworICByZXR1cm4gKF9fbTEyOClfX2J1aWx0aW5faWEzMl9jbXBubHRwcygoX192NHNmKV9fYSwgKF9fdjRzZilfX2IpOworfQorCisvLy8gXGJyaWVmIENvbXBhcmVzIHR3byAzMi1iaXQgZmxvYXQgdmFsdWVzIGluIHRoZSBsb3ctb3JkZXIgYml0cyBvZiBib3RoCisvLy8gICAgb3BlcmFuZHMgdG8gZGV0ZXJtaW5lIGlmIHRoZSB2YWx1ZSBpbiB0aGUgZmlyc3Qgb3BlcmFuZCBpcyBub3QgbGVzcyB0aGFuCisvLy8gICAgb3IgZXF1YWwgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgaW4gdGhlIHNlY29uZCBvcGVyYW5kIGFuZCByZXR1cm5zCisvLy8gICAgdGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyaXNvbiBpbiB0aGUgbG93LW9yZGVyIGJpdHMgb2YgYSB2ZWN0b3Igb2YKKy8vLyAgICBbNCB4IGZsb2F0XS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWQ01QTkxFU1MgLyBDTVBOTEVTUyBpbnN0cnVjdGlvbnMuCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIG9uZSBvZiB0aGUgb3BlcmFuZHMuIFRoZSBsb3dlcgorLy8vICAgIDMyIGJpdHMgb2YgdGhpcyBvcGVyYW5kIGFyZSB1c2VkIGluIHRoZSBjb21wYXJpc29uLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBvcGVyYW5kcy4gVGhlIGxvd2VyCisvLy8gICAgMzIgYml0cyBvZiB0aGlzIG9wZXJhbmQgYXJlIHVzZWQgaW4gdGhlIGNvbXBhcmlzb24uCisvLy8gXHJldHVybnMgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSBjb21wYXJpc29uIHJlc3VsdHMKKy8vLyAgICBpbiB0aGUgbG93LW9yZGVyIGJpdHMuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY21wbmxlX3NzKF9fbTEyOCBfX2EsIF9fbTEyOCBfX2IpCit7CisgIHJldHVybiAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX2NtcG5sZXNzKChfX3Y0c2YpX19hLCAoX192NHNmKV9fYik7Cit9CisKKy8vLyBcYnJpZWYgQ29tcGFyZXMgZWFjaCBvZiB0aGUgY29ycmVzcG9uZGluZyAzMi1iaXQgZmxvYXQgdmFsdWVzIG9mIHRoZQorLy8vICAgIDEyOC1iaXQgdmVjdG9ycyBvZiBbNCB4IGZsb2F0XSB0byBkZXRlcm1pbmUgaWYgdGhlIHZhbHVlcyBpbiB0aGUgZmlyc3QKKy8vLyAgICBvcGVyYW5kIGFyZSBub3QgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRob3NlIGluIHRoZSBzZWNvbmQgb3BlcmFuZC4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWQ01QTkxFUFMgLyBDTVBOTEVQUyBpbnN0cnVjdGlvbnMuCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XS4KKy8vLyBccGFyYW0gX19iCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XS4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgdGhlIGNvbXBhcmlzb24gcmVzdWx0cy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbXBubGVfcHMoX19tMTI4IF9fYSwgX19tMTI4IF9fYikKK3sKKyAgcmV0dXJuIChfX20xMjgpX19idWlsdGluX2lhMzJfY21wbmxlcHMoKF9fdjRzZilfX2EsIChfX3Y0c2YpX19iKTsKK30KKworLy8vIFxicmllZiBDb21wYXJlcyB0d28gMzItYml0IGZsb2F0IHZhbHVlcyBpbiB0aGUgbG93LW9yZGVyIGJpdHMgb2YgYm90aAorLy8vICAgIG9wZXJhbmRzIHRvIGRldGVybWluZSBpZiB0aGUgdmFsdWUgaW4gdGhlIGZpcnN0IG9wZXJhbmQgaXMgbm90IGdyZWF0ZXIKKy8vLyAgICB0aGFuIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGluIHRoZSBzZWNvbmQgb3BlcmFuZCBhbmQgcmV0dXJucyB0aGUKKy8vLyAgICByZXN1bHQgb2YgdGhlIGNvbXBhcmlzb24gaW4gdGhlIGxvdy1vcmRlciBiaXRzIG9mIGEgdmVjdG9yIG9mCisvLy8gICAgWzQgeCBmbG9hdF0uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVkNNUE5MVFNTIC8gQ01QTkxUU1MgaW5zdHJ1Y3Rpb25zLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0gY29udGFpbmluZyBvbmUgb2YgdGhlIG9wZXJhbmRzLiBUaGUgbG93ZXIKKy8vLyAgICAzMiBiaXRzIG9mIHRoaXMgb3BlcmFuZCBhcmUgdXNlZCBpbiB0aGUgY29tcGFyaXNvbi4KKy8vLyBccGFyYW0gX19iCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIG9uZSBvZiB0aGUgb3BlcmFuZHMuIFRoZSBsb3dlcgorLy8vICAgIDMyIGJpdHMgb2YgdGhpcyBvcGVyYW5kIGFyZSB1c2VkIGluIHRoZSBjb21wYXJpc29uLgorLy8vIFxyZXR1cm5zIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0gY29udGFpbmluZyB0aGUgY29tcGFyaXNvbiByZXN1bHRzCisvLy8gICAgaW4gdGhlIGxvdy1vcmRlciBiaXRzLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NtcG5ndF9zcyhfX20xMjggX19hLCBfX20xMjggX19iKQoreworICByZXR1cm4gKF9fbTEyOClfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcigoX192NHNmKV9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZilfX2J1aWx0aW5faWEzMl9jbXBubHRzcygoX192NHNmKV9fYiwgKF9fdjRzZilfX2EpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LCAxLCAyLCAzKTsKK30KKworLy8vIFxicmllZiBDb21wYXJlcyBlYWNoIG9mIHRoZSBjb3JyZXNwb25kaW5nIDMyLWJpdCBmbG9hdCB2YWx1ZXMgb2YgdGhlCisvLy8gICAgMTI4LWJpdCB2ZWN0b3JzIG9mIFs0IHggZmxvYXRdIHRvIGRldGVybWluZSBpZiB0aGUgdmFsdWVzIGluIHRoZSBmaXJzdAorLy8vICAgIG9wZXJhbmQgYXJlIG5vdCBncmVhdGVyIHRoYW4gdGhvc2UgaW4gdGhlIHNlY29uZCBvcGVyYW5kLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZDTVBOTFRQUyAvIENNUE5MVFBTIGluc3RydWN0aW9ucy4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdLgorLy8vIFxyZXR1cm5zIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0gY29udGFpbmluZyB0aGUgY29tcGFyaXNvbiByZXN1bHRzLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NtcG5ndF9wcyhfX20xMjggX19hLCBfX20xMjggX19iKQoreworICByZXR1cm4gKF9fbTEyOClfX2J1aWx0aW5faWEzMl9jbXBubHRwcygoX192NHNmKV9fYiwgKF9fdjRzZilfX2EpOworfQorCisvLy8gXGJyaWVmIENvbXBhcmVzIHR3byAzMi1iaXQgZmxvYXQgdmFsdWVzIGluIHRoZSBsb3ctb3JkZXIgYml0cyBvZiBib3RoCisvLy8gICAgb3BlcmFuZHMgdG8gZGV0ZXJtaW5lIGlmIHRoZSB2YWx1ZSBpbiB0aGUgZmlyc3Qgb3BlcmFuZCBpcyBub3QgZ3JlYXRlcgorLy8vICAgIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgaW4gdGhlIHNlY29uZCBvcGVyYW5kIGFuZAorLy8vICAgIHJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyaXNvbiBpbiB0aGUgbG93LW9yZGVyIGJpdHMgb2YgYSB2ZWN0b3IKKy8vLyAgICBvZiBbNCB4IGZsb2F0XS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWQ01QTkxFU1MgLyBDTVBOTEVTUyBpbnN0cnVjdGlvbnMuCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIG9uZSBvZiB0aGUgb3BlcmFuZHMuIFRoZSBsb3dlcgorLy8vICAgIDMyIGJpdHMgb2YgdGhpcyBvcGVyYW5kIGFyZSB1c2VkIGluIHRoZSBjb21wYXJpc29uLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBvcGVyYW5kcy4gVGhlIGxvd2VyCisvLy8gICAgMzIgYml0cyBvZiB0aGlzIG9wZXJhbmQgYXJlIHVzZWQgaW4gdGhlIGNvbXBhcmlzb24uCisvLy8gXHJldHVybnMgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSBjb21wYXJpc29uIHJlc3VsdHMKKy8vLyAgICBpbiB0aGUgbG93LW9yZGVyIGJpdHMuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY21wbmdlX3NzKF9fbTEyOCBfX2EsIF9fbTEyOCBfX2IpCit7CisgIHJldHVybiAoX19tMTI4KV9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3Y0c2YpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKV9fYnVpbHRpbl9pYTMyX2NtcG5sZXNzKChfX3Y0c2YpX19iLCAoX192NHNmKV9fYSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsIDEsIDIsIDMpOworfQorCisvLy8gXGJyaWVmIENvbXBhcmVzIGVhY2ggb2YgdGhlIGNvcnJlc3BvbmRpbmcgMzItYml0IGZsb2F0IHZhbHVlcyBvZiB0aGUKKy8vLyAgICAxMjgtYml0IHZlY3RvcnMgb2YgWzQgeCBmbG9hdF0gdG8gZGV0ZXJtaW5lIGlmIHRoZSB2YWx1ZXMgaW4gdGhlIGZpcnN0CisvLy8gICAgb3BlcmFuZCBhcmUgbm90IGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aG9zZSBpbiB0aGUgc2Vjb25kIG9wZXJhbmQuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVkNNUE5MRVBTIC8gQ01QTkxFUFMgaW5zdHJ1Y3Rpb25zLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0uCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0uCisvLy8gXHJldHVybnMgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSBjb21wYXJpc29uIHJlc3VsdHMuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY21wbmdlX3BzKF9fbTEyOCBfX2EsIF9fbTEyOCBfX2IpCit7CisgIHJldHVybiAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX2NtcG5sZXBzKChfX3Y0c2YpX19iLCAoX192NHNmKV9fYSk7Cit9CisKKy8vLyBcYnJpZWYgQ29tcGFyZXMgdHdvIDMyLWJpdCBmbG9hdCB2YWx1ZXMgaW4gdGhlIGxvdy1vcmRlciBiaXRzIG9mIGJvdGgKKy8vLyAgICBvcGVyYW5kcyB0byBkZXRlcm1pbmUgaWYgdGhlIHZhbHVlIGluIHRoZSBmaXJzdCBvcGVyYW5kIGlzIG9yZGVyZWQgd2l0aAorLy8vICAgIHJlc3BlY3QgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgaW4gdGhlIHNlY29uZCBvcGVyYW5kIGFuZCByZXR1cm5zIHRoZQorLy8vICAgIHJlc3VsdCBvZiB0aGUgY29tcGFyaXNvbiBpbiB0aGUgbG93LW9yZGVyIGJpdHMgb2YgYSB2ZWN0b3Igb2YKKy8vLyAgICBbNCB4IGZsb2F0XS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWQ01QT1JEU1MgLyBDTVBPUkRTUyBpbnN0cnVjdGlvbnMuCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIG9uZSBvZiB0aGUgb3BlcmFuZHMuIFRoZSBsb3dlcgorLy8vICAgIDMyIGJpdHMgb2YgdGhpcyBvcGVyYW5kIGFyZSB1c2VkIGluIHRoZSBjb21wYXJpc29uLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBvcGVyYW5kcy4gVGhlIGxvd2VyCisvLy8gICAgMzIgYml0cyBvZiB0aGlzIG9wZXJhbmQgYXJlIHVzZWQgaW4gdGhlIGNvbXBhcmlzb24uCisvLy8gXHJldHVybnMgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSBjb21wYXJpc29uIHJlc3VsdHMKKy8vLyAgICBpbiB0aGUgbG93LW9yZGVyIGJpdHMuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY21wb3JkX3NzKF9fbTEyOCBfX2EsIF9fbTEyOCBfX2IpCit7CisgIHJldHVybiAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX2NtcG9yZHNzKChfX3Y0c2YpX19hLCAoX192NHNmKV9fYik7Cit9CisKKy8vLyBcYnJpZWYgQ29tcGFyZXMgZWFjaCBvZiB0aGUgY29ycmVzcG9uZGluZyAzMi1iaXQgZmxvYXQgdmFsdWVzIG9mIHRoZQorLy8vICAgIDEyOC1iaXQgdmVjdG9ycyBvZiBbNCB4IGZsb2F0XSB0byBkZXRlcm1pbmUgaWYgdGhlIHZhbHVlcyBpbiB0aGUgZmlyc3QKKy8vLyAgICBvcGVyYW5kIGFyZSBvcmRlcmVkIHdpdGggcmVzcGVjdCB0byB0aG9zZSBpbiB0aGUgc2Vjb25kIG9wZXJhbmQuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVkNNUE9SRFBTIC8gQ01QT1JEUFMgaW5zdHJ1Y3Rpb25zLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0uCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0uCisvLy8gXHJldHVybnMgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSBjb21wYXJpc29uIHJlc3VsdHMuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY21wb3JkX3BzKF9fbTEyOCBfX2EsIF9fbTEyOCBfX2IpCit7CisgIHJldHVybiAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX2NtcG9yZHBzKChfX3Y0c2YpX19hLCAoX192NHNmKV9fYik7Cit9CisKKy8vLyBcYnJpZWYgQ29tcGFyZXMgdHdvIDMyLWJpdCBmbG9hdCB2YWx1ZXMgaW4gdGhlIGxvdy1vcmRlciBiaXRzIG9mIGJvdGgKKy8vLyAgICBvcGVyYW5kcyB0byBkZXRlcm1pbmUgaWYgdGhlIHZhbHVlIGluIHRoZSBmaXJzdCBvcGVyYW5kIGlzIHVub3JkZXJlZAorLy8vICAgIHdpdGggcmVzcGVjdCB0byB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBpbiB0aGUgc2Vjb25kIG9wZXJhbmQgYW5kCisvLy8gICAgcmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uIGluIHRoZSBsb3ctb3JkZXIgYml0cyBvZiBhIHZlY3RvcgorLy8vICAgIG9mIFs0IHggZmxvYXRdLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZDTVBVTk9SRFNTIC8gQ01QVU5PUkRTUyBpbnN0cnVjdGlvbnMuCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIG9uZSBvZiB0aGUgb3BlcmFuZHMuIFRoZSBsb3dlcgorLy8vICAgIDMyIGJpdHMgb2YgdGhpcyBvcGVyYW5kIGFyZSB1c2VkIGluIHRoZSBjb21wYXJpc29uLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBvcGVyYW5kcy4gVGhlIGxvd2VyCisvLy8gICAgMzIgYml0cyBvZiB0aGlzIG9wZXJhbmQgYXJlIHVzZWQgaW4gdGhlIGNvbXBhcmlzb24uCisvLy8gXHJldHVybnMgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSBjb21wYXJpc29uIHJlc3VsdHMKKy8vLyAgICBpbiB0aGUgbG93LW9yZGVyIGJpdHMuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY21wdW5vcmRfc3MoX19tMTI4IF9fYSwgX19tMTI4IF9fYikKK3sKKyAgcmV0dXJuIChfX20xMjgpX19idWlsdGluX2lhMzJfY21wdW5vcmRzcygoX192NHNmKV9fYSwgKF9fdjRzZilfX2IpOworfQorCisvLy8gXGJyaWVmIENvbXBhcmVzIGVhY2ggb2YgdGhlIGNvcnJlc3BvbmRpbmcgMzItYml0IGZsb2F0IHZhbHVlcyBvZiB0aGUKKy8vLyAgICAxMjgtYml0IHZlY3RvcnMgb2YgWzQgeCBmbG9hdF0gdG8gZGV0ZXJtaW5lIGlmIHRoZSB2YWx1ZXMgaW4gdGhlIGZpcnN0CisvLy8gICAgb3BlcmFuZCBhcmUgdW5vcmRlcmVkIHdpdGggcmVzcGVjdCB0byB0aG9zZSBpbiB0aGUgc2Vjb25kIG9wZXJhbmQuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVkNNUFVOT1JEUFMgLyBDTVBVTk9SRFBTIGluc3RydWN0aW9ucy4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdLgorLy8vIFxyZXR1cm5zIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0gY29udGFpbmluZyB0aGUgY29tcGFyaXNvbiByZXN1bHRzLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NtcHVub3JkX3BzKF9fbTEyOCBfX2EsIF9fbTEyOCBfX2IpCit7CisgIHJldHVybiAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX2NtcHVub3JkcHMoKF9fdjRzZilfX2EsIChfX3Y0c2YpX19iKTsKK30KKworLy8vIFxicmllZiBDb21wYXJlcyB0d28gMzItYml0IGZsb2F0IHZhbHVlcyBpbiB0aGUgbG93LW9yZGVyIGJpdHMgb2YgYm90aAorLy8vICAgIG9wZXJhbmRzIGZvciBlcXVhbGl0eSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZDT01JU1MgLyBDT01JU1MgaW5zdHJ1Y3Rpb25zLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0uIFRoZSBsb3dlciAzMiBiaXRzIG9mIHRoaXMgb3BlcmFuZCBhcmUKKy8vLyAgICB1c2VkIGluIHRoZSBjb21wYXJpc29uLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdLiBUaGUgbG93ZXIgMzIgYml0cyBvZiB0aGlzIG9wZXJhbmQgYXJlCisvLy8gICAgdXNlZCBpbiB0aGUgY29tcGFyaXNvbi4KKy8vLyBccmV0dXJucyBBbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIGNvbXBhcmlzb24gcmVzdWx0cy4KK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jb21pZXFfc3MoX19tMTI4IF9fYSwgX19tMTI4IF9fYikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2NvbWllcSgoX192NHNmKV9fYSwgKF9fdjRzZilfX2IpOworfQorCisvLy8gXGJyaWVmIENvbXBhcmVzIHR3byAzMi1iaXQgZmxvYXQgdmFsdWVzIGluIHRoZSBsb3ctb3JkZXIgYml0cyBvZiBib3RoCisvLy8gICAgb3BlcmFuZHMgdG8gZGV0ZXJtaW5lIGlmIHRoZSBmaXJzdCBvcGVyYW5kIGlzIGxlc3MgdGhhbiB0aGUgc2Vjb25kCisvLy8gICAgb3BlcmFuZCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZDT01JU1MgLyBDT01JU1MgaW5zdHJ1Y3Rpb25zLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0uIFRoZSBsb3dlciAzMiBiaXRzIG9mIHRoaXMgb3BlcmFuZCBhcmUKKy8vLyAgICB1c2VkIGluIHRoZSBjb21wYXJpc29uLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdLiBUaGUgbG93ZXIgMzIgYml0cyBvZiB0aGlzIG9wZXJhbmQgYXJlCisvLy8gICAgdXNlZCBpbiB0aGUgY29tcGFyaXNvbi4KKy8vLyBccmV0dXJucyBBbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIGNvbXBhcmlzb24gcmVzdWx0cy4KK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jb21pbHRfc3MoX19tMTI4IF9fYSwgX19tMTI4IF9fYikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2NvbWlsdCgoX192NHNmKV9fYSwgKF9fdjRzZilfX2IpOworfQorCisvLy8gXGJyaWVmIENvbXBhcmVzIHR3byAzMi1iaXQgZmxvYXQgdmFsdWVzIGluIHRoZSBsb3ctb3JkZXIgYml0cyBvZiBib3RoCisvLy8gICAgb3BlcmFuZHMgdG8gZGV0ZXJtaW5lIGlmIHRoZSBmaXJzdCBvcGVyYW5kIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUKKy8vLyAgICBzZWNvbmQgb3BlcmFuZCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZDT01JU1MgLyBDT01JU1MgaW5zdHJ1Y3Rpb25zLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0uIFRoZSBsb3dlciAzMiBiaXRzIG9mIHRoaXMgb3BlcmFuZCBhcmUKKy8vLyAgICB1c2VkIGluIHRoZSBjb21wYXJpc29uLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdLiBUaGUgbG93ZXIgMzIgYml0cyBvZiB0aGlzIG9wZXJhbmQgYXJlCisvLy8gICAgdXNlZCBpbiB0aGUgY29tcGFyaXNvbi4KKy8vLyBccmV0dXJucyBBbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIGNvbXBhcmlzb24gcmVzdWx0cy4KK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jb21pbGVfc3MoX19tMTI4IF9fYSwgX19tMTI4IF9fYikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2NvbWlsZSgoX192NHNmKV9fYSwgKF9fdjRzZilfX2IpOworfQorCisvLy8gXGJyaWVmIENvbXBhcmVzIHR3byAzMi1iaXQgZmxvYXQgdmFsdWVzIGluIHRoZSBsb3ctb3JkZXIgYml0cyBvZiBib3RoCisvLy8gICAgb3BlcmFuZHMgdG8gZGV0ZXJtaW5lIGlmIHRoZSBmaXJzdCBvcGVyYW5kIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2Vjb25kCisvLy8gICAgb3BlcmFuZCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZDT01JU1MgLyBDT01JU1MgaW5zdHJ1Y3Rpb25zLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0uIFRoZSBsb3dlciAzMiBiaXRzIG9mIHRoaXMgb3BlcmFuZCBhcmUKKy8vLyAgICB1c2VkIGluIHRoZSBjb21wYXJpc29uLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdLiBUaGUgbG93ZXIgMzIgYml0cyBvZiB0aGlzIG9wZXJhbmQgYXJlCisvLy8gICAgdXNlZCBpbiB0aGUgY29tcGFyaXNvbi4KKy8vLyBccmV0dXJucyBBbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIGNvbXBhcmlzb24gcmVzdWx0cy4KK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jb21pZ3Rfc3MoX19tMTI4IF9fYSwgX19tMTI4IF9fYikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2NvbWlndCgoX192NHNmKV9fYSwgKF9fdjRzZilfX2IpOworfQorCisvLy8gXGJyaWVmIENvbXBhcmVzIHR3byAzMi1iaXQgZmxvYXQgdmFsdWVzIGluIHRoZSBsb3ctb3JkZXIgYml0cyBvZiBib3RoCisvLy8gICAgb3BlcmFuZHMgdG8gZGV0ZXJtaW5lIGlmIHRoZSBmaXJzdCBvcGVyYW5kIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0bworLy8vICAgIHRoZSBzZWNvbmQgb3BlcmFuZCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZDT01JU1MgLyBDT01JU1MgaW5zdHJ1Y3Rpb25zLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0uIFRoZSBsb3dlciAzMiBiaXRzIG9mIHRoaXMgb3BlcmFuZCBhcmUKKy8vLyAgICB1c2VkIGluIHRoZSBjb21wYXJpc29uLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdLiBUaGUgbG93ZXIgMzIgYml0cyBvZiB0aGlzIG9wZXJhbmQgYXJlCisvLy8gICAgdXNlZCBpbiB0aGUgY29tcGFyaXNvbi4KKy8vLyBccmV0dXJucyBBbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIGNvbXBhcmlzb24gcmVzdWx0cy4KK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jb21pZ2Vfc3MoX19tMTI4IF9fYSwgX19tMTI4IF9fYikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2NvbWlnZSgoX192NHNmKV9fYSwgKF9fdjRzZilfX2IpOworfQorCisvLy8gXGJyaWVmIENvbXBhcmVzIHR3byAzMi1iaXQgZmxvYXQgdmFsdWVzIGluIHRoZSBsb3ctb3JkZXIgYml0cyBvZiBib3RoCisvLy8gICAgb3BlcmFuZHMgdG8gZGV0ZXJtaW5lIGlmIHRoZSBmaXJzdCBvcGVyYW5kIGlzIG5vdCBlcXVhbCB0byB0aGUgc2Vjb25kCisvLy8gICAgb3BlcmFuZCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZDT01JU1MgLyBDT01JU1MgaW5zdHJ1Y3Rpb25zLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0uIFRoZSBsb3dlciAzMiBiaXRzIG9mIHRoaXMgb3BlcmFuZCBhcmUKKy8vLyAgICB1c2VkIGluIHRoZSBjb21wYXJpc29uLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdLiBUaGUgbG93ZXIgMzIgYml0cyBvZiB0aGlzIG9wZXJhbmQgYXJlCisvLy8gICAgdXNlZCBpbiB0aGUgY29tcGFyaXNvbi4KKy8vLyBccmV0dXJucyBBbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIGNvbXBhcmlzb24gcmVzdWx0cy4KK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jb21pbmVxX3NzKF9fbTEyOCBfX2EsIF9fbTEyOCBfX2IpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9jb21pbmVxKChfX3Y0c2YpX19hLCAoX192NHNmKV9fYik7Cit9CisKKy8vLyBcYnJpZWYgUGVyZm9ybXMgYW4gdW5vcmRlcmVkIGNvbXBhcmlzb24gb2YgdHdvIDMyLWJpdCBmbG9hdCB2YWx1ZXMgdXNpbmcKKy8vLyAgICB0aGUgbG93LW9yZGVyIGJpdHMgb2YgYm90aCBvcGVyYW5kcyB0byBkZXRlcm1pbmUgZXF1YWxpdHkgYW5kIHJldHVybnMKKy8vLyAgICB0aGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZVQ09NSVNTIC8gVUNPTUlTUyBpbnN0cnVjdGlvbnMuCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XS4gVGhlIGxvd2VyIDMyIGJpdHMgb2YgdGhpcyBvcGVyYW5kIGFyZQorLy8vICAgIHVzZWQgaW4gdGhlIGNvbXBhcmlzb24uCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0uIFRoZSBsb3dlciAzMiBiaXRzIG9mIHRoaXMgb3BlcmFuZCBhcmUKKy8vLyAgICB1c2VkIGluIHRoZSBjb21wYXJpc29uLgorLy8vIFxyZXR1cm5zIEFuIGludGVnZXIgY29udGFpbmluZyB0aGUgY29tcGFyaXNvbiByZXN1bHRzLgorc3RhdGljIF9faW5saW5lX18gaW50IF9fREVGQVVMVF9GTl9BVFRSUworX21tX3Vjb21pZXFfc3MoX19tMTI4IF9fYSwgX19tMTI4IF9fYikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3Vjb21pZXEoKF9fdjRzZilfX2EsIChfX3Y0c2YpX19iKTsKK30KKworLy8vIFxicmllZiBQZXJmb3JtcyBhbiB1bm9yZGVyZWQgY29tcGFyaXNvbiBvZiB0d28gMzItYml0IGZsb2F0IHZhbHVlcyB1c2luZworLy8vICAgIHRoZSBsb3ctb3JkZXIgYml0cyBvZiBib3RoIG9wZXJhbmRzIHRvIGRldGVybWluZSBpZiB0aGUgZmlyc3Qgb3BlcmFuZCBpcworLy8vICAgIGxlc3MgdGhhbiB0aGUgc2Vjb25kIG9wZXJhbmQgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyaXNvbi4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWVUNPTUlTUyAvIFVDT01JU1MgaW5zdHJ1Y3Rpb25zLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0uIFRoZSBsb3dlciAzMiBiaXRzIG9mIHRoaXMgb3BlcmFuZCBhcmUKKy8vLyAgICB1c2VkIGluIHRoZSBjb21wYXJpc29uLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdLiBUaGUgbG93ZXIgMzIgYml0cyBvZiB0aGlzIG9wZXJhbmQgYXJlCisvLy8gICAgdXNlZCBpbiB0aGUgY29tcGFyaXNvbi4KKy8vLyBccmV0dXJucyBBbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIGNvbXBhcmlzb24gcmVzdWx0cy4KK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV91Y29taWx0X3NzKF9fbTEyOCBfX2EsIF9fbTEyOCBfX2IpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl91Y29taWx0KChfX3Y0c2YpX19hLCAoX192NHNmKV9fYik7Cit9CisKKy8vLyBcYnJpZWYgUGVyZm9ybXMgYW4gdW5vcmRlcmVkIGNvbXBhcmlzb24gb2YgdHdvIDMyLWJpdCBmbG9hdCB2YWx1ZXMgdXNpbmcKKy8vLyAgICB0aGUgbG93LW9yZGVyIGJpdHMgb2YgYm90aCBvcGVyYW5kcyB0byBkZXRlcm1pbmUgaWYgdGhlIGZpcnN0IG9wZXJhbmQKKy8vLyAgICBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNlY29uZCBvcGVyYW5kIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgb2YKKy8vLyAgICB0aGUgY29tcGFyaXNvbi4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWVUNPTUlTUyAvIFVDT01JU1MgaW5zdHJ1Y3Rpb25zLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0uIFRoZSBsb3dlciAzMiBiaXRzIG9mIHRoaXMgb3BlcmFuZCBhcmUKKy8vLyAgICB1c2VkIGluIHRoZSBjb21wYXJpc29uLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdLiBUaGUgbG93ZXIgMzIgYml0cyBvZiB0aGlzIG9wZXJhbmQgYXJlCisvLy8gICAgdXNlZCBpbiB0aGUgY29tcGFyaXNvbi4KKy8vLyBccmV0dXJucyBBbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIGNvbXBhcmlzb24gcmVzdWx0cy4KK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV91Y29taWxlX3NzKF9fbTEyOCBfX2EsIF9fbTEyOCBfX2IpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl91Y29taWxlKChfX3Y0c2YpX19hLCAoX192NHNmKV9fYik7Cit9CisKKy8vLyBcYnJpZWYgUGVyZm9ybXMgYW4gdW5vcmRlcmVkIGNvbXBhcmlzb24gb2YgdHdvIDMyLWJpdCBmbG9hdCB2YWx1ZXMgdXNpbmcKKy8vLyAgICB0aGUgbG93LW9yZGVyIGJpdHMgb2YgYm90aCBvcGVyYW5kcyB0byBkZXRlcm1pbmUgaWYgdGhlIGZpcnN0IG9wZXJhbmQKKy8vLyAgICBpcyBncmVhdGVyIHRoYW4gdGhlIHNlY29uZCBvcGVyYW5kIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlCisvLy8gICAgY29tcGFyaXNvbi4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWVUNPTUlTUyAvIFVDT01JU1MgaW5zdHJ1Y3Rpb25zLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0uIFRoZSBsb3dlciAzMiBiaXRzIG9mIHRoaXMgb3BlcmFuZCBhcmUKKy8vLyAgICB1c2VkIGluIHRoZSBjb21wYXJpc29uLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdLiBUaGUgbG93ZXIgMzIgYml0cyBvZiB0aGlzIG9wZXJhbmQgYXJlCisvLy8gICAgdXNlZCBpbiB0aGUgY29tcGFyaXNvbi4KKy8vLyBccmV0dXJucyBBbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIGNvbXBhcmlzb24gcmVzdWx0cy4KK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV91Y29taWd0X3NzKF9fbTEyOCBfX2EsIF9fbTEyOCBfX2IpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl91Y29taWd0KChfX3Y0c2YpX19hLCAoX192NHNmKV9fYik7Cit9CisKKy8vLyBcYnJpZWYgUGVyZm9ybXMgYW4gdW5vcmRlcmVkIGNvbXBhcmlzb24gb2YgdHdvIDMyLWJpdCBmbG9hdCB2YWx1ZXMgdXNpbmcKKy8vLyAgICB0aGUgbG93LW9yZGVyIGJpdHMgb2YgYm90aCBvcGVyYW5kcyB0byBkZXRlcm1pbmUgaWYgdGhlIGZpcnN0IG9wZXJhbmQgaXMKKy8vLyAgICBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNlY29uZCBvcGVyYW5kIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgb2YKKy8vLyAgICB0aGUgY29tcGFyaXNvbi4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWVUNPTUlTUyAvIFVDT01JU1MgaW5zdHJ1Y3Rpb25zLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0uIFRoZSBsb3dlciAzMiBiaXRzIG9mIHRoaXMgb3BlcmFuZCBhcmUKKy8vLyAgICB1c2VkIGluIHRoZSBjb21wYXJpc29uLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdLiBUaGUgbG93ZXIgMzIgYml0cyBvZiB0aGlzIG9wZXJhbmQgYXJlCisvLy8gICAgdXNlZCBpbiB0aGUgY29tcGFyaXNvbi4KKy8vLyBccmV0dXJucyBBbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIGNvbXBhcmlzb24gcmVzdWx0cy4KK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV91Y29taWdlX3NzKF9fbTEyOCBfX2EsIF9fbTEyOCBfX2IpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl91Y29taWdlKChfX3Y0c2YpX19hLCAoX192NHNmKV9fYik7Cit9CisKKy8vLyBcYnJpZWYgUGVyZm9ybXMgYW4gdW5vcmRlcmVkIGNvbXBhcmlzb24gb2YgdHdvIDMyLWJpdCBmbG9hdCB2YWx1ZXMgdXNpbmcKKy8vLyAgICB0aGUgbG93LW9yZGVyIGJpdHMgb2YgYm90aCBvcGVyYW5kcyB0byBkZXRlcm1pbmUgaW5lcXVhbGl0eSBhbmQgcmV0dXJucworLy8vICAgIHRoZSByZXN1bHQgb2YgdGhlIGNvbXBhcmlzb24uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVlVDT01JU1MgLyBVQ09NSVNTIGluc3RydWN0aW9ucy4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdLiBUaGUgbG93ZXIgMzIgYml0cyBvZiB0aGlzIG9wZXJhbmQgYXJlCisvLy8gICAgdXNlZCBpbiB0aGUgY29tcGFyaXNvbi4KKy8vLyBccGFyYW0gX19iCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XS4gVGhlIGxvd2VyIDMyIGJpdHMgb2YgdGhpcyBvcGVyYW5kIGFyZQorLy8vICAgIHVzZWQgaW4gdGhlIGNvbXBhcmlzb24uCisvLy8gXHJldHVybnMgQW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBjb21wYXJpc29uIHJlc3VsdHMuCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fdWNvbWluZXFfc3MoX19tMTI4IF9fYSwgX19tMTI4IF9fYikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3Vjb21pbmVxKChfX3Y0c2YpX19hLCAoX192NHNmKV9fYik7Cit9CisKKy8vLyBcYnJpZWYgQ29udmVydHMgYSBmbG9hdCB2YWx1ZSBjb250YWluZWQgaW4gdGhlIGxvd2VyIDMyIGJpdHMgb2YgYSB2ZWN0b3Igb2YKKy8vLyAgICBbNCB4IGZsb2F0XSBpbnRvIGEgMzItYml0IGludGVnZXIuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVkNWVFNTMlNJIC8gQ1ZUU1MyU0kgaW5zdHJ1Y3Rpb25zLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0uIFRoZSBsb3dlciAzMiBiaXRzIG9mIHRoaXMgb3BlcmFuZCBhcmUKKy8vLyAgICB1c2VkIGluIHRoZSBjb252ZXJzaW9uLgorLy8vIFxyZXR1cm5zIEEgMzItYml0IGludGVnZXIgY29udGFpbmluZyB0aGUgY29udmVydGVkIHZhbHVlLgorc3RhdGljIF9faW5saW5lX18gaW50IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2N2dHNzX3NpMzIoX19tMTI4IF9fYSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2N2dHNzMnNpKChfX3Y0c2YpX19hKTsKK30KKworLy8vIFxicmllZiBDb252ZXJ0cyBhIGZsb2F0IHZhbHVlIGNvbnRhaW5lZCBpbiB0aGUgbG93ZXIgMzIgYml0cyBvZiBhIHZlY3RvciBvZgorLy8vICAgIFs0IHggZmxvYXRdIGludG8gYSAzMi1iaXQgaW50ZWdlci4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWQ1ZUU1MyU0kgLyBDVlRTUzJTSSBpbnN0cnVjdGlvbnMuCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XS4gVGhlIGxvd2VyIDMyIGJpdHMgb2YgdGhpcyBvcGVyYW5kIGFyZQorLy8vICAgIHVzZWQgaW4gdGhlIGNvbnZlcnNpb24uCisvLy8gXHJldHVybnMgQSAzMi1iaXQgaW50ZWdlciBjb250YWluaW5nIHRoZSBjb252ZXJ0ZWQgdmFsdWUuCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY3Z0X3NzMnNpKF9fbTEyOCBfX2EpCit7CisgIHJldHVybiBfbW1fY3Z0c3Nfc2kzMihfX2EpOworfQorCisjaWZkZWYgX194ODZfNjRfXworCisvLy8gXGJyaWVmIENvbnZlcnRzIGEgZmxvYXQgdmFsdWUgY29udGFpbmVkIGluIHRoZSBsb3dlciAzMiBiaXRzIG9mIGEgdmVjdG9yIG9mCisvLy8gICAgWzQgeCBmbG9hdF0gaW50byBhIDY0LWJpdCBpbnRlZ2VyLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZDVlRTUzJTSSAvIENWVFNTMlNJIGluc3RydWN0aW9ucy4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdLiBUaGUgbG93ZXIgMzIgYml0cyBvZiB0aGlzIG9wZXJhbmQgYXJlCisvLy8gICAgdXNlZCBpbiB0aGUgY29udmVyc2lvbi4KKy8vLyBccmV0dXJucyBBIDY0LWJpdCBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIGNvbnZlcnRlZCB2YWx1ZS4KK3N0YXRpYyBfX2lubGluZV9fIGxvbmcgbG9uZyBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jdnRzc19zaTY0KF9fbTEyOCBfX2EpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9jdnRzczJzaTY0KChfX3Y0c2YpX19hKTsKK30KKworI2VuZGlmCisKKy8vLyBcYnJpZWYgQ29udmVydHMgdHdvIGxvdy1vcmRlciBmbG9hdCB2YWx1ZXMgaW4gYSAxMjgtYml0IHZlY3RvciBvZgorLy8vICAgIFs0IHggZmxvYXRdIGludG8gYSA2NC1iaXQgdmVjdG9yIG9mIFsyIHggaTMyXS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBDVlRQUzJQSSBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdLgorLy8vIFxyZXR1cm5zIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIGNvbnZlcnRlZCB2YWx1ZXMuCitzdGF0aWMgX19pbmxpbmVfXyBfX202NCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jdnRwc19waTMyKF9fbTEyOCBfX2EpCit7CisgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfY3Z0cHMycGkoKF9fdjRzZilfX2EpOworfQorCisvLy8gXGJyaWVmIENvbnZlcnRzIHR3byBsb3ctb3JkZXIgZmxvYXQgdmFsdWVzIGluIGEgMTI4LWJpdCB2ZWN0b3Igb2YKKy8vLyAgICBbNCB4IGZsb2F0XSBpbnRvIGEgNjQtYml0IHZlY3RvciBvZiBbMiB4IGkzMl0uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgQ1ZUUFMyUEkgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XS4KKy8vLyBccmV0dXJucyBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIHRoZSBjb252ZXJ0ZWQgdmFsdWVzLgorc3RhdGljIF9faW5saW5lX18gX19tNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY3Z0X3BzMnBpKF9fbTEyOCBfX2EpCit7CisgIHJldHVybiBfbW1fY3Z0cHNfcGkzMihfX2EpOworfQorCisvLy8gXGJyaWVmIENvbnZlcnRzIGEgZmxvYXQgdmFsdWUgY29udGFpbmVkIGluIHRoZSBsb3dlciAzMiBiaXRzIG9mIGEgdmVjdG9yIG9mCisvLy8gICAgWzQgeCBmbG9hdF0gaW50byBhIDMyLWJpdCBpbnRlZ2VyLCB0cnVuY2F0aW5nIHRoZSByZXN1bHQgd2hlbiBpdCBpcworLy8vICAgIGluZXhhY3QuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVkNWVFRTUzJTSSAvIENWVFRTUzJTSSBpbnN0cnVjdGlvbnMuCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XS4gVGhlIGxvd2VyIDMyIGJpdHMgb2YgdGhpcyBvcGVyYW5kIGFyZQorLy8vICAgIHVzZWQgaW4gdGhlIGNvbnZlcnNpb24uCisvLy8gXHJldHVybnMgQSAzMi1iaXQgaW50ZWdlciBjb250YWluaW5nIHRoZSBjb252ZXJ0ZWQgdmFsdWUuCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY3Z0dHNzX3NpMzIoX19tMTI4IF9fYSkKK3sKKyAgcmV0dXJuIF9fYVswXTsKK30KKworLy8vIFxicmllZiBDb252ZXJ0cyBhIGZsb2F0IHZhbHVlIGNvbnRhaW5lZCBpbiB0aGUgbG93ZXIgMzIgYml0cyBvZiBhIHZlY3RvciBvZgorLy8vICAgIFs0IHggZmxvYXRdIGludG8gYSAzMi1iaXQgaW50ZWdlciwgdHJ1bmNhdGluZyB0aGUgcmVzdWx0IHdoZW4gaXQgaXMKKy8vLyAgICBpbmV4YWN0LgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZDVlRUU1MyU0kgLyBDVlRUU1MyU0kgaW5zdHJ1Y3Rpb25zLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0uIFRoZSBsb3dlciAzMiBiaXRzIG9mIHRoaXMgb3BlcmFuZCBhcmUKKy8vLyAgICB1c2VkIGluIHRoZSBjb252ZXJzaW9uLgorLy8vIFxyZXR1cm5zIEEgMzItYml0IGludGVnZXIgY29udGFpbmluZyB0aGUgY29udmVydGVkIHZhbHVlLgorc3RhdGljIF9faW5saW5lX18gaW50IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2N2dHRfc3Myc2koX19tMTI4IF9fYSkKK3sKKyAgcmV0dXJuIF9tbV9jdnR0c3Nfc2kzMihfX2EpOworfQorCisvLy8gXGJyaWVmIENvbnZlcnRzIGEgZmxvYXQgdmFsdWUgY29udGFpbmVkIGluIHRoZSBsb3dlciAzMiBiaXRzIG9mIGEgdmVjdG9yIG9mCisvLy8gICAgWzQgeCBmbG9hdF0gaW50byBhIDY0LWJpdCBpbnRlZ2VyLCB0cnVuY2F0aW5nIHRoZSByZXN1bHQgd2hlbiBpdCBpcworLy8vICAgIGluZXhhY3QuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVkNWVFRTUzJTSSAvIENWVFRTUzJTSSBpbnN0cnVjdGlvbnMuCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XS4gVGhlIGxvd2VyIDMyIGJpdHMgb2YgdGhpcyBvcGVyYW5kIGFyZQorLy8vICAgIHVzZWQgaW4gdGhlIGNvbnZlcnNpb24uCisvLy8gXHJldHVybnMgQSA2NC1iaXQgaW50ZWdlciBjb250YWluaW5nIHRoZSBjb252ZXJ0ZWQgdmFsdWUuCitzdGF0aWMgX19pbmxpbmVfXyBsb25nIGxvbmcgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY3Z0dHNzX3NpNjQoX19tMTI4IF9fYSkKK3sKKyAgcmV0dXJuIF9fYVswXTsKK30KKworLy8vIFxicmllZiBDb252ZXJ0cyB0d28gbG93LW9yZGVyIGZsb2F0IHZhbHVlcyBpbiBhIDEyOC1iaXQgdmVjdG9yIG9mCisvLy8gICAgWzQgeCBmbG9hdF0gaW50byBhIDY0LWJpdCB2ZWN0b3Igb2YgWzIgeCBpMzJdLCB0cnVuY2F0aW5nIHRoZSByZXN1bHQKKy8vLyAgICB3aGVuIGl0IGlzIGluZXhhY3QuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgQ1ZUVFBTMlBJIC8gVlRUUFMyUEkgaW5zdHJ1Y3Rpb25zLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0uCisvLy8gXHJldHVybnMgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgY29udmVydGVkIHZhbHVlcy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2N2dHRwc19waTMyKF9fbTEyOCBfX2EpCit7CisgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfY3Z0dHBzMnBpKChfX3Y0c2YpX19hKTsKK30KKworLy8vIFxicmllZiBDb252ZXJ0cyB0d28gbG93LW9yZGVyIGZsb2F0IHZhbHVlcyBpbiBhIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHgKKy8vLyAgICBmbG9hdF0gaW50byBhIDY0LWJpdCB2ZWN0b3Igb2YgWzIgeCBpMzJdLCB0cnVuY2F0aW5nIHRoZSByZXN1bHQgd2hlbiBpdAorLy8vICAgIGlzIGluZXhhY3QuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgQ1ZUVFBTMlBJIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0uCisvLy8gXHJldHVybnMgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgY29udmVydGVkIHZhbHVlcy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2N2dHRfcHMycGkoX19tMTI4IF9fYSkKK3sKKyAgcmV0dXJuIF9tbV9jdnR0cHNfcGkzMihfX2EpOworfQorCisvLy8gXGJyaWVmIENvbnZlcnRzIGEgMzItYml0IHNpZ25lZCBpbnRlZ2VyIHZhbHVlIGludG8gYSBmbG9hdGluZyBwb2ludCB2YWx1ZQorLy8vICAgIGFuZCB3cml0ZXMgaXQgdG8gdGhlIGxvd2VyIDMyIGJpdHMgb2YgdGhlIGRlc3RpbmF0aW9uLiBUaGUgcmVtYWluaW5nCisvLy8gICAgaGlnaGVyIG9yZGVyIGVsZW1lbnRzIG9mIHRoZSBkZXN0aW5hdGlvbiB2ZWN0b3IgYXJlIGNvcGllZCBmcm9tIHRoZQorLy8vICAgIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlIGZpcnN0IG9wZXJhbmQuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVkNWVFNJMlNTIC8gQ1ZUU0kyU1MgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XS4KKy8vLyBccGFyYW0gX19iCisvLy8gICAgQSAzMi1iaXQgc2lnbmVkIGludGVnZXIgb3BlcmFuZCBjb250YWluaW5nIHRoZSB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQuCisvLy8gXHJldHVybnMgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSB3aG9zZSBsb3dlciAzMiBiaXRzIGNvbnRhaW4gdGhlCisvLy8gICAgY29udmVydGVkIHZhbHVlIG9mIHRoZSBzZWNvbmQgb3BlcmFuZC4gVGhlIHVwcGVyIDk2IGJpdHMgYXJlIGNvcGllZCBmcm9tCisvLy8gICAgdGhlIHVwcGVyIDk2IGJpdHMgb2YgdGhlIGZpcnN0IG9wZXJhbmQuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY3Z0c2kzMl9zcyhfX20xMjggX19hLCBpbnQgX19iKQoreworICBfX2FbMF0gPSBfX2I7CisgIHJldHVybiBfX2E7Cit9CisKKy8vLyBcYnJpZWYgQ29udmVydHMgYSAzMi1iaXQgc2lnbmVkIGludGVnZXIgdmFsdWUgaW50byBhIGZsb2F0aW5nIHBvaW50IHZhbHVlCisvLy8gICAgYW5kIHdyaXRlcyBpdCB0byB0aGUgbG93ZXIgMzIgYml0cyBvZiB0aGUgZGVzdGluYXRpb24uIFRoZSByZW1haW5pbmcKKy8vLyAgICBoaWdoZXIgb3JkZXIgZWxlbWVudHMgb2YgdGhlIGRlc3RpbmF0aW9uIGFyZSBjb3BpZWQgZnJvbSB0aGUKKy8vLyAgICBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIGluIHRoZSBmaXJzdCBvcGVyYW5kLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZDVlRTSTJTUyAvIENWVFNJMlNTIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0uCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgMzItYml0IHNpZ25lZCBpbnRlZ2VyIG9wZXJhbmQgY29udGFpbmluZyB0aGUgdmFsdWUgdG8gYmUgY29udmVydGVkLgorLy8vIFxyZXR1cm5zIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0gd2hvc2UgbG93ZXIgMzIgYml0cyBjb250YWluIHRoZQorLy8vICAgIGNvbnZlcnRlZCB2YWx1ZSBvZiB0aGUgc2Vjb25kIG9wZXJhbmQuIFRoZSB1cHBlciA5NiBiaXRzIGFyZSBjb3BpZWQgZnJvbQorLy8vICAgIHRoZSB1cHBlciA5NiBiaXRzIG9mIHRoZSBmaXJzdCBvcGVyYW5kLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2N2dF9zaTJzcyhfX20xMjggX19hLCBpbnQgX19iKQoreworICByZXR1cm4gX21tX2N2dHNpMzJfc3MoX19hLCBfX2IpOworfQorCisjaWZkZWYgX194ODZfNjRfXworCisvLy8gXGJyaWVmIENvbnZlcnRzIGEgNjQtYml0IHNpZ25lZCBpbnRlZ2VyIHZhbHVlIGludG8gYSBmbG9hdGluZyBwb2ludCB2YWx1ZQorLy8vICAgIGFuZCB3cml0ZXMgaXQgdG8gdGhlIGxvd2VyIDMyIGJpdHMgb2YgdGhlIGRlc3RpbmF0aW9uLiBUaGUgcmVtYWluaW5nCisvLy8gICAgaGlnaGVyIG9yZGVyIGVsZW1lbnRzIG9mIHRoZSBkZXN0aW5hdGlvbiBhcmUgY29waWVkIGZyb20gdGhlCisvLy8gICAgY29ycmVzcG9uZGluZyBlbGVtZW50cyBpbiB0aGUgZmlyc3Qgb3BlcmFuZC4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWQ1ZUU0kyU1MgLyBDVlRTSTJTUyBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDY0LWJpdCBzaWduZWQgaW50ZWdlciBvcGVyYW5kIGNvbnRhaW5pbmcgdGhlIHZhbHVlIHRvIGJlIGNvbnZlcnRlZC4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIHdob3NlIGxvd2VyIDMyIGJpdHMgY29udGFpbiB0aGUKKy8vLyAgICBjb252ZXJ0ZWQgdmFsdWUgb2YgdGhlIHNlY29uZCBvcGVyYW5kLiBUaGUgdXBwZXIgOTYgYml0cyBhcmUgY29waWVkIGZyb20KKy8vLyAgICB0aGUgdXBwZXIgOTYgYml0cyBvZiB0aGUgZmlyc3Qgb3BlcmFuZC4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jdnRzaTY0X3NzKF9fbTEyOCBfX2EsIGxvbmcgbG9uZyBfX2IpCit7CisgIF9fYVswXSA9IF9fYjsKKyAgcmV0dXJuIF9fYTsKK30KKworI2VuZGlmCisKKy8vLyBcYnJpZWYgQ29udmVydHMgdHdvIGVsZW1lbnRzIG9mIGEgNjQtYml0IHZlY3RvciBvZiBbMiB4IGkzMl0gaW50byB0d28KKy8vLyAgICBmbG9hdGluZyBwb2ludCB2YWx1ZXMgYW5kIHdyaXRlcyB0aGVtIHRvIHRoZSBsb3dlciA2NC1iaXRzIG9mIHRoZQorLy8vICAgIGRlc3RpbmF0aW9uLiBUaGUgcmVtYWluaW5nIGhpZ2hlciBvcmRlciBlbGVtZW50cyBvZiB0aGUgZGVzdGluYXRpb24gYXJlCisvLy8gICAgY29waWVkIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlIGZpcnN0IG9wZXJhbmQuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgQ1ZUUEkyUFMgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XS4KKy8vLyBccGFyYW0gX19iCisvLy8gICAgQSA2NC1iaXQgdmVjdG9yIG9mIFsyIHggaTMyXS4gVGhlIGVsZW1lbnRzIGluIHRoaXMgdmVjdG9yIGFyZSBjb252ZXJ0ZWQKKy8vLyAgICBhbmQgd3JpdHRlbiB0byB0aGUgY29ycmVzcG9uZGluZyBsb3ctb3JkZXIgZWxlbWVudHMgaW4gdGhlIGRlc3RpbmF0aW9uLgorLy8vIFxyZXR1cm5zIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0gd2hvc2UgbG93ZXIgNjQgYml0cyBjb250YWluIHRoZQorLy8vICAgIGNvbnZlcnRlZCB2YWx1ZSBvZiB0aGUgc2Vjb25kIG9wZXJhbmQuIFRoZSB1cHBlciA2NCBiaXRzIGFyZSBjb3BpZWQgZnJvbQorLy8vICAgIHRoZSB1cHBlciA2NCBiaXRzIG9mIHRoZSBmaXJzdCBvcGVyYW5kLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2N2dHBpMzJfcHMoX19tMTI4IF9fYSwgX19tNjQgX19iKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfY3Z0cGkycHMoKF9fdjRzZilfX2EsIChfX3Yyc2kpX19iKTsKK30KKworLy8vIFxicmllZiBDb252ZXJ0cyB0d28gZWxlbWVudHMgb2YgYSA2NC1iaXQgdmVjdG9yIG9mIFsyIHggaTMyXSBpbnRvIHR3bworLy8vICAgIGZsb2F0aW5nIHBvaW50IHZhbHVlcyBhbmQgd3JpdGVzIHRoZW0gdG8gdGhlIGxvd2VyIDY0LWJpdHMgb2YgdGhlCisvLy8gICAgZGVzdGluYXRpb24uIFRoZSByZW1haW5pbmcgaGlnaGVyIG9yZGVyIGVsZW1lbnRzIG9mIHRoZSBkZXN0aW5hdGlvbiBhcmUKKy8vLyAgICBjb3BpZWQgZnJvbSB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50cyBpbiB0aGUgZmlyc3Qgb3BlcmFuZC4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBDVlRQSTJQUyBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDY0LWJpdCB2ZWN0b3Igb2YgWzIgeCBpMzJdLiBUaGUgZWxlbWVudHMgaW4gdGhpcyB2ZWN0b3IgYXJlIGNvbnZlcnRlZAorLy8vICAgIGFuZCB3cml0dGVuIHRvIHRoZSBjb3JyZXNwb25kaW5nIGxvdy1vcmRlciBlbGVtZW50cyBpbiB0aGUgZGVzdGluYXRpb24uCisvLy8gXHJldHVybnMgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSB3aG9zZSBsb3dlciA2NCBiaXRzIGNvbnRhaW4gdGhlCisvLy8gICAgY29udmVydGVkIHZhbHVlIGZyb20gdGhlIHNlY29uZCBvcGVyYW5kLiBUaGUgdXBwZXIgNjQgYml0cyBhcmUgY29waWVkCisvLy8gICAgZnJvbSB0aGUgdXBwZXIgNjQgYml0cyBvZiB0aGUgZmlyc3Qgb3BlcmFuZC4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jdnRfcGkycHMoX19tMTI4IF9fYSwgX19tNjQgX19iKQoreworICByZXR1cm4gX21tX2N2dHBpMzJfcHMoX19hLCBfX2IpOworfQorCisvLy8gXGJyaWVmIEV4dHJhY3RzIGEgZmxvYXQgdmFsdWUgY29udGFpbmVkIGluIHRoZSBsb3dlciAzMiBiaXRzIG9mIGEgdmVjdG9yIG9mCisvLy8gICAgWzQgeCBmbG9hdF0uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVk1PVlNTIC8gTU9WU1MgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XS4gVGhlIGxvd2VyIDMyIGJpdHMgb2YgdGhpcyBvcGVyYW5kIGFyZQorLy8vICAgIHVzZWQgaW4gdGhlIGV4dHJhY3Rpb24uCisvLy8gXHJldHVybnMgQSAzMi1iaXQgZmxvYXQgY29udGFpbmluZyB0aGUgZXh0cmFjdGVkIHZhbHVlLgorc3RhdGljIF9faW5saW5lX18gZmxvYXQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY3Z0c3NfZjMyKF9fbTEyOCBfX2EpCit7CisgIHJldHVybiBfX2FbMF07Cit9CisKKy8vLyBcYnJpZWYgTG9hZHMgdHdvIHBhY2tlZCBmbG9hdCB2YWx1ZXMgZnJvbSB0aGUgYWRkcmVzcyBfX3AgaW50byB0aGUKKy8vLyAgICAgaGlnaC1vcmRlciBiaXRzIG9mIGEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0uIFRoZSBsb3ctb3JkZXIgYml0cworLy8vICAgICBhcmUgY29waWVkIGZyb20gdGhlIGxvdy1vcmRlciBiaXRzIG9mIHRoZSBmaXJzdCBvcGVyYW5kLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZNT1ZIUEQgLyBNT1ZIUEQgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XS4gQml0cyBbNjM6MF0gYXJlIHdyaXR0ZW4gdG8gYml0cyBbNjM6MF0KKy8vLyAgICBvZiB0aGUgZGVzdGluYXRpb24uCisvLy8gXHBhcmFtIF9fcAorLy8vICAgIEEgcG9pbnRlciB0byB0d28gcGFja2VkIGZsb2F0IHZhbHVlcy4gQml0cyBbNjM6MF0gYXJlIHdyaXR0ZW4gdG8gYml0cworLy8vICAgIFsxMjc6NjRdIG9mIHRoZSBkZXN0aW5hdGlvbi4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgdGhlIG1vdmVkIHZhbHVlcy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9sb2FkaF9waShfX20xMjggX19hLCBjb25zdCBfX202NCAqX19wKQoreworICB0eXBlZGVmIGZsb2F0IF9fbW1fbG9hZGhfcGlfdjJmMzIgX19hdHRyaWJ1dGVfXygoX192ZWN0b3Jfc2l6ZV9fKDgpKSk7CisgIHN0cnVjdCBfX21tX2xvYWRoX3BpX3N0cnVjdCB7CisgICAgX19tbV9sb2FkaF9waV92MmYzMiBfX3U7CisgIH0gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXywgX19tYXlfYWxpYXNfXykpOworICBfX21tX2xvYWRoX3BpX3YyZjMyIF9fYiA9ICgoc3RydWN0IF9fbW1fbG9hZGhfcGlfc3RydWN0KilfX3ApLT5fX3U7CisgIF9fbTEyOCBfX2JiID0gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19iLCBfX2IsIDAsIDEsIDAsIDEpOworICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2JiLCAwLCAxLCA0LCA1KTsKK30KKworLy8vIFxicmllZiBMb2FkcyB0d28gcGFja2VkIGZsb2F0IHZhbHVlcyBmcm9tIHRoZSBhZGRyZXNzIF9fcCBpbnRvIHRoZSBsb3ctb3JkZXIKKy8vLyAgICBiaXRzIG9mIGEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0uIFRoZSBoaWdoLW9yZGVyIGJpdHMgYXJlIGNvcGllZAorLy8vICAgIGZyb20gdGhlIGhpZ2gtb3JkZXIgYml0cyBvZiB0aGUgZmlyc3Qgb3BlcmFuZC4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWTU9WTFBEIC8gTU9WTFBEIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0uIEJpdHMgWzEyNzo2NF0gYXJlIHdyaXR0ZW4gdG8gYml0cworLy8vICAgIFsxMjc6NjRdIG9mIHRoZSBkZXN0aW5hdGlvbi4KKy8vLyBccGFyYW0gX19wCisvLy8gICAgQSBwb2ludGVyIHRvIHR3byBwYWNrZWQgZmxvYXQgdmFsdWVzLiBCaXRzIFs2MzowXSBhcmUgd3JpdHRlbiB0byBiaXRzCisvLy8gICAgWzYzOjBdIG9mIHRoZSBkZXN0aW5hdGlvbi4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgdGhlIG1vdmVkIHZhbHVlcy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9sb2FkbF9waShfX20xMjggX19hLCBjb25zdCBfX202NCAqX19wKQoreworICB0eXBlZGVmIGZsb2F0IF9fbW1fbG9hZGxfcGlfdjJmMzIgX19hdHRyaWJ1dGVfXygoX192ZWN0b3Jfc2l6ZV9fKDgpKSk7CisgIHN0cnVjdCBfX21tX2xvYWRsX3BpX3N0cnVjdCB7CisgICAgX19tbV9sb2FkbF9waV92MmYzMiBfX3U7CisgIH0gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXywgX19tYXlfYWxpYXNfXykpOworICBfX21tX2xvYWRsX3BpX3YyZjMyIF9fYiA9ICgoc3RydWN0IF9fbW1fbG9hZGxfcGlfc3RydWN0KilfX3ApLT5fX3U7CisgIF9fbTEyOCBfX2JiID0gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19iLCBfX2IsIDAsIDEsIDAsIDEpOworICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2JiLCA0LCA1LCAyLCAzKTsKK30KKworLy8vIFxicmllZiBDb25zdHJ1Y3RzIGEgMTI4LWJpdCBmbG9hdGluZy1wb2ludCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0uIFRoZSBsb3dlcgorLy8vICAgIDMyIGJpdHMgb2YgdGhlIHZlY3RvciBhcmUgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgc2luZ2xlLXByZWNpc2lvbgorLy8vICAgIGZsb2F0aW5nLXBvaW50IHZhbHVlIGxvYWRlZCBmcm9tIGEgc3BlY2lmaWVkIG1lbW9yeSBsb2NhdGlvbi4gVGhlIHVwcGVyCisvLy8gICAgOTYgYml0cyBhcmUgc2V0IHRvIHplcm8uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVk1PVlNTIC8gTU9WU1MgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19wCisvLy8gICAgQSBwb2ludGVyIHRvIGEgMzItYml0IG1lbW9yeSBsb2NhdGlvbiBjb250YWluaW5nIGEgc2luZ2xlLXByZWNpc2lvbgorLy8vICAgIGZsb2F0aW5nLXBvaW50IHZhbHVlLgorLy8vIFxyZXR1cm5zIEFuIGluaXRpYWxpemVkIDEyOC1iaXQgZmxvYXRpbmctcG9pbnQgdmVjdG9yIG9mIFs0IHggZmxvYXRdLiBUaGUKKy8vLyAgICBsb3dlciAzMiBiaXRzIGNvbnRhaW4gdGhlIHZhbHVlIGxvYWRlZCBmcm9tIHRoZSBtZW1vcnkgbG9jYXRpb24uIFRoZQorLy8vICAgIHVwcGVyIDk2IGJpdHMgYXJlIHNldCB0byB6ZXJvLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2xvYWRfc3MoY29uc3QgZmxvYXQgKl9fcCkKK3sKKyAgc3RydWN0IF9fbW1fbG9hZF9zc19zdHJ1Y3QgeworICAgIGZsb2F0IF9fdTsKKyAgfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fLCBfX21heV9hbGlhc19fKSk7CisgIGZsb2F0IF9fdSA9ICgoc3RydWN0IF9fbW1fbG9hZF9zc19zdHJ1Y3QqKV9fcCktPl9fdTsKKyAgcmV0dXJuIChfX20xMjgpeyBfX3UsIDAsIDAsIDAgfTsKK30KKworLy8vIFxicmllZiBMb2FkcyBhIDMyLWJpdCBmbG9hdCB2YWx1ZSBhbmQgZHVwbGljYXRlcyBpdCB0byBhbGwgZm91ciB2ZWN0b3IKKy8vLyAgICBlbGVtZW50cyBvZiBhIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZNT1ZTUyAvIE1PVlNTICsgXGMgc2h1ZmZsaW5nCisvLy8gICAgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19wCisvLy8gICAgQSBwb2ludGVyIHRvIGEgZmxvYXQgdmFsdWUgdG8gYmUgbG9hZGVkIGFuZCBkdXBsaWNhdGVkLgorLy8vIFxyZXR1cm5zIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0gY29udGFpbmluZyB0aGUgbG9hZGVkCisvLy8gICAgYW5kIGR1cGxpY2F0ZWQgdmFsdWVzLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2xvYWQxX3BzKGNvbnN0IGZsb2F0ICpfX3ApCit7CisgIHN0cnVjdCBfX21tX2xvYWQxX3BzX3N0cnVjdCB7CisgICAgZmxvYXQgX191OworICB9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18sIF9fbWF5X2FsaWFzX18pKTsKKyAgZmxvYXQgX191ID0gKChzdHJ1Y3QgX19tbV9sb2FkMV9wc19zdHJ1Y3QqKV9fcCktPl9fdTsKKyAgcmV0dXJuIChfX20xMjgpeyBfX3UsIF9fdSwgX191LCBfX3UgfTsKK30KKworI2RlZmluZSAgICAgICAgX21tX2xvYWRfcHMxKHApIF9tbV9sb2FkMV9wcyhwKQorCisvLy8gXGJyaWVmIExvYWRzIGEgMTI4LWJpdCBmbG9hdGluZy1wb2ludCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0gZnJvbSBhbiBhbGlnbmVkCisvLy8gICAgbWVtb3J5IGxvY2F0aW9uLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZNT1ZBUFMgLyBNT1ZBUFMgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19wCisvLy8gICAgQSBwb2ludGVyIHRvIGEgMTI4LWJpdCBtZW1vcnkgbG9jYXRpb24uIFRoZSBhZGRyZXNzIG9mIHRoZSBtZW1vcnkKKy8vLyAgICBsb2NhdGlvbiBoYXMgdG8gYmUgMTI4LWJpdCBhbGlnbmVkLgorLy8vIFxyZXR1cm5zIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0gY29udGFpbmluZyB0aGUgbG9hZGVkIHZhbHVzLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2xvYWRfcHMoY29uc3QgZmxvYXQgKl9fcCkKK3sKKyAgcmV0dXJuICooX19tMTI4KilfX3A7Cit9CisKKy8vLyBcYnJpZWYgTG9hZHMgYSAxMjgtYml0IGZsb2F0aW5nLXBvaW50IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBmcm9tIGFuCisvLy8gICAgdW5hbGlnbmVkIG1lbW9yeSBsb2NhdGlvbi4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWTU9WVVBTIC8gTU9WVVBTIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fcAorLy8vICAgIEEgcG9pbnRlciB0byBhIDEyOC1iaXQgbWVtb3J5IGxvY2F0aW9uLiBUaGUgYWRkcmVzcyBvZiB0aGUgbWVtb3J5CisvLy8gICAgbG9jYXRpb24gZG9lcyBub3QgaGF2ZSB0byBiZSBhbGlnbmVkLgorLy8vIFxyZXR1cm5zIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0gY29udGFpbmluZyB0aGUgbG9hZGVkIHZhbHVlcy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9sb2FkdV9wcyhjb25zdCBmbG9hdCAqX19wKQoreworICBzdHJ1Y3QgX19sb2FkdV9wcyB7CisgICAgX19tMTI4IF9fdjsKKyAgfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fLCBfX21heV9hbGlhc19fKSk7CisgIHJldHVybiAoKHN0cnVjdCBfX2xvYWR1X3BzKilfX3ApLT5fX3Y7Cit9CisKKy8vLyBcYnJpZWYgTG9hZHMgZm91ciBwYWNrZWQgZmxvYXQgdmFsdWVzLCBpbiByZXZlcnNlIG9yZGVyLCBmcm9tIGFuIGFsaWduZWQKKy8vLyAgICBtZW1vcnkgbG9jYXRpb24gdG8gMzItYml0IGVsZW1lbnRzIGluIGEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVk1PVkFQUyAvIE1PVkFQUyArIFxjIHNodWZmbGluZworLy8vICAgIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fcAorLy8vICAgIEEgcG9pbnRlciB0byBhIDEyOC1iaXQgbWVtb3J5IGxvY2F0aW9uLiBUaGUgYWRkcmVzcyBvZiB0aGUgbWVtb3J5CisvLy8gICAgbG9jYXRpb24gaGFzIHRvIGJlIDEyOC1iaXQgYWxpZ25lZC4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgdGhlIG1vdmVkIHZhbHVlcywgbG9hZGVkCisvLy8gICAgaW4gcmV2ZXJzZSBvcmRlci4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9sb2Fkcl9wcyhjb25zdCBmbG9hdCAqX19wKQoreworICBfX20xMjggX19hID0gX21tX2xvYWRfcHMoX19wKTsKKyAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3Y0c2YpX19hLCAoX192NHNmKV9fYSwgMywgMiwgMSwgMCk7Cit9CisKKy8vLyBcYnJpZWYgQ3JlYXRlIGEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0gd2l0aCB1bmRlZmluZWQgdmFsdWVzLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgaGFzIG5vIGNvcnJlc3BvbmRpbmcgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgdW5kZWZpbmVkIHZhbHVlcy4KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX3VuZGVmaW5lZF9wcyh2b2lkKQoreworICByZXR1cm4gKF9fbTEyOClfX2J1aWx0aW5faWEzMl91bmRlZjEyOCgpOworfQorCisvLy8gXGJyaWVmIENvbnN0cnVjdHMgYSAxMjgtYml0IGZsb2F0aW5nLXBvaW50IHZlY3RvciBvZiBbNCB4IGZsb2F0XS4gVGhlIGxvd2VyCisvLy8gICAgMzIgYml0cyBvZiB0aGUgdmVjdG9yIGFyZSBpbml0aWFsaXplZCB3aXRoIHRoZSBzcGVjaWZpZWQgc2luZ2xlLXByZWNpc2lvbgorLy8vICAgIGZsb2F0aW5nLXBvaW50IHZhbHVlLiBUaGUgdXBwZXIgOTYgYml0cyBhcmUgc2V0IHRvIHplcm8uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVk1PVlNTIC8gTU9WU1MgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX193CisvLy8gICAgQSBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgbG93ZXIgMzIKKy8vLyAgICBiaXRzIG9mIHRoZSByZXN1bHQuCisvLy8gXHJldHVybnMgQW4gaW5pdGlhbGl6ZWQgMTI4LWJpdCBmbG9hdGluZy1wb2ludCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0uIFRoZQorLy8vICAgIGxvd2VyIDMyIGJpdHMgY29udGFpbiB0aGUgdmFsdWUgcHJvdmlkZWQgaW4gdGhlIHNvdXJjZSBvcGVyYW5kLiBUaGUKKy8vLyAgICB1cHBlciA5NiBiaXRzIGFyZSBzZXQgdG8gemVyby4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zZXRfc3MoZmxvYXQgX193KQoreworICByZXR1cm4gKF9fbTEyOCl7IF9fdywgMCwgMCwgMCB9OworfQorCisvLy8gXGJyaWVmIENvbnN0cnVjdHMgYSAxMjgtYml0IGZsb2F0aW5nLXBvaW50IHZlY3RvciBvZiBbNCB4IGZsb2F0XSwgd2l0aCBlYWNoCisvLy8gICAgb2YgdGhlIGZvdXIgc2luZ2xlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2ZWN0b3IgZWxlbWVudHMgc2V0IHRvIHRoZQorLy8vICAgIHNwZWNpZmllZCBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZQRVJNSUxQUyAvIFBFUk1JTFBTIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fdworLy8vICAgIEEgc2luZ2xlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZSB1c2VkIHRvIGluaXRpYWxpemUgZWFjaCB2ZWN0b3IKKy8vLyAgICBlbGVtZW50IG9mIHRoZSByZXN1bHQuCisvLy8gXHJldHVybnMgQW4gaW5pdGlhbGl6ZWQgMTI4LWJpdCBmbG9hdGluZy1wb2ludCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0uCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc2V0MV9wcyhmbG9hdCBfX3cpCit7CisgIHJldHVybiAoX19tMTI4KXsgX193LCBfX3csIF9fdywgX193IH07Cit9CisKKy8qIE1pY3Jvc29mdCBzcGVjaWZpYy4gKi8KKy8vLyBcYnJpZWYgQ29uc3RydWN0cyBhIDEyOC1iaXQgZmxvYXRpbmctcG9pbnQgdmVjdG9yIG9mIFs0IHggZmxvYXRdLCB3aXRoIGVhY2gKKy8vLyAgICBvZiB0aGUgZm91ciBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZlY3RvciBlbGVtZW50cyBzZXQgdG8gdGhlCisvLy8gICAgc3BlY2lmaWVkIHNpbmdsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVlBFUk1JTFBTIC8gUEVSTUlMUFMgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX193CisvLy8gICAgQSBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlIHVzZWQgdG8gaW5pdGlhbGl6ZSBlYWNoIHZlY3RvcgorLy8vICAgIGVsZW1lbnQgb2YgdGhlIHJlc3VsdC4KKy8vLyBccmV0dXJucyBBbiBpbml0aWFsaXplZCAxMjgtYml0IGZsb2F0aW5nLXBvaW50IHZlY3RvciBvZiBbNCB4IGZsb2F0XS4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zZXRfcHMxKGZsb2F0IF9fdykKK3sKKyAgICByZXR1cm4gX21tX3NldDFfcHMoX193KTsKK30KKworLy8vIFxicmllZiBDb25zdHJ1Y3RzIGEgMTI4LWJpdCBmbG9hdGluZy1wb2ludCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0KKy8vLyAgICBpbml0aWFsaXplZCB3aXRoIHRoZSBzcGVjaWZpZWQgc2luZ2xlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZXMuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBpcyBhIHV0aWxpdHkgZnVuY3Rpb24gYW5kIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYSBzcGVjaWZpYworLy8vICAgIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fegorLy8vICAgIEEgc2luZ2xlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZSB1c2VkIHRvIGluaXRpYWxpemUgYml0cyBbMTI3Ojk2XQorLy8vICAgIG9mIHRoZSByZXN1bHQuCisvLy8gXHBhcmFtIF9feQorLy8vICAgIEEgc2luZ2xlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZSB1c2VkIHRvIGluaXRpYWxpemUgYml0cyBbOTU6NjRdCisvLy8gICAgb2YgdGhlIHJlc3VsdC4KKy8vLyBccGFyYW0gX194CisvLy8gICAgQSBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlIHVzZWQgdG8gaW5pdGlhbGl6ZSBiaXRzIFs2MzozMl0KKy8vLyAgICBvZiB0aGUgcmVzdWx0LgorLy8vIFxwYXJhbSBfX3cKKy8vLyAgICBBIHNpbmdsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUgdXNlZCB0byBpbml0aWFsaXplIGJpdHMgWzMxOjBdCisvLy8gICAgb2YgdGhlIHJlc3VsdC4KKy8vLyBccmV0dXJucyBBbiBpbml0aWFsaXplZCAxMjgtYml0IGZsb2F0aW5nLXBvaW50IHZlY3RvciBvZiBbNCB4IGZsb2F0XS4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zZXRfcHMoZmxvYXQgX196LCBmbG9hdCBfX3ksIGZsb2F0IF9feCwgZmxvYXQgX193KQoreworICByZXR1cm4gKF9fbTEyOCl7IF9fdywgX194LCBfX3ksIF9feiB9OworfQorCisvLy8gXGJyaWVmIENvbnN0cnVjdHMgYSAxMjgtYml0IGZsb2F0aW5nLXBvaW50IHZlY3RvciBvZiBbNCB4IGZsb2F0XSwKKy8vLyAgICBpbml0aWFsaXplZCBpbiByZXZlcnNlIG9yZGVyIHdpdGggdGhlIHNwZWNpZmllZCAzMi1iaXQgc2luZ2xlLXByZWNpc2lvbgorLy8vICAgIGZsb2F0LXBvaW50IHZhbHVlcy4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGlzIGEgdXRpbGl0eSBmdW5jdGlvbiBhbmQgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhIHNwZWNpZmljCisvLy8gICAgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX196CisvLy8gICAgQSBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlIHVzZWQgdG8gaW5pdGlhbGl6ZSBiaXRzIFszMTowXQorLy8vICAgIG9mIHRoZSByZXN1bHQuCisvLy8gXHBhcmFtIF9feQorLy8vICAgIEEgc2luZ2xlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZSB1c2VkIHRvIGluaXRpYWxpemUgYml0cyBbNjM6MzJdCisvLy8gICAgb2YgdGhlIHJlc3VsdC4KKy8vLyBccGFyYW0gX194CisvLy8gICAgQSBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlIHVzZWQgdG8gaW5pdGlhbGl6ZSBiaXRzIFs5NTo2NF0KKy8vLyAgICBvZiB0aGUgcmVzdWx0LgorLy8vIFxwYXJhbSBfX3cKKy8vLyAgICBBIHNpbmdsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUgdXNlZCB0byBpbml0aWFsaXplIGJpdHMgWzEyNzo5Nl0KKy8vLyAgICBvZiB0aGUgcmVzdWx0LgorLy8vIFxyZXR1cm5zIEFuIGluaXRpYWxpemVkIDEyOC1iaXQgZmxvYXRpbmctcG9pbnQgdmVjdG9yIG9mIFs0IHggZmxvYXRdLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX3NldHJfcHMoZmxvYXQgX196LCBmbG9hdCBfX3ksIGZsb2F0IF9feCwgZmxvYXQgX193KQoreworICByZXR1cm4gKF9fbTEyOCl7IF9feiwgX195LCBfX3gsIF9fdyB9OworfQorCisvLy8gXGJyaWVmIENvbnN0cnVjdHMgYSAxMjgtYml0IGZsb2F0aW5nLXBvaW50IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBpbml0aWFsaXplZAorLy8vICAgIHRvIHplcm8uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVlhPUlBTIC8gWE9SUFMgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccmV0dXJucyBBbiBpbml0aWFsaXplZCAxMjgtYml0IGZsb2F0aW5nLXBvaW50IHZlY3RvciBvZiBbNCB4IGZsb2F0XSB3aXRoCisvLy8gICAgYWxsIGVsZW1lbnRzIHNldCB0byB6ZXJvLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX3NldHplcm9fcHModm9pZCkKK3sKKyAgcmV0dXJuIChfX20xMjgpeyAwLCAwLCAwLCAwIH07Cit9CisKKy8vLyBcYnJpZWYgU3RvcmVzIHRoZSB1cHBlciA2NCBiaXRzIG9mIGEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0gdG8gYQorLy8vICAgIG1lbW9yeSBsb2NhdGlvbi4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWUEVYVFJRIC8gTU9WUSBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX3AKKy8vLyAgICBBIHBvaW50ZXIgdG8gYSA2NC1iaXQgbWVtb3J5IGxvY2F0aW9uLgorLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgdGhlIHZhbHVlcyB0byBiZSBzdG9yZWQuCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3N0b3JlaF9waShfX202NCAqX19wLCBfX20xMjggX19hKQoreworICBfX2J1aWx0aW5faWEzMl9zdG9yZWhwcygoX192MnNpICopX19wLCAoX192NHNmKV9fYSk7Cit9CisKKy8vLyBcYnJpZWYgU3RvcmVzIHRoZSBsb3dlciA2NCBiaXRzIG9mIGEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0gdG8gYQorLy8vICAgICBtZW1vcnkgbG9jYXRpb24uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVk1PVkxQUyAvIE1PVkxQUyBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX3AKKy8vLyAgICBBIHBvaW50ZXIgdG8gYSBtZW1vcnkgbG9jYXRpb24gdGhhdCB3aWxsIHJlY2VpdmUgdGhlIGZsb2F0IHZhbHVlcy4KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSB2YWx1ZXMgdG8gYmUgc3RvcmVkLgorc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zdG9yZWxfcGkoX19tNjQgKl9fcCwgX19tMTI4IF9fYSkKK3sKKyAgX19idWlsdGluX2lhMzJfc3RvcmVscHMoKF9fdjJzaSAqKV9fcCwgKF9fdjRzZilfX2EpOworfQorCisvLy8gXGJyaWVmIFN0b3JlcyB0aGUgbG93ZXIgMzIgYml0cyBvZiBhIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIHRvIGEKKy8vLyAgICAgbWVtb3J5IGxvY2F0aW9uLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZNT1ZTUyAvIE1PVlNTIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fcAorLy8vICAgIEEgcG9pbnRlciB0byBhIDMyLWJpdCBtZW1vcnkgbG9jYXRpb24uCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0gY29udGFpbmluZyB0aGUgdmFsdWUgdG8gYmUgc3RvcmVkLgorc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zdG9yZV9zcyhmbG9hdCAqX19wLCBfX20xMjggX19hKQoreworICBzdHJ1Y3QgX19tbV9zdG9yZV9zc19zdHJ1Y3QgeworICAgIGZsb2F0IF9fdTsKKyAgfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fLCBfX21heV9hbGlhc19fKSk7CisgICgoc3RydWN0IF9fbW1fc3RvcmVfc3Nfc3RydWN0KilfX3ApLT5fX3UgPSBfX2FbMF07Cit9CisKKy8vLyBcYnJpZWYgU3RvcmVzIGZsb2F0IHZhbHVlcyBmcm9tIGEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0gdG8gYW4KKy8vLyAgICB1bmFsaWduZWQgbWVtb3J5IGxvY2F0aW9uLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZNT1ZVUFMgLyBNT1ZVUFMgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19wCisvLy8gICAgQSBwb2ludGVyIHRvIGEgMTI4LWJpdCBtZW1vcnkgbG9jYXRpb24uIFRoZSBhZGRyZXNzIG9mIHRoZSBtZW1vcnkKKy8vLyAgICBsb2NhdGlvbiBkb2VzIG5vdCBoYXZlIHRvIGJlIGFsaWduZWQuCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0gY29udGFpbmluZyB0aGUgdmFsdWVzIHRvIGJlIHN0b3JlZC4KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc3RvcmV1X3BzKGZsb2F0ICpfX3AsIF9fbTEyOCBfX2EpCit7CisgIHN0cnVjdCBfX3N0b3JldV9wcyB7CisgICAgX19tMTI4IF9fdjsKKyAgfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fLCBfX21heV9hbGlhc19fKSk7CisgICgoc3RydWN0IF9fc3RvcmV1X3BzKilfX3ApLT5fX3YgPSBfX2E7Cit9CisKKy8vLyBcYnJpZWYgU3RvcmVzIHRoZSBsb3dlciAzMiBiaXRzIG9mIGEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0gaW50bworLy8vICAgIGZvdXIgY29udGlndW91cyBlbGVtZW50cyBpbiBhbiBhbGlnbmVkIG1lbW9yeSBsb2NhdGlvbi4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIFxjIFZNT1ZBUFMgLyBNT1ZBUFMgKyBcYyBzaHVmZmxpbmcKKy8vLyAgICBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX3AKKy8vLyAgICBBIHBvaW50ZXIgdG8gYSAxMjgtYml0IG1lbW9yeSBsb2NhdGlvbi4KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSB3aG9zZSBsb3dlciAzMiBiaXRzIGFyZSBzdG9yZWQgdG8gZWFjaAorLy8vICAgIG9mIHRoZSBmb3VyIGNvbnRpZ3VvdXMgZWxlbWVudHMgcG9pbnRlZCBieSBfX3AuCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3N0b3JlX3BzKGZsb2F0ICpfX3AsIF9fbTEyOCBfX2EpCit7CisgICooX19tMTI4KilfX3AgPSBfX2E7Cit9CisKKy8vLyBcYnJpZWYgU3RvcmVzIHRoZSBsb3dlciAzMiBiaXRzIG9mIGEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0gaW50bworLy8vICAgIGZvdXIgY29udGlndW91cyBlbGVtZW50cyBpbiBhbiBhbGlnbmVkIG1lbW9yeSBsb2NhdGlvbi4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIFxjIFZNT1ZBUFMgLyBNT1ZBUFMgKyBcYyBzaHVmZmxpbmcKKy8vLyAgICBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX3AKKy8vLyAgICBBIHBvaW50ZXIgdG8gYSAxMjgtYml0IG1lbW9yeSBsb2NhdGlvbi4KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSB3aG9zZSBsb3dlciAzMiBiaXRzIGFyZSBzdG9yZWQgdG8gZWFjaAorLy8vICAgIG9mIHRoZSBmb3VyIGNvbnRpZ3VvdXMgZWxlbWVudHMgcG9pbnRlZCBieSBfX3AuCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3N0b3JlMV9wcyhmbG9hdCAqX19wLCBfX20xMjggX19hKQoreworICBfX2EgPSBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcigoX192NHNmKV9fYSwgKF9fdjRzZilfX2EsIDAsIDAsIDAsIDApOworICBfbW1fc3RvcmVfcHMoX19wLCBfX2EpOworfQorCisvLy8gXGJyaWVmIFN0b3JlcyBmbG9hdCB2YWx1ZXMgZnJvbSBhIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIHRvIGFuCisvLy8gICAgYWxpZ25lZCBtZW1vcnkgbG9jYXRpb24uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVk1PVkFQUyAvIE1PVkFQUyBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX3AKKy8vLyAgICBBIHBvaW50ZXIgdG8gYSAxMjgtYml0IG1lbW9yeSBsb2NhdGlvbi4gVGhlIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeQorLy8vICAgIGxvY2F0aW9uIGhhcyB0byBiZSAxMjgtYml0IGFsaWduZWQuCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0gY29udGFpbmluZyB0aGUgdmFsdWVzIHRvIGJlIHN0b3JlZC4KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc3RvcmVfcHMxKGZsb2F0ICpfX3AsIF9fbTEyOCBfX2EpCit7CisgIHJldHVybiBfbW1fc3RvcmUxX3BzKF9fcCwgX19hKTsKK30KKworLy8vIFxicmllZiBTdG9yZXMgZmxvYXQgdmFsdWVzIGZyb20gYSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSB0byBhbgorLy8vICAgIGFsaWduZWQgbWVtb3J5IGxvY2F0aW9uIGluIHJldmVyc2Ugb3JkZXIuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVk1PVkFQUyAvIE1PVkFQUyArIFxjIHNodWZmbGluZworLy8vICAgIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fcAorLy8vICAgIEEgcG9pbnRlciB0byBhIDEyOC1iaXQgbWVtb3J5IGxvY2F0aW9uLiBUaGUgYWRkcmVzcyBvZiB0aGUgbWVtb3J5CisvLy8gICAgbG9jYXRpb24gaGFzIHRvIGJlIDEyOC1iaXQgYWxpZ25lZC4KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSB2YWx1ZXMgdG8gYmUgc3RvcmVkLgorc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zdG9yZXJfcHMoZmxvYXQgKl9fcCwgX19tMTI4IF9fYSkKK3sKKyAgX19hID0gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjRzZilfX2EsIChfX3Y0c2YpX19hLCAzLCAyLCAxLCAwKTsKKyAgX21tX3N0b3JlX3BzKF9fcCwgX19hKTsKK30KKworI2RlZmluZSBfTU1fSElOVF9UMCAzCisjZGVmaW5lIF9NTV9ISU5UX1QxIDIKKyNkZWZpbmUgX01NX0hJTlRfVDIgMQorI2RlZmluZSBfTU1fSElOVF9OVEEgMAorCisjaWZuZGVmIF9NU0NfVkVSCisvKiBGSVhNRTogV2UgaGF2ZSB0byAjZGVmaW5lIHRoaXMgYmVjYXVzZSAic2VsIiBtdXN0IGJlIGEgY29uc3RhbnQgaW50ZWdlciwgYW5kCisgICBTZW1hIGRvZXNuJ3QgZG8gYW55IGZvcm0gb2YgY29uc3RhbnQgcHJvcGFnYXRpb24geWV0LiAqLworCisvLy8gXGJyaWVmIExvYWRzIG9uZSBjYWNoZSBsaW5lIG9mIGRhdGEgZnJvbSB0aGUgc3BlY2lmaWVkIGFkZHJlc3MgdG8gYSBsb2NhdGlvbgorLy8vICAgIGNsb3NlciB0byB0aGUgcHJvY2Vzc29yLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gXGNvZGUKKy8vLyB2b2lkIF9tbV9wcmVmZXRjaChjb25zdCB2b2lkICogYSwgY29uc3QgaW50IHNlbCk7CisvLy8gXGVuZGNvZGUKKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBQUkVGRVRDSE5UQSBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBhCisvLy8gICAgQSBwb2ludGVyIHRvIGEgbWVtb3J5IGxvY2F0aW9uIGNvbnRhaW5pbmcgYSBjYWNoZSBsaW5lIG9mIGRhdGEuCisvLy8gXHBhcmFtIHNlbAorLy8vICAgIEEgcHJlZGVmaW5lZCBpbnRlZ2VyIGNvbnN0YW50IHNwZWNpZnlpbmcgdGhlIHR5cGUgb2YgcHJlZmV0Y2ggb3BlcmF0aW9uOgorLy8vICAgIF9NTV9ISU5UX05UQTogTW92ZSBkYXRhIHVzaW5nIHRoZSBub24tdGVtcG9yYWwgYWNjZXNzIChOVEEpIGhpbnQuCisvLy8gICAgVGhlIFBSRUZFVENITlRBIGluc3RydWN0aW9uIHdpbGwgYmUgZ2VuZXJhdGVkLgorLy8vICAgIF9NTV9ISU5UX1QwOiBNb3ZlIGRhdGEgdXNpbmcgdGhlIFQwIGhpbnQuIFRoZSBQUkVGRVRDSFQwIGluc3RydWN0aW9uIHdpbGwKKy8vLyAgICBiZSBnZW5lcmF0ZWQuCisvLy8gICAgX01NX0hJTlRfVDE6IE1vdmUgZGF0YSB1c2luZyB0aGUgVDEgaGludC4gVGhlIFBSRUZFVENIVDEgaW5zdHJ1Y3Rpb24gd2lsbAorLy8vICAgIGJlIGdlbmVyYXRlZC4KKy8vLyAgICBfTU1fSElOVF9UMjogTW92ZSBkYXRhIHVzaW5nIHRoZSBUMiBoaW50LiBUaGUgUFJFRkVUQ0hUMiBpbnN0cnVjdGlvbiB3aWxsCisvLy8gICAgYmUgZ2VuZXJhdGVkLgorI2RlZmluZSBfbW1fcHJlZmV0Y2goYSwgc2VsKSAoX19idWlsdGluX3ByZWZldGNoKCh2b2lkICopKGEpLCAwLCAoc2VsKSkpCisjZW5kaWYKKworLy8vIFxicmllZiBTdG9yZXMgYSA2NC1iaXQgaW50ZWdlciBpbiB0aGUgc3BlY2lmaWVkIGFsaWduZWQgbWVtb3J5IGxvY2F0aW9uLiBUbworLy8vICAgIG1pbmltaXplIGNhY2hpbmcsIHRoZSBkYXRhIGlzIGZsYWdnZWQgYXMgbm9uLXRlbXBvcmFsICh1bmxpa2VseSB0byBiZQorLy8vICAgIHVzZWQgYWdhaW4gc29vbikuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgTU9WTlRRIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fcAorLy8vICAgIEEgcG9pbnRlciB0byBhbiBhbGlnbmVkIG1lbW9yeSBsb2NhdGlvbiB1c2VkIHRvIHN0b3JlIHRoZSByZWdpc3RlciB2YWx1ZS4KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSA2NC1iaXQgaW50ZWdlciBjb250YWluaW5nIHRoZSB2YWx1ZSB0byBiZSBzdG9yZWQuCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3N0cmVhbV9waShfX202NCAqX19wLCBfX202NCBfX2EpCit7CisgIF9fYnVpbHRpbl9pYTMyX21vdm50cShfX3AsIF9fYSk7Cit9CisKKy8vLyBcYnJpZWYgTW92ZXMgcGFja2VkIGZsb2F0IHZhbHVlcyBmcm9tIGEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0gdG8gYQorLy8vICAgIDEyOC1iaXQgYWxpZ25lZCBtZW1vcnkgbG9jYXRpb24uIFRvIG1pbmltaXplIGNhY2hpbmcsIHRoZSBkYXRhIGlzIGZsYWdnZWQKKy8vLyAgICBhcyBub24tdGVtcG9yYWwgKHVubGlrZWx5IHRvIGJlIHVzZWQgYWdhaW4gc29vbikuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVk1PVk5UUFMgLyBNT1ZOVFBTIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fcAorLy8vICAgIEEgcG9pbnRlciB0byBhIDEyOC1iaXQgYWxpZ25lZCBtZW1vcnkgbG9jYXRpb24gdGhhdCB3aWxsIHJlY2VpdmUgdGhlCisvLy8gICAgaW50ZWdlciB2YWx1ZXMuCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0gY29udGFpbmluZyB0aGUgdmFsdWVzIHRvIGJlIG1vdmVkLgorc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zdHJlYW1fcHMoZmxvYXQgKl9fcCwgX19tMTI4IF9fYSkKK3sKKyAgX19idWlsdGluX25vbnRlbXBvcmFsX3N0b3JlKChfX3Y0c2YpX19hLCAoX192NHNmKilfX3ApOworfQorCisvLy8gXGJyaWVmIEZvcmNlcyBzdHJvbmcgbWVtb3J5IG9yZGVyaW5nIChzZXJpYWxpemF0aW9uKSBiZXR3ZWVuIHN0b3JlCisvLy8gICAgaW5zdHJ1Y3Rpb25zIHByZWNlZGluZyB0aGlzIGluc3RydWN0aW9uIGFuZCBzdG9yZSBpbnN0cnVjdGlvbnMgZm9sbG93aW5nCisvLy8gICAgdGhpcyBpbnN0cnVjdGlvbiwgZW5zdXJpbmcgdGhlIHN5c3RlbSBjb21wbGV0ZXMgYWxsIHByZXZpb3VzIHN0b3JlcworLy8vICAgIGJlZm9yZSBleGVjdXRpbmcgc3Vic2VxdWVudCBzdG9yZXMuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgU0ZFTkNFIGluc3RydWN0aW9uLgorLy8vCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3NmZW5jZSh2b2lkKQoreworICBfX2J1aWx0aW5faWEzMl9zZmVuY2UoKTsKK30KKworLy8vIFxicmllZiBFeHRyYWN0cyAxNi1iaXQgZWxlbWVudCBmcm9tIGEgNjQtYml0IHZlY3RvciBvZiBbNCB4IGkxNl0gYW5kCisvLy8gICAgcmV0dXJucyBpdCwgYXMgc3BlY2lmaWVkIGJ5IHRoZSBpbW1lZGlhdGUgaW50ZWdlciBvcGVyYW5kLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZQRVhUUlcgLyBQRVhUUlcgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSA2NC1iaXQgdmVjdG9yIG9mIFs0IHggaTE2XS4KKy8vLyBccGFyYW0gX19uCisvLy8gICAgQW4gaW1tZWRpYXRlIGludGVnZXIgb3BlcmFuZCB0aGF0IGRldGVybWluZXMgd2hpY2ggYml0cyBhcmUgZXh0cmFjdGVkOgorLy8vICAgIDA6IEJpdHMgWzE1OjBdIGFyZSBjb3BpZWQgdG8gdGhlIGRlc3RpbmF0aW9uLgorLy8vICAgIDE6IEJpdHMgWzMxOjE2XSBhcmUgY29waWVkIHRvIHRoZSBkZXN0aW5hdGlvbi4KKy8vLyAgICAyOiBCaXRzIFs0NzozMl0gYXJlIGNvcGllZCB0byB0aGUgZGVzdGluYXRpb24uCisvLy8gICAgMzogQml0cyBbNjM6NDhdIGFyZSBjb3BpZWQgdG8gdGhlIGRlc3RpbmF0aW9uLgorLy8vIFxyZXR1cm5zIEEgMTYtYml0IGludGVnZXIgY29udGFpbmluZyB0aGUgZXh0cmFjdGVkIDE2IGJpdHMgb2YgcGFja2VkIGRhdGEuCisjZGVmaW5lIF9tbV9leHRyYWN0X3BpMTYoYSwgbikgX19leHRlbnNpb25fXyAoeyBcCisgIChpbnQpX19idWlsdGluX2lhMzJfdmVjX2V4dF92NGhpKChfX202NClhLCAoaW50KW4pOyB9KQorCisvLy8gXGJyaWVmIENvcGllcyBkYXRhIGZyb20gdGhlIDY0LWJpdCB2ZWN0b3Igb2YgWzQgeCBpMTZdIHRvIHRoZSBkZXN0aW5hdGlvbiwKKy8vLyAgICBhbmQgaW5zZXJ0cyB0aGUgbG93ZXIgMTYtYml0cyBvZiBhbiBpbnRlZ2VyIG9wZXJhbmQgYXQgdGhlIDE2LWJpdCBvZmZzZXQKKy8vLyAgICBzcGVjaWZpZWQgYnkgdGhlIGltbWVkaWF0ZSBvcGVyYW5kIF9fbi4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWUElOU1JXIC8gUElOU1JXIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgNjQtYml0IHZlY3RvciBvZiBbNCB4IGkxNl0uCisvLy8gXHBhcmFtIF9fZAorLy8vICAgIEFuIGludGVnZXIuIFRoZSBsb3dlciAxNi1iaXQgdmFsdWUgZnJvbSB0aGlzIG9wZXJhbmQgaXMgd3JpdHRlbiB0byB0aGUKKy8vLyAgICBkZXN0aW5hdGlvbiBhdCB0aGUgb2Zmc2V0IHNwZWNpZmllZCBieSBvcGVyYW5kIF9fbi4KKy8vLyBccGFyYW0gX19uCisvLy8gICAgQW4gaW1tZWRpYXRlIGludGVnZXIgb3BlcmFudCB0aGF0IGRldGVybWluZXMgd2hpY2ggdGhlIGJpdHMgdG8gYmUgdXNlZAorLy8vICAgIGluIHRoZSBkZXN0aW5hdGlvbi4KKy8vLyAgICAwOiBCaXRzIFsxNTowXSBhcmUgY29waWVkIHRvIHRoZSBkZXN0aW5hdGlvbi4KKy8vLyAgICAxOiBCaXRzIFszMToxNl0gYXJlIGNvcGllZCB0byB0aGUgZGVzdGluYXRpb24uCisvLy8gICAgMjogQml0cyBbNDc6MzJdIGFyZSBjb3BpZWQgdG8gdGhlIGRlc3RpbmF0aW9uLgorLy8vICAgIDM6IEJpdHMgWzYzOjQ4XSBhcmUgY29waWVkIHRvIHRoZSBkZXN0aW5hdGlvbi4KKy8vLyAgICBUaGUgcmVtYWluaW5nIGJpdHMgaW4gdGhlIGRlc3RpbmF0aW9uIGFyZSBjb3BpZWQgZnJvbSB0aGUgY29ycmVzcG9uZGluZworLy8vICAgIGJpdHMgaW4gb3BlcmFuZCBfX2EuCisvLy8gXHJldHVybnMgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgY29waWVkIHBhY2tlZCBkYXRhIGZyb20gdGhlCisvLy8gICAgb3BlcmFuZHMuCisjZGVmaW5lIF9tbV9pbnNlcnRfcGkxNihhLCBkLCBuKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3ZlY19zZXRfdjRoaSgoX19tNjQpYSwgKGludClkLCAoaW50KW4pOyB9KQorCisvLy8gXGJyaWVmIENvbXBhcmVzIGVhY2ggb2YgdGhlIGNvcnJlc3BvbmRpbmcgcGFja2VkIDE2LWJpdCBpbnRlZ2VyIHZhbHVlcyBvZgorLy8vICAgIHRoZSA2NC1iaXQgaW50ZWdlciB2ZWN0b3JzLCBhbmQgd3JpdGVzIHRoZSBncmVhdGVyIHZhbHVlIHRvIHRoZQorLy8vICAgIGNvcnJlc3BvbmRpbmcgYml0cyBpbiB0aGUgZGVzdGluYXRpb24uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgUE1BWFNXIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fYQorLy8vICAgIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBzb3VyY2Ugb3BlcmFuZHMuCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBzb3VyY2Ugb3BlcmFuZHMuCisvLy8gXHJldHVybnMgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyB0aGUgY29tcGFyaXNvbiByZXN1bHRzLgorc3RhdGljIF9faW5saW5lX18gX19tNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWF4X3BpMTYoX19tNjQgX19hLCBfX202NCBfX2IpCit7CisgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcG1heHN3KChfX3Y0aGkpX19hLCAoX192NGhpKV9fYik7Cit9CisKKy8vLyBcYnJpZWYgQ29tcGFyZXMgZWFjaCBvZiB0aGUgY29ycmVzcG9uZGluZyBwYWNrZWQgOC1iaXQgdW5zaWduZWQgaW50ZWdlcgorLy8vICAgIHZhbHVlcyBvZiB0aGUgNjQtYml0IGludGVnZXIgdmVjdG9ycywgYW5kIHdyaXRlcyB0aGUgZ3JlYXRlciB2YWx1ZSB0byB0aGUKKy8vLyAgICBjb3JyZXNwb25kaW5nIGJpdHMgaW4gdGhlIGRlc3RpbmF0aW9uLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFBNQVhVQiBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIG9uZSBvZiB0aGUgc291cmNlIG9wZXJhbmRzLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIG9uZSBvZiB0aGUgc291cmNlIG9wZXJhbmRzLgorLy8vIFxyZXR1cm5zIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIGNvbXBhcmlzb24gcmVzdWx0cy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21heF9wdTgoX19tNjQgX19hLCBfX202NCBfX2IpCit7CisgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcG1heHViKChfX3Y4cWkpX19hLCAoX192OHFpKV9fYik7Cit9CisKKy8vLyBcYnJpZWYgQ29tcGFyZXMgZWFjaCBvZiB0aGUgY29ycmVzcG9uZGluZyBwYWNrZWQgMTYtYml0IGludGVnZXIgdmFsdWVzIG9mCisvLy8gICAgdGhlIDY0LWJpdCBpbnRlZ2VyIHZlY3RvcnMsIGFuZCB3cml0ZXMgdGhlIGxlc3NlciB2YWx1ZSB0byB0aGUKKy8vLyAgICBjb3JyZXNwb25kaW5nIGJpdHMgaW4gdGhlIGRlc3RpbmF0aW9uLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFBNSU5TVyBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIG9uZSBvZiB0aGUgc291cmNlIG9wZXJhbmRzLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIG9uZSBvZiB0aGUgc291cmNlIG9wZXJhbmRzLgorLy8vIFxyZXR1cm5zIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIGNvbXBhcmlzb24gcmVzdWx0cy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21pbl9waTE2KF9fbTY0IF9fYSwgX19tNjQgX19iKQoreworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BtaW5zdygoX192NGhpKV9fYSwgKF9fdjRoaSlfX2IpOworfQorCisvLy8gXGJyaWVmIENvbXBhcmVzIGVhY2ggb2YgdGhlIGNvcnJlc3BvbmRpbmcgcGFja2VkIDgtYml0IHVuc2lnbmVkIGludGVnZXIKKy8vLyAgICB2YWx1ZXMgb2YgdGhlIDY0LWJpdCBpbnRlZ2VyIHZlY3RvcnMsIGFuZCB3cml0ZXMgdGhlIGxlc3NlciB2YWx1ZSB0byB0aGUKKy8vLyAgICBjb3JyZXNwb25kaW5nIGJpdHMgaW4gdGhlIGRlc3RpbmF0aW9uLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFBNSU5VQiBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIG9uZSBvZiB0aGUgc291cmNlIG9wZXJhbmRzLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIG9uZSBvZiB0aGUgc291cmNlIG9wZXJhbmRzLgorLy8vIFxyZXR1cm5zIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIGNvbXBhcmlzb24gcmVzdWx0cy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTY0IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21pbl9wdTgoX19tNjQgX19hLCBfX202NCBfX2IpCit7CisgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcG1pbnViKChfX3Y4cWkpX19hLCAoX192OHFpKV9fYik7Cit9CisKKy8vLyBcYnJpZWYgVGFrZXMgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGZyb20gZWFjaCA4LWJpdCBlbGVtZW50IGluIGEgNjQtYml0CisvLy8gICAgaW50ZWdlciB2ZWN0b3IgdG8gY3JlYXRlIGEgMTYtYml0IG1hc2sgdmFsdWUuIFplcm8tZXh0ZW5kcyB0aGUgdmFsdWUgdG8KKy8vLyAgICAzMi1iaXQgaW50ZWdlciBhbmQgd3JpdGVzIGl0IHRvIHRoZSBkZXN0aW5hdGlvbi4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBQTU9WTVNLQiBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIHRoZSB2YWx1ZXMgd2l0aCBiaXRzIHRvIGJlIGV4dHJhY3RlZC4KKy8vLyBccmV0dXJucyBUaGUgbW9zdCBzaWduaWZpY2FudCBiaXQgZnJvbSBlYWNoIDgtYml0IGVsZW1lbnQgaW4gdGhlIG9wZXJhbmQsCisvLy8gICAgd3JpdHRlbiB0byBiaXRzIFsxNTowXS4KK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tb3ZlbWFza19waTgoX19tNjQgX19hKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcG1vdm1za2IoKF9fdjhxaSlfX2EpOworfQorCisvLy8gXGJyaWVmIE11bHRpcGxpZXMgcGFja2VkIDE2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlcyBhbmQgd3JpdGVzIHRoZQorLy8vICAgIGhpZ2gtb3JkZXIgMTYgYml0cyBvZiBlYWNoIDMyLWJpdCBwcm9kdWN0IHRvIHRoZSBjb3JyZXNwb25kaW5nIGJpdHMgaW4KKy8vLyAgICB0aGUgZGVzdGluYXRpb24uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgUE1VTEhVVyBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIG9uZSBvZiB0aGUgc291cmNlIG9wZXJhbmRzLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIG9uZSBvZiB0aGUgc291cmNlIG9wZXJhbmRzLgorLy8vIFxyZXR1cm5zIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIHByb2R1Y3RzIG9mIGJvdGggb3BlcmFuZHMuCitzdGF0aWMgX19pbmxpbmVfXyBfX202NCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tdWxoaV9wdTE2KF9fbTY0IF9fYSwgX19tNjQgX19iKQoreworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BtdWxodXcoKF9fdjRoaSlfX2EsIChfX3Y0aGkpX19iKTsKK30KKworLy8vIFxicmllZiBTaHVmZmxlcyB0aGUgNCAxNi1iaXQgaW50ZWdlcnMgZnJvbSBhIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciB0byB0aGUKKy8vLyAgICBkZXN0aW5hdGlvbiwgYXMgc3BlY2lmaWVkIGJ5IHRoZSBpbW1lZGlhdGUgdmFsdWUgb3BlcmFuZC4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBQU0hVRlcgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBcY29kZQorLy8vIF9fbTY0IF9tbV9zaHVmZmxlX3BpMTYoX19tNjQgYSwgY29uc3QgaW50IG4pOworLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBccGFyYW0gYQorLy8vICAgIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIHZhbHVlcyB0byBiZSBzaHVmZmxlZC4KKy8vLyBccGFyYW0gbgorLy8vICAgIEFuIGltbWVkaWF0ZSB2YWx1ZSBjb250YWluaW5nIGFuIDgtYml0IHZhbHVlIHNwZWNpZnlpbmcgd2hpY2ggZWxlbWVudHMgdG8KKy8vLyAgICBjb3B5IGZyb20gYS4gVGhlIGRlc3RpbmF0aW9ucyB3aXRoaW4gdGhlIDY0LWJpdCBkZXN0aW5hdGlvbiBhcmUgYXNzaWduZWQKKy8vLyAgICB2YWx1ZXMgYXMgZm9sbG93czoKKy8vLyAgICBCaXRzIFsxOjBdIGFyZSB1c2VkIHRvIGFzc2lnbiB2YWx1ZXMgdG8gYml0cyBbMTU6MF0gaW4gdGhlIGRlc3RpbmF0aW9uLgorLy8vICAgIEJpdHMgWzM6Ml0gYXJlIHVzZWQgdG8gYXNzaWduIHZhbHVlcyB0byBiaXRzIFszMToxNl0gaW4gdGhlIGRlc3RpbmF0aW9uLgorLy8vICAgIEJpdHMgWzU6NF0gYXJlIHVzZWQgdG8gYXNzaWduIHZhbHVlcyB0byBiaXRzIFs0NzozMl0gaW4gdGhlIGRlc3RpbmF0aW9uLgorLy8vICAgIEJpdHMgWzc6Nl0gYXJlIHVzZWQgdG8gYXNzaWduIHZhbHVlcyB0byBiaXRzIFs2Mzo0OF0gaW4gdGhlIGRlc3RpbmF0aW9uLgorLy8vICAgIEJpdCB2YWx1ZSBhc3NpZ25tZW50czoKKy8vLyAgICAwMDogYXNzaWduZWQgZnJvbSBiaXRzIFsxNTowXSBvZiBhLgorLy8vICAgIDAxOiBhc3NpZ25lZCBmcm9tIGJpdHMgWzMxOjE2XSBvZiBhLgorLy8vICAgIDEwOiBhc3NpZ25lZCBmcm9tIGJpdHMgWzQ3OjMyXSBvZiBhLgorLy8vICAgIDExOiBhc3NpZ25lZCBmcm9tIGJpdHMgWzYzOjQ4XSBvZiBhLgorLy8vIFxyZXR1cm5zIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIHNodWZmbGVkIHZhbHVlcy4KKyNkZWZpbmUgX21tX3NodWZmbGVfcGkxNihhLCBuKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BzaHVmdygoX192NGhpKShfX202NCkoYSksIChuKSk7IH0pCisKKy8vLyBcYnJpZWYgQ29uZGl0aW9uYWxseSBjb3BpZXMgdGhlIHZhbHVlcyBmcm9tIGVhY2ggOC1iaXQgZWxlbWVudCBpbiB0aGUgZmlyc3QKKy8vLyAgICA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb3BlcmFuZCB0byB0aGUgc3BlY2lmaWVkIG1lbW9yeSBsb2NhdGlvbiwgYXMKKy8vLyAgICBzcGVjaWZpZWQgYnkgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGluIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgaW4gdGhlCisvLy8gICAgc2Vjb25kIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvcGVyYW5kLiBUbyBtaW5pbWl6ZSBjYWNoaW5nLCB0aGUgZGF0YSBpcworLy8vICAgIGZsYWdnZWQgYXMgbm9uLXRlbXBvcmFsICh1bmxpa2VseSB0byBiZSB1c2VkIGFnYWluIHNvb24pLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIE1BU0tNT1ZRIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIF9fZAorLy8vICAgIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIHZhbHVlcyB3aXRoIGVsZW1lbnRzIHRvIGJlIGNvcGllZC4KKy8vLyBccGFyYW0gX19uCisvLy8gICAgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3Igb3BlcmFuZC4gVGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGZyb20gZWFjaCA4LWJpdAorLy8vICAgIGVsZW1lbnQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgaW4gb3BlcmFuZCBfX2QgaXMKKy8vLyAgICBjb3BpZWQuIElmIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBvZiBhIGdpdmVuIGVsZW1lbnQgaXMgMSwgdGhlCisvLy8gICAgY29ycmVzcG9uZGluZyBlbGVtZW50IGluIG9wZXJhbmQgX19kIGlzIGNvcGllZC4KKy8vLyBccGFyYW0gX19wCisvLy8gICAgQSBwb2ludGVyIHRvIGEgNjQtYml0IG1lbW9yeSBsb2NhdGlvbiB0aGF0IHdpbGwgcmVjZWl2ZSB0aGUgY29uZGl0aW9uYWxseQorLy8vICAgIGNvcGllZCBpbnRlZ2VyIHZhbHVlcy4gVGhlIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeSBsb2NhdGlvbiBkb2VzIG5vdCBoYXZlCisvLy8gICAgdG8gYmUgYWxpZ25lZC4KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFza21vdmVfc2k2NChfX202NCBfX2QsIF9fbTY0IF9fbiwgY2hhciAqX19wKQoreworICBfX2J1aWx0aW5faWEzMl9tYXNrbW92cSgoX192OHFpKV9fZCwgKF9fdjhxaSlfX24sIF9fcCk7Cit9CisKKy8vLyBcYnJpZWYgQ29tcHV0ZXMgdGhlIHJvdW5kZWQgYXZlcmFnZXMgb2YgdGhlIHBhY2tlZCB1bnNpZ25lZCA4LWJpdCBpbnRlZ2VyCisvLy8gICAgdmFsdWVzIGFuZCB3cml0ZXMgdGhlIGF2ZXJhZ2VzIHRvIHRoZSBjb3JyZXNwb25kaW5nIGJpdHMgaW4gdGhlCisvLy8gICAgZGVzdGluYXRpb24uCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgUEFWR0IgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyBvbmUgb2YgdGhlIHNvdXJjZSBvcGVyYW5kcy4KKy8vLyBccGFyYW0gX19iCisvLy8gICAgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyBvbmUgb2YgdGhlIHNvdXJjZSBvcGVyYW5kcy4KKy8vLyBccmV0dXJucyBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIHRoZSBhdmVyYWdlcyBvZiBib3RoIG9wZXJhbmRzLgorc3RhdGljIF9faW5saW5lX18gX19tNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fYXZnX3B1OChfX202NCBfX2EsIF9fbTY0IF9fYikKK3sKKyAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9wYXZnYigoX192OHFpKV9fYSwgKF9fdjhxaSlfX2IpOworfQorCisvLy8gXGJyaWVmIENvbXB1dGVzIHRoZSByb3VuZGVkIGF2ZXJhZ2VzIG9mIHRoZSBwYWNrZWQgdW5zaWduZWQgMTYtYml0IGludGVnZXIKKy8vLyAgICB2YWx1ZXMgYW5kIHdyaXRlcyB0aGUgYXZlcmFnZXMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgYml0cyBpbiB0aGUKKy8vLyAgICBkZXN0aW5hdGlvbi4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBQQVZHVyBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIG9uZSBvZiB0aGUgc291cmNlIG9wZXJhbmRzLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBjb250YWluaW5nIG9uZSBvZiB0aGUgc291cmNlIG9wZXJhbmRzLgorLy8vIFxyZXR1cm5zIEEgNjQtYml0IGludGVnZXIgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIGF2ZXJhZ2VzIG9mIGJvdGggb3BlcmFuZHMuCitzdGF0aWMgX19pbmxpbmVfXyBfX202NCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9hdmdfcHUxNihfX202NCBfX2EsIF9fbTY0IF9fYikKK3sKKyAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9wYXZndygoX192NGhpKV9fYSwgKF9fdjRoaSlfX2IpOworfQorCisvLy8gXGJyaWVmIFN1YnRyYWN0cyB0aGUgY29ycmVzcG9uZGluZyA4LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlcyBvZiB0aGUgdHdvCisvLy8gICAgNjQtYml0IHZlY3RvciBvcGVyYW5kcyBhbmQgY29tcHV0ZXMgdGhlIGFic29sdXRlIHZhbHVlIGZvciBlYWNoIG9mIHRoZQorLy8vICAgIGRpZmZlcmVuY2UuIFRoZW4gc3VtIG9mIHRoZSA4IGFic29sdXRlIGRpZmZlcmVuY2VzIGlzIHdyaXR0ZW4gdG8gdGhlCisvLy8gICAgYml0cyBbMTU6MF0gb2YgdGhlIGRlc3RpbmF0aW9uOyB0aGUgcmVtYWluaW5nIGJpdHMgWzYzOjE2XSBhcmUgY2xlYXJlZC4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBQU0FEQlcgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyBvbmUgb2YgdGhlIHNvdXJjZSBvcGVyYW5kcy4KKy8vLyBccGFyYW0gX19iCisvLy8gICAgQSA2NC1iaXQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyBvbmUgb2YgdGhlIHNvdXJjZSBvcGVyYW5kcy4KKy8vLyBccmV0dXJucyBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciB3aG9zZSBsb3dlciAxNiBiaXRzIGNvbnRhaW4gdGhlIHN1bXMgb2YgdGhlCisvLy8gICAgc2V0cyBvZiBhYnNvbHV0ZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGJvdGggb3BlcmFuZHMuIFRoZSB1cHBlciBiaXRzIGFyZQorLy8vICAgIGNsZWFyZWQuCitzdGF0aWMgX19pbmxpbmVfXyBfX202NCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zYWRfcHU4KF9fbTY0IF9fYSwgX19tNjQgX19iKQoreworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BzYWRidygoX192OHFpKV9fYSwgKF9fdjhxaSlfX2IpOworfQorCisvLy8gXGJyaWVmIFJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoZSBNWENTUiByZWdpc3RlciBhcyBhIDMyLWJpdCB1bnNpZ25lZAorLy8vICAgIGludGVnZXIgdmFsdWUuIFRoZXJlIGFyZSBzZXZlcmFsIGdyb3VwcyBvZiBtYWNyb3MgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKy8vLyAgICBpbnRyaW5zaWMsIGluY2x1ZGluZzoKKy8vLyAgICAqIEZvciBjaGVja2luZyBleGNlcHRpb24gc3RhdGVzOiBfTU1fRVhDRVBUX0lOVkFMSUQsIF9NTV9FWENFUFRfRElWX1pFUk8sCisvLy8gICAgICBfTU1fRVhDRVBUX0RFTk9STSwgX01NX0VYQ0VQVF9PVkVSRkxPVywgX01NX0VYQ0VQVF9VTkRFUkZMT1csCisvLy8gICAgICBfTU1fRVhDRVBUX0lORVhBQ1QuIFRoZXJlIGlzIGEgY29udmVuaWVuY2Ugd3JhcHBlcgorLy8vICAgICAgX01NX0dFVF9FWENFUFRJT05fU1RBVEUoKS4KKy8vLyAgICAqIEZvciBjaGVja2luZyBleGNlcHRpb24gbWFza3M6IF9NTV9NQVNLX1VOREVSRkxPVywgX01NX01BU0tfT1ZFUkZMT1csCisvLy8gICAgICBfTU1fTUFTS19JTlZBTElELCBfTU1fTUFTS19ERU5PUk0sIF9NTV9NQVNLX0RJVl9aRVJPLCBfTU1fTUFTS19JTkVYQUNULgorLy8vICAgICAgVGhlcmUgaXMgYSBjb252ZW5pZW5jZSB3cmFwcGVyIF9NTV9HRVRfRVhDRVBUSU9OX01BU0soKS4KKy8vLyAgICAqIEZvciBjaGVja2luZyByb3VuZGluZyBtb2RlczogX01NX1JPVU5EX05FQVJFU1QsIF9NTV9ST1VORF9ET1dOLAorLy8vICAgICAgX01NX1JPVU5EX1VQLCBfTU1fUk9VTkRfVE9XQVJEX1pFUk8uIFRoZXJlIGlzIGEgY29udmVuaWVuY2Ugd3JhcHBlcgorLy8vICAgICAgX01NX0dFVF9ST1VORElOR19NT0RFKHgpIHdoZXJlIHggaXMgb25lIG9mIHRoZXNlIG1hY3Jvcy4KKy8vLyAgICAqIEZvciBjaGVja2luZyBmbHVzaC10by16ZXJvIG1vZGU6IF9NTV9GTFVTSF9aRVJPX09OLCBfTU1fRkxVU0hfWkVST19PRkYuCisvLy8gICAgICBUaGVyZSBpcyBhIGNvbnZlbmllbmNlIHdyYXBwZXIgX01NX0dFVF9GTFVTSF9aRVJPX01PREUoKS4KKy8vLyAgICAqIEZvciBjaGVja2luZyBkZW5vcm1hbHMtYXJlLXplcm8gbW9kZTogX01NX0RFTk9STUFMU19aRVJPX09OLAorLy8vICAgICAgX01NX0RFTk9STUFMU19aRVJPX09GRi4gVGhlcmUgaXMgYSBjb252ZW5pZW5jZSB3cmFwcGVyCisvLy8gICAgICBfTU1fR0VUX0RFTk9STUFMU19aRVJPX01PREUoKS4KKy8vLworLy8vICAgIEZvciBleGFtcGxlLCB0aGUgZXhwcmVzc2lvbiBiZWxvdyBjaGVja3MgaWYgYW4gb3ZlcmZsb3cgZXhjZXB0aW9uIGhhcworLy8vICAgIG9jY3VycmVkOgorLy8vICAgICAgKCBfbW1fZ2V0Y3NyKCkgJiBfTU1fRVhDRVBUX09WRVJGTE9XICkKKy8vLworLy8vICAgIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBnZXRzIHRoZSBjdXJyZW50IHJvdW5kaW5nIG1vZGU6CisvLy8gICAgICBfTU1fR0VUX1JPVU5ESU5HX01PREUoKQorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZTVE1YQ1NSIC8gU1RNWENTUiBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxyZXR1cm5zIEEgMzItYml0IHVuc2lnbmVkIGludGVnZXIgY29udGFpbmluZyB0aGUgY29udGVudHMgb2YgdGhlIE1YQ1NSCisvLy8gICAgcmVnaXN0ZXIuCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fZ2V0Y3NyKHZvaWQpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9zdG14Y3NyKCk7Cit9CisKKy8vLyBcYnJpZWYgU2V0cyB0aGUgTVhDU1IgcmVnaXN0ZXIgd2l0aCB0aGUgMzItYml0IHVuc2lnbmVkIGludGVnZXIgdmFsdWUuIFRoZXJlCisvLy8gICAgYXJlIHNldmVyYWwgZ3JvdXBzIG9mIG1hY3JvcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbnRyaW5zaWMsIGluY2x1ZGluZzoKKy8vLyAgICAqIEZvciBzZXR0aW5nIGV4Y2VwdGlvbiBzdGF0ZXM6IF9NTV9FWENFUFRfSU5WQUxJRCwgX01NX0VYQ0VQVF9ESVZfWkVSTywKKy8vLyAgICAgIF9NTV9FWENFUFRfREVOT1JNLCBfTU1fRVhDRVBUX09WRVJGTE9XLCBfTU1fRVhDRVBUX1VOREVSRkxPVywKKy8vLyAgICAgIF9NTV9FWENFUFRfSU5FWEFDVC4gVGhlcmUgaXMgYSBjb252ZW5pZW5jZSB3cmFwcGVyCisvLy8gICAgICBfTU1fU0VUX0VYQ0VQVElPTl9TVEFURSh4KSB3aGVyZSB4IGlzIG9uZSBvZiB0aGVzZSBtYWNyb3MuCisvLy8gICAgKiBGb3Igc2V0dGluZyBleGNlcHRpb24gbWFza3M6IF9NTV9NQVNLX1VOREVSRkxPVywgX01NX01BU0tfT1ZFUkZMT1csCisvLy8gICAgICBfTU1fTUFTS19JTlZBTElELCBfTU1fTUFTS19ERU5PUk0sIF9NTV9NQVNLX0RJVl9aRVJPLCBfTU1fTUFTS19JTkVYQUNULgorLy8vICAgICAgVGhlcmUgaXMgYSBjb252ZW5pZW5jZSB3cmFwcGVyIF9NTV9TRVRfRVhDRVBUSU9OX01BU0soeCkgd2hlcmUgeCBpcyBvbmUKKy8vLyAgICAgIG9mIHRoZXNlIG1hY3Jvcy4KKy8vLyAgICAqIEZvciBzZXR0aW5nIHJvdW5kaW5nIG1vZGVzOiBfTU1fUk9VTkRfTkVBUkVTVCwgX01NX1JPVU5EX0RPV04sCisvLy8gICAgICBfTU1fUk9VTkRfVVAsIF9NTV9ST1VORF9UT1dBUkRfWkVSTy4gVGhlcmUgaXMgYSBjb252ZW5pZW5jZSB3cmFwcGVyCisvLy8gICAgICBfTU1fU0VUX1JPVU5ESU5HX01PREUoeCkgd2hlcmUgeCBpcyBvbmUgb2YgdGhlc2UgbWFjcm9zLgorLy8vICAgICogRm9yIHNldHRpbmcgZmx1c2gtdG8temVybyBtb2RlOiBfTU1fRkxVU0hfWkVST19PTiwgX01NX0ZMVVNIX1pFUk9fT0ZGLgorLy8vICAgICAgVGhlcmUgaXMgYSBjb252ZW5pZW5jZSB3cmFwcGVyIF9NTV9TRVRfRkxVU0hfWkVST19NT0RFKHgpIHdoZXJlIHggaXMKKy8vLyAgICAgIG9uZSBvZiB0aGVzZSBtYWNyb3MuCisvLy8gICAgKiBGb3Igc2V0dGluZyBkZW5vcm1hbHMtYXJlLXplcm8gbW9kZTogX01NX0RFTk9STUFMU19aRVJPX09OLAorLy8vICAgICAgX01NX0RFTk9STUFMU19aRVJPX09GRi4gVGhlcmUgaXMgYSBjb252ZW5pZW5jZSB3cmFwcGVyCisvLy8gICAgICBfTU1fU0VUX0RFTk9STUFMU19aRVJPX01PREUoeCkgd2hlcmUgeCBpcyBvbmUgb2YgdGhlc2UgbWFjcm9zLgorLy8vCisvLy8gICAgRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgZXhwcmVzc2lvbiBjYXVzZXMgc3Vic2VxdWVudCBmbG9hdGluZy1wb2ludAorLy8vICAgIG9wZXJhdGlvbnMgdG8gcm91bmQgdXA6CisvLy8gICAgICBfbW1fc2V0Y3NyKF9tbV9nZXRjc3IoKSB8IF9NTV9ST1VORF9VUCkKKy8vLworLy8vICAgIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzZXRzIHRoZSBEQVogYW5kIEZUWiBmbGFnczoKKy8vLyAgICAgIHZvaWQgc2V0RmxhZ3MoKSB7CisvLy8gICAgICAgIF9NTV9TRVRfRkxVU0hfWkVST19NT0RFKF9NTV9GTFVTSF9aRVJPX09OKQorLy8vICAgICAgICBfTU1fU0VUX0RFTk9STUFMU19aRVJPX01PREUoX01NX0RFTk9STUFMU19aRVJPX09OKQorLy8vICAgICAgfQorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gVGhpcyBpbnRyaW5zaWMgY29ycmVzcG9uZHMgdG8gdGhlIFxjIFZMRE1YQ1NSIC8gTERNWENTUiBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2kKKy8vLyAgICBBIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIE1YQ1NSIHJlZ2lzdGVyLgorc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zZXRjc3IodW5zaWduZWQgaW50IF9faSkKK3sKKyAgX19idWlsdGluX2lhMzJfbGRteGNzcihfX2kpOworfQorCisvLy8gXGJyaWVmIFNlbGVjdHMgNCBmbG9hdCB2YWx1ZXMgZnJvbSB0aGUgMTI4LWJpdCBvcGVyYW5kcyBvZiBbNCB4IGZsb2F0XSwgYXMKKy8vLyAgICBzcGVjaWZpZWQgYnkgdGhlIGltbWVkaWF0ZSB2YWx1ZSBvcGVyYW5kLgorLy8vCisvLy8gXGhlYWRlcmZpbGUgPHg4NmludHJpbi5oPgorLy8vCisvLy8gXGNvZGUKKy8vLyBfX20xMjggX21tX3NodWZmbGVfcHMoX19tMTI4IGEsIF9fbTEyOCBiLCBjb25zdCBpbnQgbWFzayk7CisvLy8gXGVuZGNvZGUKKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWU0hVRlBTIC8gU0hVRlBTIGluc3RydWN0aW9uLgorLy8vCisvLy8gXHBhcmFtIGEKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdLgorLy8vIFxwYXJhbSBiCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XS4KKy8vLyBccGFyYW0gbWFzaworLy8vICAgIEFuIGltbWVkaWF0ZSB2YWx1ZSBjb250YWluaW5nIGFuIDgtYml0IHZhbHVlIHNwZWNpZnlpbmcgd2hpY2ggZWxlbWVudHMgdG8KKy8vLyAgICBjb3B5IGZyb20gYSBhbmQgYi4KKy8vLyAgICBCaXRzIFszOjBdIHNwZWNpZnkgdGhlIHZhbHVlcyBjb3BpZWQgZnJvbSBvcGVyYW5kIGEuCisvLy8gICAgQml0cyBbNzo0XSBzcGVjaWZ5IHRoZSB2YWx1ZXMgY29waWVkIGZyb20gb3BlcmFuZCBiLiBUaGUgZGVzdGluYXRpb25zCisvLy8gICAgd2l0aGluIHRoZSAxMjgtYml0IGRlc3RpbmF0aW9uIGFyZSBhc3NpZ25lZCB2YWx1ZXMgYXMgZm9sbG93czoKKy8vLyAgICBCaXRzIFsxOjBdIGFyZSB1c2VkIHRvIGFzc2lnbiB2YWx1ZXMgdG8gYml0cyBbMzE6MF0gaW4gdGhlIGRlc3RpbmF0aW9uLgorLy8vICAgIEJpdHMgWzM6Ml0gYXJlIHVzZWQgdG8gYXNzaWduIHZhbHVlcyB0byBiaXRzIFs2MzozMl0gaW4gdGhlIGRlc3RpbmF0aW9uLgorLy8vICAgIEJpdHMgWzU6NF0gYXJlIHVzZWQgdG8gYXNzaWduIHZhbHVlcyB0byBiaXRzIFs5NTo2NF0gaW4gdGhlIGRlc3RpbmF0aW9uLgorLy8vICAgIEJpdHMgWzc6Nl0gYXJlIHVzZWQgdG8gYXNzaWduIHZhbHVlcyB0byBiaXRzIFsxMjc6OTZdIGluIHRoZSBkZXN0aW5hdGlvbi4KKy8vLyAgICBCaXQgdmFsdWUgYXNzaWdubWVudHM6CisvLy8gICAgMDA6IEJpdHMgWzMxOjBdIGNvcGllZCBmcm9tIHRoZSBzcGVjaWZpZWQgb3BlcmFuZC4KKy8vLyAgICAwMTogQml0cyBbNjM6MzJdIGNvcGllZCBmcm9tIHRoZSBzcGVjaWZpZWQgb3BlcmFuZC4KKy8vLyAgICAxMDogQml0cyBbOTU6NjRdIGNvcGllZCBmcm9tIHRoZSBzcGVjaWZpZWQgb3BlcmFuZC4KKy8vLyAgICAxMTogQml0cyBbMTI3Ojk2XSBjb3BpZWQgZnJvbSB0aGUgc3BlY2lmaWVkIG9wZXJhbmQuCisvLy8gXHJldHVybnMgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSBzaHVmZmxlZCB2YWx1ZXMuCisjZGVmaW5lIF9tbV9zaHVmZmxlX3BzKGEsIGIsIG1hc2spIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4KV9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3Y0c2YpKF9fbTEyOCkoYSksIChfX3Y0c2YpKF9fbTEyOCkoYiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICsgKCgobWFzaykgPj4gMCkgJiAweDMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCArICgoKG1hc2spID4+IDIpICYgMHgzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgKyAoKChtYXNrKSA+PiA0KSAmIDB4MyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ICsgKCgobWFzaykgPj4gNikgJiAweDMpKTsgfSkKKworLy8vIFxicmllZiBVbnBhY2tzIHRoZSBoaWdoLW9yZGVyIChpbmRleCAyLDMpIHZhbHVlcyBmcm9tIHR3byAxMjgtYml0IHZlY3RvcnMgb2YKKy8vLyAgICBbNCB4IGZsb2F0XSBhbmQgaW50ZXJsZWF2ZXMgdGhlbSBpbnRvIGEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeAorLy8vICAgIGZsb2F0XS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWVU5QQ0tIUFMgLyBVTlBDS0hQUyBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdLgorLy8vICAgIEJpdHMgWzk1OjY0XSBhcmUgd3JpdHRlbiB0byBiaXRzIFszMTowXSBvZiB0aGUgZGVzdGluYXRpb24uCisvLy8gICAgQml0cyBbMTI3Ojk2XSBhcmUgd3JpdHRlbiB0byBiaXRzIFs5NTo2NF0gb2YgdGhlIGRlc3RpbmF0aW9uLgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdLgorLy8vICAgIEJpdHMgWzk1OjY0XSBhcmUgd3JpdHRlbiB0byBiaXRzIFs2MzozMl0gb2YgdGhlIGRlc3RpbmF0aW9uLgorLy8vICAgIEJpdHMgWzEyNzo5Nl0gYXJlIHdyaXR0ZW4gdG8gYml0cyBbMTI3Ojk2XSBvZiB0aGUgZGVzdGluYXRpb24uCisvLy8gXHJldHVybnMgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSBpbnRlcmxlYXZlZCB2YWx1ZXMuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fdW5wYWNraGlfcHMoX19tMTI4IF9fYSwgX19tMTI4IF9fYikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3Y0c2YpX19hLCAoX192NHNmKV9fYiwgMiwgNiwgMywgNyk7Cit9CisKKy8vLyBcYnJpZWYgVW5wYWNrcyB0aGUgbG93LW9yZGVyIChpbmRleCAwLDEpIHZhbHVlcyBmcm9tIHR3byAxMjgtYml0IHZlY3RvcnMgb2YKKy8vLyAgICBbNCB4IGZsb2F0XSBhbmQgaW50ZXJsZWF2ZXMgdGhlbSBpbnRvIGEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeAorLy8vICAgIGZsb2F0XS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWVU5QQ0tMUFMgLyBVTlBDS0xQUyBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdLgorLy8vICAgIEJpdHMgWzMxOjBdIGFyZSB3cml0dGVuIHRvIGJpdHMgWzMxOjBdIG9mIHRoZSBkZXN0aW5hdGlvbi4KKy8vLyAgICBCaXRzIFs2MzozMl0gYXJlIHdyaXR0ZW4gdG8gYml0cyBbOTU6NjRdIG9mIHRoZSBkZXN0aW5hdGlvbi4KKy8vLyBccGFyYW0gX19iCisvLy8gICAgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XS4KKy8vLyAgICBCaXRzIFszMTowXSBhcmUgd3JpdHRlbiB0byBiaXRzIFs2MzozMl0gb2YgdGhlIGRlc3RpbmF0aW9uLgorLy8vICAgIEJpdHMgWzYzOjMyXSBhcmUgd3JpdHRlbiB0byBiaXRzIFsxMjc6OTZdIG9mIHRoZSBkZXN0aW5hdGlvbi4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgdGhlIGludGVybGVhdmVkIHZhbHVlcy4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV91bnBhY2tsb19wcyhfX20xMjggX19hLCBfX20xMjggX19iKQoreworICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjRzZilfX2EsIChfX3Y0c2YpX19iLCAwLCA0LCAxLCA1KTsKK30KKworLy8vIFxicmllZiBDb25zdHJ1Y3RzIGEgMTI4LWJpdCBmbG9hdGluZy1wb2ludCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0uIFRoZSBsb3dlcgorLy8vICAgIDMyIGJpdHMgYXJlIHNldCB0byB0aGUgbG93ZXIgMzIgYml0cyBvZiB0aGUgc2Vjb25kIHBhcmFtZXRlci4gVGhlIHVwcGVyCisvLy8gICAgOTYgYml0cyBhcmUgc2V0IHRvIHRoZSB1cHBlciA5NiBiaXRzIG9mIHRoZSBmaXJzdCBwYXJhbWV0ZXIuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVk1PVlNTIC8gTU9WU1MgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IGZsb2F0aW5nLXBvaW50IHZlY3RvciBvZiBbNCB4IGZsb2F0XS4gVGhlIHVwcGVyIDk2IGJpdHMgYXJlCisvLy8gICAgd3JpdHRlbiB0byB0aGUgdXBwZXIgOTYgYml0cyBvZiB0aGUgcmVzdWx0LgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDEyOC1iaXQgZmxvYXRpbmctcG9pbnQgdmVjdG9yIG9mIFs0IHggZmxvYXRdLiBUaGUgbG93ZXIgMzIgYml0cyBhcmUKKy8vLyAgICB3cml0dGVuIHRvIHRoZSBsb3dlciAzMiBiaXRzIG9mIHRoZSByZXN1bHQuCisvLy8gXHJldHVybnMgQSAxMjgtYml0IGZsb2F0aW5nLXBvaW50IHZlY3RvciBvZiBbNCB4IGZsb2F0XS4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tb3ZlX3NzKF9fbTEyOCBfX2EsIF9fbTEyOCBfX2IpCit7CisgIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcigoX192NHNmKV9fYSwgKF9fdjRzZilfX2IsIDQsIDEsIDIsIDMpOworfQorCisvLy8gXGJyaWVmIENvbnN0cnVjdHMgYSAxMjgtYml0IGZsb2F0aW5nLXBvaW50IHZlY3RvciBvZiBbNCB4IGZsb2F0XS4gVGhlIGxvd2VyCisvLy8gICAgNjQgYml0cyBhcmUgc2V0IHRvIHRoZSB1cHBlciA2NCBiaXRzIG9mIHRoZSBzZWNvbmQgcGFyYW1ldGVyLiBUaGUgdXBwZXIKKy8vLyAgICA2NCBiaXRzIGFyZSBzZXQgdG8gdGhlIHVwcGVyIDY0IGJpdHMgb2YgdGhlIGZpcnN0IHBhcmFtZXRlci4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWVU5QQ0tIUEQgLyBVTlBDS0hQRCBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDEyOC1iaXQgZmxvYXRpbmctcG9pbnQgdmVjdG9yIG9mIFs0IHggZmxvYXRdLiBUaGUgdXBwZXIgNjQgYml0cyBhcmUKKy8vLyAgICB3cml0dGVuIHRvIHRoZSB1cHBlciA2NCBiaXRzIG9mIHRoZSByZXN1bHQuCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgMTI4LWJpdCBmbG9hdGluZy1wb2ludCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0uIFRoZSB1cHBlciA2NCBiaXRzIGFyZQorLy8vICAgIHdyaXR0ZW4gdG8gdGhlIGxvd2VyIDY0IGJpdHMgb2YgdGhlIHJlc3VsdC4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgZmxvYXRpbmctcG9pbnQgdmVjdG9yIG9mIFs0IHggZmxvYXRdLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX21vdmVobF9wcyhfX20xMjggX19hLCBfX20xMjggX19iKQoreworICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKF9fdjRzZilfX2EsIChfX3Y0c2YpX19iLCA2LCA3LCAyLCAzKTsKK30KKworLy8vIFxicmllZiBDb25zdHJ1Y3RzIGEgMTI4LWJpdCBmbG9hdGluZy1wb2ludCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0uIFRoZSBsb3dlcgorLy8vICAgIDY0IGJpdHMgYXJlIHNldCB0byB0aGUgbG93ZXIgNjQgYml0cyBvZiB0aGUgZmlyc3QgcGFyYW1ldGVyLiBUaGUgdXBwZXIKKy8vLyAgICA2NCBiaXRzIGFyZSBzZXQgdG8gdGhlIGxvd2VyIDY0IGJpdHMgb2YgdGhlIHNlY29uZCBwYXJhbWV0ZXIuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgVlVOUENLTFBEIC8gVU5QQ0tMUEQgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IGZsb2F0aW5nLXBvaW50IHZlY3RvciBvZiBbNCB4IGZsb2F0XS4gVGhlIGxvd2VyIDY0IGJpdHMgYXJlCisvLy8gICAgd3JpdHRlbiB0byB0aGUgbG93ZXIgNjQgYml0cyBvZiB0aGUgcmVzdWx0LgorLy8vIFxwYXJhbSBfX2IKKy8vLyAgICBBIDEyOC1iaXQgZmxvYXRpbmctcG9pbnQgdmVjdG9yIG9mIFs0IHggZmxvYXRdLiBUaGUgbG93ZXIgNjQgYml0cyBhcmUKKy8vLyAgICB3cml0dGVuIHRvIHRoZSB1cHBlciA2NCBiaXRzIG9mIHRoZSByZXN1bHQuCisvLy8gXHJldHVybnMgQSAxMjgtYml0IGZsb2F0aW5nLXBvaW50IHZlY3RvciBvZiBbNCB4IGZsb2F0XS4KK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tb3ZlbGhfcHMoX19tMTI4IF9fYSwgX19tMTI4IF9fYikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChfX3Y0c2YpX19hLCAoX192NHNmKV9fYiwgMCwgMSwgNCwgNSk7Cit9CisKKy8vLyBcYnJpZWYgQ29udmVydHMgYSA2NC1iaXQgdmVjdG9yIG9mIFs0IHggaTE2XSBpbnRvIGEgMTI4LWJpdCB2ZWN0b3Igb2YgWzQgeAorLy8vICAgIGZsb2F0XS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBDVlRQSTJQUyArIFxjIENPTVBPU0lURSBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDY0LWJpdCB2ZWN0b3Igb2YgWzQgeCBpMTZdLiBUaGUgZWxlbWVudHMgb2YgdGhlIGRlc3RpbmF0aW9uIGFyZSBjb3BpZWQKKy8vLyAgICBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIGluIHRoaXMgb3BlcmFuZC4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgdGhlIGNvcGllZCBhbmQgY29udmVydGVkCisvLy8gICAgdmFsdWVzIGZyb20gdGhlIG9wZXJhbmQuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY3Z0cGkxNl9wcyhfX202NCBfX2EpCit7CisgIF9fbTY0IF9fYiwgX19jOworICBfX20xMjggX19yOworCisgIF9fYiA9IF9tbV9zZXR6ZXJvX3NpNjQoKTsKKyAgX19iID0gX21tX2NtcGd0X3BpMTYoX19iLCBfX2EpOworICBfX2MgPSBfbW1fdW5wYWNraGlfcGkxNihfX2EsIF9fYik7CisgIF9fciA9IF9tbV9zZXR6ZXJvX3BzKCk7CisgIF9fciA9IF9tbV9jdnRwaTMyX3BzKF9fciwgX19jKTsKKyAgX19yID0gX21tX21vdmVsaF9wcyhfX3IsIF9fcik7CisgIF9fYyA9IF9tbV91bnBhY2tsb19waTE2KF9fYSwgX19iKTsKKyAgX19yID0gX21tX2N2dHBpMzJfcHMoX19yLCBfX2MpOworCisgIHJldHVybiBfX3I7Cit9CisKKy8vLyBcYnJpZWYgQ29udmVydHMgYSA2NC1iaXQgdmVjdG9yIG9mIDE2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlcyBpbnRvIGEKKy8vLyAgICAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBDVlRQSTJQUyArIFxjIENPTVBPU0lURSBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDY0LWJpdCB2ZWN0b3Igb2YgMTYtYml0IHVuc2lnbmVkIGludGVnZXIgdmFsdWVzLiBUaGUgZWxlbWVudHMgb2YgdGhlCisvLy8gICAgZGVzdGluYXRpb24gYXJlIGNvcGllZCBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIGluIHRoaXMgb3BlcmFuZC4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgdGhlIGNvcGllZCBhbmQgY29udmVydGVkCisvLy8gICAgdmFsdWVzIGZyb20gdGhlIG9wZXJhbmQuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY3Z0cHUxNl9wcyhfX202NCBfX2EpCit7CisgIF9fbTY0IF9fYiwgX19jOworICBfX20xMjggX19yOworCisgIF9fYiA9IF9tbV9zZXR6ZXJvX3NpNjQoKTsKKyAgX19jID0gX21tX3VucGFja2hpX3BpMTYoX19hLCBfX2IpOworICBfX3IgPSBfbW1fc2V0emVyb19wcygpOworICBfX3IgPSBfbW1fY3Z0cGkzMl9wcyhfX3IsIF9fYyk7CisgIF9fciA9IF9tbV9tb3ZlbGhfcHMoX19yLCBfX3IpOworICBfX2MgPSBfbW1fdW5wYWNrbG9fcGkxNihfX2EsIF9fYik7CisgIF9fciA9IF9tbV9jdnRwaTMyX3BzKF9fciwgX19jKTsKKworICByZXR1cm4gX19yOworfQorCisvLy8gXGJyaWVmIENvbnZlcnRzIHRoZSBsb3dlciBmb3VyIDgtYml0IHZhbHVlcyBmcm9tIGEgNjQtYml0IHZlY3RvciBvZiBbOCB4IGk4XQorLy8vICAgIGludG8gYSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBDVlRQSTJQUyArIFxjIENPTVBPU0lURSBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDY0LWJpdCB2ZWN0b3Igb2YgWzggeCBpOF0uIFRoZSBlbGVtZW50cyBvZiB0aGUgZGVzdGluYXRpb24gYXJlIGNvcGllZAorLy8vICAgIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcgbG93ZXIgNCBlbGVtZW50cyBpbiB0aGlzIG9wZXJhbmQuCisvLy8gXHJldHVybnMgQSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBjb250YWluaW5nIHRoZSBjb3BpZWQgYW5kIGNvbnZlcnRlZAorLy8vICAgIHZhbHVlcyBmcm9tIHRoZSBvcGVyYW5kLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2N2dHBpOF9wcyhfX202NCBfX2EpCit7CisgIF9fbTY0IF9fYjsKKworICBfX2IgPSBfbW1fc2V0emVyb19zaTY0KCk7CisgIF9fYiA9IF9tbV9jbXBndF9waTgoX19iLCBfX2EpOworICBfX2IgPSBfbW1fdW5wYWNrbG9fcGk4KF9fYSwgX19iKTsKKworICByZXR1cm4gX21tX2N2dHBpMTZfcHMoX19iKTsKK30KKworLy8vIFxicmllZiBDb252ZXJ0cyB0aGUgbG93ZXIgZm91ciB1bnNpZ25lZCA4LWJpdCBpbnRlZ2VyIHZhbHVlcyBmcm9tIGEgNjQtYml0CisvLy8gICAgdmVjdG9yIG9mIFs4IHggdThdIGludG8gYSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBDVlRQSTJQUyArIFxjIENPTVBPU0lURSBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDY0LWJpdCB2ZWN0b3Igb2YgdW5zaWduZWQgOC1iaXQgaW50ZWdlciB2YWx1ZXMuIFRoZSBlbGVtZW50cyBvZiB0aGUKKy8vLyAgICBkZXN0aW5hdGlvbiBhcmUgY29waWVkIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcgbG93ZXIgNCBlbGVtZW50cyBpbiB0aGlzCisvLy8gICAgb3BlcmFuZC4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIGNvbnRhaW5pbmcgdGhlIGNvcGllZCBhbmQgY29udmVydGVkCisvLy8gICAgdmFsdWVzIGZyb20gdGhlIHNvdXJjZSBvcGVyYW5kLgorc3RhdGljIF9faW5saW5lX18gX19tMTI4IF9fREVGQVVMVF9GTl9BVFRSUworX21tX2N2dHB1OF9wcyhfX202NCBfX2EpCit7CisgIF9fbTY0IF9fYjsKKworICBfX2IgPSBfbW1fc2V0emVyb19zaTY0KCk7CisgIF9fYiA9IF9tbV91bnBhY2tsb19waTgoX19hLCBfX2IpOworCisgIHJldHVybiBfbW1fY3Z0cGkxNl9wcyhfX2IpOworfQorCisvLy8gXGJyaWVmIENvbnZlcnRzIHRoZSB0d28gMzItYml0IHNpZ25lZCBpbnRlZ2VyIHZhbHVlcyBmcm9tIGVhY2ggNjQtYml0IHZlY3RvcgorLy8vICAgIG9wZXJhbmQgb2YgWzIgeCBpMzJdIGludG8gYSAxMjgtYml0IHZlY3RvciBvZiBbNCB4IGZsb2F0XS4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBDVlRQSTJQUyArIFxjIENPTVBPU0lURSBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDY0LWJpdCB2ZWN0b3Igb2YgWzIgeCBpMzJdLiBUaGUgbG93ZXIgZWxlbWVudHMgb2YgdGhlIGRlc3RpbmF0aW9uIGFyZQorLy8vICAgIGNvcGllZCBmcm9tIHRoZSBlbGVtZW50cyBpbiB0aGlzIG9wZXJhbmQuCisvLy8gXHBhcmFtIF9fYgorLy8vICAgIEEgNjQtYml0IHZlY3RvciBvZiBbMiB4IGkzMl0uIFRoZSB1cHBlciBlbGVtZW50cyBvZiB0aGUgZGVzdGluYXRpb24gYXJlCisvLy8gICAgY29waWVkIGZyb20gdGhlIGVsZW1lbnRzIGluIHRoaXMgb3BlcmFuZC4KKy8vLyBccmV0dXJucyBBIDEyOC1iaXQgdmVjdG9yIG9mIFs0IHggZmxvYXRdIHdob3NlIGxvd2VyIDY0IGJpdHMgY29udGFpbiB0aGUKKy8vLyAgICBjb3BpZWQgYW5kIGNvbnZlcnRlZCB2YWx1ZXMgZnJvbSB0aGUgZmlyc3Qgb3BlcmFuZC4gVGhlIHVwcGVyIDY0IGJpdHMKKy8vLyAgICBjb250YWluIHRoZSBjb3BpZWQgYW5kIGNvbnZlcnRlZCB2YWx1ZXMgZnJvbSB0aGUgc2Vjb25kIG9wZXJhbmQuCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY3Z0cGkzMngyX3BzKF9fbTY0IF9fYSwgX19tNjQgX19iKQoreworICBfX20xMjggX19jOworCisgIF9fYyA9IF9tbV9zZXR6ZXJvX3BzKCk7CisgIF9fYyA9IF9tbV9jdnRwaTMyX3BzKF9fYywgX19iKTsKKyAgX19jID0gX21tX21vdmVsaF9wcyhfX2MsIF9fYyk7CisKKyAgcmV0dXJuIF9tbV9jdnRwaTMyX3BzKF9fYywgX19hKTsKK30KKworLy8vIFxicmllZiBDb252ZXJ0cyBlYWNoIHNpbmdsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgZWxlbWVudCBvZiBhIDEyOC1iaXQKKy8vLyAgICBmbG9hdGluZy1wb2ludCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0gaW50byBhIDE2LWJpdCBzaWduZWQgaW50ZWdlciwgYW5kCisvLy8gICAgcGFja3MgdGhlIHJlc3VsdHMgaW50byBhIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbNCB4IGkxNl0uIElmIHRoZQorLy8vICAgIGZsb2F0aW5nLXBvaW50IGVsZW1lbnQgaXMgTmFOIG9yIGluZmluaXR5LCBvciBpZiB0aGUgZmxvYXRpbmctcG9pbnQKKy8vLyAgICBlbGVtZW50IGlzIGdyZWF0ZXIgdGhhbiAweDdGRkZGRkZGIG9yIGxlc3MgdGhhbiAtMHg4MDAwLCBpdCBpcyBjb252ZXJ0ZWQKKy8vLyAgICB0byAweDgwMDAuIE90aGVyd2lzZSBpZiB0aGUgZmxvYXRpbmctcG9pbnQgZWxlbWVudCBpcyBncmVhdGVyCisvLy8gICAgdGhhbiAweDdGRkYsIGl0IGlzIGNvbnZlcnRlZCB0byAweDdGRkYuCisvLy8KKy8vLyBcaGVhZGVyZmlsZSA8eDg2aW50cmluLmg+CisvLy8KKy8vLyBUaGlzIGludHJpbnNpYyBjb3JyZXNwb25kcyB0byB0aGUgXGMgQ1ZUUFMyUEkgKyBcYyBDT01QT1NJVEUgaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBccGFyYW0gX19hCisvLy8gICAgQSAxMjgtYml0IGZsb2F0aW5nLXBvaW50IHZlY3RvciBvZiBbNCB4IGZsb2F0XS4KKy8vLyBccmV0dXJucyBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbNCB4IGkxNl0gY29udGFpbmluZyB0aGUgY29udmVydGVkCisvLy8gICAgdmFsdWVzLgorc3RhdGljIF9faW5saW5lX18gX19tNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY3Z0cHNfcGkxNihfX20xMjggX19hKQoreworICBfX202NCBfX2IsIF9fYzsKKworICBfX2IgPSBfbW1fY3Z0cHNfcGkzMihfX2EpOworICBfX2EgPSBfbW1fbW92ZWhsX3BzKF9fYSwgX19hKTsKKyAgX19jID0gX21tX2N2dHBzX3BpMzIoX19hKTsKKworICByZXR1cm4gX21tX3BhY2tzX3BpMzIoX19iLCBfX2MpOworfQorCisvLy8gXGJyaWVmIENvbnZlcnRzIGVhY2ggc2luZ2xlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCBlbGVtZW50IG9mIGEgMTI4LWJpdAorLy8vICAgIGZsb2F0aW5nLXBvaW50IHZlY3RvciBvZiBbNCB4IGZsb2F0XSBpbnRvIGFuIDgtYml0IHNpZ25lZCBpbnRlZ2VyLCBhbmQKKy8vLyAgICBwYWNrcyB0aGUgcmVzdWx0cyBpbnRvIHRoZSBsb3dlciAzMiBiaXRzIG9mIGEgNjQtYml0IGludGVnZXIgdmVjdG9yIG9mCisvLy8gICAgWzggeCBpOF0uIFRoZSB1cHBlciAzMiBiaXRzIG9mIHRoZSB2ZWN0b3IgYXJlIHNldCB0byAwLiBJZiB0aGUKKy8vLyAgICBmbG9hdGluZy1wb2ludCBlbGVtZW50IGlzIE5hTiBvciBpbmZpbml0eSwgb3IgaWYgdGhlIGZsb2F0aW5nLXBvaW50CisvLy8gICAgZWxlbWVudCBpcyBncmVhdGVyIHRoYW4gMHg3RkZGRkZGRiBvciBsZXNzIHRoYW4gLTB4ODAsIGl0IGlzIGNvbnZlcnRlZAorLy8vICAgIHRvIDB4ODAuIE90aGVyd2lzZSBpZiB0aGUgZmxvYXRpbmctcG9pbnQgZWxlbWVudCBpcyBncmVhdGVyCisvLy8gICAgdGhhbiAweDdGLCBpdCBpcyBjb252ZXJ0ZWQgdG8gMHg3Ri4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBDVlRQUzJQSSArIFxjIENPTVBPU0lURSBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICAxMjgtYml0IGZsb2F0aW5nLXBvaW50IHZlY3RvciBvZiBbNCB4IGZsb2F0XS4KKy8vLyBccmV0dXJucyBBIDY0LWJpdCBpbnRlZ2VyIHZlY3RvciBvZiBbOCB4IGk4XS4gVGhlIGxvd2VyIDMyIGJpdHMgY29udGFpbiB0aGUKKy8vLyAgICBjb252ZXJ0ZWQgdmFsdWVzIGFuZCB0aGUgdXBwcGVyIDMyIGJpdHMgYXJlIHNldCB0byB6ZXJvLgorc3RhdGljIF9faW5saW5lX18gX19tNjQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY3Z0cHNfcGk4KF9fbTEyOCBfX2EpCit7CisgIF9fbTY0IF9fYiwgX19jOworCisgIF9fYiA9IF9tbV9jdnRwc19waTE2KF9fYSk7CisgIF9fYyA9IF9tbV9zZXR6ZXJvX3NpNjQoKTsKKworICByZXR1cm4gX21tX3BhY2tzX3BpMTYoX19iLCBfX2MpOworfQorCisvLy8gXGJyaWVmIEV4dHJhY3RzIHRoZSBzaWduIGJpdHMgZnJvbSBlYWNoIHNpbmdsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQKKy8vLyAgICBlbGVtZW50IG9mIGEgMTI4LWJpdCBmbG9hdGluZy1wb2ludCB2ZWN0b3Igb2YgWzQgeCBmbG9hdF0gYW5kIHJldHVybnMgdGhlCisvLy8gICAgc2lnbiBiaXRzIGluIGJpdHMgWzA6M10gb2YgdGhlIHJlc3VsdC4gQml0cyBbMzE6NF0gb2YgdGhlIHJlc3VsdCBhcmUgc2V0CisvLy8gICAgdG8gemVyby4KKy8vLworLy8vIFxoZWFkZXJmaWxlIDx4ODZpbnRyaW4uaD4KKy8vLworLy8vIFRoaXMgaW50cmluc2ljIGNvcnJlc3BvbmRzIHRvIHRoZSBcYyBWTU9WTVNLUFMgLyBNT1ZNU0tQUyBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFxwYXJhbSBfX2EKKy8vLyAgICBBIDEyOC1iaXQgZmxvYXRpbmctcG9pbnQgdmVjdG9yIG9mIFs0IHggZmxvYXRdLgorLy8vIFxyZXR1cm5zIEEgMzItYml0IGludGVnZXIgdmFsdWUuIEJpdHMgWzM6MF0gY29udGFpbiB0aGUgc2lnbiBiaXRzIGZyb20gZWFjaAorLy8vICAgIHNpbmdsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgZWxlbWVudCBvZiB0aGUgcGFyYW1ldGVyLiBCaXRzIFszMTo0XSBhcmUKKy8vLyAgICBzZXQgdG8gemVyby4KK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tb3ZlbWFza19wcyhfX20xMjggX19hKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfbW92bXNrcHMoKF9fdjRzZilfX2EpOworfQorCisKKyNkZWZpbmUgX01NX0FMSUdOMTYgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgxNikpKQorCisjZGVmaW5lIF9NTV9TSFVGRkxFKHosIHksIHgsIHcpICgoKHopIDw8IDYpIHwgKCh5KSA8PCA0KSB8ICgoeCkgPDwgMikgfCAodykpCisKKyNkZWZpbmUgX01NX0VYQ0VQVF9JTlZBTElEICAgICgweDAwMDEpCisjZGVmaW5lIF9NTV9FWENFUFRfREVOT1JNICAgICAoMHgwMDAyKQorI2RlZmluZSBfTU1fRVhDRVBUX0RJVl9aRVJPICAgKDB4MDAwNCkKKyNkZWZpbmUgX01NX0VYQ0VQVF9PVkVSRkxPVyAgICgweDAwMDgpCisjZGVmaW5lIF9NTV9FWENFUFRfVU5ERVJGTE9XICAoMHgwMDEwKQorI2RlZmluZSBfTU1fRVhDRVBUX0lORVhBQ1QgICAgKDB4MDAyMCkKKyNkZWZpbmUgX01NX0VYQ0VQVF9NQVNLICAgICAgICgweDAwM2YpCisKKyNkZWZpbmUgX01NX01BU0tfSU5WQUxJRCAgICAgICgweDAwODApCisjZGVmaW5lIF9NTV9NQVNLX0RFTk9STSAgICAgICAoMHgwMTAwKQorI2RlZmluZSBfTU1fTUFTS19ESVZfWkVSTyAgICAgKDB4MDIwMCkKKyNkZWZpbmUgX01NX01BU0tfT1ZFUkZMT1cgICAgICgweDA0MDApCisjZGVmaW5lIF9NTV9NQVNLX1VOREVSRkxPVyAgICAoMHgwODAwKQorI2RlZmluZSBfTU1fTUFTS19JTkVYQUNUICAgICAgKDB4MTAwMCkKKyNkZWZpbmUgX01NX01BU0tfTUFTSyAgICAgICAgICgweDFmODApCisKKyNkZWZpbmUgX01NX1JPVU5EX05FQVJFU1QgICAgICgweDAwMDApCisjZGVmaW5lIF9NTV9ST1VORF9ET1dOICAgICAgICAoMHgyMDAwKQorI2RlZmluZSBfTU1fUk9VTkRfVVAgICAgICAgICAgKDB4NDAwMCkKKyNkZWZpbmUgX01NX1JPVU5EX1RPV0FSRF9aRVJPICgweDYwMDApCisjZGVmaW5lIF9NTV9ST1VORF9NQVNLICAgICAgICAoMHg2MDAwKQorCisjZGVmaW5lIF9NTV9GTFVTSF9aRVJPX01BU0sgICAoMHg4MDAwKQorI2RlZmluZSBfTU1fRkxVU0hfWkVST19PTiAgICAgKDB4ODAwMCkKKyNkZWZpbmUgX01NX0ZMVVNIX1pFUk9fT0ZGICAgICgweDAwMDApCisKKyNkZWZpbmUgX01NX0dFVF9FWENFUFRJT05fTUFTSygpIChfbW1fZ2V0Y3NyKCkgJiBfTU1fTUFTS19NQVNLKQorI2RlZmluZSBfTU1fR0VUX0VYQ0VQVElPTl9TVEFURSgpIChfbW1fZ2V0Y3NyKCkgJiBfTU1fRVhDRVBUX01BU0spCisjZGVmaW5lIF9NTV9HRVRfRkxVU0hfWkVST19NT0RFKCkgKF9tbV9nZXRjc3IoKSAmIF9NTV9GTFVTSF9aRVJPX01BU0spCisjZGVmaW5lIF9NTV9HRVRfUk9VTkRJTkdfTU9ERSgpIChfbW1fZ2V0Y3NyKCkgJiBfTU1fUk9VTkRfTUFTSykKKworI2RlZmluZSBfTU1fU0VUX0VYQ0VQVElPTl9NQVNLKHgpIChfbW1fc2V0Y3NyKChfbW1fZ2V0Y3NyKCkgJiB+X01NX01BU0tfTUFTSykgfCAoeCkpKQorI2RlZmluZSBfTU1fU0VUX0VYQ0VQVElPTl9TVEFURSh4KSAoX21tX3NldGNzcigoX21tX2dldGNzcigpICYgfl9NTV9FWENFUFRfTUFTSykgfCAoeCkpKQorI2RlZmluZSBfTU1fU0VUX0ZMVVNIX1pFUk9fTU9ERSh4KSAoX21tX3NldGNzcigoX21tX2dldGNzcigpICYgfl9NTV9GTFVTSF9aRVJPX01BU0spIHwgKHgpKSkKKyNkZWZpbmUgX01NX1NFVF9ST1VORElOR19NT0RFKHgpIChfbW1fc2V0Y3NyKChfbW1fZ2V0Y3NyKCkgJiB+X01NX1JPVU5EX01BU0spIHwgKHgpKSkKKworI2RlZmluZSBfTU1fVFJBTlNQT1NFNF9QUyhyb3cwLCByb3cxLCByb3cyLCByb3czKSBcCitkbyB7IFwKKyAgX19tMTI4IHRtcDMsIHRtcDIsIHRtcDEsIHRtcDA7IFwKKyAgdG1wMCA9IF9tbV91bnBhY2tsb19wcygocm93MCksIChyb3cxKSk7IFwKKyAgdG1wMiA9IF9tbV91bnBhY2tsb19wcygocm93MiksIChyb3czKSk7IFwKKyAgdG1wMSA9IF9tbV91bnBhY2toaV9wcygocm93MCksIChyb3cxKSk7IFwKKyAgdG1wMyA9IF9tbV91bnBhY2toaV9wcygocm93MiksIChyb3czKSk7IFwKKyAgKHJvdzApID0gX21tX21vdmVsaF9wcyh0bXAwLCB0bXAyKTsgXAorICAocm93MSkgPSBfbW1fbW92ZWhsX3BzKHRtcDIsIHRtcDApOyBcCisgIChyb3cyKSA9IF9tbV9tb3ZlbGhfcHModG1wMSwgdG1wMyk7IFwKKyAgKHJvdzMpID0gX21tX21vdmVobF9wcyh0bXAzLCB0bXAxKTsgXAorfSB3aGlsZSAoMCkKKworLyogQWxpYXNlcyBmb3IgY29tcGF0aWJpbGl0eS4gKi8KKyNkZWZpbmUgX21fcGV4dHJ3IF9tbV9leHRyYWN0X3BpMTYKKyNkZWZpbmUgX21fcGluc3J3IF9tbV9pbnNlcnRfcGkxNgorI2RlZmluZSBfbV9wbWF4c3cgX21tX21heF9waTE2CisjZGVmaW5lIF9tX3BtYXh1YiBfbW1fbWF4X3B1OAorI2RlZmluZSBfbV9wbWluc3cgX21tX21pbl9waTE2CisjZGVmaW5lIF9tX3BtaW51YiBfbW1fbWluX3B1OAorI2RlZmluZSBfbV9wbW92bXNrYiBfbW1fbW92ZW1hc2tfcGk4CisjZGVmaW5lIF9tX3BtdWxodXcgX21tX211bGhpX3B1MTYKKyNkZWZpbmUgX21fcHNodWZ3IF9tbV9zaHVmZmxlX3BpMTYKKyNkZWZpbmUgX21fbWFza21vdnEgX21tX21hc2ttb3ZlX3NpNjQKKyNkZWZpbmUgX21fcGF2Z2IgX21tX2F2Z19wdTgKKyNkZWZpbmUgX21fcGF2Z3cgX21tX2F2Z19wdTE2CisjZGVmaW5lIF9tX3BzYWRidyBfbW1fc2FkX3B1OAorI2RlZmluZSBfbV8gX21tXworI2RlZmluZSBfbV8gX21tXworCisjdW5kZWYgX19ERUZBVUxUX0ZOX0FUVFJTCisKKy8qIFVnbHkgaGFjayBmb3IgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgKGNvbXBhdGlibGUgd2l0aCBnY2MpICovCisjaWYgZGVmaW5lZChfX1NTRTJfXykgJiYgIV9fYnVpbGRpbmdfbW9kdWxlKF9CdWlsdGluX2ludHJpbnNpY3MpCisjaW5jbHVkZSA8ZW1taW50cmluLmg+CisjZW5kaWYKKworI2VuZGlmIC8qIF9fWE1NSU5UUklOX0ggKi8KZGlmZiAtLWdpdCBhL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL3hvcGludHJpbi5oIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUveG9waW50cmluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRmMGNlYwotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL3hvcGludHJpbi5oCkBAIC0wLDAgKzEsNzgyIEBACisvKj09PS0tLS0geG9waW50cmluLmggLSBYT1AgaW50cmluc2ljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICoKKyAqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqLworCisjaWZuZGVmIF9fWDg2SU5UUklOX0gKKyNlcnJvciAiTmV2ZXIgdXNlIDx4b3BpbnRyaW4uaD4gZGlyZWN0bHk7IGluY2x1ZGUgPHg4NmludHJpbi5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9fWE9QSU5UUklOX0gKKyNkZWZpbmUgX19YT1BJTlRSSU5fSAorCisjaW5jbHVkZSA8Zm1hNGludHJpbi5oPgorCisvKiBEZWZpbmUgdGhlIGRlZmF1bHQgYXR0cmlidXRlcyBmb3IgdGhlIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUuICovCisjZGVmaW5lIF9fREVGQVVMVF9GTl9BVFRSUyBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18sIF9fdGFyZ2V0X18oInhvcCIpKSkKKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYWNjc19lcGkxNihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IsIF9fbTEyOGkgX19DKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfdnBtYWNzc3d3KChfX3Y4aGkpX19BLCAoX192OGhpKV9fQiwgKF9fdjhoaSlfX0MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hY2NfZXBpMTYoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CLCBfX20xMjhpIF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3ZwbWFjc3d3KChfX3Y4aGkpX19BLCAoX192OGhpKV9fQiwgKF9fdjhoaSlfX0MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hY2NzZF9lcGkxNihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IsIF9fbTEyOGkgX19DKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfdnBtYWNzc3dkKChfX3Y4aGkpX19BLCAoX192OGhpKV9fQiwgKF9fdjRzaSlfX0MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hY2NkX2VwaTE2KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQiwgX19tMTI4aSBfX0MpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl92cG1hY3N3ZCgoX192OGhpKV9fQSwgKF9fdjhoaSlfX0IsIChfX3Y0c2kpX19DKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYWNjc19lcGkzMihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IsIF9fbTEyOGkgX19DKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfdnBtYWNzc2RkKChfX3Y0c2kpX19BLCAoX192NHNpKV9fQiwgKF9fdjRzaSlfX0MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hY2NfZXBpMzIoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CLCBfX20xMjhpIF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3ZwbWFjc2RkKChfX3Y0c2kpX19BLCAoX192NHNpKV9fQiwgKF9fdjRzaSlfX0MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX21hY2NzbG9fZXBpMzIoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CLCBfX20xMjhpIF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3ZwbWFjc3NkcWwoKF9fdjRzaSlfX0EsIChfX3Y0c2kpX19CLCAoX192MmRpKV9fQyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFjY2xvX2VwaTMyKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQiwgX19tMTI4aSBfX0MpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl92cG1hY3NkcWwoKF9fdjRzaSlfX0EsIChfX3Y0c2kpX19CLCAoX192MmRpKV9fQyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFjY3NoaV9lcGkzMihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IsIF9fbTEyOGkgX19DKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfdnBtYWNzc2RxaCgoX192NHNpKV9fQSwgKF9fdjRzaSlfX0IsIChfX3YyZGkpX19DKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYWNjaGlfZXBpMzIoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CLCBfX20xMjhpIF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3ZwbWFjc2RxaCgoX192NHNpKV9fQSwgKF9fdjRzaSlfX0IsIChfX3YyZGkpX19DKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9tYWRkc2RfZXBpMTYoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CLCBfX20xMjhpIF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3ZwbWFkY3Nzd2QoKF9fdjhoaSlfX0EsIChfX3Y4aGkpX19CLCAoX192NHNpKV9fQyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fbWFkZGRfZXBpMTYoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CLCBfX20xMjhpIF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3ZwbWFkY3N3ZCgoX192OGhpKV9fQSwgKF9fdjhoaSlfX0IsIChfX3Y0c2kpX19DKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9oYWRkd19lcGk4KF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfdnBoYWRkYncoKF9fdjE2cWkpX19BKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9oYWRkZF9lcGk4KF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfdnBoYWRkYmQoKF9fdjE2cWkpX19BKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9oYWRkcV9lcGk4KF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfdnBoYWRkYnEoKF9fdjE2cWkpX19BKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9oYWRkZF9lcGkxNihfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3ZwaGFkZHdkKChfX3Y4aGkpX19BKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9oYWRkcV9lcGkxNihfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3ZwaGFkZHdxKChfX3Y4aGkpX19BKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9oYWRkcV9lcGkzMihfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3ZwaGFkZGRxKChfX3Y0c2kpX19BKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9oYWRkd19lcHU4KF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfdnBoYWRkdWJ3KChfX3YxNnFpKV9fQSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1faGFkZGRfZXB1OChfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3ZwaGFkZHViZCgoX192MTZxaSlfX0EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2hhZGRxX2VwdTgoX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl92cGhhZGR1YnEoKF9fdjE2cWkpX19BKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9oYWRkZF9lcHUxNihfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3ZwaGFkZHV3ZCgoX192OGhpKV9fQSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1faGFkZHFfZXB1MTYoX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl92cGhhZGR1d3EoKF9fdjhoaSlfX0EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2hhZGRxX2VwdTMyKF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfdnBoYWRkdWRxKChfX3Y0c2kpX19BKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9oc3Vid19lcGk4KF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfdnBoc3ViYncoKF9fdjE2cWkpX19BKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9oc3ViZF9lcGkxNihfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3ZwaHN1YndkKChfX3Y4aGkpX19BKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9oc3VicV9lcGkzMihfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3ZwaHN1YmRxKChfX3Y0c2kpX19BKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jbW92X3NpMTI4KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQiwgX19tMTI4aSBfX0MpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl92cGNtb3YoKF9fdjJkaSlfX0EsIChfX3YyZGkpX19CLCAoX192MmRpKV9fQyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfY21vdl9zaTI1NihfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IsIF9fbTI1NmkgX19DKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfdnBjbW92XzI1NigoX192NGRpKV9fQSwgKF9fdjRkaSlfX0IsIChfX3Y0ZGkpX19DKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9wZXJtX2VwaTgoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CLCBfX20xMjhpIF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3ZwcGVybSgoX192MTZxaSlfX0EsIChfX3YxNnFpKV9fQiwgKF9fdjE2cWkpX19DKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9yb3RfZXBpOChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl92cHJvdGIoKF9fdjE2cWkpX19BLCAoX192MTZxaSlfX0IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3JvdF9lcGkxNihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl92cHJvdHcoKF9fdjhoaSlfX0EsIChfX3Y4aGkpX19CKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9yb3RfZXBpMzIoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfdnByb3RkKChfX3Y0c2kpX19BLCAoX192NHNpKV9fQik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fcm90X2VwaTY0KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3Zwcm90cSgoX192MmRpKV9fQSwgKF9fdjJkaSlfX0IpOworfQorCisjZGVmaW5lIF9tbV9yb3RpX2VwaTgoQSwgTikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3Zwcm90YmkoKF9fdjE2cWkpKF9fbTEyOGkpKEEpLCAoTikpOyB9KQorCisjZGVmaW5lIF9tbV9yb3RpX2VwaTE2KEEsIE4pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl92cHJvdHdpKChfX3Y4aGkpKF9fbTEyOGkpKEEpLCAoTikpOyB9KQorCisjZGVmaW5lIF9tbV9yb3RpX2VwaTMyKEEsIE4pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl92cHJvdGRpKChfX3Y0c2kpKF9fbTEyOGkpKEEpLCAoTikpOyB9KQorCisjZGVmaW5lIF9tbV9yb3RpX2VwaTY0KEEsIE4pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl92cHJvdHFpKChfX3YyZGkpKF9fbTEyOGkpKEEpLCAoTikpOyB9KQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3NobF9lcGk4KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3Zwc2hsYigoX192MTZxaSlfX0EsIChfX3YxNnFpKV9fQik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc2hsX2VwaTE2KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3Zwc2hsdygoX192OGhpKV9fQSwgKF9fdjhoaSlfX0IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3NobF9lcGkzMihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl92cHNobGQoKF9fdjRzaSlfX0EsIChfX3Y0c2kpX19CKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zaGxfZXBpNjQoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfdnBzaGxxKChfX3YyZGkpX19BLCAoX192MmRpKV9fQik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc2hhX2VwaTgoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfdnBzaGFiKChfX3YxNnFpKV9fQSwgKF9fdjE2cWkpX19CKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9zaGFfZXBpMTYoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfdnBzaGF3KChfX3Y4aGkpX19BLCAoX192OGhpKV9fQik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fc2hhX2VwaTMyKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3Zwc2hhZCgoX192NHNpKV9fQSwgKF9fdjRzaSlfX0IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX3NoYV9lcGk2NChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl92cHNoYXEoKF9fdjJkaSlfX0EsIChfX3YyZGkpX19CKTsKK30KKworI2RlZmluZSBfbW1fY29tX2VwdTgoQSwgQiwgTikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3ZwY29tdWIoKF9fdjE2cWkpKF9fbTEyOGkpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2cWkpKF9fbTEyOGkpKEIpLCAoTikpOyB9KQorCisjZGVmaW5lIF9tbV9jb21fZXB1MTYoQSwgQiwgTikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3ZwY29tdXcoKF9fdjhoaSkoX19tMTI4aSkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OGhpKShfX20xMjhpKShCKSwgKE4pKTsgfSkKKworI2RlZmluZSBfbW1fY29tX2VwdTMyKEEsIEIsIE4pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl92cGNvbXVkKChfX3Y0c2kpKF9fbTEyOGkpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzaSkoX19tMTI4aSkoQiksIChOKSk7IH0pCisKKyNkZWZpbmUgX21tX2NvbV9lcHU2NChBLCBCLCBOKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGkpX19idWlsdGluX2lhMzJfdnBjb211cSgoX192MmRpKShfX20xMjhpKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGkpKF9fbTEyOGkpKEIpLCAoTikpOyB9KQorCisjZGVmaW5lIF9tbV9jb21fZXBpOChBLCBCLCBOKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGkpX19idWlsdGluX2lhMzJfdnBjb21iKChfX3YxNnFpKShfX20xMjhpKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjE2cWkpKF9fbTEyOGkpKEIpLCAoTikpOyB9KQorCisjZGVmaW5lIF9tbV9jb21fZXBpMTYoQSwgQiwgTikgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3ZwY29tdygoX192OGhpKShfX20xMjhpKShBKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhoaSkoX19tMTI4aSkoQiksIChOKSk7IH0pCisKKyNkZWZpbmUgX21tX2NvbV9lcGkzMihBLCBCLCBOKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOGkpX19idWlsdGluX2lhMzJfdnBjb21kKChfX3Y0c2kpKF9fbTEyOGkpKEEpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNpKShfX20xMjhpKShCKSwgKE4pKTsgfSkKKworI2RlZmluZSBfbW1fY29tX2VwaTY0KEEsIEIsIE4pIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl92cGNvbXEoKF9fdjJkaSkoX19tMTI4aSkoQSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGkpKF9fbTEyOGkpKEIpLCAoTikpOyB9KQorCisjZGVmaW5lIF9NTV9QQ09NQ1RSTF9MVCAgICAwCisjZGVmaW5lIF9NTV9QQ09NQ1RSTF9MRSAgICAxCisjZGVmaW5lIF9NTV9QQ09NQ1RSTF9HVCAgICAyCisjZGVmaW5lIF9NTV9QQ09NQ1RSTF9HRSAgICAzCisjZGVmaW5lIF9NTV9QQ09NQ1RSTF9FUSAgICA0CisjZGVmaW5lIF9NTV9QQ09NQ1RSTF9ORVEgICA1CisjZGVmaW5lIF9NTV9QQ09NQ1RSTF9GQUxTRSA2CisjZGVmaW5lIF9NTV9QQ09NQ1RSTF9UUlVFICA3CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY29tbHRfZXB1OChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiBfbW1fY29tX2VwdTgoX19BLCBfX0IsIF9NTV9QQ09NQ1RSTF9MVCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY29tbGVfZXB1OChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiBfbW1fY29tX2VwdTgoX19BLCBfX0IsIF9NTV9QQ09NQ1RSTF9MRSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY29tZ3RfZXB1OChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiBfbW1fY29tX2VwdTgoX19BLCBfX0IsIF9NTV9QQ09NQ1RSTF9HVCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY29tZ2VfZXB1OChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiBfbW1fY29tX2VwdTgoX19BLCBfX0IsIF9NTV9QQ09NQ1RSTF9HRSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY29tZXFfZXB1OChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiBfbW1fY29tX2VwdTgoX19BLCBfX0IsIF9NTV9QQ09NQ1RSTF9FUSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY29tbmVxX2VwdTgoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gX21tX2NvbV9lcHU4KF9fQSwgX19CLCBfTU1fUENPTUNUUkxfTkVRKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jb21mYWxzZV9lcHU4KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIF9tbV9jb21fZXB1OChfX0EsIF9fQiwgX01NX1BDT01DVFJMX0ZBTFNFKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jb210cnVlX2VwdTgoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gX21tX2NvbV9lcHU4KF9fQSwgX19CLCBfTU1fUENPTUNUUkxfVFJVRSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY29tbHRfZXB1MTYoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gX21tX2NvbV9lcHUxNihfX0EsIF9fQiwgX01NX1BDT01DVFJMX0xUKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jb21sZV9lcHUxNihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiBfbW1fY29tX2VwdTE2KF9fQSwgX19CLCBfTU1fUENPTUNUUkxfTEUpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NvbWd0X2VwdTE2KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIF9tbV9jb21fZXB1MTYoX19BLCBfX0IsIF9NTV9QQ09NQ1RSTF9HVCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY29tZ2VfZXB1MTYoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gX21tX2NvbV9lcHUxNihfX0EsIF9fQiwgX01NX1BDT01DVFJMX0dFKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jb21lcV9lcHUxNihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiBfbW1fY29tX2VwdTE2KF9fQSwgX19CLCBfTU1fUENPTUNUUkxfRVEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NvbW5lcV9lcHUxNihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiBfbW1fY29tX2VwdTE2KF9fQSwgX19CLCBfTU1fUENPTUNUUkxfTkVRKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jb21mYWxzZV9lcHUxNihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiBfbW1fY29tX2VwdTE2KF9fQSwgX19CLCBfTU1fUENPTUNUUkxfRkFMU0UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NvbXRydWVfZXB1MTYoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gX21tX2NvbV9lcHUxNihfX0EsIF9fQiwgX01NX1BDT01DVFJMX1RSVUUpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NvbWx0X2VwdTMyKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIF9tbV9jb21fZXB1MzIoX19BLCBfX0IsIF9NTV9QQ09NQ1RSTF9MVCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY29tbGVfZXB1MzIoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gX21tX2NvbV9lcHUzMihfX0EsIF9fQiwgX01NX1BDT01DVFJMX0xFKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jb21ndF9lcHUzMihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiBfbW1fY29tX2VwdTMyKF9fQSwgX19CLCBfTU1fUENPTUNUUkxfR1QpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NvbWdlX2VwdTMyKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIF9tbV9jb21fZXB1MzIoX19BLCBfX0IsIF9NTV9QQ09NQ1RSTF9HRSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY29tZXFfZXB1MzIoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gX21tX2NvbV9lcHUzMihfX0EsIF9fQiwgX01NX1BDT01DVFJMX0VRKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jb21uZXFfZXB1MzIoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gX21tX2NvbV9lcHUzMihfX0EsIF9fQiwgX01NX1BDT01DVFJMX05FUSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY29tZmFsc2VfZXB1MzIoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gX21tX2NvbV9lcHUzMihfX0EsIF9fQiwgX01NX1BDT01DVFJMX0ZBTFNFKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jb210cnVlX2VwdTMyKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIF9tbV9jb21fZXB1MzIoX19BLCBfX0IsIF9NTV9QQ09NQ1RSTF9UUlVFKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jb21sdF9lcHU2NChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiBfbW1fY29tX2VwdTY0KF9fQSwgX19CLCBfTU1fUENPTUNUUkxfTFQpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NvbWxlX2VwdTY0KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIF9tbV9jb21fZXB1NjQoX19BLCBfX0IsIF9NTV9QQ09NQ1RSTF9MRSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY29tZ3RfZXB1NjQoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gX21tX2NvbV9lcHU2NChfX0EsIF9fQiwgX01NX1BDT01DVFJMX0dUKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jb21nZV9lcHU2NChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiBfbW1fY29tX2VwdTY0KF9fQSwgX19CLCBfTU1fUENPTUNUUkxfR0UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NvbWVxX2VwdTY0KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIF9tbV9jb21fZXB1NjQoX19BLCBfX0IsIF9NTV9QQ09NQ1RSTF9FUSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY29tbmVxX2VwdTY0KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIF9tbV9jb21fZXB1NjQoX19BLCBfX0IsIF9NTV9QQ09NQ1RSTF9ORVEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NvbWZhbHNlX2VwdTY0KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIF9tbV9jb21fZXB1NjQoX19BLCBfX0IsIF9NTV9QQ09NQ1RSTF9GQUxTRSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY29tdHJ1ZV9lcHU2NChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiBfbW1fY29tX2VwdTY0KF9fQSwgX19CLCBfTU1fUENPTUNUUkxfVFJVRSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY29tbHRfZXBpOChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiBfbW1fY29tX2VwaTgoX19BLCBfX0IsIF9NTV9QQ09NQ1RSTF9MVCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY29tbGVfZXBpOChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiBfbW1fY29tX2VwaTgoX19BLCBfX0IsIF9NTV9QQ09NQ1RSTF9MRSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY29tZ3RfZXBpOChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiBfbW1fY29tX2VwaTgoX19BLCBfX0IsIF9NTV9QQ09NQ1RSTF9HVCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY29tZ2VfZXBpOChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiBfbW1fY29tX2VwaTgoX19BLCBfX0IsIF9NTV9QQ09NQ1RSTF9HRSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY29tZXFfZXBpOChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiBfbW1fY29tX2VwaTgoX19BLCBfX0IsIF9NTV9QQ09NQ1RSTF9FUSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY29tbmVxX2VwaTgoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gX21tX2NvbV9lcGk4KF9fQSwgX19CLCBfTU1fUENPTUNUUkxfTkVRKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jb21mYWxzZV9lcGk4KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIF9tbV9jb21fZXBpOChfX0EsIF9fQiwgX01NX1BDT01DVFJMX0ZBTFNFKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jb210cnVlX2VwaTgoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gX21tX2NvbV9lcGk4KF9fQSwgX19CLCBfTU1fUENPTUNUUkxfVFJVRSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY29tbHRfZXBpMTYoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gX21tX2NvbV9lcGkxNihfX0EsIF9fQiwgX01NX1BDT01DVFJMX0xUKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jb21sZV9lcGkxNihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiBfbW1fY29tX2VwaTE2KF9fQSwgX19CLCBfTU1fUENPTUNUUkxfTEUpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NvbWd0X2VwaTE2KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIF9tbV9jb21fZXBpMTYoX19BLCBfX0IsIF9NTV9QQ09NQ1RSTF9HVCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY29tZ2VfZXBpMTYoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gX21tX2NvbV9lcGkxNihfX0EsIF9fQiwgX01NX1BDT01DVFJMX0dFKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jb21lcV9lcGkxNihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiBfbW1fY29tX2VwaTE2KF9fQSwgX19CLCBfTU1fUENPTUNUUkxfRVEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NvbW5lcV9lcGkxNihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiBfbW1fY29tX2VwaTE2KF9fQSwgX19CLCBfTU1fUENPTUNUUkxfTkVRKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jb21mYWxzZV9lcGkxNihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiBfbW1fY29tX2VwaTE2KF9fQSwgX19CLCBfTU1fUENPTUNUUkxfRkFMU0UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NvbXRydWVfZXBpMTYoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gX21tX2NvbV9lcGkxNihfX0EsIF9fQiwgX01NX1BDT01DVFJMX1RSVUUpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NvbWx0X2VwaTMyKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIF9tbV9jb21fZXBpMzIoX19BLCBfX0IsIF9NTV9QQ09NQ1RSTF9MVCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY29tbGVfZXBpMzIoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gX21tX2NvbV9lcGkzMihfX0EsIF9fQiwgX01NX1BDT01DVFJMX0xFKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jb21ndF9lcGkzMihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiBfbW1fY29tX2VwaTMyKF9fQSwgX19CLCBfTU1fUENPTUNUUkxfR1QpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NvbWdlX2VwaTMyKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIF9tbV9jb21fZXBpMzIoX19BLCBfX0IsIF9NTV9QQ09NQ1RSTF9HRSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY29tZXFfZXBpMzIoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gX21tX2NvbV9lcGkzMihfX0EsIF9fQiwgX01NX1BDT01DVFJMX0VRKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jb21uZXFfZXBpMzIoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gX21tX2NvbV9lcGkzMihfX0EsIF9fQiwgX01NX1BDT01DVFJMX05FUSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY29tZmFsc2VfZXBpMzIoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gX21tX2NvbV9lcGkzMihfX0EsIF9fQiwgX01NX1BDT01DVFJMX0ZBTFNFKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jb210cnVlX2VwaTMyKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIF9tbV9jb21fZXBpMzIoX19BLCBfX0IsIF9NTV9QQ09NQ1RSTF9UUlVFKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jb21sdF9lcGk2NChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiBfbW1fY29tX2VwaTY0KF9fQSwgX19CLCBfTU1fUENPTUNUUkxfTFQpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NvbWxlX2VwaTY0KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIF9tbV9jb21fZXBpNjQoX19BLCBfX0IsIF9NTV9QQ09NQ1RSTF9MRSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY29tZ3RfZXBpNjQoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gX21tX2NvbV9lcGk2NChfX0EsIF9fQiwgX01NX1BDT01DVFJMX0dUKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4aSBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9jb21nZV9lcGk2NChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiBfbW1fY29tX2VwaTY0KF9fQSwgX19CLCBfTU1fUENPTUNUUkxfR0UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NvbWVxX2VwaTY0KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIF9tbV9jb21fZXBpNjQoX19BLCBfX0IsIF9NTV9QQ09NQ1RSTF9FUSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY29tbmVxX2VwaTY0KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIF9tbV9jb21fZXBpNjQoX19BLCBfX0IsIF9NTV9QQ09NQ1RSTF9ORVEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhpIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2NvbWZhbHNlX2VwaTY0KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIF9tbV9jb21fZXBpNjQoX19BLCBfX0IsIF9NTV9QQ09NQ1RSTF9GQUxTRSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOGkgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fY29tdHJ1ZV9lcGk2NChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiBfbW1fY29tX2VwaTY0KF9fQSwgX19CLCBfTU1fUENPTUNUUkxfVFJVRSk7Cit9CisKKyNkZWZpbmUgX21tX3Blcm11dGUyX3BkKFgsIFksIEMsIEkpIF9fZXh0ZW5zaW9uX18gKHsgXAorICAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl92cGVybWlsMnBkKChfX3YyZGYpKF9fbTEyOGQpKFgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZikoX19tMTI4ZCkoWSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRpKShfX20xMjhpKShDKSwgKEkpKTsgfSkKKworI2RlZmluZSBfbW0yNTZfcGVybXV0ZTJfcGQoWCwgWSwgQywgSSkgX19leHRlbnNpb25fXyAoeyBcCisgIChfX20yNTZkKV9fYnVpbHRpbl9pYTMyX3ZwZXJtaWwycGQyNTYoKF9fdjRkZikoX19tMjU2ZCkoWCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRmKShfX20yNTZkKShZKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGkpKF9fbTI1NmkpKEMpLCAoSSkpOyB9KQorCisjZGVmaW5lIF9tbV9wZXJtdXRlMl9wcyhYLCBZLCBDLCBJKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTEyOClfX2J1aWx0aW5faWEzMl92cGVybWlsMnBzKChfX3Y0c2YpKF9fbTEyOCkoWCksIChfX3Y0c2YpKF9fbTEyOCkoWSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2kpKF9fbTEyOGkpKEMpLCAoSSkpOyB9KQorCisjZGVmaW5lIF9tbTI1Nl9wZXJtdXRlMl9wcyhYLCBZLCBDLCBJKSBfX2V4dGVuc2lvbl9fICh7IFwKKyAgKF9fbTI1NilfX2J1aWx0aW5faWEzMl92cGVybWlsMnBzMjU2KChfX3Y4c2YpKF9fbTI1NikoWCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2YpKF9fbTI1NikoWSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2kpKF9fbTI1NmkpKEMpLCAoSSkpOyB9KQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjggX19ERUZBVUxUX0ZOX0FUVFJTCitfbW1fZnJjel9zcyhfX20xMjggX19BKQoreworICByZXR1cm4gKF9fbTEyOClfX2J1aWx0aW5faWEzMl92ZnJjenNzKChfX3Y0c2YpX19BKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMTI4ZCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9mcmN6X3NkKF9fbTEyOGQgX19BKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfdmZyY3pzZCgoX192MmRmKV9fQSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTEyOCBfX0RFRkFVTFRfRk5fQVRUUlMKK19tbV9mcmN6X3BzKF9fbTEyOCBfX0EpCit7CisgIHJldHVybiAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX3ZmcmN6cHMoKF9fdjRzZilfX0EpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX20xMjhkIF9fREVGQVVMVF9GTl9BVFRSUworX21tX2ZyY3pfcGQoX19tMTI4ZCBfX0EpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl92ZnJjenBkKChfX3YyZGYpX19BKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19tMjU2IF9fREVGQVVMVF9GTl9BVFRSUworX21tMjU2X2ZyY3pfcHMoX19tMjU2IF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTYpX19idWlsdGluX2lhMzJfdmZyY3pwczI1NigoX192OHNmKV9fQSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fbTI1NmQgX19ERUZBVUxUX0ZOX0FUVFJTCitfbW0yNTZfZnJjel9wZChfX20yNTZkIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZkKV9fYnVpbHRpbl9pYTMyX3ZmcmN6cGQyNTYoKF9fdjRkZilfX0EpOworfQorCisjdW5kZWYgX19ERUZBVUxUX0ZOX0FUVFJTCisKKyNlbmRpZiAvKiBfX1hPUElOVFJJTl9IICovCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS94c2F2ZWNpbnRyaW4uaCBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL3hzYXZlY2ludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ODQ3MGEKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS94c2F2ZWNpbnRyaW4uaApAQCAtMCwwICsxLDQ4IEBACisvKj09PS0tLS0geHNhdmVjaW50cmluLmggLSBYU0FWRUMgaW50cmluc2ljIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqCisgKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisgKi8KKworI2lmbmRlZiBfX0lNTUlOVFJJTl9ICisjZXJyb3IgIk5ldmVyIHVzZSA8eHNhdmVjaW50cmluLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxpbW1pbnRyaW4uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmbmRlZiBfX1hTQVZFQ0lOVFJJTl9ICisjZGVmaW5lIF9fWFNBVkVDSU5UUklOX0gKKworLyogRGVmaW5lIHRoZSBkZWZhdWx0IGF0dHJpYnV0ZXMgZm9yIHRoZSBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlLiAqLworI2RlZmluZSBfX0RFRkFVTFRfRk5fQVRUUlMgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fLCAgX190YXJnZXRfXygieHNhdmVjIikpKQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX3hzYXZlYyh2b2lkICpfX3AsIHVuc2lnbmVkIGxvbmcgbG9uZyBfX20pIHsKKyAgX19idWlsdGluX2lhMzJfeHNhdmVjKF9fcCwgX19tKTsKK30KKworI2lmZGVmIF9feDg2XzY0X18KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfeHNhdmVjNjQodm9pZCAqX19wLCB1bnNpZ25lZCBsb25nIGxvbmcgX19tKSB7CisgIF9fYnVpbHRpbl9pYTMyX3hzYXZlYzY0KF9fcCwgX19tKTsKK30KKyNlbmRpZgorCisjdW5kZWYgX19ERUZBVUxUX0ZOX0FUVFJTCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUveHNhdmVpbnRyaW4uaCBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL3hzYXZlaW50cmluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJlNmIyZQotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL3hzYXZlaW50cmluLmgKQEAgLTAsMCArMSw1OCBAQAorLyo9PT0tLS0tIHhzYXZlaW50cmluLmggLSBYU0FWRSBpbnRyaW5zaWMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICoKKyAqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqLworCisjaWZuZGVmIF9fSU1NSU5UUklOX0gKKyNlcnJvciAiTmV2ZXIgdXNlIDx4c2F2ZWludHJpbi5oPiBkaXJlY3RseTsgaW5jbHVkZSA8aW1taW50cmluLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpZm5kZWYgX19YU0FWRUlOVFJJTl9ICisjZGVmaW5lIF9fWFNBVkVJTlRSSU5fSAorCisvKiBEZWZpbmUgdGhlIGRlZmF1bHQgYXR0cmlidXRlcyBmb3IgdGhlIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUuICovCisjZGVmaW5lIF9fREVGQVVMVF9GTl9BVFRSUyBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18sICBfX3RhcmdldF9fKCJ4c2F2ZSIpKSkKKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK194c2F2ZSh2b2lkICpfX3AsIHVuc2lnbmVkIGxvbmcgbG9uZyBfX20pIHsKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3hzYXZlKF9fcCwgX19tKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK194cnN0b3Iodm9pZCAqX19wLCB1bnNpZ25lZCBsb25nIGxvbmcgX19tKSB7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl94cnN0b3IoX19wLCBfX20pOworfQorCisjaWZkZWYgX194ODZfNjRfXworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK194c2F2ZTY0KHZvaWQgKl9fcCwgdW5zaWduZWQgbG9uZyBsb25nIF9fbSkgeworICByZXR1cm4gX19idWlsdGluX2lhMzJfeHNhdmU2NChfX3AsIF9fbSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfeHJzdG9yNjQodm9pZCAqX19wLCB1bnNpZ25lZCBsb25nIGxvbmcgX19tKSB7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl94cnN0b3I2NChfX3AsIF9fbSk7Cit9CisjZW5kaWYKKworI3VuZGVmIF9fREVGQVVMVF9GTl9BVFRSUworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL3hzYXZlb3B0aW50cmluLmggYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS94c2F2ZW9wdGludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZmFhZTcKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS94c2F2ZW9wdGludHJpbi5oCkBAIC0wLDAgKzEsNDggQEAKKy8qPT09LS0tLSB4c2F2ZW9wdGludHJpbi5oIC0gWFNBVkVPUFQgaW50cmluc2ljIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqCisgKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisgKi8KKworI2lmbmRlZiBfX0lNTUlOVFJJTl9ICisjZXJyb3IgIk5ldmVyIHVzZSA8eHNhdmVvcHRpbnRyaW4uaD4gZGlyZWN0bHk7IGluY2x1ZGUgPGltbWludHJpbi5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9fWFNBVkVPUFRJTlRSSU5fSAorI2RlZmluZSBfX1hTQVZFT1BUSU5UUklOX0gKKworLyogRGVmaW5lIHRoZSBkZWZhdWx0IGF0dHJpYnV0ZXMgZm9yIHRoZSBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlLiAqLworI2RlZmluZSBfX0RFRkFVTFRfRk5fQVRUUlMgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fLCAgX190YXJnZXRfXygieHNhdmVvcHQiKSkpCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfeHNhdmVvcHQodm9pZCAqX19wLCB1bnNpZ25lZCBsb25nIGxvbmcgX19tKSB7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl94c2F2ZW9wdChfX3AsIF9fbSk7Cit9CisKKyNpZmRlZiBfX3g4Nl82NF9fCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX3hzYXZlb3B0NjQodm9pZCAqX19wLCB1bnNpZ25lZCBsb25nIGxvbmcgX19tKSB7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl94c2F2ZW9wdDY0KF9fcCwgX19tKTsKK30KKyNlbmRpZgorCisjdW5kZWYgX19ERUZBVUxUX0ZOX0FUVFJTCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUveHNhdmVzaW50cmluLmggYi9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS94c2F2ZXNpbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWU1NDBhCi0tLSAvZGV2L251bGwKKysrIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUveHNhdmVzaW50cmluLmgKQEAgLTAsMCArMSw1OCBAQAorLyo9PT0tLS0tIHhzYXZlc2ludHJpbi5oIC0gWFNBVkVTIGludHJpbnNpYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKgorICo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICovCisKKyNpZm5kZWYgX19JTU1JTlRSSU5fSAorI2Vycm9yICJOZXZlciB1c2UgPHhzYXZlc2ludHJpbi5oPiBkaXJlY3RseTsgaW5jbHVkZSA8aW1taW50cmluLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpZm5kZWYgX19YU0FWRVNJTlRSSU5fSAorI2RlZmluZSBfX1hTQVZFU0lOVFJJTl9ICisKKy8qIERlZmluZSB0aGUgZGVmYXVsdCBhdHRyaWJ1dGVzIGZvciB0aGUgZnVuY3Rpb25zIGluIHRoaXMgZmlsZS4gKi8KKyNkZWZpbmUgX19ERUZBVUxUX0ZOX0FUVFJTIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXywgIF9fdGFyZ2V0X18oInhzYXZlcyIpKSkKKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK194c2F2ZXModm9pZCAqX19wLCB1bnNpZ25lZCBsb25nIGxvbmcgX19tKSB7CisgIF9fYnVpbHRpbl9pYTMyX3hzYXZlcyhfX3AsIF9fbSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19ERUZBVUxUX0ZOX0FUVFJTCitfeHJzdG9ycyh2b2lkICpfX3AsIHVuc2lnbmVkIGxvbmcgbG9uZyBfX20pIHsKKyAgX19idWlsdGluX2lhMzJfeHJzdG9ycyhfX3AsIF9fbSk7Cit9CisKKyNpZmRlZiBfX3g4Nl82NF9fCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fREVGQVVMVF9GTl9BVFRSUworX3hyc3RvcnM2NCh2b2lkICpfX3AsIHVuc2lnbmVkIGxvbmcgbG9uZyBfX20pIHsKKyAgX19idWlsdGluX2lhMzJfeHJzdG9yczY0KF9fcCwgX19tKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0RFRkFVTFRfRk5fQVRUUlMKK194c2F2ZXM2NCh2b2lkICpfX3AsIHVuc2lnbmVkIGxvbmcgbG9uZyBfX20pIHsKKyAgX19idWlsdGluX2lhMzJfeHNhdmVzNjQoX19wLCBfX20pOworfQorI2VuZGlmCisKKyN1bmRlZiBfX0RFRkFVTFRfRk5fQVRUUlMKKworI2VuZGlmCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvY2xhbmctaW5jbHVkZS94dGVzdGludHJpbi5oIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUveHRlc3RpbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDMzNzhmCi0tLSAvZGV2L251bGwKKysrIGIvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUveHRlc3RpbnRyaW4uaApAQCAtMCwwICsxLDQxIEBACisvKj09PS0tLS0geHRlc3RpbnRyaW4uaCAtIFhURVNUIGludHJpbnNpYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKgorICo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICovCisKKyNpZm5kZWYgX19JTU1JTlRSSU5fSAorI2Vycm9yICJOZXZlciB1c2UgPHh0ZXN0aW50cmluLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxpbW1pbnRyaW4uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmbmRlZiBfX1hURVNUSU5UUklOX0gKKyNkZWZpbmUgX19YVEVTVElOVFJJTl9ICisKKy8qIHh0ZXN0IHJldHVybnMgbm9uLXplcm8gaWYgdGhlIGluc3RydWN0aW9uIGlzIGV4ZWN1dGVkIHdpdGhpbiBhbiBSVE0gb3IgYWN0aXZlCisgKiBITEUgcmVnaW9uLiAqLworLyogRklYTUU6IFRoaXMgY2FuIGJlIGFuIGVpdGhlciBvciBmb3IgUlRNL0hMRS4gRGVhbCB3aXRoIHRoaXMgd2hlbiBITEUgaXMKKyAqIHN1cHBvcnRlZC4gKi8KK3N0YXRpYyBfX2lubGluZV9fIGludAorICAgIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXywgX190YXJnZXRfXygicnRtIikpKQorICAgIF94dGVzdCh2b2lkKSB7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl94dGVzdCgpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3JlbmRlcnNjcmlwdC9pbmNsdWRlL3JzX2FsbG9jYXRpb25fY3JlYXRlLnJzaCBiL3JlbmRlcnNjcmlwdC9pbmNsdWRlL3JzX2FsbG9jYXRpb25fY3JlYXRlLnJzaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2Y5ZmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvcmVuZGVyc2NyaXB0L2luY2x1ZGUvcnNfYWxsb2NhdGlvbl9jcmVhdGUucnNoCkBAIC0wLDAgKzEsMTM0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIERvbid0IGVkaXQgdGhpcyBmaWxlISAgSXQgaXMgYXV0by1nZW5lcmF0ZWQgYnkgZnJhbWV3b3Jrcy9ycy9hcGkvZ2VuZXJhdGUuc2guCisKKy8qCisgKiByc19hbGxvY2F0aW9uX2NyZWF0ZS5yc2g6IEFsbG9jYXRpb24gQ3JlYXRpb24gRnVuY3Rpb25zCisgKgorICogVGhlIGZ1bmN0aW9ucyBiZWxvdyBjYW4gYmUgdXNlZCB0byBjcmVhdGUgQWxsb2NhdGlvbnMgZnJvbSBhIFNjcmlwdC4KKyAqCisgKiBUaGVzZSBmdW5jdGlvbnMgY2FuIGJlIGNhbGxlZCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGZyb20gYW4gaW52b2thYmxlCisgKiBmdW5jdGlvbi4gIElmIHNvbWUgY29udHJvbC1mbG93IHBhdGggY2FuIHJlc3VsdCBpbiBhIGNhbGwgdG8gdGhlc2UgZnVuY3Rpb25zCisgKiBmcm9tIGEgUmVuZGVyU2NyaXB0IGtlcm5lbCBmdW5jdGlvbiwgYSBjb21waWxlciBlcnJvciB3aWxsIGJlIGdlbmVyYXRlZC4KKyAqLworCisjaWZuZGVmIFJFTkRFUlNDUklQVF9SU19BTExPQ0FUSU9OX0NSRUFURV9SU0gKKyNkZWZpbmUgUkVOREVSU0NSSVBUX1JTX0FMTE9DQVRJT05fQ1JFQVRFX1JTSAorCisvKgorICogcnNDcmVhdGVFbGVtZW50OiBDcmVhdGVzIGFuIHJzX2VsZW1lbnQgb2JqZWN0IG9mIHRoZSBzcGVjaWZpZWQgZGF0YSB0eXBlCisgKgorICogIENyZWF0ZXMgYW4gcnNfZWxlbWVudCBvYmplY3Qgb2YgdGhlIHNwZWNpZmllZCBkYXRhIHR5cGUuICBUaGUgZGF0YSBraW5kIG9mCisgKiAgdGhlIEVsZW1lbnQgd2lsbCBiZSBzZXQgdG8gUlNfS0lORF9VU0VSIGFuZCB2ZWN0b3Jfd2lkdGggd2lsbCBiZSBzZXQgdG8gMSwKKyAqICBpbmRpY2F0aW5nIG5vbi12ZWN0b3IuCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgZGF0YV90eXBlOiBEYXRhIHR5cGUgb2YgdGhlIEVsZW1lbnQKKyAqLworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiByc19lbGVtZW50IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDcmVhdGVFbGVtZW50KHJzX2RhdGFfdHlwZSBkYXRhX3R5cGUpOworI2VuZGlmCisKKy8qCisgKiByc0NyZWF0ZVZlY3RvckVsZW1lbnQ6IENyZWF0ZXMgYW4gcnNfZWxlbWVudCBvYmplY3Qgb2YgdGhlIHNwZWNpZmllZCBkYXRhIHR5cGUgYW5kIHZlY3RvciB3aWR0aAorICoKKyAqICBDcmVhdGVzIGFuIHJzX2VsZW1lbnQgb2JqZWN0IG9mIHRoZSBzcGVjaWZpZWQgZGF0YSB0eXBlIGFuZCB2ZWN0b3Igd2lkdGguCisgKiAgVmFsdWUgb2YgdmVjdG9yX3dpZHRoIG11c3QgYmUgMiwgMyBvciA0LiAgVGhlIGRhdGEga2luZCBvZiB0aGUgRWxlbWVudCB3aWxsCisgKiAgYmUgc2V0IHRvIFJTX0tJTkRfVVNFUi4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICBkYXRhX3R5cGU6IERhdGEgdHlwZSBvZiB0aGUgRWxlbWVudAorICogICB2ZWN0b3Jfd2lkdGg6IFZlY3RvciB3aWR0aCAoZWl0aGVyIDIsIDMsIG9yIDQpCisgKi8KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gcnNfZWxlbWVudCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlVmVjdG9yRWxlbWVudChyc19kYXRhX3R5cGUgZGF0YV90eXBlLCB1aW50MzJfdCB2ZWN0b3Jfd2lkdGgpOworI2VuZGlmCisKKy8qCisgKiByc0NyZWF0ZVBpeGVsRWxlbWVudDogQ3JlYXRlcyBhbiByc19lbGVtZW50IG9iamVjdCBvZiB0aGUgc3BlY2lmaWVkIGRhdGEgdHlwZSBhbmQgZGF0YSBraW5kCisgKgorICogIENyZWF0ZXMgYW4gcnNfZWxlbWVudCBvYmplY3Qgb2YgdGhlIHNwZWNpZmllZCBkYXRhIHR5cGUgYW5kIGRhdGEga2luZC4gIFRoZQorICogIHZlY3Rvcl93aWR0aCBvZiB0aGUgRWxlbWVudCB3aWxsIGJlIHNldCB0byAxLCBpbmRpY2F0aW5nIG5vbi12ZWN0b3IuCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgZGF0YV90eXBlOiBEYXRhIHR5cGUgb2YgdGhlIEVsZW1lbnQKKyAqICAgZGF0YV9raW5kOiBEYXRhIGtpbmQgb2YgdGhlIEVsZW1lbnQKKyAqLworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiByc19lbGVtZW50IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDcmVhdGVQaXhlbEVsZW1lbnQocnNfZGF0YV90eXBlIGRhdGFfdHlwZSwgcnNfZGF0YV9raW5kIGRhdGFfa2luZCk7CisjZW5kaWYKKworLyoKKyAqIHJzQ3JlYXRlVHlwZTogQ3JlYXRlcyBhbiByc190eXBlIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgRWxlbWVudCBhbmQgc2hhcGUgYXR0cmlidXRlcworICoKKyAqICBDcmVhdGVzIGFuIHJzX3R5cGUgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBFbGVtZW50IGFuZCBzaGFwZSBhdHRyaWJ1dGVzLgorICoKKyAqICBkaW1YIHNwZWNpZmllcyB0aGUgc2l6ZSBvZiB0aGUgWCBkaW1lbnNpb24uCisgKgorICogIGRpbVksIGlmIHByZXNlbnQgYW5kIG5vbi16ZXJvLCBpbmRpY2F0ZXMgdGhhdCB0aGUgWSBkaW1lbnNpb24gaXMgcHJlc2VudCBhbmQKKyAqICBpbmRpY2F0ZXMgaXRzIHNpemUuCisgKgorICogIGRpbVosIGlmIHByZXNlbnQgYW5kIG5vbi16ZXJvLCBpbmRpY2F0ZXMgdGhhdCB0aGUgWiBkaW1lbnNpb24gaXMgcHJlc2VudCBhbmQKKyAqICBpbmRpY2F0ZXMgaXRzIHNpemUuCisgKgorICogIG1pcG1hcHMgaW5kaWNhdGVzIHRoZSBwcmVzZW5jZSBvZiBsZXZlbCBvZiBkZXRhaWwgKExPRCkuCisgKgorICogIGZhY2VzIGluZGljYXRlcyB0aGUgIHByZXNlbmNlIG9mIGN1YmVtYXAgZmFjZXMuCisgKgorICogIHl1dl9mb3JtYXQgaW5kaWNhdGVzIHRoZSBhc3NvY2lhdGVkIFlVViBmb3JtYXQgKG9yIFJTX1lVVl9OT05FKS4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICBlbGVtZW50OiBFbGVtZW50IHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgVHlwZQorICogICBkaW1YOiBTaXplIGFsb25nIHRoZSBYIGRpbWVuc2lvbgorICogICBkaW1ZOiBTaXplIGFsb25nIHRoZSBZIGRpbWVuc2lvbgorICogICBkaW1aOiBTaXplIGFsb25nIHRoZSBaIGRpbWVuc2lvbgorICogICBtaXBtYXBzOiBGbGFnIGluZGljYXRpbmcgaWYgdGhlIFR5cGUgaGFzIGEgbWlwbWFwIGNoYWluCisgKiAgIGZhY2VzOiBGbGFnIGluZGljYXRpbmcgaWYgdGhlIFR5cGUgaXMgYSBjdWJlbWFwCisgKiAgIHl1dl9mb3JtYXQ6IFlVViBsYXlvdXQgZm9yIHRoZSBUeXBlCisgKi8KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gcnNfdHlwZSBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlVHlwZShyc19lbGVtZW50IGVsZW1lbnQsIHVpbnQzMl90IGRpbVgsIHVpbnQzMl90IGRpbVksIHVpbnQzMl90IGRpbVosIGJvb2wgbWlwbWFwcywKKyAgICAgICAgICAgICAgICAgYm9vbCBmYWNlcywgcnNfeXV2X2Zvcm1hdCB5dXZfZm9ybWF0KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIHJzX3R5cGUgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NyZWF0ZVR5cGUocnNfZWxlbWVudCBlbGVtZW50LCB1aW50MzJfdCBkaW1YLCB1aW50MzJfdCBkaW1ZLCB1aW50MzJfdCBkaW1aKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIHJzX3R5cGUgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NyZWF0ZVR5cGUocnNfZWxlbWVudCBlbGVtZW50LCB1aW50MzJfdCBkaW1YLCB1aW50MzJfdCBkaW1ZKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIHJzX3R5cGUgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NyZWF0ZVR5cGUocnNfZWxlbWVudCBlbGVtZW50LCB1aW50MzJfdCBkaW1YKTsKKyNlbmRpZgorCisvKgorICogcnNDcmVhdGVBbGxvY2F0aW9uOiBDcmVhdGUgYW4gcnNfYWxsb2NhdGlvbiBvYmplY3Qgb2YgZ2l2ZW4gVHlwZS4KKyAqCisgKiAgQ3JlYXRlcyBhbiByc19hbGxvY2F0aW9uIG9iamVjdCBvZiB0aGUgZ2l2ZW4gVHlwZSBhbmQgdXNhZ2UuCisgKgorICogIFJTX0FMTE9DQVRJT05fVVNBR0VfU0NSSVBUIGFuZCBSU19BTExPQ0FUSU9OX1VTQUdFX0dSQVBISUNTX1RFWFRVUkUgYXJlIHRoZQorICogIG9ubHkgc3VwcG9ydGVkIHVzYWdlIGZsYWdzIGZvciBBbGxvY2F0aW9ucyBjcmVhdGVkIGZyb20gd2l0aGluIGEgUmVuZGVyU2NyaXB0CisgKiAgU2NyaXB0LgorICoKKyAqICBZb3UgY2FuIGFsc28gdXNlIHJzQ3JlYXRlQWxsb2NhdGlvbl8gd3JhcHBlciBmdW5jdGlvbnMgdG8gZGlyZWN0bHkKKyAqICBjcmVhdGUgQWxsb2NhdGlvbnMgb2Ygc2NhbGFyIGFuZCB2ZWN0b3IgbnVtZXJpY2FsIHR5cGVzIHdpdGhvdXQgY3JlYXRpbmcKKyAqICBpbnRlcm1lZGlhdGUgcnNfZWxlbWVudCBvciByc190eXBlIG9iamVjdHMuCisgKgorICogIEUuZy4gcnNDcmVhdGVBbGxvY2F0aW9uX2ludDQoKSByZXR1cm5zIGFuIEFsbG9jYXRpb24gb2YgaW50NCBkYXRhIHR5cGUgb2YKKyAqICBzcGVjaWZpZWQgZGltZW5zaW9ucy4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICB0eXBlOiBUeXBlIG9mIHRoZSBBbGxvY2F0aW9uCisgKiAgIHVzYWdlOiBVc2FnZSBmbGFnIGZvciB0aGUgYWxsb2NhdGlvbgorICovCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIHJzX2FsbG9jYXRpb24gX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NyZWF0ZUFsbG9jYXRpb24ocnNfdHlwZSB0eXBlLCB1aW50MzJfdCB1c2FnZSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiByc19hbGxvY2F0aW9uIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDcmVhdGVBbGxvY2F0aW9uKHJzX3R5cGUgdHlwZSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl9oYWxmKHVpbnQzMl90IGRpbVgsIHVpbnQzMl90IGRpbVksIHVpbnQzMl90IGRpbVopIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVFbGVtZW50KFJTX1RZUEVfRkxPQVRfMTYpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCwgZGltWSwgZGltWik7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl9mbG9hdCh1aW50MzJfdCBkaW1YLCB1aW50MzJfdCBkaW1ZLCB1aW50MzJfdCBkaW1aKSB7CisgICAgIHJzX2VsZW1lbnQgZSA9IHJzQ3JlYXRlRWxlbWVudChSU19UWVBFX0ZMT0FUXzMyKTsKKyAgICAgcnNfdHlwZSB0ID0gcnNDcmVhdGVUeXBlKGUsIGRpbVgsIGRpbVksIGRpbVopOworICAgICByZXR1cm4gcnNDcmVhdGVBbGxvY2F0aW9uKHQpOworfQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitzdGF0aWMgaW5saW5lIHJzX2FsbG9jYXRpb24gX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NyZWF0ZUFsbG9jYXRpb25fZG91YmxlKHVpbnQzMl90IGRpbVgsIHVpbnQzMl90IGRpbVksIHVpbnQzMl90IGRpbVopIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVFbGVtZW50KFJTX1RZUEVfRkxPQVRfNjQpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCwgZGltWSwgZGltWik7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl9jaGFyKHVpbnQzMl90IGRpbVgsIHVpbnQzMl90IGRpbVksIHVpbnQzMl90IGRpbVopIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVFbGVtZW50KFJTX1RZUEVfU0lHTkVEXzgpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCwgZGltWSwgZGltWik7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl91Y2hhcih1aW50MzJfdCBkaW1YLCB1aW50MzJfdCBkaW1ZLCB1aW50MzJfdCBkaW1aKSB7CisgICAgIHJzX2VsZW1lbnQgZSA9IHJzQ3JlYXRlRWxlbWVudChSU19UWVBFX1VOU0lHTkVEXzgpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCwgZGltWSwgZGltWik7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl9zaG9ydCh1aW50MzJfdCBkaW1YLCB1aW50MzJfdCBkaW1ZLCB1aW50MzJfdCBkaW1aKSB7CisgICAgIHJzX2VsZW1lbnQgZSA9IHJzQ3JlYXRlRWxlbWVudChSU19UWVBFX1NJR05FRF8xNik7CisgICAgIHJzX3R5cGUgdCA9IHJzQ3JlYXRlVHlwZShlLCBkaW1YLCBkaW1ZLCBkaW1aKTsKKyAgICAgcmV0dXJuIHJzQ3JlYXRlQWxsb2NhdGlvbih0KTsKK30KKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorc3RhdGljIGlubGluZSByc19hbGxvY2F0aW9uIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDcmVhdGVBbGxvY2F0aW9uX3VzaG9ydCh1aW50MzJfdCBkaW1YLCB1aW50MzJfdCBkaW1ZLCB1aW50MzJfdCBkaW1aKSB7CisgICAgIHJzX2VsZW1lbnQgZSA9IHJzQ3JlYXRlRWxlbWVudChSU19UWVBFX1VOU0lHTkVEXzE2KTsKKyAgICAgcnNfdHlwZSB0ID0gcnNDcmVhdGVUeXBlKGUsIGRpbVgsIGRpbVksIGRpbVopOworICAgICByZXR1cm4gcnNDcmVhdGVBbGxvY2F0aW9uKHQpOworfQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitzdGF0aWMgaW5saW5lIHJzX2FsbG9jYXRpb24gX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NyZWF0ZUFsbG9jYXRpb25faW50KHVpbnQzMl90IGRpbVgsIHVpbnQzMl90IGRpbVksIHVpbnQzMl90IGRpbVopIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVFbGVtZW50KFJTX1RZUEVfU0lHTkVEXzMyKTsKKyAgICAgcnNfdHlwZSB0ID0gcnNDcmVhdGVUeXBlKGUsIGRpbVgsIGRpbVksIGRpbVopOworICAgICByZXR1cm4gcnNDcmVhdGVBbGxvY2F0aW9uKHQpOworfQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitzdGF0aWMgaW5saW5lIHJzX2FsbG9jYXRpb24gX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NyZWF0ZUFsbG9jYXRpb25fdWludCh1aW50MzJfdCBkaW1YLCB1aW50MzJfdCBkaW1ZLCB1aW50MzJfdCBkaW1aKSB7CisgICAgIHJzX2VsZW1lbnQgZSA9IHJzQ3JlYXRlRWxlbWVudChSU19UWVBFX1VOU0lHTkVEXzMyKTsKKyAgICAgcnNfdHlwZSB0ID0gcnNDcmVhdGVUeXBlKGUsIGRpbVgsIGRpbVksIGRpbVopOworICAgICByZXR1cm4gcnNDcmVhdGVBbGxvY2F0aW9uKHQpOworfQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitzdGF0aWMgaW5saW5lIHJzX2FsbG9jYXRpb24gX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NyZWF0ZUFsbG9jYXRpb25fbG9uZyh1aW50MzJfdCBkaW1YLCB1aW50MzJfdCBkaW1ZLCB1aW50MzJfdCBkaW1aKSB7CisgICAgIHJzX2VsZW1lbnQgZSA9IHJzQ3JlYXRlRWxlbWVudChSU19UWVBFX1NJR05FRF82NCk7CisgICAgIHJzX3R5cGUgdCA9IHJzQ3JlYXRlVHlwZShlLCBkaW1YLCBkaW1ZLCBkaW1aKTsKKyAgICAgcmV0dXJuIHJzQ3JlYXRlQWxsb2NhdGlvbih0KTsKK30KKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorc3RhdGljIGlubGluZSByc19hbGxvY2F0aW9uIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDcmVhdGVBbGxvY2F0aW9uX3Vsb25nKHVpbnQzMl90IGRpbVgsIHVpbnQzMl90IGRpbVksIHVpbnQzMl90IGRpbVopIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVFbGVtZW50KFJTX1RZUEVfVU5TSUdORURfNjQpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCwgZGltWSwgZGltWik7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl9oYWxmMih1aW50MzJfdCBkaW1YLCB1aW50MzJfdCBkaW1ZLCB1aW50MzJfdCBkaW1aKSB7CisgICAgIHJzX2VsZW1lbnQgZSA9IHJzQ3JlYXRlVmVjdG9yRWxlbWVudChSU19UWVBFX0ZMT0FUXzE2LCAyKTsKKyAgICAgcnNfdHlwZSB0ID0gcnNDcmVhdGVUeXBlKGUsIGRpbVgsIGRpbVksIGRpbVopOworICAgICByZXR1cm4gcnNDcmVhdGVBbGxvY2F0aW9uKHQpOworfQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitzdGF0aWMgaW5saW5lIHJzX2FsbG9jYXRpb24gX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NyZWF0ZUFsbG9jYXRpb25faGFsZjModWludDMyX3QgZGltWCwgdWludDMyX3QgZGltWSwgdWludDMyX3QgZGltWikgeworICAgICByc19lbGVtZW50IGUgPSByc0NyZWF0ZVZlY3RvckVsZW1lbnQoUlNfVFlQRV9GTE9BVF8xNiwgMyk7CisgICAgIHJzX3R5cGUgdCA9IHJzQ3JlYXRlVHlwZShlLCBkaW1YLCBkaW1ZLCBkaW1aKTsKKyAgICAgcmV0dXJuIHJzQ3JlYXRlQWxsb2NhdGlvbih0KTsKK30KKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorc3RhdGljIGlubGluZSByc19hbGxvY2F0aW9uIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDcmVhdGVBbGxvY2F0aW9uX2hhbGY0KHVpbnQzMl90IGRpbVgsIHVpbnQzMl90IGRpbVksIHVpbnQzMl90IGRpbVopIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVWZWN0b3JFbGVtZW50KFJTX1RZUEVfRkxPQVRfMTYsIDQpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCwgZGltWSwgZGltWik7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl9mbG9hdDIodWludDMyX3QgZGltWCwgdWludDMyX3QgZGltWSwgdWludDMyX3QgZGltWikgeworICAgICByc19lbGVtZW50IGUgPSByc0NyZWF0ZVZlY3RvckVsZW1lbnQoUlNfVFlQRV9GTE9BVF8zMiwgMik7CisgICAgIHJzX3R5cGUgdCA9IHJzQ3JlYXRlVHlwZShlLCBkaW1YLCBkaW1ZLCBkaW1aKTsKKyAgICAgcmV0dXJuIHJzQ3JlYXRlQWxsb2NhdGlvbih0KTsKK30KKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorc3RhdGljIGlubGluZSByc19hbGxvY2F0aW9uIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDcmVhdGVBbGxvY2F0aW9uX2Zsb2F0Myh1aW50MzJfdCBkaW1YLCB1aW50MzJfdCBkaW1ZLCB1aW50MzJfdCBkaW1aKSB7CisgICAgIHJzX2VsZW1lbnQgZSA9IHJzQ3JlYXRlVmVjdG9yRWxlbWVudChSU19UWVBFX0ZMT0FUXzMyLCAzKTsKKyAgICAgcnNfdHlwZSB0ID0gcnNDcmVhdGVUeXBlKGUsIGRpbVgsIGRpbVksIGRpbVopOworICAgICByZXR1cm4gcnNDcmVhdGVBbGxvY2F0aW9uKHQpOworfQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitzdGF0aWMgaW5saW5lIHJzX2FsbG9jYXRpb24gX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NyZWF0ZUFsbG9jYXRpb25fZmxvYXQ0KHVpbnQzMl90IGRpbVgsIHVpbnQzMl90IGRpbVksIHVpbnQzMl90IGRpbVopIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVWZWN0b3JFbGVtZW50KFJTX1RZUEVfRkxPQVRfMzIsIDQpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCwgZGltWSwgZGltWik7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl9kb3VibGUyKHVpbnQzMl90IGRpbVgsIHVpbnQzMl90IGRpbVksIHVpbnQzMl90IGRpbVopIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVWZWN0b3JFbGVtZW50KFJTX1RZUEVfRkxPQVRfNjQsIDIpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCwgZGltWSwgZGltWik7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl9kb3VibGUzKHVpbnQzMl90IGRpbVgsIHVpbnQzMl90IGRpbVksIHVpbnQzMl90IGRpbVopIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVWZWN0b3JFbGVtZW50KFJTX1RZUEVfRkxPQVRfNjQsIDMpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCwgZGltWSwgZGltWik7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl9kb3VibGU0KHVpbnQzMl90IGRpbVgsIHVpbnQzMl90IGRpbVksIHVpbnQzMl90IGRpbVopIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVWZWN0b3JFbGVtZW50KFJTX1RZUEVfRkxPQVRfNjQsIDQpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCwgZGltWSwgZGltWik7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl9jaGFyMih1aW50MzJfdCBkaW1YLCB1aW50MzJfdCBkaW1ZLCB1aW50MzJfdCBkaW1aKSB7CisgICAgIHJzX2VsZW1lbnQgZSA9IHJzQ3JlYXRlVmVjdG9yRWxlbWVudChSU19UWVBFX1NJR05FRF84LCAyKTsKKyAgICAgcnNfdHlwZSB0ID0gcnNDcmVhdGVUeXBlKGUsIGRpbVgsIGRpbVksIGRpbVopOworICAgICByZXR1cm4gcnNDcmVhdGVBbGxvY2F0aW9uKHQpOworfQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitzdGF0aWMgaW5saW5lIHJzX2FsbG9jYXRpb24gX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NyZWF0ZUFsbG9jYXRpb25fY2hhcjModWludDMyX3QgZGltWCwgdWludDMyX3QgZGltWSwgdWludDMyX3QgZGltWikgeworICAgICByc19lbGVtZW50IGUgPSByc0NyZWF0ZVZlY3RvckVsZW1lbnQoUlNfVFlQRV9TSUdORURfOCwgMyk7CisgICAgIHJzX3R5cGUgdCA9IHJzQ3JlYXRlVHlwZShlLCBkaW1YLCBkaW1ZLCBkaW1aKTsKKyAgICAgcmV0dXJuIHJzQ3JlYXRlQWxsb2NhdGlvbih0KTsKK30KKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorc3RhdGljIGlubGluZSByc19hbGxvY2F0aW9uIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDcmVhdGVBbGxvY2F0aW9uX2NoYXI0KHVpbnQzMl90IGRpbVgsIHVpbnQzMl90IGRpbVksIHVpbnQzMl90IGRpbVopIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVWZWN0b3JFbGVtZW50KFJTX1RZUEVfU0lHTkVEXzgsIDQpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCwgZGltWSwgZGltWik7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl91Y2hhcjIodWludDMyX3QgZGltWCwgdWludDMyX3QgZGltWSwgdWludDMyX3QgZGltWikgeworICAgICByc19lbGVtZW50IGUgPSByc0NyZWF0ZVZlY3RvckVsZW1lbnQoUlNfVFlQRV9VTlNJR05FRF84LCAyKTsKKyAgICAgcnNfdHlwZSB0ID0gcnNDcmVhdGVUeXBlKGUsIGRpbVgsIGRpbVksIGRpbVopOworICAgICByZXR1cm4gcnNDcmVhdGVBbGxvY2F0aW9uKHQpOworfQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitzdGF0aWMgaW5saW5lIHJzX2FsbG9jYXRpb24gX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NyZWF0ZUFsbG9jYXRpb25fdWNoYXIzKHVpbnQzMl90IGRpbVgsIHVpbnQzMl90IGRpbVksIHVpbnQzMl90IGRpbVopIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVWZWN0b3JFbGVtZW50KFJTX1RZUEVfVU5TSUdORURfOCwgMyk7CisgICAgIHJzX3R5cGUgdCA9IHJzQ3JlYXRlVHlwZShlLCBkaW1YLCBkaW1ZLCBkaW1aKTsKKyAgICAgcmV0dXJuIHJzQ3JlYXRlQWxsb2NhdGlvbih0KTsKK30KKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorc3RhdGljIGlubGluZSByc19hbGxvY2F0aW9uIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDcmVhdGVBbGxvY2F0aW9uX3VjaGFyNCh1aW50MzJfdCBkaW1YLCB1aW50MzJfdCBkaW1ZLCB1aW50MzJfdCBkaW1aKSB7CisgICAgIHJzX2VsZW1lbnQgZSA9IHJzQ3JlYXRlVmVjdG9yRWxlbWVudChSU19UWVBFX1VOU0lHTkVEXzgsIDQpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCwgZGltWSwgZGltWik7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl9zaG9ydDIodWludDMyX3QgZGltWCwgdWludDMyX3QgZGltWSwgdWludDMyX3QgZGltWikgeworICAgICByc19lbGVtZW50IGUgPSByc0NyZWF0ZVZlY3RvckVsZW1lbnQoUlNfVFlQRV9TSUdORURfMTYsIDIpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCwgZGltWSwgZGltWik7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl9zaG9ydDModWludDMyX3QgZGltWCwgdWludDMyX3QgZGltWSwgdWludDMyX3QgZGltWikgeworICAgICByc19lbGVtZW50IGUgPSByc0NyZWF0ZVZlY3RvckVsZW1lbnQoUlNfVFlQRV9TSUdORURfMTYsIDMpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCwgZGltWSwgZGltWik7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl9zaG9ydDQodWludDMyX3QgZGltWCwgdWludDMyX3QgZGltWSwgdWludDMyX3QgZGltWikgeworICAgICByc19lbGVtZW50IGUgPSByc0NyZWF0ZVZlY3RvckVsZW1lbnQoUlNfVFlQRV9TSUdORURfMTYsIDQpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCwgZGltWSwgZGltWik7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl91c2hvcnQyKHVpbnQzMl90IGRpbVgsIHVpbnQzMl90IGRpbVksIHVpbnQzMl90IGRpbVopIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVWZWN0b3JFbGVtZW50KFJTX1RZUEVfVU5TSUdORURfMTYsIDIpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCwgZGltWSwgZGltWik7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl91c2hvcnQzKHVpbnQzMl90IGRpbVgsIHVpbnQzMl90IGRpbVksIHVpbnQzMl90IGRpbVopIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVWZWN0b3JFbGVtZW50KFJTX1RZUEVfVU5TSUdORURfMTYsIDMpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCwgZGltWSwgZGltWik7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl91c2hvcnQ0KHVpbnQzMl90IGRpbVgsIHVpbnQzMl90IGRpbVksIHVpbnQzMl90IGRpbVopIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVWZWN0b3JFbGVtZW50KFJTX1RZUEVfVU5TSUdORURfMTYsIDQpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCwgZGltWSwgZGltWik7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl9pbnQyKHVpbnQzMl90IGRpbVgsIHVpbnQzMl90IGRpbVksIHVpbnQzMl90IGRpbVopIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVWZWN0b3JFbGVtZW50KFJTX1RZUEVfU0lHTkVEXzMyLCAyKTsKKyAgICAgcnNfdHlwZSB0ID0gcnNDcmVhdGVUeXBlKGUsIGRpbVgsIGRpbVksIGRpbVopOworICAgICByZXR1cm4gcnNDcmVhdGVBbGxvY2F0aW9uKHQpOworfQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitzdGF0aWMgaW5saW5lIHJzX2FsbG9jYXRpb24gX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NyZWF0ZUFsbG9jYXRpb25faW50Myh1aW50MzJfdCBkaW1YLCB1aW50MzJfdCBkaW1ZLCB1aW50MzJfdCBkaW1aKSB7CisgICAgIHJzX2VsZW1lbnQgZSA9IHJzQ3JlYXRlVmVjdG9yRWxlbWVudChSU19UWVBFX1NJR05FRF8zMiwgMyk7CisgICAgIHJzX3R5cGUgdCA9IHJzQ3JlYXRlVHlwZShlLCBkaW1YLCBkaW1ZLCBkaW1aKTsKKyAgICAgcmV0dXJuIHJzQ3JlYXRlQWxsb2NhdGlvbih0KTsKK30KKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorc3RhdGljIGlubGluZSByc19hbGxvY2F0aW9uIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDcmVhdGVBbGxvY2F0aW9uX2ludDQodWludDMyX3QgZGltWCwgdWludDMyX3QgZGltWSwgdWludDMyX3QgZGltWikgeworICAgICByc19lbGVtZW50IGUgPSByc0NyZWF0ZVZlY3RvckVsZW1lbnQoUlNfVFlQRV9TSUdORURfMzIsIDQpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCwgZGltWSwgZGltWik7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl91aW50Mih1aW50MzJfdCBkaW1YLCB1aW50MzJfdCBkaW1ZLCB1aW50MzJfdCBkaW1aKSB7CisgICAgIHJzX2VsZW1lbnQgZSA9IHJzQ3JlYXRlVmVjdG9yRWxlbWVudChSU19UWVBFX1VOU0lHTkVEXzMyLCAyKTsKKyAgICAgcnNfdHlwZSB0ID0gcnNDcmVhdGVUeXBlKGUsIGRpbVgsIGRpbVksIGRpbVopOworICAgICByZXR1cm4gcnNDcmVhdGVBbGxvY2F0aW9uKHQpOworfQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitzdGF0aWMgaW5saW5lIHJzX2FsbG9jYXRpb24gX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NyZWF0ZUFsbG9jYXRpb25fdWludDModWludDMyX3QgZGltWCwgdWludDMyX3QgZGltWSwgdWludDMyX3QgZGltWikgeworICAgICByc19lbGVtZW50IGUgPSByc0NyZWF0ZVZlY3RvckVsZW1lbnQoUlNfVFlQRV9VTlNJR05FRF8zMiwgMyk7CisgICAgIHJzX3R5cGUgdCA9IHJzQ3JlYXRlVHlwZShlLCBkaW1YLCBkaW1ZLCBkaW1aKTsKKyAgICAgcmV0dXJuIHJzQ3JlYXRlQWxsb2NhdGlvbih0KTsKK30KKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorc3RhdGljIGlubGluZSByc19hbGxvY2F0aW9uIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDcmVhdGVBbGxvY2F0aW9uX3VpbnQ0KHVpbnQzMl90IGRpbVgsIHVpbnQzMl90IGRpbVksIHVpbnQzMl90IGRpbVopIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVWZWN0b3JFbGVtZW50KFJTX1RZUEVfVU5TSUdORURfMzIsIDQpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCwgZGltWSwgZGltWik7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl9sb25nMih1aW50MzJfdCBkaW1YLCB1aW50MzJfdCBkaW1ZLCB1aW50MzJfdCBkaW1aKSB7CisgICAgIHJzX2VsZW1lbnQgZSA9IHJzQ3JlYXRlVmVjdG9yRWxlbWVudChSU19UWVBFX1NJR05FRF82NCwgMik7CisgICAgIHJzX3R5cGUgdCA9IHJzQ3JlYXRlVHlwZShlLCBkaW1YLCBkaW1ZLCBkaW1aKTsKKyAgICAgcmV0dXJuIHJzQ3JlYXRlQWxsb2NhdGlvbih0KTsKK30KKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorc3RhdGljIGlubGluZSByc19hbGxvY2F0aW9uIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDcmVhdGVBbGxvY2F0aW9uX2xvbmczKHVpbnQzMl90IGRpbVgsIHVpbnQzMl90IGRpbVksIHVpbnQzMl90IGRpbVopIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVWZWN0b3JFbGVtZW50KFJTX1RZUEVfU0lHTkVEXzY0LCAzKTsKKyAgICAgcnNfdHlwZSB0ID0gcnNDcmVhdGVUeXBlKGUsIGRpbVgsIGRpbVksIGRpbVopOworICAgICByZXR1cm4gcnNDcmVhdGVBbGxvY2F0aW9uKHQpOworfQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitzdGF0aWMgaW5saW5lIHJzX2FsbG9jYXRpb24gX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NyZWF0ZUFsbG9jYXRpb25fbG9uZzQodWludDMyX3QgZGltWCwgdWludDMyX3QgZGltWSwgdWludDMyX3QgZGltWikgeworICAgICByc19lbGVtZW50IGUgPSByc0NyZWF0ZVZlY3RvckVsZW1lbnQoUlNfVFlQRV9TSUdORURfNjQsIDQpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCwgZGltWSwgZGltWik7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl91bG9uZzIodWludDMyX3QgZGltWCwgdWludDMyX3QgZGltWSwgdWludDMyX3QgZGltWikgeworICAgICByc19lbGVtZW50IGUgPSByc0NyZWF0ZVZlY3RvckVsZW1lbnQoUlNfVFlQRV9VTlNJR05FRF82NCwgMik7CisgICAgIHJzX3R5cGUgdCA9IHJzQ3JlYXRlVHlwZShlLCBkaW1YLCBkaW1ZLCBkaW1aKTsKKyAgICAgcmV0dXJuIHJzQ3JlYXRlQWxsb2NhdGlvbih0KTsKK30KKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorc3RhdGljIGlubGluZSByc19hbGxvY2F0aW9uIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDcmVhdGVBbGxvY2F0aW9uX3Vsb25nMyh1aW50MzJfdCBkaW1YLCB1aW50MzJfdCBkaW1ZLCB1aW50MzJfdCBkaW1aKSB7CisgICAgIHJzX2VsZW1lbnQgZSA9IHJzQ3JlYXRlVmVjdG9yRWxlbWVudChSU19UWVBFX1VOU0lHTkVEXzY0LCAzKTsKKyAgICAgcnNfdHlwZSB0ID0gcnNDcmVhdGVUeXBlKGUsIGRpbVgsIGRpbVksIGRpbVopOworICAgICByZXR1cm4gcnNDcmVhdGVBbGxvY2F0aW9uKHQpOworfQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitzdGF0aWMgaW5saW5lIHJzX2FsbG9jYXRpb24gX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NyZWF0ZUFsbG9jYXRpb25fdWxvbmc0KHVpbnQzMl90IGRpbVgsIHVpbnQzMl90IGRpbVksIHVpbnQzMl90IGRpbVopIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVWZWN0b3JFbGVtZW50KFJTX1RZUEVfVU5TSUdORURfNjQsIDQpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCwgZGltWSwgZGltWik7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl9oYWxmKHVpbnQzMl90IGRpbVgsIHVpbnQzMl90IGRpbVkpIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVFbGVtZW50KFJTX1RZUEVfRkxPQVRfMTYpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCwgZGltWSk7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl9mbG9hdCh1aW50MzJfdCBkaW1YLCB1aW50MzJfdCBkaW1ZKSB7CisgICAgIHJzX2VsZW1lbnQgZSA9IHJzQ3JlYXRlRWxlbWVudChSU19UWVBFX0ZMT0FUXzMyKTsKKyAgICAgcnNfdHlwZSB0ID0gcnNDcmVhdGVUeXBlKGUsIGRpbVgsIGRpbVkpOworICAgICByZXR1cm4gcnNDcmVhdGVBbGxvY2F0aW9uKHQpOworfQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitzdGF0aWMgaW5saW5lIHJzX2FsbG9jYXRpb24gX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NyZWF0ZUFsbG9jYXRpb25fZG91YmxlKHVpbnQzMl90IGRpbVgsIHVpbnQzMl90IGRpbVkpIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVFbGVtZW50KFJTX1RZUEVfRkxPQVRfNjQpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCwgZGltWSk7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl9jaGFyKHVpbnQzMl90IGRpbVgsIHVpbnQzMl90IGRpbVkpIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVFbGVtZW50KFJTX1RZUEVfU0lHTkVEXzgpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCwgZGltWSk7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl91Y2hhcih1aW50MzJfdCBkaW1YLCB1aW50MzJfdCBkaW1ZKSB7CisgICAgIHJzX2VsZW1lbnQgZSA9IHJzQ3JlYXRlRWxlbWVudChSU19UWVBFX1VOU0lHTkVEXzgpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCwgZGltWSk7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl9zaG9ydCh1aW50MzJfdCBkaW1YLCB1aW50MzJfdCBkaW1ZKSB7CisgICAgIHJzX2VsZW1lbnQgZSA9IHJzQ3JlYXRlRWxlbWVudChSU19UWVBFX1NJR05FRF8xNik7CisgICAgIHJzX3R5cGUgdCA9IHJzQ3JlYXRlVHlwZShlLCBkaW1YLCBkaW1ZKTsKKyAgICAgcmV0dXJuIHJzQ3JlYXRlQWxsb2NhdGlvbih0KTsKK30KKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorc3RhdGljIGlubGluZSByc19hbGxvY2F0aW9uIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDcmVhdGVBbGxvY2F0aW9uX3VzaG9ydCh1aW50MzJfdCBkaW1YLCB1aW50MzJfdCBkaW1ZKSB7CisgICAgIHJzX2VsZW1lbnQgZSA9IHJzQ3JlYXRlRWxlbWVudChSU19UWVBFX1VOU0lHTkVEXzE2KTsKKyAgICAgcnNfdHlwZSB0ID0gcnNDcmVhdGVUeXBlKGUsIGRpbVgsIGRpbVkpOworICAgICByZXR1cm4gcnNDcmVhdGVBbGxvY2F0aW9uKHQpOworfQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitzdGF0aWMgaW5saW5lIHJzX2FsbG9jYXRpb24gX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NyZWF0ZUFsbG9jYXRpb25faW50KHVpbnQzMl90IGRpbVgsIHVpbnQzMl90IGRpbVkpIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVFbGVtZW50KFJTX1RZUEVfU0lHTkVEXzMyKTsKKyAgICAgcnNfdHlwZSB0ID0gcnNDcmVhdGVUeXBlKGUsIGRpbVgsIGRpbVkpOworICAgICByZXR1cm4gcnNDcmVhdGVBbGxvY2F0aW9uKHQpOworfQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitzdGF0aWMgaW5saW5lIHJzX2FsbG9jYXRpb24gX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NyZWF0ZUFsbG9jYXRpb25fdWludCh1aW50MzJfdCBkaW1YLCB1aW50MzJfdCBkaW1ZKSB7CisgICAgIHJzX2VsZW1lbnQgZSA9IHJzQ3JlYXRlRWxlbWVudChSU19UWVBFX1VOU0lHTkVEXzMyKTsKKyAgICAgcnNfdHlwZSB0ID0gcnNDcmVhdGVUeXBlKGUsIGRpbVgsIGRpbVkpOworICAgICByZXR1cm4gcnNDcmVhdGVBbGxvY2F0aW9uKHQpOworfQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitzdGF0aWMgaW5saW5lIHJzX2FsbG9jYXRpb24gX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NyZWF0ZUFsbG9jYXRpb25fbG9uZyh1aW50MzJfdCBkaW1YLCB1aW50MzJfdCBkaW1ZKSB7CisgICAgIHJzX2VsZW1lbnQgZSA9IHJzQ3JlYXRlRWxlbWVudChSU19UWVBFX1NJR05FRF82NCk7CisgICAgIHJzX3R5cGUgdCA9IHJzQ3JlYXRlVHlwZShlLCBkaW1YLCBkaW1ZKTsKKyAgICAgcmV0dXJuIHJzQ3JlYXRlQWxsb2NhdGlvbih0KTsKK30KKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorc3RhdGljIGlubGluZSByc19hbGxvY2F0aW9uIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDcmVhdGVBbGxvY2F0aW9uX3Vsb25nKHVpbnQzMl90IGRpbVgsIHVpbnQzMl90IGRpbVkpIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVFbGVtZW50KFJTX1RZUEVfVU5TSUdORURfNjQpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCwgZGltWSk7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl9oYWxmMih1aW50MzJfdCBkaW1YLCB1aW50MzJfdCBkaW1ZKSB7CisgICAgIHJzX2VsZW1lbnQgZSA9IHJzQ3JlYXRlVmVjdG9yRWxlbWVudChSU19UWVBFX0ZMT0FUXzE2LCAyKTsKKyAgICAgcnNfdHlwZSB0ID0gcnNDcmVhdGVUeXBlKGUsIGRpbVgsIGRpbVkpOworICAgICByZXR1cm4gcnNDcmVhdGVBbGxvY2F0aW9uKHQpOworfQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitzdGF0aWMgaW5saW5lIHJzX2FsbG9jYXRpb24gX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NyZWF0ZUFsbG9jYXRpb25faGFsZjModWludDMyX3QgZGltWCwgdWludDMyX3QgZGltWSkgeworICAgICByc19lbGVtZW50IGUgPSByc0NyZWF0ZVZlY3RvckVsZW1lbnQoUlNfVFlQRV9GTE9BVF8xNiwgMyk7CisgICAgIHJzX3R5cGUgdCA9IHJzQ3JlYXRlVHlwZShlLCBkaW1YLCBkaW1ZKTsKKyAgICAgcmV0dXJuIHJzQ3JlYXRlQWxsb2NhdGlvbih0KTsKK30KKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorc3RhdGljIGlubGluZSByc19hbGxvY2F0aW9uIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDcmVhdGVBbGxvY2F0aW9uX2hhbGY0KHVpbnQzMl90IGRpbVgsIHVpbnQzMl90IGRpbVkpIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVWZWN0b3JFbGVtZW50KFJTX1RZUEVfRkxPQVRfMTYsIDQpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCwgZGltWSk7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl9mbG9hdDIodWludDMyX3QgZGltWCwgdWludDMyX3QgZGltWSkgeworICAgICByc19lbGVtZW50IGUgPSByc0NyZWF0ZVZlY3RvckVsZW1lbnQoUlNfVFlQRV9GTE9BVF8zMiwgMik7CisgICAgIHJzX3R5cGUgdCA9IHJzQ3JlYXRlVHlwZShlLCBkaW1YLCBkaW1ZKTsKKyAgICAgcmV0dXJuIHJzQ3JlYXRlQWxsb2NhdGlvbih0KTsKK30KKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorc3RhdGljIGlubGluZSByc19hbGxvY2F0aW9uIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDcmVhdGVBbGxvY2F0aW9uX2Zsb2F0Myh1aW50MzJfdCBkaW1YLCB1aW50MzJfdCBkaW1ZKSB7CisgICAgIHJzX2VsZW1lbnQgZSA9IHJzQ3JlYXRlVmVjdG9yRWxlbWVudChSU19UWVBFX0ZMT0FUXzMyLCAzKTsKKyAgICAgcnNfdHlwZSB0ID0gcnNDcmVhdGVUeXBlKGUsIGRpbVgsIGRpbVkpOworICAgICByZXR1cm4gcnNDcmVhdGVBbGxvY2F0aW9uKHQpOworfQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitzdGF0aWMgaW5saW5lIHJzX2FsbG9jYXRpb24gX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NyZWF0ZUFsbG9jYXRpb25fZmxvYXQ0KHVpbnQzMl90IGRpbVgsIHVpbnQzMl90IGRpbVkpIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVWZWN0b3JFbGVtZW50KFJTX1RZUEVfRkxPQVRfMzIsIDQpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCwgZGltWSk7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl9kb3VibGUyKHVpbnQzMl90IGRpbVgsIHVpbnQzMl90IGRpbVkpIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVWZWN0b3JFbGVtZW50KFJTX1RZUEVfRkxPQVRfNjQsIDIpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCwgZGltWSk7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl9kb3VibGUzKHVpbnQzMl90IGRpbVgsIHVpbnQzMl90IGRpbVkpIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVWZWN0b3JFbGVtZW50KFJTX1RZUEVfRkxPQVRfNjQsIDMpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCwgZGltWSk7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl9kb3VibGU0KHVpbnQzMl90IGRpbVgsIHVpbnQzMl90IGRpbVkpIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVWZWN0b3JFbGVtZW50KFJTX1RZUEVfRkxPQVRfNjQsIDQpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCwgZGltWSk7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl9jaGFyMih1aW50MzJfdCBkaW1YLCB1aW50MzJfdCBkaW1ZKSB7CisgICAgIHJzX2VsZW1lbnQgZSA9IHJzQ3JlYXRlVmVjdG9yRWxlbWVudChSU19UWVBFX1NJR05FRF84LCAyKTsKKyAgICAgcnNfdHlwZSB0ID0gcnNDcmVhdGVUeXBlKGUsIGRpbVgsIGRpbVkpOworICAgICByZXR1cm4gcnNDcmVhdGVBbGxvY2F0aW9uKHQpOworfQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitzdGF0aWMgaW5saW5lIHJzX2FsbG9jYXRpb24gX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NyZWF0ZUFsbG9jYXRpb25fY2hhcjModWludDMyX3QgZGltWCwgdWludDMyX3QgZGltWSkgeworICAgICByc19lbGVtZW50IGUgPSByc0NyZWF0ZVZlY3RvckVsZW1lbnQoUlNfVFlQRV9TSUdORURfOCwgMyk7CisgICAgIHJzX3R5cGUgdCA9IHJzQ3JlYXRlVHlwZShlLCBkaW1YLCBkaW1ZKTsKKyAgICAgcmV0dXJuIHJzQ3JlYXRlQWxsb2NhdGlvbih0KTsKK30KKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorc3RhdGljIGlubGluZSByc19hbGxvY2F0aW9uIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDcmVhdGVBbGxvY2F0aW9uX2NoYXI0KHVpbnQzMl90IGRpbVgsIHVpbnQzMl90IGRpbVkpIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVWZWN0b3JFbGVtZW50KFJTX1RZUEVfU0lHTkVEXzgsIDQpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCwgZGltWSk7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl91Y2hhcjIodWludDMyX3QgZGltWCwgdWludDMyX3QgZGltWSkgeworICAgICByc19lbGVtZW50IGUgPSByc0NyZWF0ZVZlY3RvckVsZW1lbnQoUlNfVFlQRV9VTlNJR05FRF84LCAyKTsKKyAgICAgcnNfdHlwZSB0ID0gcnNDcmVhdGVUeXBlKGUsIGRpbVgsIGRpbVkpOworICAgICByZXR1cm4gcnNDcmVhdGVBbGxvY2F0aW9uKHQpOworfQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitzdGF0aWMgaW5saW5lIHJzX2FsbG9jYXRpb24gX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NyZWF0ZUFsbG9jYXRpb25fdWNoYXIzKHVpbnQzMl90IGRpbVgsIHVpbnQzMl90IGRpbVkpIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVWZWN0b3JFbGVtZW50KFJTX1RZUEVfVU5TSUdORURfOCwgMyk7CisgICAgIHJzX3R5cGUgdCA9IHJzQ3JlYXRlVHlwZShlLCBkaW1YLCBkaW1ZKTsKKyAgICAgcmV0dXJuIHJzQ3JlYXRlQWxsb2NhdGlvbih0KTsKK30KKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorc3RhdGljIGlubGluZSByc19hbGxvY2F0aW9uIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDcmVhdGVBbGxvY2F0aW9uX3VjaGFyNCh1aW50MzJfdCBkaW1YLCB1aW50MzJfdCBkaW1ZKSB7CisgICAgIHJzX2VsZW1lbnQgZSA9IHJzQ3JlYXRlVmVjdG9yRWxlbWVudChSU19UWVBFX1VOU0lHTkVEXzgsIDQpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCwgZGltWSk7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl9zaG9ydDIodWludDMyX3QgZGltWCwgdWludDMyX3QgZGltWSkgeworICAgICByc19lbGVtZW50IGUgPSByc0NyZWF0ZVZlY3RvckVsZW1lbnQoUlNfVFlQRV9TSUdORURfMTYsIDIpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCwgZGltWSk7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl9zaG9ydDModWludDMyX3QgZGltWCwgdWludDMyX3QgZGltWSkgeworICAgICByc19lbGVtZW50IGUgPSByc0NyZWF0ZVZlY3RvckVsZW1lbnQoUlNfVFlQRV9TSUdORURfMTYsIDMpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCwgZGltWSk7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl9zaG9ydDQodWludDMyX3QgZGltWCwgdWludDMyX3QgZGltWSkgeworICAgICByc19lbGVtZW50IGUgPSByc0NyZWF0ZVZlY3RvckVsZW1lbnQoUlNfVFlQRV9TSUdORURfMTYsIDQpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCwgZGltWSk7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl91c2hvcnQyKHVpbnQzMl90IGRpbVgsIHVpbnQzMl90IGRpbVkpIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVWZWN0b3JFbGVtZW50KFJTX1RZUEVfVU5TSUdORURfMTYsIDIpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCwgZGltWSk7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl91c2hvcnQzKHVpbnQzMl90IGRpbVgsIHVpbnQzMl90IGRpbVkpIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVWZWN0b3JFbGVtZW50KFJTX1RZUEVfVU5TSUdORURfMTYsIDMpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCwgZGltWSk7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl91c2hvcnQ0KHVpbnQzMl90IGRpbVgsIHVpbnQzMl90IGRpbVkpIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVWZWN0b3JFbGVtZW50KFJTX1RZUEVfVU5TSUdORURfMTYsIDQpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCwgZGltWSk7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl9pbnQyKHVpbnQzMl90IGRpbVgsIHVpbnQzMl90IGRpbVkpIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVWZWN0b3JFbGVtZW50KFJTX1RZUEVfU0lHTkVEXzMyLCAyKTsKKyAgICAgcnNfdHlwZSB0ID0gcnNDcmVhdGVUeXBlKGUsIGRpbVgsIGRpbVkpOworICAgICByZXR1cm4gcnNDcmVhdGVBbGxvY2F0aW9uKHQpOworfQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitzdGF0aWMgaW5saW5lIHJzX2FsbG9jYXRpb24gX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NyZWF0ZUFsbG9jYXRpb25faW50Myh1aW50MzJfdCBkaW1YLCB1aW50MzJfdCBkaW1ZKSB7CisgICAgIHJzX2VsZW1lbnQgZSA9IHJzQ3JlYXRlVmVjdG9yRWxlbWVudChSU19UWVBFX1NJR05FRF8zMiwgMyk7CisgICAgIHJzX3R5cGUgdCA9IHJzQ3JlYXRlVHlwZShlLCBkaW1YLCBkaW1ZKTsKKyAgICAgcmV0dXJuIHJzQ3JlYXRlQWxsb2NhdGlvbih0KTsKK30KKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorc3RhdGljIGlubGluZSByc19hbGxvY2F0aW9uIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDcmVhdGVBbGxvY2F0aW9uX2ludDQodWludDMyX3QgZGltWCwgdWludDMyX3QgZGltWSkgeworICAgICByc19lbGVtZW50IGUgPSByc0NyZWF0ZVZlY3RvckVsZW1lbnQoUlNfVFlQRV9TSUdORURfMzIsIDQpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCwgZGltWSk7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl91aW50Mih1aW50MzJfdCBkaW1YLCB1aW50MzJfdCBkaW1ZKSB7CisgICAgIHJzX2VsZW1lbnQgZSA9IHJzQ3JlYXRlVmVjdG9yRWxlbWVudChSU19UWVBFX1VOU0lHTkVEXzMyLCAyKTsKKyAgICAgcnNfdHlwZSB0ID0gcnNDcmVhdGVUeXBlKGUsIGRpbVgsIGRpbVkpOworICAgICByZXR1cm4gcnNDcmVhdGVBbGxvY2F0aW9uKHQpOworfQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitzdGF0aWMgaW5saW5lIHJzX2FsbG9jYXRpb24gX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NyZWF0ZUFsbG9jYXRpb25fdWludDModWludDMyX3QgZGltWCwgdWludDMyX3QgZGltWSkgeworICAgICByc19lbGVtZW50IGUgPSByc0NyZWF0ZVZlY3RvckVsZW1lbnQoUlNfVFlQRV9VTlNJR05FRF8zMiwgMyk7CisgICAgIHJzX3R5cGUgdCA9IHJzQ3JlYXRlVHlwZShlLCBkaW1YLCBkaW1ZKTsKKyAgICAgcmV0dXJuIHJzQ3JlYXRlQWxsb2NhdGlvbih0KTsKK30KKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorc3RhdGljIGlubGluZSByc19hbGxvY2F0aW9uIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDcmVhdGVBbGxvY2F0aW9uX3VpbnQ0KHVpbnQzMl90IGRpbVgsIHVpbnQzMl90IGRpbVkpIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVWZWN0b3JFbGVtZW50KFJTX1RZUEVfVU5TSUdORURfMzIsIDQpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCwgZGltWSk7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl9sb25nMih1aW50MzJfdCBkaW1YLCB1aW50MzJfdCBkaW1ZKSB7CisgICAgIHJzX2VsZW1lbnQgZSA9IHJzQ3JlYXRlVmVjdG9yRWxlbWVudChSU19UWVBFX1NJR05FRF82NCwgMik7CisgICAgIHJzX3R5cGUgdCA9IHJzQ3JlYXRlVHlwZShlLCBkaW1YLCBkaW1ZKTsKKyAgICAgcmV0dXJuIHJzQ3JlYXRlQWxsb2NhdGlvbih0KTsKK30KKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorc3RhdGljIGlubGluZSByc19hbGxvY2F0aW9uIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDcmVhdGVBbGxvY2F0aW9uX2xvbmczKHVpbnQzMl90IGRpbVgsIHVpbnQzMl90IGRpbVkpIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVWZWN0b3JFbGVtZW50KFJTX1RZUEVfU0lHTkVEXzY0LCAzKTsKKyAgICAgcnNfdHlwZSB0ID0gcnNDcmVhdGVUeXBlKGUsIGRpbVgsIGRpbVkpOworICAgICByZXR1cm4gcnNDcmVhdGVBbGxvY2F0aW9uKHQpOworfQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitzdGF0aWMgaW5saW5lIHJzX2FsbG9jYXRpb24gX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NyZWF0ZUFsbG9jYXRpb25fbG9uZzQodWludDMyX3QgZGltWCwgdWludDMyX3QgZGltWSkgeworICAgICByc19lbGVtZW50IGUgPSByc0NyZWF0ZVZlY3RvckVsZW1lbnQoUlNfVFlQRV9TSUdORURfNjQsIDQpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCwgZGltWSk7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl91bG9uZzIodWludDMyX3QgZGltWCwgdWludDMyX3QgZGltWSkgeworICAgICByc19lbGVtZW50IGUgPSByc0NyZWF0ZVZlY3RvckVsZW1lbnQoUlNfVFlQRV9VTlNJR05FRF82NCwgMik7CisgICAgIHJzX3R5cGUgdCA9IHJzQ3JlYXRlVHlwZShlLCBkaW1YLCBkaW1ZKTsKKyAgICAgcmV0dXJuIHJzQ3JlYXRlQWxsb2NhdGlvbih0KTsKK30KKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorc3RhdGljIGlubGluZSByc19hbGxvY2F0aW9uIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDcmVhdGVBbGxvY2F0aW9uX3Vsb25nMyh1aW50MzJfdCBkaW1YLCB1aW50MzJfdCBkaW1ZKSB7CisgICAgIHJzX2VsZW1lbnQgZSA9IHJzQ3JlYXRlVmVjdG9yRWxlbWVudChSU19UWVBFX1VOU0lHTkVEXzY0LCAzKTsKKyAgICAgcnNfdHlwZSB0ID0gcnNDcmVhdGVUeXBlKGUsIGRpbVgsIGRpbVkpOworICAgICByZXR1cm4gcnNDcmVhdGVBbGxvY2F0aW9uKHQpOworfQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitzdGF0aWMgaW5saW5lIHJzX2FsbG9jYXRpb24gX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NyZWF0ZUFsbG9jYXRpb25fdWxvbmc0KHVpbnQzMl90IGRpbVgsIHVpbnQzMl90IGRpbVkpIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVWZWN0b3JFbGVtZW50KFJTX1RZUEVfVU5TSUdORURfNjQsIDQpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCwgZGltWSk7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl9oYWxmKHVpbnQzMl90IGRpbVgpIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVFbGVtZW50KFJTX1RZUEVfRkxPQVRfMTYpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCk7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl9mbG9hdCh1aW50MzJfdCBkaW1YKSB7CisgICAgIHJzX2VsZW1lbnQgZSA9IHJzQ3JlYXRlRWxlbWVudChSU19UWVBFX0ZMT0FUXzMyKTsKKyAgICAgcnNfdHlwZSB0ID0gcnNDcmVhdGVUeXBlKGUsIGRpbVgpOworICAgICByZXR1cm4gcnNDcmVhdGVBbGxvY2F0aW9uKHQpOworfQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitzdGF0aWMgaW5saW5lIHJzX2FsbG9jYXRpb24gX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NyZWF0ZUFsbG9jYXRpb25fZG91YmxlKHVpbnQzMl90IGRpbVgpIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVFbGVtZW50KFJTX1RZUEVfRkxPQVRfNjQpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCk7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl9jaGFyKHVpbnQzMl90IGRpbVgpIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVFbGVtZW50KFJTX1RZUEVfU0lHTkVEXzgpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCk7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl91Y2hhcih1aW50MzJfdCBkaW1YKSB7CisgICAgIHJzX2VsZW1lbnQgZSA9IHJzQ3JlYXRlRWxlbWVudChSU19UWVBFX1VOU0lHTkVEXzgpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCk7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl9zaG9ydCh1aW50MzJfdCBkaW1YKSB7CisgICAgIHJzX2VsZW1lbnQgZSA9IHJzQ3JlYXRlRWxlbWVudChSU19UWVBFX1NJR05FRF8xNik7CisgICAgIHJzX3R5cGUgdCA9IHJzQ3JlYXRlVHlwZShlLCBkaW1YKTsKKyAgICAgcmV0dXJuIHJzQ3JlYXRlQWxsb2NhdGlvbih0KTsKK30KKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorc3RhdGljIGlubGluZSByc19hbGxvY2F0aW9uIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDcmVhdGVBbGxvY2F0aW9uX3VzaG9ydCh1aW50MzJfdCBkaW1YKSB7CisgICAgIHJzX2VsZW1lbnQgZSA9IHJzQ3JlYXRlRWxlbWVudChSU19UWVBFX1VOU0lHTkVEXzE2KTsKKyAgICAgcnNfdHlwZSB0ID0gcnNDcmVhdGVUeXBlKGUsIGRpbVgpOworICAgICByZXR1cm4gcnNDcmVhdGVBbGxvY2F0aW9uKHQpOworfQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitzdGF0aWMgaW5saW5lIHJzX2FsbG9jYXRpb24gX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NyZWF0ZUFsbG9jYXRpb25faW50KHVpbnQzMl90IGRpbVgpIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVFbGVtZW50KFJTX1RZUEVfU0lHTkVEXzMyKTsKKyAgICAgcnNfdHlwZSB0ID0gcnNDcmVhdGVUeXBlKGUsIGRpbVgpOworICAgICByZXR1cm4gcnNDcmVhdGVBbGxvY2F0aW9uKHQpOworfQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitzdGF0aWMgaW5saW5lIHJzX2FsbG9jYXRpb24gX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NyZWF0ZUFsbG9jYXRpb25fdWludCh1aW50MzJfdCBkaW1YKSB7CisgICAgIHJzX2VsZW1lbnQgZSA9IHJzQ3JlYXRlRWxlbWVudChSU19UWVBFX1VOU0lHTkVEXzMyKTsKKyAgICAgcnNfdHlwZSB0ID0gcnNDcmVhdGVUeXBlKGUsIGRpbVgpOworICAgICByZXR1cm4gcnNDcmVhdGVBbGxvY2F0aW9uKHQpOworfQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitzdGF0aWMgaW5saW5lIHJzX2FsbG9jYXRpb24gX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NyZWF0ZUFsbG9jYXRpb25fbG9uZyh1aW50MzJfdCBkaW1YKSB7CisgICAgIHJzX2VsZW1lbnQgZSA9IHJzQ3JlYXRlRWxlbWVudChSU19UWVBFX1NJR05FRF82NCk7CisgICAgIHJzX3R5cGUgdCA9IHJzQ3JlYXRlVHlwZShlLCBkaW1YKTsKKyAgICAgcmV0dXJuIHJzQ3JlYXRlQWxsb2NhdGlvbih0KTsKK30KKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorc3RhdGljIGlubGluZSByc19hbGxvY2F0aW9uIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDcmVhdGVBbGxvY2F0aW9uX3Vsb25nKHVpbnQzMl90IGRpbVgpIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVFbGVtZW50KFJTX1RZUEVfVU5TSUdORURfNjQpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCk7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl9oYWxmMih1aW50MzJfdCBkaW1YKSB7CisgICAgIHJzX2VsZW1lbnQgZSA9IHJzQ3JlYXRlVmVjdG9yRWxlbWVudChSU19UWVBFX0ZMT0FUXzE2LCAyKTsKKyAgICAgcnNfdHlwZSB0ID0gcnNDcmVhdGVUeXBlKGUsIGRpbVgpOworICAgICByZXR1cm4gcnNDcmVhdGVBbGxvY2F0aW9uKHQpOworfQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitzdGF0aWMgaW5saW5lIHJzX2FsbG9jYXRpb24gX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NyZWF0ZUFsbG9jYXRpb25faGFsZjModWludDMyX3QgZGltWCkgeworICAgICByc19lbGVtZW50IGUgPSByc0NyZWF0ZVZlY3RvckVsZW1lbnQoUlNfVFlQRV9GTE9BVF8xNiwgMyk7CisgICAgIHJzX3R5cGUgdCA9IHJzQ3JlYXRlVHlwZShlLCBkaW1YKTsKKyAgICAgcmV0dXJuIHJzQ3JlYXRlQWxsb2NhdGlvbih0KTsKK30KKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorc3RhdGljIGlubGluZSByc19hbGxvY2F0aW9uIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDcmVhdGVBbGxvY2F0aW9uX2hhbGY0KHVpbnQzMl90IGRpbVgpIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVWZWN0b3JFbGVtZW50KFJTX1RZUEVfRkxPQVRfMTYsIDQpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCk7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl9mbG9hdDIodWludDMyX3QgZGltWCkgeworICAgICByc19lbGVtZW50IGUgPSByc0NyZWF0ZVZlY3RvckVsZW1lbnQoUlNfVFlQRV9GTE9BVF8zMiwgMik7CisgICAgIHJzX3R5cGUgdCA9IHJzQ3JlYXRlVHlwZShlLCBkaW1YKTsKKyAgICAgcmV0dXJuIHJzQ3JlYXRlQWxsb2NhdGlvbih0KTsKK30KKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorc3RhdGljIGlubGluZSByc19hbGxvY2F0aW9uIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDcmVhdGVBbGxvY2F0aW9uX2Zsb2F0Myh1aW50MzJfdCBkaW1YKSB7CisgICAgIHJzX2VsZW1lbnQgZSA9IHJzQ3JlYXRlVmVjdG9yRWxlbWVudChSU19UWVBFX0ZMT0FUXzMyLCAzKTsKKyAgICAgcnNfdHlwZSB0ID0gcnNDcmVhdGVUeXBlKGUsIGRpbVgpOworICAgICByZXR1cm4gcnNDcmVhdGVBbGxvY2F0aW9uKHQpOworfQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitzdGF0aWMgaW5saW5lIHJzX2FsbG9jYXRpb24gX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NyZWF0ZUFsbG9jYXRpb25fZmxvYXQ0KHVpbnQzMl90IGRpbVgpIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVWZWN0b3JFbGVtZW50KFJTX1RZUEVfRkxPQVRfMzIsIDQpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCk7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl9kb3VibGUyKHVpbnQzMl90IGRpbVgpIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVWZWN0b3JFbGVtZW50KFJTX1RZUEVfRkxPQVRfNjQsIDIpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCk7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl9kb3VibGUzKHVpbnQzMl90IGRpbVgpIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVWZWN0b3JFbGVtZW50KFJTX1RZUEVfRkxPQVRfNjQsIDMpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCk7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl9kb3VibGU0KHVpbnQzMl90IGRpbVgpIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVWZWN0b3JFbGVtZW50KFJTX1RZUEVfRkxPQVRfNjQsIDQpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCk7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl9jaGFyMih1aW50MzJfdCBkaW1YKSB7CisgICAgIHJzX2VsZW1lbnQgZSA9IHJzQ3JlYXRlVmVjdG9yRWxlbWVudChSU19UWVBFX1NJR05FRF84LCAyKTsKKyAgICAgcnNfdHlwZSB0ID0gcnNDcmVhdGVUeXBlKGUsIGRpbVgpOworICAgICByZXR1cm4gcnNDcmVhdGVBbGxvY2F0aW9uKHQpOworfQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitzdGF0aWMgaW5saW5lIHJzX2FsbG9jYXRpb24gX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NyZWF0ZUFsbG9jYXRpb25fY2hhcjModWludDMyX3QgZGltWCkgeworICAgICByc19lbGVtZW50IGUgPSByc0NyZWF0ZVZlY3RvckVsZW1lbnQoUlNfVFlQRV9TSUdORURfOCwgMyk7CisgICAgIHJzX3R5cGUgdCA9IHJzQ3JlYXRlVHlwZShlLCBkaW1YKTsKKyAgICAgcmV0dXJuIHJzQ3JlYXRlQWxsb2NhdGlvbih0KTsKK30KKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorc3RhdGljIGlubGluZSByc19hbGxvY2F0aW9uIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDcmVhdGVBbGxvY2F0aW9uX2NoYXI0KHVpbnQzMl90IGRpbVgpIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVWZWN0b3JFbGVtZW50KFJTX1RZUEVfU0lHTkVEXzgsIDQpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCk7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl91Y2hhcjIodWludDMyX3QgZGltWCkgeworICAgICByc19lbGVtZW50IGUgPSByc0NyZWF0ZVZlY3RvckVsZW1lbnQoUlNfVFlQRV9VTlNJR05FRF84LCAyKTsKKyAgICAgcnNfdHlwZSB0ID0gcnNDcmVhdGVUeXBlKGUsIGRpbVgpOworICAgICByZXR1cm4gcnNDcmVhdGVBbGxvY2F0aW9uKHQpOworfQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitzdGF0aWMgaW5saW5lIHJzX2FsbG9jYXRpb24gX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NyZWF0ZUFsbG9jYXRpb25fdWNoYXIzKHVpbnQzMl90IGRpbVgpIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVWZWN0b3JFbGVtZW50KFJTX1RZUEVfVU5TSUdORURfOCwgMyk7CisgICAgIHJzX3R5cGUgdCA9IHJzQ3JlYXRlVHlwZShlLCBkaW1YKTsKKyAgICAgcmV0dXJuIHJzQ3JlYXRlQWxsb2NhdGlvbih0KTsKK30KKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorc3RhdGljIGlubGluZSByc19hbGxvY2F0aW9uIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDcmVhdGVBbGxvY2F0aW9uX3VjaGFyNCh1aW50MzJfdCBkaW1YKSB7CisgICAgIHJzX2VsZW1lbnQgZSA9IHJzQ3JlYXRlVmVjdG9yRWxlbWVudChSU19UWVBFX1VOU0lHTkVEXzgsIDQpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCk7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl9zaG9ydDIodWludDMyX3QgZGltWCkgeworICAgICByc19lbGVtZW50IGUgPSByc0NyZWF0ZVZlY3RvckVsZW1lbnQoUlNfVFlQRV9TSUdORURfMTYsIDIpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCk7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl9zaG9ydDModWludDMyX3QgZGltWCkgeworICAgICByc19lbGVtZW50IGUgPSByc0NyZWF0ZVZlY3RvckVsZW1lbnQoUlNfVFlQRV9TSUdORURfMTYsIDMpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCk7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl9zaG9ydDQodWludDMyX3QgZGltWCkgeworICAgICByc19lbGVtZW50IGUgPSByc0NyZWF0ZVZlY3RvckVsZW1lbnQoUlNfVFlQRV9TSUdORURfMTYsIDQpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCk7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl91c2hvcnQyKHVpbnQzMl90IGRpbVgpIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVWZWN0b3JFbGVtZW50KFJTX1RZUEVfVU5TSUdORURfMTYsIDIpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCk7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl91c2hvcnQzKHVpbnQzMl90IGRpbVgpIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVWZWN0b3JFbGVtZW50KFJTX1RZUEVfVU5TSUdORURfMTYsIDMpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCk7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl91c2hvcnQ0KHVpbnQzMl90IGRpbVgpIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVWZWN0b3JFbGVtZW50KFJTX1RZUEVfVU5TSUdORURfMTYsIDQpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCk7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl9pbnQyKHVpbnQzMl90IGRpbVgpIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVWZWN0b3JFbGVtZW50KFJTX1RZUEVfU0lHTkVEXzMyLCAyKTsKKyAgICAgcnNfdHlwZSB0ID0gcnNDcmVhdGVUeXBlKGUsIGRpbVgpOworICAgICByZXR1cm4gcnNDcmVhdGVBbGxvY2F0aW9uKHQpOworfQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitzdGF0aWMgaW5saW5lIHJzX2FsbG9jYXRpb24gX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NyZWF0ZUFsbG9jYXRpb25faW50Myh1aW50MzJfdCBkaW1YKSB7CisgICAgIHJzX2VsZW1lbnQgZSA9IHJzQ3JlYXRlVmVjdG9yRWxlbWVudChSU19UWVBFX1NJR05FRF8zMiwgMyk7CisgICAgIHJzX3R5cGUgdCA9IHJzQ3JlYXRlVHlwZShlLCBkaW1YKTsKKyAgICAgcmV0dXJuIHJzQ3JlYXRlQWxsb2NhdGlvbih0KTsKK30KKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorc3RhdGljIGlubGluZSByc19hbGxvY2F0aW9uIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDcmVhdGVBbGxvY2F0aW9uX2ludDQodWludDMyX3QgZGltWCkgeworICAgICByc19lbGVtZW50IGUgPSByc0NyZWF0ZVZlY3RvckVsZW1lbnQoUlNfVFlQRV9TSUdORURfMzIsIDQpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCk7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl91aW50Mih1aW50MzJfdCBkaW1YKSB7CisgICAgIHJzX2VsZW1lbnQgZSA9IHJzQ3JlYXRlVmVjdG9yRWxlbWVudChSU19UWVBFX1VOU0lHTkVEXzMyLCAyKTsKKyAgICAgcnNfdHlwZSB0ID0gcnNDcmVhdGVUeXBlKGUsIGRpbVgpOworICAgICByZXR1cm4gcnNDcmVhdGVBbGxvY2F0aW9uKHQpOworfQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitzdGF0aWMgaW5saW5lIHJzX2FsbG9jYXRpb24gX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NyZWF0ZUFsbG9jYXRpb25fdWludDModWludDMyX3QgZGltWCkgeworICAgICByc19lbGVtZW50IGUgPSByc0NyZWF0ZVZlY3RvckVsZW1lbnQoUlNfVFlQRV9VTlNJR05FRF8zMiwgMyk7CisgICAgIHJzX3R5cGUgdCA9IHJzQ3JlYXRlVHlwZShlLCBkaW1YKTsKKyAgICAgcmV0dXJuIHJzQ3JlYXRlQWxsb2NhdGlvbih0KTsKK30KKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorc3RhdGljIGlubGluZSByc19hbGxvY2F0aW9uIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDcmVhdGVBbGxvY2F0aW9uX3VpbnQ0KHVpbnQzMl90IGRpbVgpIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVWZWN0b3JFbGVtZW50KFJTX1RZUEVfVU5TSUdORURfMzIsIDQpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCk7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl9sb25nMih1aW50MzJfdCBkaW1YKSB7CisgICAgIHJzX2VsZW1lbnQgZSA9IHJzQ3JlYXRlVmVjdG9yRWxlbWVudChSU19UWVBFX1NJR05FRF82NCwgMik7CisgICAgIHJzX3R5cGUgdCA9IHJzQ3JlYXRlVHlwZShlLCBkaW1YKTsKKyAgICAgcmV0dXJuIHJzQ3JlYXRlQWxsb2NhdGlvbih0KTsKK30KKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorc3RhdGljIGlubGluZSByc19hbGxvY2F0aW9uIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDcmVhdGVBbGxvY2F0aW9uX2xvbmczKHVpbnQzMl90IGRpbVgpIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVWZWN0b3JFbGVtZW50KFJTX1RZUEVfU0lHTkVEXzY0LCAzKTsKKyAgICAgcnNfdHlwZSB0ID0gcnNDcmVhdGVUeXBlKGUsIGRpbVgpOworICAgICByZXR1cm4gcnNDcmVhdGVBbGxvY2F0aW9uKHQpOworfQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitzdGF0aWMgaW5saW5lIHJzX2FsbG9jYXRpb24gX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NyZWF0ZUFsbG9jYXRpb25fbG9uZzQodWludDMyX3QgZGltWCkgeworICAgICByc19lbGVtZW50IGUgPSByc0NyZWF0ZVZlY3RvckVsZW1lbnQoUlNfVFlQRV9TSUdORURfNjQsIDQpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCk7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3N0YXRpYyBpbmxpbmUgcnNfYWxsb2NhdGlvbiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ3JlYXRlQWxsb2NhdGlvbl91bG9uZzIodWludDMyX3QgZGltWCkgeworICAgICByc19lbGVtZW50IGUgPSByc0NyZWF0ZVZlY3RvckVsZW1lbnQoUlNfVFlQRV9VTlNJR05FRF82NCwgMik7CisgICAgIHJzX3R5cGUgdCA9IHJzQ3JlYXRlVHlwZShlLCBkaW1YKTsKKyAgICAgcmV0dXJuIHJzQ3JlYXRlQWxsb2NhdGlvbih0KTsKK30KKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorc3RhdGljIGlubGluZSByc19hbGxvY2F0aW9uIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDcmVhdGVBbGxvY2F0aW9uX3Vsb25nMyh1aW50MzJfdCBkaW1YKSB7CisgICAgIHJzX2VsZW1lbnQgZSA9IHJzQ3JlYXRlVmVjdG9yRWxlbWVudChSU19UWVBFX1VOU0lHTkVEXzY0LCAzKTsKKyAgICAgcnNfdHlwZSB0ID0gcnNDcmVhdGVUeXBlKGUsIGRpbVgpOworICAgICByZXR1cm4gcnNDcmVhdGVBbGxvY2F0aW9uKHQpOworfQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitzdGF0aWMgaW5saW5lIHJzX2FsbG9jYXRpb24gX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NyZWF0ZUFsbG9jYXRpb25fdWxvbmc0KHVpbnQzMl90IGRpbVgpIHsKKyAgICAgcnNfZWxlbWVudCBlID0gcnNDcmVhdGVWZWN0b3JFbGVtZW50KFJTX1RZUEVfVU5TSUdORURfNjQsIDQpOworICAgICByc190eXBlIHQgPSByc0NyZWF0ZVR5cGUoZSwgZGltWCk7CisgICAgIHJldHVybiByc0NyZWF0ZUFsbG9jYXRpb24odCk7Cit9CisjZW5kaWYKKworI2VuZGlmIC8vIFJFTkRFUlNDUklQVF9SU19BTExPQ0FUSU9OX0NSRUFURV9SU0gKZGlmZiAtLWdpdCBhL3JlbmRlcnNjcmlwdC9pbmNsdWRlL3JzX2FsbG9jYXRpb25fZGF0YS5yc2ggYi9yZW5kZXJzY3JpcHQvaW5jbHVkZS9yc19hbGxvY2F0aW9uX2RhdGEucnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMTY3NjcKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvaW5jbHVkZS9yc19hbGxvY2F0aW9uX2RhdGEucnNoCkBAIC0wLDAgKzEsMzM2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIERvbid0IGVkaXQgdGhpcyBmaWxlISAgSXQgaXMgYXV0by1nZW5lcmF0ZWQgYnkgZnJhbWV3b3Jrcy9ycy9hcGkvZ2VuZXJhdGUuc2guCisKKy8qCisgKiByc19hbGxvY2F0aW9uX2RhdGEucnNoOiBBbGxvY2F0aW9uIERhdGEgQWNjZXNzIEZ1bmN0aW9ucworICoKKyAqIFRoZSBmdW5jdGlvbnMgYmVsb3cgY2FuIGJlIHVzZWQgdG8gZ2V0IGFuZCBzZXQgdGhlIGNlbGxzIHRoYXQgY29tcHJpc2UKKyAqIGFuIGFsbG9jYXRpb24uCisgKgorICogLSBJbmRpdmlkdWFsIGNlbGxzIGFyZSBhY2Nlc3NlZCB1c2luZyB0aGUgcnNHZXRFbGVtZW50QXQqIGFuZAorICogICByc1NldEVsZW1lbnRBdCBmdW5jdGlvbnMuCisgKiAtIE11bHRpcGxlIGNlbGxzIGNhbiBiZSBjb3BpZWQgdXNpbmcgdGhlIHJzQWxsb2NhdGlvbkNvcHkqIGFuZAorICogICByc0FsbG9jYXRpb25WKiBmdW5jdGlvbnMuCisgKiAtIEZvciBnZXR0aW5nIHZhbHVlcyB0aHJvdWdoIGEgc2FtcGxlciwgdXNlIHJzU2FtcGxlLgorICoKKyAqIFRoZSByc0dldEVsZW1lbnRBdCBhbmQgcnNTZXRFbGVtZW50KiBmdW5jdGlvbnMgYXJlIHNvbWV3aGF0IG1pc25hbWVkLgorICogVGhleSBkb24ndCBnZXQgb3Igc2V0IGVsZW1lbnRzLCB3aGljaCBhcmUgYWtpbiB0byBkYXRhIHR5cGVzOyB0aGV5IGdldAorICogb3Igc2V0IGNlbGxzLiAgVGhpbmsgb2YgdGhlbSBhcyByc0dldENlbGxBdCBhbmQgYW5kIHJzU2V0Q2VsbEF0LgorICovCisKKyNpZm5kZWYgUkVOREVSU0NSSVBUX1JTX0FMTE9DQVRJT05fREFUQV9SU0gKKyNkZWZpbmUgUkVOREVSU0NSSVBUX1JTX0FMTE9DQVRJT05fREFUQV9SU0gKKworLyoKKyAqIHJzQWxsb2NhdGlvbkNvcHkxRFJhbmdlOiBDb3B5IGNvbnNlY3V0aXZlIGNlbGxzIGJldHdlZW4gYWxsb2NhdGlvbnMKKyAqCisgKiBDb3BpZXMgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgY2VsbHMgZnJvbSBvbmUgYWxsb2NhdGlvbiB0byBhbm90aGVyLgorICoKKyAqIFRoZSB0d28gYWxsb2NhdGlvbnMgbXVzdCBiZSBkaWZmZXJlbnQuICBVc2luZyB0aGlzIGZ1bmN0aW9uIHRvIGNvcHkgd2hpdGhpbgorICogdGhlIHNhbWUgYWxsb2NhdGlvbiB5aWVsZHMgdW5kZWZpbmVkIHJlc3VsdHMuCisgKgorICogVGhlIGZ1bmN0aW9uIGRvZXMgbm90IHZhbGlkYXRlIHdoZXRoZXIgdGhlIG9mZnNldCBwbHVzIGNvdW50IGV4Y2VlZHMgdGhlIHNpemUKKyAqIG9mIGVpdGhlciBhbGxvY2F0aW9uLiAgQmUgY2FyZWZ1bCEKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBiZXR3ZWVuIDFEIGFsbG9jYXRpb25zLiAgQ2FsbGluZyBpdAorICogb24gb3RoZXIgYWxsb2NhdGlvbnMgaXMgdW5kZWZpbmVkLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBjYWxsZWQgZnJvbSBpbnNpZGUgYSBrZXJuZWwsIG9yIGZyb20gYW55IGZ1bmN0aW9uCisgKiB0aGF0IG1heSBiZSBjYWxsZWQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBmcm9tIGEga2VybmVsLiBEb2luZyBzbyB3b3VsZCBjYXVzZSBhCisgKiBydW50aW1lIGVycm9yLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgIGRzdEFsbG9jOiBBbGxvY2F0aW9uIHRvIGNvcHkgY2VsbHMgaW50by4KKyAqICAgZHN0T2ZmOiBPZmZzZXQgaW4gdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBmaXJzdCBjZWxsIHRvIGJlIGNvcGllZCBpbnRvLgorICogICBkc3RNaXA6IE1pcCBsZXZlbCBpbiB0aGUgZGVzdGluYXRpb24gYWxsb2NhdGlvbi4gIDAgaWYgbWlwIG1hcHBpbmcgaXMgbm90IHVzZWQuCisgKiAgIGNvdW50OiBOdW1iZXIgb2YgY2VsbHMgdG8gYmUgY29waWVkLgorICogICBzcmNBbGxvYzogU291cmNlIGFsbG9jYXRpb24uCisgKiAgIHNyY09mZjogT2Zmc2V0IGluIHRoZSBzb3VyY2Ugb2YgdGhlIGZpcnN0IGNlbGwgdG8gYmUgY29waWVkLgorICogICBzcmNNaXA6IE1pcCBsZXZlbCBpbiB0aGUgc291cmNlIGFsbG9jYXRpb24uICAwIGlmIG1pcCBtYXBwaW5nIGlzIG5vdCB1c2VkLgorICovCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTQpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25Db3B5MURSYW5nZShyc19hbGxvY2F0aW9uIGRzdEFsbG9jLCB1aW50MzJfdCBkc3RPZmYsIHVpbnQzMl90IGRzdE1pcCwgdWludDMyX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnNfYWxsb2NhdGlvbiBzcmNBbGxvYywgdWludDMyX3Qgc3JjT2ZmLCB1aW50MzJfdCBzcmNNaXApOworI2VuZGlmCisKKy8qCisgKiByc0FsbG9jYXRpb25Db3B5MkRSYW5nZTogQ29weSBhIHJlY3Rhbmd1bGFyIHJlZ2lvbiBvZiBjZWxscyBiZXR3ZWVuIGFsbG9jYXRpb25zCisgKgorICogQ29waWVzIGEgcmVjdGFuZ3VsYXIgcmVnaW9uIG9mIGNlbGxzIGZyb20gb25lIGFsbG9jYXRpb24gdG8gYW5vdGhlci4KKyAqICh3aWR0aCAqIGhlaWd0aCkgY2VsbHMgYXJlIGNvcGllZC4KKyAqCisgKiBUaGUgdHdvIGFsbG9jYXRpb25zIG11c3QgYmUgZGlmZmVyZW50LiAgVXNpbmcgdGhpcyBmdW5jdGlvbiB0byBjb3B5IHdoaXRoaW4KKyAqIHRoZSBzYW1lIGFsbG9jYXRpb24geWllbGRzIHVuZGVmaW5lZCByZXN1bHRzLgorICoKKyAqIFRoZSBmdW5jdGlvbiBkb2VzIG5vdCB2YWxpZGF0ZSB3aGV0aGVyIHRoZSB0aGUgc291cmNlIG9yIGRlc3RpbmF0aW9uIHJlZ2lvbgorICogZXhjZWVkcyB0aGUgc2l6ZSBvZiBpdHMgcmVzcGVjdGl2ZSBhbGxvY2F0aW9uLiAgQmUgY2FyZWZ1bCEKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBiZXR3ZWVuIDJEIGFsbG9jYXRpb25zLiAgQ2FsbGluZyBpdAorICogb24gb3RoZXIgYWxsb2NhdGlvbnMgaXMgdW5kZWZpbmVkLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBjYWxsZWQgZnJvbSBpbnNpZGUgYSBrZXJuZWwsIG9yIGZyb20gYW55IGZ1bmN0aW9uCisgKiB0aGF0IG1heSBiZSBjYWxsZWQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBmcm9tIGEga2VybmVsLiBEb2luZyBzbyB3b3VsZCBjYXVzZSBhCisgKiBydW50aW1lIGVycm9yLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgIGRzdEFsbG9jOiBBbGxvY2F0aW9uIHRvIGNvcHkgY2VsbHMgaW50by4KKyAqICAgZHN0WG9mZjogWCBvZmZzZXQgaW4gdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSByZWdpb24gdG8gYmUgc2V0LgorICogICBkc3RZb2ZmOiBZIG9mZnNldCBpbiB0aGUgZGVzdGluYXRpb24gb2YgdGhlIHJlZ2lvbiB0byBiZSBzZXQuCisgKiAgIGRzdE1pcDogTWlwIGxldmVsIGluIHRoZSBkZXN0aW5hdGlvbiBhbGxvY2F0aW9uLiAgMCBpZiBtaXAgbWFwcGluZyBpcyBub3QgdXNlZC4KKyAqICAgZHN0RmFjZTogQ3ViZW1hcCBmYWNlIG9mIHRoZSBkZXN0aW5hdGlvbiBhbGxvY2F0aW9uLiAgSWdub3JlZCBmb3IgYWxsb2NhdGlvbnMgdGhhdCBhcmVuJ3QgY3ViZW1hcHMuCisgKiAgIHdpZHRoOiBXaWR0aCBvZiB0aGUgaW5jb21pbmcgcmVnaW9uIHRvIHVwZGF0ZS4KKyAqICAgaGVpZ2h0OiBIZWlnaHQgb2YgdGhlIGluY29taW5nIHJlZ2lvbiB0byB1cGRhdGUuCisgKiAgIHNyY0FsbG9jOiBTb3VyY2UgYWxsb2NhdGlvbi4KKyAqICAgc3JjWG9mZjogWCBvZmZzZXQgaW4gdGhlIHNvdXJjZS4KKyAqICAgc3JjWW9mZjogWSBvZmZzZXQgaW4gdGhlIHNvdXJjZS4KKyAqICAgc3JjTWlwOiBNaXAgbGV2ZWwgaW4gdGhlIHNvdXJjZSBhbGxvY2F0aW9uLiAgMCBpZiBtaXAgbWFwcGluZyBpcyBub3QgdXNlZC4KKyAqICAgc3JjRmFjZTogQ3ViZW1hcCBmYWNlIG9mIHRoZSBzb3VyY2UgYWxsb2NhdGlvbi4gIElnbm9yZWQgZm9yIGFsbG9jYXRpb25zIHRoYXQgYXJlbid0IGN1YmVtYXBzLgorICovCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTQpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25Db3B5MkRSYW5nZShyc19hbGxvY2F0aW9uIGRzdEFsbG9jLCB1aW50MzJfdCBkc3RYb2ZmLCB1aW50MzJfdCBkc3RZb2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRzdE1pcCwgcnNfYWxsb2NhdGlvbl9jdWJlbWFwX2ZhY2UgZHN0RmFjZSwgdWludDMyX3Qgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaGVpZ2h0LCByc19hbGxvY2F0aW9uIHNyY0FsbG9jLCB1aW50MzJfdCBzcmNYb2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNyY1lvZmYsIHVpbnQzMl90IHNyY01pcCwgcnNfYWxsb2NhdGlvbl9jdWJlbWFwX2ZhY2Ugc3JjRmFjZSk7CisjZW5kaWYKKworLyoKKyAqIHJzQWxsb2NhdGlvblZMb2FkWDogR2V0IGEgdmVjdG9yIGZyb20gYW4gYWxsb2NhdGlvbiBvZiBzY2FsYXJzCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgdmVjdG9yIGNvbXBvc2VkIG9mIHN1Y2Nlc3NpdmUgY2VsbHMgb2YgdGhlIGFsbG9jYXRpb24uCisgKiBJdCBhc3N1bWVzIHRoYXQgdGhlIGFsbG9jYXRpb24gY29udGFpbnMgc2NhbGFycy4KKyAqCisgKiBUaGUgIlgiIGluIHRoZSBuYW1lIGluZGljYXRlcyB0aGF0IHN1Y2Nlc3NpdmUgdmFsdWVzIGFyZSBleHRyYWN0ZWQgYnkKKyAqIGluY3JlYXNpbmcgdGhlIFggaW5kZXguICBUaGVyZSBhcmUgY3VycmVudGx5IG5vIGZ1bmN0aW9ucyB0byBnZXQgc3VjY2Vzc2l2ZQorICogdmFsdWVzIGluY3JlbWVudGluZyBvdGhlciBkaW1lbnNpb25zLiAgVXNlIG11bHRpcGxlIGNhbGxzIHRvIHJzR2V0RWxlbWVudEF0KCkKKyAqIGluc3RlYWQuCisgKgorICogRm9yIGV4YW1wbGUsIHdoZW4gY2FsbGluZyByc0FsbG9jYXRpb25WTG9hZFhfaW50NChhLCAyMCwgMzApLCBhbiBpbnQ0IGNvbXBvc2VkCisgKiBvZiBhWzIwLCAzMF0sIGFbMjEsIDMwXSwgYVsyMiwgMzBdLCBhbmQgYVsyMywgMzBdIGlzIHJldHVybmVkLgorICoKKyAqIFdoZW4gcmV0cmlldmluZyBmcm9tIGEgdGhyZWUgZGltZW5zaW9uYWwgYWxsb2NhdGlvbnMsIHVzZSB0aGUgeCwgeSwgeiB2YXJpYW50LgorICogU2ltaWxhcmx5LCB1c2UgdGhlIHgsIHkgdmFyaWFudCBmb3IgdHdvIGRpbWVuc2lvbmFsIGFsbG9jYXRpb25zIGFuZCB4IGZvciB0aGUKKyAqIG1vbm8gZGltZW5zaW9uYWwgYWxsb2NhdGlvbnMuCisgKgorICogRm9yIGVmZmljaWVuY3ksIHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgdmFsaWRhdGUgdGhlIGlucHV0cy4gIFRyeWluZyB0byB3cmFwCisgKiB0aGUgWCBpbmRleCwgZXhjZWVkaW5nIHRoZSBzaXplIG9mIHRoZSBhbGxvY2F0aW9uLCBvciB1c2luZyBpbmRpY2VzIGluY29tcGF0aWJsZQorICogd2l0aCB0aGUgZGltZW5zaW9uYWxpdHkgb2YgdGhlIGFsbG9jYXRpb24geWllbGRzIHVuZGVmaW5lZCByZXN1bHRzLgorICoKKyAqIFNlZSBhbHNvIHJzQWxsb2NhdGlvblZTdG9yZVgoKS4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICBhOiBBbGxvY2F0aW9uIHRvIGdldCB0aGUgZGF0YSBmcm9tLgorICogICB4OiBYIG9mZnNldCBpbiB0aGUgYWxsb2NhdGlvbiBvZiB0aGUgZmlyc3QgY2VsbCB0byBiZSBjb3BpZWQgZnJvbS4KKyAqICAgeTogWSBvZmZzZXQgaW4gdGhlIGFsbG9jYXRpb24gb2YgdGhlIGZpcnN0IGNlbGwgdG8gYmUgY29waWVkIGZyb20uCisgKiAgIHo6IFogb2Zmc2V0IGluIHRoZSBhbGxvY2F0aW9uIG9mIHRoZSBmaXJzdCBjZWxsIHRvIGJlIGNvcGllZCBmcm9tLgorICovCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF9mbG9hdDIocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF9mbG9hdDMocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF9mbG9hdDQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIGRvdWJsZTIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25WTG9hZFhfZG91YmxlMihyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gZG91YmxlMyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF9kb3VibGUzKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKK2V4dGVybiBkb3VibGU0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uVkxvYWRYX2RvdWJsZTQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIGNoYXIyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uVkxvYWRYX2NoYXIyKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKK2V4dGVybiBjaGFyMyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF9jaGFyMyhyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gY2hhcjQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25WTG9hZFhfY2hhcjQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHVjaGFyMiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF91Y2hhcjIocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHVjaGFyMyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF91Y2hhcjMocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHVjaGFyNCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF91Y2hhcjQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHNob3J0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF9zaG9ydDIocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHNob3J0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF9zaG9ydDMocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHNob3J0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF9zaG9ydDQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHVzaG9ydDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25WTG9hZFhfdXNob3J0Mihyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdXNob3J0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF91c2hvcnQzKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKK2V4dGVybiB1c2hvcnQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uVkxvYWRYX3VzaG9ydDQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIGludDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25WTG9hZFhfaW50Mihyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gaW50MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF9pbnQzKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKK2V4dGVybiBpbnQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uVkxvYWRYX2ludDQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHVpbnQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uVkxvYWRYX3VpbnQyKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKK2V4dGVybiB1aW50MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF91aW50Myhyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdWludDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25WTG9hZFhfdWludDQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIGxvbmcyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uVkxvYWRYX2xvbmcyKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKK2V4dGVybiBsb25nMyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF9sb25nMyhyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gbG9uZzQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25WTG9hZFhfbG9uZzQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHVsb25nMiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF91bG9uZzIocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHVsb25nMyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF91bG9uZzMocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHVsb25nNCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF91bG9uZzQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF9mbG9hdDIocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF9mbG9hdDMocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF9mbG9hdDQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIGRvdWJsZTIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25WTG9hZFhfZG91YmxlMihyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gZG91YmxlMyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF9kb3VibGUzKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKK2V4dGVybiBkb3VibGU0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uVkxvYWRYX2RvdWJsZTQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIGNoYXIyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uVkxvYWRYX2NoYXIyKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKK2V4dGVybiBjaGFyMyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF9jaGFyMyhyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gY2hhcjQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25WTG9hZFhfY2hhcjQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHVjaGFyMiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF91Y2hhcjIocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHVjaGFyMyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF91Y2hhcjMocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHVjaGFyNCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF91Y2hhcjQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHNob3J0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF9zaG9ydDIocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHNob3J0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF9zaG9ydDMocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHNob3J0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF9zaG9ydDQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHVzaG9ydDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25WTG9hZFhfdXNob3J0Mihyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdXNob3J0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF91c2hvcnQzKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKK2V4dGVybiB1c2hvcnQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uVkxvYWRYX3VzaG9ydDQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIGludDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25WTG9hZFhfaW50Mihyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gaW50MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF9pbnQzKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKK2V4dGVybiBpbnQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uVkxvYWRYX2ludDQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHVpbnQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uVkxvYWRYX3VpbnQyKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKK2V4dGVybiB1aW50MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF91aW50Myhyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdWludDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25WTG9hZFhfdWludDQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIGxvbmcyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uVkxvYWRYX2xvbmcyKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKK2V4dGVybiBsb25nMyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF9sb25nMyhyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gbG9uZzQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25WTG9hZFhfbG9uZzQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHVsb25nMiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF91bG9uZzIocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHVsb25nMyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF91bG9uZzMocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHVsb25nNCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF91bG9uZzQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF9mbG9hdDIocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF9mbG9hdDMocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF9mbG9hdDQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIGRvdWJsZTIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25WTG9hZFhfZG91YmxlMihyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gZG91YmxlMyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF9kb3VibGUzKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3Qgeik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKK2V4dGVybiBkb3VibGU0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uVkxvYWRYX2RvdWJsZTQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIGNoYXIyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uVkxvYWRYX2NoYXIyKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3Qgeik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKK2V4dGVybiBjaGFyMyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF9jaGFyMyhyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gY2hhcjQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25WTG9hZFhfY2hhcjQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHVjaGFyMiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF91Y2hhcjIocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHVjaGFyMyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF91Y2hhcjMocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHVjaGFyNCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF91Y2hhcjQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHNob3J0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF9zaG9ydDIocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHNob3J0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF9zaG9ydDMocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHNob3J0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF9zaG9ydDQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHVzaG9ydDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25WTG9hZFhfdXNob3J0Mihyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdXNob3J0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF91c2hvcnQzKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3Qgeik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKK2V4dGVybiB1c2hvcnQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uVkxvYWRYX3VzaG9ydDQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIGludDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25WTG9hZFhfaW50Mihyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gaW50MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF9pbnQzKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3Qgeik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKK2V4dGVybiBpbnQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uVkxvYWRYX2ludDQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHVpbnQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uVkxvYWRYX3VpbnQyKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3Qgeik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKK2V4dGVybiB1aW50MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF91aW50Myhyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdWludDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25WTG9hZFhfdWludDQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIGxvbmcyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uVkxvYWRYX2xvbmcyKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3Qgeik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKK2V4dGVybiBsb25nMyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF9sb25nMyhyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gbG9uZzQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25WTG9hZFhfbG9uZzQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHVsb25nMiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF91bG9uZzIocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHVsb25nMyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF91bG9uZzMocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHVsb25nNCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZMb2FkWF91bG9uZzQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KTsKKyNlbmRpZgorCisvKgorICogcnNBbGxvY2F0aW9uVlN0b3JlWDogU3RvcmUgYSB2ZWN0b3IgaW50byBhbiBhbGxvY2F0aW9uIG9mIHNjYWxhcnMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHN0b3JlcyB0aGUgZW50cmllcyBvZiBhIHZlY3RvciBpbnRvIHN1Y2Nlc3NpdmUgY2VsbHMgb2YgYW4gYWxsb2NhdGlvbi4KKyAqIEl0IGFzc3VtZXMgdGhhdCB0aGUgYWxsb2NhdGlvbiBjb250YWlucyBzY2FsYXJzLgorICoKKyAqIFRoZSAiWCIgaW4gdGhlIG5hbWUgaW5kaWNhdGVzIHRoYXQgc3VjY2Vzc2l2ZSB2YWx1ZXMgYXJlIHN0b3JlZCBieSBpbmNyZWFzaW5nCisgKiB0aGUgWCBpbmRleC4gIFRoZXJlIGFyZSBjdXJyZW50bHkgbm8gZnVuY3Rpb25zIHRvIHN0b3JlIHN1Y2Nlc3NpdmUgdmFsdWVzCisgKiBpbmNyZW1lbnRpbmcgb3RoZXIgZGltZW5zaW9ucy4gIFVzZSBtdWx0aXBsZSBjYWxscyB0byByc1NldEVsZW1lbnRBdCgpIGluc3RlYWQuCisgKgorICogRm9yIGV4YW1wbGUsIHdoZW4gY2FsbGluZyByc0FsbG9jYXRpb25WU3RvcmVYX2ludDMoYSwgdiwgMjAsIDMwKSwgdi54IGlzIHN0b3JlZAorICogYXQgYVsyMCwgMzBdLCB2LnkgYXQgYVsyMSwgMzBdLCBhbmQgdi56IGF0IGFbMjIsIDMwXS4KKyAqCisgKiBXaGVuIHN0b3JpbmcgaW50byBhIHRocmVlIGRpbWVuc2lvbmFsIGFsbG9jYXRpb25zLCB1c2UgdGhlIHgsIHksIHogdmFyaWFudC4KKyAqIFNpbWlsYXJseSwgdXNlIHRoZSB4LCB5IHZhcmlhbnQgZm9yIHR3byBkaW1lbnNpb25hbCBhbGxvY2F0aW9ucyBhbmQgeCBmb3IgdGhlCisgKiBtb25vIGRpbWVuc2lvbmFsIGFsbG9jYXRpb25zLgorICoKKyAqIEZvciBlZmZpY2llbmN5LCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IHZhbGlkYXRlIHRoZSBpbnB1dHMuICBUcnlpbmcgdG8gd3JhcCB0aGUKKyAqIFggaW5kZXgsIGV4Y2VlZGluZyB0aGUgc2l6ZSBvZiB0aGUgYWxsb2NhdGlvbiwgb3IgdXNpbmcgaW5kaWNlcyBpbmNvbXBhdGlibGUKKyAqIHdpdGggdGhlIGRpbWVuc2lvbmFsaXR5IG9mIHRoZSBhbGxvY2F0aW9uIHlpZWxzIHVuZGVmaW5lZCByZXN1bHRzLgorICoKKyAqIFNlZSBhbHNvIHJzQWxsb2NhdGlvblZMb2FkWCgpLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgIGE6IEFsbG9jYXRpb24gdG8gc3RvcmUgdGhlIGRhdGEgaW50by4KKyAqICAgdmFsOiBWYWx1ZSB0byBiZSBzdG9yZWQuCisgKiAgIHg6IFggb2Zmc2V0IGluIHRoZSBhbGxvY2F0aW9uIG9mIHRoZSBmaXJzdCBjZWxsIHRvIGJlIGNvcGllZCBpbnRvLgorICogICB5OiBZIG9mZnNldCBpbiB0aGUgYWxsb2NhdGlvbiBvZiB0aGUgZmlyc3QgY2VsbCB0byBiZSBjb3BpZWQgaW50by4KKyAqICAgejogWiBvZmZzZXQgaW4gdGhlIGFsbG9jYXRpb24gb2YgdGhlIGZpcnN0IGNlbGwgdG8gYmUgY29waWVkIGludG8uCisgKi8KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfZmxvYXQyKHJzX2FsbG9jYXRpb24gYSwgZmxvYXQyIHZhbCwgdWludDMyX3QgeCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uVlN0b3JlWF9mbG9hdDMocnNfYWxsb2NhdGlvbiBhLCBmbG9hdDMgdmFsLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25WU3RvcmVYX2Zsb2F0NChyc19hbGxvY2F0aW9uIGEsIGZsb2F0NCB2YWwsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfZG91YmxlMihyc19hbGxvY2F0aW9uIGEsIGRvdWJsZTIgdmFsLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25WU3RvcmVYX2RvdWJsZTMocnNfYWxsb2NhdGlvbiBhLCBkb3VibGUzIHZhbCwgdWludDMyX3QgeCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uVlN0b3JlWF9kb3VibGU0KHJzX2FsbG9jYXRpb24gYSwgZG91YmxlNCB2YWwsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfY2hhcjIocnNfYWxsb2NhdGlvbiBhLCBjaGFyMiB2YWwsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfY2hhcjMocnNfYWxsb2NhdGlvbiBhLCBjaGFyMyB2YWwsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfY2hhcjQocnNfYWxsb2NhdGlvbiBhLCBjaGFyNCB2YWwsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfdWNoYXIyKHJzX2FsbG9jYXRpb24gYSwgdWNoYXIyIHZhbCwgdWludDMyX3QgeCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uVlN0b3JlWF91Y2hhcjMocnNfYWxsb2NhdGlvbiBhLCB1Y2hhcjMgdmFsLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25WU3RvcmVYX3VjaGFyNChyc19hbGxvY2F0aW9uIGEsIHVjaGFyNCB2YWwsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfc2hvcnQyKHJzX2FsbG9jYXRpb24gYSwgc2hvcnQyIHZhbCwgdWludDMyX3QgeCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uVlN0b3JlWF9zaG9ydDMocnNfYWxsb2NhdGlvbiBhLCBzaG9ydDMgdmFsLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25WU3RvcmVYX3Nob3J0NChyc19hbGxvY2F0aW9uIGEsIHNob3J0NCB2YWwsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfdXNob3J0Mihyc19hbGxvY2F0aW9uIGEsIHVzaG9ydDIgdmFsLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25WU3RvcmVYX3VzaG9ydDMocnNfYWxsb2NhdGlvbiBhLCB1c2hvcnQzIHZhbCwgdWludDMyX3QgeCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uVlN0b3JlWF91c2hvcnQ0KHJzX2FsbG9jYXRpb24gYSwgdXNob3J0NCB2YWwsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfaW50Mihyc19hbGxvY2F0aW9uIGEsIGludDIgdmFsLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25WU3RvcmVYX2ludDMocnNfYWxsb2NhdGlvbiBhLCBpbnQzIHZhbCwgdWludDMyX3QgeCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uVlN0b3JlWF9pbnQ0KHJzX2FsbG9jYXRpb24gYSwgaW50NCB2YWwsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfdWludDIocnNfYWxsb2NhdGlvbiBhLCB1aW50MiB2YWwsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfdWludDMocnNfYWxsb2NhdGlvbiBhLCB1aW50MyB2YWwsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfdWludDQocnNfYWxsb2NhdGlvbiBhLCB1aW50NCB2YWwsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfbG9uZzIocnNfYWxsb2NhdGlvbiBhLCBsb25nMiB2YWwsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfbG9uZzMocnNfYWxsb2NhdGlvbiBhLCBsb25nMyB2YWwsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfbG9uZzQocnNfYWxsb2NhdGlvbiBhLCBsb25nNCB2YWwsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfdWxvbmcyKHJzX2FsbG9jYXRpb24gYSwgdWxvbmcyIHZhbCwgdWludDMyX3QgeCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uVlN0b3JlWF91bG9uZzMocnNfYWxsb2NhdGlvbiBhLCB1bG9uZzMgdmFsLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25WU3RvcmVYX3Vsb25nNChyc19hbGxvY2F0aW9uIGEsIHVsb25nNCB2YWwsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfZmxvYXQyKHJzX2FsbG9jYXRpb24gYSwgZmxvYXQyIHZhbCwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uVlN0b3JlWF9mbG9hdDMocnNfYWxsb2NhdGlvbiBhLCBmbG9hdDMgdmFsLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25WU3RvcmVYX2Zsb2F0NChyc19hbGxvY2F0aW9uIGEsIGZsb2F0NCB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfZG91YmxlMihyc19hbGxvY2F0aW9uIGEsIGRvdWJsZTIgdmFsLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25WU3RvcmVYX2RvdWJsZTMocnNfYWxsb2NhdGlvbiBhLCBkb3VibGUzIHZhbCwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uVlN0b3JlWF9kb3VibGU0KHJzX2FsbG9jYXRpb24gYSwgZG91YmxlNCB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfY2hhcjIocnNfYWxsb2NhdGlvbiBhLCBjaGFyMiB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfY2hhcjMocnNfYWxsb2NhdGlvbiBhLCBjaGFyMyB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfY2hhcjQocnNfYWxsb2NhdGlvbiBhLCBjaGFyNCB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfdWNoYXIyKHJzX2FsbG9jYXRpb24gYSwgdWNoYXIyIHZhbCwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uVlN0b3JlWF91Y2hhcjMocnNfYWxsb2NhdGlvbiBhLCB1Y2hhcjMgdmFsLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25WU3RvcmVYX3VjaGFyNChyc19hbGxvY2F0aW9uIGEsIHVjaGFyNCB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfc2hvcnQyKHJzX2FsbG9jYXRpb24gYSwgc2hvcnQyIHZhbCwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uVlN0b3JlWF9zaG9ydDMocnNfYWxsb2NhdGlvbiBhLCBzaG9ydDMgdmFsLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25WU3RvcmVYX3Nob3J0NChyc19hbGxvY2F0aW9uIGEsIHNob3J0NCB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfdXNob3J0Mihyc19hbGxvY2F0aW9uIGEsIHVzaG9ydDIgdmFsLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25WU3RvcmVYX3VzaG9ydDMocnNfYWxsb2NhdGlvbiBhLCB1c2hvcnQzIHZhbCwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uVlN0b3JlWF91c2hvcnQ0KHJzX2FsbG9jYXRpb24gYSwgdXNob3J0NCB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfaW50Mihyc19hbGxvY2F0aW9uIGEsIGludDIgdmFsLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25WU3RvcmVYX2ludDMocnNfYWxsb2NhdGlvbiBhLCBpbnQzIHZhbCwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uVlN0b3JlWF9pbnQ0KHJzX2FsbG9jYXRpb24gYSwgaW50NCB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfdWludDIocnNfYWxsb2NhdGlvbiBhLCB1aW50MiB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfdWludDMocnNfYWxsb2NhdGlvbiBhLCB1aW50MyB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfdWludDQocnNfYWxsb2NhdGlvbiBhLCB1aW50NCB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfbG9uZzIocnNfYWxsb2NhdGlvbiBhLCBsb25nMiB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfbG9uZzMocnNfYWxsb2NhdGlvbiBhLCBsb25nMyB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfbG9uZzQocnNfYWxsb2NhdGlvbiBhLCBsb25nNCB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfdWxvbmcyKHJzX2FsbG9jYXRpb24gYSwgdWxvbmcyIHZhbCwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uVlN0b3JlWF91bG9uZzMocnNfYWxsb2NhdGlvbiBhLCB1bG9uZzMgdmFsLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25WU3RvcmVYX3Vsb25nNChyc19hbGxvY2F0aW9uIGEsIHVsb25nNCB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfZmxvYXQyKHJzX2FsbG9jYXRpb24gYSwgZmxvYXQyIHZhbCwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3Qgeik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uVlN0b3JlWF9mbG9hdDMocnNfYWxsb2NhdGlvbiBhLCBmbG9hdDMgdmFsLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25WU3RvcmVYX2Zsb2F0NChyc19hbGxvY2F0aW9uIGEsIGZsb2F0NCB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfZG91YmxlMihyc19hbGxvY2F0aW9uIGEsIGRvdWJsZTIgdmFsLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25WU3RvcmVYX2RvdWJsZTMocnNfYWxsb2NhdGlvbiBhLCBkb3VibGUzIHZhbCwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3Qgeik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uVlN0b3JlWF9kb3VibGU0KHJzX2FsbG9jYXRpb24gYSwgZG91YmxlNCB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfY2hhcjIocnNfYWxsb2NhdGlvbiBhLCBjaGFyMiB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfY2hhcjMocnNfYWxsb2NhdGlvbiBhLCBjaGFyMyB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfY2hhcjQocnNfYWxsb2NhdGlvbiBhLCBjaGFyNCB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfdWNoYXIyKHJzX2FsbG9jYXRpb24gYSwgdWNoYXIyIHZhbCwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3Qgeik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uVlN0b3JlWF91Y2hhcjMocnNfYWxsb2NhdGlvbiBhLCB1Y2hhcjMgdmFsLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25WU3RvcmVYX3VjaGFyNChyc19hbGxvY2F0aW9uIGEsIHVjaGFyNCB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfc2hvcnQyKHJzX2FsbG9jYXRpb24gYSwgc2hvcnQyIHZhbCwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3Qgeik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uVlN0b3JlWF9zaG9ydDMocnNfYWxsb2NhdGlvbiBhLCBzaG9ydDMgdmFsLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25WU3RvcmVYX3Nob3J0NChyc19hbGxvY2F0aW9uIGEsIHNob3J0NCB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfdXNob3J0Mihyc19hbGxvY2F0aW9uIGEsIHVzaG9ydDIgdmFsLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25WU3RvcmVYX3VzaG9ydDMocnNfYWxsb2NhdGlvbiBhLCB1c2hvcnQzIHZhbCwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3Qgeik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uVlN0b3JlWF91c2hvcnQ0KHJzX2FsbG9jYXRpb24gYSwgdXNob3J0NCB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfaW50Mihyc19hbGxvY2F0aW9uIGEsIGludDIgdmFsLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25WU3RvcmVYX2ludDMocnNfYWxsb2NhdGlvbiBhLCBpbnQzIHZhbCwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3Qgeik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uVlN0b3JlWF9pbnQ0KHJzX2FsbG9jYXRpb24gYSwgaW50NCB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfdWludDIocnNfYWxsb2NhdGlvbiBhLCB1aW50MiB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfdWludDMocnNfYWxsb2NhdGlvbiBhLCB1aW50MyB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfdWludDQocnNfYWxsb2NhdGlvbiBhLCB1aW50NCB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfbG9uZzIocnNfYWxsb2NhdGlvbiBhLCBsb25nMiB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfbG9uZzMocnNfYWxsb2NhdGlvbiBhLCBsb25nMyB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfbG9uZzQocnNfYWxsb2NhdGlvbiBhLCBsb25nNCB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvblZTdG9yZVhfdWxvbmcyKHJzX2FsbG9jYXRpb24gYSwgdWxvbmcyIHZhbCwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3Qgeik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uVlN0b3JlWF91bG9uZzMocnNfYWxsb2NhdGlvbiBhLCB1bG9uZzMgdmFsLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25WU3RvcmVYX3Vsb25nNChyc19hbGxvY2F0aW9uIGEsIHVsb25nNCB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKy8qCisgKiByc0dldEVsZW1lbnRBdDogUmV0dXJuIGEgY2VsbCBmcm9tIGFuIGFsbG9jYXRpb24KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGV4dHJhY3RzIGEgc2luZ2xlIGNlbGwgZnJvbSBhbiBhbGxvY2F0aW9uLgorICoKKyAqIFdoZW4gcmV0cmlldmluZyBmcm9tIGEgdGhyZWUgZGltZW5zaW9uYWwgYWxsb2NhdGlvbnMsIHVzZSB0aGUgeCwgeSwgeiB2YXJpYW50LgorICogU2ltaWxhcmx5LCB1c2UgdGhlIHgsIHkgdmFyaWFudCBmb3IgdHdvIGRpbWVuc2lvbmFsIGFsbG9jYXRpb25zIGFuZCB4IGZvciB0aGUKKyAqIG1vbm8gZGltZW5zaW9uYWwgYWxsb2NhdGlvbnMuCisgKgorICogVGhpcyBmdW5jdGlvbiBoYXMgdHdvIHN0eWxlcy4gIE9uZSByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSB2YWx1ZSB1c2luZyBhIHZvaWQqLAorICogdGhlIG90aGVyIHJldHVybnMgdGhlIGFjdHVhbCB2YWx1ZSwgZS5nLiByc0dldEVsZW1lbnRBdCgpIHZzLiByc0dldEVsZW1lbnRBdF9pbnQ0KCkuCisgKiBGb3IgcHJpbWl0aXZlIHR5cGVzLCBhbHdheXMgdXNlIHRoZSBsYXR0ZXIgYXMgaXQgaXMgbW9yZSBlZmZpY2llbnQuCisgKi8KK2V4dGVybiBjb25zdCB2b2lkKiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0KHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCk7CisKK2V4dGVybiBjb25zdCB2b2lkKiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0KHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisKK2V4dGVybiBjb25zdCB2b2lkKiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0KHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3Qgeik7CisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAxNykKK3N0YXRpYyBpbmxpbmUgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9mbG9hdChyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgpIHsKKyAgICByZXR1cm4gKChmbG9hdCAqKXJzR2V0RWxlbWVudEF0KGEsIHgpKVswXTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMTcpCitzdGF0aWMgaW5saW5lIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X2Zsb2F0Mihyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgpIHsKKyAgICByZXR1cm4gKChmbG9hdDIgKilyc0dldEVsZW1lbnRBdChhLCB4KSlbMF07Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDE3KQorc3RhdGljIGlubGluZSBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9mbG9hdDMocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4KSB7CisgICAgcmV0dXJuICgoZmxvYXQzICopcnNHZXRFbGVtZW50QXQoYSwgeCkpWzBdOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAxNykKK3N0YXRpYyBpbmxpbmUgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfZmxvYXQ0KHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCkgeworICAgIHJldHVybiAoKGZsb2F0NCAqKXJzR2V0RWxlbWVudEF0KGEsIHgpKVswXTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMTcpCitzdGF0aWMgaW5saW5lIGRvdWJsZSBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X2RvdWJsZShyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgpIHsKKyAgICByZXR1cm4gKChkb3VibGUgKilyc0dldEVsZW1lbnRBdChhLCB4KSlbMF07Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDE3KQorc3RhdGljIGlubGluZSBkb3VibGUyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfZG91YmxlMihyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgpIHsKKyAgICByZXR1cm4gKChkb3VibGUyICopcnNHZXRFbGVtZW50QXQoYSwgeCkpWzBdOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAxNykKK3N0YXRpYyBpbmxpbmUgZG91YmxlMyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X2RvdWJsZTMocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4KSB7CisgICAgcmV0dXJuICgoZG91YmxlMyAqKXJzR2V0RWxlbWVudEF0KGEsIHgpKVswXTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMTcpCitzdGF0aWMgaW5saW5lIGRvdWJsZTQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9kb3VibGU0KHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCkgeworICAgIHJldHVybiAoKGRvdWJsZTQgKilyc0dldEVsZW1lbnRBdChhLCB4KSlbMF07Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDE3KQorc3RhdGljIGlubGluZSBjaGFyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfY2hhcihyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgpIHsKKyAgICByZXR1cm4gKChjaGFyICopcnNHZXRFbGVtZW50QXQoYSwgeCkpWzBdOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAxNykKK3N0YXRpYyBpbmxpbmUgY2hhcjIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9jaGFyMihyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgpIHsKKyAgICByZXR1cm4gKChjaGFyMiAqKXJzR2V0RWxlbWVudEF0KGEsIHgpKVswXTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMTcpCitzdGF0aWMgaW5saW5lIGNoYXIzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfY2hhcjMocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4KSB7CisgICAgcmV0dXJuICgoY2hhcjMgKilyc0dldEVsZW1lbnRBdChhLCB4KSlbMF07Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDE3KQorc3RhdGljIGlubGluZSBjaGFyNCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X2NoYXI0KHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCkgeworICAgIHJldHVybiAoKGNoYXI0ICopcnNHZXRFbGVtZW50QXQoYSwgeCkpWzBdOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAxNykKK3N0YXRpYyBpbmxpbmUgdWNoYXIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF91Y2hhcihyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgpIHsKKyAgICByZXR1cm4gKCh1Y2hhciAqKXJzR2V0RWxlbWVudEF0KGEsIHgpKVswXTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMTcpCitzdGF0aWMgaW5saW5lIHVjaGFyMiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X3VjaGFyMihyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgpIHsKKyAgICByZXR1cm4gKCh1Y2hhcjIgKilyc0dldEVsZW1lbnRBdChhLCB4KSlbMF07Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDE3KQorc3RhdGljIGlubGluZSB1Y2hhcjMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF91Y2hhcjMocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4KSB7CisgICAgcmV0dXJuICgodWNoYXIzICopcnNHZXRFbGVtZW50QXQoYSwgeCkpWzBdOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAxNykKK3N0YXRpYyBpbmxpbmUgdWNoYXI0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfdWNoYXI0KHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCkgeworICAgIHJldHVybiAoKHVjaGFyNCAqKXJzR2V0RWxlbWVudEF0KGEsIHgpKVswXTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMTcpCitzdGF0aWMgaW5saW5lIHNob3J0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfc2hvcnQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4KSB7CisgICAgcmV0dXJuICgoc2hvcnQgKilyc0dldEVsZW1lbnRBdChhLCB4KSlbMF07Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDE3KQorc3RhdGljIGlubGluZSBzaG9ydDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9zaG9ydDIocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4KSB7CisgICAgcmV0dXJuICgoc2hvcnQyICopcnNHZXRFbGVtZW50QXQoYSwgeCkpWzBdOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAxNykKK3N0YXRpYyBpbmxpbmUgc2hvcnQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfc2hvcnQzKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCkgeworICAgIHJldHVybiAoKHNob3J0MyAqKXJzR2V0RWxlbWVudEF0KGEsIHgpKVswXTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMTcpCitzdGF0aWMgaW5saW5lIHNob3J0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X3Nob3J0NChyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgpIHsKKyAgICByZXR1cm4gKChzaG9ydDQgKilyc0dldEVsZW1lbnRBdChhLCB4KSlbMF07Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDE3KQorc3RhdGljIGlubGluZSB1c2hvcnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF91c2hvcnQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4KSB7CisgICAgcmV0dXJuICgodXNob3J0ICopcnNHZXRFbGVtZW50QXQoYSwgeCkpWzBdOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAxNykKK3N0YXRpYyBpbmxpbmUgdXNob3J0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X3VzaG9ydDIocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4KSB7CisgICAgcmV0dXJuICgodXNob3J0MiAqKXJzR2V0RWxlbWVudEF0KGEsIHgpKVswXTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMTcpCitzdGF0aWMgaW5saW5lIHVzaG9ydDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF91c2hvcnQzKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCkgeworICAgIHJldHVybiAoKHVzaG9ydDMgKilyc0dldEVsZW1lbnRBdChhLCB4KSlbMF07Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDE3KQorc3RhdGljIGlubGluZSB1c2hvcnQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfdXNob3J0NChyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgpIHsKKyAgICByZXR1cm4gKCh1c2hvcnQ0ICopcnNHZXRFbGVtZW50QXQoYSwgeCkpWzBdOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAxNykKK3N0YXRpYyBpbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfaW50KHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCkgeworICAgIHJldHVybiAoKGludCAqKXJzR2V0RWxlbWVudEF0KGEsIHgpKVswXTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMTcpCitzdGF0aWMgaW5saW5lIGludDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9pbnQyKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCkgeworICAgIHJldHVybiAoKGludDIgKilyc0dldEVsZW1lbnRBdChhLCB4KSlbMF07Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDE3KQorc3RhdGljIGlubGluZSBpbnQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfaW50Myhyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgpIHsKKyAgICByZXR1cm4gKChpbnQzICopcnNHZXRFbGVtZW50QXQoYSwgeCkpWzBdOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAxNykKK3N0YXRpYyBpbmxpbmUgaW50NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X2ludDQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4KSB7CisgICAgcmV0dXJuICgoaW50NCAqKXJzR2V0RWxlbWVudEF0KGEsIHgpKVswXTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMTcpCitzdGF0aWMgaW5saW5lIHVpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF91aW50KHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCkgeworICAgIHJldHVybiAoKHVpbnQgKilyc0dldEVsZW1lbnRBdChhLCB4KSlbMF07Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDE3KQorc3RhdGljIGlubGluZSB1aW50MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X3VpbnQyKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCkgeworICAgIHJldHVybiAoKHVpbnQyICopcnNHZXRFbGVtZW50QXQoYSwgeCkpWzBdOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAxNykKK3N0YXRpYyBpbmxpbmUgdWludDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF91aW50Myhyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgpIHsKKyAgICByZXR1cm4gKCh1aW50MyAqKXJzR2V0RWxlbWVudEF0KGEsIHgpKVswXTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMTcpCitzdGF0aWMgaW5saW5lIHVpbnQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfdWludDQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4KSB7CisgICAgcmV0dXJuICgodWludDQgKilyc0dldEVsZW1lbnRBdChhLCB4KSlbMF07Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDE3KQorc3RhdGljIGlubGluZSBsb25nIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfbG9uZyhyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgpIHsKKyAgICByZXR1cm4gKChsb25nICopcnNHZXRFbGVtZW50QXQoYSwgeCkpWzBdOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAxNykKK3N0YXRpYyBpbmxpbmUgbG9uZzIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9sb25nMihyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgpIHsKKyAgICByZXR1cm4gKChsb25nMiAqKXJzR2V0RWxlbWVudEF0KGEsIHgpKVswXTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMTcpCitzdGF0aWMgaW5saW5lIGxvbmczIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfbG9uZzMocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4KSB7CisgICAgcmV0dXJuICgobG9uZzMgKilyc0dldEVsZW1lbnRBdChhLCB4KSlbMF07Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDE3KQorc3RhdGljIGlubGluZSBsb25nNCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X2xvbmc0KHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCkgeworICAgIHJldHVybiAoKGxvbmc0ICopcnNHZXRFbGVtZW50QXQoYSwgeCkpWzBdOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAxNykKK3N0YXRpYyBpbmxpbmUgdWxvbmcgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF91bG9uZyhyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgpIHsKKyAgICByZXR1cm4gKCh1bG9uZyAqKXJzR2V0RWxlbWVudEF0KGEsIHgpKVswXTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMTcpCitzdGF0aWMgaW5saW5lIHVsb25nMiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X3Vsb25nMihyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgpIHsKKyAgICByZXR1cm4gKCh1bG9uZzIgKilyc0dldEVsZW1lbnRBdChhLCB4KSlbMF07Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDE3KQorc3RhdGljIGlubGluZSB1bG9uZzMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF91bG9uZzMocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4KSB7CisgICAgcmV0dXJuICgodWxvbmczICopcnNHZXRFbGVtZW50QXQoYSwgeCkpWzBdOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAxNykKK3N0YXRpYyBpbmxpbmUgdWxvbmc0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfdWxvbmc0KHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCkgeworICAgIHJldHVybiAoKHVsb25nNCAqKXJzR2V0RWxlbWVudEF0KGEsIHgpKVswXTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMTcpCitzdGF0aWMgaW5saW5lIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfZmxvYXQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KSB7CisgICAgcmV0dXJuICgoZmxvYXQgKilyc0dldEVsZW1lbnRBdChhLCB4LCB5KSlbMF07Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDE3KQorc3RhdGljIGlubGluZSBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9mbG9hdDIocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KSB7CisgICAgcmV0dXJuICgoZmxvYXQyICopcnNHZXRFbGVtZW50QXQoYSwgeCwgeSkpWzBdOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAxNykKK3N0YXRpYyBpbmxpbmUgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfZmxvYXQzKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSkgeworICAgIHJldHVybiAoKGZsb2F0MyAqKXJzR2V0RWxlbWVudEF0KGEsIHgsIHkpKVswXTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMTcpCitzdGF0aWMgaW5saW5lIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X2Zsb2F0NChyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpIHsKKyAgICByZXR1cm4gKChmbG9hdDQgKilyc0dldEVsZW1lbnRBdChhLCB4LCB5KSlbMF07Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDE3KQorc3RhdGljIGlubGluZSBkb3VibGUgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9kb3VibGUocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KSB7CisgICAgcmV0dXJuICgoZG91YmxlICopcnNHZXRFbGVtZW50QXQoYSwgeCwgeSkpWzBdOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAxNykKK3N0YXRpYyBpbmxpbmUgZG91YmxlMiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X2RvdWJsZTIocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KSB7CisgICAgcmV0dXJuICgoZG91YmxlMiAqKXJzR2V0RWxlbWVudEF0KGEsIHgsIHkpKVswXTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMTcpCitzdGF0aWMgaW5saW5lIGRvdWJsZTMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9kb3VibGUzKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSkgeworICAgIHJldHVybiAoKGRvdWJsZTMgKilyc0dldEVsZW1lbnRBdChhLCB4LCB5KSlbMF07Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDE3KQorc3RhdGljIGlubGluZSBkb3VibGU0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfZG91YmxlNChyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpIHsKKyAgICByZXR1cm4gKChkb3VibGU0ICopcnNHZXRFbGVtZW50QXQoYSwgeCwgeSkpWzBdOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAxNykKK3N0YXRpYyBpbmxpbmUgY2hhciBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X2NoYXIocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KSB7CisgICAgcmV0dXJuICgoY2hhciAqKXJzR2V0RWxlbWVudEF0KGEsIHgsIHkpKVswXTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMTcpCitzdGF0aWMgaW5saW5lIGNoYXIyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfY2hhcjIocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KSB7CisgICAgcmV0dXJuICgoY2hhcjIgKilyc0dldEVsZW1lbnRBdChhLCB4LCB5KSlbMF07Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDE3KQorc3RhdGljIGlubGluZSBjaGFyMyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X2NoYXIzKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSkgeworICAgIHJldHVybiAoKGNoYXIzICopcnNHZXRFbGVtZW50QXQoYSwgeCwgeSkpWzBdOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAxNykKK3N0YXRpYyBpbmxpbmUgY2hhcjQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9jaGFyNChyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpIHsKKyAgICByZXR1cm4gKChjaGFyNCAqKXJzR2V0RWxlbWVudEF0KGEsIHgsIHkpKVswXTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMTcpCitzdGF0aWMgaW5saW5lIHVjaGFyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfdWNoYXIocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KSB7CisgICAgcmV0dXJuICgodWNoYXIgKilyc0dldEVsZW1lbnRBdChhLCB4LCB5KSlbMF07Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDE3KQorc3RhdGljIGlubGluZSB1Y2hhcjIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF91Y2hhcjIocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KSB7CisgICAgcmV0dXJuICgodWNoYXIyICopcnNHZXRFbGVtZW50QXQoYSwgeCwgeSkpWzBdOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAxNykKK3N0YXRpYyBpbmxpbmUgdWNoYXIzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfdWNoYXIzKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSkgeworICAgIHJldHVybiAoKHVjaGFyMyAqKXJzR2V0RWxlbWVudEF0KGEsIHgsIHkpKVswXTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMTcpCitzdGF0aWMgaW5saW5lIHVjaGFyNCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X3VjaGFyNChyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpIHsKKyAgICByZXR1cm4gKCh1Y2hhcjQgKilyc0dldEVsZW1lbnRBdChhLCB4LCB5KSlbMF07Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDE3KQorc3RhdGljIGlubGluZSBzaG9ydCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X3Nob3J0KHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSkgeworICAgIHJldHVybiAoKHNob3J0ICopcnNHZXRFbGVtZW50QXQoYSwgeCwgeSkpWzBdOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAxNykKK3N0YXRpYyBpbmxpbmUgc2hvcnQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfc2hvcnQyKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSkgeworICAgIHJldHVybiAoKHNob3J0MiAqKXJzR2V0RWxlbWVudEF0KGEsIHgsIHkpKVswXTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMTcpCitzdGF0aWMgaW5saW5lIHNob3J0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X3Nob3J0Myhyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpIHsKKyAgICByZXR1cm4gKChzaG9ydDMgKilyc0dldEVsZW1lbnRBdChhLCB4LCB5KSlbMF07Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDE3KQorc3RhdGljIGlubGluZSBzaG9ydDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9zaG9ydDQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KSB7CisgICAgcmV0dXJuICgoc2hvcnQ0ICopcnNHZXRFbGVtZW50QXQoYSwgeCwgeSkpWzBdOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAxNykKK3N0YXRpYyBpbmxpbmUgdXNob3J0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfdXNob3J0KHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSkgeworICAgIHJldHVybiAoKHVzaG9ydCAqKXJzR2V0RWxlbWVudEF0KGEsIHgsIHkpKVswXTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMTcpCitzdGF0aWMgaW5saW5lIHVzaG9ydDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF91c2hvcnQyKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSkgeworICAgIHJldHVybiAoKHVzaG9ydDIgKilyc0dldEVsZW1lbnRBdChhLCB4LCB5KSlbMF07Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDE3KQorc3RhdGljIGlubGluZSB1c2hvcnQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfdXNob3J0Myhyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpIHsKKyAgICByZXR1cm4gKCh1c2hvcnQzICopcnNHZXRFbGVtZW50QXQoYSwgeCwgeSkpWzBdOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAxNykKK3N0YXRpYyBpbmxpbmUgdXNob3J0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X3VzaG9ydDQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KSB7CisgICAgcmV0dXJuICgodXNob3J0NCAqKXJzR2V0RWxlbWVudEF0KGEsIHgsIHkpKVswXTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMTcpCitzdGF0aWMgaW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X2ludChyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpIHsKKyAgICByZXR1cm4gKChpbnQgKilyc0dldEVsZW1lbnRBdChhLCB4LCB5KSlbMF07Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDE3KQorc3RhdGljIGlubGluZSBpbnQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfaW50Mihyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpIHsKKyAgICByZXR1cm4gKChpbnQyICopcnNHZXRFbGVtZW50QXQoYSwgeCwgeSkpWzBdOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAxNykKK3N0YXRpYyBpbmxpbmUgaW50MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X2ludDMocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KSB7CisgICAgcmV0dXJuICgoaW50MyAqKXJzR2V0RWxlbWVudEF0KGEsIHgsIHkpKVswXTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMTcpCitzdGF0aWMgaW5saW5lIGludDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9pbnQ0KHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSkgeworICAgIHJldHVybiAoKGludDQgKilyc0dldEVsZW1lbnRBdChhLCB4LCB5KSlbMF07Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDE3KQorc3RhdGljIGlubGluZSB1aW50IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfdWludChyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpIHsKKyAgICByZXR1cm4gKCh1aW50ICopcnNHZXRFbGVtZW50QXQoYSwgeCwgeSkpWzBdOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAxNykKK3N0YXRpYyBpbmxpbmUgdWludDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF91aW50Mihyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpIHsKKyAgICByZXR1cm4gKCh1aW50MiAqKXJzR2V0RWxlbWVudEF0KGEsIHgsIHkpKVswXTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMTcpCitzdGF0aWMgaW5saW5lIHVpbnQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfdWludDMocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KSB7CisgICAgcmV0dXJuICgodWludDMgKilyc0dldEVsZW1lbnRBdChhLCB4LCB5KSlbMF07Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDE3KQorc3RhdGljIGlubGluZSB1aW50NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X3VpbnQ0KHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSkgeworICAgIHJldHVybiAoKHVpbnQ0ICopcnNHZXRFbGVtZW50QXQoYSwgeCwgeSkpWzBdOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAxNykKK3N0YXRpYyBpbmxpbmUgbG9uZyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X2xvbmcocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KSB7CisgICAgcmV0dXJuICgobG9uZyAqKXJzR2V0RWxlbWVudEF0KGEsIHgsIHkpKVswXTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMTcpCitzdGF0aWMgaW5saW5lIGxvbmcyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfbG9uZzIocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KSB7CisgICAgcmV0dXJuICgobG9uZzIgKilyc0dldEVsZW1lbnRBdChhLCB4LCB5KSlbMF07Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDE3KQorc3RhdGljIGlubGluZSBsb25nMyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X2xvbmczKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSkgeworICAgIHJldHVybiAoKGxvbmczICopcnNHZXRFbGVtZW50QXQoYSwgeCwgeSkpWzBdOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAxNykKK3N0YXRpYyBpbmxpbmUgbG9uZzQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9sb25nNChyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpIHsKKyAgICByZXR1cm4gKChsb25nNCAqKXJzR2V0RWxlbWVudEF0KGEsIHgsIHkpKVswXTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMTcpCitzdGF0aWMgaW5saW5lIHVsb25nIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfdWxvbmcocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KSB7CisgICAgcmV0dXJuICgodWxvbmcgKilyc0dldEVsZW1lbnRBdChhLCB4LCB5KSlbMF07Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDE3KQorc3RhdGljIGlubGluZSB1bG9uZzIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF91bG9uZzIocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KSB7CisgICAgcmV0dXJuICgodWxvbmcyICopcnNHZXRFbGVtZW50QXQoYSwgeCwgeSkpWzBdOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAxNykKK3N0YXRpYyBpbmxpbmUgdWxvbmczIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfdWxvbmczKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSkgeworICAgIHJldHVybiAoKHVsb25nMyAqKXJzR2V0RWxlbWVudEF0KGEsIHgsIHkpKVswXTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMTcpCitzdGF0aWMgaW5saW5lIHVsb25nNCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X3Vsb25nNChyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpIHsKKyAgICByZXR1cm4gKCh1bG9uZzQgKilyc0dldEVsZW1lbnRBdChhLCB4LCB5KSlbMF07Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDE3KQorc3RhdGljIGlubGluZSBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X2Zsb2F0KHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3QgeikgeworICAgIHJldHVybiAoKGZsb2F0ICopcnNHZXRFbGVtZW50QXQoYSwgeCwgeSwgeikpWzBdOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAxNykKK3N0YXRpYyBpbmxpbmUgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfZmxvYXQyKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3QgeikgeworICAgIHJldHVybiAoKGZsb2F0MiAqKXJzR2V0RWxlbWVudEF0KGEsIHgsIHksIHopKVswXTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMTcpCitzdGF0aWMgaW5saW5lIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X2Zsb2F0Myhyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopIHsKKyAgICByZXR1cm4gKChmbG9hdDMgKilyc0dldEVsZW1lbnRBdChhLCB4LCB5LCB6KSlbMF07Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDE3KQorc3RhdGljIGlubGluZSBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9mbG9hdDQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KSB7CisgICAgcmV0dXJuICgoZmxvYXQ0ICopcnNHZXRFbGVtZW50QXQoYSwgeCwgeSwgeikpWzBdOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAxNykKK3N0YXRpYyBpbmxpbmUgZG91YmxlIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfZG91YmxlKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3QgeikgeworICAgIHJldHVybiAoKGRvdWJsZSAqKXJzR2V0RWxlbWVudEF0KGEsIHgsIHksIHopKVswXTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMTcpCitzdGF0aWMgaW5saW5lIGRvdWJsZTIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9kb3VibGUyKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3QgeikgeworICAgIHJldHVybiAoKGRvdWJsZTIgKilyc0dldEVsZW1lbnRBdChhLCB4LCB5LCB6KSlbMF07Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDE3KQorc3RhdGljIGlubGluZSBkb3VibGUzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfZG91YmxlMyhyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopIHsKKyAgICByZXR1cm4gKChkb3VibGUzICopcnNHZXRFbGVtZW50QXQoYSwgeCwgeSwgeikpWzBdOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAxNykKK3N0YXRpYyBpbmxpbmUgZG91YmxlNCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X2RvdWJsZTQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KSB7CisgICAgcmV0dXJuICgoZG91YmxlNCAqKXJzR2V0RWxlbWVudEF0KGEsIHgsIHksIHopKVswXTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMTcpCitzdGF0aWMgaW5saW5lIGNoYXIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9jaGFyKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3QgeikgeworICAgIHJldHVybiAoKGNoYXIgKilyc0dldEVsZW1lbnRBdChhLCB4LCB5LCB6KSlbMF07Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDE3KQorc3RhdGljIGlubGluZSBjaGFyMiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X2NoYXIyKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3QgeikgeworICAgIHJldHVybiAoKGNoYXIyICopcnNHZXRFbGVtZW50QXQoYSwgeCwgeSwgeikpWzBdOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAxNykKK3N0YXRpYyBpbmxpbmUgY2hhcjMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9jaGFyMyhyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopIHsKKyAgICByZXR1cm4gKChjaGFyMyAqKXJzR2V0RWxlbWVudEF0KGEsIHgsIHksIHopKVswXTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMTcpCitzdGF0aWMgaW5saW5lIGNoYXI0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfY2hhcjQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KSB7CisgICAgcmV0dXJuICgoY2hhcjQgKilyc0dldEVsZW1lbnRBdChhLCB4LCB5LCB6KSlbMF07Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDE3KQorc3RhdGljIGlubGluZSB1Y2hhciBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X3VjaGFyKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3QgeikgeworICAgIHJldHVybiAoKHVjaGFyICopcnNHZXRFbGVtZW50QXQoYSwgeCwgeSwgeikpWzBdOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAxNykKK3N0YXRpYyBpbmxpbmUgdWNoYXIyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfdWNoYXIyKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3QgeikgeworICAgIHJldHVybiAoKHVjaGFyMiAqKXJzR2V0RWxlbWVudEF0KGEsIHgsIHksIHopKVswXTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMTcpCitzdGF0aWMgaW5saW5lIHVjaGFyMyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X3VjaGFyMyhyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopIHsKKyAgICByZXR1cm4gKCh1Y2hhcjMgKilyc0dldEVsZW1lbnRBdChhLCB4LCB5LCB6KSlbMF07Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDE3KQorc3RhdGljIGlubGluZSB1Y2hhcjQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF91Y2hhcjQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KSB7CisgICAgcmV0dXJuICgodWNoYXI0ICopcnNHZXRFbGVtZW50QXQoYSwgeCwgeSwgeikpWzBdOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAxNykKK3N0YXRpYyBpbmxpbmUgc2hvcnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9zaG9ydChyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopIHsKKyAgICByZXR1cm4gKChzaG9ydCAqKXJzR2V0RWxlbWVudEF0KGEsIHgsIHksIHopKVswXTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMTcpCitzdGF0aWMgaW5saW5lIHNob3J0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X3Nob3J0Mihyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopIHsKKyAgICByZXR1cm4gKChzaG9ydDIgKilyc0dldEVsZW1lbnRBdChhLCB4LCB5LCB6KSlbMF07Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDE3KQorc3RhdGljIGlubGluZSBzaG9ydDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9zaG9ydDMocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KSB7CisgICAgcmV0dXJuICgoc2hvcnQzICopcnNHZXRFbGVtZW50QXQoYSwgeCwgeSwgeikpWzBdOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAxNykKK3N0YXRpYyBpbmxpbmUgc2hvcnQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfc2hvcnQ0KHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3QgeikgeworICAgIHJldHVybiAoKHNob3J0NCAqKXJzR2V0RWxlbWVudEF0KGEsIHgsIHksIHopKVswXTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMTcpCitzdGF0aWMgaW5saW5lIHVzaG9ydCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X3VzaG9ydChyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopIHsKKyAgICByZXR1cm4gKCh1c2hvcnQgKilyc0dldEVsZW1lbnRBdChhLCB4LCB5LCB6KSlbMF07Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDE3KQorc3RhdGljIGlubGluZSB1c2hvcnQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfdXNob3J0Mihyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopIHsKKyAgICByZXR1cm4gKCh1c2hvcnQyICopcnNHZXRFbGVtZW50QXQoYSwgeCwgeSwgeikpWzBdOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAxNykKK3N0YXRpYyBpbmxpbmUgdXNob3J0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X3VzaG9ydDMocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KSB7CisgICAgcmV0dXJuICgodXNob3J0MyAqKXJzR2V0RWxlbWVudEF0KGEsIHgsIHksIHopKVswXTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMTcpCitzdGF0aWMgaW5saW5lIHVzaG9ydDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF91c2hvcnQ0KHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3QgeikgeworICAgIHJldHVybiAoKHVzaG9ydDQgKilyc0dldEVsZW1lbnRBdChhLCB4LCB5LCB6KSlbMF07Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDE3KQorc3RhdGljIGlubGluZSBpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9pbnQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KSB7CisgICAgcmV0dXJuICgoaW50ICopcnNHZXRFbGVtZW50QXQoYSwgeCwgeSwgeikpWzBdOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAxNykKK3N0YXRpYyBpbmxpbmUgaW50MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X2ludDIocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KSB7CisgICAgcmV0dXJuICgoaW50MiAqKXJzR2V0RWxlbWVudEF0KGEsIHgsIHksIHopKVswXTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMTcpCitzdGF0aWMgaW5saW5lIGludDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9pbnQzKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3QgeikgeworICAgIHJldHVybiAoKGludDMgKilyc0dldEVsZW1lbnRBdChhLCB4LCB5LCB6KSlbMF07Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDE3KQorc3RhdGljIGlubGluZSBpbnQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfaW50NChyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopIHsKKyAgICByZXR1cm4gKChpbnQ0ICopcnNHZXRFbGVtZW50QXQoYSwgeCwgeSwgeikpWzBdOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAxNykKK3N0YXRpYyBpbmxpbmUgdWludCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X3VpbnQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KSB7CisgICAgcmV0dXJuICgodWludCAqKXJzR2V0RWxlbWVudEF0KGEsIHgsIHksIHopKVswXTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMTcpCitzdGF0aWMgaW5saW5lIHVpbnQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfdWludDIocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KSB7CisgICAgcmV0dXJuICgodWludDIgKilyc0dldEVsZW1lbnRBdChhLCB4LCB5LCB6KSlbMF07Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDE3KQorc3RhdGljIGlubGluZSB1aW50MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X3VpbnQzKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3QgeikgeworICAgIHJldHVybiAoKHVpbnQzICopcnNHZXRFbGVtZW50QXQoYSwgeCwgeSwgeikpWzBdOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAxNykKK3N0YXRpYyBpbmxpbmUgdWludDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF91aW50NChyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopIHsKKyAgICByZXR1cm4gKCh1aW50NCAqKXJzR2V0RWxlbWVudEF0KGEsIHgsIHksIHopKVswXTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMTcpCitzdGF0aWMgaW5saW5lIGxvbmcgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9sb25nKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3QgeikgeworICAgIHJldHVybiAoKGxvbmcgKilyc0dldEVsZW1lbnRBdChhLCB4LCB5LCB6KSlbMF07Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDE3KQorc3RhdGljIGlubGluZSBsb25nMiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X2xvbmcyKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3QgeikgeworICAgIHJldHVybiAoKGxvbmcyICopcnNHZXRFbGVtZW50QXQoYSwgeCwgeSwgeikpWzBdOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAxNykKK3N0YXRpYyBpbmxpbmUgbG9uZzMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9sb25nMyhyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopIHsKKyAgICByZXR1cm4gKChsb25nMyAqKXJzR2V0RWxlbWVudEF0KGEsIHgsIHksIHopKVswXTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMTcpCitzdGF0aWMgaW5saW5lIGxvbmc0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfbG9uZzQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KSB7CisgICAgcmV0dXJuICgobG9uZzQgKilyc0dldEVsZW1lbnRBdChhLCB4LCB5LCB6KSlbMF07Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDE3KQorc3RhdGljIGlubGluZSB1bG9uZyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X3Vsb25nKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3QgeikgeworICAgIHJldHVybiAoKHVsb25nICopcnNHZXRFbGVtZW50QXQoYSwgeCwgeSwgeikpWzBdOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAxNykKK3N0YXRpYyBpbmxpbmUgdWxvbmcyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfdWxvbmcyKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3QgeikgeworICAgIHJldHVybiAoKHVsb25nMiAqKXJzR2V0RWxlbWVudEF0KGEsIHgsIHksIHopKVswXTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMTcpCitzdGF0aWMgaW5saW5lIHVsb25nMyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X3Vsb25nMyhyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopIHsKKyAgICByZXR1cm4gKCh1bG9uZzMgKilyc0dldEVsZW1lbnRBdChhLCB4LCB5LCB6KSlbMF07Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDE3KQorc3RhdGljIGlubGluZSB1bG9uZzQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF91bG9uZzQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KSB7CisgICAgcmV0dXJuICgodWxvbmc0ICopcnNHZXRFbGVtZW50QXQoYSwgeCwgeSwgeikpWzBdOworfQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9mbG9hdChyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfZmxvYXQyKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9mbG9hdDMocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X2Zsb2F0NChyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gZG91YmxlIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfZG91YmxlKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiBkb3VibGUyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfZG91YmxlMihyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gZG91YmxlMyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X2RvdWJsZTMocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIGRvdWJsZTQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9kb3VibGU0KHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiBjaGFyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfY2hhcihyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gY2hhcjIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9jaGFyMihyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gY2hhcjMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9jaGFyMyhyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gY2hhcjQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9jaGFyNChyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdWNoYXIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF91Y2hhcihyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdWNoYXIyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfdWNoYXIyKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB1Y2hhcjMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF91Y2hhcjMocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHVjaGFyNCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X3VjaGFyNChyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gc2hvcnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9zaG9ydChyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gc2hvcnQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfc2hvcnQyKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiBzaG9ydDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9zaG9ydDMocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHNob3J0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X3Nob3J0NChyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdXNob3J0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfdXNob3J0KHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB1c2hvcnQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfdXNob3J0Mihyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdXNob3J0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X3VzaG9ydDMocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHVzaG9ydDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF91c2hvcnQ0KHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiBpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9pbnQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIGludDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9pbnQyKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiBpbnQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfaW50Myhyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gaW50NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X2ludDQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHVpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF91aW50KHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB1aW50MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X3VpbnQyKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB1aW50MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X3VpbnQzKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB1aW50NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X3VpbnQ0KHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiBsb25nIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfbG9uZyhyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gbG9uZzIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9sb25nMihyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gbG9uZzMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9sb25nMyhyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gbG9uZzQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9sb25nNChyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdWxvbmcgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF91bG9uZyhyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdWxvbmcyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfdWxvbmcyKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB1bG9uZzMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF91bG9uZzMocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHVsb25nNCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X3Vsb25nNChyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9mbG9hdChyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfZmxvYXQyKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9mbG9hdDMocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X2Zsb2F0NChyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gZG91YmxlIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfZG91YmxlKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiBkb3VibGUyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfZG91YmxlMihyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gZG91YmxlMyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X2RvdWJsZTMocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIGRvdWJsZTQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9kb3VibGU0KHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiBjaGFyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfY2hhcihyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gY2hhcjIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9jaGFyMihyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gY2hhcjMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9jaGFyMyhyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gY2hhcjQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9jaGFyNChyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdWNoYXIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF91Y2hhcihyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdWNoYXIyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfdWNoYXIyKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB1Y2hhcjMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF91Y2hhcjMocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHVjaGFyNCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X3VjaGFyNChyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gc2hvcnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9zaG9ydChyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gc2hvcnQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfc2hvcnQyKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiBzaG9ydDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9zaG9ydDMocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHNob3J0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X3Nob3J0NChyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdXNob3J0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfdXNob3J0KHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB1c2hvcnQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfdXNob3J0Mihyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdXNob3J0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X3VzaG9ydDMocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHVzaG9ydDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF91c2hvcnQ0KHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiBpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9pbnQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIGludDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9pbnQyKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiBpbnQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfaW50Myhyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gaW50NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X2ludDQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHVpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF91aW50KHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB1aW50MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X3VpbnQyKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB1aW50MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X3VpbnQzKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB1aW50NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X3VpbnQ0KHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiBsb25nIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfbG9uZyhyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gbG9uZzIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9sb25nMihyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gbG9uZzMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9sb25nMyhyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gbG9uZzQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9sb25nNChyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdWxvbmcgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF91bG9uZyhyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdWxvbmcyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfdWxvbmcyKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB1bG9uZzMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF91bG9uZzMocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHVsb25nNCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X3Vsb25nNChyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9mbG9hdChyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfZmxvYXQyKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3Qgeik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9mbG9hdDMocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X2Zsb2F0NChyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gZG91YmxlIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfZG91YmxlKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3Qgeik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiBkb3VibGUyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfZG91YmxlMihyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gZG91YmxlMyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X2RvdWJsZTMocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIGRvdWJsZTQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9kb3VibGU0KHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3Qgeik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiBjaGFyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfY2hhcihyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gY2hhcjIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9jaGFyMihyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gY2hhcjMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9jaGFyMyhyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gY2hhcjQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9jaGFyNChyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdWNoYXIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF91Y2hhcihyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdWNoYXIyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfdWNoYXIyKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3Qgeik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB1Y2hhcjMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF91Y2hhcjMocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHVjaGFyNCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X3VjaGFyNChyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gc2hvcnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9zaG9ydChyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gc2hvcnQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfc2hvcnQyKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3Qgeik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiBzaG9ydDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9zaG9ydDMocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHNob3J0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X3Nob3J0NChyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdXNob3J0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfdXNob3J0KHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3Qgeik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB1c2hvcnQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfdXNob3J0Mihyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdXNob3J0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X3VzaG9ydDMocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHVzaG9ydDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF91c2hvcnQ0KHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3Qgeik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiBpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9pbnQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIGludDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9pbnQyKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3Qgeik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiBpbnQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfaW50Myhyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gaW50NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X2ludDQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHVpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF91aW50KHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3Qgeik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB1aW50MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X3VpbnQyKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3Qgeik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB1aW50MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X3VpbnQzKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3Qgeik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB1aW50NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X3VpbnQ0KHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3Qgeik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiBsb25nIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfbG9uZyhyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gbG9uZzIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9sb25nMihyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gbG9uZzMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9sb25nMyhyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gbG9uZzQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9sb25nNChyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdWxvbmcgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF91bG9uZyhyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdWxvbmcyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfdWxvbmcyKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3Qgeik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB1bG9uZzMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF91bG9uZzMocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHVsb25nNCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X3Vsb25nNChyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMykpCitleHRlcm4gaGFsZiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X2hhbGYocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjMpKQorZXh0ZXJuIGhhbGYyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfaGFsZjIocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjMpKQorZXh0ZXJuIGhhbGYzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfaGFsZjMocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjMpKQorZXh0ZXJuIGhhbGY0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfaGFsZjQocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjMpKQorZXh0ZXJuIGhhbGYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9oYWxmKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIzKSkKK2V4dGVybiBoYWxmMiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X2hhbGYyKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIzKSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X2hhbGYzKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIzKSkKK2V4dGVybiBoYWxmNCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0X2hhbGY0KHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIzKSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXRfaGFsZihyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMykpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9oYWxmMihyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMykpCitleHRlcm4gaGFsZjMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9oYWxmMyhyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMykpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdF9oYWxmNChyc19hbGxvY2F0aW9uIGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKy8qCisgKiByc0dldEVsZW1lbnRBdFl1dl91Y2hhcl9VOiBHZXQgdGhlIFUgY29tcG9uZW50IG9mIGFuIGFsbG9jYXRpb24gb2YgWVVWcworICoKKyAqIEV4dHJhY3RzIHRoZSBVIGNvbXBvbmVudCBvZiBhIHNpbmdsZSBZVVYgdmFsdWUgZnJvbSBhIDJEIGFsbG9jYXRpb24gb2YgWVVWcy4KKyAqCisgKiBJbnNpZGUgYW4gYWxsb2NhdGlvbiwgWSwgVSwgYW5kIFYgY29tcG9uZW50cyBtYXkgYmUgc3RvcmVkIGlmIGRpZmZlcmVudCBwbGFuZXMKKyAqIGFuZCBhdCBkaWZmZXJlbnQgcmVzb2x1dGlvbnMuICBUaGUgeCwgeSBjb29yZGluYXRlcyBwcm92aWRlZCBoZXJlIGFyZSBpbiB0aGUKKyAqIGRpbWVuc2lvbnMgb2YgdGhlIFkgcGxhbmUuCisgKgorICogU2VlIHJzR2V0RWxlbWVudEF0WXV2X3VjaGFyX1koKS4KKyAqLworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB1Y2hhciBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0WXV2X3VjaGFyX1UocnNfYWxsb2NhdGlvbiBhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KTsKKyNlbmRpZgorCisvKgorICogcnNHZXRFbGVtZW50QXRZdXZfdWNoYXJfVjogR2V0IHRoZSBWIGNvbXBvbmVudCBvZiBhbiBhbGxvY2F0aW9uIG9mIFlVVnMKKyAqCisgKiBFeHRyYWN0cyB0aGUgViBjb21wb25lbnQgb2YgYSBzaW5nbGUgWVVWIHZhbHVlIGZyb20gYSAyRCBhbGxvY2F0aW9uIG9mIFlVVnMuCisgKgorICogSW5zaWRlIGFuIGFsbG9jYXRpb24sIFksIFUsIGFuZCBWIGNvbXBvbmVudHMgbWF5IGJlIHN0b3JlZCBpZiBkaWZmZXJlbnQgcGxhbmVzCisgKiBhbmQgYXQgZGlmZmVyZW50IHJlc29sdXRpb25zLiAgVGhlIHgsIHkgY29vcmRpbmF0ZXMgcHJvdmlkZWQgaGVyZSBhcmUgaW4gdGhlCisgKiBkaW1lbnNpb25zIG9mIHRoZSBZIHBsYW5lLgorICoKKyAqIFNlZSByc0dldEVsZW1lbnRBdFl1dl91Y2hhcl9ZKCkuCisgKi8KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdWNoYXIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdFl1dl91Y2hhcl9WKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworLyoKKyAqIHJzR2V0RWxlbWVudEF0WXV2X3VjaGFyX1k6IEdldCB0aGUgWSBjb21wb25lbnQgb2YgYW4gYWxsb2NhdGlvbiBvZiBZVVZzCisgKgorICogRXh0cmFjdHMgdGhlIFkgY29tcG9uZW50IG9mIGEgc2luZ2xlIFlVViB2YWx1ZSBmcm9tIGEgMkQgYWxsb2NhdGlvbiBvZiBZVVZzLgorICoKKyAqIEluc2lkZSBhbiBhbGxvY2F0aW9uLCBZLCBVLCBhbmQgViBjb21wb25lbnRzIG1heSBiZSBzdG9yZWQgaWYgZGlmZmVyZW50IHBsYW5lcworICogYW5kIGF0IGRpZmZlcmVudCByZXNvbHV0aW9ucy4gIFRoZSB4LCB5IGNvb3JkaW5hdGVzIHByb3ZpZGVkIGhlcmUgYXJlIGluIHRoZQorICogZGltZW5zaW9ucyBvZiB0aGUgWSBwbGFuZS4KKyAqCisgKiBTZWUgcnNHZXRFbGVtZW50QXRZdXZfdWNoYXJfVSgpIGFuZCByc0dldEVsZW1lbnRBdFl1dl91Y2hhcl9WKCkuCisgKi8KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdWNoYXIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEVsZW1lbnRBdFl1dl91Y2hhcl9ZKHJzX2FsbG9jYXRpb24gYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworLyoKKyAqIHJzU2FtcGxlOiBTYW1wbGUgYSB2YWx1ZSBmcm9tIGEgdGV4dHVyZSBhbGxvY2F0aW9uCisgKgorICogRmV0Y2hlcyBhIHZhbHVlIGZyb20gYSB0ZXh0dXJlIGFsbG9jYXRpb24gaW4gYSB3YXkgZGVzY3JpYmVkIGJ5IHRoZSBzYW1wbGVyLgorICoKKyAqIElmIHlvdXIgYWxsb2NhdGlvbiBpcyAxRCwgdXNlIHRoZSB2YXJpYW50IHdpdGggZmxvYXQgZm9yIGxvY2F0aW9uLiAgRm9yIDJELAorICogdXNlIHRoZSBmbG9hdDIgdmFyaWFudC4KKyAqCisgKiBTZWUgYW5kcm9pZC5yZW5kZXJzY3JpcHQuU2FtcGxlciBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgIGE6IEFsbG9jYXRpb24gdG8gc2FtcGxlIGZyb20uCisgKiAgIHM6IFNhbXBsZXIgc3RhdGUuCisgKiAgIGxvY2F0aW9uOiBMb2NhdGlvbiB0byBzYW1wbGUgZnJvbS4KKyAqICAgbG9kOiBNaXAgbGV2ZWwgdG8gc2FtcGxlIGZyb20sIGZvciBmcmFjdGlvbmFsIHZhbHVlcyBtaXAgbGV2ZWxzIHdpbGwgYmUgaW50ZXJwb2xhdGVkIGlmIFJTX1NBTVBMRVJfTElORUFSX01JUF9MSU5FQVIgaXMgdXNlZC4KKyAqLworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE2KSkKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NhbXBsZShyc19hbGxvY2F0aW9uIGEsIHJzX3NhbXBsZXIgcywgZmxvYXQgbG9jYXRpb24pOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxNikpCitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTYW1wbGUocnNfYWxsb2NhdGlvbiBhLCByc19zYW1wbGVyIHMsIGZsb2F0IGxvY2F0aW9uLCBmbG9hdCBsb2QpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxNikpCitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTYW1wbGUocnNfYWxsb2NhdGlvbiBhLCByc19zYW1wbGVyIHMsIGZsb2F0MiBsb2NhdGlvbik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE2KSkKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NhbXBsZShyc19hbGxvY2F0aW9uIGEsIHJzX3NhbXBsZXIgcywgZmxvYXQyIGxvY2F0aW9uLCBmbG9hdCBsb2QpOworI2VuZGlmCisKKy8qCisgKiByc1NldEVsZW1lbnRBdDogU2V0IGEgY2VsbCBvZiBhbiBhbGxvY2F0aW9uCisgKgorICogVGhpcyBmdW5jdGlvbiBzdG9yZXMgYSB2YWx1ZSBpbnRvIGEgc2luZ2xlIGNlbGwgb2YgYW4gYWxsb2NhdGlvbi4KKyAqCisgKiBXaGVuIHN0b3JpbmcgaW50byBhIHRocmVlIGRpbWVuc2lvbmFsIGFsbG9jYXRpb25zLCB1c2UgdGhlIHgsIHksIHogdmFyaWFudC4KKyAqIFNpbWlsYXJseSwgdXNlIHRoZSB4LCB5IHZhcmlhbnQgZm9yIHR3byBkaW1lbnNpb25hbCBhbGxvY2F0aW9ucyBhbmQgeCBmb3IKKyAqIHRoZSBtb25vIGRpbWVuc2lvbmFsIGFsbG9jYXRpb25zLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaGFzIHR3byBzdHlsZXMuICBPbmUgcGFzc2VzIHRoZSB2YWx1ZSB0byBiZSBzdG9yZWQgdXNpbmcgYSB2b2lkKiwKKyAqIHRoZSBvdGhlciBoYXMgdGhlIGFjdHVhbCB2YWx1ZSBhcyBhbiBhcmd1bWVudCwgZS5nLiByc1NldEVsZW1lbnRBdCgpIHZzLgorICogcnNTZXRFbGVtZW50QXRfaW50NCgpLiAgRm9yIHByaW1pdGl2ZSB0eXBlcywgYWx3YXlzIHVzZSB0aGUgbGF0dGVyIGFzIGl0IGlzCisgKiBtb3JlIGVmZmljaWVudC4KKyAqCisgKiBTZWUgYWxzbyByc0dldEVsZW1lbnRBdCgpLgorICovCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldEVsZW1lbnRBdChyc19hbGxvY2F0aW9uIGEsIHZvaWQqIHB0ciwgdWludDMyX3QgeCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRFbGVtZW50QXQocnNfYWxsb2NhdGlvbiBhLCB2b2lkKiBwdHIsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0RWxlbWVudEF0X2Zsb2F0KHJzX2FsbG9jYXRpb24gYSwgZmxvYXQgdmFsLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldEVsZW1lbnRBdF9mbG9hdDIocnNfYWxsb2NhdGlvbiBhLCBmbG9hdDIgdmFsLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldEVsZW1lbnRBdF9mbG9hdDMocnNfYWxsb2NhdGlvbiBhLCBmbG9hdDMgdmFsLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldEVsZW1lbnRBdF9mbG9hdDQocnNfYWxsb2NhdGlvbiBhLCBmbG9hdDQgdmFsLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldEVsZW1lbnRBdF9kb3VibGUocnNfYWxsb2NhdGlvbiBhLCBkb3VibGUgdmFsLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldEVsZW1lbnRBdF9kb3VibGUyKHJzX2FsbG9jYXRpb24gYSwgZG91YmxlMiB2YWwsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0RWxlbWVudEF0X2RvdWJsZTMocnNfYWxsb2NhdGlvbiBhLCBkb3VibGUzIHZhbCwgdWludDMyX3QgeCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRFbGVtZW50QXRfZG91YmxlNChyc19hbGxvY2F0aW9uIGEsIGRvdWJsZTQgdmFsLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldEVsZW1lbnRBdF9jaGFyKHJzX2FsbG9jYXRpb24gYSwgY2hhciB2YWwsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0RWxlbWVudEF0X2NoYXIyKHJzX2FsbG9jYXRpb24gYSwgY2hhcjIgdmFsLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldEVsZW1lbnRBdF9jaGFyMyhyc19hbGxvY2F0aW9uIGEsIGNoYXIzIHZhbCwgdWludDMyX3QgeCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRFbGVtZW50QXRfY2hhcjQocnNfYWxsb2NhdGlvbiBhLCBjaGFyNCB2YWwsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0RWxlbWVudEF0X3VjaGFyKHJzX2FsbG9jYXRpb24gYSwgdWNoYXIgdmFsLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldEVsZW1lbnRBdF91Y2hhcjIocnNfYWxsb2NhdGlvbiBhLCB1Y2hhcjIgdmFsLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldEVsZW1lbnRBdF91Y2hhcjMocnNfYWxsb2NhdGlvbiBhLCB1Y2hhcjMgdmFsLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldEVsZW1lbnRBdF91Y2hhcjQocnNfYWxsb2NhdGlvbiBhLCB1Y2hhcjQgdmFsLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldEVsZW1lbnRBdF9zaG9ydChyc19hbGxvY2F0aW9uIGEsIHNob3J0IHZhbCwgdWludDMyX3QgeCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRFbGVtZW50QXRfc2hvcnQyKHJzX2FsbG9jYXRpb24gYSwgc2hvcnQyIHZhbCwgdWludDMyX3QgeCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRFbGVtZW50QXRfc2hvcnQzKHJzX2FsbG9jYXRpb24gYSwgc2hvcnQzIHZhbCwgdWludDMyX3QgeCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRFbGVtZW50QXRfc2hvcnQ0KHJzX2FsbG9jYXRpb24gYSwgc2hvcnQ0IHZhbCwgdWludDMyX3QgeCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRFbGVtZW50QXRfdXNob3J0KHJzX2FsbG9jYXRpb24gYSwgdXNob3J0IHZhbCwgdWludDMyX3QgeCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRFbGVtZW50QXRfdXNob3J0Mihyc19hbGxvY2F0aW9uIGEsIHVzaG9ydDIgdmFsLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldEVsZW1lbnRBdF91c2hvcnQzKHJzX2FsbG9jYXRpb24gYSwgdXNob3J0MyB2YWwsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0RWxlbWVudEF0X3VzaG9ydDQocnNfYWxsb2NhdGlvbiBhLCB1c2hvcnQ0IHZhbCwgdWludDMyX3QgeCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRFbGVtZW50QXRfaW50KHJzX2FsbG9jYXRpb24gYSwgaW50IHZhbCwgdWludDMyX3QgeCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRFbGVtZW50QXRfaW50Mihyc19hbGxvY2F0aW9uIGEsIGludDIgdmFsLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldEVsZW1lbnRBdF9pbnQzKHJzX2FsbG9jYXRpb24gYSwgaW50MyB2YWwsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0RWxlbWVudEF0X2ludDQocnNfYWxsb2NhdGlvbiBhLCBpbnQ0IHZhbCwgdWludDMyX3QgeCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRFbGVtZW50QXRfdWludChyc19hbGxvY2F0aW9uIGEsIHVpbnQgdmFsLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldEVsZW1lbnRBdF91aW50Mihyc19hbGxvY2F0aW9uIGEsIHVpbnQyIHZhbCwgdWludDMyX3QgeCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRFbGVtZW50QXRfdWludDMocnNfYWxsb2NhdGlvbiBhLCB1aW50MyB2YWwsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0RWxlbWVudEF0X3VpbnQ0KHJzX2FsbG9jYXRpb24gYSwgdWludDQgdmFsLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldEVsZW1lbnRBdF9sb25nKHJzX2FsbG9jYXRpb24gYSwgbG9uZyB2YWwsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0RWxlbWVudEF0X2xvbmcyKHJzX2FsbG9jYXRpb24gYSwgbG9uZzIgdmFsLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldEVsZW1lbnRBdF9sb25nMyhyc19hbGxvY2F0aW9uIGEsIGxvbmczIHZhbCwgdWludDMyX3QgeCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRFbGVtZW50QXRfbG9uZzQocnNfYWxsb2NhdGlvbiBhLCBsb25nNCB2YWwsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0RWxlbWVudEF0X3Vsb25nKHJzX2FsbG9jYXRpb24gYSwgdWxvbmcgdmFsLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldEVsZW1lbnRBdF91bG9uZzIocnNfYWxsb2NhdGlvbiBhLCB1bG9uZzIgdmFsLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldEVsZW1lbnRBdF91bG9uZzMocnNfYWxsb2NhdGlvbiBhLCB1bG9uZzMgdmFsLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldEVsZW1lbnRBdF91bG9uZzQocnNfYWxsb2NhdGlvbiBhLCB1bG9uZzQgdmFsLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldEVsZW1lbnRBdF9mbG9hdChyc19hbGxvY2F0aW9uIGEsIGZsb2F0IHZhbCwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRFbGVtZW50QXRfZmxvYXQyKHJzX2FsbG9jYXRpb24gYSwgZmxvYXQyIHZhbCwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRFbGVtZW50QXRfZmxvYXQzKHJzX2FsbG9jYXRpb24gYSwgZmxvYXQzIHZhbCwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRFbGVtZW50QXRfZmxvYXQ0KHJzX2FsbG9jYXRpb24gYSwgZmxvYXQ0IHZhbCwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRFbGVtZW50QXRfZG91YmxlKHJzX2FsbG9jYXRpb24gYSwgZG91YmxlIHZhbCwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRFbGVtZW50QXRfZG91YmxlMihyc19hbGxvY2F0aW9uIGEsIGRvdWJsZTIgdmFsLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldEVsZW1lbnRBdF9kb3VibGUzKHJzX2FsbG9jYXRpb24gYSwgZG91YmxlMyB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0RWxlbWVudEF0X2RvdWJsZTQocnNfYWxsb2NhdGlvbiBhLCBkb3VibGU0IHZhbCwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRFbGVtZW50QXRfY2hhcihyc19hbGxvY2F0aW9uIGEsIGNoYXIgdmFsLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldEVsZW1lbnRBdF9jaGFyMihyc19hbGxvY2F0aW9uIGEsIGNoYXIyIHZhbCwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRFbGVtZW50QXRfY2hhcjMocnNfYWxsb2NhdGlvbiBhLCBjaGFyMyB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0RWxlbWVudEF0X2NoYXI0KHJzX2FsbG9jYXRpb24gYSwgY2hhcjQgdmFsLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldEVsZW1lbnRBdF91Y2hhcihyc19hbGxvY2F0aW9uIGEsIHVjaGFyIHZhbCwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRFbGVtZW50QXRfdWNoYXIyKHJzX2FsbG9jYXRpb24gYSwgdWNoYXIyIHZhbCwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRFbGVtZW50QXRfdWNoYXIzKHJzX2FsbG9jYXRpb24gYSwgdWNoYXIzIHZhbCwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRFbGVtZW50QXRfdWNoYXI0KHJzX2FsbG9jYXRpb24gYSwgdWNoYXI0IHZhbCwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRFbGVtZW50QXRfc2hvcnQocnNfYWxsb2NhdGlvbiBhLCBzaG9ydCB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0RWxlbWVudEF0X3Nob3J0Mihyc19hbGxvY2F0aW9uIGEsIHNob3J0MiB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0RWxlbWVudEF0X3Nob3J0Myhyc19hbGxvY2F0aW9uIGEsIHNob3J0MyB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0RWxlbWVudEF0X3Nob3J0NChyc19hbGxvY2F0aW9uIGEsIHNob3J0NCB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0RWxlbWVudEF0X3VzaG9ydChyc19hbGxvY2F0aW9uIGEsIHVzaG9ydCB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0RWxlbWVudEF0X3VzaG9ydDIocnNfYWxsb2NhdGlvbiBhLCB1c2hvcnQyIHZhbCwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRFbGVtZW50QXRfdXNob3J0Myhyc19hbGxvY2F0aW9uIGEsIHVzaG9ydDMgdmFsLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldEVsZW1lbnRBdF91c2hvcnQ0KHJzX2FsbG9jYXRpb24gYSwgdXNob3J0NCB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0RWxlbWVudEF0X2ludChyc19hbGxvY2F0aW9uIGEsIGludCB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0RWxlbWVudEF0X2ludDIocnNfYWxsb2NhdGlvbiBhLCBpbnQyIHZhbCwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRFbGVtZW50QXRfaW50Myhyc19hbGxvY2F0aW9uIGEsIGludDMgdmFsLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldEVsZW1lbnRBdF9pbnQ0KHJzX2FsbG9jYXRpb24gYSwgaW50NCB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0RWxlbWVudEF0X3VpbnQocnNfYWxsb2NhdGlvbiBhLCB1aW50IHZhbCwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRFbGVtZW50QXRfdWludDIocnNfYWxsb2NhdGlvbiBhLCB1aW50MiB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0RWxlbWVudEF0X3VpbnQzKHJzX2FsbG9jYXRpb24gYSwgdWludDMgdmFsLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldEVsZW1lbnRBdF91aW50NChyc19hbGxvY2F0aW9uIGEsIHVpbnQ0IHZhbCwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRFbGVtZW50QXRfbG9uZyhyc19hbGxvY2F0aW9uIGEsIGxvbmcgdmFsLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldEVsZW1lbnRBdF9sb25nMihyc19hbGxvY2F0aW9uIGEsIGxvbmcyIHZhbCwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRFbGVtZW50QXRfbG9uZzMocnNfYWxsb2NhdGlvbiBhLCBsb25nMyB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0RWxlbWVudEF0X2xvbmc0KHJzX2FsbG9jYXRpb24gYSwgbG9uZzQgdmFsLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldEVsZW1lbnRBdF91bG9uZyhyc19hbGxvY2F0aW9uIGEsIHVsb25nIHZhbCwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRFbGVtZW50QXRfdWxvbmcyKHJzX2FsbG9jYXRpb24gYSwgdWxvbmcyIHZhbCwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRFbGVtZW50QXRfdWxvbmczKHJzX2FsbG9jYXRpb24gYSwgdWxvbmczIHZhbCwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRFbGVtZW50QXRfdWxvbmc0KHJzX2FsbG9jYXRpb24gYSwgdWxvbmc0IHZhbCwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRFbGVtZW50QXRfZmxvYXQocnNfYWxsb2NhdGlvbiBhLCBmbG9hdCB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0RWxlbWVudEF0X2Zsb2F0Mihyc19hbGxvY2F0aW9uIGEsIGZsb2F0MiB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0RWxlbWVudEF0X2Zsb2F0Myhyc19hbGxvY2F0aW9uIGEsIGZsb2F0MyB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0RWxlbWVudEF0X2Zsb2F0NChyc19hbGxvY2F0aW9uIGEsIGZsb2F0NCB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0RWxlbWVudEF0X2RvdWJsZShyc19hbGxvY2F0aW9uIGEsIGRvdWJsZSB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0RWxlbWVudEF0X2RvdWJsZTIocnNfYWxsb2NhdGlvbiBhLCBkb3VibGUyIHZhbCwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3Qgeik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRFbGVtZW50QXRfZG91YmxlMyhyc19hbGxvY2F0aW9uIGEsIGRvdWJsZTMgdmFsLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldEVsZW1lbnRBdF9kb3VibGU0KHJzX2FsbG9jYXRpb24gYSwgZG91YmxlNCB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0RWxlbWVudEF0X2NoYXIocnNfYWxsb2NhdGlvbiBhLCBjaGFyIHZhbCwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3Qgeik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRFbGVtZW50QXRfY2hhcjIocnNfYWxsb2NhdGlvbiBhLCBjaGFyMiB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0RWxlbWVudEF0X2NoYXIzKHJzX2FsbG9jYXRpb24gYSwgY2hhcjMgdmFsLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldEVsZW1lbnRBdF9jaGFyNChyc19hbGxvY2F0aW9uIGEsIGNoYXI0IHZhbCwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3Qgeik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRFbGVtZW50QXRfdWNoYXIocnNfYWxsb2NhdGlvbiBhLCB1Y2hhciB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0RWxlbWVudEF0X3VjaGFyMihyc19hbGxvY2F0aW9uIGEsIHVjaGFyMiB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0RWxlbWVudEF0X3VjaGFyMyhyc19hbGxvY2F0aW9uIGEsIHVjaGFyMyB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0RWxlbWVudEF0X3VjaGFyNChyc19hbGxvY2F0aW9uIGEsIHVjaGFyNCB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0RWxlbWVudEF0X3Nob3J0KHJzX2FsbG9jYXRpb24gYSwgc2hvcnQgdmFsLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldEVsZW1lbnRBdF9zaG9ydDIocnNfYWxsb2NhdGlvbiBhLCBzaG9ydDIgdmFsLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldEVsZW1lbnRBdF9zaG9ydDMocnNfYWxsb2NhdGlvbiBhLCBzaG9ydDMgdmFsLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldEVsZW1lbnRBdF9zaG9ydDQocnNfYWxsb2NhdGlvbiBhLCBzaG9ydDQgdmFsLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldEVsZW1lbnRBdF91c2hvcnQocnNfYWxsb2NhdGlvbiBhLCB1c2hvcnQgdmFsLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldEVsZW1lbnRBdF91c2hvcnQyKHJzX2FsbG9jYXRpb24gYSwgdXNob3J0MiB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0RWxlbWVudEF0X3VzaG9ydDMocnNfYWxsb2NhdGlvbiBhLCB1c2hvcnQzIHZhbCwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3Qgeik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRFbGVtZW50QXRfdXNob3J0NChyc19hbGxvY2F0aW9uIGEsIHVzaG9ydDQgdmFsLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldEVsZW1lbnRBdF9pbnQocnNfYWxsb2NhdGlvbiBhLCBpbnQgdmFsLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldEVsZW1lbnRBdF9pbnQyKHJzX2FsbG9jYXRpb24gYSwgaW50MiB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0RWxlbWVudEF0X2ludDMocnNfYWxsb2NhdGlvbiBhLCBpbnQzIHZhbCwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3Qgeik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRFbGVtZW50QXRfaW50NChyc19hbGxvY2F0aW9uIGEsIGludDQgdmFsLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldEVsZW1lbnRBdF91aW50KHJzX2FsbG9jYXRpb24gYSwgdWludCB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0RWxlbWVudEF0X3VpbnQyKHJzX2FsbG9jYXRpb24gYSwgdWludDIgdmFsLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldEVsZW1lbnRBdF91aW50Myhyc19hbGxvY2F0aW9uIGEsIHVpbnQzIHZhbCwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3Qgeik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRFbGVtZW50QXRfdWludDQocnNfYWxsb2NhdGlvbiBhLCB1aW50NCB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0RWxlbWVudEF0X2xvbmcocnNfYWxsb2NhdGlvbiBhLCBsb25nIHZhbCwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3Qgeik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRFbGVtZW50QXRfbG9uZzIocnNfYWxsb2NhdGlvbiBhLCBsb25nMiB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0RWxlbWVudEF0X2xvbmczKHJzX2FsbG9jYXRpb24gYSwgbG9uZzMgdmFsLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldEVsZW1lbnRBdF9sb25nNChyc19hbGxvY2F0aW9uIGEsIGxvbmc0IHZhbCwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3Qgeik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRFbGVtZW50QXRfdWxvbmcocnNfYWxsb2NhdGlvbiBhLCB1bG9uZyB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0RWxlbWVudEF0X3Vsb25nMihyc19hbGxvY2F0aW9uIGEsIHVsb25nMiB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0RWxlbWVudEF0X3Vsb25nMyhyc19hbGxvY2F0aW9uIGEsIHVsb25nMyB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0RWxlbWVudEF0X3Vsb25nNChyc19hbGxvY2F0aW9uIGEsIHVsb25nNCB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMykpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0RWxlbWVudEF0X2hhbGYocnNfYWxsb2NhdGlvbiBhLCBoYWxmIHZhbCwgdWludDMyX3QgeCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIzKSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRFbGVtZW50QXRfaGFsZjIocnNfYWxsb2NhdGlvbiBhLCBoYWxmMiB2YWwsIHVpbnQzMl90IHgpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMykpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0RWxlbWVudEF0X2hhbGYzKHJzX2FsbG9jYXRpb24gYSwgaGFsZjMgdmFsLCB1aW50MzJfdCB4KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjMpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldEVsZW1lbnRBdF9oYWxmNChyc19hbGxvY2F0aW9uIGEsIGhhbGY0IHZhbCwgdWludDMyX3QgeCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIzKSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRFbGVtZW50QXRfaGFsZihyc19hbGxvY2F0aW9uIGEsIGhhbGYgdmFsLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjMpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldEVsZW1lbnRBdF9oYWxmMihyc19hbGxvY2F0aW9uIGEsIGhhbGYyIHZhbCwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIzKSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRFbGVtZW50QXRfaGFsZjMocnNfYWxsb2NhdGlvbiBhLCBoYWxmMyB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMykpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0RWxlbWVudEF0X2hhbGY0KHJzX2FsbG9jYXRpb24gYSwgaGFsZjQgdmFsLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjMpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldEVsZW1lbnRBdF9oYWxmKHJzX2FsbG9jYXRpb24gYSwgaGFsZiB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMykpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0RWxlbWVudEF0X2hhbGYyKHJzX2FsbG9jYXRpb24gYSwgaGFsZjIgdmFsLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjMpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldEVsZW1lbnRBdF9oYWxmMyhyc19hbGxvY2F0aW9uIGEsIGhhbGYzIHZhbCwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3Qgeik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIzKSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRFbGVtZW50QXRfaGFsZjQocnNfYWxsb2NhdGlvbiBhLCBoYWxmNCB2YWwsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworI2VuZGlmCisKKyNlbmRpZiAvLyBSRU5ERVJTQ1JJUFRfUlNfQUxMT0NBVElPTl9EQVRBX1JTSApkaWZmIC0tZ2l0IGEvcmVuZGVyc2NyaXB0L2luY2x1ZGUvcnNfYXRvbWljLnJzaCBiL3JlbmRlcnNjcmlwdC9pbmNsdWRlL3JzX2F0b21pYy5yc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThhODc4NAotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9pbmNsdWRlL3JzX2F0b21pYy5yc2gKQEAgLTAsMCArMSwyNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBEb24ndCBlZGl0IHRoaXMgZmlsZSEgIEl0IGlzIGF1dG8tZ2VuZXJhdGVkIGJ5IGZyYW1ld29ya3MvcnMvYXBpL2dlbmVyYXRlLnNoLgorCisvKgorICogcnNfYXRvbWljLnJzaDogQXRvbWljIFVwZGF0ZSBGdW5jdGlvbnMKKyAqCisgKiBUbyB1cGRhdGUgdmFsdWVzIHNoYXJlZCBiZXR3ZWVuIG11bHRpcGxlIHRocmVhZHMsIHVzZSB0aGUgZnVuY3Rpb25zIGJlbG93LgorICogVGhleSBlbnN1cmUgdGhhdCB0aGUgdmFsdWVzIGFyZSBhdG9taWNhbGx5IHVwZGF0ZWQsIGkuZS4gdGhhdCB0aGUgbWVtb3J5CisgKiByZWFkcywgdGhlIHVwZGF0ZXMsIGFuZCB0aGUgbWVtb3J5IHdyaXRlcyBhcmUgZG9uZSBpbiB0aGUgcmlnaHQgb3JkZXIuCisgKgorICogVGhlc2UgZnVuY3Rpb25zIGFyZSBzbG93ZXIgdGhhbiB0aGVpciBub24tYXRvbWljIGVxdWl2YWxlbnRzLCBzbyB1c2UKKyAqIHRoZW0gb25seSB3aGVuIHN5bmNocm9uaXphdGlvbiBpcyBuZWVkZWQuCisgKgorICogTm90ZSB0aGF0IGluIFJlbmRlclNjcmlwdCwgeW91ciBjb2RlIGlzIGxpa2VseSB0byBiZSBydW5uaW5nIGluIHNlcGFyYXRlCisgKiB0aHJlYWRzIGV2ZW4gdGhvdWdoIHlvdSBkaWQgbm90IGV4cGxpY2l0ZWx5IGNyZWF0ZSB0aGVtLiAgVGhlIFJlbmRlclNjcmlwdAorICogcnVudGltZSB3aWxsIHZlcnkgb2Z0ZW4gc3BsaXQgdGhlIGV4ZWN1dGlvbiBvZiBvbmUga2VybmVsIGFjcm9zcyBtdWx0aXBsZQorICogdGhyZWFkcy4gIFVwZGF0aW5nIGdsb2JhbHMgc2hvdWxkIGJlIGRvbmUgd2l0aCBhdG9taWMgZnVuY3Rpb25zLiAgSWYgcG9zc2libGUsCisgKiBtb2RpZnkgeW91ciBhbGdvcml0aG0gdG8gYXZvaWQgdGhlbSBhbHRvZ2V0aGVyLgorICovCisKKyNpZm5kZWYgUkVOREVSU0NSSVBUX1JTX0FUT01JQ19SU0gKKyNkZWZpbmUgUkVOREVSU0NSSVBUX1JTX0FUT01JQ19SU0gKKworLyoKKyAqIHJzQXRvbWljQWRkOiBUaHJlYWQtc2FmZSBhZGRpdGlvbgorICoKKyAqIEF0b21pY2x5IGFkZHMgYSB2YWx1ZSB0byB0aGUgdmFsdWUgYXQgYWRkciwgaS5lLiAqYWRkciArPSB2YWx1ZS4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICBhZGRyOiBBZGRyZXNzIG9mIHRoZSB2YWx1ZSB0byBtb2RpZnkuCisgKiAgIHZhbHVlOiBBbW91bnQgdG8gYWRkLgorICoKKyAqIFJldHVybnM6IFZhbHVlIG9mICphZGRyIHByaW9yIHRvIHRoZSBvcGVyYXRpb24uCisgKi8KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxNCkpCitleHRlcm4gaW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQXRvbWljQWRkKHZvbGF0aWxlIGludDMyX3QqIGFkZHIsIGludDMyX3QgdmFsdWUpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMCkpCitleHRlcm4gaW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQXRvbWljQWRkKHZvbGF0aWxlIHVpbnQzMl90KiBhZGRyLCB1aW50MzJfdCB2YWx1ZSk7CisjZW5kaWYKKworLyoKKyAqIHJzQXRvbWljQW5kOiBUaHJlYWQtc2FmZSBiaXR3aXNlIGFuZAorICoKKyAqIEF0b21pY2x5IHBlcmZvcm1zIGEgYml0d2lzZSBhbmQgb2YgdHdvIHZhbHVlcywgc3RvcmluZyB0aGUgcmVzdWx0IGJhY2sgYXQgYWRkciwKKyAqIGkuZS4gKmFkZHIgJj0gdmFsdWUuCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgYWRkcjogQWRkcmVzcyBvZiB0aGUgdmFsdWUgdG8gbW9kaWZ5LgorICogICB2YWx1ZTogVmFsdWUgdG8gYW5kIHdpdGguCisgKgorICogUmV0dXJuczogVmFsdWUgb2YgKmFkZHIgcHJpb3IgdG8gdGhlIG9wZXJhdGlvbi4KKyAqLworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE0KSkKK2V4dGVybiBpbnQzMl90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBdG9taWNBbmQodm9sYXRpbGUgaW50MzJfdCogYWRkciwgaW50MzJfdCB2YWx1ZSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIwKSkKK2V4dGVybiBpbnQzMl90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBdG9taWNBbmQodm9sYXRpbGUgdWludDMyX3QqIGFkZHIsIHVpbnQzMl90IHZhbHVlKTsKKyNlbmRpZgorCisvKgorICogcnNBdG9taWNDYXM6IFRocmVhZC1zYWZlIGNvbXBhcmUgYW5kIHNldAorICoKKyAqIElmIHRoZSB2YWx1ZSBhdCBhZGRyIG1hdGNoZXMgY29tcGFyZVZhbHVlIHRoZW4gdGhlIG5ld1ZhbHVlIGlzIHdyaXR0ZW4gYXQgYWRkciwKKyAqIGkuZS4gaWYgKCphZGRyID09IGNvbXBhcmVWYWx1ZSkgeyAqYWRkciA9IG5ld1ZhbHVlOyB9LgorICoKKyAqIFlvdSBjYW4gY2hlY2sgdGhhdCB0aGUgdmFsdWUgd2FzIHdyaXR0ZW4gYnkgY2hlY2tpbmcgdGhhdCB0aGUgdmFsdWUgcmV0dXJuZWQKKyAqIGJ5IHJzQXRvbWljQ2FzKCkgaXMgY29tcGFyZVZhbHVlLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgIGFkZHI6IEFkZHJlc3Mgb2YgdGhlIHZhbHVlIHRvIGNvbXBhcmUgYW5kIHJlcGxhY2UgaWYgdGhlIHRlc3QgcGFzc2VzLgorICogICBjb21wYXJlVmFsdWU6IFZhbHVlIHRvIHRlc3QgKmFkZHIgYWdhaW5zdC4KKyAqICAgbmV3VmFsdWU6IFZhbHVlIHRvIHdyaXRlIGlmIHRoZSB0ZXN0IHBhc3Nlcy4KKyAqCisgKiBSZXR1cm5zOiBWYWx1ZSBvZiAqYWRkciBwcmlvciB0byB0aGUgb3BlcmF0aW9uLgorICovCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTQpKQorZXh0ZXJuIGludDMyX3QgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0F0b21pY0Nhcyh2b2xhdGlsZSBpbnQzMl90KiBhZGRyLCBpbnQzMl90IGNvbXBhcmVWYWx1ZSwgaW50MzJfdCBuZXdWYWx1ZSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE0KSkKK2V4dGVybiB1aW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQXRvbWljQ2FzKHZvbGF0aWxlIHVpbnQzMl90KiBhZGRyLCB1aW50MzJfdCBjb21wYXJlVmFsdWUsIHVpbnQzMl90IG5ld1ZhbHVlKTsKKyNlbmRpZgorCisvKgorICogcnNBdG9taWNEZWM6IFRocmVhZC1zYWZlIGRlY3JlbWVudAorICoKKyAqIEF0b21pY2x5IHN1YnRyYWN0cyBvbmUgZnJvbSB0aGUgdmFsdWUgYXQgYWRkci4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byByc0F0b21pY1N1YihhZGRyLCAxKS4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICBhZGRyOiBBZGRyZXNzIG9mIHRoZSB2YWx1ZSB0byBkZWNyZW1lbnQuCisgKgorICogUmV0dXJuczogVmFsdWUgb2YgKmFkZHIgcHJpb3IgdG8gdGhlIG9wZXJhdGlvbi4KKyAqLworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE0KSkKK2V4dGVybiBpbnQzMl90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBdG9taWNEZWModm9sYXRpbGUgaW50MzJfdCogYWRkcik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIwKSkKK2V4dGVybiBpbnQzMl90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBdG9taWNEZWModm9sYXRpbGUgdWludDMyX3QqIGFkZHIpOworI2VuZGlmCisKKy8qCisgKiByc0F0b21pY0luYzogVGhyZWFkLXNhZmUgaW5jcmVtZW50CisgKgorICogQXRvbWljbHkgYWRkcyBvbmUgdG8gdGhlIHZhbHVlIGF0IGFkZHIuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gcnNBdG9taWNBZGQoYWRkciwgMSkuCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgYWRkcjogQWRkcmVzcyBvZiB0aGUgdmFsdWUgdG8gaW5jcmVtZW50LgorICoKKyAqIFJldHVybnM6IFZhbHVlIG9mICphZGRyIHByaW9yIHRvIHRoZSBvcGVyYXRpb24uCisgKi8KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxNCkpCitleHRlcm4gaW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQXRvbWljSW5jKHZvbGF0aWxlIGludDMyX3QqIGFkZHIpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMCkpCitleHRlcm4gaW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQXRvbWljSW5jKHZvbGF0aWxlIHVpbnQzMl90KiBhZGRyKTsKKyNlbmRpZgorCisvKgorICogcnNBdG9taWNNYXg6IFRocmVhZC1zYWZlIG1heGltdW0KKyAqCisgKiBBdG9taWNseSBzZXRzIHRoZSB2YWx1ZSBhdCBhZGRyIHRvIHRoZSBtYXhpbXVtIG9mICphZGRyIGFuZCB2YWx1ZSwgaS5lLgorICogKmFkZHIgPSBtYXgoKmFkZHIsIHZhbHVlKS4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICBhZGRyOiBBZGRyZXNzIG9mIHRoZSB2YWx1ZSB0byBtb2RpZnkuCisgKiAgIHZhbHVlOiBDb21wYXJpc29uIHZhbHVlLgorICoKKyAqIFJldHVybnM6IFZhbHVlIG9mICphZGRyIHByaW9yIHRvIHRoZSBvcGVyYXRpb24uCisgKi8KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxNCkpCitleHRlcm4gdWludDMyX3QgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0F0b21pY01heCh2b2xhdGlsZSB1aW50MzJfdCogYWRkciwgdWludDMyX3QgdmFsdWUpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxNCkpCitleHRlcm4gaW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQXRvbWljTWF4KHZvbGF0aWxlIGludDMyX3QqIGFkZHIsIGludDMyX3QgdmFsdWUpOworI2VuZGlmCisKKy8qCisgKiByc0F0b21pY01pbjogVGhyZWFkLXNhZmUgbWluaW11bQorICoKKyAqIEF0b21pY2x5IHNldHMgdGhlIHZhbHVlIGF0IGFkZHIgdG8gdGhlIG1pbmltdW0gb2YgKmFkZHIgYW5kIHZhbHVlLCBpLmUuCisgKiAqYWRkciA9IG1pbigqYWRkciwgdmFsdWUpLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgIGFkZHI6IEFkZHJlc3Mgb2YgdGhlIHZhbHVlIHRvIG1vZGlmeS4KKyAqICAgdmFsdWU6IENvbXBhcmlzb24gdmFsdWUuCisgKgorICogUmV0dXJuczogVmFsdWUgb2YgKmFkZHIgcHJpb3IgdG8gdGhlIG9wZXJhdGlvbi4KKyAqLworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE0KSkKK2V4dGVybiB1aW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQXRvbWljTWluKHZvbGF0aWxlIHVpbnQzMl90KiBhZGRyLCB1aW50MzJfdCB2YWx1ZSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE0KSkKK2V4dGVybiBpbnQzMl90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBdG9taWNNaW4odm9sYXRpbGUgaW50MzJfdCogYWRkciwgaW50MzJfdCB2YWx1ZSk7CisjZW5kaWYKKworLyoKKyAqIHJzQXRvbWljT3I6IFRocmVhZC1zYWZlIGJpdHdpc2Ugb3IKKyAqCisgKiBBdG9taWNseSBwZXJmb3JtIGEgYml0d2lzZSBvciB0d28gdmFsdWVzLCBzdG9yaW5nIHRoZSByZXN1bHQgYXQgYWRkciwKKyAqIGkuZS4gKmFkZHIgfD0gdmFsdWUuCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgYWRkcjogQWRkcmVzcyBvZiB0aGUgdmFsdWUgdG8gbW9kaWZ5LgorICogICB2YWx1ZTogVmFsdWUgdG8gb3Igd2l0aC4KKyAqCisgKiBSZXR1cm5zOiBWYWx1ZSBvZiAqYWRkciBwcmlvciB0byB0aGUgb3BlcmF0aW9uLgorICovCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTQpKQorZXh0ZXJuIGludDMyX3QgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0F0b21pY09yKHZvbGF0aWxlIGludDMyX3QqIGFkZHIsIGludDMyX3QgdmFsdWUpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMCkpCitleHRlcm4gaW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQXRvbWljT3Iodm9sYXRpbGUgdWludDMyX3QqIGFkZHIsIHVpbnQzMl90IHZhbHVlKTsKKyNlbmRpZgorCisvKgorICogcnNBdG9taWNTdWI6IFRocmVhZC1zYWZlIHN1YnRyYWN0aW9uCisgKgorICogQXRvbWljbHkgc3VidHJhY3RzIGEgdmFsdWUgZnJvbSB0aGUgdmFsdWUgYXQgYWRkciwgaS5lLiAqYWRkciAtPSB2YWx1ZS4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICBhZGRyOiBBZGRyZXNzIG9mIHRoZSB2YWx1ZSB0byBtb2RpZnkuCisgKiAgIHZhbHVlOiBBbW91bnQgdG8gc3VidHJhY3QuCisgKgorICogUmV0dXJuczogVmFsdWUgb2YgKmFkZHIgcHJpb3IgdG8gdGhlIG9wZXJhdGlvbi4KKyAqLworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE0KSkKK2V4dGVybiBpbnQzMl90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBdG9taWNTdWIodm9sYXRpbGUgaW50MzJfdCogYWRkciwgaW50MzJfdCB2YWx1ZSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIwKSkKK2V4dGVybiBpbnQzMl90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBdG9taWNTdWIodm9sYXRpbGUgdWludDMyX3QqIGFkZHIsIHVpbnQzMl90IHZhbHVlKTsKKyNlbmRpZgorCisvKgorICogcnNBdG9taWNYb3I6IFRocmVhZC1zYWZlIGJpdHdpc2UgZXhjbHVzaXZlIG9yCisgKgorICogQXRvbWljbHkgcGVyZm9ybXMgYSBiaXR3aXNlIHhvciBvZiB0d28gdmFsdWVzLCBzdG9yaW5nIHRoZSByZXN1bHQgYXQgYWRkciwKKyAqIGkuZS4gKmFkZHIgXj0gdmFsdWUuCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgYWRkcjogQWRkcmVzcyBvZiB0aGUgdmFsdWUgdG8gbW9kaWZ5LgorICogICB2YWx1ZTogVmFsdWUgdG8geG9yIHdpdGguCisgKgorICogUmV0dXJuczogVmFsdWUgb2YgKmFkZHIgcHJpb3IgdG8gdGhlIG9wZXJhdGlvbi4KKyAqLworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE0KSkKK2V4dGVybiBpbnQzMl90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBdG9taWNYb3Iodm9sYXRpbGUgaW50MzJfdCogYWRkciwgaW50MzJfdCB2YWx1ZSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIwKSkKK2V4dGVybiBpbnQzMl90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBdG9taWNYb3Iodm9sYXRpbGUgdWludDMyX3QqIGFkZHIsIHVpbnQzMl90IHZhbHVlKTsKKyNlbmRpZgorCisjZW5kaWYgLy8gUkVOREVSU0NSSVBUX1JTX0FUT01JQ19SU0gKZGlmZiAtLWdpdCBhL3JlbmRlcnNjcmlwdC9pbmNsdWRlL3JzX2NvbnZlcnQucnNoIGIvcmVuZGVyc2NyaXB0L2luY2x1ZGUvcnNfY29udmVydC5yc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMzMThkNAotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9pbmNsdWRlL3JzX2NvbnZlcnQucnNoCkBAIC0wLDAgKzEsMTYyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIERvbid0IGVkaXQgdGhpcyBmaWxlISAgSXQgaXMgYXV0by1nZW5lcmF0ZWQgYnkgZnJhbWV3b3Jrcy9ycy9hcGkvZ2VuZXJhdGUuc2guCisKKy8qCisgKiByc19jb252ZXJ0LnJzaDogQ29udmVyc2lvbiBGdW5jdGlvbnMKKyAqCisgKiBUaGUgZnVuY3Rpb25zIGJlbG93IGNvbnZlcnQgZnJvbSBhIG51bWVyaWNhbCB2ZWN0b3IgdHlwZSB0byBhbm90aGVyLCBvciBmcm9tIG9uZSBjb2xvcgorICogcmVwcmVzZW50YXRpb24gdG8gYW5vdGhlci4KKyAqLworCisjaWZuZGVmIFJFTkRFUlNDUklQVF9SU19DT05WRVJUX1JTSAorI2RlZmluZSBSRU5ERVJTQ1JJUFRfUlNfQ09OVkVSVF9SU0gKKworLyoKKyAqIGNvbnZlcnQ6IENvbnZlcnQgbnVtZXJpY2FsIHZlY3RvcnMKKyAqCisgKiBDb252ZXJ0cyBhIHZlY3RvciBmcm9tIG9uZSBudW1lcmljYWwgdHlwZSB0byBhbm90aGVyLiAgVGhlIGNvbnZlcnNpb24gYXJlIGRvbmUgZW50cnkgcGVyIGVudHJ5LgorICoKKyAqIEUuZyBjYWxsaW5nIGEgPSBjb252ZXJ0X3Nob3J0MyhiKTsgaXMgZXF1aXZhbGVudCB0byBkb2luZworICogYS54ID0gKHNob3J0KWIueDsgYS55ID0gKHNob3J0KWIueTsgYS56ID0gKHNob3J0KWIuejsuCisgKgorICogQ29udmVydGluZyBmbG9hdGluZyBwb2ludCB2YWx1ZXMgdG8gaW50ZWdlciB0eXBlcyB0cnVuY2F0ZXMuCisgKgorICogQ29udmVydGluZyBudW1iZXJzIHRvbyBsYXJnZSB0byBmaXQgdGhlIGRlc3RpbmF0aW9uIHR5cGUgeWllbGRzIHVuZGVmaW5lZCByZXN1bHRzLgorICogRm9yIGV4YW1wbGUsIGNvbnZlcnRpbmcgYSBmbG9hdCB0aGF0IGNvbnRhaW5zIDEuMGUxOCB0byBhIHNob3J0IGlzIHVuZGVmaW5lZC4KKyAqIFVzZSBjbGFtcCgpIHRvIGF2b2lkIHRoaXMuCisgKi8KK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9mbG9hdDIoZmxvYXQyIHYpOworCitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfZmxvYXQzKGZsb2F0MyB2KTsKKworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2Zsb2F0NChmbG9hdDQgdik7CisKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9mbG9hdDIoY2hhcjIgdik7CisKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9mbG9hdDMoY2hhcjMgdik7CisKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9mbG9hdDQoY2hhcjQgdik7CisKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9mbG9hdDIodWNoYXIyIHYpOworCitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfZmxvYXQzKHVjaGFyMyB2KTsKKworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2Zsb2F0NCh1Y2hhcjQgdik7CisKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9mbG9hdDIoc2hvcnQyIHYpOworCitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfZmxvYXQzKHNob3J0MyB2KTsKKworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2Zsb2F0NChzaG9ydDQgdik7CisKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9mbG9hdDIodXNob3J0MiB2KTsKKworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2Zsb2F0Myh1c2hvcnQzIHYpOworCitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfZmxvYXQ0KHVzaG9ydDQgdik7CisKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9mbG9hdDIoaW50MiB2KTsKKworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2Zsb2F0MyhpbnQzIHYpOworCitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfZmxvYXQ0KGludDQgdik7CisKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9mbG9hdDIodWludDIgdik7CisKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9mbG9hdDModWludDMgdik7CisKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9mbG9hdDQodWludDQgdik7CisKK2V4dGVybiBjaGFyMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2NoYXIyKGZsb2F0MiB2KTsKKworZXh0ZXJuIGNoYXIzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfY2hhcjMoZmxvYXQzIHYpOworCitleHRlcm4gY2hhcjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9jaGFyNChmbG9hdDQgdik7CisKK2V4dGVybiBjaGFyMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2NoYXIyKGNoYXIyIHYpOworCitleHRlcm4gY2hhcjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9jaGFyMyhjaGFyMyB2KTsKKworZXh0ZXJuIGNoYXI0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfY2hhcjQoY2hhcjQgdik7CisKK2V4dGVybiBjaGFyMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2NoYXIyKHVjaGFyMiB2KTsKKworZXh0ZXJuIGNoYXIzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfY2hhcjModWNoYXIzIHYpOworCitleHRlcm4gY2hhcjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9jaGFyNCh1Y2hhcjQgdik7CisKK2V4dGVybiBjaGFyMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2NoYXIyKHNob3J0MiB2KTsKKworZXh0ZXJuIGNoYXIzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfY2hhcjMoc2hvcnQzIHYpOworCitleHRlcm4gY2hhcjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9jaGFyNChzaG9ydDQgdik7CisKK2V4dGVybiBjaGFyMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2NoYXIyKHVzaG9ydDIgdik7CisKK2V4dGVybiBjaGFyMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2NoYXIzKHVzaG9ydDMgdik7CisKK2V4dGVybiBjaGFyNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2NoYXI0KHVzaG9ydDQgdik7CisKK2V4dGVybiBjaGFyMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2NoYXIyKGludDIgdik7CisKK2V4dGVybiBjaGFyMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2NoYXIzKGludDMgdik7CisKK2V4dGVybiBjaGFyNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2NoYXI0KGludDQgdik7CisKK2V4dGVybiBjaGFyMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2NoYXIyKHVpbnQyIHYpOworCitleHRlcm4gY2hhcjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9jaGFyMyh1aW50MyB2KTsKKworZXh0ZXJuIGNoYXI0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfY2hhcjQodWludDQgdik7CisKK2V4dGVybiB1Y2hhcjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF91Y2hhcjIoZmxvYXQyIHYpOworCitleHRlcm4gdWNoYXIzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdWNoYXIzKGZsb2F0MyB2KTsKKworZXh0ZXJuIHVjaGFyNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X3VjaGFyNChmbG9hdDQgdik7CisKK2V4dGVybiB1Y2hhcjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF91Y2hhcjIoY2hhcjIgdik7CisKK2V4dGVybiB1Y2hhcjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF91Y2hhcjMoY2hhcjMgdik7CisKK2V4dGVybiB1Y2hhcjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF91Y2hhcjQoY2hhcjQgdik7CisKK2V4dGVybiB1Y2hhcjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF91Y2hhcjIodWNoYXIyIHYpOworCitleHRlcm4gdWNoYXIzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdWNoYXIzKHVjaGFyMyB2KTsKKworZXh0ZXJuIHVjaGFyNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X3VjaGFyNCh1Y2hhcjQgdik7CisKK2V4dGVybiB1Y2hhcjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF91Y2hhcjIoc2hvcnQyIHYpOworCitleHRlcm4gdWNoYXIzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdWNoYXIzKHNob3J0MyB2KTsKKworZXh0ZXJuIHVjaGFyNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X3VjaGFyNChzaG9ydDQgdik7CisKK2V4dGVybiB1Y2hhcjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF91Y2hhcjIodXNob3J0MiB2KTsKKworZXh0ZXJuIHVjaGFyMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X3VjaGFyMyh1c2hvcnQzIHYpOworCitleHRlcm4gdWNoYXI0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdWNoYXI0KHVzaG9ydDQgdik7CisKK2V4dGVybiB1Y2hhcjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF91Y2hhcjIoaW50MiB2KTsKKworZXh0ZXJuIHVjaGFyMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X3VjaGFyMyhpbnQzIHYpOworCitleHRlcm4gdWNoYXI0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdWNoYXI0KGludDQgdik7CisKK2V4dGVybiB1Y2hhcjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF91Y2hhcjIodWludDIgdik7CisKK2V4dGVybiB1Y2hhcjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF91Y2hhcjModWludDMgdik7CisKK2V4dGVybiB1Y2hhcjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF91Y2hhcjQodWludDQgdik7CisKK2V4dGVybiBzaG9ydDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9zaG9ydDIoZmxvYXQyIHYpOworCitleHRlcm4gc2hvcnQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfc2hvcnQzKGZsb2F0MyB2KTsKKworZXh0ZXJuIHNob3J0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X3Nob3J0NChmbG9hdDQgdik7CisKK2V4dGVybiBzaG9ydDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9zaG9ydDIoY2hhcjIgdik7CisKK2V4dGVybiBzaG9ydDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9zaG9ydDMoY2hhcjMgdik7CisKK2V4dGVybiBzaG9ydDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9zaG9ydDQoY2hhcjQgdik7CisKK2V4dGVybiBzaG9ydDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9zaG9ydDIodWNoYXIyIHYpOworCitleHRlcm4gc2hvcnQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfc2hvcnQzKHVjaGFyMyB2KTsKKworZXh0ZXJuIHNob3J0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X3Nob3J0NCh1Y2hhcjQgdik7CisKK2V4dGVybiBzaG9ydDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9zaG9ydDIoc2hvcnQyIHYpOworCitleHRlcm4gc2hvcnQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfc2hvcnQzKHNob3J0MyB2KTsKKworZXh0ZXJuIHNob3J0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X3Nob3J0NChzaG9ydDQgdik7CisKK2V4dGVybiBzaG9ydDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9zaG9ydDIodXNob3J0MiB2KTsKKworZXh0ZXJuIHNob3J0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X3Nob3J0Myh1c2hvcnQzIHYpOworCitleHRlcm4gc2hvcnQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfc2hvcnQ0KHVzaG9ydDQgdik7CisKK2V4dGVybiBzaG9ydDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9zaG9ydDIoaW50MiB2KTsKKworZXh0ZXJuIHNob3J0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X3Nob3J0MyhpbnQzIHYpOworCitleHRlcm4gc2hvcnQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfc2hvcnQ0KGludDQgdik7CisKK2V4dGVybiBzaG9ydDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9zaG9ydDIodWludDIgdik7CisKK2V4dGVybiBzaG9ydDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9zaG9ydDModWludDMgdik7CisKK2V4dGVybiBzaG9ydDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9zaG9ydDQodWludDQgdik7CisKK2V4dGVybiB1c2hvcnQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdXNob3J0MihmbG9hdDIgdik7CisKK2V4dGVybiB1c2hvcnQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdXNob3J0MyhmbG9hdDMgdik7CisKK2V4dGVybiB1c2hvcnQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdXNob3J0NChmbG9hdDQgdik7CisKK2V4dGVybiB1c2hvcnQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdXNob3J0MihjaGFyMiB2KTsKKworZXh0ZXJuIHVzaG9ydDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF91c2hvcnQzKGNoYXIzIHYpOworCitleHRlcm4gdXNob3J0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X3VzaG9ydDQoY2hhcjQgdik7CisKK2V4dGVybiB1c2hvcnQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdXNob3J0Mih1Y2hhcjIgdik7CisKK2V4dGVybiB1c2hvcnQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdXNob3J0Myh1Y2hhcjMgdik7CisKK2V4dGVybiB1c2hvcnQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdXNob3J0NCh1Y2hhcjQgdik7CisKK2V4dGVybiB1c2hvcnQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdXNob3J0MihzaG9ydDIgdik7CisKK2V4dGVybiB1c2hvcnQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdXNob3J0MyhzaG9ydDMgdik7CisKK2V4dGVybiB1c2hvcnQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdXNob3J0NChzaG9ydDQgdik7CisKK2V4dGVybiB1c2hvcnQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdXNob3J0Mih1c2hvcnQyIHYpOworCitleHRlcm4gdXNob3J0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X3VzaG9ydDModXNob3J0MyB2KTsKKworZXh0ZXJuIHVzaG9ydDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF91c2hvcnQ0KHVzaG9ydDQgdik7CisKK2V4dGVybiB1c2hvcnQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdXNob3J0MihpbnQyIHYpOworCitleHRlcm4gdXNob3J0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X3VzaG9ydDMoaW50MyB2KTsKKworZXh0ZXJuIHVzaG9ydDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF91c2hvcnQ0KGludDQgdik7CisKK2V4dGVybiB1c2hvcnQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdXNob3J0Mih1aW50MiB2KTsKKworZXh0ZXJuIHVzaG9ydDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF91c2hvcnQzKHVpbnQzIHYpOworCitleHRlcm4gdXNob3J0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X3VzaG9ydDQodWludDQgdik7CisKK2V4dGVybiBpbnQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfaW50MihmbG9hdDIgdik7CisKK2V4dGVybiBpbnQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfaW50MyhmbG9hdDMgdik7CisKK2V4dGVybiBpbnQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfaW50NChmbG9hdDQgdik7CisKK2V4dGVybiBpbnQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfaW50MihjaGFyMiB2KTsKKworZXh0ZXJuIGludDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9pbnQzKGNoYXIzIHYpOworCitleHRlcm4gaW50NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2ludDQoY2hhcjQgdik7CisKK2V4dGVybiBpbnQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfaW50Mih1Y2hhcjIgdik7CisKK2V4dGVybiBpbnQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfaW50Myh1Y2hhcjMgdik7CisKK2V4dGVybiBpbnQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfaW50NCh1Y2hhcjQgdik7CisKK2V4dGVybiBpbnQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfaW50MihzaG9ydDIgdik7CisKK2V4dGVybiBpbnQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfaW50MyhzaG9ydDMgdik7CisKK2V4dGVybiBpbnQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfaW50NChzaG9ydDQgdik7CisKK2V4dGVybiBpbnQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfaW50Mih1c2hvcnQyIHYpOworCitleHRlcm4gaW50MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2ludDModXNob3J0MyB2KTsKKworZXh0ZXJuIGludDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9pbnQ0KHVzaG9ydDQgdik7CisKK2V4dGVybiBpbnQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfaW50MihpbnQyIHYpOworCitleHRlcm4gaW50MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2ludDMoaW50MyB2KTsKKworZXh0ZXJuIGludDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9pbnQ0KGludDQgdik7CisKK2V4dGVybiBpbnQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfaW50Mih1aW50MiB2KTsKKworZXh0ZXJuIGludDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9pbnQzKHVpbnQzIHYpOworCitleHRlcm4gaW50NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2ludDQodWludDQgdik7CisKK2V4dGVybiB1aW50MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X3VpbnQyKGZsb2F0MiB2KTsKKworZXh0ZXJuIHVpbnQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdWludDMoZmxvYXQzIHYpOworCitleHRlcm4gdWludDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF91aW50NChmbG9hdDQgdik7CisKK2V4dGVybiB1aW50MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X3VpbnQyKGNoYXIyIHYpOworCitleHRlcm4gdWludDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF91aW50MyhjaGFyMyB2KTsKKworZXh0ZXJuIHVpbnQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdWludDQoY2hhcjQgdik7CisKK2V4dGVybiB1aW50MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X3VpbnQyKHVjaGFyMiB2KTsKKworZXh0ZXJuIHVpbnQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdWludDModWNoYXIzIHYpOworCitleHRlcm4gdWludDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF91aW50NCh1Y2hhcjQgdik7CisKK2V4dGVybiB1aW50MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X3VpbnQyKHNob3J0MiB2KTsKKworZXh0ZXJuIHVpbnQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdWludDMoc2hvcnQzIHYpOworCitleHRlcm4gdWludDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF91aW50NChzaG9ydDQgdik7CisKK2V4dGVybiB1aW50MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X3VpbnQyKHVzaG9ydDIgdik7CisKK2V4dGVybiB1aW50MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X3VpbnQzKHVzaG9ydDMgdik7CisKK2V4dGVybiB1aW50NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X3VpbnQ0KHVzaG9ydDQgdik7CisKK2V4dGVybiB1aW50MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X3VpbnQyKGludDIgdik7CisKK2V4dGVybiB1aW50MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X3VpbnQzKGludDMgdik7CisKK2V4dGVybiB1aW50NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X3VpbnQ0KGludDQgdik7CisKK2V4dGVybiB1aW50MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X3VpbnQyKHVpbnQyIHYpOworCitleHRlcm4gdWludDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF91aW50Myh1aW50MyB2KTsKKworZXh0ZXJuIHVpbnQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdWludDQodWludDQgdik7CisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZG91YmxlMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2RvdWJsZTIoZG91YmxlMiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGRvdWJsZTMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9kb3VibGUzKGRvdWJsZTMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBkb3VibGU0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfZG91YmxlNChkb3VibGU0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZG91YmxlMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2RvdWJsZTIobG9uZzIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBkb3VibGUzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfZG91YmxlMyhsb25nMyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGRvdWJsZTQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9kb3VibGU0KGxvbmc0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZG91YmxlMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2RvdWJsZTIodWxvbmcyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZG91YmxlMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2RvdWJsZTModWxvbmczIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZG91YmxlNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2RvdWJsZTQodWxvbmc0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gbG9uZzIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9sb25nMihkb3VibGUyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gbG9uZzMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9sb25nMyhkb3VibGUzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gbG9uZzQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9sb25nNChkb3VibGU0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gbG9uZzIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9sb25nMihsb25nMiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGxvbmczIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfbG9uZzMobG9uZzMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBsb25nNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2xvbmc0KGxvbmc0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gbG9uZzIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9sb25nMih1bG9uZzIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBsb25nMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2xvbmczKHVsb25nMyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGxvbmc0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfbG9uZzQodWxvbmc0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gdWxvbmcyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdWxvbmcyKGRvdWJsZTIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiB1bG9uZzMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF91bG9uZzMoZG91YmxlMyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIHVsb25nNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X3Vsb25nNChkb3VibGU0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gdWxvbmcyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdWxvbmcyKGxvbmcyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gdWxvbmczIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdWxvbmczKGxvbmczIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gdWxvbmc0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdWxvbmc0KGxvbmc0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gdWxvbmcyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdWxvbmcyKHVsb25nMiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIHVsb25nMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X3Vsb25nMyh1bG9uZzMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiB1bG9uZzQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF91bG9uZzQodWxvbmc0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfZmxvYXQyKGRvdWJsZTIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9mbG9hdDMoZG91YmxlMyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2Zsb2F0NChkb3VibGU0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfZmxvYXQyKGxvbmcyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfZmxvYXQzKGxvbmczIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfZmxvYXQ0KGxvbmc0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfZmxvYXQyKHVsb25nMiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2Zsb2F0Myh1bG9uZzMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9mbG9hdDQodWxvbmc0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gY2hhcjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9jaGFyMihkb3VibGUyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gY2hhcjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9jaGFyMyhkb3VibGUzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gY2hhcjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9jaGFyNChkb3VibGU0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gY2hhcjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9jaGFyMihsb25nMiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGNoYXIzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfY2hhcjMobG9uZzMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBjaGFyNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2NoYXI0KGxvbmc0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gY2hhcjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9jaGFyMih1bG9uZzIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBjaGFyMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2NoYXIzKHVsb25nMyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGNoYXI0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfY2hhcjQodWxvbmc0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gdWNoYXIyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdWNoYXIyKGRvdWJsZTIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiB1Y2hhcjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF91Y2hhcjMoZG91YmxlMyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIHVjaGFyNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X3VjaGFyNChkb3VibGU0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gdWNoYXIyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdWNoYXIyKGxvbmcyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gdWNoYXIzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdWNoYXIzKGxvbmczIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gdWNoYXI0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdWNoYXI0KGxvbmc0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gdWNoYXIyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdWNoYXIyKHVsb25nMiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIHVjaGFyMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X3VjaGFyMyh1bG9uZzMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiB1Y2hhcjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF91Y2hhcjQodWxvbmc0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gc2hvcnQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfc2hvcnQyKGRvdWJsZTIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBzaG9ydDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9zaG9ydDMoZG91YmxlMyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIHNob3J0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X3Nob3J0NChkb3VibGU0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gc2hvcnQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfc2hvcnQyKGxvbmcyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gc2hvcnQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfc2hvcnQzKGxvbmczIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gc2hvcnQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfc2hvcnQ0KGxvbmc0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gc2hvcnQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfc2hvcnQyKHVsb25nMiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIHNob3J0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X3Nob3J0Myh1bG9uZzMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBzaG9ydDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9zaG9ydDQodWxvbmc0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gdXNob3J0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X3VzaG9ydDIoZG91YmxlMiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIHVzaG9ydDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF91c2hvcnQzKGRvdWJsZTMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiB1c2hvcnQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdXNob3J0NChkb3VibGU0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gdXNob3J0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X3VzaG9ydDIobG9uZzIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiB1c2hvcnQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdXNob3J0Myhsb25nMyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIHVzaG9ydDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF91c2hvcnQ0KGxvbmc0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gdXNob3J0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X3VzaG9ydDIodWxvbmcyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gdXNob3J0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X3VzaG9ydDModWxvbmczIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gdXNob3J0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X3VzaG9ydDQodWxvbmc0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gaW50MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2ludDIoZG91YmxlMiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGludDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9pbnQzKGRvdWJsZTMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBpbnQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfaW50NChkb3VibGU0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gaW50MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2ludDIobG9uZzIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBpbnQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfaW50Myhsb25nMyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGludDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9pbnQ0KGxvbmc0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gaW50MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2ludDIodWxvbmcyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gaW50MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2ludDModWxvbmczIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gaW50NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2ludDQodWxvbmc0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gdWludDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF91aW50Mihkb3VibGUyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gdWludDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF91aW50Myhkb3VibGUzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gdWludDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF91aW50NChkb3VibGU0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gdWludDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF91aW50Mihsb25nMiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIHVpbnQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdWludDMobG9uZzMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiB1aW50NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X3VpbnQ0KGxvbmc0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gdWludDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF91aW50Mih1bG9uZzIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiB1aW50MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X3VpbnQzKHVsb25nMyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIHVpbnQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdWludDQodWxvbmc0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZG91YmxlMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2RvdWJsZTIoZmxvYXQyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZG91YmxlMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2RvdWJsZTMoZmxvYXQzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZG91YmxlNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2RvdWJsZTQoZmxvYXQ0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZG91YmxlMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2RvdWJsZTIoY2hhcjIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBkb3VibGUzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfZG91YmxlMyhjaGFyMyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGRvdWJsZTQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9kb3VibGU0KGNoYXI0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZG91YmxlMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2RvdWJsZTIodWNoYXIyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZG91YmxlMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2RvdWJsZTModWNoYXIzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZG91YmxlNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2RvdWJsZTQodWNoYXI0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZG91YmxlMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2RvdWJsZTIoc2hvcnQyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZG91YmxlMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2RvdWJsZTMoc2hvcnQzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZG91YmxlNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2RvdWJsZTQoc2hvcnQ0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZG91YmxlMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2RvdWJsZTIodXNob3J0MiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGRvdWJsZTMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9kb3VibGUzKHVzaG9ydDMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBkb3VibGU0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfZG91YmxlNCh1c2hvcnQ0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZG91YmxlMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2RvdWJsZTIoaW50MiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGRvdWJsZTMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9kb3VibGUzKGludDMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBkb3VibGU0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfZG91YmxlNChpbnQ0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZG91YmxlMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2RvdWJsZTIodWludDIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBkb3VibGUzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfZG91YmxlMyh1aW50MyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGRvdWJsZTQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9kb3VibGU0KHVpbnQ0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gbG9uZzIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9sb25nMihmbG9hdDIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBsb25nMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2xvbmczKGZsb2F0MyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGxvbmc0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfbG9uZzQoZmxvYXQ0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gbG9uZzIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9sb25nMihjaGFyMiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGxvbmczIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfbG9uZzMoY2hhcjMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBsb25nNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2xvbmc0KGNoYXI0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gbG9uZzIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9sb25nMih1Y2hhcjIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBsb25nMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2xvbmczKHVjaGFyMyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGxvbmc0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfbG9uZzQodWNoYXI0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gbG9uZzIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9sb25nMihzaG9ydDIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBsb25nMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2xvbmczKHNob3J0MyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGxvbmc0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfbG9uZzQoc2hvcnQ0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gbG9uZzIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9sb25nMih1c2hvcnQyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gbG9uZzMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9sb25nMyh1c2hvcnQzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gbG9uZzQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9sb25nNCh1c2hvcnQ0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gbG9uZzIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9sb25nMihpbnQyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gbG9uZzMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9sb25nMyhpbnQzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gbG9uZzQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9sb25nNChpbnQ0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gbG9uZzIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9sb25nMih1aW50MiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGxvbmczIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfbG9uZzModWludDMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBsb25nNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2xvbmc0KHVpbnQ0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gdWxvbmcyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdWxvbmcyKGZsb2F0MiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIHVsb25nMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X3Vsb25nMyhmbG9hdDMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiB1bG9uZzQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF91bG9uZzQoZmxvYXQ0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gdWxvbmcyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdWxvbmcyKGNoYXIyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gdWxvbmczIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdWxvbmczKGNoYXIzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gdWxvbmc0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdWxvbmc0KGNoYXI0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gdWxvbmcyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdWxvbmcyKHVjaGFyMiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIHVsb25nMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X3Vsb25nMyh1Y2hhcjMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiB1bG9uZzQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF91bG9uZzQodWNoYXI0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gdWxvbmcyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdWxvbmcyKHNob3J0MiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIHVsb25nMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X3Vsb25nMyhzaG9ydDMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiB1bG9uZzQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF91bG9uZzQoc2hvcnQ0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gdWxvbmcyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdWxvbmcyKHVzaG9ydDIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiB1bG9uZzMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF91bG9uZzModXNob3J0MyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIHVsb25nNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X3Vsb25nNCh1c2hvcnQ0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gdWxvbmcyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdWxvbmcyKGludDIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiB1bG9uZzMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF91bG9uZzMoaW50MyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIHVsb25nNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X3Vsb25nNChpbnQ0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gdWxvbmcyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdWxvbmcyKHVpbnQyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gdWxvbmczIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdWxvbmczKHVpbnQzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gdWxvbmc0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdWxvbmc0KHVpbnQ0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9oYWxmMihoYWxmMiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfaGFsZjMoaGFsZjMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2hhbGY0KGhhbGY0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfZmxvYXQyKGhhbGYyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfZmxvYXQzKGhhbGYzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfZmxvYXQ0KGhhbGY0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gZG91YmxlMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2RvdWJsZTIoaGFsZjIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBkb3VibGUzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfZG91YmxlMyhoYWxmMyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGRvdWJsZTQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9kb3VibGU0KGhhbGY0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gY2hhcjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9jaGFyMihoYWxmMiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGNoYXIzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfY2hhcjMoaGFsZjMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBjaGFyNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2NoYXI0KGhhbGY0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gdWNoYXIyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdWNoYXIyKGhhbGYyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gdWNoYXIzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdWNoYXIzKGhhbGYzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gdWNoYXI0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdWNoYXI0KGhhbGY0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gc2hvcnQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfc2hvcnQyKGhhbGYyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gc2hvcnQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfc2hvcnQzKGhhbGYzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gc2hvcnQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfc2hvcnQ0KGhhbGY0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gdXNob3J0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X3VzaG9ydDIoaGFsZjIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiB1c2hvcnQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdXNob3J0MyhoYWxmMyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIHVzaG9ydDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF91c2hvcnQ0KGhhbGY0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaW50MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2ludDIoaGFsZjIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBpbnQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfaW50MyhoYWxmMyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGludDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9pbnQ0KGhhbGY0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gdWludDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF91aW50MihoYWxmMiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIHVpbnQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdWludDMoaGFsZjMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiB1aW50NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X3VpbnQ0KGhhbGY0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gbG9uZzIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9sb25nMihoYWxmMiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGxvbmczIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfbG9uZzMoaGFsZjMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBsb25nNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2xvbmc0KGhhbGY0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gdWxvbmcyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdWxvbmcyKGhhbGYyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gdWxvbmczIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdWxvbmczKGhhbGYzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gdWxvbmc0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfdWxvbmc0KGhhbGY0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9oYWxmMihmbG9hdDIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2hhbGYzKGZsb2F0MyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGY0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfaGFsZjQoZmxvYXQ0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9oYWxmMihkb3VibGUyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9oYWxmMyhkb3VibGUzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9oYWxmNChkb3VibGU0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9oYWxmMihjaGFyMiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfaGFsZjMoY2hhcjMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2hhbGY0KGNoYXI0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9oYWxmMih1Y2hhcjIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2hhbGYzKHVjaGFyMyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGY0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfaGFsZjQodWNoYXI0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9oYWxmMihzaG9ydDIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2hhbGYzKHNob3J0MyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGY0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfaGFsZjQoc2hvcnQ0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9oYWxmMih1c2hvcnQyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9oYWxmMyh1c2hvcnQzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9oYWxmNCh1c2hvcnQ0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9oYWxmMihpbnQyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9oYWxmMyhpbnQzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9oYWxmNChpbnQ0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9oYWxmMih1aW50MiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfaGFsZjModWludDMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2hhbGY0KHVpbnQ0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9oYWxmMihsb25nMiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfaGFsZjMobG9uZzMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2hhbGY0KGxvbmc0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29udmVydF9oYWxmMih1bG9uZzIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb252ZXJ0X2hhbGYzKHVsb25nMyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGY0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvbnZlcnRfaGFsZjQodWxvbmc0IHYpOworI2VuZGlmCisKKy8qCisgKiByc1BhY2tDb2xvclRvODg4ODogQ3JlYXRlIGEgdWNoYXI0IFJHQkEgZnJvbSBmbG9hdHMKKyAqCisgKiBQYWNrcyB0aHJlZSBvciBmb3VyIGZsb2F0aW5nIHBvaW50IFJHQkEgdmFsdWVzIGludG8gYSB1Y2hhcjQuCisgKgorICogVGhlIGlucHV0IHZhbHVlcyBhcmUgdHlwaWNhbGx5IGJldHdlZW4gMC4wZiBhbmQgMS4wZiBpbmNsdXNpdmUuICBGb3IgaW5wdXQgdmFsdWVzIG91dHNpZGUKKyAqIG9mIHRoaXMgcmFuZ2UsIHRoZSByZXN1bHRpbmcgb3V0cHV0cyB3aWxsIGJlIGNsYW1wZWQgdG8gYmUgYmV0d2VlbiAwIGFuZCAyNTUuICBBcyB0aGlzCisgKiBjbGFtcGluZyBtYXkgYmUgZG9uZSBhZnRlciB0aGUgaW5wdXQgaXMgbXVsdGlwbGllZCBieSAyNTUuZiBhbmQgY29udmVydGVkIHRvIGFuIGludGVnZXIsCisgKiBpbnB1dCBudW1iZXJzIGdyZWF0ZXIgdGhhbiBJTlRfTUFYLzI1NS5mIG9yIGxlc3MgdGhhbiBJTlRfTUlOLzI1NS5mIHJlc3VsdCBpbgorICogdW5kZWZpbmVkIGJlaGF2aW9yLgorICoKKyAqIElmIHRoZSBhbHBoYSBjb21wb25lbnQgaXMgbm90IHNwZWNpZmllZCwgaXQgaXMgYXNzdW1lZCB0byBiZSAxLjAsIGkuZS4gdGhlIHJlc3VsdCB3aWxsCisgKiBoYXZlIGFuIGFscGhhIHNldCB0byAyNTUuCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgcjogUmVkIGNvbXBvbmVudC4KKyAqICAgZzogR3JlZW4gY29tcG9uZW50LgorICogICBiOiBCbHVlIGNvbXBvbmVudC4KKyAqICAgYTogQWxwaGEgY29tcG9uZW50LgorICogICBjb2xvcjogVmVjdG9yIG9mIDMgb3IgNCBmbG9hdHMgY29udGFpbmluZyB0aGUgUiwgRywgQiwgYW5kIEEgdmFsdWVzLgorICovCitleHRlcm4gdWNoYXI0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHJzUGFja0NvbG9yVG84ODg4KGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIpOworCitleHRlcm4gdWNoYXI0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHJzUGFja0NvbG9yVG84ODg4KGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpOworCitleHRlcm4gdWNoYXI0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHJzUGFja0NvbG9yVG84ODg4KGZsb2F0MyBjb2xvcik7CisKK2V4dGVybiB1Y2hhcjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgcnNQYWNrQ29sb3JUbzg4ODgoZmxvYXQ0IGNvbG9yKTsKKworLyoKKyAqIHJzVW5wYWNrQ29sb3I4ODg4OiBDcmVhdGUgYSBmbG9hdDQgUkdCQSBmcm9tIHVjaGFyNAorICoKKyAqIFVucGFja3MgYSB1Y2hhcjQgY29sb3IgdG8gZmxvYXQ0LiAgVGhlIHJlc3VsdGluZyBmbG9hdHMgd2lsbCBiZSBiZXR3ZWVuIDAuMCBhbmQgMS4wIGluY2x1c2l2ZS4KKyAqLworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCkpCisgICAgcnNVbnBhY2tDb2xvcjg4ODgodWNoYXI0IGMpOworCisvKgorICogcnNZdXZUb1JHQkE6IENvbnZlcnQgYSBZVVYgdmFsdWUgdG8gUkdCQQorICoKKyAqIENvbnZlcnRzIGEgY29sb3IgZnJvbSBhIFlVViByZXByZXNlbnRhdGlvbiB0byBSR0JBLgorICoKKyAqIFdlIGN1cnJlbnRseSBkb24ndCBwcm92aWRlIGEgZnVuY3Rpb24gdG8gZG8gdGhlIHJldmVyc2UgY29udmVyc2lvbi4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICB5OiBMdW1pbmFuY2UgY29tcG9uZW50LgorICogICB1OiBVIGNocm9taW5hbmNlIGNvbXBvbmVudC4KKyAqICAgdjogViBjaHJvbWluYW5jZSBjb21wb25lbnQuCisgKi8KK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgcnNZdXZUb1JHQkFfZmxvYXQ0KHVjaGFyIHksIHVjaGFyIHUsIHVjaGFyIHYpOworCitleHRlcm4gdWNoYXI0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHJzWXV2VG9SR0JBX3VjaGFyNCh1Y2hhciB5LCB1Y2hhciB1LCB1Y2hhciB2KTsKKworI2VuZGlmIC8vIFJFTkRFUlNDUklQVF9SU19DT05WRVJUX1JTSApkaWZmIC0tZ2l0IGEvcmVuZGVyc2NyaXB0L2luY2x1ZGUvcnNfY29yZS5yc2ggYi9yZW5kZXJzY3JpcHQvaW5jbHVkZS9yc19jb3JlLnJzaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTkzZDYwCi0tLSAvZGV2L251bGwKKysrIGIvcmVuZGVyc2NyaXB0L2luY2x1ZGUvcnNfY29yZS5yc2gKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIERvbid0IGVkaXQgdGhpcyBmaWxlISAgSXQgaXMgYXV0by1nZW5lcmF0ZWQgYnkgZnJhbWV3b3Jrcy9ycy9hcGkvZ2VuZXJhdGUuc2guCisKKy8qCisgKiByc19jb3JlLnJzaDogT3ZlcnZpZXcKKyAqCisgKiBSZW5kZXJTY3JpcHQgaXMgYSBoaWdoLXBlcmZvcm1hbmNlIHJ1bnRpbWUgdGhhdCBwcm92aWRlcyBjb21wdXRlIG9wZXJhdGlvbnMgYXQgdGhlIG5hdGl2ZSBsZXZlbC4KKyAqIFJlbmRlclNjcmlwdCBjb2RlIGlzIGNvbXBpbGVkIG9uIGRldmljZXMgYXQgcnVudGltZSB0byBhbGxvdyBwbGF0Zm9ybS1pbmRlcGVuZGVuY2UgYXMgd2VsbC4KKyAqCisgKiBUaGlzIHJlZmVyZW5jZSBkb2N1bWVudGF0aW9uIGRlc2NyaWJlcyB0aGUgUmVuZGVyU2NyaXB0IHJ1bnRpbWUgQVBJcywgd2hpY2ggeW91IGNhbiB1dGlsaXplCisgKiB0byB3cml0ZSBSZW5kZXJTY3JpcHQgY29kZSBpbiBDOTkuIFRoZSBSZW5kZXJTY3JpcHQgY29tcHV0ZSBoZWFkZXIgZmlsZXMgYXJlIGF1dG9tYXRpY2FsbHkKKyAqIGluY2x1ZGVkIGZvciB5b3UuCisgKgorICogVG8gdXNlIFJlbmRlclNjcmlwdCwgeW91IG5lZWQgdG8gdXRpbGl6ZSB0aGUgUmVuZGVyU2NyaXB0IHJ1bnRpbWUgQVBJcyBkb2N1bWVudGVkIGhlcmUgYXMgd2VsbAorICogYXMgdGhlIEFuZHJvaWQgZnJhbWV3b3JrIEFQSXMgZm9yIFJlbmRlclNjcmlwdC4gIEZvciBkb2N1bWVudGF0aW9uIG9uIHRoZSBBbmRyb2lkIGZyYW1ld29yaworICogQVBJcywgc2VlIHRoZSBhbmRyb2lkLnJlbmRlcnNjcmlwdCBwYWNrYWdlIHJlZmVyZW5jZS4KKyAqCisgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZGV2ZWxvcCB3aXRoIFJlbmRlclNjcmlwdCBhbmQgaG93IHRoZSBydW50aW1lIGFuZCBBbmRyb2lkCisgKiBmcmFtZXdvcmsgQVBJcyBpbnRlcmFjdCwgc2VlIHRoZSBSZW5kZXJTY3JpcHQgZGV2ZWxvcGVyIGd1aWRlIGFuZCB0aGUgUmVuZGVyU2NyaXB0IHNhbXBsZXMuCisgKi8KKworI2lmbmRlZiBSRU5ERVJTQ1JJUFRfUlNfQ09SRV9SU0gKKyNkZWZpbmUgUkVOREVSU0NSSVBUX1JTX0NPUkVfUlNICisKKyNkZWZpbmUgUlNfS0VSTkVMIF9fYXR0cmlidXRlX18oKGtlcm5lbCkpCisKKyNpbmNsdWRlICJzdGRib29sLmgiCisKKyNpbmNsdWRlICJyc192YWx1ZV90eXBlcy5yc2giCisjaW5jbHVkZSAicnNfb2JqZWN0X3R5cGVzLnJzaCIKKworI2luY2x1ZGUgInJzX2FsbG9jYXRpb25fY3JlYXRlLnJzaCIKKyNpbmNsdWRlICJyc19hbGxvY2F0aW9uX2RhdGEucnNoIgorI2luY2x1ZGUgInJzX2F0b21pYy5yc2giCisjaW5jbHVkZSAicnNfY29udmVydC5yc2giCisjaW5jbHVkZSAicnNfZGVidWcucnNoIgorI2luY2x1ZGUgInJzX2Zvcl9lYWNoLnJzaCIKKyNpbmNsdWRlICJyc19pby5yc2giCisjaW5jbHVkZSAicnNfbWF0aC5yc2giCisjaW5jbHVkZSAicnNfbWF0cml4LnJzaCIKKyNpbmNsdWRlICJyc19vYmplY3RfaW5mby5yc2giCisjaW5jbHVkZSAicnNfcXVhdGVybmlvbi5yc2giCisjaW5jbHVkZSAicnNfdGltZS5yc2giCisjaW5jbHVkZSAicnNfdmVjdG9yX21hdGgucnNoIgorCisjZW5kaWYgLy8gUkVOREVSU0NSSVBUX1JTX0NPUkVfUlNICmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvaW5jbHVkZS9yc19kZWJ1Zy5yc2ggYi9yZW5kZXJzY3JpcHQvaW5jbHVkZS9yc19kZWJ1Zy5yc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNjNWZhYQotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9pbmNsdWRlL3JzX2RlYnVnLnJzaApAQCAtMCwwICsxLDI2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIERvbid0IGVkaXQgdGhpcyBmaWxlISAgSXQgaXMgYXV0by1nZW5lcmF0ZWQgYnkgZnJhbWV3b3Jrcy9ycy9hcGkvZ2VuZXJhdGUuc2guCisKKy8qCisgKiByc19kZWJ1Zy5yc2g6IERlYnVnZ2luZyBGdW5jdGlvbnMKKyAqCisgKiBUaGUgZnVuY3Rpb25zIGJlbG93IGFyZSBpbnRlbmRlZCB0byBiZSB1c2VkIGR1cmluZyBhcHBsaWNhdGlvbiBkZXZlbG9wZW1lbnQuCisgKiBUaGV5IHNob3VsZCBub3QgYmUgdXNlZCBpbiBzaGlwcGluZyBhcHBsaWNhdGlvbnMuCisgKi8KKworI2lmbmRlZiBSRU5ERVJTQ1JJUFRfUlNfREVCVUdfUlNICisjZGVmaW5lIFJFTkRFUlNDUklQVF9SU19ERUJVR19SU0gKKworI2RlZmluZSBSU19ERUJVRyhhKSByc0RlYnVnKCNhLCBhKQorI2RlZmluZSBSU19ERUJVR19NQVJLRVIgcnNEZWJ1ZyhfX0ZJTEVfXywgX19MSU5FX18pCisKKy8qCisgKiByc0RlYnVnOiBMb2cgYSBtZXNzYWdlIGFuZCB2YWx1ZXMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHByaW50cyBhIG1lc3NhZ2UgdG8gdGhlIHN0YW5kYXJkIGxvZywgZm9sbG93ZWQgYnkgdGhlIHByb3ZpZGVkIHZhbHVlcy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIGZvciBkZWJ1Z2dpbmcgb25seSBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHNoaXBwaW5nCisgKiBhcHBsaWNhdGlvbnMuCisgKi8KK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyKiBtZXNzYWdlLCBkb3VibGUgYSk7CisKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyKiBtZXNzYWdlLCBpbnQgYSk7CisKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyKiBtZXNzYWdlLCB1aW50IGEpOworCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRGVidWcoY29uc3QgY2hhciogbWVzc2FnZSwgbG9uZyBhKTsKKworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0RlYnVnKGNvbnN0IGNoYXIqIG1lc3NhZ2UsIHVsb25nIGEpOworCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTcpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0RlYnVnKGNvbnN0IGNoYXIqIG1lc3NhZ2UsIGludDIgYSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE3KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyKiBtZXNzYWdlLCBpbnQzIGEpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxNykpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRGVidWcoY29uc3QgY2hhciogbWVzc2FnZSwgaW50NCBhKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTcpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0RlYnVnKGNvbnN0IGNoYXIqIG1lc3NhZ2UsIHVpbnQyIGEpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxNykpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRGVidWcoY29uc3QgY2hhciogbWVzc2FnZSwgdWludDMgYSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE3KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyKiBtZXNzYWdlLCB1aW50NCBhKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTcpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0RlYnVnKGNvbnN0IGNoYXIqIG1lc3NhZ2UsIGxvbmcyIGEpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxNykpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRGVidWcoY29uc3QgY2hhciogbWVzc2FnZSwgbG9uZzMgYSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE3KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyKiBtZXNzYWdlLCBsb25nNCBhKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTcpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0RlYnVnKGNvbnN0IGNoYXIqIG1lc3NhZ2UsIHVsb25nMiBhKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTcpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0RlYnVnKGNvbnN0IGNoYXIqIG1lc3NhZ2UsIHVsb25nMyBhKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTcpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0RlYnVnKGNvbnN0IGNoYXIqIG1lc3NhZ2UsIHVsb25nNCBhKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjMpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0RlYnVnKGNvbnN0IGNoYXIqIG1lc3NhZ2UsIGRvdWJsZTIgYSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIzKSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyKiBtZXNzYWdlLCBkb3VibGUzIGEpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMykpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRGVidWcoY29uc3QgY2hhciogbWVzc2FnZSwgZG91YmxlNCBhKTsKKyNlbmRpZgorCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRGVidWcoY29uc3QgY2hhciogbWVzc2FnZSwgZmxvYXQgYSk7CisKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyKiBtZXNzYWdlLCBmbG9hdDIgYSk7CisKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyKiBtZXNzYWdlLCBmbG9hdDMgYSk7CisKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyKiBtZXNzYWdlLCBmbG9hdDQgYSk7CisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRGVidWcoY29uc3QgY2hhciogbWVzc2FnZSwgaGFsZiBhKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0RlYnVnKGNvbnN0IGNoYXIqIG1lc3NhZ2UsIGhhbGYyIGEpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRGVidWcoY29uc3QgY2hhciogbWVzc2FnZSwgaGFsZjMgYSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyKiBtZXNzYWdlLCBoYWxmNCBhKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTcpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0RlYnVnKGNvbnN0IGNoYXIqIG1lc3NhZ2UsIGNoYXIgYSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE3KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyKiBtZXNzYWdlLCBjaGFyMiBhKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTcpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0RlYnVnKGNvbnN0IGNoYXIqIG1lc3NhZ2UsIGNoYXIzIGEpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxNykpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRGVidWcoY29uc3QgY2hhciogbWVzc2FnZSwgY2hhcjQgYSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE3KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyKiBtZXNzYWdlLCB1Y2hhciBhKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTcpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0RlYnVnKGNvbnN0IGNoYXIqIG1lc3NhZ2UsIHVjaGFyMiBhKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTcpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0RlYnVnKGNvbnN0IGNoYXIqIG1lc3NhZ2UsIHVjaGFyMyBhKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTcpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0RlYnVnKGNvbnN0IGNoYXIqIG1lc3NhZ2UsIHVjaGFyNCBhKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTcpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0RlYnVnKGNvbnN0IGNoYXIqIG1lc3NhZ2UsIHNob3J0IGEpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxNykpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRGVidWcoY29uc3QgY2hhciogbWVzc2FnZSwgc2hvcnQyIGEpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxNykpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRGVidWcoY29uc3QgY2hhciogbWVzc2FnZSwgc2hvcnQzIGEpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxNykpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRGVidWcoY29uc3QgY2hhciogbWVzc2FnZSwgc2hvcnQ0IGEpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxNykpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRGVidWcoY29uc3QgY2hhciogbWVzc2FnZSwgdXNob3J0IGEpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxNykpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRGVidWcoY29uc3QgY2hhciogbWVzc2FnZSwgdXNob3J0MiBhKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTcpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0RlYnVnKGNvbnN0IGNoYXIqIG1lc3NhZ2UsIHVzaG9ydDMgYSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE3KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyKiBtZXNzYWdlLCB1c2hvcnQ0IGEpOworI2VuZGlmCisKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyKiBtZXNzYWdlLCBmbG9hdCBhLCBmbG9hdCBiKTsKKworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0RlYnVnKGNvbnN0IGNoYXIqIG1lc3NhZ2UsIGZsb2F0IGEsIGZsb2F0IGIsIGZsb2F0IGMpOworCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRGVidWcoY29uc3QgY2hhciogbWVzc2FnZSwgZmxvYXQgYSwgZmxvYXQgYiwgZmxvYXQgYywgZmxvYXQgZCk7CisKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyKiBtZXNzYWdlLCBsb25nIGxvbmcgYSk7CisKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyKiBtZXNzYWdlLCB1bnNpZ25lZCBsb25nIGxvbmcgYSk7CisKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyKiBtZXNzYWdlLCBjb25zdCB2b2lkKiBhKTsKKworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0RlYnVnKGNvbnN0IGNoYXIqIG1lc3NhZ2UsIGNvbnN0IHJzX21hdHJpeDR4NCogYSk7CisKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyKiBtZXNzYWdlLCBjb25zdCByc19tYXRyaXgzeDMqIGEpOworCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRGVidWcoY29uc3QgY2hhciogbWVzc2FnZSwgY29uc3QgcnNfbWF0cml4MngyKiBhKTsKKworI2VuZGlmIC8vIFJFTkRFUlNDUklQVF9SU19ERUJVR19SU0gKZGlmZiAtLWdpdCBhL3JlbmRlcnNjcmlwdC9pbmNsdWRlL3JzX2Zvcl9lYWNoLnJzaCBiL3JlbmRlcnNjcmlwdC9pbmNsdWRlL3JzX2Zvcl9lYWNoLnJzaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2M1ZGI5Ci0tLSAvZGV2L251bGwKKysrIGIvcmVuZGVyc2NyaXB0L2luY2x1ZGUvcnNfZm9yX2VhY2gucnNoCkBAIC0wLDAgKzEsNDM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gRG9uJ3QgZWRpdCB0aGlzIGZpbGUhICBJdCBpcyBhdXRvLWdlbmVyYXRlZCBieSBmcmFtZXdvcmtzL3JzL2FwaS9nZW5lcmF0ZS5zaC4KKworLyoKKyAqIHJzX2Zvcl9lYWNoLnJzaDogS2VybmVsIEludm9jYXRpb24gRnVuY3Rpb25zIGFuZCBUeXBlcworICoKKyAqIFRoZSByc0ZvckVhY2goKSBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnZva2UgdGhlIHJvb3Qga2VybmVsIG9mIGEgc2NyaXB0LgorICoKKyAqIFRoZSBvdGhlciBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gZ2V0IHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIGludm9jYXRpb24gb2YKKyAqIGFuIGV4ZWN1dGluZyBrZXJuZWwsIGxpa2UgZGltZW5zaW9ucyBhbmQgY3VycmVudCBpbmRpY2VzLiAgVGhlc2UgZnVuY3Rpb25zIHRha2UKKyAqIGEgcnNfa2VybmVsX2NvbnRleHQgYXMgYXJndW1lbnQuCisgKi8KKworI2lmbmRlZiBSRU5ERVJTQ1JJUFRfUlNfRk9SX0VBQ0hfUlNICisjZGVmaW5lIFJFTkRFUlNDUklQVF9SU19GT1JfRUFDSF9SU0gKKworLyoKKyAqIHJzX2Zvcl9lYWNoX3N0cmF0ZWd5X3Q6IFN1Z2dlc3RlZCBjZWxsIHByb2Nlc3Npbmcgb3JkZXIKKyAqCisgKiBUaGlzIHR5cGUgaXMgdXNlZCB0byBzdWdnZXN0IGhvdyB0aGUgaW52b2tlZCBrZXJuZWwgc2hvdWxkIGl0ZXJhdGUgb3ZlciB0aGUgY2VsbHMgb2YgdGhlCisgKiBhbGxvY2F0aW9ucy4gIFRoaXMgaXMgYSBoaW50IG9ubHkuICBJbXBsZW1lbnRhdGlvbnMgbWF5IG5vdCBmb2xsb3cgdGhlIHN1Z2dlc3Rpb24uCisgKgorICogVGhpcyBzcGVjaWZpY2F0aW9uIGNhbiBoZWxwIHRoZSBjYWNoaW5nIGJlaGF2aW9yIG9mIHRoZSBydW5uaW5nIGtlcm5lbCwgZS5nLiB0aGUgY2FjaGUKKyAqIGxvY2FsaXR5IHdoZW4gdGhlIHByb2Nlc3NpbmcgaXMgZGlzdHJpYnV0ZWQgb3ZlciBtdWx0aXBsZSBjb3Jlcy4KKyAqLwordHlwZWRlZiBlbnVtIHJzX2Zvcl9lYWNoX3N0cmF0ZWd5IHsKKyAgICBSU19GT1JfRUFDSF9TVFJBVEVHWV9TRVJJQUwgPSAwLCAvLyBQcmVmZXIgY29udGlndW91cyBtZW1vcnkgcmVnaW9ucy4KKyAgICBSU19GT1JfRUFDSF9TVFJBVEVHWV9ET05UX0NBUkUgPSAxLCAvLyBObyBwcmVmcmVuY2VzLgorICAgIFJTX0ZPUl9FQUNIX1NUUkFURUdZX0RTVF9MSU5FQVIgPSAyLCAvLyBQcmVmZXIgRFNULgorICAgIFJTX0ZPUl9FQUNIX1NUUkFURUdZX1RJTEVfU01BTEwgPSAzLCAvLyBQcmVmZXIgcHJvY2Vzc2luZyBzbWFsbCByZWN0YW5ndWxhciByZWdpb25zLgorICAgIFJTX0ZPUl9FQUNIX1NUUkFURUdZX1RJTEVfTUVESVVNID0gNCwgLy8gUHJlZmVyIHByb2Nlc3NpbmcgbWVkaXVtIHJlY3Rhbmd1bGFyIHJlZ2lvbnMuCisgICAgUlNfRk9SX0VBQ0hfU1RSQVRFR1lfVElMRV9MQVJHRSA9IDUgLy8gUHJlZmVyIHByb2Nlc3NpbmcgbGFyZ2UgcmVjdGFuZ3VsYXIgcmVnaW9ucy4KK30gcnNfZm9yX2VhY2hfc3RyYXRlZ3lfdDsKKworLyoKKyAqIHJzX2tlcm5lbF9jb250ZXh0OiBIYW5kbGUgdG8gYSBrZXJuZWwgaW52b2NhdGlvbiBjb250ZXh0CisgKgorICogVGhlIGtlcm5lbCBjb250ZXh0IGNvbnRhaW5zIGNvbW1vbiBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIGFsbG9jYXRpb25zIGJlaW5nIGl0ZXJhdGVkCisgKiBvdmVyLCBsaWtlIGRpbWVuc2lvbnMuICBJdCBhbHNvIGNvbnRhaW5zIHJhcmVseSB1c2VkIGluZGljZXMgb2YgdGhlIGN1cnJlbnRseSBwcm9jZXNzZWQKKyAqIGNlbGwsIGxpa2UgdGhlIEFycmF5MCBpbmRleCBvciB0aGUgY3VycmVudCBsZXZlbCBvZiBkZXRhaWwuCisgKgorICogWW91IGNhbiBhY2Nlc3MgdGhlIGtlcm5lbCBjb250ZXh0IGJ5IGFkZGluZyBhIHNwZWNpYWwgcGFyYW1ldGVyIG5hbWVkICJjb250ZXh0IiBvZiB0eXBlCisgKiByc19rZXJuZWxfY29udGV4dCB0byB5b3VyIGtlcm5lbCBmdW5jdGlvbi4gIFNlZSByc0dldERpbVgoKSBhbmQgcnNHZXRBcnJheTAoKSBmb3IgZXhhbXBsZXMuCisgKi8KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMykpCit0eXBlZGVmIGNvbnN0IHN0cnVjdCByc19rZXJuZWxfY29udGV4dF90ICogcnNfa2VybmVsX2NvbnRleHQ7CisjZW5kaWYKKworLyoKKyAqIHJzX3NjcmlwdF9jYWxsX3Q6IENlbGwgaXRlcmF0aW9uIGluZm9ybWF0aW9uCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBwcm92aWRlIGl0ZXJhdGlvbiBpbmZvcm1hdGlvbiB0byBhIHJzRm9yRWFjaCBjYWxsLgorICogSXQgaXMgY3VycmVudGx5IHVzZWQgdG8gcmVzdHJpY3QgcHJvY2Vzc2luZyB0byBhIHN1YnNldCBvZiBjZWxscy4gIEluIGZ1dHVyZQorICogdmVyc2lvbnMsIGl0IHdpbGwgYWxzbyBiZSB1c2VkIHRvIHByb3ZpZGUgaGludCBvbiBob3cgdG8gYmVzdCBpdGVyYXRlIG92ZXIKKyAqIHRoZSBjZWxscy4KKyAqCisgKiBUaGUgU3RhcnQgZmllbGRzIGFyZSBpbmNsdXNpdmUgYW5kIHRoZSBFbmQgZmllbGRzIGFyZSBleGNsdXNpdmUuICBFLmcuIHRvIGl0ZXJhdGUKKyAqIG92ZXIgY2VsbHMgNCwgNSwgNiwgYW5kIDcgaW4gdGhlIFggZGltZW5zaW9uLCBzZXQgeFN0YXJ0IHRvIDQgYW5kIHhFbmQgdG8gOC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcnNfc2NyaXB0X2NhbGwgeworICAgIHJzX2Zvcl9lYWNoX3N0cmF0ZWd5X3Qgc3RyYXRlZ3k7IC8vIEN1cnJlbnRseSBpZ25vcmVkLiAgSW4gdGhlIGZ1dHVyZSwgd2lsbCBiZSBzdWdnZXN0ZWQgY2VsbCBpdGVyYXRpb24gc3RyYXRlZ3kuCisgICAgdWludDMyX3QgeFN0YXJ0OyAvLyBTdGFydGluZyBpbmRleCBpbiB0aGUgWCBkaW1lbnNpb24uCisgICAgdWludDMyX3QgeEVuZDsgLy8gRW5kaW5nIGluZGV4IChleGNsdXNpdmUpIGluIHRoZSBYIGRpbWVuc2lvbi4KKyAgICB1aW50MzJfdCB5U3RhcnQ7IC8vIFN0YXJ0aW5nIGluZGV4IGluIHRoZSBZIGRpbWVuc2lvbi4KKyAgICB1aW50MzJfdCB5RW5kOyAvLyBFbmRpbmcgaW5kZXggKGV4Y2x1c2l2ZSkgaW4gdGhlIFkgZGltZW5zaW9uLgorICAgIHVpbnQzMl90IHpTdGFydDsgLy8gU3RhcnRpbmcgaW5kZXggaW4gdGhlIFogZGltZW5zaW9uLgorICAgIHVpbnQzMl90IHpFbmQ7IC8vIEVuZGluZyBpbmRleCAoZXhjbHVzaXZlKSBpbiB0aGUgWiBkaW1lbnNpb24uCisgICAgdWludDMyX3QgYXJyYXlTdGFydDsgLy8gU3RhcnRpbmcgaW5kZXggaW4gdGhlIEFycmF5MCBkaW1lbnNpb24uCisgICAgdWludDMyX3QgYXJyYXlFbmQ7IC8vIEVuZGluZyBpbmRleCAoZXhjbHVzaXZlKSBpbiB0aGUgQXJyYXkwIGRpbWVuc2lvbi4KKyAgICB1aW50MzJfdCBhcnJheTFTdGFydDsgLy8gU3RhcnRpbmcgaW5kZXggaW4gdGhlIEFycmF5MSBkaW1lbnNpb24uCisgICAgdWludDMyX3QgYXJyYXkxRW5kOyAvLyBFbmRpbmcgaW5kZXggKGV4Y2x1c2l2ZSkgaW4gdGhlIEFycmF5MSBkaW1lbnNpb24uCisgICAgdWludDMyX3QgYXJyYXkyU3RhcnQ7IC8vIFN0YXJ0aW5nIGluZGV4IGluIHRoZSBBcnJheTIgZGltZW5zaW9uLgorICAgIHVpbnQzMl90IGFycmF5MkVuZDsgLy8gRW5kaW5nIGluZGV4IChleGNsdXNpdmUpIGluIHRoZSBBcnJheTIgZGltZW5zaW9uLgorICAgIHVpbnQzMl90IGFycmF5M1N0YXJ0OyAvLyBTdGFydGluZyBpbmRleCBpbiB0aGUgQXJyYXkzIGRpbWVuc2lvbi4KKyAgICB1aW50MzJfdCBhcnJheTNFbmQ7IC8vIEVuZGluZyBpbmRleCAoZXhjbHVzaXZlKSBpbiB0aGUgQXJyYXkzIGRpbWVuc2lvbi4KK30gcnNfc2NyaXB0X2NhbGxfdDsKKworLyoKKyAqIHJzX2tlcm5lbDogSGFuZGxlIHRvIGEga2VybmVsIGZ1bmN0aW9uCisgKgorICogIEFuIG9wYXF1ZSB0eXBlIGZvciBhIGZ1bmN0aW9uIHRoYXQgaXMgZGVmaW5lZCB3aXRoIHRoZSBrZXJuZWwgYXR0cmlidXRlLiAgQSB2YWx1ZQorICogIG9mIHRoaXMgdHlwZSBjYW4gYmUgdXNlZCBpbiBhIHJzRm9yRWFjaCBjYWxsIHRvIGxhdW5jaCBhIGtlcm5lbC4KKyAqLworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3R5cGVkZWYgdm9pZCogcnNfa2VybmVsOworI2VuZGlmCisKKy8qCisgKiByc0ZvckVhY2g6IExhdW5jaGVzIGEga2VybmVsCisgKgorICogUnVucyB0aGUga2VybmVsIG92ZXIgemVybyBvciBtb3JlIGlucHV0IGFsbG9jYXRpb25zLiBUaGV5IGFyZSBwYXNzZWQgYWZ0ZXIgdGhlCisgKiByc19rZXJuZWwgYXJndW1lbnQuIElmIHRoZSBzcGVjaWZpZWQga2VybmVsIHJldHVybnMgYSB2YWx1ZSwgYW4gb3V0cHV0IGFsbG9jYXRpb24KKyAqIG11c3QgYmUgc3BlY2lmaWVkIGFzIHRoZSBsYXN0IGFyZ3VtZW50LiBBbGwgaW5wdXQgYWxsb2NhdGlvbnMsCisgKiBhbmQgdGhlIG91dHB1dCBhbGxvY2F0aW9uIGlmIGl0IGV4aXN0cywgbXVzdCBoYXZlIHRoZSBzYW1lIGRpbWVuc2lvbnMuCisgKgorICogVGhpcyBpcyBhIHN5bmNocm9ub3VzIGZ1bmN0aW9uLiBBIGNhbGwgdG8gdGhpcyBmdW5jdGlvbiBvbmx5IHJldHVybnMgYWZ0ZXIgYWxsCisgKiB0aGUgd29yayBoYXMgY29tcGxldGVkIGZvciBhbGwgY2VsbHMgb2YgdGhlIGlucHV0IGFsbG9jYXRpb25zLiBJZiB0aGUga2VybmVsCisgKiBmdW5jdGlvbiByZXR1cm5zIGFueSB2YWx1ZSwgdGhlIGNhbGwgd2FpdHMgdW50aWwgYWxsIHJlc3VsdHMgaGF2ZSBiZWVuIHdyaXR0ZW4KKyAqIHRvIHRoZSBvdXRwdXQgYWxsb2NhdGlvbi4KKyAqCisgKiBVcCB0byBBUEkgbGV2ZWwgMjMsIHRoZSBrZXJuZWwgaXMgaW1wbGljaXRseSBzcGVjaWZpZWQgYXMgdGhlIGtlcm5lbCBuYW1lZAorICogInJvb3QiIGluIHRoZSBzcGVjaWZpZWQgc2NyaXB0LCBhbmQgb25seSBhIHNpbmdsZSBpbnB1dCBhbGxvY2F0aW9uIGNhbiBiZSB1c2VkLgorICogU3RhcnRpbmcgaW4gQVBJIGxldmVsIDI0LCBhbiBhcmJpdHJhcnkga2VybmVsIGZ1bmN0aW9uIGNhbiBiZSB1c2VkLAorICogYXMgc3BlY2lmaWVkIGJ5IHRoZSBrZXJuZWwgYXJndW1lbnQuIFRoZSBzY3JpcHQgYXJndW1lbnQgaXMgcmVtb3ZlZC4KKyAqIFRoZSBrZXJuZWwgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSBjdXJyZW50IHNjcmlwdC4gSW4gYWRkaXRpb24sIG1vcmUgdGhhbiBvbmUKKyAqIGlucHV0IGNhbiBiZSB1c2VkLgorICoKKyAqIEUuZy4KKyAqIGZsb2F0IF9fYXR0cmlidXRlX18oKGtlcm5lbCkpIHNxdWFyZShmbG9hdCBhKSB7CisgKiAgIHJldHVybiBhICogYTsKKyAqIH0KKyAqCisgKiB2b2lkIGNvbXB1dGUocnNfYWxsb2NhdGlvbiBhaW4sIHJzX2FsbG9jYXRpb24gYW91dCkgeworICogICByc0ZvckVhY2goc3F1YXJlLCBhaW4sIGFvdXQpOworICogfQorICoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICBzY3JpcHQ6IFNjcmlwdCB0byBjYWxsLgorICogICBpbnB1dDogQWxsb2NhdGlvbiB0byBzb3VyY2UgZGF0YSBmcm9tLgorICogICBvdXRwdXQ6IEFsbG9jYXRpb24gdG8gd3JpdGUgZGF0ZSBpbnRvLgorICogICB1c3JEYXRhOiBVc2VyIGRlZmluZWQgZGF0YSB0byBwYXNzIHRvIHRoZSBzY3JpcHQuICBNYXkgYmUgTlVMTC4KKyAqICAgc2M6IEV4dHJhIGNvbnRyb2wgaW5mb3JtYXRpb24gdXNlZCB0byBzZWxlY3QgYSBzdWItcmVnaW9uIG9mIHRoZSBhbGxvY2F0aW9uIHRvIGJlIHByb2Nlc3NlZCBvciBzdWdnZXN0IGEgd2Fsa2luZyBzdHJhdGVneS4gIE1heSBiZSBOVUxMLgorICogICB1c3JEYXRhTGVuOiBTaXplIG9mIHRoZSB1c2VyRGF0YSBzdHJ1Y3R1cmUuICBUaGlzIHdpbGwgYmUgdXNlZCB0byBwZXJmb3JtIGEgc2hhbGxvdyBjb3B5IG9mIHRoZSBkYXRhIGlmIG5lY2Vzc2FyeS4KKyAqICAga2VybmVsOiBGdW5jdGlvbiBkZXNpZ25hdG9yIHRvIGEgZnVuY3Rpb24gdGhhdCBpcyBkZWZpbmVkIHdpdGggdGhlIGtlcm5lbCBhdHRyaWJ1dGUuCisgKiAgIC4uLjogSW5wdXQgYW5kIG91dHB1dCBhbGxvY2F0aW9ucworICovCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMTMpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRm9yRWFjaChyc19zY3JpcHQgc2NyaXB0LCByc19hbGxvY2F0aW9uIGlucHV0LCByc19hbGxvY2F0aW9uIG91dHB1dCwgY29uc3Qgdm9pZCogdXNyRGF0YSwKKyAgICAgICAgICAgICAgY29uc3QgcnNfc2NyaXB0X2NhbGxfdCogc2MpOworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAxMykKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNGb3JFYWNoKHJzX3NjcmlwdCBzY3JpcHQsIHJzX2FsbG9jYXRpb24gaW5wdXQsIHJzX2FsbG9jYXRpb24gb3V0cHV0LCBjb25zdCB2b2lkKiB1c3JEYXRhKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTQpICYmIChSU19WRVJTSU9OIDw9IDIwKSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNGb3JFYWNoKHJzX3NjcmlwdCBzY3JpcHQsIHJzX2FsbG9jYXRpb24gaW5wdXQsIHJzX2FsbG9jYXRpb24gb3V0cHV0LCBjb25zdCB2b2lkKiB1c3JEYXRhLAorICAgICAgICAgICAgICBzaXplX3QgdXNyRGF0YUxlbiwgY29uc3QgcnNfc2NyaXB0X2NhbGxfdCogc2MpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxNCkgJiYgKFJTX1ZFUlNJT04gPD0gMjApKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0ZvckVhY2gocnNfc2NyaXB0IHNjcmlwdCwgcnNfYWxsb2NhdGlvbiBpbnB1dCwgcnNfYWxsb2NhdGlvbiBvdXRwdXQsIGNvbnN0IHZvaWQqIHVzckRhdGEsCisgICAgICAgICAgICAgIHNpemVfdCB1c3JEYXRhTGVuKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTQpICYmIChSU19WRVJTSU9OIDw9IDIzKSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNGb3JFYWNoKHJzX3NjcmlwdCBzY3JpcHQsIHJzX2FsbG9jYXRpb24gaW5wdXQsIHJzX2FsbG9jYXRpb24gb3V0cHV0KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIHZvaWQKKyAgICByc0ZvckVhY2gocnNfa2VybmVsIGtlcm5lbCwgLi4uKTsKKyNlbmRpZgorCisvKgorICogcnNGb3JFYWNoV2l0aE9wdGlvbnM6IExhdW5jaGVzIGEga2VybmVsIHdpdGggb3B0aW9ucworICoKKyAqIExhdW5jaGVzIGtlcm5lbCBpbiBhIHdheSBzaW1pbGFyIHRvIHJzRm9yRWFjaC4gSG93ZXZlciwgaW5zdGVhZCBvZiBwcm9jZXNzaW5nCisgKiBhbGwgY2VsbHMgaW4gdGhlIGlucHV0LCB0aGlzIGZ1bmN0aW9uIG9ubHkgcHJvY2Vzc2VzIGNlbGxzIGluIHRoZSBzdWJzcGFjZSBvZgorICogdGhlIGluZGV4IHNwYWNlIHNwZWNpZmllZCBpbiBvcHRpb25zLiBXaXRoIHRoZSBpbmRleCBzcGFjZSBleHBsaWNpdGx5IHNwZWNpZmllZAorICogYnkgb3B0aW9ucywgbm8gaW5wdXQgb3Igb3V0cHV0IGFsbG9jYXRpb24gaXMgcmVxdWlyZWQgZm9yIGEga2VybmVsIGxhdW5jaCB1c2luZworICogdGhpcyBBUEkuIElmIGFsbG9jYXRpb25zIGFyZSBwYXNzZWQgaW4sIHRoZXkgbXVzdCBtYXRjaCB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cworICogYW5kIHJldHVybiB2YWx1ZSBleHBlY3RlZCBieSB0aGUga2VybmVsIGZ1bmN0aW9uLiBUaGUgb3V0cHV0IGFsbG9jYXRpb24gaXMKKyAqIHByZXNlbnQgaWYgYW5kIG9ubHkgaWYgdGhlIGtlcm5lbCBoYXMgYSBub24tdm9pZCByZXR1cm4gdmFsdWUuCisgKgorICogRS5nLiwKKyAqICAgIHJzX3NjcmlwdF9jYWxsX3Qgb3B0cyA9IHswfTsKKyAqICAgIG9wdHMueFN0YXJ0ID0gMDsKKyAqICAgIG9wdHMueEVuZCA9IGRpbVg7CisgKiAgICBvcHRzLnlTdGFydCA9IDA7CisgKiAgICBvcHRzLnlFbmQgPSBkaW1ZIC8gMjsKKyAqICAgIHJzRm9yRWFjaFdpdGhPcHRpb25zKGZvbywgJm9wdHMsIG91dCwgb3V0KTsKKyAqCisgKgorICogUGFyYW1ldGVyczoKKyAqICAga2VybmVsOiBGdW5jdGlvbiBkZXNpZ25hdG9yIHRvIGEgZnVuY3Rpb24gdGhhdCBpcyBkZWZpbmVkIHdpdGggdGhlIGtlcm5lbCBhdHRyaWJ1dGUuCisgKiAgIG9wdGlvbnM6IExhdW5jaCBvcHRpb25zCisgKiAgIC4uLjogSW5wdXQgYW5kIG91dHB1dCBhbGxvY2F0aW9ucworICovCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIHZvaWQKKyAgICByc0ZvckVhY2hXaXRoT3B0aW9ucyhyc19rZXJuZWwga2VybmVsLCByc19zY3JpcHRfY2FsbF90KiBvcHRpb25zLCAuLi4pOworI2VuZGlmCisKKy8qCisgKiByc0dldEFycmF5MDogSW5kZXggaW4gdGhlIEFycmF5MCBkaW1lbnNpb24gZm9yIHRoZSBzcGVjaWZpZWQga2VybmVsIGNvbnRleHQKKyAqCisgKiBSZXR1cm5zIHRoZSBpbmRleCBpbiB0aGUgQXJyYXkwIGRpbWVuc2lvbiBvZiB0aGUgY2VsbCBiZWluZyBwcm9jZXNzZWQsIGFzIHNwZWNpZmllZAorICogYnkgdGhlIHN1cHBsaWVkIGtlcm5lbCBjb250ZXh0LgorICoKKyAqIFRoZSBrZXJuZWwgY29udGV4dCBjb250YWlucyBjb21tb24gY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBhbGxvY2F0aW9ucyBiZWluZyBpdGVyYXRlZAorICogb3ZlciBhbmQgcmFyZWx5IHVzZWQgaW5kaWNlcywgbGlrZSB0aGUgQXJyYXkwIGluZGV4LgorICoKKyAqIFlvdSBjYW4gYWNjZXNzIHRoZSBrZXJuZWwgY29udGV4dCBieSBhZGRpbmcgYSBzcGVjaWFsIHBhcmFtZXRlciBuYW1lZCAiY29udGV4dCIgb2YKKyAqIHR5cGUgcnNfa2VybmVsX2NvbnRleHQgdG8geW91ciBrZXJuZWwgZnVuY3Rpb24uICBFLmcuCisgKiBzaG9ydCBSU19LRVJORUwgbXlLZXJuZWwoc2hvcnQgdmFsdWUsIHVpbnQzMl90IHgsIHJzX2tlcm5lbF9jb250ZXh0IGNvbnRleHQpIHsKKyAqICAgLy8gVGhlIGN1cnJlbnQgaW5kZXggaW4gdGhlIGNvbW1vbiB4LCB5LCB6IGRpbWVuc2lvbnMgYXJlIGFjY2Vzc2VkIGJ5CisgKiAgIC8vIGFkZGluZyB0aGVzZSB2YXJpYWJsZXMgYXMgYXJndW1lbnRzLiAgRm9yIHRoZSBtb3JlIHJhcmVseSB1c2VkIGluZGljZXMKKyAqICAgLy8gdG8gdGhlIG90aGVyIGRpbWVuc2lvbnMsIGV4dHJhY3QgdGhlbSBmcm9tIHRoZSBrZXJuZWwgY29udGV4dDoKKyAqICAgdWludDMyX3QgaW5kZXhfYTAgPSByc0dldEFycmF5MChjb250ZXh0KTsKKyAqICAgLy8uLi4KKyAqIH0KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgMCBpZiB0aGUgQXJyYXkwIGRpbWVuc2lvbiBpcyBub3QgcHJlc2VudC4KKyAqLworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIzKSkKK2V4dGVybiB1aW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0QXJyYXkwKHJzX2tlcm5lbF9jb250ZXh0IGNvbnRleHQpOworI2VuZGlmCisKKy8qCisgKiByc0dldEFycmF5MTogSW5kZXggaW4gdGhlIEFycmF5MSBkaW1lbnNpb24gZm9yIHRoZSBzcGVjaWZpZWQga2VybmVsIGNvbnRleHQKKyAqCisgKiBSZXR1cm5zIHRoZSBpbmRleCBpbiB0aGUgQXJyYXkxIGRpbWVuc2lvbiBvZiB0aGUgY2VsbCBiZWluZyBwcm9jZXNzZWQsIGFzIHNwZWNpZmllZAorICogYnkgdGhlIHN1cHBsaWVkIGtlcm5lbCBjb250ZXh0LiAgU2VlIHJzR2V0QXJyYXkwKCkgZm9yIGFuIGV4cGxhbmF0aW9uIG9mIHRoZSBjb250ZXh0LgorICoKKyAqIFJldHVybnMgMCBpZiB0aGUgQXJyYXkxIGRpbWVuc2lvbiBpcyBub3QgcHJlc2VudC4KKyAqLworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIzKSkKK2V4dGVybiB1aW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0QXJyYXkxKHJzX2tlcm5lbF9jb250ZXh0IGNvbnRleHQpOworI2VuZGlmCisKKy8qCisgKiByc0dldEFycmF5MjogSW5kZXggaW4gdGhlIEFycmF5MiBkaW1lbnNpb24gZm9yIHRoZSBzcGVjaWZpZWQga2VybmVsIGNvbnRleHQKKyAqCisgKiBSZXR1cm5zIHRoZSBpbmRleCBpbiB0aGUgQXJyYXkyIGRpbWVuc2lvbiBvZiB0aGUgY2VsbCBiZWluZyBwcm9jZXNzZWQsCisgKiBhcyBzcGVjaWZpZWQgYnkgdGhlIHN1cHBsaWVkIGtlcm5lbCBjb250ZXh0LiAgU2VlIHJzR2V0QXJyYXkwKCkgZm9yIGFuIGV4cGxhbmF0aW9uCisgKiBvZiB0aGUgY29udGV4dC4KKyAqCisgKiBSZXR1cm5zIDAgaWYgdGhlIEFycmF5MiBkaW1lbnNpb24gaXMgbm90IHByZXNlbnQuCisgKi8KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMykpCitleHRlcm4gdWludDMyX3QgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEFycmF5Mihyc19rZXJuZWxfY29udGV4dCBjb250ZXh0KTsKKyNlbmRpZgorCisvKgorICogcnNHZXRBcnJheTM6IEluZGV4IGluIHRoZSBBcnJheTMgZGltZW5zaW9uIGZvciB0aGUgc3BlY2lmaWVkIGtlcm5lbCBjb250ZXh0CisgKgorICogUmV0dXJucyB0aGUgaW5kZXggaW4gdGhlIEFycmF5MyBkaW1lbnNpb24gb2YgdGhlIGNlbGwgYmVpbmcgcHJvY2Vzc2VkLCBhcyBzcGVjaWZpZWQKKyAqIGJ5IHRoZSBzdXBwbGllZCBrZXJuZWwgY29udGV4dC4gIFNlZSByc0dldEFycmF5MCgpIGZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGUgY29udGV4dC4KKyAqCisgKiBSZXR1cm5zIDAgaWYgdGhlIEFycmF5MyBkaW1lbnNpb24gaXMgbm90IHByZXNlbnQuCisgKi8KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMykpCitleHRlcm4gdWludDMyX3QgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEFycmF5Myhyc19rZXJuZWxfY29udGV4dCBjb250ZXh0KTsKKyNlbmRpZgorCisvKgorICogcnNHZXREaW1BcnJheTA6IFNpemUgb2YgdGhlIEFycmF5MCBkaW1lbnNpb24gZm9yIHRoZSBzcGVjaWZpZWQga2VybmVsIGNvbnRleHQKKyAqCisgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBBcnJheTAgZGltZW5zaW9uIGZvciB0aGUgc3BlY2lmaWVkIGtlcm5lbCBjb250ZXh0LgorICogU2VlIHJzR2V0RGltWCgpIGZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGUgY29udGV4dC4KKyAqCisgKiBSZXR1cm5zIDAgaWYgdGhlIEFycmF5MCBkaW1lbnNpb24gaXMgbm90IHByZXNlbnQuCisgKi8KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMykpCitleHRlcm4gdWludDMyX3QgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldERpbUFycmF5MChyc19rZXJuZWxfY29udGV4dCBjb250ZXh0KTsKKyNlbmRpZgorCisvKgorICogcnNHZXREaW1BcnJheTE6IFNpemUgb2YgdGhlIEFycmF5MSBkaW1lbnNpb24gZm9yIHRoZSBzcGVjaWZpZWQga2VybmVsIGNvbnRleHQKKyAqCisgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBBcnJheTEgZGltZW5zaW9uIGZvciB0aGUgc3BlY2lmaWVkIGtlcm5lbCBjb250ZXh0LgorICogU2VlIHJzR2V0RGltWCgpIGZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGUgY29udGV4dC4KKyAqCisgKiBSZXR1cm5zIDAgaWYgdGhlIEFycmF5MSBkaW1lbnNpb24gaXMgbm90IHByZXNlbnQuCisgKi8KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMykpCitleHRlcm4gdWludDMyX3QgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldERpbUFycmF5MShyc19rZXJuZWxfY29udGV4dCBjb250ZXh0KTsKKyNlbmRpZgorCisvKgorICogcnNHZXREaW1BcnJheTI6IFNpemUgb2YgdGhlIEFycmF5MiBkaW1lbnNpb24gZm9yIHRoZSBzcGVjaWZpZWQga2VybmVsIGNvbnRleHQKKyAqCisgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBBcnJheTIgZGltZW5zaW9uIGZvciB0aGUgc3BlY2lmaWVkIGtlcm5lbCBjb250ZXh0LgorICogU2VlIHJzR2V0RGltWCgpIGZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGUgY29udGV4dC4KKyAqCisgKiBSZXR1cm5zIDAgaWYgdGhlIEFycmF5MiBkaW1lbnNpb24gaXMgbm90IHByZXNlbnQuCisgKi8KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMykpCitleHRlcm4gdWludDMyX3QgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldERpbUFycmF5Mihyc19rZXJuZWxfY29udGV4dCBjb250ZXh0KTsKKyNlbmRpZgorCisvKgorICogcnNHZXREaW1BcnJheTM6IFNpemUgb2YgdGhlIEFycmF5MyBkaW1lbnNpb24gZm9yIHRoZSBzcGVjaWZpZWQga2VybmVsIGNvbnRleHQKKyAqCisgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBBcnJheTMgZGltZW5zaW9uIGZvciB0aGUgc3BlY2lmaWVkIGtlcm5lbCBjb250ZXh0LgorICogU2VlIHJzR2V0RGltWCgpIGZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGUgY29udGV4dC4KKyAqCisgKiBSZXR1cm5zIDAgaWYgdGhlIEFycmF5MyBkaW1lbnNpb24gaXMgbm90IHByZXNlbnQuCisgKi8KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMykpCitleHRlcm4gdWludDMyX3QgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldERpbUFycmF5Myhyc19rZXJuZWxfY29udGV4dCBjb250ZXh0KTsKKyNlbmRpZgorCisvKgorICogcnNHZXREaW1IYXNGYWNlczogUHJlc2VuY2Ugb2YgbW9yZSB0aGFuIG9uZSBmYWNlIGZvciB0aGUgc3BlY2lmaWVkIGtlcm5lbCBjb250ZXh0CisgKgorICogSWYgdGhlIGtlcm5lbCBpcyBpdGVyYXRpbmcgb3ZlciBhIGN1YmVtYXAsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZXJlJ3MgbW9yZQorICogdGhhbiBvbmUgZmFjZSBwcmVzZW50LiAgSW4gYWxsIG90aGVyIGNhc2VzLCBpdCByZXR1cm5zIGZhbHNlLiAgU2VlIHJzR2V0RGltWCgpIGZvciBhbgorICogZXhwbGFuYXRpb24gb2YgdGhlIGNvbnRleHQuCisgKgorICogcnNBbGxvY2F0aW9uR2V0RGltRmFjZXMoKSBpcyBzaW1pbGFyIGJ1dCByZXR1cm5zIDAgb3IgMSBpbnN0ZWFkIG9mIGEgYm9vbC4KKyAqCisgKiBSZXR1cm5zOiBSZXR1cm5zIHRydWUgaWYgbW9yZSB0aGFuIG9uZSBmYWNlIGlzIHByZXNlbnQsIGZhbHNlIG90aGVyd2lzZS4KKyAqLworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIzKSkKK2V4dGVybiBib29sIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXREaW1IYXNGYWNlcyhyc19rZXJuZWxfY29udGV4dCBjb250ZXh0KTsKKyNlbmRpZgorCisvKgorICogcnNHZXREaW1Mb2Q6IE51bWJlciBvZiBsZXZlbHMgb2YgZGV0YWlsIGZvciB0aGUgc3BlY2lmaWVkIGtlcm5lbCBjb250ZXh0CisgKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGxldmVscyBvZiBkZXRhaWwgZm9yIHRoZSBzcGVjaWZpZWQga2VybmVsIGNvbnRleHQuICBUaGlzIGlzIHVzZWZ1bAorICogZm9yIG1pcG1hcHMuICBTZWUgcnNHZXREaW1YKCkgZm9yIGFuIGV4cGxhbmF0aW9uIG9mIHRoZSBjb250ZXh0LgorICoKKyAqIFJldHVybnMgMCBpZiBMZXZlbCBvZiBEZXRhaWwgaXMgbm90IHVzZWQuCisgKgorICogcnNBbGxvY2F0aW9uR2V0RGltTE9EKCkgaXMgc2ltaWxhciBidXQgcmV0dXJucyAwIG9yIDEgaW5zdGVhZCB0aGUgYWN0dWFsCisgKiBudW1iZXIgb2YgbGV2ZWxzLgorICovCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjMpKQorZXh0ZXJuIHVpbnQzMl90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXREaW1Mb2QocnNfa2VybmVsX2NvbnRleHQgY29udGV4dCk7CisjZW5kaWYKKworLyoKKyAqIHJzR2V0RGltWDogU2l6ZSBvZiB0aGUgWCBkaW1lbnNpb24gZm9yIHRoZSBzcGVjaWZpZWQga2VybmVsIGNvbnRleHQKKyAqCisgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBYIGRpbWVuc2lvbiBmb3IgdGhlIHNwZWNpZmllZCBrZXJuZWwgY29udGV4dC4KKyAqCisgKiBUaGUga2VybmVsIGNvbnRleHQgY29udGFpbnMgY29tbW9uIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgYWxsb2NhdGlvbnMgYmVpbmcgaXRlcmF0ZWQKKyAqIG92ZXIgYW5kIHJhcmVseSB1c2VkIGluZGljZXMsIGxpa2UgdGhlIEFycmF5MCBpbmRleC4KKyAqCisgKiBZb3UgY2FuIGFjY2VzcyBpdCBieSBhZGRpbmcgYSBzcGVjaWFsIHBhcmFtZXRlciBuYW1lZCAiY29udGV4dCIgb2YKKyAqIHR5cGUgcnNfa2VybmVsX2NvbnRleHQgdG8geW91ciBrZXJuZWwgZnVuY3Rpb24uICBFLmcuCisgKiBpbnQ0IFJTX0tFUk5FTCBteUtlcm5lbChpbnQ0IHZhbHVlLCByc19rZXJuZWxfY29udGV4dCBjb250ZXh0KSB7CisgKiAgIHVpbnQzMl90IHNpemUgPSByc0dldERpbVgoY29udGV4dCk7IC8vLi4uCisgKgorICogVG8gZ2V0IHRoZSBkaW1lbnNpb24gb2Ygc3BlY2lmaWMgYWxsb2NhdGlvbiwgdXNlIHJzQWxsb2NhdGlvbkdldERpbVgoKS4KKyAqLworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIzKSkKK2V4dGVybiB1aW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RGltWChyc19rZXJuZWxfY29udGV4dCBjb250ZXh0KTsKKyNlbmRpZgorCisvKgorICogcnNHZXREaW1ZOiBTaXplIG9mIHRoZSBZIGRpbWVuc2lvbiBmb3IgdGhlIHNwZWNpZmllZCBrZXJuZWwgY29udGV4dAorICoKKyAqIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIFggZGltZW5zaW9uIGZvciB0aGUgc3BlY2lmaWVkIGtlcm5lbCBjb250ZXh0LgorICogU2VlIHJzR2V0RGltWCgpIGZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGUgY29udGV4dC4KKyAqCisgKiBSZXR1cm5zIDAgaWYgdGhlIFkgZGltZW5zaW9uIGlzIG5vdCBwcmVzZW50LgorICoKKyAqIFRvIGdldCB0aGUgZGltZW5zaW9uIG9mIHNwZWNpZmljIGFsbG9jYXRpb24sIHVzZSByc0FsbG9jYXRpb25HZXREaW1ZKCkuCisgKi8KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMykpCitleHRlcm4gdWludDMyX3QgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldERpbVkocnNfa2VybmVsX2NvbnRleHQgY29udGV4dCk7CisjZW5kaWYKKworLyoKKyAqIHJzR2V0RGltWjogU2l6ZSBvZiB0aGUgWiBkaW1lbnNpb24gZm9yIHRoZSBzcGVjaWZpZWQga2VybmVsIGNvbnRleHQKKyAqCisgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBaIGRpbWVuc2lvbiBmb3IgdGhlIHNwZWNpZmllZCBrZXJuZWwgY29udGV4dC4KKyAqIFNlZSByc0dldERpbVgoKSBmb3IgYW4gZXhwbGFuYXRpb24gb2YgdGhlIGNvbnRleHQuCisgKgorICogUmV0dXJucyAwIGlmIHRoZSBaIGRpbWVuc2lvbiBpcyBub3QgcHJlc2VudC4KKyAqCisgKiBUbyBnZXQgdGhlIGRpbWVuc2lvbiBvZiBzcGVjaWZpYyBhbGxvY2F0aW9uLCB1c2UgcnNBbGxvY2F0aW9uR2V0RGltWigpLgorICovCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjMpKQorZXh0ZXJuIHVpbnQzMl90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXREaW1aKHJzX2tlcm5lbF9jb250ZXh0IGNvbnRleHQpOworI2VuZGlmCisKKy8qCisgKiByc0dldEZhY2U6IENvb3JkaW5hdGUgb2YgdGhlIEZhY2UgZm9yIHRoZSBzcGVjaWZpZWQga2VybmVsIGNvbnRleHQKKyAqCisgKiBSZXR1cm5zIHRoZSBmYWNlIG9uIHdoaWNoIHRoZSBjZWxsIGJlaW5nIHByb2Nlc3NlZCBpcyBmb3VuZCwgYXMgc3BlY2lmaWVkIGJ5IHRoZQorICogc3VwcGxpZWQga2VybmVsIGNvbnRleHQuICBTZWUgcnNHZXRBcnJheTAoKSBmb3IgYW4gZXhwbGFuYXRpb24gb2YgdGhlIGNvbnRleHQuCisgKgorICogUmV0dXJucyBSU19BTExPQ0FUSU9OX0NVQkVNQVBfRkFDRV9QT1NJVElWRV9YIGlmIHRoZSBmYWNlIGRpbWVuc2lvbiBpcyBub3QKKyAqIHByZXNlbnQuCisgKi8KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMykpCitleHRlcm4gcnNfYWxsb2NhdGlvbl9jdWJlbWFwX2ZhY2UgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEZhY2UocnNfa2VybmVsX2NvbnRleHQgY29udGV4dCk7CisjZW5kaWYKKworLyoKKyAqIHJzR2V0TG9kOiBJbmRleCBpbiB0aGUgTGV2ZWxzIG9mIERldGFpbCBkaW1lbnNpb24gZm9yIHRoZSBzcGVjaWZpZWQga2VybmVsIGNvbnRleHQKKyAqCisgKiBSZXR1cm5zIHRoZSBpbmRleCBpbiB0aGUgTGV2ZWxzIG9mIERldGFpbCBkaW1lbnNpb24gb2YgdGhlIGNlbGwgYmVpbmcgcHJvY2Vzc2VkLAorICogYXMgc3BlY2lmaWVkIGJ5IHRoZSBzdXBwbGllZCBrZXJuZWwgY29udGV4dC4gIFNlZSByc0dldEFycmF5MCgpIGZvciBhbiBleHBsYW5hdGlvbiBvZgorICogdGhlIGNvbnRleHQuCisgKgorICogUmV0dXJucyAwIGlmIHRoZSBMZXZlbHMgb2YgRGV0YWlsIGRpbWVuc2lvbiBpcyBub3QgcHJlc2VudC4KKyAqLworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIzKSkKK2V4dGVybiB1aW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0TG9kKHJzX2tlcm5lbF9jb250ZXh0IGNvbnRleHQpOworI2VuZGlmCisKKyNlbmRpZiAvLyBSRU5ERVJTQ1JJUFRfUlNfRk9SX0VBQ0hfUlNICmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvaW5jbHVkZS9yc19ncmFwaGljcy5yc2ggYi9yZW5kZXJzY3JpcHQvaW5jbHVkZS9yc19ncmFwaGljcy5yc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBlYzY0MAotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9pbmNsdWRlL3JzX2dyYXBoaWNzLnJzaApAQCAtMCwwICsxLDE1MjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBEb24ndCBlZGl0IHRoaXMgZmlsZSEgIEl0IGlzIGF1dG8tZ2VuZXJhdGVkIGJ5IGZyYW1ld29ya3MvcnMvYXBpL2dlbmVyYXRlLnNoLgorCisvKgorICogcnNfZ3JhcGhpY3MucnNoOiBHcmFwaGljcyBGdW5jdGlvbnMgYW5kIFR5cGVzCisgKgorICogVGhlIGdyYXBoaWNzIHN1YnN5c3RlbSBvZiBSZW5kZXJTY3JpcHQgd2FzIHJlbW92ZWQgYXQgQVBJIGxldmVsIDIzLgorICovCisKKyNpZm5kZWYgUkVOREVSU0NSSVBUX1JTX0dSQVBISUNTX1JTSAorI2RlZmluZSBSRU5ERVJTQ1JJUFRfUlNfR1JBUEhJQ1NfUlNICisKKyNpZmRlZiBfX0xQNjRfXworLy8gVE9ETyBXZSBuZWVkIHRvIGZpeCBzb21lIG9mIHRoZSBidWlsZHMgYmVmb3JlIGVuYWJsaW5nIHRoaXMgZXJyb3I6CisvLyAjZXJyb3IgIlJlbmRlclNjcmlwdCBncmFwaGljcyBpcyBkZXByZWNhdGVkIGFuZCBub3Qgc3VwcG9ydGVkIGluIDY0Yml0IG1vZGUuIgorI2VuZGlmCisKKy8vIFRPRE8gd2Ugc2VlbSB0byBhc3N1bWUgb3JkZXIgZm9yIHRoZSBvdGhlciBoZWFkZXJzIHRvby4KKyNpbmNsdWRlICJyc19vYmplY3RfdHlwZXMucnNoIgorCisvKgorICogcnNfYmxlbmRfc3JjX2Z1bmM6IEJsZW5kIHNvdXJjZSBmdW5jdGlvbgorICoKKyAqIERFUFJFQ0FURUQuICBEbyBub3QgdXNlLgorICoKKyAqLworI2lmbmRlZiBfX0xQNjRfXworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE2KSAmJiAoZGVmaW5lZChSU19ERUNMQVJFX0VYUElSRURfQVBJUykgfHwgUlNfVkVSU0lPTiA8PSAyMikpCit0eXBlZGVmIGVudW0gX19hdHRyaWJ1dGVfXygoCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZGVwcmVjYXRlZAorI2VuZGlmCispKSB7CisgICAgUlNfQkxFTkRfU1JDX1pFUk8gPSAwLAorICAgIFJTX0JMRU5EX1NSQ19PTkUgPSAxLAorICAgIFJTX0JMRU5EX1NSQ19EU1RfQ09MT1IgPSAyLAorICAgIFJTX0JMRU5EX1NSQ19PTkVfTUlOVVNfRFNUX0NPTE9SID0gMywKKyAgICBSU19CTEVORF9TUkNfU1JDX0FMUEhBID0gNCwKKyAgICBSU19CTEVORF9TUkNfT05FX01JTlVTX1NSQ19BTFBIQSA9IDUsCisgICAgUlNfQkxFTkRfU1JDX0RTVF9BTFBIQSA9IDYsCisgICAgUlNfQkxFTkRfU1JDX09ORV9NSU5VU19EU1RfQUxQSEEgPSA3LAorICAgIFJTX0JMRU5EX1NSQ19TUkNfQUxQSEFfU0FUVVJBVEUgPSA4LAorICAgIFJTX0JMRU5EX1NSQ19JTlZBTElEID0gMTAwCit9IHJzX2JsZW5kX3NyY19mdW5jOworI2VuZGlmCisjZW5kaWYKKworLyoKKyAqIHJzX2JsZW5kX2RzdF9mdW5jOiBCbGVuZCBkZXN0aW5hdGlvbiBmdW5jdGlvbgorICoKKyAqIERFUFJFQ0FURUQuICBEbyBub3QgdXNlLgorICoKKyAqLworI2lmbmRlZiBfX0xQNjRfXworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE2KSAmJiAoZGVmaW5lZChSU19ERUNMQVJFX0VYUElSRURfQVBJUykgfHwgUlNfVkVSU0lPTiA8PSAyMikpCit0eXBlZGVmIGVudW0gX19hdHRyaWJ1dGVfXygoCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZGVwcmVjYXRlZAorI2VuZGlmCispKSB7CisgICAgUlNfQkxFTkRfRFNUX1pFUk8gPSAwLAorICAgIFJTX0JMRU5EX0RTVF9PTkUgPSAxLAorICAgIFJTX0JMRU5EX0RTVF9TUkNfQ09MT1IgPSAyLAorICAgIFJTX0JMRU5EX0RTVF9PTkVfTUlOVVNfU1JDX0NPTE9SID0gMywKKyAgICBSU19CTEVORF9EU1RfU1JDX0FMUEhBID0gNCwKKyAgICBSU19CTEVORF9EU1RfT05FX01JTlVTX1NSQ19BTFBIQSA9IDUsCisgICAgUlNfQkxFTkRfRFNUX0RTVF9BTFBIQSA9IDYsCisgICAgUlNfQkxFTkRfRFNUX09ORV9NSU5VU19EU1RfQUxQSEEgPSA3LAorICAgIFJTX0JMRU5EX0RTVF9JTlZBTElEID0gMTAwCit9IHJzX2JsZW5kX2RzdF9mdW5jOworI2VuZGlmCisjZW5kaWYKKworLyoKKyAqIHJzX2N1bGxfbW9kZTogQ3VsbGluZyBtb2RlCisgKgorICogREVQUkVDQVRFRC4gIERvIG5vdCB1c2UuCisgKgorICovCisjaWZuZGVmIF9fTFA2NF9fCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTYpICYmIChkZWZpbmVkKFJTX0RFQ0xBUkVfRVhQSVJFRF9BUElTKSB8fCBSU19WRVJTSU9OIDw9IDIyKSkKK3R5cGVkZWYgZW51bSBfX2F0dHJpYnV0ZV9fKCgKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitkZXByZWNhdGVkCisjZW5kaWYKKykpIHsKKyAgICBSU19DVUxMX0JBQ0sgPSAwLAorICAgIFJTX0NVTExfRlJPTlQgPSAxLAorICAgIFJTX0NVTExfTk9ORSA9IDIsCisgICAgUlNfQ1VMTF9JTlZBTElEID0gMTAwCit9IHJzX2N1bGxfbW9kZTsKKyNlbmRpZgorI2VuZGlmCisKKy8qCisgKiByc19kZXB0aF9mdW5jOiBEZXB0aCBmdW5jdGlvbgorICoKKyAqIERFUFJFQ0FURUQuICBEbyBub3QgdXNlLgorICoKKyAqIFNwZWNpZmllcyBjb25kaXRpb25hbCBkcmF3aW5nIGRlcGVuZGluZyBvbiB0aGUgY29tcGFyaXNvbiBvZiB0aGUgaW5jb21pbmcKKyAqIGRlcHRoIHRvIHRoYXQgZm91bmQgaW4gdGhlIGRlcHRoIGJ1ZmZlci4KKyAqLworI2lmbmRlZiBfX0xQNjRfXworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE2KSAmJiAoZGVmaW5lZChSU19ERUNMQVJFX0VYUElSRURfQVBJUykgfHwgUlNfVkVSU0lPTiA8PSAyMikpCit0eXBlZGVmIGVudW0gX19hdHRyaWJ1dGVfXygoCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZGVwcmVjYXRlZAorI2VuZGlmCispKSB7CisgICAgUlNfREVQVEhfRlVOQ19BTFdBWVMgPSAwLCAvLyBBbHdheXMgZHJhd24KKyAgICBSU19ERVBUSF9GVU5DX0xFU1MgPSAxLCAvLyBEcmF3biBpZiB0aGUgaW5jb21pbmcgZGVwdGggdmFsdWUgaXMgbGVzcyB0aGFuIHRoYXQgaW4gdGhlIGRlcHRoIGJ1ZmZlcgorICAgIFJTX0RFUFRIX0ZVTkNfTEVRVUFMID0gMiwgLy8gRHJhd24gaWYgdGhlIGluY29taW5nIGRlcHRoIHZhbHVlIGlzIGxlc3Mgb3IgZXF1YWwgdG8gdGhhdCBpbiB0aGUgZGVwdGggYnVmZmVyCisgICAgUlNfREVQVEhfRlVOQ19HUkVBVEVSID0gMywgLy8gRHJhd24gaWYgdGhlIGluY29taW5nIGRlcHRoIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGF0IGluIHRoZSBkZXB0aCBidWZmZXIKKyAgICBSU19ERVBUSF9GVU5DX0dFUVVBTCA9IDQsIC8vIERyYXduIGlmIHRoZSBpbmNvbWluZyBkZXB0aCB2YWx1ZSBpcyBncmVhdGVyIG9yIGVxdWFsIHRvIHRoYXQgaW4gdGhlIGRlcHRoIGJ1ZmZlcgorICAgIFJTX0RFUFRIX0ZVTkNfRVFVQUwgPSA1LCAvLyBEcmF3biBpZiB0aGUgaW5jb21pbmcgZGVwdGggdmFsdWUgaXMgZXF1YWwgdG8gdGhhdCBpbiB0aGUgZGVwdGggYnVmZmVyCisgICAgUlNfREVQVEhfRlVOQ19OT1RFUVVBTCA9IDYsIC8vIERyYXduIGlmIHRoZSBpbmNvbWluZyBkZXB0aCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gdGhhdCBpbiB0aGUgZGVwdGggYnVmZmVyCisgICAgUlNfREVQVEhfRlVOQ19JTlZBTElEID0gMTAwIC8vIEludmFsaWQgZGVwdGggZnVuY3Rpb24KK30gcnNfZGVwdGhfZnVuYzsKKyNlbmRpZgorI2VuZGlmCisKKy8qCisgKiByc19wcmltaXRpdmU6IEhvdyB0byBpbnRlcHJldCBtZXNoIHZlcnRleCBkYXRhCisgKgorICogREVQUkVDQVRFRC4gIERvIG5vdCB1c2UuCisgKgorICogRGVzY3JpYmVzIHRoZSB3YXkgbWVzaCB2ZXJ0ZXggZGF0YSBpcyBpbnRlcnByZXRlZCB3aGVuIHJlbmRlcmluZworICovCisjaWZuZGVmIF9fTFA2NF9fCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTYpICYmIChkZWZpbmVkKFJTX0RFQ0xBUkVfRVhQSVJFRF9BUElTKSB8fCBSU19WRVJTSU9OIDw9IDIyKSkKK3R5cGVkZWYgZW51bSBfX2F0dHJpYnV0ZV9fKCgKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitkZXByZWNhdGVkCisjZW5kaWYKKykpIHsKKyAgICBSU19QUklNSVRJVkVfUE9JTlQgPSAwLCAvLyBWZXJ0ZXggZGF0YSB3aWxsIGJlIHJlbmRlcmVkIGFzIGEgc2VyaWVzIG9mIHBvaW50cworICAgIFJTX1BSSU1JVElWRV9MSU5FID0gMSwgLy8gVmVydGV4IHBhaXJzIHdpbGwgYmUgcmVuZGVyZWQgYXMgbGluZXMKKyAgICBSU19QUklNSVRJVkVfTElORV9TVFJJUCA9IDIsIC8vIFZlcnRleCBkYXRhIHdpbGwgYmUgcmVuZGVyZWQgYXMgYSBjb25uZWN0ZWQgbGluZSBzdHJpcAorICAgIFJTX1BSSU1JVElWRV9UUklBTkdMRSA9IDMsIC8vIFZlcnRpY2VzIHdpbGwgYmUgcmVuZGVyZWQgYXMgaW5kaXZpZHVhbCB0cmlhbmdsZXMKKyAgICBSU19QUklNSVRJVkVfVFJJQU5HTEVfU1RSSVAgPSA0LCAvLyBWZXJ0aWNlcyB3aWxsIGJlIHJlbmRlcmVkIGFzIGEgY29ubmVjdGVkIHRyaWFuZ2xlIHN0cmlwIGRlZmluZWQgYnkgdGhlIGZpcnN0IHRocmVlIHZlcnRpY2VzIHdpdGggZWFjaCBhZGRpdGlvbmFsIHRyaWFuZ2xlIGRlZmluZWQgYnkgYSBuZXcgdmVydGV4CisgICAgUlNfUFJJTUlUSVZFX1RSSUFOR0xFX0ZBTiA9IDUsIC8vIFZlcnRpY2VzIHdpbGwgYmUgcmVuZGVyZWQgYXMgYSBzZXF1ZW5jZSBvZiB0cmlhbmdsZXMgdGhhdCBhbGwgc2hhcmUgZmlyc3QgdmVydGV4IGFzIHRoZSBvcmlnaW4KKyAgICBSU19QUklNSVRJVkVfSU5WQUxJRCA9IDEwMCAvLyBJbnZhbGlkIHByaW1pdGl2ZQorfSByc19wcmltaXRpdmU7CisjZW5kaWYKKyNlbmRpZgorCisvKgorICogcnNfZm9udDogSGFuZGxlIHRvIGEgRm9udAorICoKKyAqIERFUFJFQ0FURUQuICBEbyBub3QgdXNlLgorICoKKyAqIE9wYXF1ZSBoYW5kbGUgdG8gYSBSZW5kZXJTY3JpcHQgZm9udCBvYmplY3QuCisgKiBTZWU6IGFuZHJvaWQucmVuZGVyc2NyaXB0LkZvbnQKKyAqLworI2lmbmRlZiBfX0xQNjRfXworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChkZWZpbmVkKFJTX0RFQ0xBUkVfRVhQSVJFRF9BUElTKSB8fCBSU19WRVJTSU9OIDw9IDIyKQordHlwZWRlZiBzdHJ1Y3QgcnNfZm9udCBfUlNfT0JKRUNUX0RFQ0wgX19hdHRyaWJ1dGVfXygoCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZGVwcmVjYXRlZAorI2VuZGlmCispKSByc19mb250OworI2VuZGlmCisjZW5kaWYKKworLyoKKyAqIHJzX21lc2g6IEhhbmRsZSB0byBhIE1lc2gKKyAqCisgKiBERVBSRUNBVEVELiAgRG8gbm90IHVzZS4KKyAqCisgKiBPcGFxdWUgaGFuZGxlIHRvIGEgUmVuZGVyU2NyaXB0IG1lc2ggb2JqZWN0LgorICogU2VlOiBhbmRyb2lkLnJlbmRlcnNjcmlwdC5NZXNoCisgKi8KKyNpZm5kZWYgX19MUDY0X18KKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoZGVmaW5lZChSU19ERUNMQVJFX0VYUElSRURfQVBJUykgfHwgUlNfVkVSU0lPTiA8PSAyMikKK3R5cGVkZWYgc3RydWN0IHJzX21lc2ggX1JTX09CSkVDVF9ERUNMIF9fYXR0cmlidXRlX18oKAorI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKK2RlcHJlY2F0ZWQKKyNlbmRpZgorKSkgcnNfbWVzaDsKKyNlbmRpZgorI2VuZGlmCisKKy8qCisgKiByc19wcm9ncmFtX2ZyYWdtZW50OiBIYW5kbGUgdG8gYSBQcm9ncmFtRnJhZ21lbnQKKyAqCisgKiBERVBSRUNBVEVELiAgRG8gbm90IHVzZS4KKyAqCisgKiBPcGFxdWUgaGFuZGxlIHRvIGEgUmVuZGVyU2NyaXB0IFByb2dyYW1GcmFnbWVudCBvYmplY3QuCisgKiBTZWU6IGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1GcmFnbWVudAorICovCisjaWZuZGVmIF9fTFA2NF9fCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKGRlZmluZWQoUlNfREVDTEFSRV9FWFBJUkVEX0FQSVMpIHx8IFJTX1ZFUlNJT04gPD0gMjIpCit0eXBlZGVmIHN0cnVjdCByc19wcm9ncmFtX2ZyYWdtZW50IF9SU19PQkpFQ1RfREVDTCBfX2F0dHJpYnV0ZV9fKCgKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitkZXByZWNhdGVkCisjZW5kaWYKKykpIHJzX3Byb2dyYW1fZnJhZ21lbnQ7CisjZW5kaWYKKyNlbmRpZgorCisvKgorICogcnNfcHJvZ3JhbV92ZXJ0ZXg6IEhhbmRsZSB0byBhIFByb2dyYW1WZXJ0ZXgKKyAqCisgKiBERVBSRUNBVEVELiAgRG8gbm90IHVzZS4KKyAqCisgKiBPcGFxdWUgaGFuZGxlIHRvIGEgUmVuZGVyU2NyaXB0IFByb2dyYW1WZXJ0ZXggb2JqZWN0LgorICogU2VlOiBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtVmVydGV4CisgKi8KKyNpZm5kZWYgX19MUDY0X18KKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoZGVmaW5lZChSU19ERUNMQVJFX0VYUElSRURfQVBJUykgfHwgUlNfVkVSU0lPTiA8PSAyMikKK3R5cGVkZWYgc3RydWN0IHJzX3Byb2dyYW1fdmVydGV4IF9SU19PQkpFQ1RfREVDTCBfX2F0dHJpYnV0ZV9fKCgKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitkZXByZWNhdGVkCisjZW5kaWYKKykpIHJzX3Byb2dyYW1fdmVydGV4OworI2VuZGlmCisjZW5kaWYKKworLyoKKyAqIHJzX3Byb2dyYW1fcmFzdGVyOiBIYW5kbGUgdG8gYSBQcm9ncmFtUmFzdGVyCisgKgorICogREVQUkVDQVRFRC4gIERvIG5vdCB1c2UuCisgKgorICogT3BhcXVlIGhhbmRsZSB0byBhIFJlbmRlclNjcmlwdCBQcm9ncmFtUmFzdGVyIG9iamVjdC4KKyAqIFNlZTogYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVJhc3RlcgorICovCisjaWZuZGVmIF9fTFA2NF9fCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKGRlZmluZWQoUlNfREVDTEFSRV9FWFBJUkVEX0FQSVMpIHx8IFJTX1ZFUlNJT04gPD0gMjIpCit0eXBlZGVmIHN0cnVjdCByc19wcm9ncmFtX3Jhc3RlciBfUlNfT0JKRUNUX0RFQ0wgX19hdHRyaWJ1dGVfXygoCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorZGVwcmVjYXRlZAorI2VuZGlmCispKSByc19wcm9ncmFtX3Jhc3RlcjsKKyNlbmRpZgorI2VuZGlmCisKKy8qCisgKiByc19wcm9ncmFtX3N0b3JlOiBIYW5kbGUgdG8gYSBQcm9ncmFtU3RvcmUKKyAqCisgKiBERVBSRUNBVEVELiAgRG8gbm90IHVzZS4KKyAqCisgKiBPcGFxdWUgaGFuZGxlIHRvIGEgUmVuZGVyU2NyaXB0IFByb2dyYW1TdG9yZSBvYmplY3QuCisgKiBTZWU6IGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZQorICovCisjaWZuZGVmIF9fTFA2NF9fCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKGRlZmluZWQoUlNfREVDTEFSRV9FWFBJUkVEX0FQSVMpIHx8IFJTX1ZFUlNJT04gPD0gMjIpCit0eXBlZGVmIHN0cnVjdCByc19wcm9ncmFtX3N0b3JlIF9SU19PQkpFQ1RfREVDTCBfX2F0dHJpYnV0ZV9fKCgKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCitkZXByZWNhdGVkCisjZW5kaWYKKykpIHJzX3Byb2dyYW1fc3RvcmU7CisjZW5kaWYKKyNlbmRpZgorCisvKgorICogcnNDbGVhck9iamVjdDogUmVsZWFzZSBhbiBvYmplY3QKKyAqCisgKiBUZWxscyB0aGUgcnVuIHRpbWUgdGhhdCB0aGlzIGhhbmRsZSB3aWxsIG5vIGxvbmdlciBiZSB1c2VkIHRvIGFjY2VzcyB0aGUgdGhlIHJlbGF0ZWQKKyAqIG9iamVjdC4gIElmIHRoaXMgd2FzIHRoZSBsYXN0IGhhbmRsZSB0byB0aGF0IG9iamVjdCwgcmVzb3VyY2UgcmVjb3ZlcnkgbWF5IGhhcHBlbi4KKyAqCisgKiBBZnRlciBjYWxsaW5nIHRoaXMgZnVuY3Rpb24sICpkc3Qgd2lsbCBiZSBzZXQgdG8gYW4gZW1wdHkgaGFuZGxlLiAgU2VlIHJzSXNPYmplY3QoKS4KKyAqLworI2lmbmRlZiBfX0xQNjRfXworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDIyKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NsZWFyT2JqZWN0KHJzX21lc2gqIGRzdCk7CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIF9fTFA2NF9fCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMjIpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ2xlYXJPYmplY3QocnNfcHJvZ3JhbV9mcmFnbWVudCogZHN0KTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgX19MUDY0X18KKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAyMikKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDbGVhck9iamVjdChyc19wcm9ncmFtX3ZlcnRleCogZHN0KTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgX19MUDY0X18KKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAyMikKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDbGVhck9iamVjdChyc19wcm9ncmFtX3Jhc3RlciogZHN0KTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgX19MUDY0X18KKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAyMikKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDbGVhck9iamVjdChyc19wcm9ncmFtX3N0b3JlKiBkc3QpOworI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBfX0xQNjRfXworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDIyKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NsZWFyT2JqZWN0KHJzX2ZvbnQqIGRzdCk7CisjZW5kaWYKKyNlbmRpZgorCisvKgorICogcnNJc09iamVjdDogQ2hlY2sgZm9yIGFuIGVtcHR5IGhhbmRsZQorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgaGFuZGxlIGNvbnRhaW5zIGEgbm9uLW51bGwgcmVmZXJlbmNlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgdmFsaWRhdGUgdGhhdCB0aGUgaW50ZXJuYWwgcG9pbnRlciB1c2VkIGluIHRoZSBoYW5kbGUKKyAqIHBvaW50cyB0byBhbiBhY3R1YWwgdmFsaWQgb2JqZWN0OyBpdCBvbmx5IGNoZWNrcyBmb3IgbnVsbC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHRoZSBFbGVtZW50IHJldHVybmVkIGJ5IHJzRWxlbWVudEdldFN1YkVsZW1lbnQoKQorICogb3Igc2VlIGlmIHJzQ2xlYXJPYmplY3QoKSBoYXMgYmVlbiBjYWxsZWQgb24gYSBoYW5kbGUuCisgKi8KKyNpZm5kZWYgX19MUDY0X18KKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAyMikKK2V4dGVybiBib29sIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNJc09iamVjdChyc19tZXNoIHYpOworI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBfX0xQNjRfXworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDIyKQorZXh0ZXJuIGJvb2wgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0lzT2JqZWN0KHJzX3Byb2dyYW1fZnJhZ21lbnQgdik7CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIF9fTFA2NF9fCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMjIpCitleHRlcm4gYm9vbCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzSXNPYmplY3QocnNfcHJvZ3JhbV92ZXJ0ZXggdik7CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIF9fTFA2NF9fCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMjIpCitleHRlcm4gYm9vbCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzSXNPYmplY3QocnNfcHJvZ3JhbV9yYXN0ZXIgdik7CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIF9fTFA2NF9fCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMjIpCitleHRlcm4gYm9vbCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzSXNPYmplY3QocnNfcHJvZ3JhbV9zdG9yZSB2KTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgX19MUDY0X18KKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAyMikKK2V4dGVybiBib29sIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNJc09iamVjdChyc19mb250IHYpOworI2VuZGlmCisjZW5kaWYKKworLyoKKyAqIHJzU2V0T2JqZWN0OiBGb3IgaW50ZXJuYWwgdXNlLgorICoKKyAqLworI2lmbmRlZiBfX0xQNjRfXworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDIyKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldE9iamVjdChyc19tZXNoKiBkc3QsIHJzX21lc2ggc3JjKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgX19MUDY0X18KKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAyMikKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRPYmplY3QocnNfcHJvZ3JhbV9mcmFnbWVudCogZHN0LCByc19wcm9ncmFtX2ZyYWdtZW50IHNyYyk7CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIF9fTFA2NF9fCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMjIpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0T2JqZWN0KHJzX3Byb2dyYW1fdmVydGV4KiBkc3QsIHJzX3Byb2dyYW1fdmVydGV4IHNyYyk7CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIF9fTFA2NF9fCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMjIpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0T2JqZWN0KHJzX3Byb2dyYW1fcmFzdGVyKiBkc3QsIHJzX3Byb2dyYW1fcmFzdGVyIHNyYyk7CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIF9fTFA2NF9fCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMjIpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0T2JqZWN0KHJzX3Byb2dyYW1fc3RvcmUqIGRzdCwgcnNfcHJvZ3JhbV9zdG9yZSBzcmMpOworI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBfX0xQNjRfXworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDIyKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldE9iamVjdChyc19mb250KiBkc3QsIHJzX2ZvbnQgc3JjKTsKKyNlbmRpZgorI2VuZGlmCisKKy8qCisgKiByc2dBbGxvY2F0aW9uU3luY0FsbDogU3luYyB0aGUgY29udGVudHMgb2YgYW4gYWxsb2NhdGlvbgorICoKKyAqIERFUFJFQ0FURUQuICBEbyBub3QgdXNlLgorICoKKyAqIFN5bmMgdGhlIGNvbnRlbnRzIG9mIGFuIGFsbG9jYXRpb24uCisgKgorICogSWYgdGhlIHNvdXJjZSBpcyBzcGVjaWZpZWQsIHN5bmMgZnJvbSBtZW1vcnkgc3BhY2Ugc3BlY2lmaWVkIGJ5IHNvdXJjZS4KKyAqCisgKiBJZiB0aGUgc291cmNlIGlzIG5vdCBzcGVjaWZpZWQsIHN5bmMgZnJvbSBpdHMgU0NSSVBUIG1lbW9yeSBzcGFjZSB0byBpdHMgSFcKKyAqIG1lbW9yeSBzcGFjZXMuCisgKi8KKyNpZm5kZWYgX19MUDY0X18KKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoZGVmaW5lZChSU19ERUNMQVJFX0VYUElSRURfQVBJUykgfHwgUlNfVkVSU0lPTiA8PSAyMikKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZQorI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKKywgZGVwcmVjYXRlZAorI2VuZGlmCispKQorICAgIHJzZ0FsbG9jYXRpb25TeW5jQWxsKHJzX2FsbG9jYXRpb24gYWxsb2MpOworI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBfX0xQNjRfXworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE0KSAmJiAoZGVmaW5lZChSU19ERUNMQVJFX0VYUElSRURfQVBJUykgfHwgUlNfVkVSU0lPTiA8PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCissIGRlcHJlY2F0ZWQKKyNlbmRpZgorKSkKKyAgICByc2dBbGxvY2F0aW9uU3luY0FsbChyc19hbGxvY2F0aW9uIGFsbG9jLCByc19hbGxvY2F0aW9uX3VzYWdlX3R5cGUgc291cmNlKTsKKyNlbmRpZgorI2VuZGlmCisKKy8qCisgKiByc2dCaW5kQ29sb3JUYXJnZXQ6IFNldCB0aGUgY29sb3IgdGFyZ2V0CisgKgorICogREVQUkVDQVRFRC4gIERvIG5vdCB1c2UuCisgKgorICogU2V0IHRoZSBjb2xvciB0YXJnZXQgdXNlZCBmb3IgYWxsIHN1YnNlcXVlbnQgcmVuZGVyaW5nIGNhbGxzCisgKi8KKyNpZm5kZWYgX19MUDY0X18KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxNCkgJiYgKGRlZmluZWQoUlNfREVDTEFSRV9FWFBJUkVEX0FQSVMpIHx8IFJTX1ZFUlNJT04gPD0gMjIpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorLCBkZXByZWNhdGVkCisjZW5kaWYKKykpCisgICAgcnNnQmluZENvbG9yVGFyZ2V0KHJzX2FsbG9jYXRpb24gY29sb3JUYXJnZXQsIHVpbnQgc2xvdCk7CisjZW5kaWYKKyNlbmRpZgorCisvKgorICogcnNnQmluZENvbnN0YW50OiBCaW5kIGEgY29uc3RhbnQgYWxsb2NhdGlvbgorICoKKyAqIERFUFJFQ0FURUQuICBEbyBub3QgdXNlLgorICoKKyAqIEJpbmQgYSBuZXcgQWxsb2NhdGlvbiBvYmplY3QgdG8gYSBQcm9ncmFtRnJhZ21lbnQgb3IgUHJvZ3JhbVZlcnRleC4KKyAqIFRoZSBBbGxvY2F0aW9uIG11c3QgYmUgYSB2YWxpZCBjb25zdGFudCBpbnB1dCBmb3IgdGhlIFByb2dyYW0uCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgcHM6IHByb2dyYW0gZnJhZ21lbnQgb2JqZWN0CisgKiAgIHNsb3Q6IGluZGV4IG9mIHRoZSBjb25zdGFudCBidWZmZXIgb24gdGhlIHByb2dyYW0KKyAqICAgYzogY29uc3RhbnRzIHRvIGJpbmQKKyAqICAgcHY6IHByb2dyYW0gdmVydGV4IG9iamVjdAorICovCisjaWZuZGVmIF9fTFA2NF9fCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKGRlZmluZWQoUlNfREVDTEFSRV9FWFBJUkVEX0FQSVMpIHx8IFJTX1ZFUlNJT04gPD0gMjIpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCissIGRlcHJlY2F0ZWQKKyNlbmRpZgorKSkKKyAgICByc2dCaW5kQ29uc3RhbnQocnNfcHJvZ3JhbV9mcmFnbWVudCBwcywgdWludCBzbG90LCByc19hbGxvY2F0aW9uIGMpOworI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBfX0xQNjRfXworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChkZWZpbmVkKFJTX0RFQ0xBUkVfRVhQSVJFRF9BUElTKSB8fCBSU19WRVJTSU9OIDw9IDIyKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorLCBkZXByZWNhdGVkCisjZW5kaWYKKykpCisgICAgcnNnQmluZENvbnN0YW50KHJzX3Byb2dyYW1fdmVydGV4IHB2LCB1aW50IHNsb3QsIHJzX2FsbG9jYXRpb24gYyk7CisjZW5kaWYKKyNlbmRpZgorCisvKgorICogcnNnQmluZERlcHRoVGFyZ2V0OiBTZXQgdGhlIGRlcHRoIHRhcmdldAorICoKKyAqIERFUFJFQ0FURUQuICBEbyBub3QgdXNlLgorICoKKyAqIFNldCB0aGUgZGVwdGggdGFyZ2V0IHVzZWQgZm9yIGFsbCBzdWJzZXF1ZW50IHJlbmRlcmluZyBjYWxscworICovCisjaWZuZGVmIF9fTFA2NF9fCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTQpICYmIChkZWZpbmVkKFJTX0RFQ0xBUkVfRVhQSVJFRF9BUElTKSB8fCBSU19WRVJTSU9OIDw9IDIyKSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZQorI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKKywgZGVwcmVjYXRlZAorI2VuZGlmCispKQorICAgIHJzZ0JpbmREZXB0aFRhcmdldChyc19hbGxvY2F0aW9uIGRlcHRoVGFyZ2V0KTsKKyNlbmRpZgorI2VuZGlmCisKKy8qCisgKiByc2dCaW5kRm9udDogQmluZCBhIGZvbnQgb2JqZWN0CisgKgorICogREVQUkVDQVRFRC4gIERvIG5vdCB1c2UuCisgKgorICogQmluZHMgdGhlIGZvbnQgb2JqZWN0IHRvIGJlIHVzZWQgZm9yIGFsbCBzdWJzZXF1ZW50IGZvbnQgcmVuZGVyaW5nIGNhbGxzCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgZm9udDogb2JqZWN0IHRvIGJpbmQKKyAqLworI2lmbmRlZiBfX0xQNjRfXworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChkZWZpbmVkKFJTX0RFQ0xBUkVfRVhQSVJFRF9BUElTKSB8fCBSU19WRVJTSU9OIDw9IDIyKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorLCBkZXByZWNhdGVkCisjZW5kaWYKKykpCisgICAgcnNnQmluZEZvbnQocnNfZm9udCBmb250KTsKKyNlbmRpZgorI2VuZGlmCisKKy8qCisgKiByc2dCaW5kUHJvZ3JhbUZyYWdtZW50OiBCaW5kIGEgUHJvZ3JhbUZyYWdtZW50CisgKgorICogREVQUkVDQVRFRC4gIERvIG5vdCB1c2UuCisgKgorICogQmluZCBhIG5ldyBQcm9ncmFtRnJhZ21lbnQgdG8gdGhlIHJlbmRlcmluZyBjb250ZXh0LgorICovCisjaWZuZGVmIF9fTFA2NF9fCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKGRlZmluZWQoUlNfREVDTEFSRV9FWFBJUkVEX0FQSVMpIHx8IFJTX1ZFUlNJT04gPD0gMjIpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCissIGRlcHJlY2F0ZWQKKyNlbmRpZgorKSkKKyAgICByc2dCaW5kUHJvZ3JhbUZyYWdtZW50KHJzX3Byb2dyYW1fZnJhZ21lbnQgcGYpOworI2VuZGlmCisjZW5kaWYKKworLyoKKyAqIHJzZ0JpbmRQcm9ncmFtUmFzdGVyOiBCaW5kIGEgUHJvZ3JhbVJhc3RlcgorICoKKyAqIERFUFJFQ0FURUQuICBEbyBub3QgdXNlLgorICoKKyAqIEJpbmQgYSBuZXcgUHJvZ3JhbVJhc3RlciB0byB0aGUgcmVuZGVyaW5nIGNvbnRleHQuCisgKi8KKyNpZm5kZWYgX19MUDY0X18KKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoZGVmaW5lZChSU19ERUNMQVJFX0VYUElSRURfQVBJUykgfHwgUlNfVkVSU0lPTiA8PSAyMikKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZQorI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKKywgZGVwcmVjYXRlZAorI2VuZGlmCispKQorICAgIHJzZ0JpbmRQcm9ncmFtUmFzdGVyKHJzX3Byb2dyYW1fcmFzdGVyIHByKTsKKyNlbmRpZgorI2VuZGlmCisKKy8qCisgKiByc2dCaW5kUHJvZ3JhbVN0b3JlOiBCaW5kIGEgUHJvZ3JhbVN0b3JlCisgKgorICogREVQUkVDQVRFRC4gIERvIG5vdCB1c2UuCisgKgorICogQmluZCBhIG5ldyBQcm9ncmFtU3RvcmUgdG8gdGhlIHJlbmRlcmluZyBjb250ZXh0LgorICovCisjaWZuZGVmIF9fTFA2NF9fCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKGRlZmluZWQoUlNfREVDTEFSRV9FWFBJUkVEX0FQSVMpIHx8IFJTX1ZFUlNJT04gPD0gMjIpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCissIGRlcHJlY2F0ZWQKKyNlbmRpZgorKSkKKyAgICByc2dCaW5kUHJvZ3JhbVN0b3JlKHJzX3Byb2dyYW1fc3RvcmUgcHMpOworI2VuZGlmCisjZW5kaWYKKworLyoKKyAqIHJzZ0JpbmRQcm9ncmFtVmVydGV4OiBCaW5kIGEgUHJvZ3JhbVZlcnRleAorICoKKyAqIERFUFJFQ0FURUQuICBEbyBub3QgdXNlLgorICoKKyAqIEJpbmQgYSBuZXcgUHJvZ3JhbVZlcnRleCB0byB0aGUgcmVuZGVyaW5nIGNvbnRleHQuCisgKi8KKyNpZm5kZWYgX19MUDY0X18KKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoZGVmaW5lZChSU19ERUNMQVJFX0VYUElSRURfQVBJUykgfHwgUlNfVkVSU0lPTiA8PSAyMikKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZQorI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKKywgZGVwcmVjYXRlZAorI2VuZGlmCispKQorICAgIHJzZ0JpbmRQcm9ncmFtVmVydGV4KHJzX3Byb2dyYW1fdmVydGV4IHB2KTsKKyNlbmRpZgorI2VuZGlmCisKKy8qCisgKiByc2dCaW5kU2FtcGxlcjogQmluZCBhIHNhbXBsZXIKKyAqCisgKiBERVBSRUNBVEVELiAgRG8gbm90IHVzZS4KKyAqCisgKiBCaW5kIGEgbmV3IFNhbXBsZXIgb2JqZWN0IHRvIGEgUHJvZ3JhbUZyYWdtZW50LiAgVGhlIHNhbXBsZXIgd2lsbAorICogb3BlcmF0ZSBvbiB0aGUgdGV4dHVyZSBib3VuZCBhdCB0aGUgbWF0Y2hpbmcgc2xvdC4KKyAqLworI2lmbmRlZiBfX0xQNjRfXworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChkZWZpbmVkKFJTX0RFQ0xBUkVfRVhQSVJFRF9BUElTKSB8fCBSU19WRVJTSU9OIDw9IDIyKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorLCBkZXByZWNhdGVkCisjZW5kaWYKKykpCisgICAgcnNnQmluZFNhbXBsZXIocnNfcHJvZ3JhbV9mcmFnbWVudCBmcmFnbWVudCwgdWludCBzbG90LCByc19zYW1wbGVyIHNhbXBsZXIpOworI2VuZGlmCisjZW5kaWYKKworLyoKKyAqIHJzZ0JpbmRUZXh0dXJlOiBCaW5kIGEgdGV4dHVyZSBhbGxvY2F0aW9uCisgKgorICogREVQUkVDQVRFRC4gIERvIG5vdCB1c2UuCisgKgorICogQmluZCBhIG5ldyBBbGxvY2F0aW9uIG9iamVjdCB0byBhIFByb2dyYW1GcmFnbWVudC4gIFRoZQorICogQWxsb2NhdGlvbiBtdXN0IGJlIGEgdmFsaWQgdGV4dHVyZSBmb3IgdGhlIFByb2dyYW0uICBUaGUgc2FtcGxpbmcKKyAqIG9mIHRoZSB0ZXh0dXJlIHdpbGwgYmUgY29udHJvbGVkIGJ5IHRoZSBTYW1wbGVyIGJvdW5kIGF0IHRoZQorICogbWF0Y2hpbmcgc2xvdC4KKyAqLworI2lmbmRlZiBfX0xQNjRfXworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChkZWZpbmVkKFJTX0RFQ0xBUkVfRVhQSVJFRF9BUElTKSB8fCBSU19WRVJTSU9OIDw9IDIyKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorLCBkZXByZWNhdGVkCisjZW5kaWYKKykpCisgICAgcnNnQmluZFRleHR1cmUocnNfcHJvZ3JhbV9mcmFnbWVudCB2LCB1aW50IHNsb3QsIHJzX2FsbG9jYXRpb24gYWxsb2MpOworI2VuZGlmCisjZW5kaWYKKworLyoKKyAqIHJzZ0NsZWFyQWxsUmVuZGVyVGFyZ2V0czogQ2xlYXIgYWxsIGNvbG9yIGFuZCBkZXB0aCB0YXJnZXRzCisgKgorICogREVQUkVDQVRFRC4gIERvIG5vdCB1c2UuCisgKgorICogQ2xlYXIgYWxsIGNvbG9yIGFuZCBkZXB0aCB0YXJnZXRzIGFuZCByZXN1bWUgcmVuZGVyaW5nIGludG8KKyAqIHRoZSBmcmFtZWJ1ZmZlcgorICovCisjaWZuZGVmIF9fTFA2NF9fCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTQpICYmIChkZWZpbmVkKFJTX0RFQ0xBUkVfRVhQSVJFRF9BUElTKSB8fCBSU19WRVJTSU9OIDw9IDIyKSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZQorI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKKywgZGVwcmVjYXRlZAorI2VuZGlmCispKQorICAgIHJzZ0NsZWFyQWxsUmVuZGVyVGFyZ2V0cyh2b2lkKTsKKyNlbmRpZgorI2VuZGlmCisKKy8qCisgKiByc2dDbGVhckNvbG9yOiBDbGVhciB0aGUgc3BlY2lmaWVkIGNvbG9yIGZyb20gdGhlIHN1cmZhY2UKKyAqCisgKiBERVBSRUNBVEVELiAgRG8gbm90IHVzZS4KKyAqCisgKiBDbGVhcnMgdGhlIHJlbmRlcmluZyBzdXJmYWNlIHRvIHRoZSBzcGVjaWZpZWQgY29sb3IuCisgKi8KKyNpZm5kZWYgX19MUDY0X18KKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoZGVmaW5lZChSU19ERUNMQVJFX0VYUElSRURfQVBJUykgfHwgUlNfVkVSU0lPTiA8PSAyMikKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZQorI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKKywgZGVwcmVjYXRlZAorI2VuZGlmCispKQorICAgIHJzZ0NsZWFyQ29sb3IoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSk7CisjZW5kaWYKKyNlbmRpZgorCisvKgorICogcnNnQ2xlYXJDb2xvclRhcmdldDogQ2xlYXIgdGhlIGNvbG9yIHRhcmdldAorICoKKyAqIERFUFJFQ0FURUQuICBEbyBub3QgdXNlLgorICoKKyAqIENsZWFyIHRoZSBwcmV2aW91c2x5IHNldCBjb2xvciB0YXJnZXQKKyAqLworI2lmbmRlZiBfX0xQNjRfXworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE0KSAmJiAoZGVmaW5lZChSU19ERUNMQVJFX0VYUElSRURfQVBJUykgfHwgUlNfVkVSU0lPTiA8PSAyMikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCissIGRlcHJlY2F0ZWQKKyNlbmRpZgorKSkKKyAgICByc2dDbGVhckNvbG9yVGFyZ2V0KHVpbnQgc2xvdCk7CisjZW5kaWYKKyNlbmRpZgorCisvKgorICogcnNnQ2xlYXJEZXB0aDogQ2xlYXIgdGhlIGRlcHRoIHN1cmZhY2UKKyAqCisgKiBERVBSRUNBVEVELiAgRG8gbm90IHVzZS4KKyAqCisgKiBDbGVhcnMgdGhlIGRlcHRoIHN1ZmFjZSB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgorICovCisjaWZuZGVmIF9fTFA2NF9fCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKGRlZmluZWQoUlNfREVDTEFSRV9FWFBJUkVEX0FQSVMpIHx8IFJTX1ZFUlNJT04gPD0gMjIpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCissIGRlcHJlY2F0ZWQKKyNlbmRpZgorKSkKKyAgICByc2dDbGVhckRlcHRoKGZsb2F0IHZhbHVlKTsKKyNlbmRpZgorI2VuZGlmCisKKy8qCisgKiByc2dDbGVhckRlcHRoVGFyZ2V0OiBDbGVhciB0aGUgZGVwdGggdGFyZ2V0CisgKgorICogREVQUkVDQVRFRC4gIERvIG5vdCB1c2UuCisgKgorICogQ2xlYXIgdGhlIHByZXZpb3VzbHkgc2V0IGRlcHRoIHRhcmdldAorICovCisjaWZuZGVmIF9fTFA2NF9fCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTQpICYmIChkZWZpbmVkKFJTX0RFQ0xBUkVfRVhQSVJFRF9BUElTKSB8fCBSU19WRVJTSU9OIDw9IDIyKSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZQorI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKKywgZGVwcmVjYXRlZAorI2VuZGlmCispKQorICAgIHJzZ0NsZWFyRGVwdGhUYXJnZXQodm9pZCk7CisjZW5kaWYKKyNlbmRpZgorCisvKgorICogcnNnRHJhd01lc2g6IERyYXcgYSBtZXNoCisgKgorICogREVQUkVDQVRFRC4gIERvIG5vdCB1c2UuCisgKgorICogRHJhdyBhIG1lc2ggdXNpbmcgdGhlIGN1cnJlbnQgY29udGV4dCBzdGF0ZS4KKyAqCisgKiBJZiBwcmltaXRpdmVJbmRleCBpcyBzcGVjaWZpZWQsIGRyYXcgcGFydCBvZiBhIG1lc2ggdXNpbmcgdGhlIGN1cnJlbnQgY29udGV4dCBzdGF0ZS4KKyAqCisgKiBJZiBzdGFydCBhbmQgbGVuIGFyZSBhbHNvIHNwZWNpZmllZCwgZHJhdyBzcGVjaWZpZWQgaW5kZXggcmFuZ2Ugb2YgcGFydCBvZiBhIG1lc2ggdXNpbmcgdGhlIGN1cnJlbnQgY29udGV4dCBzdGF0ZS4KKyAqCisgKiBPdGhlcndpc2UgdGhlIHdob2xlIG1lc2ggaXMgcmVuZGVyZWQuCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgaXNtOiBtZXNoIG9iamVjdCB0byByZW5kZXIKKyAqICAgcHJpbWl0aXZlSW5kZXg6IGZvciBtZXNoZXMgdGhhdCBjb250YWluIG11bHRpcGxlIHByaW1pdGl2ZSBncm91cHMgdGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBpbmRleCBvZiB0aGUgZ3JvdXAgdG8gZHJhdy4KKyAqICAgc3RhcnQ6IHN0YXJ0aW5nIGluZGV4IGluIHRoZSByYW5nZQorICogICBsZW46IG51bWJlciBvZiBpbmRpY2VzIHRvIGRyYXcKKyAqLworI2lmbmRlZiBfX0xQNjRfXworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChkZWZpbmVkKFJTX0RFQ0xBUkVfRVhQSVJFRF9BUElTKSB8fCBSU19WRVJTSU9OIDw9IDIyKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorLCBkZXByZWNhdGVkCisjZW5kaWYKKykpCisgICAgcnNnRHJhd01lc2gocnNfbWVzaCBpc20pOworI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBfX0xQNjRfXworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChkZWZpbmVkKFJTX0RFQ0xBUkVfRVhQSVJFRF9BUElTKSB8fCBSU19WRVJTSU9OIDw9IDIyKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorLCBkZXByZWNhdGVkCisjZW5kaWYKKykpCisgICAgcnNnRHJhd01lc2gocnNfbWVzaCBpc20sIHVpbnQgcHJpbWl0aXZlSW5kZXgpOworI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBfX0xQNjRfXworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChkZWZpbmVkKFJTX0RFQ0xBUkVfRVhQSVJFRF9BUElTKSB8fCBSU19WRVJTSU9OIDw9IDIyKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorLCBkZXByZWNhdGVkCisjZW5kaWYKKykpCisgICAgcnNnRHJhd01lc2gocnNfbWVzaCBpc20sIHVpbnQgcHJpbWl0aXZlSW5kZXgsIHVpbnQgc3RhcnQsIHVpbnQgbGVuKTsKKyNlbmRpZgorI2VuZGlmCisKKy8qCisgKiByc2dEcmF3UXVhZDogRHJhdyBhIHF1YWQKKyAqCisgKiBERVBSRUNBVEVELiAgRG8gbm90IHVzZS4KKyAqCisgKiBMb3cgcGVyZm9ybWFuY2UgdXRpbGl0eSBmdW5jdGlvbiBmb3IgZHJhd2luZyBhIHNpbXBsZSBxdWFkLiAgTm90IGludGVuZGVkIGZvcgorICogZHJhd2luZyBsYXJnZSBxdWFudGl0aWVzIG9mIGdlb21ldHJ5LgorICovCisjaWZuZGVmIF9fTFA2NF9fCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKGRlZmluZWQoUlNfREVDTEFSRV9FWFBJUkVEX0FQSVMpIHx8IFJTX1ZFUlNJT04gPD0gMjIpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCissIGRlcHJlY2F0ZWQKKyNlbmRpZgorKSkKKyAgICByc2dEcmF3UXVhZChmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLCBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHoyLCBmbG9hdCB4MywgZmxvYXQgeTMsCisgICAgICAgICAgICAgICAgZmxvYXQgejMsIGZsb2F0IHg0LCBmbG9hdCB5NCwgZmxvYXQgejQpOworI2VuZGlmCisjZW5kaWYKKworLyoKKyAqIHJzZ0RyYXdRdWFkVGV4Q29vcmRzOiBEcmF3IGEgdGV4dHVyZWQgcXVhZAorICoKKyAqIERFUFJFQ0FURUQuICBEbyBub3QgdXNlLgorICoKKyAqIExvdyBwZXJmb3JtYW5jZSB1dGlsaXR5IGZ1bmN0aW9uIGZvciBkcmF3aW5nIGEgdGV4dHVyZWQgcXVhZC4gIE5vdCBpbnRlbmRlZAorICogZm9yIGRyYXdpbmcgbGFyZ2UgcXVhbnRpdGllcyBvZiBnZW9tZXRyeS4KKyAqLworI2lmbmRlZiBfX0xQNjRfXworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChkZWZpbmVkKFJTX0RFQ0xBUkVfRVhQSVJFRF9BUElTKSB8fCBSU19WRVJTSU9OIDw9IDIyKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorLCBkZXByZWNhdGVkCisjZW5kaWYKKykpCisgICAgcnNnRHJhd1F1YWRUZXhDb29yZHMoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwgZmxvYXQgdTEsIGZsb2F0IHYxLCBmbG9hdCB4MiwgZmxvYXQgeTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgejIsIGZsb2F0IHUyLCBmbG9hdCB2MiwgZmxvYXQgeDMsIGZsb2F0IHkzLCBmbG9hdCB6MywgZmxvYXQgdTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdjMsIGZsb2F0IHg0LCBmbG9hdCB5NCwgZmxvYXQgejQsIGZsb2F0IHU0LCBmbG9hdCB2NCk7CisjZW5kaWYKKyNlbmRpZgorCisvKgorICogcnNnRHJhd1JlY3Q6IERyYXcgYSByZWN0YW5nbGUKKyAqCisgKiBERVBSRUNBVEVELiAgRG8gbm90IHVzZS4KKyAqCisgKiBMb3cgcGVyZm9ybWFuY2UgdXRpbGl0eSBmdW5jdGlvbiBmb3IgZHJhd2luZyBhIHNpbXBsZSByZWN0YW5nbGUuICBOb3QKKyAqIGludGVuZGVkIGZvciBkcmF3aW5nIGxhcmdlIHF1YW50aXRpZXMgb2YgZ2VvbWV0cnkuCisgKi8KKyNpZm5kZWYgX19MUDY0X18KKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoZGVmaW5lZChSU19ERUNMQVJFX0VYUElSRURfQVBJUykgfHwgUlNfVkVSU0lPTiA8PSAyMikKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZQorI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKKywgZGVwcmVjYXRlZAorI2VuZGlmCispKQorICAgIHJzZ0RyYXdSZWN0KGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6KTsKKyNlbmRpZgorI2VuZGlmCisKKy8qCisgKiByc2dEcmF3U3ByaXRlU2NyZWVuc3BhY2U6IERyYXcgcmVjdGFuZ2xlcyBpbiBzY3JlZW5zcGFjZQorICoKKyAqIERFUFJFQ0FURUQuICBEbyBub3QgdXNlLgorICoKKyAqIExvdyBwZXJmb3JtYW5jZSBmdW5jdGlvbiBmb3IgZHJhd2luZyByZWN0YW5nbGVzIGluIHNjcmVlbnNwYWNlLiAgVGhpcworICogZnVuY3Rpb24gdXNlcyB0aGUgZGVmYXVsdCBwYXNzdGhvdWdoIFByb2dyYW1WZXJ0ZXguICBBbnkgYm91bmQgUHJvZ3JhbVZlcnRleAorICogaXMgaWdub3JlZC4gIFRoaXMgZnVuY3Rpb24gaGFzIGNvbnNpZGVyYWJsZSBvdmVyaGVhZCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkCisgKiBmb3IgZHJhd2luZyBpbiBzaGlwcGluZyBhcHBsaWNhdGlvbnMuCisgKi8KKyNpZm5kZWYgX19MUDY0X18KKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoZGVmaW5lZChSU19ERUNMQVJFX0VYUElSRURfQVBJUykgfHwgUlNfVkVSU0lPTiA8PSAyMikKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZQorI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKKywgZGVwcmVjYXRlZAorI2VuZGlmCispKQorICAgIHJzZ0RyYXdTcHJpdGVTY3JlZW5zcGFjZShmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LCBmbG9hdCB3LCBmbG9hdCBoKTsKKyNlbmRpZgorI2VuZGlmCisKKy8qCisgKiByc2dEcmF3VGV4dDogRHJhdyBhIHRleHQgc3RyaW5nCisgKgorICogREVQUkVDQVRFRC4gIERvIG5vdCB1c2UuCisgKgorICogRHJhd3MgdGV4dCBnaXZlbiBhIHN0cmluZyBhbmQgbG9jYXRpb24KKyAqLworI2lmbmRlZiBfX0xQNjRfXworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChkZWZpbmVkKFJTX0RFQ0xBUkVfRVhQSVJFRF9BUElTKSB8fCBSU19WRVJTSU9OIDw9IDIyKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorLCBkZXByZWNhdGVkCisjZW5kaWYKKykpCisgICAgcnNnRHJhd1RleHQoY29uc3QgY2hhciogdGV4dCwgaW50IHgsIGludCB5KTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgX19MUDY0X18KKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoZGVmaW5lZChSU19ERUNMQVJFX0VYUElSRURfQVBJUykgfHwgUlNfVkVSU0lPTiA8PSAyMikKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZQorI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKKywgZGVwcmVjYXRlZAorI2VuZGlmCispKQorICAgIHJzZ0RyYXdUZXh0KHJzX2FsbG9jYXRpb24gYWxsb2MsIGludCB4LCBpbnQgeSk7CisjZW5kaWYKKyNlbmRpZgorCisvKgorICogcnNnRmluaXNoOiBFbmQgcmVuZGVyaW5nIGNvbW1hbmRzCisgKgorICogREVQUkVDQVRFRC4gIERvIG5vdCB1c2UuCisgKgorICogRm9yY2UgUmVuZGVyU2NyaXB0IHRvIGZpbmlzaCBhbGwgcmVuZGVyaW5nIGNvbW1hbmRzCisgKi8KKyNpZm5kZWYgX19MUDY0X18KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxNCkgJiYgKGRlZmluZWQoUlNfREVDTEFSRV9FWFBJUkVEX0FQSVMpIHx8IFJTX1ZFUlNJT04gPD0gMjIpKQorZXh0ZXJuIHVpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorLCBkZXByZWNhdGVkCisjZW5kaWYKKykpCisgICAgcnNnRmluaXNoKHZvaWQpOworI2VuZGlmCisjZW5kaWYKKworLyoKKyAqIHJzZ0ZvbnRDb2xvcjogU2V0IHRoZSBmb250IGNvbG9yCisgKgorICogREVQUkVDQVRFRC4gIERvIG5vdCB1c2UuCisgKgorICogU2V0cyB0aGUgZm9udCBjb2xvciBmb3IgYWxsIHN1YnNlcXVlbnQgcmVuZGVyaW5nIGNhbGxzCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgcjogcmVkIGNvbXBvbmVudAorICogICBnOiBncmVlbiBjb21wb25lbnQKKyAqICAgYjogYmx1ZSBjb21wb25lbnQKKyAqICAgYTogYWxwaGEgY29tcG9uZW50CisgKi8KKyNpZm5kZWYgX19MUDY0X18KKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoZGVmaW5lZChSU19ERUNMQVJFX0VYUElSRURfQVBJUykgfHwgUlNfVkVSU0lPTiA8PSAyMikKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZQorI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKKywgZGVwcmVjYXRlZAorI2VuZGlmCispKQorICAgIHJzZ0ZvbnRDb2xvcihmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKTsKKyNlbmRpZgorI2VuZGlmCisKKy8qCisgKiByc2dHZXRIZWlnaHQ6IEdldCB0aGUgc3VyZmFjZSBoZWlnaHQKKyAqCisgKiBERVBSRUNBVEVELiAgRG8gbm90IHVzZS4KKyAqCisgKiBHZXQgdGhlIGhlaWdodCBvZiB0aGUgY3VycmVudCByZW5kZXJpbmcgc3VyZmFjZS4KKyAqLworI2lmbmRlZiBfX0xQNjRfXworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChkZWZpbmVkKFJTX0RFQ0xBUkVfRVhQSVJFRF9BUElTKSB8fCBSU19WRVJTSU9OIDw9IDIyKQorZXh0ZXJuIHVpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorLCBkZXByZWNhdGVkCisjZW5kaWYKKykpCisgICAgcnNnR2V0SGVpZ2h0KHZvaWQpOworI2VuZGlmCisjZW5kaWYKKworLyoKKyAqIHJzZ0dldFdpZHRoOiBHZXQgdGhlIHN1cmZhY2Ugd2lkdGgKKyAqCisgKiBERVBSRUNBVEVELiAgRG8gbm90IHVzZS4KKyAqCisgKiBHZXQgdGhlIHdpZHRoIG9mIHRoZSBjdXJyZW50IHJlbmRlcmluZyBzdXJmYWNlLgorICovCisjaWZuZGVmIF9fTFA2NF9fCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKGRlZmluZWQoUlNfREVDTEFSRV9FWFBJUkVEX0FQSVMpIHx8IFJTX1ZFUlNJT04gPD0gMjIpCitleHRlcm4gdWludCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCissIGRlcHJlY2F0ZWQKKyNlbmRpZgorKSkKKyAgICByc2dHZXRXaWR0aCh2b2lkKTsKKyNlbmRpZgorI2VuZGlmCisKKy8qCisgKiByc2dNZWFzdXJlVGV4dDogR2V0IHRoZSBib3VuZGluZyBib3ggZm9yIGEgdGV4dCBzdHJpbmcKKyAqCisgKiBERVBSRUNBVEVELiAgRG8gbm90IHVzZS4KKyAqCisgKiBSZXR1cm5zIHRoZSBib3VuZGluZyBib3ggb2YgdGhlIHRleHQgcmVsYXRpdmUgdG8gKDAsIDApCisgKiBBbnkgb2YgbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tIGNvdWxkIGJlIE5VTEwKKyAqLworI2lmbmRlZiBfX0xQNjRfXworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChkZWZpbmVkKFJTX0RFQ0xBUkVfRVhQSVJFRF9BUElTKSB8fCBSU19WRVJTSU9OIDw9IDIyKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorLCBkZXByZWNhdGVkCisjZW5kaWYKKykpCisgICAgcnNnTWVhc3VyZVRleHQoY29uc3QgY2hhciogdGV4dCwgaW50KiBsZWZ0LCBpbnQqIHJpZ2h0LCBpbnQqIHRvcCwgaW50KiBib3R0b20pOworI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBfX0xQNjRfXworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChkZWZpbmVkKFJTX0RFQ0xBUkVfRVhQSVJFRF9BUElTKSB8fCBSU19WRVJTSU9OIDw9IDIyKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorLCBkZXByZWNhdGVkCisjZW5kaWYKKykpCisgICAgcnNnTWVhc3VyZVRleHQocnNfYWxsb2NhdGlvbiBhbGxvYywgaW50KiBsZWZ0LCBpbnQqIHJpZ2h0LCBpbnQqIHRvcCwgaW50KiBib3R0b20pOworI2VuZGlmCisjZW5kaWYKKworLyoKKyAqIHJzZ01lc2hDb21wdXRlQm91bmRpbmdCb3g6IENvbXB1dGUgYSBib3VuZGluZyBib3gKKyAqCisgKiBERVBSRUNBVEVELiAgRG8gbm90IHVzZS4KKyAqCisgKiBDb21wdXRlcyBhbiBheGlzIGFsaWduZWQgYm91bmRpbmcgYm94IG9mIGEgbWVzaCBvYmplY3QKKyAqLworI2lmbmRlZiBfX0xQNjRfXworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChkZWZpbmVkKFJTX0RFQ0xBUkVfRVhQSVJFRF9BUElTKSB8fCBSU19WRVJTSU9OIDw9IDIyKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorLCBkZXByZWNhdGVkCisjZW5kaWYKKykpCisgICAgcnNnTWVzaENvbXB1dGVCb3VuZGluZ0JveChyc19tZXNoIG1lc2gsIGZsb2F0KiBtaW5YLCBmbG9hdCogbWluWSwgZmxvYXQqIG1pbiwgZmxvYXQqIG1heFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogbWF4WSwgZmxvYXQqIG1heFopOworI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBfX0xQNjRfXworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChkZWZpbmVkKFJTX0RFQ0xBUkVfRVhQSVJFRF9BUElTKSB8fCBSU19WRVJTSU9OIDw9IDIyKQorc3RhdGljIGlubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZQorI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKKywgZGVwcmVjYXRlZAorI2VuZGlmCispKQorICAgIHJzZ01lc2hDb21wdXRlQm91bmRpbmdCb3gocnNfbWVzaCBtZXNoLCBmbG9hdDMqIGJCb3hNaW4sIGZsb2F0MyogYkJveE1heCkgeworICAgIGZsb2F0IHgxLCB5MSwgejEsIHgyLCB5MiwgejI7CisgICAgcnNnTWVzaENvbXB1dGVCb3VuZGluZ0JveChtZXNoLCAmeDEsICZ5MSwgJnoxLCAmeDIsICZ5MiwgJnoyKTsKKyAgICBiQm94TWluLT54ID0geDE7CisgICAgYkJveE1pbi0+eSA9IHkxOworICAgIGJCb3hNaW4tPnogPSB6MTsKKyAgICBiQm94TWF4LT54ID0geDI7CisgICAgYkJveE1heC0+eSA9IHkyOworICAgIGJCb3hNYXgtPnogPSB6MjsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qCisgKiByc2dNZXNoR2V0SW5kZXhBbGxvY2F0aW9uOiBSZXR1cm4gYW4gYWxsb2NhdGlvbiBjb250YWluaW5nIGluZGV4IGRhdGEKKyAqCisgKiBERVBSRUNBVEVELiAgRG8gbm90IHVzZS4KKyAqCisgKiBSZXR1cm5zIGFuIGFsbG9jYXRpb24gY29udGFpbmluZyBpbmRleCBkYXRhIG9yIGEgbnVsbAorICogYWxsb2NhdGlvbiBpZiBvbmx5IHRoZSBwcmltaXRpdmUgaXMgc3BlY2lmaWVkCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgbTogbWVzaCB0byBnZXQgZGF0YSBmcm9tCisgKiAgIGluZGV4OiBpbmRleCBvZiB0aGUgaW5kZXggYWxsb2NhdGlvbgorICoKKyAqIFJldHVybnM6IGFsbG9jYXRpb24gY29udGFpbmluZyBpbmRleCBkYXRhCisgKi8KKyNpZm5kZWYgX19MUDY0X18KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxNikgJiYgKGRlZmluZWQoUlNfREVDTEFSRV9FWFBJUkVEX0FQSVMpIHx8IFJTX1ZFUlNJT04gPD0gMjIpKQorZXh0ZXJuIHJzX2FsbG9jYXRpb24gX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorLCBkZXByZWNhdGVkCisjZW5kaWYKKykpCisgICAgcnNnTWVzaEdldEluZGV4QWxsb2NhdGlvbihyc19tZXNoIG0sIHVpbnQzMl90IGluZGV4KTsKKyNlbmRpZgorI2VuZGlmCisKKy8qCisgKiByc2dNZXNoR2V0UHJpbWl0aXZlOiBSZXR1cm4gdGhlIHByaW1pdGl2ZQorICoKKyAqIERFUFJFQ0FURUQuICBEbyBub3QgdXNlLgorICoKKyAqIFJldHVybnMgdGhlIHByaW1pdGl2ZSBkZXNjcmliaW5nIGhvdyBhIHBhcnQgb2YgdGhlIG1lc2ggaXMKKyAqIHJlbmRlcmVkCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgbTogbWVzaCB0byBnZXQgZGF0YSBmcm9tCisgKiAgIGluZGV4OiBpbmRleCBvZiB0aGUgcHJpbWl0aXZlCisgKgorICogUmV0dXJuczogcHJpbWl0aXZlIGRlc2NyaWJpbmcgaG93IHRoZSBtZXNoIGlzIHJlbmRlcmVkCisgKi8KKyNpZm5kZWYgX19MUDY0X18KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxNikgJiYgKGRlZmluZWQoUlNfREVDTEFSRV9FWFBJUkVEX0FQSVMpIHx8IFJTX1ZFUlNJT04gPD0gMjIpKQorZXh0ZXJuIHJzX3ByaW1pdGl2ZSBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCissIGRlcHJlY2F0ZWQKKyNlbmRpZgorKSkKKyAgICByc2dNZXNoR2V0UHJpbWl0aXZlKHJzX21lc2ggbSwgdWludDMyX3QgaW5kZXgpOworI2VuZGlmCisjZW5kaWYKKworLyoKKyAqIHJzZ01lc2hHZXRQcmltaXRpdmVDb3VudDogUmV0dXJuIHRoZSBudW1iZXIgb2YgaW5kZXggc2V0cworICoKKyAqIERFUFJFQ0FURUQuICBEbyBub3QgdXNlLgorICoKKyAqIE1lc2hlcyBjb3VsZCBoYXZlIG11bHRpcGxlIGluZGV4IHNldHMsIHRoaXMgZnVuY3Rpb24gcmV0dXJucworICogdGhlIG51bWJlci4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICBtOiBtZXNoIHRvIGdldCBkYXRhIGZyb20KKyAqCisgKiBSZXR1cm5zOiBudW1iZXIgb2YgcHJpbWl0aXZlIGdyb3VwcyBpbiB0aGUgbWVzaC4gVGhpcyB3b3VsZCBpbmNsdWRlIHNpbXBsZSBwcmltaXRpdmVzIGFzIHdlbGwgYXMgYWxsb2NhdGlvbnMgY29udGFpbmluZyBpbmRleCBkYXRhCisgKi8KKyNpZm5kZWYgX19MUDY0X18KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxNikgJiYgKGRlZmluZWQoUlNfREVDTEFSRV9FWFBJUkVEX0FQSVMpIHx8IFJTX1ZFUlNJT04gPD0gMjIpKQorZXh0ZXJuIHVpbnQzMl90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZQorI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKKywgZGVwcmVjYXRlZAorI2VuZGlmCispKQorICAgIHJzZ01lc2hHZXRQcmltaXRpdmVDb3VudChyc19tZXNoIG0pOworI2VuZGlmCisjZW5kaWYKKworLyoKKyAqIHJzZ01lc2hHZXRWZXJ0ZXhBbGxvY2F0aW9uOiBSZXR1cm4gYSB2ZXJ0ZXggYWxsb2NhdGlvbgorICoKKyAqIERFUFJFQ0FURUQuICBEbyBub3QgdXNlLgorICoKKyAqIFJldHVybnMgYW4gYWxsb2NhdGlvbiB0aGF0IGlzIHBhcnQgb2YgdGhlIG1lc2ggYW5kIGNvbnRhaW5zCisgKiB2ZXJ0ZXggZGF0YSwgZS5nLiBwb3NpdGlvbnMsIG5vcm1hbHMsIHRleGNvb3JkcworICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgIG06IG1lc2ggdG8gZ2V0IGRhdGEgZnJvbQorICogICBpbmRleDogaW5kZXggb2YgdGhlIHZlcnRleCBhbGxvY2F0aW9uCisgKgorICogUmV0dXJuczogYWxsb2NhdGlvbiBjb250YWluaW5nIHZlcnRleCBkYXRhCisgKi8KKyNpZm5kZWYgX19MUDY0X18KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxNikgJiYgKGRlZmluZWQoUlNfREVDTEFSRV9FWFBJUkVEX0FQSVMpIHx8IFJTX1ZFUlNJT04gPD0gMjIpKQorZXh0ZXJuIHJzX2FsbG9jYXRpb24gX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorLCBkZXByZWNhdGVkCisjZW5kaWYKKykpCisgICAgcnNnTWVzaEdldFZlcnRleEFsbG9jYXRpb24ocnNfbWVzaCBtLCB1aW50MzJfdCBpbmRleCk7CisjZW5kaWYKKyNlbmRpZgorCisvKgorICogcnNnTWVzaEdldFZlcnRleEFsbG9jYXRpb25Db3VudDogUmV0dXJuIHRoZSBudW1iZXIgb2YgdmVydGV4IGFsbG9jYXRpb25zCisgKgorICogREVQUkVDQVRFRC4gIERvIG5vdCB1c2UuCisgKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGFsbG9jYXRpb25zIGluIHRoZSBtZXNoIHRoYXQgY29udGFpbgorICogdmVydGV4IGRhdGEKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICBtOiBtZXNoIHRvIGdldCBkYXRhIGZyb20KKyAqCisgKiBSZXR1cm5zOiBudW1iZXIgb2YgYWxsb2NhdGlvbnMgaW4gdGhlIG1lc2ggdGhhdCBjb250YWluIHZlcnRleCBkYXRhCisgKi8KKyNpZm5kZWYgX19MUDY0X18KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxNikgJiYgKGRlZmluZWQoUlNfREVDTEFSRV9FWFBJUkVEX0FQSVMpIHx8IFJTX1ZFUlNJT04gPD0gMjIpKQorZXh0ZXJuIHVpbnQzMl90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZQorI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKKywgZGVwcmVjYXRlZAorI2VuZGlmCispKQorICAgIHJzZ01lc2hHZXRWZXJ0ZXhBbGxvY2F0aW9uQ291bnQocnNfbWVzaCBtKTsKKyNlbmRpZgorI2VuZGlmCisKKy8qCisgKiByc2dQcm9ncmFtRnJhZ21lbnRDb25zdGFudENvbG9yOiBTZXQgdGhlIGNvbnN0YW50IGNvbG9yIGZvciBhIGZpeGVkIGZ1bmN0aW9uIGVtdWxhdGlvbiBwcm9ncmFtCisgKgorICogREVQUkVDQVRFRC4gIERvIG5vdCB1c2UuCisgKgorICogU2V0IHRoZSBjb25zdGFudCBjb2xvciBmb3IgYSBmaXhlZCBmdW5jdGlvbiBlbXVsYXRpb24gcHJvZ3JhbS4KKyAqLworI2lmbmRlZiBfX0xQNjRfXworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChkZWZpbmVkKFJTX0RFQ0xBUkVfRVhQSVJFRF9BUElTKSB8fCBSU19WRVJTSU9OIDw9IDIyKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorLCBkZXByZWNhdGVkCisjZW5kaWYKKykpCisgICAgcnNnUHJvZ3JhbUZyYWdtZW50Q29uc3RhbnRDb2xvcihyc19wcm9ncmFtX2ZyYWdtZW50IHBmLCBmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKTsKKyNlbmRpZgorI2VuZGlmCisKKy8qCisgKiByc2dQcm9ncmFtVmVydGV4R2V0UHJvamVjdGlvbk1hdHJpeDogR2V0IHRoZSBwcm9qZWN0aW9uIG1hdHJpeCBmb3IgYSBmaXhlZCBmdW5jdGlvbiB2ZXJ0ZXggcHJvZ3JhbQorICoKKyAqIERFUFJFQ0FURUQuICBEbyBub3QgdXNlLgorICoKKyAqIEdldCB0aGUgcHJvamVjdGlvbiBtYXRyaXggZm9yIGEgY3VycmVudGx5IGJvdW5kIGZpeGVkIGZ1bmN0aW9uCisgKiB2ZXJ0ZXggcHJvZ3JhbS4gQ2FsbGluZyB0aGlzIGZ1bmN0aW9uIHdpdGggYSBjdXN0b20gdmVydGV4IHNoYWRlcgorICogd291bGQgcmVzdWx0IGluIGFuIGVycm9yLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgIHByb2o6IG1hdHJpeCB0byBzdG9yZSB0aGUgY3VycmVudCBwcm9qZWN0aW9uIG1hdHJpeCBpbnRvCisgKi8KKyNpZm5kZWYgX19MUDY0X18KKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoZGVmaW5lZChSU19ERUNMQVJFX0VYUElSRURfQVBJUykgfHwgUlNfVkVSU0lPTiA8PSAyMikKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZQorI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKKywgZGVwcmVjYXRlZAorI2VuZGlmCispKQorICAgIHJzZ1Byb2dyYW1WZXJ0ZXhHZXRQcm9qZWN0aW9uTWF0cml4KHJzX21hdHJpeDR4NCogcHJvaik7CisjZW5kaWYKKyNlbmRpZgorCisvKgorICogcnNnUHJvZ3JhbVZlcnRleExvYWRNb2RlbE1hdHJpeDogTG9hZCB0aGUgbW9kZWwgbWF0cml4IGZvciBhIGJvdW5kIGZpeGVkIGZ1bmN0aW9uIHZlcnRleCBwcm9ncmFtCisgKgorICogREVQUkVDQVRFRC4gIERvIG5vdCB1c2UuCisgKgorICogTG9hZCB0aGUgbW9kZWwgbWF0cml4IGZvciBhIGN1cnJlbnRseSBib3VuZCBmaXhlZCBmdW5jdGlvbgorICogdmVydGV4IHByb2dyYW0uIENhbGxpbmcgdGhpcyBmdW5jdGlvbiB3aXRoIGEgY3VzdG9tIHZlcnRleCBzaGFkZXIKKyAqIHdvdWxkIHJlc3VsdCBpbiBhbiBlcnJvci4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICBtb2RlbDogbW9kZWwgbWF0cml4CisgKi8KKyNpZm5kZWYgX19MUDY0X18KKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoZGVmaW5lZChSU19ERUNMQVJFX0VYUElSRURfQVBJUykgfHwgUlNfVkVSU0lPTiA8PSAyMikKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZQorI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKKywgZGVwcmVjYXRlZAorI2VuZGlmCispKQorICAgIHJzZ1Byb2dyYW1WZXJ0ZXhMb2FkTW9kZWxNYXRyaXgoY29uc3QgcnNfbWF0cml4NHg0KiBtb2RlbCk7CisjZW5kaWYKKyNlbmRpZgorCisvKgorICogcnNnUHJvZ3JhbVZlcnRleExvYWRQcm9qZWN0aW9uTWF0cml4OiBMb2FkIHRoZSBwcm9qZWN0aW9uIG1hdHJpeCBmb3IgYSBib3VuZCBmaXhlZCBmdW5jdGlvbiB2ZXJ0ZXggcHJvZ3JhbQorICoKKyAqIERFUFJFQ0FURUQuICBEbyBub3QgdXNlLgorICoKKyAqIExvYWQgdGhlIHByb2plY3Rpb24gbWF0cml4IGZvciBhIGN1cnJlbnRseSBib3VuZCBmaXhlZCBmdW5jdGlvbgorICogdmVydGV4IHByb2dyYW0uIENhbGxpbmcgdGhpcyBmdW5jdGlvbiB3aXRoIGEgY3VzdG9tIHZlcnRleCBzaGFkZXIKKyAqIHdvdWxkIHJlc3VsdCBpbiBhbiBlcnJvci4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICBwcm9qOiBwcm9qZWN0aW9uIG1hdHJpeAorICovCisjaWZuZGVmIF9fTFA2NF9fCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKGRlZmluZWQoUlNfREVDTEFSRV9FWFBJUkVEX0FQSVMpIHx8IFJTX1ZFUlNJT04gPD0gMjIpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCissIGRlcHJlY2F0ZWQKKyNlbmRpZgorKSkKKyAgICByc2dQcm9ncmFtVmVydGV4TG9hZFByb2plY3Rpb25NYXRyaXgoY29uc3QgcnNfbWF0cml4NHg0KiBwcm9qKTsKKyNlbmRpZgorI2VuZGlmCisKKy8qCisgKiByc2dQcm9ncmFtVmVydGV4TG9hZFRleHR1cmVNYXRyaXg6IExvYWQgdGhlIHRleHR1cmUgbWF0cml4IGZvciBhIGJvdW5kIGZpeGVkIGZ1bmN0aW9uIHZlcnRleCBwcm9ncmFtCisgKgorICogREVQUkVDQVRFRC4gIERvIG5vdCB1c2UuCisgKgorICogTG9hZCB0aGUgdGV4dHVyZSBtYXRyaXggZm9yIGEgY3VycmVudGx5IGJvdW5kIGZpeGVkIGZ1bmN0aW9uCisgKiB2ZXJ0ZXggcHJvZ3JhbS4gQ2FsbGluZyB0aGlzIGZ1bmN0aW9uIHdpdGggYSBjdXN0b20gdmVydGV4IHNoYWRlcgorICogd291bGQgcmVzdWx0IGluIGFuIGVycm9yLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgIHRleDogdGV4dHVyZSBtYXRyaXgKKyAqLworI2lmbmRlZiBfX0xQNjRfXworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChkZWZpbmVkKFJTX0RFQ0xBUkVfRVhQSVJFRF9BUElTKSB8fCBSU19WRVJTSU9OIDw9IDIyKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorLCBkZXByZWNhdGVkCisjZW5kaWYKKykpCisgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRUZXh0dXJlTWF0cml4KGNvbnN0IHJzX21hdHJpeDR4NCogdGV4KTsKKyNlbmRpZgorI2VuZGlmCisKKy8qCisgKiByc2dQcm9ncmFtUmFzdGVyR2V0Q3VsbE1vZGU6IEdldCBwcm9ncmFtIHJhc3RlciBjdWxsIG1vZGUKKyAqCisgKiBERVBSRUNBVEVELiAgRG8gbm90IHVzZS4KKyAqCisgKiBHZXQgcHJvZ3JhbSByYXN0ZXIgY3VsbCBtb2RlCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgcHI6IHByb2dyYW0gcmFzdGVyIHRvIHF1ZXJ5CisgKi8KKyNpZm5kZWYgX19MUDY0X18KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxNikgJiYgKGRlZmluZWQoUlNfREVDTEFSRV9FWFBJUkVEX0FQSVMpIHx8IFJTX1ZFUlNJT04gPD0gMjIpKQorZXh0ZXJuIHJzX2N1bGxfbW9kZSBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCissIGRlcHJlY2F0ZWQKKyNlbmRpZgorKSkKKyAgICByc2dQcm9ncmFtUmFzdGVyR2V0Q3VsbE1vZGUocnNfcHJvZ3JhbV9yYXN0ZXIgcHIpOworI2VuZGlmCisjZW5kaWYKKworLyoKKyAqIHJzZ1Byb2dyYW1SYXN0ZXJJc1BvaW50U3ByaXRlRW5hYmxlZDogR2V0IHByb2dyYW0gcmFzdGVyIHBvaW50IHNwcml0ZSBzdGF0ZQorICoKKyAqIERFUFJFQ0FURUQuICBEbyBub3QgdXNlLgorICoKKyAqIEdldCBwcm9ncmFtIHJhc3RlciBwb2ludCBzcHJpdGUgc3RhdGUKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICBwcjogcHJvZ3JhbSByYXN0ZXIgdG8gcXVlcnkKKyAqLworI2lmbmRlZiBfX0xQNjRfXworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE2KSAmJiAoZGVmaW5lZChSU19ERUNMQVJFX0VYUElSRURfQVBJUykgfHwgUlNfVkVSU0lPTiA8PSAyMikpCitleHRlcm4gYm9vbCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCissIGRlcHJlY2F0ZWQKKyNlbmRpZgorKSkKKyAgICByc2dQcm9ncmFtUmFzdGVySXNQb2ludFNwcml0ZUVuYWJsZWQocnNfcHJvZ3JhbV9yYXN0ZXIgcHIpOworI2VuZGlmCisjZW5kaWYKKworLyoKKyAqIHJzZ1Byb2dyYW1TdG9yZUdldEJsZW5kRHN0RnVuYzogR2V0IHByb2dyYW0gc3RvcmUgYmxlbmQgZGVzdGluYXRpb24gZnVuY3Rpb24KKyAqCisgKiBERVBSRUNBVEVELiAgRG8gbm90IHVzZS4KKyAqCisgKiBHZXQgcHJvZ3JhbSBzdG9yZSBibGVuZCBkZXN0aW5hdGlvbiBmdW5jdGlvbgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgIHBzOiBwcm9ncmFtIHN0b3JlIHRvIHF1ZXJ5CisgKi8KKyNpZm5kZWYgX19MUDY0X18KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxNikgJiYgKGRlZmluZWQoUlNfREVDTEFSRV9FWFBJUkVEX0FQSVMpIHx8IFJTX1ZFUlNJT04gPD0gMjIpKQorZXh0ZXJuIHJzX2JsZW5kX2RzdF9mdW5jIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZQorI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKKywgZGVwcmVjYXRlZAorI2VuZGlmCispKQorICAgIHJzZ1Byb2dyYW1TdG9yZUdldEJsZW5kRHN0RnVuYyhyc19wcm9ncmFtX3N0b3JlIHBzKTsKKyNlbmRpZgorI2VuZGlmCisKKy8qCisgKiByc2dQcm9ncmFtU3RvcmVHZXRCbGVuZFNyY0Z1bmM6IEdldCBwcm9ncmFtIHN0b3JlIGJsZW5kIHNvdXJjZSBmdW5jdGlvbgorICoKKyAqIERFUFJFQ0FURUQuICBEbyBub3QgdXNlLgorICoKKyAqIEdldCBwcm9ncmFtIHN0b3JlIGJsZW5kIHNvdXJjZSBmdW5jdGlvbgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgIHBzOiBwcm9ncmFtIHN0b3JlIHRvIHF1ZXJ5CisgKi8KKyNpZm5kZWYgX19MUDY0X18KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxNikgJiYgKGRlZmluZWQoUlNfREVDTEFSRV9FWFBJUkVEX0FQSVMpIHx8IFJTX1ZFUlNJT04gPD0gMjIpKQorZXh0ZXJuIHJzX2JsZW5kX3NyY19mdW5jIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZQorI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKKywgZGVwcmVjYXRlZAorI2VuZGlmCispKQorICAgIHJzZ1Byb2dyYW1TdG9yZUdldEJsZW5kU3JjRnVuYyhyc19wcm9ncmFtX3N0b3JlIHBzKTsKKyNlbmRpZgorI2VuZGlmCisKKy8qCisgKiByc2dQcm9ncmFtU3RvcmVHZXREZXB0aEZ1bmM6IEdldCBwcm9ncmFtIHN0b3JlIGRlcHRoIGZ1bmN0aW9uCisgKgorICogREVQUkVDQVRFRC4gIERvIG5vdCB1c2UuCisgKgorICogR2V0IHByb2dyYW0gc3RvcmUgZGVwdGggZnVuY3Rpb24KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICBwczogcHJvZ3JhbSBzdG9yZSB0byBxdWVyeQorICovCisjaWZuZGVmIF9fTFA2NF9fCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTYpICYmIChkZWZpbmVkKFJTX0RFQ0xBUkVfRVhQSVJFRF9BUElTKSB8fCBSU19WRVJTSU9OIDw9IDIyKSkKK2V4dGVybiByc19kZXB0aF9mdW5jIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZQorI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKKywgZGVwcmVjYXRlZAorI2VuZGlmCispKQorICAgIHJzZ1Byb2dyYW1TdG9yZUdldERlcHRoRnVuYyhyc19wcm9ncmFtX3N0b3JlIHBzKTsKKyNlbmRpZgorI2VuZGlmCisKKy8qCisgKiByc2dQcm9ncmFtU3RvcmVJc0NvbG9yTWFza0FscGhhRW5hYmxlZDogR2V0IHByb2dyYW0gc3RvcmUgYWxwaGEgY29tcG9uZW50IGNvbG9yIG1hc2sKKyAqCisgKiBERVBSRUNBVEVELiAgRG8gbm90IHVzZS4KKyAqCisgKiBHZXQgcHJvZ3JhbSBzdG9yZSBhbHBoYSBjb21wb25lbnQgY29sb3IgbWFzaworICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgIHBzOiBwcm9ncmFtIHN0b3JlIHRvIHF1ZXJ5CisgKi8KKyNpZm5kZWYgX19MUDY0X18KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxNikgJiYgKGRlZmluZWQoUlNfREVDTEFSRV9FWFBJUkVEX0FQSVMpIHx8IFJTX1ZFUlNJT04gPD0gMjIpKQorZXh0ZXJuIGJvb2wgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorLCBkZXByZWNhdGVkCisjZW5kaWYKKykpCisgICAgcnNnUHJvZ3JhbVN0b3JlSXNDb2xvck1hc2tBbHBoYUVuYWJsZWQocnNfcHJvZ3JhbV9zdG9yZSBwcyk7CisjZW5kaWYKKyNlbmRpZgorCisvKgorICogcnNnUHJvZ3JhbVN0b3JlSXNDb2xvck1hc2tCbHVlRW5hYmxlZDogR2V0IHByb2dyYW0gc3RvcmUgYmx1ciBjb21wb25lbnQgY29sb3IgbWFzaworICoKKyAqIERFUFJFQ0FURUQuICBEbyBub3QgdXNlLgorICoKKyAqIEdldCBwcm9ncmFtIHN0b3JlIGJsdXIgY29tcG9uZW50IGNvbG9yIG1hc2sKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICBwczogcHJvZ3JhbSBzdG9yZSB0byBxdWVyeQorICovCisjaWZuZGVmIF9fTFA2NF9fCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTYpICYmIChkZWZpbmVkKFJTX0RFQ0xBUkVfRVhQSVJFRF9BUElTKSB8fCBSU19WRVJTSU9OIDw9IDIyKSkKK2V4dGVybiBib29sIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZQorI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKKywgZGVwcmVjYXRlZAorI2VuZGlmCispKQorICAgIHJzZ1Byb2dyYW1TdG9yZUlzQ29sb3JNYXNrQmx1ZUVuYWJsZWQocnNfcHJvZ3JhbV9zdG9yZSBwcyk7CisjZW5kaWYKKyNlbmRpZgorCisvKgorICogcnNnUHJvZ3JhbVN0b3JlSXNDb2xvck1hc2tHcmVlbkVuYWJsZWQ6IEdldCBwcm9ncmFtIHN0b3JlIGdyZWVuIGNvbXBvbmVudCBjb2xvciBtYXNrCisgKgorICogREVQUkVDQVRFRC4gIERvIG5vdCB1c2UuCisgKgorICogR2V0IHByb2dyYW0gc3RvcmUgZ3JlZW4gY29tcG9uZW50IGNvbG9yIG1hc2sKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICBwczogcHJvZ3JhbSBzdG9yZSB0byBxdWVyeQorICovCisjaWZuZGVmIF9fTFA2NF9fCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTYpICYmIChkZWZpbmVkKFJTX0RFQ0xBUkVfRVhQSVJFRF9BUElTKSB8fCBSU19WRVJTSU9OIDw9IDIyKSkKK2V4dGVybiBib29sIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZQorI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKKywgZGVwcmVjYXRlZAorI2VuZGlmCispKQorICAgIHJzZ1Byb2dyYW1TdG9yZUlzQ29sb3JNYXNrR3JlZW5FbmFibGVkKHJzX3Byb2dyYW1fc3RvcmUgcHMpOworI2VuZGlmCisjZW5kaWYKKworLyoKKyAqIHJzZ1Byb2dyYW1TdG9yZUlzQ29sb3JNYXNrUmVkRW5hYmxlZDogR2V0IHByb2dyYW0gc3RvcmUgcmVkIGNvbXBvbmVudCBjb2xvciBtYXNrCisgKgorICogREVQUkVDQVRFRC4gIERvIG5vdCB1c2UuCisgKgorICogR2V0IHByb2dyYW0gc3RvcmUgcmVkIGNvbXBvbmVudCBjb2xvciBtYXNrCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgcHM6IHByb2dyYW0gc3RvcmUgdG8gcXVlcnkKKyAqLworI2lmbmRlZiBfX0xQNjRfXworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE2KSAmJiAoZGVmaW5lZChSU19ERUNMQVJFX0VYUElSRURfQVBJUykgfHwgUlNfVkVSU0lPTiA8PSAyMikpCitleHRlcm4gYm9vbCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCissIGRlcHJlY2F0ZWQKKyNlbmRpZgorKSkKKyAgICByc2dQcm9ncmFtU3RvcmVJc0NvbG9yTWFza1JlZEVuYWJsZWQocnNfcHJvZ3JhbV9zdG9yZSBwcyk7CisjZW5kaWYKKyNlbmRpZgorCisvKgorICogcnNnUHJvZ3JhbVN0b3JlSXNEZXB0aE1hc2tFbmFibGVkOiBHZXQgcHJvZ3JhbSBzdG9yZSBkZXB0aCBtYXNrCisgKgorICogREVQUkVDQVRFRC4gIERvIG5vdCB1c2UuCisgKgorICogR2V0IHByb2dyYW0gc3RvcmUgZGVwdGggbWFzaworICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgIHBzOiBwcm9ncmFtIHN0b3JlIHRvIHF1ZXJ5CisgKi8KKyNpZm5kZWYgX19MUDY0X18KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxNikgJiYgKGRlZmluZWQoUlNfREVDTEFSRV9FWFBJUkVEX0FQSVMpIHx8IFJTX1ZFUlNJT04gPD0gMjIpKQorZXh0ZXJuIGJvb2wgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorLCBkZXByZWNhdGVkCisjZW5kaWYKKykpCisgICAgcnNnUHJvZ3JhbVN0b3JlSXNEZXB0aE1hc2tFbmFibGVkKHJzX3Byb2dyYW1fc3RvcmUgcHMpOworI2VuZGlmCisjZW5kaWYKKworLyoKKyAqIHJzZ1Byb2dyYW1TdG9yZUlzRGl0aGVyRW5hYmxlZDogR2V0IHByb2dyYW0gc3RvcmUgZGl0aGVyIHN0YXRlCisgKgorICogREVQUkVDQVRFRC4gIERvIG5vdCB1c2UuCisgKgorICogR2V0IHByb2dyYW0gc3RvcmUgZGl0aGVyIHN0YXRlCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgcHM6IHByb2dyYW0gc3RvcmUgdG8gcXVlcnkKKyAqLworI2lmbmRlZiBfX0xQNjRfXworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE2KSAmJiAoZGVmaW5lZChSU19ERUNMQVJFX0VYUElSRURfQVBJUykgfHwgUlNfVkVSU0lPTiA8PSAyMikpCitleHRlcm4gYm9vbCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCissIGRlcHJlY2F0ZWQKKyNlbmRpZgorKSkKKyAgICByc2dQcm9ncmFtU3RvcmVJc0RpdGhlckVuYWJsZWQocnNfcHJvZ3JhbV9zdG9yZSBwcyk7CisjZW5kaWYKKyNlbmRpZgorCisjZW5kaWYgLy8gUkVOREVSU0NSSVBUX1JTX0dSQVBISUNTX1JTSApkaWZmIC0tZ2l0IGEvcmVuZGVyc2NyaXB0L2luY2x1ZGUvcnNfaW8ucnNoIGIvcmVuZGVyc2NyaXB0L2luY2x1ZGUvcnNfaW8ucnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZmJlNGIKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvaW5jbHVkZS9yc19pby5yc2gKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBEb24ndCBlZGl0IHRoaXMgZmlsZSEgIEl0IGlzIGF1dG8tZ2VuZXJhdGVkIGJ5IGZyYW1ld29ya3MvcnMvYXBpL2dlbmVyYXRlLnNoLgorCisvKgorICogcnNfaW8ucnNoOiBJbnB1dC9PdXRwdXQgRnVuY3Rpb25zCisgKgorICogVGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VkIHRvOgorICogLSBTZW5kIGluZm9ybWF0aW9uIHRvIHRoZSBKYXZhIGNsaWVudCwgYW5kCisgKiAtIFNlbmQgdGhlIHByb2Nlc3NlZCBhbGxvY2F0aW9uIG9yIHJlY2VpdmUgdGhlIG5leHQgYWxsb2NhdGlvbiB0byBwcm9jZXNzLgorICovCisKKyNpZm5kZWYgUkVOREVSU0NSSVBUX1JTX0lPX1JTSAorI2RlZmluZSBSRU5ERVJTQ1JJUFRfUlNfSU9fUlNICisKKy8qCisgKiByc0FsbG9jYXRpb25Jb1JlY2VpdmU6IFJlY2VpdmUgbmV3IGNvbnRlbnQgZnJvbSB0aGUgcXVldWUKKyAqCisgKiBSZWNlaXZlIGEgbmV3IHNldCBvZiBjb250ZW50cyBmcm9tIHRoZSBxdWV1ZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgY2FsbGVkIGZyb20gaW5zaWRlIGEga2VybmVsLCBvciBmcm9tIGFueSBmdW5jdGlvbgorICogdGhhdCBtYXkgYmUgY2FsbGVkIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgZnJvbSBhIGtlcm5lbC4gRG9pbmcgc28gd291bGQgY2F1c2UgYQorICogcnVudGltZSBlcnJvci4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICBhOiBBbGxvY2F0aW9uIHRvIHdvcmsgb24uCisgKi8KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxNikpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvbklvUmVjZWl2ZShyc19hbGxvY2F0aW9uIGEpOworI2VuZGlmCisKKy8qCisgKiByc0FsbG9jYXRpb25Jb1NlbmQ6IFNlbmQgbmV3IGNvbnRlbnQgdG8gdGhlIHF1ZXVlCisgKgorICogU2VuZCB0aGUgY29udGVudHMgb2YgdGhlIEFsbG9jYXRpb24gdG8gdGhlIHF1ZXVlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBjYWxsZWQgZnJvbSBpbnNpZGUgYSBrZXJuZWwsIG9yIGZyb20gYW55IGZ1bmN0aW9uCisgKiB0aGF0IG1heSBiZSBjYWxsZWQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBmcm9tIGEga2VybmVsLiBEb2luZyBzbyB3b3VsZCBjYXVzZSBhCisgKiBydW50aW1lIGVycm9yLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgIGE6IEFsbG9jYXRpb24gdG8gd29yayBvbi4KKyAqLworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE2KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uSW9TZW5kKHJzX2FsbG9jYXRpb24gYSk7CisjZW5kaWYKKworLyoKKyAqIHJzU2VuZFRvQ2xpZW50OiBTZW5kIGEgbWVzc2FnZSB0byB0aGUgY2xpZW50LCBub24tYmxvY2tpbmcKKyAqCisgKiBTZW5kcyBhIG1lc3NhZ2UgYmFjayB0byB0aGUgY2xpZW50LiAgVGhpcyBjYWxsIGRvZXMgbm90IGJsb2NrLgorICogSXQgcmV0dXJucyB0cnVlIGlmIHRoZSBtZXNzYWdlIHdhcyBzZW50IGFuZCBmYWxzZSBpZiB0aGUKKyAqIG1lc3NhZ2UgcXVldWUgaXMgZnVsbC4KKyAqCisgKiBBIG1lc3NhZ2UgSUQgaXMgcmVxdWlyZWQuICBUaGUgZGF0YSBwYXlsb2FkIGlzIG9wdGlvbmFsLgorICoKKyAqIFNlZSBSZW5kZXJTY3JpcHQuUlNNZXNzYWdlSGFuZGxlci4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICBkYXRhOiBBcHBsaWNhdGlvbiBzcGVjaWZpYyBkYXRhLgorICogICBsZW46IExlbmd0aCBvZiB0aGUgZGF0YSwgaW4gYnl0ZXMuCisgKi8KK2V4dGVybiBib29sIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZW5kVG9DbGllbnQoaW50IGNtZElEKTsKKworZXh0ZXJuIGJvb2wgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NlbmRUb0NsaWVudChpbnQgY21kSUQsIGNvbnN0IHZvaWQqIGRhdGEsIHVpbnQgbGVuKTsKKworLyoKKyAqIHJzU2VuZFRvQ2xpZW50QmxvY2tpbmc6IFNlbmQgYSBtZXNzYWdlIHRvIHRoZSBjbGllbnQsIGJsb2NraW5nCisgKgorICogU2VuZHMgYSBtZXNzYWdlIGJhY2sgdG8gdGhlIGNsaWVudC4gIFRoaXMgZnVuY3Rpb24gd2lsbCBibG9jaworICogdW50aWwgdGhlcmUgaXMgcm9vbSBvbiB0aGUgbWVzc2FnZSBxdWV1ZSBmb3IgdGhpcyBtZXNzYWdlLgorICogVGhpcyBmdW5jdGlvbiBtYXkgcmV0dXJuIGJlZm9yZSB0aGUgbWVzc2FnZSB3YXMgZGVsaXZlcmVkIGFuZAorICogcHJvY2Vzc2VkIGJ5IHRoZSBjbGllbnQuCisgKgorICogQSBtZXNzYWdlIElEIGlzIHJlcXVpcmVkLiAgVGhlIGRhdGEgcGF5bG9hZCBpcyBvcHRpb25hbC4KKyAqCisgKiBTZWUgUmVuZGVyU2NyaXB0LlJTTWVzc2FnZUhhbmRsZXIuCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgZGF0YTogQXBwbGljYXRpb24gc3BlY2lmaWMgZGF0YS4KKyAqICAgbGVuOiBMZW5ndGggb2YgdGhlIGRhdGEsIGluIGJ5dGVzLgorICovCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2VuZFRvQ2xpZW50QmxvY2tpbmcoaW50IGNtZElEKTsKKworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NlbmRUb0NsaWVudEJsb2NraW5nKGludCBjbWRJRCwgY29uc3Qgdm9pZCogZGF0YSwgdWludCBsZW4pOworCisjZW5kaWYgLy8gUkVOREVSU0NSSVBUX1JTX0lPX1JTSApkaWZmIC0tZ2l0IGEvcmVuZGVyc2NyaXB0L2luY2x1ZGUvcnNfbWF0aC5yc2ggYi9yZW5kZXJzY3JpcHQvaW5jbHVkZS9yc19tYXRoLnJzaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWE3NTY5Ci0tLSAvZGV2L251bGwKKysrIGIvcmVuZGVyc2NyaXB0L2luY2x1ZGUvcnNfbWF0aC5yc2gKQEAgLTAsMCArMSw2NTUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gRG9uJ3QgZWRpdCB0aGlzIGZpbGUhICBJdCBpcyBhdXRvLWdlbmVyYXRlZCBieSBmcmFtZXdvcmtzL3JzL2FwaS9nZW5lcmF0ZS5zaC4KKworLyoKKyAqIHJzX21hdGgucnNoOiBNYXRoZW1hdGljYWwgQ29uc3RhbnRzIGFuZCBGdW5jdGlvbnMKKyAqCisgKiBUaGUgbWF0aGVtYXRpY2FsIGZ1bmN0aW9ucyBiZWxvdyBjYW4gYmUgYXBwbGllZCB0byBzY2FsYXJzIGFuZCB2ZWN0b3JzLiAgIFdoZW4gYXBwbGllZAorICogdG8gdmVjdG9ycywgdGhlIHJldHVybmVkIHZhbHVlIGlzIGEgdmVjdG9yIG9mIHRoZSBmdW5jdGlvbiBhcHBsaWVkIHRvIGVhY2ggZW50cnkgb2YgdGhlIGlucHV0LgorICoKKyAqIEZvciBleGFtcGxlOgorICogZmxvYXQzIGEsIGI7CisgKiAvLyBUaGUgZm9sbG93aW5nIGNhbGwgc2V0cworICogLy8gICBhLnggdG8gc2luKGIueCksCisgKiAvLyAgIGEueSB0byBzaW4oYi55KSwgYW5kCisgKiAvLyAgIGEueiB0byBzaW4oYi56KS4KKyAqIGEgPSBzaW4oYik7CisgKgorICoKKyAqIFNlZSBWZWN0b3IgTWF0aCBGdW5jdGlvbnMgZm9yIGZ1bmN0aW9ucyBsaWtlIGRpc3RhbmNlKCkgYW5kIGxlbmd0aCgpIHRoYXQgaW50ZXJwcmV0CisgKiBpbnN0ZWFkIHRoZSBpbnB1dCBhcyBhIHNpbmdsZSB2ZWN0b3IgaW4gbi1kaW1lbnNpb25hbCBzcGFjZS4KKyAqCisgKiBUaGUgcHJlY2lzaW9uIG9mIHRoZSBtYXRoZW1hdGljYWwgb3BlcmF0aW9ucyBvbiAzMiBiaXQgZmxvYXRzIGlzIGFmZmVjdGVkIGJ5IHRoZSBwcmFnbWFzCisgKiByc19mcF9yZWxheGVkIGFuZCByc19mcF9mdWxsLiAgVW5kZXIgcnNfZnBfcmVsYXhlZCwgc3Vibm9ybWFsIHZhbHVlcyBtYXkgYmUgZmx1c2hlZCB0byB6ZXJvIGFuZAorICogcm91bmRpbmcgbWF5IGJlIGRvbmUgdG93YXJkcyB6ZXJvLiAgSW4gY29tcGFyaXNvbiwgcnNfZnBfZnVsbCByZXF1aXJlcyBjb3JyZWN0IGhhbmRsaW5nIG9mCisgKiBzdWJub3JtYWwgdmFsdWVzLCBpLmUuIHNtYWxsZXIgdGhhbiAxLjE3NTQ5NDM1ZS0zOGYuICByc19mcF9ydWxsIGFsc28gcmVxdWlyZXMgcm91bmQgdG8gbmVhcmVzdAorICogd2l0aCB0aWVzIHRvIGV2ZW4uCisgKgorICogRGlmZmVyZW50IHByZWNpc2lvbi9zcGVlZCB0cmFkZW9mZnMgY2FuIGJlIGFjaGlldmVkIGJ5IHVzaW5nIHZhcmlhbnRzIG9mIHRoZSBjb21tb24gbWF0aAorICogZnVuY3Rpb25zLiAgRnVuY3Rpb25zIHdpdGggYSBuYW1lIHN0YXJ0aW5nIHdpdGgKKyAqIC0gbmF0aXZlXzogTWF5IGhhdmUgY3VzdG9tIGhhcmR3YXJlIGltcGxlbWVudGF0aW9ucyB3aXRoIHdlYWtlciBwcmVjaXNpb24uICBBZGRpdGlvbmFsbHksCisgKiAgIHN1Ym5vcm1hbCB2YWx1ZXMgbWF5IGJlIGZsdXNoZWQgdG8gemVybywgcm91bmRpbmcgdG93YXJkcyB6ZXJvIG1heSBiZSB1c2VkLCBhbmQgTmFOIGFuZAorICogICBpbmZpbml0eSBpbnB1dCBtYXkgbm90IGJlIGhhbmRsZWQgY29ycmVjdGx5LgorICogLSBoYWxmXzogTWF5IHBlcmZvcm0gaW50ZXJuYWwgY29tcHV0YXRpb25zIHVzaW5nIDE2IGJpdCBmbG9hdHMuICBBZGRpdGlvbmFsbHksIHN1Ym5vcm1hbAorICogICB2YWx1ZXMgbWF5IGJlIGZsdXNoZWQgdG8gemVybywgYW5kIHJvdW5kaW5nIHRvd2FyZHMgemVybyBtYXkgYmUgdXNlZC4KKyAqCisgKi8KKworI2lmbmRlZiBSRU5ERVJTQ1JJUFRfUlNfTUFUSF9SU0gKKyNkZWZpbmUgUkVOREVSU0NSSVBUX1JTX01BVEhfUlNICisKKy8qCisgKiBNXzFfUEk6IDEgLyBwaSwgYXMgYSAzMiBiaXQgZmxvYXQKKyAqCisgKiBUaGUgaW52ZXJzZSBvZiBwaSwgYXMgYSAzMiBiaXQgZmxvYXQuCisgKi8KK3N0YXRpYyBjb25zdCBmbG9hdCBNXzFfUEkgPSAwLjMxODMwOTg4NjE4Mzc5MDY3MTUzNzc2NzUyNjc0NTAyODcyNGY7CisKKy8qCisgKiBNXzJfUEk6IDIgLyBwaSwgYXMgYSAzMiBiaXQgZmxvYXQKKyAqCisgKiAyIGRpdmlkZWQgYnkgcGksIGFzIGEgMzIgYml0IGZsb2F0LgorICovCitzdGF0aWMgY29uc3QgZmxvYXQgTV8yX1BJID0gMC42MzY2MTk3NzIzNjc1ODEzNDMwNzU1MzUwNTM0OTAwNTc0NDhmOworCisvKgorICogTV8yX1BJbDogMiAvIHBpLCBhcyBhIDMyIGJpdCBmbG9hdAorICoKKyAqIERFUFJFQ0FURUQuICBEbyBub3QgdXNlLgorICoKKyAqIDIgZGl2aWRlZCBieSBwaSwgYXMgYSAzMiBiaXQgZmxvYXQuCisgKi8KK3N0YXRpYyBjb25zdCBmbG9hdCBNXzJfUElsID0gMC42MzY2MTk3NzIzNjc1ODEzNDMwNzU1MzUwNTM0OTAwNTc0NDhmOworCisvKgorICogTV8yX1NRUlRQSTogMiAvIHNxcnQocGkpLCBhcyBhIDMyIGJpdCBmbG9hdAorICoKKyAqIDIgZGl2aWRlZCBieSB0aGUgc3F1YXJlIHJvb3Qgb2YgcGksIGFzIGEgMzIgYml0IGZsb2F0LgorICovCitzdGF0aWMgY29uc3QgZmxvYXQgTV8yX1NRUlRQSSA9IDEuMTI4Mzc5MTY3MDk1NTEyNTczODk2MTU4OTAzMTIxNTQ1MTcyZjsKKworLyoKKyAqIE1fRTogZSwgYXMgYSAzMiBiaXQgZmxvYXQKKyAqCisgKiBUaGUgbnVtYmVyIGUsIHRoZSBiYXNlIG9mIHRoZSBuYXR1cmFsIGxvZ2FyaXRobSwgYXMgYSAzMiBiaXQgZmxvYXQuCisgKi8KK3N0YXRpYyBjb25zdCBmbG9hdCBNX0UgPSAyLjcxODI4MTgyODQ1OTA0NTIzNTM2MDI4NzQ3MTM1MjY2MjQ5OGY7CisKKy8qCisgKiBNX0xOMTA6IGxvZ19lKDEwKSwgYXMgYSAzMiBiaXQgZmxvYXQKKyAqCisgKiBUaGUgbmF0dXJhbCBsb2dhcml0aG0gb2YgMTAsIGFzIGEgMzIgYml0IGZsb2F0LgorICovCitzdGF0aWMgY29uc3QgZmxvYXQgTV9MTjEwID0gMi4zMDI1ODUwOTI5OTQwNDU2ODQwMTc5OTE0NTQ2ODQzNjQyMDhmOworCisvKgorICogTV9MTjI6IGxvZ19lKDIpLCBhcyBhIDMyIGJpdCBmbG9hdAorICoKKyAqIFRoZSBuYXR1cmFsIGxvZ2FyaXRobSBvZiAyLCBhcyBhIDMyIGJpdCBmbG9hdC4KKyAqLworc3RhdGljIGNvbnN0IGZsb2F0IE1fTE4yID0gMC42OTMxNDcxODA1NTk5NDUzMDk0MTcyMzIxMjE0NTgxNzY1NjhmOworCisvKgorICogTV9MT0cxMEU6IGxvZ18xMChlKSwgYXMgYSAzMiBiaXQgZmxvYXQKKyAqCisgKiBUaGUgbG9nYXJpdGhtIGJhc2UgMTAgb2YgZSwgYXMgYSAzMiBiaXQgZmxvYXQuCisgKi8KK3N0YXRpYyBjb25zdCBmbG9hdCBNX0xPRzEwRSA9IDAuNDM0Mjk0NDgxOTAzMjUxODI3NjUxMTI4OTE4OTE2NjA1MDgyZjsKKworLyoKKyAqIE1fTE9HMkU6IGxvZ18yKGUpLCBhcyBhIDMyIGJpdCBmbG9hdAorICoKKyAqIFRoZSBsb2dhcml0aG0gYmFzZSAyIG9mIGUsIGFzIGEgMzIgYml0IGZsb2F0LgorICovCitzdGF0aWMgY29uc3QgZmxvYXQgTV9MT0cyRSA9IDEuNDQyNjk1MDQwODg4OTYzNDA3MzU5OTI0NjgxMDAxODkyMTM3ZjsKKworLyoKKyAqIE1fUEk6IHBpLCBhcyBhIDMyIGJpdCBmbG9hdAorICoKKyAqIFRoZSBjb25zdGFudCBwaSwgYXMgYSAzMiBiaXQgZmxvYXQuCisgKi8KK3N0YXRpYyBjb25zdCBmbG9hdCBNX1BJID0gMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMzODMyNzk1MDI4ODRmOworCisvKgorICogTV9QSV8yOiBwaSAvIDIsIGFzIGEgMzIgYml0IGZsb2F0CisgKgorICogUGkgZGl2aWRlZCBieSAyLCBhcyBhIDMyIGJpdCBmbG9hdC4KKyAqLworc3RhdGljIGNvbnN0IGZsb2F0IE1fUElfMiA9IDEuNTcwNzk2MzI2Nzk0ODk2NjE5MjMxMzIxNjkxNjM5NzUxNDQyZjsKKworLyoKKyAqIE1fUElfNDogcGkgLyA0LCBhcyBhIDMyIGJpdCBmbG9hdAorICoKKyAqIFBpIGRpdmlkZWQgYnkgNCwgYXMgYSAzMiBiaXQgZmxvYXQuCisgKi8KK3N0YXRpYyBjb25zdCBmbG9hdCBNX1BJXzQgPSAwLjc4NTM5ODE2MzM5NzQ0ODMwOTYxNTY2MDg0NTgxOTg3NTcyMWY7CisKKy8qCisgKiBNX1NRUlQxXzI6IDEgLyBzcXJ0KDIpLCBhcyBhIDMyIGJpdCBmbG9hdAorICoKKyAqIFRoZSBpbnZlcnNlIG9mIHRoZSBzcXVhcmUgcm9vdCBvZiAyLCBhcyBhIDMyIGJpdCBmbG9hdC4KKyAqLworc3RhdGljIGNvbnN0IGZsb2F0IE1fU1FSVDFfMiA9IDAuNzA3MTA2NzgxMTg2NTQ3NTI0NDAwODQ0MzYyMTA0ODQ5MDM5ZjsKKworLyoKKyAqIE1fU1FSVDI6IHNxcnQoMiksIGFzIGEgMzIgYml0IGZsb2F0CisgKgorICogVGhlIHNxdWFyZSByb290IG9mIDIsIGFzIGEgMzIgYml0IGZsb2F0LgorICovCitzdGF0aWMgY29uc3QgZmxvYXQgTV9TUVJUMiA9IDEuNDE0MjEzNTYyMzczMDk1MDQ4ODAxNjg4NzI0MjA5Njk4MDc5ZjsKKworLyoKKyAqIGFiczogQWJzb2x1dGUgdmFsdWUgb2YgYW4gaW50ZWdlcgorICoKKyAqIFJldHVybnMgdGhlIGFic29sdXRlIHZhbHVlIG9mIGFuIGludGVnZXIuCisgKgorICogRm9yIGZsb2F0cywgdXNlIGZhYnMoKS4KKyAqLworZXh0ZXJuIHVjaGFyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGFicyhjaGFyIHYpOworCitleHRlcm4gdWNoYXIyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGFicyhjaGFyMiB2KTsKKworZXh0ZXJuIHVjaGFyMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBhYnMoY2hhcjMgdik7CisKK2V4dGVybiB1Y2hhcjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgYWJzKGNoYXI0IHYpOworCitleHRlcm4gdXNob3J0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGFicyhzaG9ydCB2KTsKKworZXh0ZXJuIHVzaG9ydDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgYWJzKHNob3J0MiB2KTsKKworZXh0ZXJuIHVzaG9ydDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgYWJzKHNob3J0MyB2KTsKKworZXh0ZXJuIHVzaG9ydDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgYWJzKHNob3J0NCB2KTsKKworZXh0ZXJuIHVpbnQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgYWJzKGludCB2KTsKKworZXh0ZXJuIHVpbnQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGFicyhpbnQyIHYpOworCitleHRlcm4gdWludDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgYWJzKGludDMgdik7CisKK2V4dGVybiB1aW50NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBhYnMoaW50NCB2KTsKKworLyoKKyAqIGFjb3M6IEludmVyc2UgY29zaW5lCisgKgorICogUmV0dXJucyB0aGUgaW52ZXJzZSBjb3NpbmUsIGluIHJhZGlhbnMuCisgKgorICogU2VlIGFsc28gbmF0aXZlX2Fjb3MoKS4KKyAqLworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGFjb3MoZmxvYXQgdik7CisKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgYWNvcyhmbG9hdDIgdik7CisKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgYWNvcyhmbG9hdDMgdik7CisKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgYWNvcyhmbG9hdDQgdik7CisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBhY29zKGhhbGYgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBhY29zKGhhbGYyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgYWNvcyhoYWxmMyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGY0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGFjb3MoaGFsZjQgdik7CisjZW5kaWYKKworLyoKKyAqIGFjb3NoOiBJbnZlcnNlIGh5cGVyYm9saWMgY29zaW5lCisgKgorICogUmV0dXJucyB0aGUgaW52ZXJzZSBoeXBlcmJvbGljIGNvc2luZSwgaW4gcmFkaWFucy4KKyAqCisgKiBTZWUgYWxzbyBuYXRpdmVfYWNvc2goKS4KKyAqLworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGFjb3NoKGZsb2F0IHYpOworCitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGFjb3NoKGZsb2F0MiB2KTsKKworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBhY29zaChmbG9hdDMgdik7CisKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgYWNvc2goZmxvYXQ0IHYpOworCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgYWNvc2goaGFsZiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGFjb3NoKGhhbGYyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgYWNvc2goaGFsZjMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBhY29zaChoYWxmNCB2KTsKKyNlbmRpZgorCisvKgorICogYWNvc3BpOiBJbnZlcnNlIGNvc2luZSBkaXZpZGVkIGJ5IHBpCisgKgorICogUmV0dXJucyB0aGUgaW52ZXJzZSBjb3NpbmUgaW4gcmFkaWFucywgZGl2aWRlZCBieSBwaS4KKyAqCisgKiBUbyBnZXQgYW4gaW52ZXJzZSBjb3NpbmUgbWVhc3VyZWQgaW4gZGVncmVlcywgdXNlIGFjb3NwaShhKSAqIDE4MC5mLgorICoKKyAqIFNlZSBhbHNvIG5hdGl2ZV9hY29zcGkoKS4KKyAqLworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGFjb3NwaShmbG9hdCB2KTsKKworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBhY29zcGkoZmxvYXQyIHYpOworCitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGFjb3NwaShmbG9hdDMgdik7CisKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgYWNvc3BpKGZsb2F0NCB2KTsKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGFjb3NwaShoYWxmIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgYWNvc3BpKGhhbGYyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgYWNvc3BpKGhhbGYzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgYWNvc3BpKGhhbGY0IHYpOworI2VuZGlmCisKKy8qCisgKiBhc2luOiBJbnZlcnNlIHNpbmUKKyAqCisgKiBSZXR1cm5zIHRoZSBpbnZlcnNlIHNpbmUsIGluIHJhZGlhbnMuCisgKgorICogU2VlIGFsc28gbmF0aXZlX2FzaW4oKS4KKyAqLworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGFzaW4oZmxvYXQgdik7CisKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgYXNpbihmbG9hdDIgdik7CisKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgYXNpbihmbG9hdDMgdik7CisKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgYXNpbihmbG9hdDQgdik7CisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBhc2luKGhhbGYgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBhc2luKGhhbGYyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgYXNpbihoYWxmMyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGY0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGFzaW4oaGFsZjQgdik7CisjZW5kaWYKKworLyoKKyAqIGFzaW5oOiBJbnZlcnNlIGh5cGVyYm9saWMgc2luZQorICoKKyAqIFJldHVybnMgdGhlIGludmVyc2UgaHlwZXJib2xpYyBzaW5lLCBpbiByYWRpYW5zLgorICoKKyAqIFNlZSBhbHNvIG5hdGl2ZV9hc2luaCgpLgorICovCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgYXNpbmgoZmxvYXQgdik7CisKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgYXNpbmgoZmxvYXQyIHYpOworCitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGFzaW5oKGZsb2F0MyB2KTsKKworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBhc2luaChmbG9hdDQgdik7CisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBhc2luaChoYWxmIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgYXNpbmgoaGFsZjIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBhc2luaChoYWxmMyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGY0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGFzaW5oKGhhbGY0IHYpOworI2VuZGlmCisKKy8qCisgKiBhc2lucGk6IEludmVyc2Ugc2luZSBkaXZpZGVkIGJ5IHBpCisgKgorICogUmV0dXJucyB0aGUgaW52ZXJzZSBzaW5lIGluIHJhZGlhbnMsIGRpdmlkZWQgYnkgcGkuCisgKgorICogVG8gZ2V0IGFuIGludmVyc2Ugc2luZSBtZWFzdXJlZCBpbiBkZWdyZWVzLCB1c2UgYXNpbnBpKGEpICogMTgwLmYuCisgKgorICogU2VlIGFsc28gbmF0aXZlX2FzaW5waSgpLgorICovCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgYXNpbnBpKGZsb2F0IHYpOworCitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGFzaW5waShmbG9hdDIgdik7CisKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgYXNpbnBpKGZsb2F0MyB2KTsKKworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBhc2lucGkoZmxvYXQ0IHYpOworCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgYXNpbnBpKGhhbGYgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBhc2lucGkoaGFsZjIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBhc2lucGkoaGFsZjMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBhc2lucGkoaGFsZjQgdik7CisjZW5kaWYKKworLyoKKyAqIGF0YW46IEludmVyc2UgdGFuZ2VudAorICoKKyAqIFJldHVybnMgdGhlIGludmVyc2UgdGFuZ2VudCwgaW4gcmFkaWFucy4KKyAqCisgKiBTZWUgYWxzbyBuYXRpdmVfYXRhbigpLgorICovCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgYXRhbihmbG9hdCB2KTsKKworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBhdGFuKGZsb2F0MiB2KTsKKworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBhdGFuKGZsb2F0MyB2KTsKKworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBhdGFuKGZsb2F0NCB2KTsKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGF0YW4oaGFsZiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGF0YW4oaGFsZjIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBhdGFuKGhhbGYzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgYXRhbihoYWxmNCB2KTsKKyNlbmRpZgorCisvKgorICogYXRhbjI6IEludmVyc2UgdGFuZ2VudCBvZiBhIHJhdGlvCisgKgorICogUmV0dXJucyB0aGUgaW52ZXJzZSB0YW5nZW50IG9mIChudW1lcmF0b3IgLyBkZW5vbWluYXRvciksIGluIHJhZGlhbnMuCisgKgorICogU2VlIGFsc28gbmF0aXZlX2F0YW4yKCkuCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgbnVtZXJhdG9yOiBOdW1lcmF0b3IuCisgKiAgIGRlbm9taW5hdG9yOiBEZW5vbWluYXRvci4gIENhbiBiZSAwLgorICovCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgYXRhbjIoZmxvYXQgbnVtZXJhdG9yLCBmbG9hdCBkZW5vbWluYXRvcik7CisKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgYXRhbjIoZmxvYXQyIG51bWVyYXRvciwgZmxvYXQyIGRlbm9taW5hdG9yKTsKKworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBhdGFuMihmbG9hdDMgbnVtZXJhdG9yLCBmbG9hdDMgZGVub21pbmF0b3IpOworCitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGF0YW4yKGZsb2F0NCBudW1lcmF0b3IsIGZsb2F0NCBkZW5vbWluYXRvcik7CisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBhdGFuMihoYWxmIG51bWVyYXRvciwgaGFsZiBkZW5vbWluYXRvcik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBhdGFuMihoYWxmMiBudW1lcmF0b3IsIGhhbGYyIGRlbm9taW5hdG9yKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGF0YW4yKGhhbGYzIG51bWVyYXRvciwgaGFsZjMgZGVub21pbmF0b3IpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgYXRhbjIoaGFsZjQgbnVtZXJhdG9yLCBoYWxmNCBkZW5vbWluYXRvcik7CisjZW5kaWYKKworLyoKKyAqIGF0YW4ycGk6IEludmVyc2UgdGFuZ2VudCBvZiBhIHJhdGlvLCBkaXZpZGVkIGJ5IHBpCisgKgorICogUmV0dXJucyB0aGUgaW52ZXJzZSB0YW5nZW50IG9mIChudW1lcmF0b3IgLyBkZW5vbWluYXRvciksIGluIHJhZGlhbnMsIGRpdmlkZWQgYnkgcGkuCisgKgorICogVG8gZ2V0IGFuIGludmVyc2UgdGFuZ2VudCBtZWFzdXJlZCBpbiBkZWdyZWVzLCB1c2UgYXRhbjJwaShuLCBkKSAqIDE4MC5mLgorICoKKyAqIFNlZSBhbHNvIG5hdGl2ZV9hdGFuMnBpKCkuCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgbnVtZXJhdG9yOiBOdW1lcmF0b3IuCisgKiAgIGRlbm9taW5hdG9yOiBEZW5vbWluYXRvci4gIENhbiBiZSAwLgorICovCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgYXRhbjJwaShmbG9hdCBudW1lcmF0b3IsIGZsb2F0IGRlbm9taW5hdG9yKTsKKworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBhdGFuMnBpKGZsb2F0MiBudW1lcmF0b3IsIGZsb2F0MiBkZW5vbWluYXRvcik7CisKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgYXRhbjJwaShmbG9hdDMgbnVtZXJhdG9yLCBmbG9hdDMgZGVub21pbmF0b3IpOworCitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGF0YW4ycGkoZmxvYXQ0IG51bWVyYXRvciwgZmxvYXQ0IGRlbm9taW5hdG9yKTsKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGF0YW4ycGkoaGFsZiBudW1lcmF0b3IsIGhhbGYgZGVub21pbmF0b3IpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgYXRhbjJwaShoYWxmMiBudW1lcmF0b3IsIGhhbGYyIGRlbm9taW5hdG9yKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGF0YW4ycGkoaGFsZjMgbnVtZXJhdG9yLCBoYWxmMyBkZW5vbWluYXRvcik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBhdGFuMnBpKGhhbGY0IG51bWVyYXRvciwgaGFsZjQgZGVub21pbmF0b3IpOworI2VuZGlmCisKKy8qCisgKiBhdGFuaDogSW52ZXJzZSBoeXBlcmJvbGljIHRhbmdlbnQKKyAqCisgKiBSZXR1cm5zIHRoZSBpbnZlcnNlIGh5cGVyYm9saWMgdGFuZ2VudCwgaW4gcmFkaWFucy4KKyAqCisgKiBTZWUgYWxzbyBuYXRpdmVfYXRhbmgoKS4KKyAqLworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGF0YW5oKGZsb2F0IHYpOworCitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGF0YW5oKGZsb2F0MiB2KTsKKworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBhdGFuaChmbG9hdDMgdik7CisKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgYXRhbmgoZmxvYXQ0IHYpOworCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgYXRhbmgoaGFsZiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGF0YW5oKGhhbGYyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgYXRhbmgoaGFsZjMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBhdGFuaChoYWxmNCB2KTsKKyNlbmRpZgorCisvKgorICogYXRhbnBpOiBJbnZlcnNlIHRhbmdlbnQgZGl2aWRlZCBieSBwaQorICoKKyAqIFJldHVybnMgdGhlIGludmVyc2UgdGFuZ2VudCBpbiByYWRpYW5zLCBkaXZpZGVkIGJ5IHBpLgorICoKKyAqIFRvIGdldCBhbiBpbnZlcnNlIHRhbmdlbnQgbWVhc3VyZWQgaW4gZGVncmVlcywgdXNlIGF0YW5waShhKSAqIDE4MC5mLgorICoKKyAqIFNlZSBhbHNvIG5hdGl2ZV9hdGFucGkoKS4KKyAqLworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGF0YW5waShmbG9hdCB2KTsKKworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBhdGFucGkoZmxvYXQyIHYpOworCitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGF0YW5waShmbG9hdDMgdik7CisKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgYXRhbnBpKGZsb2F0NCB2KTsKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGF0YW5waShoYWxmIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgYXRhbnBpKGhhbGYyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgYXRhbnBpKGhhbGYzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgYXRhbnBpKGhhbGY0IHYpOworI2VuZGlmCisKKy8qCisgKiBjYnJ0OiBDdWJlIHJvb3QKKyAqCisgKiBSZXR1cm5zIHRoZSBjdWJlIHJvb3QuCisgKgorICogU2VlIGFsc28gbmF0aXZlX2NicnQoKS4KKyAqLworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNicnQoZmxvYXQgdik7CisKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY2JydChmbG9hdDIgdik7CisKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY2JydChmbG9hdDMgdik7CisKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY2JydChmbG9hdDQgdik7CisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjYnJ0KGhhbGYgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjYnJ0KGhhbGYyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY2JydChoYWxmMyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGY0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNicnQoaGFsZjQgdik7CisjZW5kaWYKKworLyoKKyAqIGNlaWw6IFNtYWxsZXN0IGludGVnZXIgbm90IGxlc3MgdGhhbiBhIHZhbHVlCisgKgorICogUmV0dXJucyB0aGUgc21hbGxlc3QgaW50ZWdlciBub3QgbGVzcyB0aGFuIGEgdmFsdWUuCisgKgorICogRm9yIGV4YW1wbGUsIGNlaWwoMS4yZikgcmV0dXJucyAyLmYsIGFuZCBjZWlsKC0xLjJmKSByZXR1cm5zIC0xLmYuCisgKgorICogU2VlIGFsc28gZmxvb3IoKS4KKyAqLworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNlaWwoZmxvYXQgdik7CisKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY2VpbChmbG9hdDIgdik7CisKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY2VpbChmbG9hdDMgdik7CisKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY2VpbChmbG9hdDQgdik7CisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjZWlsKGhhbGYgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjZWlsKGhhbGYyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY2VpbChoYWxmMyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGY0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNlaWwoaGFsZjQgdik7CisjZW5kaWYKKworLyoKKyAqIGNsYW1wOiBSZXN0cmFpbiBhIHZhbHVlIHRvIGEgcmFuZ2UKKyAqCisgKiBDbGFtcHMgYSB2YWx1ZSB0byBhIHNwZWNpZmllZCBoaWdoIGFuZCBsb3cgYm91bmQuICBjbGFtcCgpIHJldHVybnMgbWluX3ZhbHVlCisgKiBpZiB2YWx1ZSA8IG1pbl92YWx1ZSwgbWF4X3ZhbHVlIGlmIHZhbHVlID4gbWF4X3ZhbHVlLCBvdGhlcndpc2UgdmFsdWUuCisgKgorICogVGhlcmUgYXJlIHR3byB2YXJpYW50cyBvZiBjbGFtcDogb25lIHdoZXJlIHRoZSBtaW4gYW5kIG1heCBhcmUgc2NhbGFycyBhcHBsaWVkCisgKiB0byBhbGwgZW50cmllcyBvZiB0aGUgdmFsdWUsIHRoZSBvdGhlciB3aGVyZSB0aGUgbWluIGFuZCBtYXggYXJlIGFsc28gdmVjdG9ycy4KKyAqCisgKiBJZiBtaW5fdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG1heF92YWx1ZSwgdGhlIHJlc3VsdHMgYXJlIHVuZGVmaW5lZC4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICB2YWx1ZTogVmFsdWUgdG8gYmUgY2xhbXBlZC4KKyAqICAgbWluX3ZhbHVlOiBMb3dlciBib3VuZCwgYSBzY2FsYXIgb3IgbWF0Y2hpbmcgdmVjdG9yLgorICogICBtYXhfdmFsdWU6IEhpZ2ggYm91bmQsIG11c3QgbWF0Y2ggdGhlIHR5cGUgb2YgbG93LgorICovCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY2xhbXAoZmxvYXQgdmFsdWUsIGZsb2F0IG1pbl92YWx1ZSwgZmxvYXQgbWF4X3ZhbHVlKTsKKworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjbGFtcChmbG9hdDIgdmFsdWUsIGZsb2F0MiBtaW5fdmFsdWUsIGZsb2F0MiBtYXhfdmFsdWUpOworCitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNsYW1wKGZsb2F0MyB2YWx1ZSwgZmxvYXQzIG1pbl92YWx1ZSwgZmxvYXQzIG1heF92YWx1ZSk7CisKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY2xhbXAoZmxvYXQ0IHZhbHVlLCBmbG9hdDQgbWluX3ZhbHVlLCBmbG9hdDQgbWF4X3ZhbHVlKTsKKworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjbGFtcChmbG9hdDIgdmFsdWUsIGZsb2F0IG1pbl92YWx1ZSwgZmxvYXQgbWF4X3ZhbHVlKTsKKworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjbGFtcChmbG9hdDMgdmFsdWUsIGZsb2F0IG1pbl92YWx1ZSwgZmxvYXQgbWF4X3ZhbHVlKTsKKworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjbGFtcChmbG9hdDQgdmFsdWUsIGZsb2F0IG1pbl92YWx1ZSwgZmxvYXQgbWF4X3ZhbHVlKTsKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE5KSkKK2V4dGVybiBjaGFyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNsYW1wKGNoYXIgdmFsdWUsIGNoYXIgbWluX3ZhbHVlLCBjaGFyIG1heF92YWx1ZSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE5KSkKK2V4dGVybiBjaGFyMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjbGFtcChjaGFyMiB2YWx1ZSwgY2hhcjIgbWluX3ZhbHVlLCBjaGFyMiBtYXhfdmFsdWUpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOSkpCitleHRlcm4gY2hhcjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY2xhbXAoY2hhcjMgdmFsdWUsIGNoYXIzIG1pbl92YWx1ZSwgY2hhcjMgbWF4X3ZhbHVlKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTkpKQorZXh0ZXJuIGNoYXI0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNsYW1wKGNoYXI0IHZhbHVlLCBjaGFyNCBtaW5fdmFsdWUsIGNoYXI0IG1heF92YWx1ZSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE5KSkKK2V4dGVybiB1Y2hhciBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjbGFtcCh1Y2hhciB2YWx1ZSwgdWNoYXIgbWluX3ZhbHVlLCB1Y2hhciBtYXhfdmFsdWUpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOSkpCitleHRlcm4gdWNoYXIyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNsYW1wKHVjaGFyMiB2YWx1ZSwgdWNoYXIyIG1pbl92YWx1ZSwgdWNoYXIyIG1heF92YWx1ZSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE5KSkKK2V4dGVybiB1Y2hhcjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY2xhbXAodWNoYXIzIHZhbHVlLCB1Y2hhcjMgbWluX3ZhbHVlLCB1Y2hhcjMgbWF4X3ZhbHVlKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTkpKQorZXh0ZXJuIHVjaGFyNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjbGFtcCh1Y2hhcjQgdmFsdWUsIHVjaGFyNCBtaW5fdmFsdWUsIHVjaGFyNCBtYXhfdmFsdWUpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOSkpCitleHRlcm4gc2hvcnQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY2xhbXAoc2hvcnQgdmFsdWUsIHNob3J0IG1pbl92YWx1ZSwgc2hvcnQgbWF4X3ZhbHVlKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTkpKQorZXh0ZXJuIHNob3J0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjbGFtcChzaG9ydDIgdmFsdWUsIHNob3J0MiBtaW5fdmFsdWUsIHNob3J0MiBtYXhfdmFsdWUpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOSkpCitleHRlcm4gc2hvcnQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNsYW1wKHNob3J0MyB2YWx1ZSwgc2hvcnQzIG1pbl92YWx1ZSwgc2hvcnQzIG1heF92YWx1ZSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE5KSkKK2V4dGVybiBzaG9ydDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY2xhbXAoc2hvcnQ0IHZhbHVlLCBzaG9ydDQgbWluX3ZhbHVlLCBzaG9ydDQgbWF4X3ZhbHVlKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTkpKQorZXh0ZXJuIHVzaG9ydCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjbGFtcCh1c2hvcnQgdmFsdWUsIHVzaG9ydCBtaW5fdmFsdWUsIHVzaG9ydCBtYXhfdmFsdWUpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOSkpCitleHRlcm4gdXNob3J0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjbGFtcCh1c2hvcnQyIHZhbHVlLCB1c2hvcnQyIG1pbl92YWx1ZSwgdXNob3J0MiBtYXhfdmFsdWUpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOSkpCitleHRlcm4gdXNob3J0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjbGFtcCh1c2hvcnQzIHZhbHVlLCB1c2hvcnQzIG1pbl92YWx1ZSwgdXNob3J0MyBtYXhfdmFsdWUpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOSkpCitleHRlcm4gdXNob3J0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjbGFtcCh1c2hvcnQ0IHZhbHVlLCB1c2hvcnQ0IG1pbl92YWx1ZSwgdXNob3J0NCBtYXhfdmFsdWUpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOSkpCitleHRlcm4gaW50IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNsYW1wKGludCB2YWx1ZSwgaW50IG1pbl92YWx1ZSwgaW50IG1heF92YWx1ZSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE5KSkKK2V4dGVybiBpbnQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNsYW1wKGludDIgdmFsdWUsIGludDIgbWluX3ZhbHVlLCBpbnQyIG1heF92YWx1ZSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE5KSkKK2V4dGVybiBpbnQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNsYW1wKGludDMgdmFsdWUsIGludDMgbWluX3ZhbHVlLCBpbnQzIG1heF92YWx1ZSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE5KSkKK2V4dGVybiBpbnQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNsYW1wKGludDQgdmFsdWUsIGludDQgbWluX3ZhbHVlLCBpbnQ0IG1heF92YWx1ZSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE5KSkKK2V4dGVybiB1aW50IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNsYW1wKHVpbnQgdmFsdWUsIHVpbnQgbWluX3ZhbHVlLCB1aW50IG1heF92YWx1ZSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE5KSkKK2V4dGVybiB1aW50MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjbGFtcCh1aW50MiB2YWx1ZSwgdWludDIgbWluX3ZhbHVlLCB1aW50MiBtYXhfdmFsdWUpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOSkpCitleHRlcm4gdWludDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY2xhbXAodWludDMgdmFsdWUsIHVpbnQzIG1pbl92YWx1ZSwgdWludDMgbWF4X3ZhbHVlKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTkpKQorZXh0ZXJuIHVpbnQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNsYW1wKHVpbnQ0IHZhbHVlLCB1aW50NCBtaW5fdmFsdWUsIHVpbnQ0IG1heF92YWx1ZSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE5KSkKK2V4dGVybiBsb25nIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNsYW1wKGxvbmcgdmFsdWUsIGxvbmcgbWluX3ZhbHVlLCBsb25nIG1heF92YWx1ZSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE5KSkKK2V4dGVybiBsb25nMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjbGFtcChsb25nMiB2YWx1ZSwgbG9uZzIgbWluX3ZhbHVlLCBsb25nMiBtYXhfdmFsdWUpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOSkpCitleHRlcm4gbG9uZzMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY2xhbXAobG9uZzMgdmFsdWUsIGxvbmczIG1pbl92YWx1ZSwgbG9uZzMgbWF4X3ZhbHVlKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTkpKQorZXh0ZXJuIGxvbmc0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNsYW1wKGxvbmc0IHZhbHVlLCBsb25nNCBtaW5fdmFsdWUsIGxvbmc0IG1heF92YWx1ZSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE5KSkKK2V4dGVybiB1bG9uZyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjbGFtcCh1bG9uZyB2YWx1ZSwgdWxvbmcgbWluX3ZhbHVlLCB1bG9uZyBtYXhfdmFsdWUpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOSkpCitleHRlcm4gdWxvbmcyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNsYW1wKHVsb25nMiB2YWx1ZSwgdWxvbmcyIG1pbl92YWx1ZSwgdWxvbmcyIG1heF92YWx1ZSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE5KSkKK2V4dGVybiB1bG9uZzMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY2xhbXAodWxvbmczIHZhbHVlLCB1bG9uZzMgbWluX3ZhbHVlLCB1bG9uZzMgbWF4X3ZhbHVlKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTkpKQorZXh0ZXJuIHVsb25nNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjbGFtcCh1bG9uZzQgdmFsdWUsIHVsb25nNCBtaW5fdmFsdWUsIHVsb25nNCBtYXhfdmFsdWUpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOSkpCitleHRlcm4gY2hhcjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY2xhbXAoY2hhcjIgdmFsdWUsIGNoYXIgbWluX3ZhbHVlLCBjaGFyIG1heF92YWx1ZSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE5KSkKK2V4dGVybiBjaGFyMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjbGFtcChjaGFyMyB2YWx1ZSwgY2hhciBtaW5fdmFsdWUsIGNoYXIgbWF4X3ZhbHVlKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTkpKQorZXh0ZXJuIGNoYXI0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNsYW1wKGNoYXI0IHZhbHVlLCBjaGFyIG1pbl92YWx1ZSwgY2hhciBtYXhfdmFsdWUpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOSkpCitleHRlcm4gdWNoYXIyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNsYW1wKHVjaGFyMiB2YWx1ZSwgdWNoYXIgbWluX3ZhbHVlLCB1Y2hhciBtYXhfdmFsdWUpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOSkpCitleHRlcm4gdWNoYXIzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNsYW1wKHVjaGFyMyB2YWx1ZSwgdWNoYXIgbWluX3ZhbHVlLCB1Y2hhciBtYXhfdmFsdWUpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOSkpCitleHRlcm4gdWNoYXI0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNsYW1wKHVjaGFyNCB2YWx1ZSwgdWNoYXIgbWluX3ZhbHVlLCB1Y2hhciBtYXhfdmFsdWUpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOSkpCitleHRlcm4gc2hvcnQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNsYW1wKHNob3J0MiB2YWx1ZSwgc2hvcnQgbWluX3ZhbHVlLCBzaG9ydCBtYXhfdmFsdWUpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOSkpCitleHRlcm4gc2hvcnQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNsYW1wKHNob3J0MyB2YWx1ZSwgc2hvcnQgbWluX3ZhbHVlLCBzaG9ydCBtYXhfdmFsdWUpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOSkpCitleHRlcm4gc2hvcnQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNsYW1wKHNob3J0NCB2YWx1ZSwgc2hvcnQgbWluX3ZhbHVlLCBzaG9ydCBtYXhfdmFsdWUpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOSkpCitleHRlcm4gdXNob3J0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjbGFtcCh1c2hvcnQyIHZhbHVlLCB1c2hvcnQgbWluX3ZhbHVlLCB1c2hvcnQgbWF4X3ZhbHVlKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTkpKQorZXh0ZXJuIHVzaG9ydDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY2xhbXAodXNob3J0MyB2YWx1ZSwgdXNob3J0IG1pbl92YWx1ZSwgdXNob3J0IG1heF92YWx1ZSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE5KSkKK2V4dGVybiB1c2hvcnQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNsYW1wKHVzaG9ydDQgdmFsdWUsIHVzaG9ydCBtaW5fdmFsdWUsIHVzaG9ydCBtYXhfdmFsdWUpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOSkpCitleHRlcm4gaW50MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjbGFtcChpbnQyIHZhbHVlLCBpbnQgbWluX3ZhbHVlLCBpbnQgbWF4X3ZhbHVlKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTkpKQorZXh0ZXJuIGludDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY2xhbXAoaW50MyB2YWx1ZSwgaW50IG1pbl92YWx1ZSwgaW50IG1heF92YWx1ZSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE5KSkKK2V4dGVybiBpbnQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNsYW1wKGludDQgdmFsdWUsIGludCBtaW5fdmFsdWUsIGludCBtYXhfdmFsdWUpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOSkpCitleHRlcm4gdWludDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY2xhbXAodWludDIgdmFsdWUsIHVpbnQgbWluX3ZhbHVlLCB1aW50IG1heF92YWx1ZSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE5KSkKK2V4dGVybiB1aW50MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjbGFtcCh1aW50MyB2YWx1ZSwgdWludCBtaW5fdmFsdWUsIHVpbnQgbWF4X3ZhbHVlKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTkpKQorZXh0ZXJuIHVpbnQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNsYW1wKHVpbnQ0IHZhbHVlLCB1aW50IG1pbl92YWx1ZSwgdWludCBtYXhfdmFsdWUpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOSkpCitleHRlcm4gbG9uZzIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY2xhbXAobG9uZzIgdmFsdWUsIGxvbmcgbWluX3ZhbHVlLCBsb25nIG1heF92YWx1ZSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE5KSkKK2V4dGVybiBsb25nMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjbGFtcChsb25nMyB2YWx1ZSwgbG9uZyBtaW5fdmFsdWUsIGxvbmcgbWF4X3ZhbHVlKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTkpKQorZXh0ZXJuIGxvbmc0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNsYW1wKGxvbmc0IHZhbHVlLCBsb25nIG1pbl92YWx1ZSwgbG9uZyBtYXhfdmFsdWUpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOSkpCitleHRlcm4gdWxvbmcyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNsYW1wKHVsb25nMiB2YWx1ZSwgdWxvbmcgbWluX3ZhbHVlLCB1bG9uZyBtYXhfdmFsdWUpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOSkpCitleHRlcm4gdWxvbmczIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNsYW1wKHVsb25nMyB2YWx1ZSwgdWxvbmcgbWluX3ZhbHVlLCB1bG9uZyBtYXhfdmFsdWUpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOSkpCitleHRlcm4gdWxvbmc0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNsYW1wKHVsb25nNCB2YWx1ZSwgdWxvbmcgbWluX3ZhbHVlLCB1bG9uZyBtYXhfdmFsdWUpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjbGFtcChoYWxmIHZhbHVlLCBoYWxmIG1pbl92YWx1ZSwgaGFsZiBtYXhfdmFsdWUpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY2xhbXAoaGFsZjIgdmFsdWUsIGhhbGYyIG1pbl92YWx1ZSwgaGFsZjIgbWF4X3ZhbHVlKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNsYW1wKGhhbGYzIHZhbHVlLCBoYWxmMyBtaW5fdmFsdWUsIGhhbGYzIG1heF92YWx1ZSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjbGFtcChoYWxmNCB2YWx1ZSwgaGFsZjQgbWluX3ZhbHVlLCBoYWxmNCBtYXhfdmFsdWUpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY2xhbXAoaGFsZjIgdmFsdWUsIGhhbGYgbWluX3ZhbHVlLCBoYWxmIG1heF92YWx1ZSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjbGFtcChoYWxmMyB2YWx1ZSwgaGFsZiBtaW5fdmFsdWUsIGhhbGYgbWF4X3ZhbHVlKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGY0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNsYW1wKGhhbGY0IHZhbHVlLCBoYWxmIG1pbl92YWx1ZSwgaGFsZiBtYXhfdmFsdWUpOworI2VuZGlmCisKKy8qCisgKiBjbHo6IE51bWJlciBvZiBsZWFkaW5nIDAgYml0cworICoKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBsZWFkaW5nIDAtYml0cyBpbiBhIHZhbHVlLgorICoKKyAqIEZvciBleGFtcGxlLCBjbHooKGNoYXIpMHgwMykgcmV0dXJucyA2LgorICovCitleHRlcm4gY2hhciBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjbHooY2hhciB2YWx1ZSk7CisKK2V4dGVybiBjaGFyMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjbHooY2hhcjIgdmFsdWUpOworCitleHRlcm4gY2hhcjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY2x6KGNoYXIzIHZhbHVlKTsKKworZXh0ZXJuIGNoYXI0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNseihjaGFyNCB2YWx1ZSk7CisKK2V4dGVybiB1Y2hhciBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjbHoodWNoYXIgdmFsdWUpOworCitleHRlcm4gdWNoYXIyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNseih1Y2hhcjIgdmFsdWUpOworCitleHRlcm4gdWNoYXIzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNseih1Y2hhcjMgdmFsdWUpOworCitleHRlcm4gdWNoYXI0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNseih1Y2hhcjQgdmFsdWUpOworCitleHRlcm4gc2hvcnQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY2x6KHNob3J0IHZhbHVlKTsKKworZXh0ZXJuIHNob3J0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjbHooc2hvcnQyIHZhbHVlKTsKKworZXh0ZXJuIHNob3J0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjbHooc2hvcnQzIHZhbHVlKTsKKworZXh0ZXJuIHNob3J0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjbHooc2hvcnQ0IHZhbHVlKTsKKworZXh0ZXJuIHVzaG9ydCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjbHoodXNob3J0IHZhbHVlKTsKKworZXh0ZXJuIHVzaG9ydDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY2x6KHVzaG9ydDIgdmFsdWUpOworCitleHRlcm4gdXNob3J0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjbHoodXNob3J0MyB2YWx1ZSk7CisKK2V4dGVybiB1c2hvcnQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNseih1c2hvcnQ0IHZhbHVlKTsKKworZXh0ZXJuIGludCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjbHooaW50IHZhbHVlKTsKKworZXh0ZXJuIGludDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY2x6KGludDIgdmFsdWUpOworCitleHRlcm4gaW50MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjbHooaW50MyB2YWx1ZSk7CisKK2V4dGVybiBpbnQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNseihpbnQ0IHZhbHVlKTsKKworZXh0ZXJuIHVpbnQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY2x6KHVpbnQgdmFsdWUpOworCitleHRlcm4gdWludDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY2x6KHVpbnQyIHZhbHVlKTsKKworZXh0ZXJuIHVpbnQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNseih1aW50MyB2YWx1ZSk7CisKK2V4dGVybiB1aW50NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjbHoodWludDQgdmFsdWUpOworCisvKgorICogY29weXNpZ246IENvcGllcyB0aGUgc2lnbiBvZiBhIG51bWJlciB0byBhbm90aGVyCisgKgorICogQ29waWVzIHRoZSBzaWduIGZyb20gc2lnbl92YWx1ZSB0byBtYWduaXR1ZGVfdmFsdWUuCisgKgorICogVGhlIHZhbHVlIHJldHVybmVkIGlzIGVpdGhlciBtYWduaXR1ZGVfdmFsdWUgb3IgLW1hZ25pdHVkZV92YWx1ZS4KKyAqCisgKiBGb3IgZXhhbXBsZSwgY29weXNpZ24oNC4wZiwgLTIuN2YpIHJldHVybnMgLTQuMGYgYW5kIGNvcHlzaWduKC00LjBmLCAyLjdmKSByZXR1cm5zIDQuMGYuCisgKi8KK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb3B5c2lnbihmbG9hdCBtYWduaXR1ZGVfdmFsdWUsIGZsb2F0IHNpZ25fdmFsdWUpOworCitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvcHlzaWduKGZsb2F0MiBtYWduaXR1ZGVfdmFsdWUsIGZsb2F0MiBzaWduX3ZhbHVlKTsKKworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb3B5c2lnbihmbG9hdDMgbWFnbml0dWRlX3ZhbHVlLCBmbG9hdDMgc2lnbl92YWx1ZSk7CisKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29weXNpZ24oZmxvYXQ0IG1hZ25pdHVkZV92YWx1ZSwgZmxvYXQ0IHNpZ25fdmFsdWUpOworCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29weXNpZ24oaGFsZiBtYWduaXR1ZGVfdmFsdWUsIGhhbGYgc2lnbl92YWx1ZSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb3B5c2lnbihoYWxmMiBtYWduaXR1ZGVfdmFsdWUsIGhhbGYyIHNpZ25fdmFsdWUpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29weXNpZ24oaGFsZjMgbWFnbml0dWRlX3ZhbHVlLCBoYWxmMyBzaWduX3ZhbHVlKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGY0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvcHlzaWduKGhhbGY0IG1hZ25pdHVkZV92YWx1ZSwgaGFsZjQgc2lnbl92YWx1ZSk7CisjZW5kaWYKKworLyoKKyAqIGNvczogQ29zaW5lCisgKgorICogUmV0dXJucyB0aGUgY29zaW5lIG9mIGFuIGFuZ2xlIG1lYXN1cmVkIGluIHJhZGlhbnMuCisgKgorICogU2VlIGFsc28gbmF0aXZlX2NvcygpLgorICovCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29zKGZsb2F0IHYpOworCitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvcyhmbG9hdDIgdik7CisKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29zKGZsb2F0MyB2KTsKKworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb3MoZmxvYXQ0IHYpOworCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29zKGhhbGYgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb3MoaGFsZjIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb3MoaGFsZjMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb3MoaGFsZjQgdik7CisjZW5kaWYKKworLyoKKyAqIGNvc2g6IEh5cGVib2xpYyBjb3NpbmUKKyAqCisgKiBSZXR1cm5zIHRoZSBoeXBlYm9saWMgY29zaW5lIG9mIHYsIHdoZXJlIHYgaXMgbWVhc3VyZWQgaW4gcmFkaWFucy4KKyAqCisgKiBTZWUgYWxzbyBuYXRpdmVfY29zaCgpLgorICovCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29zaChmbG9hdCB2KTsKKworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb3NoKGZsb2F0MiB2KTsKKworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb3NoKGZsb2F0MyB2KTsKKworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb3NoKGZsb2F0NCB2KTsKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvc2goaGFsZiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvc2goaGFsZjIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb3NoKGhhbGYzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29zaChoYWxmNCB2KTsKKyNlbmRpZgorCisvKgorICogY29zcGk6IENvc2luZSBvZiBhIG51bWJlciBtdWx0aXBsaWVkIGJ5IHBpCisgKgorICogUmV0dXJucyB0aGUgY29zaW5lIG9mICh2ICogcGkpLCB3aGVyZSAodiAqIHBpKSBpcyBtZWFzdXJlZCBpbiByYWRpYW5zLgorICoKKyAqIFRvIGdldCB0aGUgY29zaW5lIG9mIGEgdmFsdWUgbWVhc3VyZWQgaW4gZGVncmVlcywgY2FsbCBjb3NwaSh2IC8gMTgwLmYpLgorICoKKyAqIFNlZSBhbHNvIG5hdGl2ZV9jb3NwaSgpLgorICovCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29zcGkoZmxvYXQgdik7CisKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29zcGkoZmxvYXQyIHYpOworCitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvc3BpKGZsb2F0MyB2KTsKKworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb3NwaShmbG9hdDQgdik7CisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb3NwaShoYWxmIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY29zcGkoaGFsZjIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjb3NwaShoYWxmMyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGY0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNvc3BpKGhhbGY0IHYpOworI2VuZGlmCisKKy8qCisgKiBkZWdyZWVzOiBDb252ZXJ0cyByYWRpYW5zIGludG8gZGVncmVlcworICoKKyAqIENvbnZlcnRzIGZyb20gcmFkaWFucyB0byBkZWdyZWVzLgorICovCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZGVncmVlcyhmbG9hdCB2KTsKKworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBkZWdyZWVzKGZsb2F0MiB2KTsKKworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBkZWdyZWVzKGZsb2F0MyB2KTsKKworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBkZWdyZWVzKGZsb2F0NCB2KTsKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGRlZ3JlZXMoaGFsZiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGRlZ3JlZXMoaGFsZjIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBkZWdyZWVzKGhhbGYzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZGVncmVlcyhoYWxmNCB2KTsKKyNlbmRpZgorCisvKgorICogZXJmOiBNYXRoZW1hdGljYWwgZXJyb3IgZnVuY3Rpb24KKyAqCisgKiBSZXR1cm5zIHRoZSBlcnJvciBmdW5jdGlvbi4KKyAqLworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGVyZihmbG9hdCB2KTsKKworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBlcmYoZmxvYXQyIHYpOworCitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGVyZihmbG9hdDMgdik7CisKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZXJmKGZsb2F0NCB2KTsKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGVyZihoYWxmIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZXJmKGhhbGYyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZXJmKGhhbGYzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZXJmKGhhbGY0IHYpOworI2VuZGlmCisKKy8qCisgKiBlcmZjOiBNYXRoZW1hdGljYWwgY29tcGxlbWVudGFyeSBlcnJvciBmdW5jdGlvbgorICoKKyAqIFJldHVybnMgdGhlIGNvbXBsZW1lbnRhcnkgZXJyb3IgZnVuY3Rpb24uCisgKi8KK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBlcmZjKGZsb2F0IHYpOworCitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGVyZmMoZmxvYXQyIHYpOworCitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGVyZmMoZmxvYXQzIHYpOworCitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGVyZmMoZmxvYXQ0IHYpOworCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZXJmYyhoYWxmIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZXJmYyhoYWxmMiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGVyZmMoaGFsZjMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBlcmZjKGhhbGY0IHYpOworI2VuZGlmCisKKy8qCisgKiBleHA6IGUgcmFpc2VkIHRvIGEgbnVtYmVyCisgKgorICogUmV0dXJucyBlIHJhaXNlZCB0byB2LCBpLmUuIGUgXiB2LgorICoKKyAqIFNlZSBhbHNvIG5hdGl2ZV9leHAoKS4KKyAqLworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGV4cChmbG9hdCB2KTsKKworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBleHAoZmxvYXQyIHYpOworCitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGV4cChmbG9hdDMgdik7CisKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZXhwKGZsb2F0NCB2KTsKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGV4cChoYWxmIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZXhwKGhhbGYyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZXhwKGhhbGYzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZXhwKGhhbGY0IHYpOworI2VuZGlmCisKKy8qCisgKiBleHAxMDogMTAgcmFpc2VkIHRvIGEgbnVtYmVyCisgKgorICogUmV0dXJucyAxMCByYWlzZWQgdG8gdiwgaS5lLiAxMC5mIF4gdi4KKyAqCisgKiBTZWUgYWxzbyBuYXRpdmVfZXhwMTAoKS4KKyAqLworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGV4cDEwKGZsb2F0IHYpOworCitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGV4cDEwKGZsb2F0MiB2KTsKKworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBleHAxMChmbG9hdDMgdik7CisKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZXhwMTAoZmxvYXQ0IHYpOworCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZXhwMTAoaGFsZiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGV4cDEwKGhhbGYyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZXhwMTAoaGFsZjMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBleHAxMChoYWxmNCB2KTsKKyNlbmRpZgorCisvKgorICogZXhwMjogMiByYWlzZWQgdG8gYSBudW1iZXIKKyAqCisgKiBSZXR1cm5zIDIgcmFpc2VkIHRvIHYsIGkuZS4gMi5mIF4gdi4KKyAqCisgKiBTZWUgYWxzbyBuYXRpdmVfZXhwMigpLgorICovCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZXhwMihmbG9hdCB2KTsKKworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBleHAyKGZsb2F0MiB2KTsKKworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBleHAyKGZsb2F0MyB2KTsKKworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBleHAyKGZsb2F0NCB2KTsKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGV4cDIoaGFsZiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGV4cDIoaGFsZjIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBleHAyKGhhbGYzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZXhwMihoYWxmNCB2KTsKKyNlbmRpZgorCisvKgorICogZXhwbTE6IGUgcmFpc2VkIHRvIGEgbnVtYmVyIG1pbnVzIG9uZQorICoKKyAqIFJldHVybnMgZSByYWlzZWQgdG8gdiBtaW51cyAxLCBpLmUuIChlIF4gdikgLSAxLgorICoKKyAqIFNlZSBhbHNvIG5hdGl2ZV9leHBtMSgpLgorICovCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZXhwbTEoZmxvYXQgdik7CisKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZXhwbTEoZmxvYXQyIHYpOworCitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGV4cG0xKGZsb2F0MyB2KTsKKworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBleHBtMShmbG9hdDQgdik7CisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBleHBtMShoYWxmIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZXhwbTEoaGFsZjIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBleHBtMShoYWxmMyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGY0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGV4cG0xKGhhbGY0IHYpOworI2VuZGlmCisKKy8qCisgKiBmYWJzOiBBYnNvbHV0ZSB2YWx1ZSBvZiBhIGZsb2F0CisgKgorICogUmV0dXJucyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIGZsb2F0IHYuCisgKgorICogRm9yIGludGVnZXJzLCB1c2UgYWJzKCkuCisgKi8KK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBmYWJzKGZsb2F0IHYpOworCitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGZhYnMoZmxvYXQyIHYpOworCitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGZhYnMoZmxvYXQzIHYpOworCitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGZhYnMoZmxvYXQ0IHYpOworCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZmFicyhoYWxmIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZmFicyhoYWxmMiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGZhYnMoaGFsZjMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBmYWJzKGhhbGY0IHYpOworI2VuZGlmCisKKy8qCisgKiBmZGltOiBQb3NpdGl2ZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIHZhbHVlcworICoKKyAqIFJldHVybnMgdGhlIHBvc2l0aXZlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gdmFsdWVzLgorICoKKyAqIElmIGEgPiBiLCByZXR1cm5zIChhIC0gYikgb3RoZXJ3aXNlIHJldHVybnMgMGYuCisgKi8KK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBmZGltKGZsb2F0IGEsIGZsb2F0IGIpOworCitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGZkaW0oZmxvYXQyIGEsIGZsb2F0MiBiKTsKKworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBmZGltKGZsb2F0MyBhLCBmbG9hdDMgYik7CisKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZmRpbShmbG9hdDQgYSwgZmxvYXQ0IGIpOworCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZmRpbShoYWxmIGEsIGhhbGYgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBmZGltKGhhbGYyIGEsIGhhbGYyIGIpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZmRpbShoYWxmMyBhLCBoYWxmMyBiKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGY0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGZkaW0oaGFsZjQgYSwgaGFsZjQgYik7CisjZW5kaWYKKworLyoKKyAqIGZsb29yOiBTbWFsbGVzdCBpbnRlZ2VyIG5vdCBncmVhdGVyIHRoYW4gYSB2YWx1ZQorICoKKyAqIFJldHVybnMgdGhlIHNtYWxsZXN0IGludGVnZXIgbm90IGdyZWF0ZXIgdGhhbiBhIHZhbHVlLgorICoKKyAqIEZvciBleGFtcGxlLCBmbG9vcigxLjJmKSByZXR1cm5zIDEuZiwgYW5kIGZsb29yKC0xLjJmKSByZXR1cm5zIC0yLmYuCisgKgorICogU2VlIGFsc28gY2VpbCgpLgorICovCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZmxvb3IoZmxvYXQgdik7CisKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZmxvb3IoZmxvYXQyIHYpOworCitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGZsb29yKGZsb2F0MyB2KTsKKworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBmbG9vcihmbG9hdDQgdik7CisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBmbG9vcihoYWxmIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZmxvb3IoaGFsZjIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBmbG9vcihoYWxmMyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGY0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGZsb29yKGhhbGY0IHYpOworI2VuZGlmCisKKy8qCisgKiBmbWE6IE11bHRpcGx5IGFuZCBhZGQKKyAqCisgKiBNdWx0aXBseSBhbmQgYWRkLiAgUmV0dXJucyAobXVsdGlwbGljYW5kMSAqIG11bHRpcGxpY2FuZDIpICsgb2Zmc2V0LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byBtYWQoKS4gIGZtYSgpIHJldGFpbnMgZnVsbCBwcmVjaXNpb24gb2YgdGhlIG11bHRpcGxpZWQgcmVzdWx0CisgKiBhbmQgcm91bmRzIG9ubHkgYWZ0ZXIgdGhlIGFkZGl0aW9uLiAgbWFkKCkgcm91bmRzIGFmdGVyIHRoZSBtdWx0aXBsaWNhdGlvbiBhbmQgdGhlIGFkZGl0aW9uLgorICogVGhpcyBleHRyYSBwcmVjaXNpb24gaXMgbm90IGd1YXJhbnRlZWQgaW4gcnNfZnBfcmVsYXhlZCBtb2RlLgorICovCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZm1hKGZsb2F0IG11bHRpcGxpY2FuZDEsIGZsb2F0IG11bHRpcGxpY2FuZDIsIGZsb2F0IG9mZnNldCk7CisKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZm1hKGZsb2F0MiBtdWx0aXBsaWNhbmQxLCBmbG9hdDIgbXVsdGlwbGljYW5kMiwgZmxvYXQyIG9mZnNldCk7CisKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZm1hKGZsb2F0MyBtdWx0aXBsaWNhbmQxLCBmbG9hdDMgbXVsdGlwbGljYW5kMiwgZmxvYXQzIG9mZnNldCk7CisKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZm1hKGZsb2F0NCBtdWx0aXBsaWNhbmQxLCBmbG9hdDQgbXVsdGlwbGljYW5kMiwgZmxvYXQ0IG9mZnNldCk7CisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBmbWEoaGFsZiBtdWx0aXBsaWNhbmQxLCBoYWxmIG11bHRpcGxpY2FuZDIsIGhhbGYgb2Zmc2V0KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGZtYShoYWxmMiBtdWx0aXBsaWNhbmQxLCBoYWxmMiBtdWx0aXBsaWNhbmQyLCBoYWxmMiBvZmZzZXQpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZm1hKGhhbGYzIG11bHRpcGxpY2FuZDEsIGhhbGYzIG11bHRpcGxpY2FuZDIsIGhhbGYzIG9mZnNldCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBmbWEoaGFsZjQgbXVsdGlwbGljYW5kMSwgaGFsZjQgbXVsdGlwbGljYW5kMiwgaGFsZjQgb2Zmc2V0KTsKKyNlbmRpZgorCisvKgorICogZm1heDogTWF4aW11bSBvZiB0d28gZmxvYXRzCisgKgorICogUmV0dXJucyB0aGUgbWF4aW11bSBvZiBhIGFuZCBiLCBpLmUuIChhIDwgYiA/IGIgOiBhKS4KKyAqCisgKiBUaGUgbWF4KCkgZnVuY3Rpb24gcmV0dXJucyBpZGVudGljYWwgcmVzdWx0cyBidXQgY2FuIGJlIGFwcGxpZWQgdG8gbW9yZSBkYXRhIHR5cGVzLgorICovCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZm1heChmbG9hdCBhLCBmbG9hdCBiKTsKKworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBmbWF4KGZsb2F0MiBhLCBmbG9hdDIgYik7CisKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZm1heChmbG9hdDMgYSwgZmxvYXQzIGIpOworCitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGZtYXgoZmxvYXQ0IGEsIGZsb2F0NCBiKTsKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGZtYXgoaGFsZiBhLCBoYWxmIGIpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZm1heChoYWxmMiBhLCBoYWxmMiBiKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGZtYXgoaGFsZjMgYSwgaGFsZjMgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBmbWF4KGhhbGY0IGEsIGhhbGY0IGIpOworI2VuZGlmCisKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZm1heChmbG9hdDIgYSwgZmxvYXQgYik7CisKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZm1heChmbG9hdDMgYSwgZmxvYXQgYik7CisKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZm1heChmbG9hdDQgYSwgZmxvYXQgYik7CisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZm1heChoYWxmMiBhLCBoYWxmIGIpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZm1heChoYWxmMyBhLCBoYWxmIGIpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZm1heChoYWxmNCBhLCBoYWxmIGIpOworI2VuZGlmCisKKy8qCisgKiBmbWluOiBNaW5pbXVtIG9mIHR3byBmbG9hdHMKKyAqCisgKiBSZXR1cm5zIHRoZSBtaW5pbXVtIG9mIGEgYW5kIGIsIGkuZS4gKGEgPiBiID8gYiA6IGEpLgorICoKKyAqIFRoZSBtaW4oKSBmdW5jdGlvbiByZXR1cm5zIGlkZW50aWNhbCByZXN1bHRzIGJ1dCBjYW4gYmUgYXBwbGllZCB0byBtb3JlIGRhdGEgdHlwZXMuCisgKi8KK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBmbWluKGZsb2F0IGEsIGZsb2F0IGIpOworCitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGZtaW4oZmxvYXQyIGEsIGZsb2F0MiBiKTsKKworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBmbWluKGZsb2F0MyBhLCBmbG9hdDMgYik7CisKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZm1pbihmbG9hdDQgYSwgZmxvYXQ0IGIpOworCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZm1pbihoYWxmIGEsIGhhbGYgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBmbWluKGhhbGYyIGEsIGhhbGYyIGIpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZm1pbihoYWxmMyBhLCBoYWxmMyBiKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGY0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGZtaW4oaGFsZjQgYSwgaGFsZjQgYik7CisjZW5kaWYKKworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBmbWluKGZsb2F0MiBhLCBmbG9hdCBiKTsKKworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBmbWluKGZsb2F0MyBhLCBmbG9hdCBiKTsKKworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBmbWluKGZsb2F0NCBhLCBmbG9hdCBiKTsKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBmbWluKGhhbGYyIGEsIGhhbGYgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBmbWluKGhhbGYzIGEsIGhhbGYgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBmbWluKGhhbGY0IGEsIGhhbGYgYik7CisjZW5kaWYKKworLyoKKyAqIGZtb2Q6IE1vZHVsbworICoKKyAqIFJldHVybnMgdGhlIHJlbWFpbmRlciBvZiAobnVtZXJhdG9yIC8gZGVub21pbmF0b3IpLCB3aGVyZSB0aGUgcXVvdGllbnQgaXMgcm91bmRlZCB0b3dhcmRzIHplcm8uCisgKgorICogVGhlIGZ1bmN0aW9uIHJlbWFpbmRlcigpIGlzIHNpbWlsYXIgYnV0IHJvdW5kcyB0b3dhcmQgdGhlIGNsb3Nlc3QgaW50ZXJnZXIuCisgKiBGb3IgZXhhbXBsZSwgZm1vZCgtMy44ZiwgMi5mKSByZXR1cm5zIC0xLjhmICgtMy44ZiAtIC0xLmYgKiAyLmYpCisgKiB3aGlsZSByZW1haW5kZXIoLTMuOGYsIDIuZikgcmV0dXJucyAwLjJmICgtMy44ZiAtIC0yLmYgKiAyLmYpLgorICovCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZm1vZChmbG9hdCBudW1lcmF0b3IsIGZsb2F0IGRlbm9taW5hdG9yKTsKKworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBmbW9kKGZsb2F0MiBudW1lcmF0b3IsIGZsb2F0MiBkZW5vbWluYXRvcik7CisKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZm1vZChmbG9hdDMgbnVtZXJhdG9yLCBmbG9hdDMgZGVub21pbmF0b3IpOworCitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGZtb2QoZmxvYXQ0IG51bWVyYXRvciwgZmxvYXQ0IGRlbm9taW5hdG9yKTsKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGZtb2QoaGFsZiBudW1lcmF0b3IsIGhhbGYgZGVub21pbmF0b3IpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZm1vZChoYWxmMiBudW1lcmF0b3IsIGhhbGYyIGRlbm9taW5hdG9yKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGZtb2QoaGFsZjMgbnVtZXJhdG9yLCBoYWxmMyBkZW5vbWluYXRvcik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBmbW9kKGhhbGY0IG51bWVyYXRvciwgaGFsZjQgZGVub21pbmF0b3IpOworI2VuZGlmCisKKy8qCisgKiBmcmFjdDogUG9zaXRpdmUgZnJhY3Rpb25hbCBwYXJ0CisgKgorICogUmV0dXJucyB0aGUgcG9zaXRpdmUgZnJhY3Rpb25hbCBwYXJ0IG9mIHYsIGkuZS4gdiAtIGZsb29yKHYpLgorICoKKyAqIEZvciBleGFtcGxlLCBmcmFjdCgxLjNmLCAmdmFsKSByZXR1cm5zIDAuM2YgYW5kIHNldHMgdmFsIHRvIDEuZi4KKyAqIGZyYWN0KC0xLjNmLCAmdmFsKSByZXR1cm5zIDAuN2YgYW5kIHNldHMgdmFsIHRvIC0yLmYuCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgdjogSW5wdXQgdmFsdWUuCisgKiAgIGZsb29yOiBJZiBmbG9vciBpcyBub3QgbnVsbCwgKmZsb29yIHdpbGwgYmUgc2V0IHRvIHRoZSBmbG9vciBvZiB2LgorICovCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICBmcmFjdChmbG9hdCB2LCBmbG9hdCogZmxvb3IpOworCitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgZnJhY3QoZmxvYXQyIHYsIGZsb2F0MiogZmxvb3IpOworCitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgZnJhY3QoZmxvYXQzIHYsIGZsb2F0MyogZmxvb3IpOworCitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgZnJhY3QoZmxvYXQ0IHYsIGZsb2F0NCogZmxvb3IpOworCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMjMpCitzdGF0aWMgaW5saW5lIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGZyYWN0KGZsb2F0IHYpIHsKKyAgICBmbG9hdCB1bnVzZWQ7CisgICAgcmV0dXJuIGZyYWN0KHYsICZ1bnVzZWQpOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAyMykKK3N0YXRpYyBpbmxpbmUgZmxvYXQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGZyYWN0KGZsb2F0MiB2KSB7CisgICAgZmxvYXQyIHVudXNlZDsKKyAgICByZXR1cm4gZnJhY3QodiwgJnVudXNlZCk7Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDIzKQorc3RhdGljIGlubGluZSBmbG9hdDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZnJhY3QoZmxvYXQzIHYpIHsKKyAgICBmbG9hdDMgdW51c2VkOworICAgIHJldHVybiBmcmFjdCh2LCAmdW51c2VkKTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMjMpCitzdGF0aWMgaW5saW5lIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBmcmFjdChmbG9hdDQgdikgeworICAgIGZsb2F0NCB1bnVzZWQ7CisgICAgcmV0dXJuIGZyYWN0KHYsICZ1bnVzZWQpOworfQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICBmcmFjdChmbG9hdCB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIGZyYWN0KGZsb2F0MiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIGZyYWN0KGZsb2F0MyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIGZyYWN0KGZsb2F0NCB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICBmcmFjdChoYWxmIHYsIGhhbGYqIGZsb29yKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgZnJhY3QoaGFsZjIgdiwgaGFsZjIqIGZsb29yKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgZnJhY3QoaGFsZjMgdiwgaGFsZjMqIGZsb29yKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGY0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgZnJhY3QoaGFsZjQgdiwgaGFsZjQqIGZsb29yKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICBmcmFjdChoYWxmIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICBmcmFjdChoYWxmMiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgZnJhY3QoaGFsZjMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmNCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIGZyYWN0KGhhbGY0IHYpOworI2VuZGlmCisKKy8qCisgKiBmcmV4cDogQmluYXJ5IG1hbnRpc3NhIGFuZCBleHBvbmVudAorICoKKyAqIFJldHVybnMgdGhlIGJpbmFyeSBtYW50aXNzYSBhbmQgZXhwb25lbnQgb2YgdiwgaS5lLiB2ID09IG1hbnRpc3NhICogMiBeIGV4cG9uZW50LgorICoKKyAqIFRoZSBtYW50aXNzYSBpcyBhbHdheXMgYmV0d2VlbiAwLjUgKGluY2x1c2l2ZSkgYW5kIDEuMCAoZXhjbHVzaXZlKS4KKyAqCisgKiBTZWUgbGRleHAoKSBmb3IgdGhlIHJldmVyc2Ugb3BlcmF0aW9uLiAgU2VlIGFsc28gbG9nYigpIGFuZCBpbG9nYigpLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgIHY6IElucHV0IHZhbHVlLgorICogICBleHBvbmVudDogSWYgZXhwb25lbnQgaXMgbm90IG51bGwsICpleHBvbmVudCB3aWxsIGJlIHNldCB0byB0aGUgZXhwb25lbnQgb2Ygdi4KKyAqLworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgZnJleHAoZmxvYXQgdiwgaW50KiBleHBvbmVudCk7CisKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICBmcmV4cChmbG9hdDIgdiwgaW50MiogZXhwb25lbnQpOworCitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgZnJleHAoZmxvYXQzIHYsIGludDMqIGV4cG9uZW50KTsKKworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIGZyZXhwKGZsb2F0NCB2LCBpbnQ0KiBleHBvbmVudCk7CisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIGZyZXhwKGhhbGYgdiwgaW50KiBleHBvbmVudCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIGZyZXhwKGhhbGYyIHYsIGludDIqIGV4cG9uZW50KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgZnJleHAoaGFsZjMgdiwgaW50MyogZXhwb25lbnQpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICBmcmV4cChoYWxmNCB2LCBpbnQ0KiBleHBvbmVudCk7CisjZW5kaWYKKworLyoKKyAqIGhhbGZfcmVjaXA6IFJlY2lwcm9jYWwgY29tcHV0ZWQgdG8gMTYgYml0IHByZWNpc2lvbgorICoKKyAqIFJldHVybnMgdGhlIGFwcHJveGltYXRlIHJlY2lwcm9jYWwgb2YgYSB2YWx1ZS4KKyAqCisgKiBUaGUgcHJlY2lzaW9uIGlzIHRoYXQgb2YgYSAxNiBiaXQgZmxvYXRpbmcgcG9pbnQgdmFsdWUuCisgKgorICogU2VlIGFsc28gbmF0aXZlX3JlY2lwKCkuCisgKi8KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxNykpCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgaGFsZl9yZWNpcChmbG9hdCB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTcpKQorZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBoYWxmX3JlY2lwKGZsb2F0MiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTcpKQorZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBoYWxmX3JlY2lwKGZsb2F0MyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTcpKQorZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBoYWxmX3JlY2lwKGZsb2F0NCB2KTsKKyNlbmRpZgorCisvKgorICogaGFsZl9yc3FydDogUmVjaXByb2NhbCBvZiBhIHNxdWFyZSByb290IGNvbXB1dGVkIHRvIDE2IGJpdCBwcmVjaXNpb24KKyAqCisgKiBSZXR1cm5zIHRoZSBhcHByb3hpbWF0ZSB2YWx1ZSBvZiAoMS5mIC8gc3FydCh2YWx1ZSkpLgorICoKKyAqIFRoZSBwcmVjaXNpb24gaXMgdGhhdCBvZiBhIDE2IGJpdCBmbG9hdGluZyBwb2ludCB2YWx1ZS4KKyAqCisgKiBTZWUgYWxzbyByc3FydCgpLCBuYXRpdmVfcnNxcnQoKS4KKyAqLworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE3KSkKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBoYWxmX3JzcXJ0KGZsb2F0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxNykpCitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGhhbGZfcnNxcnQoZmxvYXQyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxNykpCitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGhhbGZfcnNxcnQoZmxvYXQzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxNykpCitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGhhbGZfcnNxcnQoZmxvYXQ0IHYpOworI2VuZGlmCisKKy8qCisgKiBoYWxmX3NxcnQ6IFNxdWFyZSByb290IGNvbXB1dGVkIHRvIDE2IGJpdCBwcmVjaXNpb24KKyAqCisgKiBSZXR1cm5zIHRoZSBhcHByb3hpbWF0ZSBzcXVhcmUgcm9vdCBvZiBhIHZhbHVlLgorICoKKyAqIFRoZSBwcmVjaXNpb24gaXMgdGhhdCBvZiBhIDE2IGJpdCBmbG9hdGluZyBwb2ludCB2YWx1ZS4KKyAqCisgKiBTZWUgYWxzbyBzcXJ0KCksIG5hdGl2ZV9zcXJ0KCkuCisgKi8KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxNykpCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgaGFsZl9zcXJ0KGZsb2F0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxNykpCitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGhhbGZfc3FydChmbG9hdDIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE3KSkKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgaGFsZl9zcXJ0KGZsb2F0MyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTcpKQorZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBoYWxmX3NxcnQoZmxvYXQ0IHYpOworI2VuZGlmCisKKy8qCisgKiBoeXBvdDogSHlwb3RlbnVzZQorICoKKyAqIFJldHVybnMgdGhlIGh5cG90ZW51c2UsIGkuZS4gc3FydChhICogYSArIGIgKiBiKS4KKyAqCisgKiBTZWUgYWxzbyBuYXRpdmVfaHlwb3QoKS4KKyAqLworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGh5cG90KGZsb2F0IGEsIGZsb2F0IGIpOworCitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGh5cG90KGZsb2F0MiBhLCBmbG9hdDIgYik7CisKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgaHlwb3QoZmxvYXQzIGEsIGZsb2F0MyBiKTsKKworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBoeXBvdChmbG9hdDQgYSwgZmxvYXQ0IGIpOworCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgaHlwb3QoaGFsZiBhLCBoYWxmIGIpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgaHlwb3QoaGFsZjIgYSwgaGFsZjIgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBoeXBvdChoYWxmMyBhLCBoYWxmMyBiKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGY0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGh5cG90KGhhbGY0IGEsIGhhbGY0IGIpOworI2VuZGlmCisKKy8qCisgKiBpbG9nYjogQmFzZSB0d28gZXhwb25lbnQKKyAqCisgKiBSZXR1cm5zIHRoZSBiYXNlIHR3byBleHBvbmVudCBvZiBhIHZhbHVlLCB3aGVyZSB0aGUgbWFudGlzc2EgaXMgYmV0d2VlbgorICogMS5mIChpbmNsdXNpdmUpIGFuZCAyLmYgKGV4Y2x1c2l2ZSkuCisgKgorICogRm9yIGV4YW1wbGUsIGlsb2diKDguNWYpIHJldHVybnMgMy4KKyAqCisgKiBCZWNhdXNlIG9mIHRoZSBkaWZmZXJlbmNlIGluIG1hbnRpc3NhLCB0aGlzIG51bWJlciBpcyBvbmUgbGVzcyB0aGFuIGlzIHJldHVybmVkIGJ5IGZyZXhwKCkuCisgKgorICogbG9nYigpIGlzIHNpbWlsYXIgYnV0IHJldHVybnMgYSBmbG9hdC4KKyAqLworZXh0ZXJuIGludCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBpbG9nYihmbG9hdCB2KTsKKworZXh0ZXJuIGludDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgaWxvZ2IoZmxvYXQyIHYpOworCitleHRlcm4gaW50MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBpbG9nYihmbG9hdDMgdik7CisKK2V4dGVybiBpbnQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGlsb2diKGZsb2F0NCB2KTsKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBpbnQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgaWxvZ2IoaGFsZiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGludDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgaWxvZ2IoaGFsZjIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBpbnQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGlsb2diKGhhbGYzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaW50NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBpbG9nYihoYWxmNCB2KTsKKyNlbmRpZgorCisvKgorICogbGRleHA6IENyZWF0ZXMgYSBmbG9hdGluZyBwb2ludCBmcm9tIG1hbnRpc3NhIGFuZCBleHBvbmVudAorICoKKyAqIFJldHVybnMgdGhlIGZsb2F0aW5nIHBvaW50IGNyZWF0ZWQgZnJvbSB0aGUgbWFudGlzc2EgYW5kIGV4cG9uZW50LAorICogaS5lLiAobWFudGlzc2EgKiAyIF4gZXhwb25lbnQpLgorICoKKyAqIFNlZSBmcmV4cCgpIGZvciB0aGUgcmV2ZXJzZSBvcGVyYXRpb24uCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgbWFudGlzc2E6IE1hbnRpc3NhLgorICogICBleHBvbmVudDogRXhwb25lbnQsIGEgc2luZ2xlIGNvbXBvbmVudCBvciBtYXRjaGluZyB2ZWN0b3IuCisgKi8KK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBsZGV4cChmbG9hdCBtYW50aXNzYSwgaW50IGV4cG9uZW50KTsKKworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBsZGV4cChmbG9hdDIgbWFudGlzc2EsIGludDIgZXhwb25lbnQpOworCitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGxkZXhwKGZsb2F0MyBtYW50aXNzYSwgaW50MyBleHBvbmVudCk7CisKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbGRleHAoZmxvYXQ0IG1hbnRpc3NhLCBpbnQ0IGV4cG9uZW50KTsKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGxkZXhwKGhhbGYgbWFudGlzc2EsIGludCBleHBvbmVudCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBsZGV4cChoYWxmMiBtYW50aXNzYSwgaW50MiBleHBvbmVudCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBsZGV4cChoYWxmMyBtYW50aXNzYSwgaW50MyBleHBvbmVudCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBsZGV4cChoYWxmNCBtYW50aXNzYSwgaW50NCBleHBvbmVudCk7CisjZW5kaWYKKworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBsZGV4cChmbG9hdDIgbWFudGlzc2EsIGludCBleHBvbmVudCk7CisKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbGRleHAoZmxvYXQzIG1hbnRpc3NhLCBpbnQgZXhwb25lbnQpOworCitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGxkZXhwKGZsb2F0NCBtYW50aXNzYSwgaW50IGV4cG9uZW50KTsKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBsZGV4cChoYWxmMiBtYW50aXNzYSwgaW50IGV4cG9uZW50KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGxkZXhwKGhhbGYzIG1hbnRpc3NhLCBpbnQgZXhwb25lbnQpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbGRleHAoaGFsZjQgbWFudGlzc2EsIGludCBleHBvbmVudCk7CisjZW5kaWYKKworLyoKKyAqIGxnYW1tYTogTmF0dXJhbCBsb2dhcml0aG0gb2YgdGhlIGdhbW1hIGZ1bmN0aW9uCisgKgorICogUmV0dXJucyB0aGUgbmF0dXJhbCBsb2dhcml0aG0gb2YgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBnYW1tYSBmdW5jdGlvbiwKKyAqIGkuZS4gbG9nKGZhYnModGdhbW1hKHYpKSkuCisgKgorICogU2VlIGFsc28gdGdhbW1hKCkuCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgc2lnbl9vZl9nYW1tYTogSWYgc2lnbl9vZl9nYW1tYSBpcyBub3QgbnVsbCwgKnNpZ25fb2ZfZ2FtbWEgd2lsbCBiZSBzZXQgdG8gLTEuZiBpZiB0aGUgZ2FtbWEgb2YgdiBpcyBuZWdhdGl2ZSwgb3RoZXJ3aXNlIHRvIDEuZi4KKyAqLworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGxnYW1tYShmbG9hdCB2KTsKKworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBsZ2FtbWEoZmxvYXQyIHYpOworCitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGxnYW1tYShmbG9hdDMgdik7CisKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbGdhbW1hKGZsb2F0NCB2KTsKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGxnYW1tYShoYWxmIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbGdhbW1hKGhhbGYyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbGdhbW1hKGhhbGYzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbGdhbW1hKGhhbGY0IHYpOworI2VuZGlmCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIGxnYW1tYShmbG9hdCB2LCBpbnQqIHNpZ25fb2ZfZ2FtbWEpOworCitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgbGdhbW1hKGZsb2F0MiB2LCBpbnQyKiBzaWduX29mX2dhbW1hKTsKKworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIGxnYW1tYShmbG9hdDMgdiwgaW50Myogc2lnbl9vZl9nYW1tYSk7CisKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICBsZ2FtbWEoZmxvYXQ0IHYsIGludDQqIHNpZ25fb2ZfZ2FtbWEpOworCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICBsZ2FtbWEoaGFsZiB2LCBpbnQqIHNpZ25fb2ZfZ2FtbWEpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICBsZ2FtbWEoaGFsZjIgdiwgaW50Miogc2lnbl9vZl9nYW1tYSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIGxnYW1tYShoYWxmMyB2LCBpbnQzKiBzaWduX29mX2dhbW1hKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGY0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgbGdhbW1hKGhhbGY0IHYsIGludDQqIHNpZ25fb2ZfZ2FtbWEpOworI2VuZGlmCisKKy8qCisgKiBsb2c6IE5hdHVyYWwgbG9nYXJpdGhtCisgKgorICogUmV0dXJucyB0aGUgbmF0dXJhbCBsb2dhcml0aG0uCisgKgorICogU2VlIGFsc28gbmF0aXZlX2xvZygpLgorICovCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbG9nKGZsb2F0IHYpOworCitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGxvZyhmbG9hdDIgdik7CisKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbG9nKGZsb2F0MyB2KTsKKworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBsb2coZmxvYXQ0IHYpOworCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbG9nKGhhbGYgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBsb2coaGFsZjIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBsb2coaGFsZjMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBsb2coaGFsZjQgdik7CisjZW5kaWYKKworLyoKKyAqIGxvZzEwOiBCYXNlIDEwIGxvZ2FyaXRobQorICoKKyAqIFJldHVybnMgdGhlIGJhc2UgMTAgbG9nYXJpdGhtLgorICoKKyAqIFNlZSBhbHNvIG5hdGl2ZV9sb2cxMCgpLgorICovCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbG9nMTAoZmxvYXQgdik7CisKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbG9nMTAoZmxvYXQyIHYpOworCitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGxvZzEwKGZsb2F0MyB2KTsKKworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBsb2cxMChmbG9hdDQgdik7CisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBsb2cxMChoYWxmIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbG9nMTAoaGFsZjIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBsb2cxMChoYWxmMyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGY0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGxvZzEwKGhhbGY0IHYpOworI2VuZGlmCisKKy8qCisgKiBsb2cxcDogTmF0dXJhbCBsb2dhcml0aG0gb2YgYSB2YWx1ZSBwbHVzIDEKKyAqCisgKiBSZXR1cm5zIHRoZSBuYXR1cmFsIGxvZ2FyaXRobSBvZiAodiArIDEuZikuCisgKgorICogU2VlIGFsc28gbmF0aXZlX2xvZzFwKCkuCisgKi8KK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBsb2cxcChmbG9hdCB2KTsKKworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBsb2cxcChmbG9hdDIgdik7CisKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbG9nMXAoZmxvYXQzIHYpOworCitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGxvZzFwKGZsb2F0NCB2KTsKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGxvZzFwKGhhbGYgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBsb2cxcChoYWxmMiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGxvZzFwKGhhbGYzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbG9nMXAoaGFsZjQgdik7CisjZW5kaWYKKworLyoKKyAqIGxvZzI6IEJhc2UgMiBsb2dhcml0aG0KKyAqCisgKiBSZXR1cm5zIHRoZSBiYXNlIDIgbG9nYXJpdGhtLgorICoKKyAqIFNlZSBhbHNvIG5hdGl2ZV9sb2cyKCkuCisgKi8KK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBsb2cyKGZsb2F0IHYpOworCitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGxvZzIoZmxvYXQyIHYpOworCitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGxvZzIoZmxvYXQzIHYpOworCitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGxvZzIoZmxvYXQ0IHYpOworCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbG9nMihoYWxmIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbG9nMihoYWxmMiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGxvZzIoaGFsZjMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBsb2cyKGhhbGY0IHYpOworI2VuZGlmCisKKy8qCisgKiBsb2diOiBCYXNlIHR3byBleHBvbmVudAorICoKKyAqIFJldHVybnMgdGhlIGJhc2UgdHdvIGV4cG9uZW50IG9mIGEgdmFsdWUsIHdoZXJlIHRoZSBtYW50aXNzYSBpcyBiZXR3ZWVuCisgKiAxLmYgKGluY2x1c2l2ZSkgYW5kIDIuZiAoZXhjbHVzaXZlKS4KKyAqCisgKiBGb3IgZXhhbXBsZSwgbG9nYig4LjVmKSByZXR1cm5zIDMuZi4KKyAqCisgKiBCZWNhdXNlIG9mIHRoZSBkaWZmZXJlbmNlIGluIG1hbnRpc3NhLCB0aGlzIG51bWJlciBpcyBvbmUgbGVzcyB0aGFuIGlzIHJldHVybmVkIGJ5IGZyZXhwKCkuCisgKgorICogaWxvZ2IoKSBpcyBzaW1pbGFyIGJ1dCByZXR1cm5zIGFuIGludGVnZXIuCisgKi8KK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBsb2diKGZsb2F0IHYpOworCitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGxvZ2IoZmxvYXQyIHYpOworCitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGxvZ2IoZmxvYXQzIHYpOworCitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGxvZ2IoZmxvYXQ0IHYpOworCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbG9nYihoYWxmIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbG9nYihoYWxmMiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGxvZ2IoaGFsZjMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBsb2diKGhhbGY0IHYpOworI2VuZGlmCisKKy8qCisgKiBtYWQ6IE11bHRpcGx5IGFuZCBhZGQKKyAqCisgKiBNdWx0aXBseSBhbmQgYWRkLiAgUmV0dXJucyAobXVsdGlwbGljYW5kMSAqIG11bHRpcGxpY2FuZDIpICsgb2Zmc2V0LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byBmbWEoKS4gIGZtYSgpIHJldGFpbnMgZnVsbCBwcmVjaXNpb24gb2YgdGhlIG11bHRpcGxpZWQgcmVzdWx0CisgKiBhbmQgcm91bmRzIG9ubHkgYWZ0ZXIgdGhlIGFkZGl0aW9uLiAgbWFkKCkgcm91bmRzIGFmdGVyIHRoZSBtdWx0aXBsaWNhdGlvbiBhbmQgdGhlIGFkZGl0aW9uLgorICogSW4gcnNfZnBfcmVsYXhlZCBtb2RlLCBtYWQoKSBtYXkgbm90IGRvIHRoZSByb3VuZGluZyBhZnRlciBtdWx0aXBsaWNhaXRvbi4KKyAqLworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG1hZChmbG9hdCBtdWx0aXBsaWNhbmQxLCBmbG9hdCBtdWx0aXBsaWNhbmQyLCBmbG9hdCBvZmZzZXQpOworCitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG1hZChmbG9hdDIgbXVsdGlwbGljYW5kMSwgZmxvYXQyIG11bHRpcGxpY2FuZDIsIGZsb2F0MiBvZmZzZXQpOworCitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG1hZChmbG9hdDMgbXVsdGlwbGljYW5kMSwgZmxvYXQzIG11bHRpcGxpY2FuZDIsIGZsb2F0MyBvZmZzZXQpOworCitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG1hZChmbG9hdDQgbXVsdGlwbGljYW5kMSwgZmxvYXQ0IG11bHRpcGxpY2FuZDIsIGZsb2F0NCBvZmZzZXQpOworCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWFkKGhhbGYgbXVsdGlwbGljYW5kMSwgaGFsZiBtdWx0aXBsaWNhbmQyLCBoYWxmIG9mZnNldCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtYWQoaGFsZjIgbXVsdGlwbGljYW5kMSwgaGFsZjIgbXVsdGlwbGljYW5kMiwgaGFsZjIgb2Zmc2V0KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG1hZChoYWxmMyBtdWx0aXBsaWNhbmQxLCBoYWxmMyBtdWx0aXBsaWNhbmQyLCBoYWxmMyBvZmZzZXQpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWFkKGhhbGY0IG11bHRpcGxpY2FuZDEsIGhhbGY0IG11bHRpcGxpY2FuZDIsIGhhbGY0IG9mZnNldCk7CisjZW5kaWYKKworLyoKKyAqIG1heDogTWF4aW11bQorICoKKyAqIFJldHVybnMgdGhlIG1heGltdW0gdmFsdWUgb2YgdHdvIGFyZ3VtZW50cy4KKyAqLworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG1heChmbG9hdCBhLCBmbG9hdCBiKTsKKworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtYXgoZmxvYXQyIGEsIGZsb2F0MiBiKTsKKworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtYXgoZmxvYXQzIGEsIGZsb2F0MyBiKTsKKworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtYXgoZmxvYXQ0IGEsIGZsb2F0NCBiKTsKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG1heChoYWxmIGEsIGhhbGYgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtYXgoaGFsZjIgYSwgaGFsZjIgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtYXgoaGFsZjMgYSwgaGFsZjMgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtYXgoaGFsZjQgYSwgaGFsZjQgYik7CisjZW5kaWYKKworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtYXgoZmxvYXQyIGEsIGZsb2F0IGIpOworCitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG1heChmbG9hdDMgYSwgZmxvYXQgYik7CisKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWF4KGZsb2F0NCBhLCBmbG9hdCBiKTsKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtYXgoaGFsZjIgYSwgaGFsZiBiKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG1heChoYWxmMyBhLCBoYWxmIGIpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWF4KGhhbGY0IGEsIGhhbGYgYik7CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDIwKQorc3RhdGljIGlubGluZSBjaGFyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG1heChjaGFyIGEsIGNoYXIgYikgeworICAgIHJldHVybiAoYSA+IGIgPyBhIDogYik7Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDIwKQorc3RhdGljIGlubGluZSB1Y2hhciBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtYXgodWNoYXIgYSwgdWNoYXIgYikgeworICAgIHJldHVybiAoYSA+IGIgPyBhIDogYik7Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDIwKQorc3RhdGljIGlubGluZSBzaG9ydCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtYXgoc2hvcnQgYSwgc2hvcnQgYikgeworICAgIHJldHVybiAoYSA+IGIgPyBhIDogYik7Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDIwKQorc3RhdGljIGlubGluZSB1c2hvcnQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWF4KHVzaG9ydCBhLCB1c2hvcnQgYikgeworICAgIHJldHVybiAoYSA+IGIgPyBhIDogYik7Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDIwKQorc3RhdGljIGlubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWF4KGludCBhLCBpbnQgYikgeworICAgIHJldHVybiAoYSA+IGIgPyBhIDogYik7Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDIwKQorc3RhdGljIGlubGluZSB1aW50IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG1heCh1aW50IGEsIHVpbnQgYikgeworICAgIHJldHVybiAoYSA+IGIgPyBhIDogYik7Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDIwKQorc3RhdGljIGlubGluZSBjaGFyMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtYXgoY2hhcjIgYSwgY2hhcjIgYikgeworICAgIGNoYXIyIHRtcDsKKyAgICB0bXAueCA9IChhLnggPiBiLnggPyBhLnggOiBiLngpOworICAgIHRtcC55ID0gKGEueSA+IGIueSA/IGEueSA6IGIueSk7CisgICAgcmV0dXJuIHRtcDsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMjApCitzdGF0aWMgaW5saW5lIHVjaGFyMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtYXgodWNoYXIyIGEsIHVjaGFyMiBiKSB7CisgICAgdWNoYXIyIHRtcDsKKyAgICB0bXAueCA9IChhLnggPiBiLnggPyBhLnggOiBiLngpOworICAgIHRtcC55ID0gKGEueSA+IGIueSA/IGEueSA6IGIueSk7CisgICAgcmV0dXJuIHRtcDsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMjApCitzdGF0aWMgaW5saW5lIHNob3J0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtYXgoc2hvcnQyIGEsIHNob3J0MiBiKSB7CisgICAgc2hvcnQyIHRtcDsKKyAgICB0bXAueCA9IChhLnggPiBiLnggPyBhLnggOiBiLngpOworICAgIHRtcC55ID0gKGEueSA+IGIueSA/IGEueSA6IGIueSk7CisgICAgcmV0dXJuIHRtcDsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMjApCitzdGF0aWMgaW5saW5lIHVzaG9ydDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWF4KHVzaG9ydDIgYSwgdXNob3J0MiBiKSB7CisgICAgdXNob3J0MiB0bXA7CisgICAgdG1wLnggPSAoYS54ID4gYi54ID8gYS54IDogYi54KTsKKyAgICB0bXAueSA9IChhLnkgPiBiLnkgPyBhLnkgOiBiLnkpOworICAgIHJldHVybiB0bXA7Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDIwKQorc3RhdGljIGlubGluZSBpbnQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG1heChpbnQyIGEsIGludDIgYikgeworICAgIGludDIgdG1wOworICAgIHRtcC54ID0gKGEueCA+IGIueCA/IGEueCA6IGIueCk7CisgICAgdG1wLnkgPSAoYS55ID4gYi55ID8gYS55IDogYi55KTsKKyAgICByZXR1cm4gdG1wOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAyMCkKK3N0YXRpYyBpbmxpbmUgdWludDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWF4KHVpbnQyIGEsIHVpbnQyIGIpIHsKKyAgICB1aW50MiB0bXA7CisgICAgdG1wLnggPSAoYS54ID4gYi54ID8gYS54IDogYi54KTsKKyAgICB0bXAueSA9IChhLnkgPiBiLnkgPyBhLnkgOiBiLnkpOworICAgIHJldHVybiB0bXA7Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDIwKQorc3RhdGljIGlubGluZSBjaGFyMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtYXgoY2hhcjMgYSwgY2hhcjMgYikgeworICAgIGNoYXIzIHRtcDsKKyAgICB0bXAueCA9IChhLnggPiBiLnggPyBhLnggOiBiLngpOworICAgIHRtcC55ID0gKGEueSA+IGIueSA/IGEueSA6IGIueSk7CisgICAgdG1wLnogPSAoYS56ID4gYi56ID8gYS56IDogYi56KTsKKyAgICByZXR1cm4gdG1wOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAyMCkKK3N0YXRpYyBpbmxpbmUgdWNoYXIzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG1heCh1Y2hhcjMgYSwgdWNoYXIzIGIpIHsKKyAgICB1Y2hhcjMgdG1wOworICAgIHRtcC54ID0gKGEueCA+IGIueCA/IGEueCA6IGIueCk7CisgICAgdG1wLnkgPSAoYS55ID4gYi55ID8gYS55IDogYi55KTsKKyAgICB0bXAueiA9IChhLnogPiBiLnogPyBhLnogOiBiLnopOworICAgIHJldHVybiB0bXA7Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDIwKQorc3RhdGljIGlubGluZSBzaG9ydDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWF4KHNob3J0MyBhLCBzaG9ydDMgYikgeworICAgIHNob3J0MyB0bXA7CisgICAgdG1wLnggPSAoYS54ID4gYi54ID8gYS54IDogYi54KTsKKyAgICB0bXAueSA9IChhLnkgPiBiLnkgPyBhLnkgOiBiLnkpOworICAgIHRtcC56ID0gKGEueiA+IGIueiA/IGEueiA6IGIueik7CisgICAgcmV0dXJuIHRtcDsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMjApCitzdGF0aWMgaW5saW5lIHVzaG9ydDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWF4KHVzaG9ydDMgYSwgdXNob3J0MyBiKSB7CisgICAgdXNob3J0MyB0bXA7CisgICAgdG1wLnggPSAoYS54ID4gYi54ID8gYS54IDogYi54KTsKKyAgICB0bXAueSA9IChhLnkgPiBiLnkgPyBhLnkgOiBiLnkpOworICAgIHRtcC56ID0gKGEueiA+IGIueiA/IGEueiA6IGIueik7CisgICAgcmV0dXJuIHRtcDsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMjApCitzdGF0aWMgaW5saW5lIGludDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWF4KGludDMgYSwgaW50MyBiKSB7CisgICAgaW50MyB0bXA7CisgICAgdG1wLnggPSAoYS54ID4gYi54ID8gYS54IDogYi54KTsKKyAgICB0bXAueSA9IChhLnkgPiBiLnkgPyBhLnkgOiBiLnkpOworICAgIHRtcC56ID0gKGEueiA+IGIueiA/IGEueiA6IGIueik7CisgICAgcmV0dXJuIHRtcDsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMjApCitzdGF0aWMgaW5saW5lIHVpbnQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG1heCh1aW50MyBhLCB1aW50MyBiKSB7CisgICAgdWludDMgdG1wOworICAgIHRtcC54ID0gKGEueCA+IGIueCA/IGEueCA6IGIueCk7CisgICAgdG1wLnkgPSAoYS55ID4gYi55ID8gYS55IDogYi55KTsKKyAgICB0bXAueiA9IChhLnogPiBiLnogPyBhLnogOiBiLnopOworICAgIHJldHVybiB0bXA7Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDIwKQorc3RhdGljIGlubGluZSBjaGFyNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtYXgoY2hhcjQgYSwgY2hhcjQgYikgeworICAgIGNoYXI0IHRtcDsKKyAgICB0bXAueCA9IChhLnggPiBiLnggPyBhLnggOiBiLngpOworICAgIHRtcC55ID0gKGEueSA+IGIueSA/IGEueSA6IGIueSk7CisgICAgdG1wLnogPSAoYS56ID4gYi56ID8gYS56IDogYi56KTsKKyAgICB0bXAudyA9IChhLncgPiBiLncgPyBhLncgOiBiLncpOworICAgIHJldHVybiB0bXA7Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDIwKQorc3RhdGljIGlubGluZSB1Y2hhcjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWF4KHVjaGFyNCBhLCB1Y2hhcjQgYikgeworICAgIHVjaGFyNCB0bXA7CisgICAgdG1wLnggPSAoYS54ID4gYi54ID8gYS54IDogYi54KTsKKyAgICB0bXAueSA9IChhLnkgPiBiLnkgPyBhLnkgOiBiLnkpOworICAgIHRtcC56ID0gKGEueiA+IGIueiA/IGEueiA6IGIueik7CisgICAgdG1wLncgPSAoYS53ID4gYi53ID8gYS53IDogYi53KTsKKyAgICByZXR1cm4gdG1wOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAyMCkKK3N0YXRpYyBpbmxpbmUgc2hvcnQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG1heChzaG9ydDQgYSwgc2hvcnQ0IGIpIHsKKyAgICBzaG9ydDQgdG1wOworICAgIHRtcC54ID0gKGEueCA+IGIueCA/IGEueCA6IGIueCk7CisgICAgdG1wLnkgPSAoYS55ID4gYi55ID8gYS55IDogYi55KTsKKyAgICB0bXAueiA9IChhLnogPiBiLnogPyBhLnogOiBiLnopOworICAgIHRtcC53ID0gKGEudyA+IGIudyA/IGEudyA6IGIudyk7CisgICAgcmV0dXJuIHRtcDsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMjApCitzdGF0aWMgaW5saW5lIHVzaG9ydDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWF4KHVzaG9ydDQgYSwgdXNob3J0NCBiKSB7CisgICAgdXNob3J0NCB0bXA7CisgICAgdG1wLnggPSAoYS54ID4gYi54ID8gYS54IDogYi54KTsKKyAgICB0bXAueSA9IChhLnkgPiBiLnkgPyBhLnkgOiBiLnkpOworICAgIHRtcC56ID0gKGEueiA+IGIueiA/IGEueiA6IGIueik7CisgICAgdG1wLncgPSAoYS53ID4gYi53ID8gYS53IDogYi53KTsKKyAgICByZXR1cm4gdG1wOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAyMCkKK3N0YXRpYyBpbmxpbmUgaW50NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtYXgoaW50NCBhLCBpbnQ0IGIpIHsKKyAgICBpbnQ0IHRtcDsKKyAgICB0bXAueCA9IChhLnggPiBiLnggPyBhLnggOiBiLngpOworICAgIHRtcC55ID0gKGEueSA+IGIueSA/IGEueSA6IGIueSk7CisgICAgdG1wLnogPSAoYS56ID4gYi56ID8gYS56IDogYi56KTsKKyAgICB0bXAudyA9IChhLncgPiBiLncgPyBhLncgOiBiLncpOworICAgIHJldHVybiB0bXA7Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDIwKQorc3RhdGljIGlubGluZSB1aW50NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtYXgodWludDQgYSwgdWludDQgYikgeworICAgIHVpbnQ0IHRtcDsKKyAgICB0bXAueCA9IChhLnggPiBiLnggPyBhLnggOiBiLngpOworICAgIHRtcC55ID0gKGEueSA+IGIueSA/IGEueSA6IGIueSk7CisgICAgdG1wLnogPSAoYS56ID4gYi56ID8gYS56IDogYi56KTsKKyAgICB0bXAudyA9IChhLncgPiBiLncgPyBhLncgOiBiLncpOworICAgIHJldHVybiB0bXA7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBjaGFyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG1heChjaGFyIGEsIGNoYXIgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBjaGFyMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtYXgoY2hhcjIgYSwgY2hhcjIgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBjaGFyMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtYXgoY2hhcjMgYSwgY2hhcjMgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBjaGFyNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtYXgoY2hhcjQgYSwgY2hhcjQgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiB1Y2hhciBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtYXgodWNoYXIgYSwgdWNoYXIgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiB1Y2hhcjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWF4KHVjaGFyMiBhLCB1Y2hhcjIgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiB1Y2hhcjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWF4KHVjaGFyMyBhLCB1Y2hhcjMgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiB1Y2hhcjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWF4KHVjaGFyNCBhLCB1Y2hhcjQgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBzaG9ydCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtYXgoc2hvcnQgYSwgc2hvcnQgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBzaG9ydDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWF4KHNob3J0MiBhLCBzaG9ydDIgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBzaG9ydDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWF4KHNob3J0MyBhLCBzaG9ydDMgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBzaG9ydDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWF4KHNob3J0NCBhLCBzaG9ydDQgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiB1c2hvcnQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWF4KHVzaG9ydCBhLCB1c2hvcnQgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiB1c2hvcnQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG1heCh1c2hvcnQyIGEsIHVzaG9ydDIgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiB1c2hvcnQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG1heCh1c2hvcnQzIGEsIHVzaG9ydDMgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiB1c2hvcnQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG1heCh1c2hvcnQ0IGEsIHVzaG9ydDQgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBpbnQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWF4KGludCBhLCBpbnQgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBpbnQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG1heChpbnQyIGEsIGludDIgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBpbnQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG1heChpbnQzIGEsIGludDMgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBpbnQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG1heChpbnQ0IGEsIGludDQgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiB1aW50IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG1heCh1aW50IGEsIHVpbnQgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiB1aW50MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtYXgodWludDIgYSwgdWludDIgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiB1aW50MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtYXgodWludDMgYSwgdWludDMgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiB1aW50NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtYXgodWludDQgYSwgdWludDQgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBsb25nIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG1heChsb25nIGEsIGxvbmcgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBsb25nMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtYXgobG9uZzIgYSwgbG9uZzIgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBsb25nMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtYXgobG9uZzMgYSwgbG9uZzMgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBsb25nNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtYXgobG9uZzQgYSwgbG9uZzQgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiB1bG9uZyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtYXgodWxvbmcgYSwgdWxvbmcgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiB1bG9uZzIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWF4KHVsb25nMiBhLCB1bG9uZzIgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiB1bG9uZzMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWF4KHVsb25nMyBhLCB1bG9uZzMgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiB1bG9uZzQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWF4KHVsb25nNCBhLCB1bG9uZzQgYik7CisjZW5kaWYKKworLyoKKyAqIG1pbjogTWluaW11bQorICoKKyAqIFJldHVybnMgdGhlIG1pbmltdW0gdmFsdWUgb2YgdHdvIGFyZ3VtZW50cy4KKyAqLworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG1pbihmbG9hdCBhLCBmbG9hdCBiKTsKKworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtaW4oZmxvYXQyIGEsIGZsb2F0MiBiKTsKKworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtaW4oZmxvYXQzIGEsIGZsb2F0MyBiKTsKKworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtaW4oZmxvYXQ0IGEsIGZsb2F0NCBiKTsKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG1pbihoYWxmIGEsIGhhbGYgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtaW4oaGFsZjIgYSwgaGFsZjIgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtaW4oaGFsZjMgYSwgaGFsZjMgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtaW4oaGFsZjQgYSwgaGFsZjQgYik7CisjZW5kaWYKKworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtaW4oZmxvYXQyIGEsIGZsb2F0IGIpOworCitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG1pbihmbG9hdDMgYSwgZmxvYXQgYik7CisKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWluKGZsb2F0NCBhLCBmbG9hdCBiKTsKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtaW4oaGFsZjIgYSwgaGFsZiBiKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG1pbihoYWxmMyBhLCBoYWxmIGIpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWluKGhhbGY0IGEsIGhhbGYgYik7CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDIwKQorc3RhdGljIGlubGluZSBjaGFyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG1pbihjaGFyIGEsIGNoYXIgYikgeworICAgIHJldHVybiAoYSA8IGIgPyBhIDogYik7Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDIwKQorc3RhdGljIGlubGluZSB1Y2hhciBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtaW4odWNoYXIgYSwgdWNoYXIgYikgeworICAgIHJldHVybiAoYSA8IGIgPyBhIDogYik7Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDIwKQorc3RhdGljIGlubGluZSBzaG9ydCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtaW4oc2hvcnQgYSwgc2hvcnQgYikgeworICAgIHJldHVybiAoYSA8IGIgPyBhIDogYik7Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDIwKQorc3RhdGljIGlubGluZSB1c2hvcnQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWluKHVzaG9ydCBhLCB1c2hvcnQgYikgeworICAgIHJldHVybiAoYSA8IGIgPyBhIDogYik7Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDIwKQorc3RhdGljIGlubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWluKGludCBhLCBpbnQgYikgeworICAgIHJldHVybiAoYSA8IGIgPyBhIDogYik7Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDIwKQorc3RhdGljIGlubGluZSB1aW50IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG1pbih1aW50IGEsIHVpbnQgYikgeworICAgIHJldHVybiAoYSA8IGIgPyBhIDogYik7Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDIwKQorc3RhdGljIGlubGluZSBjaGFyMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtaW4oY2hhcjIgYSwgY2hhcjIgYikgeworICAgIGNoYXIyIHRtcDsKKyAgICB0bXAueCA9IChhLnggPCBiLnggPyBhLnggOiBiLngpOworICAgIHRtcC55ID0gKGEueSA8IGIueSA/IGEueSA6IGIueSk7CisgICAgcmV0dXJuIHRtcDsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMjApCitzdGF0aWMgaW5saW5lIHVjaGFyMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtaW4odWNoYXIyIGEsIHVjaGFyMiBiKSB7CisgICAgdWNoYXIyIHRtcDsKKyAgICB0bXAueCA9IChhLnggPCBiLnggPyBhLnggOiBiLngpOworICAgIHRtcC55ID0gKGEueSA8IGIueSA/IGEueSA6IGIueSk7CisgICAgcmV0dXJuIHRtcDsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMjApCitzdGF0aWMgaW5saW5lIHNob3J0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtaW4oc2hvcnQyIGEsIHNob3J0MiBiKSB7CisgICAgc2hvcnQyIHRtcDsKKyAgICB0bXAueCA9IChhLnggPCBiLnggPyBhLnggOiBiLngpOworICAgIHRtcC55ID0gKGEueSA8IGIueSA/IGEueSA6IGIueSk7CisgICAgcmV0dXJuIHRtcDsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMjApCitzdGF0aWMgaW5saW5lIHVzaG9ydDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWluKHVzaG9ydDIgYSwgdXNob3J0MiBiKSB7CisgICAgdXNob3J0MiB0bXA7CisgICAgdG1wLnggPSAoYS54IDwgYi54ID8gYS54IDogYi54KTsKKyAgICB0bXAueSA9IChhLnkgPCBiLnkgPyBhLnkgOiBiLnkpOworICAgIHJldHVybiB0bXA7Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDIwKQorc3RhdGljIGlubGluZSBpbnQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG1pbihpbnQyIGEsIGludDIgYikgeworICAgIGludDIgdG1wOworICAgIHRtcC54ID0gKGEueCA8IGIueCA/IGEueCA6IGIueCk7CisgICAgdG1wLnkgPSAoYS55IDwgYi55ID8gYS55IDogYi55KTsKKyAgICByZXR1cm4gdG1wOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAyMCkKK3N0YXRpYyBpbmxpbmUgdWludDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWluKHVpbnQyIGEsIHVpbnQyIGIpIHsKKyAgICB1aW50MiB0bXA7CisgICAgdG1wLnggPSAoYS54IDwgYi54ID8gYS54IDogYi54KTsKKyAgICB0bXAueSA9IChhLnkgPCBiLnkgPyBhLnkgOiBiLnkpOworICAgIHJldHVybiB0bXA7Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDIwKQorc3RhdGljIGlubGluZSBjaGFyMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtaW4oY2hhcjMgYSwgY2hhcjMgYikgeworICAgIGNoYXIzIHRtcDsKKyAgICB0bXAueCA9IChhLnggPCBiLnggPyBhLnggOiBiLngpOworICAgIHRtcC55ID0gKGEueSA8IGIueSA/IGEueSA6IGIueSk7CisgICAgdG1wLnogPSAoYS56IDwgYi56ID8gYS56IDogYi56KTsKKyAgICByZXR1cm4gdG1wOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAyMCkKK3N0YXRpYyBpbmxpbmUgdWNoYXIzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG1pbih1Y2hhcjMgYSwgdWNoYXIzIGIpIHsKKyAgICB1Y2hhcjMgdG1wOworICAgIHRtcC54ID0gKGEueCA8IGIueCA/IGEueCA6IGIueCk7CisgICAgdG1wLnkgPSAoYS55IDwgYi55ID8gYS55IDogYi55KTsKKyAgICB0bXAueiA9IChhLnogPCBiLnogPyBhLnogOiBiLnopOworICAgIHJldHVybiB0bXA7Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDIwKQorc3RhdGljIGlubGluZSBzaG9ydDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWluKHNob3J0MyBhLCBzaG9ydDMgYikgeworICAgIHNob3J0MyB0bXA7CisgICAgdG1wLnggPSAoYS54IDwgYi54ID8gYS54IDogYi54KTsKKyAgICB0bXAueSA9IChhLnkgPCBiLnkgPyBhLnkgOiBiLnkpOworICAgIHRtcC56ID0gKGEueiA8IGIueiA/IGEueiA6IGIueik7CisgICAgcmV0dXJuIHRtcDsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMjApCitzdGF0aWMgaW5saW5lIHVzaG9ydDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWluKHVzaG9ydDMgYSwgdXNob3J0MyBiKSB7CisgICAgdXNob3J0MyB0bXA7CisgICAgdG1wLnggPSAoYS54IDwgYi54ID8gYS54IDogYi54KTsKKyAgICB0bXAueSA9IChhLnkgPCBiLnkgPyBhLnkgOiBiLnkpOworICAgIHRtcC56ID0gKGEueiA8IGIueiA/IGEueiA6IGIueik7CisgICAgcmV0dXJuIHRtcDsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMjApCitzdGF0aWMgaW5saW5lIGludDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWluKGludDMgYSwgaW50MyBiKSB7CisgICAgaW50MyB0bXA7CisgICAgdG1wLnggPSAoYS54IDwgYi54ID8gYS54IDogYi54KTsKKyAgICB0bXAueSA9IChhLnkgPCBiLnkgPyBhLnkgOiBiLnkpOworICAgIHRtcC56ID0gKGEueiA8IGIueiA/IGEueiA6IGIueik7CisgICAgcmV0dXJuIHRtcDsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMjApCitzdGF0aWMgaW5saW5lIHVpbnQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG1pbih1aW50MyBhLCB1aW50MyBiKSB7CisgICAgdWludDMgdG1wOworICAgIHRtcC54ID0gKGEueCA8IGIueCA/IGEueCA6IGIueCk7CisgICAgdG1wLnkgPSAoYS55IDwgYi55ID8gYS55IDogYi55KTsKKyAgICB0bXAueiA9IChhLnogPCBiLnogPyBhLnogOiBiLnopOworICAgIHJldHVybiB0bXA7Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDIwKQorc3RhdGljIGlubGluZSBjaGFyNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtaW4oY2hhcjQgYSwgY2hhcjQgYikgeworICAgIGNoYXI0IHRtcDsKKyAgICB0bXAueCA9IChhLnggPCBiLnggPyBhLnggOiBiLngpOworICAgIHRtcC55ID0gKGEueSA8IGIueSA/IGEueSA6IGIueSk7CisgICAgdG1wLnogPSAoYS56IDwgYi56ID8gYS56IDogYi56KTsKKyAgICB0bXAudyA9IChhLncgPCBiLncgPyBhLncgOiBiLncpOworICAgIHJldHVybiB0bXA7Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDIwKQorc3RhdGljIGlubGluZSB1Y2hhcjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWluKHVjaGFyNCBhLCB1Y2hhcjQgYikgeworICAgIHVjaGFyNCB0bXA7CisgICAgdG1wLnggPSAoYS54IDwgYi54ID8gYS54IDogYi54KTsKKyAgICB0bXAueSA9IChhLnkgPCBiLnkgPyBhLnkgOiBiLnkpOworICAgIHRtcC56ID0gKGEueiA8IGIueiA/IGEueiA6IGIueik7CisgICAgdG1wLncgPSAoYS53IDwgYi53ID8gYS53IDogYi53KTsKKyAgICByZXR1cm4gdG1wOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAyMCkKK3N0YXRpYyBpbmxpbmUgc2hvcnQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG1pbihzaG9ydDQgYSwgc2hvcnQ0IGIpIHsKKyAgICBzaG9ydDQgdG1wOworICAgIHRtcC54ID0gKGEueCA8IGIueCA/IGEueCA6IGIueCk7CisgICAgdG1wLnkgPSAoYS55IDwgYi55ID8gYS55IDogYi55KTsKKyAgICB0bXAueiA9IChhLnogPCBiLnogPyBhLnogOiBiLnopOworICAgIHRtcC53ID0gKGEudyA8IGIudyA/IGEudyA6IGIudyk7CisgICAgcmV0dXJuIHRtcDsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMjApCitzdGF0aWMgaW5saW5lIHVzaG9ydDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWluKHVzaG9ydDQgYSwgdXNob3J0NCBiKSB7CisgICAgdXNob3J0NCB0bXA7CisgICAgdG1wLnggPSAoYS54IDwgYi54ID8gYS54IDogYi54KTsKKyAgICB0bXAueSA9IChhLnkgPCBiLnkgPyBhLnkgOiBiLnkpOworICAgIHRtcC56ID0gKGEueiA8IGIueiA/IGEueiA6IGIueik7CisgICAgdG1wLncgPSAoYS53IDwgYi53ID8gYS53IDogYi53KTsKKyAgICByZXR1cm4gdG1wOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAyMCkKK3N0YXRpYyBpbmxpbmUgaW50NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtaW4oaW50NCBhLCBpbnQ0IGIpIHsKKyAgICBpbnQ0IHRtcDsKKyAgICB0bXAueCA9IChhLnggPCBiLnggPyBhLnggOiBiLngpOworICAgIHRtcC55ID0gKGEueSA8IGIueSA/IGEueSA6IGIueSk7CisgICAgdG1wLnogPSAoYS56IDwgYi56ID8gYS56IDogYi56KTsKKyAgICB0bXAudyA9IChhLncgPCBiLncgPyBhLncgOiBiLncpOworICAgIHJldHVybiB0bXA7Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDIwKQorc3RhdGljIGlubGluZSB1aW50NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtaW4odWludDQgYSwgdWludDQgYikgeworICAgIHVpbnQ0IHRtcDsKKyAgICB0bXAueCA9IChhLnggPCBiLnggPyBhLnggOiBiLngpOworICAgIHRtcC55ID0gKGEueSA8IGIueSA/IGEueSA6IGIueSk7CisgICAgdG1wLnogPSAoYS56IDwgYi56ID8gYS56IDogYi56KTsKKyAgICB0bXAudyA9IChhLncgPCBiLncgPyBhLncgOiBiLncpOworICAgIHJldHVybiB0bXA7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBjaGFyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG1pbihjaGFyIGEsIGNoYXIgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBjaGFyMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtaW4oY2hhcjIgYSwgY2hhcjIgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBjaGFyMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtaW4oY2hhcjMgYSwgY2hhcjMgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBjaGFyNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtaW4oY2hhcjQgYSwgY2hhcjQgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiB1Y2hhciBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtaW4odWNoYXIgYSwgdWNoYXIgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiB1Y2hhcjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWluKHVjaGFyMiBhLCB1Y2hhcjIgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiB1Y2hhcjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWluKHVjaGFyMyBhLCB1Y2hhcjMgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiB1Y2hhcjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWluKHVjaGFyNCBhLCB1Y2hhcjQgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBzaG9ydCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtaW4oc2hvcnQgYSwgc2hvcnQgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBzaG9ydDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWluKHNob3J0MiBhLCBzaG9ydDIgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBzaG9ydDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWluKHNob3J0MyBhLCBzaG9ydDMgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBzaG9ydDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWluKHNob3J0NCBhLCBzaG9ydDQgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiB1c2hvcnQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWluKHVzaG9ydCBhLCB1c2hvcnQgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiB1c2hvcnQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG1pbih1c2hvcnQyIGEsIHVzaG9ydDIgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiB1c2hvcnQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG1pbih1c2hvcnQzIGEsIHVzaG9ydDMgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiB1c2hvcnQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG1pbih1c2hvcnQ0IGEsIHVzaG9ydDQgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBpbnQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWluKGludCBhLCBpbnQgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBpbnQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG1pbihpbnQyIGEsIGludDIgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBpbnQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG1pbihpbnQzIGEsIGludDMgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBpbnQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG1pbihpbnQ0IGEsIGludDQgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiB1aW50IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG1pbih1aW50IGEsIHVpbnQgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiB1aW50MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtaW4odWludDIgYSwgdWludDIgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiB1aW50MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtaW4odWludDMgYSwgdWludDMgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiB1aW50NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtaW4odWludDQgYSwgdWludDQgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBsb25nIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG1pbihsb25nIGEsIGxvbmcgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBsb25nMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtaW4obG9uZzIgYSwgbG9uZzIgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBsb25nMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtaW4obG9uZzMgYSwgbG9uZzMgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBsb25nNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtaW4obG9uZzQgYSwgbG9uZzQgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiB1bG9uZyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtaW4odWxvbmcgYSwgdWxvbmcgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiB1bG9uZzIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWluKHVsb25nMiBhLCB1bG9uZzIgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiB1bG9uZzMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWluKHVsb25nMyBhLCB1bG9uZzMgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiB1bG9uZzQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWluKHVsb25nNCBhLCB1bG9uZzQgYik7CisjZW5kaWYKKworLyoKKyAqIG1peDogTWl4ZXMgdHdvIHZhbHVlcworICoKKyAqIFJldHVybnMgc3RhcnQgKyAoKHN0b3AgLSBzdGFydCkgKiBmcmFjdGlvbikuCisgKgorICogVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBtaXhpbmcgdHdvIHZhbHVlcy4gIEZvciBleGFtcGxlLCB0byBjcmVhdGUgYSBuZXcgY29sb3IgdGhhdCBpcworICogNDAlIGNvbG9yMSBhbmQgNjAlIGNvbG9yMiwgdXNlIG1peChjb2xvcjEsIGNvbG9yMiwgMC42ZikuCisgKi8KK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtaXgoZmxvYXQgc3RhcnQsIGZsb2F0IHN0b3AsIGZsb2F0IGZyYWN0aW9uKTsKKworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtaXgoZmxvYXQyIHN0YXJ0LCBmbG9hdDIgc3RvcCwgZmxvYXQyIGZyYWN0aW9uKTsKKworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtaXgoZmxvYXQzIHN0YXJ0LCBmbG9hdDMgc3RvcCwgZmxvYXQzIGZyYWN0aW9uKTsKKworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtaXgoZmxvYXQ0IHN0YXJ0LCBmbG9hdDQgc3RvcCwgZmxvYXQ0IGZyYWN0aW9uKTsKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG1peChoYWxmIHN0YXJ0LCBoYWxmIHN0b3AsIGhhbGYgZnJhY3Rpb24pOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWl4KGhhbGYyIHN0YXJ0LCBoYWxmMiBzdG9wLCBoYWxmMiBmcmFjdGlvbik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtaXgoaGFsZjMgc3RhcnQsIGhhbGYzIHN0b3AsIGhhbGYzIGZyYWN0aW9uKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGY0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG1peChoYWxmNCBzdGFydCwgaGFsZjQgc3RvcCwgaGFsZjQgZnJhY3Rpb24pOworI2VuZGlmCisKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWl4KGZsb2F0MiBzdGFydCwgZmxvYXQyIHN0b3AsIGZsb2F0IGZyYWN0aW9uKTsKKworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtaXgoZmxvYXQzIHN0YXJ0LCBmbG9hdDMgc3RvcCwgZmxvYXQgZnJhY3Rpb24pOworCitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG1peChmbG9hdDQgc3RhcnQsIGZsb2F0NCBzdG9wLCBmbG9hdCBmcmFjdGlvbik7CisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbWl4KGhhbGYyIHN0YXJ0LCBoYWxmMiBzdG9wLCBoYWxmIGZyYWN0aW9uKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG1peChoYWxmMyBzdGFydCwgaGFsZjMgc3RvcCwgaGFsZiBmcmFjdGlvbik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBtaXgoaGFsZjQgc3RhcnQsIGhhbGY0IHN0b3AsIGhhbGYgZnJhY3Rpb24pOworI2VuZGlmCisKKy8qCisgKiBtb2RmOiBJbnRlZ3JhbCBhbmQgZnJhY3Rpb25hbCBjb21wb25lbnRzCisgKgorICogUmV0dXJucyB0aGUgaW50ZWdyYWwgYW5kIGZyYWN0aW9uYWwgY29tcG9uZW50cyBvZiBhIG51bWJlci4KKyAqCisgKiBCb3RoIGNvbXBvbmVudHMgd2lsbCBoYXZlIHRoZSBzYW1lIHNpZ24gYXMgeC4gIEZvciBleGFtcGxlLCBmb3IgYW4gaW5wdXQgb2YgLTMuNzJmLAorICogKmludGVncmFsX3BhcnQgd2lsbCBiZSBzZXQgdG8gLTMuZiBhbmQgLjcyZiB3aWxsIGJlIHJldHVybmVkLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgIHY6IFNvdXJjZSB2YWx1ZS4KKyAqICAgaW50ZWdyYWxfcGFydDogKmludGVncmFsX3BhcnQgd2lsbCBiZSBzZXQgdG8gdGhlIGludGVncmFsIHBvcnRpb24gb2YgdGhlIG51bWJlci4KKyAqCisgKiBSZXR1cm5zOiBGbG9hdGluZyBwb2ludCBwb3J0aW9uIG9mIHRoZSB2YWx1ZS4KKyAqLworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgbW9kZihmbG9hdCB2LCBmbG9hdCogaW50ZWdyYWxfcGFydCk7CisKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICBtb2RmKGZsb2F0MiB2LCBmbG9hdDIqIGludGVncmFsX3BhcnQpOworCitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgbW9kZihmbG9hdDMgdiwgZmxvYXQzKiBpbnRlZ3JhbF9wYXJ0KTsKKworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIG1vZGYoZmxvYXQ0IHYsIGZsb2F0NCogaW50ZWdyYWxfcGFydCk7CisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIG1vZGYoaGFsZiB2LCBoYWxmKiBpbnRlZ3JhbF9wYXJ0KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgbW9kZihoYWxmMiB2LCBoYWxmMiogaW50ZWdyYWxfcGFydCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIG1vZGYoaGFsZjMgdiwgaGFsZjMqIGludGVncmFsX3BhcnQpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICBtb2RmKGhhbGY0IHYsIGhhbGY0KiBpbnRlZ3JhbF9wYXJ0KTsKKyNlbmRpZgorCisvKgorICogbmFuOiBOb3QgYSBOdW1iZXIKKyAqCisgKiBSZXR1cm5zIGEgTmFOIHZhbHVlIChOb3QgYSBOdW1iZXIpLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgIHY6IE5vdCB1c2VkLgorICovCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmFuKHVpbnQgdik7CisKKy8qCisgKiBuYW5faGFsZjogTm90IGEgTnVtYmVyCisgKgorICogIFJldHVybnMgYSBoYWxmLXByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBOYU4gdmFsdWUgKE5vdCBhIE51bWJlcikuCisgKi8KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYW5faGFsZih2b2lkKTsKKyNlbmRpZgorCisvKgorICogbmF0aXZlX2Fjb3M6IEFwcHJveGltYXRlIGludmVyc2UgY29zaW5lCisgKgorICogUmV0dXJucyB0aGUgYXBwcm94aW1hdGUgaW52ZXJzZSBjb3NpbmUsIGluIHJhZGlhbnMuCisgKgorICogVGhpcyBmdW5jdGlvbiB5aWVsZHMgdW5kZWZpbmVkIHJlc3VsdHMgZnJvbSBpbnB1dCB2YWx1ZXMgbGVzcyB0aGFuIC0xIG9yIGdyZWF0ZXIgdGhhbiAxLgorICoKKyAqIFNlZSBhbHNvIGFjb3MoKS4KKyAqLworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfYWNvcyhmbG9hdCB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfYWNvcyhmbG9hdDIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2Fjb3MoZmxvYXQzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9hY29zKGZsb2F0NCB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2Fjb3MoaGFsZiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9hY29zKGhhbGYyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2Fjb3MoaGFsZjMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfYWNvcyhoYWxmNCB2KTsKKyNlbmRpZgorCisvKgorICogbmF0aXZlX2Fjb3NoOiBBcHByb3hpbWF0ZSBpbnZlcnNlIGh5cGVyYm9saWMgY29zaW5lCisgKgorICogUmV0dXJucyB0aGUgYXBwcm94aW1hdGUgaW52ZXJzZSBoeXBlcmJvbGljIGNvc2luZSwgaW4gcmFkaWFucy4KKyAqCisgKiBTZWUgYWxzbyBhY29zaCgpLgorICovCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9hY29zaChmbG9hdCB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfYWNvc2goZmxvYXQyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9hY29zaChmbG9hdDMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2Fjb3NoKGZsb2F0NCB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2Fjb3NoKGhhbGYgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfYWNvc2goaGFsZjIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfYWNvc2goaGFsZjMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfYWNvc2goaGFsZjQgdik7CisjZW5kaWYKKworLyoKKyAqIG5hdGl2ZV9hY29zcGk6IEFwcHJveGltYXRlIGludmVyc2UgY29zaW5lIGRpdmlkZWQgYnkgcGkKKyAqCisgKiBSZXR1cm5zIHRoZSBhcHByb3hpbWF0ZSBpbnZlcnNlIGNvc2luZSBpbiByYWRpYW5zLCBkaXZpZGVkIGJ5IHBpLgorICoKKyAqIFRvIGdldCBhbiBpbnZlcnNlIGNvc2luZSBtZWFzdXJlZCBpbiBkZWdyZWVzLCB1c2UgYWNvc3BpKGEpICogMTgwLmYuCisgKgorICogVGhpcyBmdW5jdGlvbiB5aWVsZHMgdW5kZWZpbmVkIHJlc3VsdHMgZnJvbSBpbnB1dCB2YWx1ZXMgbGVzcyB0aGFuIC0xIG9yIGdyZWF0ZXIgdGhhbiAxLgorICoKKyAqIFNlZSBhbHNvIGFjb3NwaSgpLgorICovCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9hY29zcGkoZmxvYXQgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2Fjb3NwaShmbG9hdDIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2Fjb3NwaShmbG9hdDMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2Fjb3NwaShmbG9hdDQgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9hY29zcGkoaGFsZiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9hY29zcGkoaGFsZjIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfYWNvc3BpKGhhbGYzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2Fjb3NwaShoYWxmNCB2KTsKKyNlbmRpZgorCisvKgorICogbmF0aXZlX2FzaW46IEFwcHJveGltYXRlIGludmVyc2Ugc2luZQorICoKKyAqIFJldHVybnMgdGhlIGFwcHJveGltYXRlIGludmVyc2Ugc2luZSwgaW4gcmFkaWFucy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHlpZWxkcyB1bmRlZmluZWQgcmVzdWx0cyBmcm9tIGlucHV0IHZhbHVlcyBsZXNzIHRoYW4gLTEgb3IgZ3JlYXRlciB0aGFuIDEuCisgKgorICogU2VlIGFsc28gYXNpbigpLgorICovCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9hc2luKGZsb2F0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9hc2luKGZsb2F0MiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfYXNpbihmbG9hdDMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2FzaW4oZmxvYXQ0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfYXNpbihoYWxmIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2FzaW4oaGFsZjIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfYXNpbihoYWxmMyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGY0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9hc2luKGhhbGY0IHYpOworI2VuZGlmCisKKy8qCisgKiBuYXRpdmVfYXNpbmg6IEFwcHJveGltYXRlIGludmVyc2UgaHlwZXJib2xpYyBzaW5lCisgKgorICogUmV0dXJucyB0aGUgYXBwcm94aW1hdGUgaW52ZXJzZSBoeXBlcmJvbGljIHNpbmUsIGluIHJhZGlhbnMuCisgKgorICogU2VlIGFsc28gYXNpbmgoKS4KKyAqLworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfYXNpbmgoZmxvYXQgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2FzaW5oKGZsb2F0MiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfYXNpbmgoZmxvYXQzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9hc2luaChmbG9hdDQgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9hc2luaChoYWxmIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2FzaW5oKGhhbGYyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2FzaW5oKGhhbGYzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2FzaW5oKGhhbGY0IHYpOworI2VuZGlmCisKKy8qCisgKiBuYXRpdmVfYXNpbnBpOiBBcHByb3hpbWF0ZSBpbnZlcnNlIHNpbmUgZGl2aWRlZCBieSBwaQorICoKKyAqIFJldHVybnMgdGhlIGFwcHJveGltYXRlIGludmVyc2Ugc2luZSBpbiByYWRpYW5zLCBkaXZpZGVkIGJ5IHBpLgorICoKKyAqIFRvIGdldCBhbiBpbnZlcnNlIHNpbmUgbWVhc3VyZWQgaW4gZGVncmVlcywgdXNlIGFzaW5waShhKSAqIDE4MC5mLgorICoKKyAqIFRoaXMgZnVuY3Rpb24geWllbGRzIHVuZGVmaW5lZCByZXN1bHRzIGZyb20gaW5wdXQgdmFsdWVzIGxlc3MgdGhhbiAtMSBvciBncmVhdGVyIHRoYW4gMS4KKyAqCisgKiBTZWUgYWxzbyBhc2lucGkoKS4KKyAqLworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfYXNpbnBpKGZsb2F0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9hc2lucGkoZmxvYXQyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9hc2lucGkoZmxvYXQzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9hc2lucGkoZmxvYXQ0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfYXNpbnBpKGhhbGYgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfYXNpbnBpKGhhbGYyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2FzaW5waShoYWxmMyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGY0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9hc2lucGkoaGFsZjQgdik7CisjZW5kaWYKKworLyoKKyAqIG5hdGl2ZV9hdGFuOiBBcHByb3hpbWF0ZSBpbnZlcnNlIHRhbmdlbnQKKyAqCisgKiBSZXR1cm5zIHRoZSBhcHByb3hpbWF0ZSBpbnZlcnNlIHRhbmdlbnQsIGluIHJhZGlhbnMuCisgKgorICogU2VlIGFsc28gYXRhbigpLgorICovCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9hdGFuKGZsb2F0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9hdGFuKGZsb2F0MiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfYXRhbihmbG9hdDMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2F0YW4oZmxvYXQ0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfYXRhbihoYWxmIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2F0YW4oaGFsZjIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfYXRhbihoYWxmMyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGY0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9hdGFuKGhhbGY0IHYpOworI2VuZGlmCisKKy8qCisgKiBuYXRpdmVfYXRhbjI6IEFwcHJveGltYXRlIGludmVyc2UgdGFuZ2VudCBvZiBhIHJhdGlvCisgKgorICogUmV0dXJucyB0aGUgYXBwcm94aW1hdGUgaW52ZXJzZSB0YW5nZW50IG9mIChudW1lcmF0b3IgLyBkZW5vbWluYXRvciksIGluIHJhZGlhbnMuCisgKgorICogU2VlIGFsc28gYXRhbjIoKS4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICBudW1lcmF0b3I6IE51bWVyYXRvci4KKyAqICAgZGVub21pbmF0b3I6IERlbm9taW5hdG9yLiAgQ2FuIGJlIDAuCisgKi8KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2F0YW4yKGZsb2F0IG51bWVyYXRvciwgZmxvYXQgZGVub21pbmF0b3IpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9hdGFuMihmbG9hdDIgbnVtZXJhdG9yLCBmbG9hdDIgZGVub21pbmF0b3IpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9hdGFuMihmbG9hdDMgbnVtZXJhdG9yLCBmbG9hdDMgZGVub21pbmF0b3IpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9hdGFuMihmbG9hdDQgbnVtZXJhdG9yLCBmbG9hdDQgZGVub21pbmF0b3IpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfYXRhbjIoaGFsZiBudW1lcmF0b3IsIGhhbGYgZGVub21pbmF0b3IpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2F0YW4yKGhhbGYyIG51bWVyYXRvciwgaGFsZjIgZGVub21pbmF0b3IpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2F0YW4yKGhhbGYzIG51bWVyYXRvciwgaGFsZjMgZGVub21pbmF0b3IpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2F0YW4yKGhhbGY0IG51bWVyYXRvciwgaGFsZjQgZGVub21pbmF0b3IpOworI2VuZGlmCisKKy8qCisgKiBuYXRpdmVfYXRhbjJwaTogQXBwcm94aW1hdGUgaW52ZXJzZSB0YW5nZW50IG9mIGEgcmF0aW8sIGRpdmlkZWQgYnkgcGkKKyAqCisgKiBSZXR1cm5zIHRoZSBhcHByb3hpbWF0ZSBpbnZlcnNlIHRhbmdlbnQgb2YgKG51bWVyYXRvciAvIGRlbm9taW5hdG9yKSwKKyAqIGluIHJhZGlhbnMsIGRpdmlkZWQgYnkgcGkuCisgKgorICogVG8gZ2V0IGFuIGludmVyc2UgdGFuZ2VudCBtZWFzdXJlZCBpbiBkZWdyZWVzLCB1c2UgYXRhbjJwaShuLCBkKSAqIDE4MC5mLgorICoKKyAqIFNlZSBhbHNvIGF0YW4ycGkoKS4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICBudW1lcmF0b3I6IE51bWVyYXRvci4KKyAqICAgZGVub21pbmF0b3I6IERlbm9taW5hdG9yLiAgQ2FuIGJlIDAuCisgKi8KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2F0YW4ycGkoZmxvYXQgbnVtZXJhdG9yLCBmbG9hdCBkZW5vbWluYXRvcik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2F0YW4ycGkoZmxvYXQyIG51bWVyYXRvciwgZmxvYXQyIGRlbm9taW5hdG9yKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfYXRhbjJwaShmbG9hdDMgbnVtZXJhdG9yLCBmbG9hdDMgZGVub21pbmF0b3IpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9hdGFuMnBpKGZsb2F0NCBudW1lcmF0b3IsIGZsb2F0NCBkZW5vbWluYXRvcik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9hdGFuMnBpKGhhbGYgbnVtZXJhdG9yLCBoYWxmIGRlbm9taW5hdG9yKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9hdGFuMnBpKGhhbGYyIG51bWVyYXRvciwgaGFsZjIgZGVub21pbmF0b3IpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2F0YW4ycGkoaGFsZjMgbnVtZXJhdG9yLCBoYWxmMyBkZW5vbWluYXRvcik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfYXRhbjJwaShoYWxmNCBudW1lcmF0b3IsIGhhbGY0IGRlbm9taW5hdG9yKTsKKyNlbmRpZgorCisvKgorICogbmF0aXZlX2F0YW5oOiBBcHByb3hpbWF0ZSBpbnZlcnNlIGh5cGVyYm9saWMgdGFuZ2VudAorICoKKyAqIFJldHVybnMgdGhlIGFwcHJveGltYXRlIGludmVyc2UgaHlwZXJib2xpYyB0YW5nZW50LCBpbiByYWRpYW5zLgorICoKKyAqIFNlZSBhbHNvIGF0YW5oKCkuCisgKi8KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2F0YW5oKGZsb2F0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9hdGFuaChmbG9hdDIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2F0YW5oKGZsb2F0MyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfYXRhbmgoZmxvYXQ0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfYXRhbmgoaGFsZiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9hdGFuaChoYWxmMiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9hdGFuaChoYWxmMyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGY0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9hdGFuaChoYWxmNCB2KTsKKyNlbmRpZgorCisvKgorICogbmF0aXZlX2F0YW5waTogQXBwcm94aW1hdGUgaW52ZXJzZSB0YW5nZW50IGRpdmlkZWQgYnkgcGkKKyAqCisgKiBSZXR1cm5zIHRoZSBhcHByb3hpbWF0ZSBpbnZlcnNlIHRhbmdlbnQgaW4gcmFkaWFucywgZGl2aWRlZCBieSBwaS4KKyAqCisgKiBUbyBnZXQgYW4gaW52ZXJzZSB0YW5nZW50IG1lYXN1cmVkIGluIGRlZ3JlZXMsIHVzZSBhdGFucGkoYSkgKiAxODAuZi4KKyAqCisgKiBTZWUgYWxzbyBhdGFucGkoKS4KKyAqLworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfYXRhbnBpKGZsb2F0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9hdGFucGkoZmxvYXQyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9hdGFucGkoZmxvYXQzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9hdGFucGkoZmxvYXQ0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfYXRhbnBpKGhhbGYgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfYXRhbnBpKGhhbGYyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2F0YW5waShoYWxmMyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGY0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9hdGFucGkoaGFsZjQgdik7CisjZW5kaWYKKworLyoKKyAqIG5hdGl2ZV9jYnJ0OiBBcHByb3hpbWF0ZSBjdWJlIHJvb3QKKyAqCisgKiBSZXR1cm5zIHRoZSBhcHByb3hpbWF0ZSBjdWJpYyByb290LgorICoKKyAqIFNlZSBhbHNvIGNicnQoKS4KKyAqLworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfY2JydChmbG9hdCB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfY2JydChmbG9hdDIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2NicnQoZmxvYXQzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9jYnJ0KGZsb2F0NCB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2NicnQoaGFsZiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9jYnJ0KGhhbGYyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2NicnQoaGFsZjMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfY2JydChoYWxmNCB2KTsKKyNlbmRpZgorCisvKgorICogbmF0aXZlX2NvczogQXBwcm94aW1hdGUgY29zaW5lCisgKgorICogUmV0dXJucyB0aGUgYXBwcm94aW1hdGUgY29zaW5lIG9mIGFuIGFuZ2xlIG1lYXN1cmVkIGluIHJhZGlhbnMuCisgKgorICogU2VlIGFsc28gY29zKCkuCisgKi8KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2NvcyhmbG9hdCB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfY29zKGZsb2F0MiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfY29zKGZsb2F0MyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfY29zKGZsb2F0NCB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2NvcyhoYWxmIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2NvcyhoYWxmMiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9jb3MoaGFsZjMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfY29zKGhhbGY0IHYpOworI2VuZGlmCisKKy8qCisgKiBuYXRpdmVfY29zaDogQXBwcm94aW1hdGUgaHlwZWJvbGljIGNvc2luZQorICoKKyAqIFJldHVybnMgdGhlIGFwcHJveGltYXRlIGh5cGVib2xpYyBjb3NpbmUuCisgKgorICogU2VlIGFsc28gY29zaCgpLgorICovCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9jb3NoKGZsb2F0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9jb3NoKGZsb2F0MiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfY29zaChmbG9hdDMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2Nvc2goZmxvYXQ0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfY29zaChoYWxmIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2Nvc2goaGFsZjIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfY29zaChoYWxmMyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGY0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9jb3NoKGhhbGY0IHYpOworI2VuZGlmCisKKy8qCisgKiBuYXRpdmVfY29zcGk6IEFwcHJveGltYXRlIGNvc2luZSBvZiBhIG51bWJlciBtdWx0aXBsaWVkIGJ5IHBpCisgKgorICogUmV0dXJucyB0aGUgYXBwcm94aW1hdGUgY29zaW5lIG9mICh2ICogcGkpLCB3aGVyZSAodiAqIHBpKSBpcyBtZWFzdXJlZCBpbiByYWRpYW5zLgorICoKKyAqIFRvIGdldCB0aGUgY29zaW5lIG9mIGEgdmFsdWUgbWVhc3VyZWQgaW4gZGVncmVlcywgY2FsbCBjb3NwaSh2IC8gMTgwLmYpLgorICoKKyAqIFNlZSBhbHNvIGNvc3BpKCkuCisgKi8KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2Nvc3BpKGZsb2F0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9jb3NwaShmbG9hdDIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2Nvc3BpKGZsb2F0MyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfY29zcGkoZmxvYXQ0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfY29zcGkoaGFsZiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9jb3NwaShoYWxmMiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9jb3NwaShoYWxmMyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGY0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9jb3NwaShoYWxmNCB2KTsKKyNlbmRpZgorCisvKgorICogbmF0aXZlX2RpdmlkZTogQXBwcm94aW1hdGUgZGl2aXNpb24KKyAqCisgKiBDb21wdXRlcyB0aGUgYXBwcm94aW1hdGUgZGl2aXNpb24gb2YgdHdvIHZhbHVlcy4KKyAqLworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfZGl2aWRlKGZsb2F0IGxlZnRfdmVjdG9yLCBmbG9hdCByaWdodF92ZWN0b3IpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9kaXZpZGUoZmxvYXQyIGxlZnRfdmVjdG9yLCBmbG9hdDIgcmlnaHRfdmVjdG9yKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfZGl2aWRlKGZsb2F0MyBsZWZ0X3ZlY3RvciwgZmxvYXQzIHJpZ2h0X3ZlY3Rvcik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2RpdmlkZShmbG9hdDQgbGVmdF92ZWN0b3IsIGZsb2F0NCByaWdodF92ZWN0b3IpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfZGl2aWRlKGhhbGYgbGVmdF92ZWN0b3IsIGhhbGYgcmlnaHRfdmVjdG9yKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9kaXZpZGUoaGFsZjIgbGVmdF92ZWN0b3IsIGhhbGYyIHJpZ2h0X3ZlY3Rvcik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfZGl2aWRlKGhhbGYzIGxlZnRfdmVjdG9yLCBoYWxmMyByaWdodF92ZWN0b3IpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2RpdmlkZShoYWxmNCBsZWZ0X3ZlY3RvciwgaGFsZjQgcmlnaHRfdmVjdG9yKTsKKyNlbmRpZgorCisvKgorICogbmF0aXZlX2V4cDogQXBwcm94aW1hdGUgZSByYWlzZWQgdG8gYSBudW1iZXIKKyAqCisgKiBGYXN0IGFwcHJveGltYXRlIGV4cC4KKyAqCisgKiBJdCBpcyB2YWxpZCBmb3IgaW5wdXRzIGZyb20gLTg2LmYgdG8gODYuZi4gIFRoZSBwcmVjaXNpb24gaXMgbm8gd29yc2UgdGhhbiB3aGF0IHdvdWxkIGJlCisgKiBleHBlY3RlZCBmcm9tIHVzaW5nIDE2IGJpdCBmbG9hdGluZyBwb2ludCB2YWx1ZXMuCisgKgorICogU2VlIGFsc28gZXhwKCkuCisgKi8KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2V4cChmbG9hdCB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfZXhwKGZsb2F0MiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfZXhwKGZsb2F0MyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfZXhwKGZsb2F0NCB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2V4cChoYWxmIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2V4cChoYWxmMiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9leHAoaGFsZjMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfZXhwKGhhbGY0IHYpOworI2VuZGlmCisKKy8qCisgKiBuYXRpdmVfZXhwMTA6IEFwcHJveGltYXRlIDEwIHJhaXNlZCB0byBhIG51bWJlcgorICoKKyAqIEZhc3QgYXBwcm94aW1hdGUgZXhwMTAuCisgKgorICogSXQgaXMgdmFsaWQgZm9yIGlucHV0cyBmcm9tIC0zNy5mIHRvIDM3LmYuICBUaGUgcHJlY2lzaW9uIGlzIG5vIHdvcnNlIHRoYW4gd2hhdCB3b3VsZCBiZQorICogZXhwZWN0ZWQgZnJvbSB1c2luZyAxNiBiaXQgZmxvYXRpbmcgcG9pbnQgdmFsdWVzLgorICoKKyAqIFNlZSBhbHNvIGV4cDEwKCkuCisgKi8KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2V4cDEwKGZsb2F0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9leHAxMChmbG9hdDIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2V4cDEwKGZsb2F0MyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfZXhwMTAoZmxvYXQ0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfZXhwMTAoaGFsZiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9leHAxMChoYWxmMiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9leHAxMChoYWxmMyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGY0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9leHAxMChoYWxmNCB2KTsKKyNlbmRpZgorCisvKgorICogbmF0aXZlX2V4cDI6IEFwcHJveGltYXRlIDIgcmFpc2VkIHRvIGEgbnVtYmVyCisgKgorICogRmFzdCBhcHByb3hpbWF0ZSBleHAyLgorICoKKyAqIEl0IGlzIHZhbGlkIGZvciBpbnB1dHMgZnJvbSAtMTI1LmYgdG8gMTI1LmYuICBUaGUgcHJlY2lzaW9uIGlzIG5vIHdvcnNlIHRoYW4gd2hhdCB3b3VsZCBiZQorICogZXhwZWN0ZWQgZnJvbSB1c2luZyAxNiBiaXQgZmxvYXRpbmcgcG9pbnQgdmFsdWVzLgorICoKKyAqIFNlZSBhbHNvIGV4cDIoKS4KKyAqLworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfZXhwMihmbG9hdCB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfZXhwMihmbG9hdDIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2V4cDIoZmxvYXQzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9leHAyKGZsb2F0NCB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2V4cDIoaGFsZiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9leHAyKGhhbGYyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2V4cDIoaGFsZjMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfZXhwMihoYWxmNCB2KTsKKyNlbmRpZgorCisvKgorICogbmF0aXZlX2V4cG0xOiBBcHByb3hpbWF0ZSBlIHJhaXNlZCB0byBhIG51bWJlciBtaW51cyBvbmUKKyAqCisgKiBSZXR1cm5zIHRoZSBhcHByb3hpbWF0ZSAoZSBeIHYpIC0gMS4KKyAqCisgKiBTZWUgYWxzbyBleHBtMSgpLgorICovCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9leHBtMShmbG9hdCB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfZXhwbTEoZmxvYXQyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9leHBtMShmbG9hdDMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2V4cG0xKGZsb2F0NCB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2V4cG0xKGhhbGYgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfZXhwbTEoaGFsZjIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfZXhwbTEoaGFsZjMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfZXhwbTEoaGFsZjQgdik7CisjZW5kaWYKKworLyoKKyAqIG5hdGl2ZV9oeXBvdDogQXBwcm94aW1hdGUgaHlwb3RlbnVzZQorICoKKyAqIFJldHVybnMgdGhlIGFwcHJveGltYXRlIG5hdGl2ZV9zcXJ0KGEgKiBhICsgYiAqIGIpCisgKgorICogU2VlIGFsc28gaHlwb3QoKS4KKyAqLworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfaHlwb3QoZmxvYXQgYSwgZmxvYXQgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2h5cG90KGZsb2F0MiBhLCBmbG9hdDIgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2h5cG90KGZsb2F0MyBhLCBmbG9hdDMgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2h5cG90KGZsb2F0NCBhLCBmbG9hdDQgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9oeXBvdChoYWxmIGEsIGhhbGYgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfaHlwb3QoaGFsZjIgYSwgaGFsZjIgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfaHlwb3QoaGFsZjMgYSwgaGFsZjMgYik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfaHlwb3QoaGFsZjQgYSwgaGFsZjQgYik7CisjZW5kaWYKKworLyoKKyAqIG5hdGl2ZV9sb2c6IEFwcHJveGltYXRlIG5hdHVyYWwgbG9nYXJpdGhtCisgKgorICogRmFzdCBhcHByb3hpbWF0ZSBsb2cuCisgKgorICogSXQgaXMgbm90IGFjY3VyYXRlIGZvciB2YWx1ZXMgdmVyeSBjbG9zZSB0byB6ZXJvLgorICoKKyAqIFNlZSBhbHNvIGxvZygpLgorICovCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9sb2coZmxvYXQgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2xvZyhmbG9hdDIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2xvZyhmbG9hdDMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2xvZyhmbG9hdDQgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9sb2coaGFsZiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9sb2coaGFsZjIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfbG9nKGhhbGYzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2xvZyhoYWxmNCB2KTsKKyNlbmRpZgorCisvKgorICogbmF0aXZlX2xvZzEwOiBBcHByb3hpbWF0ZSBiYXNlIDEwIGxvZ2FyaXRobQorICoKKyAqIEZhc3QgYXBwcm94aW1hdGUgbG9nMTAuCisgKgorICogSXQgaXMgbm90IGFjY3VyYXRlIGZvciB2YWx1ZXMgdmVyeSBjbG9zZSB0byB6ZXJvLgorICoKKyAqIFNlZSBhbHNvIGxvZzEwKCkuCisgKi8KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2xvZzEwKGZsb2F0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9sb2cxMChmbG9hdDIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2xvZzEwKGZsb2F0MyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfbG9nMTAoZmxvYXQ0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfbG9nMTAoaGFsZiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9sb2cxMChoYWxmMiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9sb2cxMChoYWxmMyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGY0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9sb2cxMChoYWxmNCB2KTsKKyNlbmRpZgorCisvKgorICogbmF0aXZlX2xvZzFwOiBBcHByb3hpbWF0ZSBuYXR1cmFsIGxvZ2FyaXRobSBvZiBhIHZhbHVlIHBsdXMgMQorICoKKyAqIFJldHVybnMgdGhlIGFwcHJveGltYXRlIG5hdHVyYWwgbG9nYXJpdGhtIG9mICh2ICsgMS4wZikKKyAqCisgKiBTZWUgYWxzbyBsb2cxcCgpLgorICovCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9sb2cxcChmbG9hdCB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfbG9nMXAoZmxvYXQyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9sb2cxcChmbG9hdDMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2xvZzFwKGZsb2F0NCB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2xvZzFwKGhhbGYgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfbG9nMXAoaGFsZjIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfbG9nMXAoaGFsZjMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfbG9nMXAoaGFsZjQgdik7CisjZW5kaWYKKworLyoKKyAqIG5hdGl2ZV9sb2cyOiBBcHByb3hpbWF0ZSBiYXNlIDIgbG9nYXJpdGhtCisgKgorICogRmFzdCBhcHByb3hpbWF0ZSBsb2cyLgorICoKKyAqIEl0IGlzIG5vdCBhY2N1cmF0ZSBmb3IgdmFsdWVzIHZlcnkgY2xvc2UgdG8gemVyby4KKyAqCisgKiBTZWUgYWxzbyBsb2cyKCkuCisgKi8KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2xvZzIoZmxvYXQgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2xvZzIoZmxvYXQyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxOCkpCitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9sb2cyKGZsb2F0MyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTgpKQorZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfbG9nMihmbG9hdDQgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9sb2cyKGhhbGYgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfbG9nMihoYWxmMiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9sb2cyKGhhbGYzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2xvZzIoaGFsZjQgdik7CisjZW5kaWYKKworLyoKKyAqIG5hdGl2ZV9wb3dyOiBBcHByb3hpbWF0ZSBwb3NpdGl2ZSBiYXNlIHJhaXNlZCB0byBhbiBleHBvbmVudAorICoKKyAqIEZhc3QgYXBwcm94aW1hdGUgKGJhc2UgXiBleHBvbmVudCkuCisgKgorICogU2VlIGFsc28gcG93cigpLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgIGJhc2U6IE11c3QgYmUgYmV0d2VlbiAwLmYgYW5kIDI1Ni5mLiAgVGhlIGZ1bmN0aW9uIGlzIG5vdCBhY2N1cmF0ZSBmb3IgdmFsdWVzIHZlcnkgY2xvc2UgdG8gemVyby4KKyAqICAgZXhwb25lbnQ6IE11c3QgYmUgYmV0d2VlbiAtMTUuZiBhbmQgMTUuZi4KKyAqLworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfcG93cihmbG9hdCBiYXNlLCBmbG9hdCBleHBvbmVudCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX3Bvd3IoZmxvYXQyIGJhc2UsIGZsb2F0MiBleHBvbmVudCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX3Bvd3IoZmxvYXQzIGJhc2UsIGZsb2F0MyBleHBvbmVudCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE4KSkKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX3Bvd3IoZmxvYXQ0IGJhc2UsIGZsb2F0NCBleHBvbmVudCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9wb3dyKGhhbGYgYmFzZSwgaGFsZiBleHBvbmVudCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfcG93cihoYWxmMiBiYXNlLCBoYWxmMiBleHBvbmVudCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfcG93cihoYWxmMyBiYXNlLCBoYWxmMyBleHBvbmVudCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfcG93cihoYWxmNCBiYXNlLCBoYWxmNCBleHBvbmVudCk7CisjZW5kaWYKKworLyoKKyAqIG5hdGl2ZV9yZWNpcDogQXBwcm94aW1hdGUgcmVjaXByb2NhbAorICoKKyAqIFJldHVybnMgdGhlIGFwcHJveGltYXRlIGFwcHJveGltYXRlIHJlY2lwcm9jYWwgb2YgYSB2YWx1ZS4KKyAqCisgKiBTZWUgYWxzbyBoYWxmX3JlY2lwKCkuCisgKi8KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX3JlY2lwKGZsb2F0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9yZWNpcChmbG9hdDIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX3JlY2lwKGZsb2F0MyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfcmVjaXAoZmxvYXQ0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfcmVjaXAoaGFsZiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9yZWNpcChoYWxmMiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9yZWNpcChoYWxmMyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGY0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9yZWNpcChoYWxmNCB2KTsKKyNlbmRpZgorCisvKgorICogbmF0aXZlX3Jvb3RuOiBBcHByb3hpbWF0ZSBudGggcm9vdAorICoKKyAqIENvbXB1dGUgdGhlIGFwcHJveGltYXRlIE50aCByb290IG9mIGEgdmFsdWUuCisgKgorICogU2VlIGFsc28gcm9vdG4oKS4KKyAqLworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfcm9vdG4oZmxvYXQgdiwgaW50IG4pOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9yb290bihmbG9hdDIgdiwgaW50MiBuKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfcm9vdG4oZmxvYXQzIHYsIGludDMgbik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX3Jvb3RuKGZsb2F0NCB2LCBpbnQ0IG4pOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfcm9vdG4oaGFsZiB2LCBpbnQgbik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfcm9vdG4oaGFsZjIgdiwgaW50MiBuKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9yb290bihoYWxmMyB2LCBpbnQzIG4pOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX3Jvb3RuKGhhbGY0IHYsIGludDQgbik7CisjZW5kaWYKKworLyoKKyAqIG5hdGl2ZV9yc3FydDogQXBwcm94aW1hdGUgcmVjaXByb2NhbCBvZiBhIHNxdWFyZSByb290CisgKgorICogUmV0dXJucyBhcHByb3hpbWF0ZSAoMSAvIHNxcnQodikpLgorICoKKyAqIFNlZSBhbHNvIHJzcXJ0KCksIGhhbGZfcnNxcnQoKS4KKyAqLworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfcnNxcnQoZmxvYXQgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX3JzcXJ0KGZsb2F0MiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfcnNxcnQoZmxvYXQzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9yc3FydChmbG9hdDQgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9yc3FydChoYWxmIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX3JzcXJ0KGhhbGYyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX3JzcXJ0KGhhbGYzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX3JzcXJ0KGhhbGY0IHYpOworI2VuZGlmCisKKy8qCisgKiBuYXRpdmVfc2luOiBBcHByb3hpbWF0ZSBzaW5lCisgKgorICogUmV0dXJucyB0aGUgYXBwcm94aW1hdGUgc2luZSBvZiBhbiBhbmdsZSBtZWFzdXJlZCBpbiByYWRpYW5zLgorICoKKyAqIFNlZSBhbHNvIHNpbigpLgorICovCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9zaW4oZmxvYXQgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX3NpbihmbG9hdDIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX3NpbihmbG9hdDMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX3NpbihmbG9hdDQgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9zaW4oaGFsZiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9zaW4oaGFsZjIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfc2luKGhhbGYzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX3NpbihoYWxmNCB2KTsKKyNlbmRpZgorCisvKgorICogbmF0aXZlX3NpbmNvczogQXBwcm94aW1hdGUgc2luZSBhbmQgY29zaW5lCisgKgorICogUmV0dXJucyB0aGUgYXBwcm94aW1hdGUgc2luZSBhbmQgY29zaW5lIG9mIGEgdmFsdWUuCisgKgorICogU2VlIGFsc28gc2luY29zKCkuCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgdjogSW5jb21pbmcgdmFsdWUgaW4gcmFkaWFucy4KKyAqICAgY29zOiAqY29zIHdpbGwgYmUgc2V0IHRvIHRoZSBjb3NpbmUgdmFsdWUuCisgKgorICogUmV0dXJuczogU2luZS4KKyAqLworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9zaW5jb3MoZmxvYXQgdiwgZmxvYXQqIGNvcyk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfc2luY29zKGZsb2F0MiB2LCBmbG9hdDIqIGNvcyk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfc2luY29zKGZsb2F0MyB2LCBmbG9hdDMqIGNvcyk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfc2luY29zKGZsb2F0NCB2LCBmbG9hdDQqIGNvcyk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX3NpbmNvcyhoYWxmIHYsIGhhbGYqIGNvcyk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9zaW5jb3MoaGFsZjIgdiwgaGFsZjIqIGNvcyk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9zaW5jb3MoaGFsZjMgdiwgaGFsZjMqIGNvcyk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmNCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9zaW5jb3MoaGFsZjQgdiwgaGFsZjQqIGNvcyk7CisjZW5kaWYKKworLyoKKyAqIG5hdGl2ZV9zaW5oOiBBcHByb3hpbWF0ZSBoeXBlcmJvbGljIHNpbmUKKyAqCisgKiBSZXR1cm5zIHRoZSBhcHByb3hpbWF0ZSBoeXBlcmJvbGljIHNpbmUgb2YgYSB2YWx1ZSBzcGVjaWZpZWQgaW4gcmFkaWFucy4KKyAqCisgKiBTZWUgYWxzbyBzaW5oKCkuCisgKi8KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX3NpbmgoZmxvYXQgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX3NpbmgoZmxvYXQyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9zaW5oKGZsb2F0MyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfc2luaChmbG9hdDQgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9zaW5oKGhhbGYgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfc2luaChoYWxmMiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9zaW5oKGhhbGYzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX3NpbmgoaGFsZjQgdik7CisjZW5kaWYKKworLyoKKyAqIG5hdGl2ZV9zaW5waTogQXBwcm94aW1hdGUgc2luZSBvZiBhIG51bWJlciBtdWx0aXBsaWVkIGJ5IHBpCisgKgorICogUmV0dXJucyB0aGUgYXBwcm94aW1hdGUgc2luZSBvZiAodiAqIHBpKSwgd2hlcmUgKHYgKiBwaSkgaXMgbWVhc3VyZWQgaW4gcmFkaWFucy4KKyAqCisgKiBUbyBnZXQgdGhlIHNpbmUgb2YgYSB2YWx1ZSBtZWFzdXJlZCBpbiBkZWdyZWVzLCBjYWxsIHNpbnBpKHYgLyAxODAuZikuCisgKgorICogU2VlIGFsc28gc2lucGkoKS4KKyAqLworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfc2lucGkoZmxvYXQgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX3NpbnBpKGZsb2F0MiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfc2lucGkoZmxvYXQzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9zaW5waShmbG9hdDQgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9zaW5waShoYWxmIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX3NpbnBpKGhhbGYyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX3NpbnBpKGhhbGYzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX3NpbnBpKGhhbGY0IHYpOworI2VuZGlmCisKKy8qCisgKiBuYXRpdmVfc3FydDogQXBwcm94aW1hdGUgc3F1YXJlIHJvb3QKKyAqCisgKiBSZXR1cm5zIHRoZSBhcHByb3hpbWF0ZSBzcXJ0KHYpLgorICoKKyAqIFNlZSBhbHNvIHNxcnQoKSwgaGFsZl9zcXJ0KCkuCisgKi8KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX3NxcnQoZmxvYXQgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX3NxcnQoZmxvYXQyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9zcXJ0KGZsb2F0MyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfc3FydChmbG9hdDQgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9zcXJ0KGhhbGYgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfc3FydChoYWxmMiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9zcXJ0KGhhbGYzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX3NxcnQoaGFsZjQgdik7CisjZW5kaWYKKworLyoKKyAqIG5hdGl2ZV90YW46IEFwcHJveGltYXRlIHRhbmdlbnQKKyAqCisgKiBSZXR1cm5zIHRoZSBhcHByb3hpbWF0ZSB0YW5nZW50IG9mIGFuIGFuZ2xlIG1lYXN1cmVkIGluIHJhZGlhbnMuCisgKi8KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX3RhbihmbG9hdCB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfdGFuKGZsb2F0MiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfdGFuKGZsb2F0MyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfdGFuKGZsb2F0NCB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX3RhbihoYWxmIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX3RhbihoYWxmMiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV90YW4oaGFsZjMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfdGFuKGhhbGY0IHYpOworI2VuZGlmCisKKy8qCisgKiBuYXRpdmVfdGFuaDogQXBwcm94aW1hdGUgaHlwZXJib2xpYyB0YW5nZW50CisgKgorICogUmV0dXJucyB0aGUgYXBwcm94aW1hdGUgaHlwZXJib2xpYyB0YW5nZW50IG9mIGEgdmFsdWUuCisgKgorICogU2VlIGFsc28gdGFuaCgpLgorICovCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV90YW5oKGZsb2F0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV90YW5oKGZsb2F0MiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfdGFuaChmbG9hdDMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX3RhbmgoZmxvYXQ0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfdGFuaChoYWxmIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX3RhbmgoaGFsZjIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfdGFuaChoYWxmMyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGY0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV90YW5oKGhhbGY0IHYpOworI2VuZGlmCisKKy8qCisgKiBuYXRpdmVfdGFucGk6IEFwcHJveGltYXRlIHRhbmdlbnQgb2YgYSBudW1iZXIgbXVsdGlwbGllZCBieSBwaQorICoKKyAqIFJldHVybnMgdGhlIGFwcHJveGltYXRlIHRhbmdlbnQgb2YgKHYgKiBwaSksIHdoZXJlICh2ICogcGkpIGlzIG1lYXN1cmVkIGluIHJhZGlhbnMuCisgKgorICogVG8gZ2V0IHRoZSB0YW5nZW50IG9mIGEgdmFsdWUgbWVhc3VyZWQgaW4gZGVncmVlcywgY2FsbCB0YW5waSh2IC8gMTgwLmYpLgorICoKKyAqIFNlZSBhbHNvIHRhbnBpKCkuCisgKi8KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX3RhbnBpKGZsb2F0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV90YW5waShmbG9hdDIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX3RhbnBpKGZsb2F0MyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfdGFucGkoZmxvYXQ0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfdGFucGkoaGFsZiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV90YW5waShoYWxmMiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV90YW5waShoYWxmMyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGY0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV90YW5waShoYWxmNCB2KTsKKyNlbmRpZgorCisvKgorICogbmV4dGFmdGVyOiBOZXh0IGZsb2F0aW5nIHBvaW50IG51bWJlcgorICoKKyAqIFJldHVybnMgdGhlIG5leHQgcmVwcmVzZW50YWJsZSBmbG9hdGluZyBwb2ludCBudW1iZXIgZnJvbSB2IHRvd2FyZHMgdGFyZ2V0LgorICoKKyAqIEluIHJzX2ZwX3JlbGF4ZWQgbW9kZSwgYSBkZW5vcm1hbGl6ZWQgaW5wdXQgdmFsdWUgbWF5IG5vdCB5aWVsZCB0aGUgbmV4dCBkZW5vcm1hbGl6ZWQKKyAqIHZhbHVlLCBhcyBzdXBwb3J0IG9mIGRlbm9ybWFsaXplZCB2YWx1ZXMgaXMgb3B0aW9uYWwgaW4gcmVsYXhlZCBtb2RlLgorICovCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmV4dGFmdGVyKGZsb2F0IHYsIGZsb2F0IHRhcmdldCk7CisKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmV4dGFmdGVyKGZsb2F0MiB2LCBmbG9hdDIgdGFyZ2V0KTsKKworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuZXh0YWZ0ZXIoZmxvYXQzIHYsIGZsb2F0MyB0YXJnZXQpOworCitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5leHRhZnRlcihmbG9hdDQgdiwgZmxvYXQ0IHRhcmdldCk7CisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuZXh0YWZ0ZXIoaGFsZiB2LCBoYWxmIHRhcmdldCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuZXh0YWZ0ZXIoaGFsZjIgdiwgaGFsZjIgdGFyZ2V0KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5leHRhZnRlcihoYWxmMyB2LCBoYWxmMyB0YXJnZXQpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmV4dGFmdGVyKGhhbGY0IHYsIGhhbGY0IHRhcmdldCk7CisjZW5kaWYKKworLyoKKyAqIHBvdzogQmFzZSByYWlzZWQgdG8gYW4gZXhwb25lbnQKKyAqCisgKiBSZXR1cm5zIGJhc2UgcmFpc2VkIHRvIHRoZSBwb3dlciBleHBvbmVudCwgaS5lLiBiYXNlIF4gZXhwb25lbnQuCisgKgorICogcG93bigpIGFuZCBwb3dyKCkgYXJlIHNpbWlsYXIuICBwb3duKCkgdGFrZXMgYW4gaW50ZWdlciBleHBvbmVudC4gcG93cigpIGFzc3VtZXMgdGhlCisgKiBiYXNlIHRvIGJlIG5vbi1uZWdhdGl2ZS4KKyAqLworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHBvdyhmbG9hdCBiYXNlLCBmbG9hdCBleHBvbmVudCk7CisKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgcG93KGZsb2F0MiBiYXNlLCBmbG9hdDIgZXhwb25lbnQpOworCitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHBvdyhmbG9hdDMgYmFzZSwgZmxvYXQzIGV4cG9uZW50KTsKKworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBwb3coZmxvYXQ0IGJhc2UsIGZsb2F0NCBleHBvbmVudCk7CisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBwb3coaGFsZiBiYXNlLCBoYWxmIGV4cG9uZW50KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHBvdyhoYWxmMiBiYXNlLCBoYWxmMiBleHBvbmVudCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBwb3coaGFsZjMgYmFzZSwgaGFsZjMgZXhwb25lbnQpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgcG93KGhhbGY0IGJhc2UsIGhhbGY0IGV4cG9uZW50KTsKKyNlbmRpZgorCisvKgorICogcG93bjogQmFzZSByYWlzZWQgdG8gYW4gaW50ZWdlciBleHBvbmVudAorICoKKyAqIFJldHVybnMgYmFzZSByYWlzZWQgdG8gdGhlIHBvd2VyIGV4cG9uZW50LCBpLmUuIGJhc2UgXiBleHBvbmVudC4KKyAqCisgKiBwb3coKSBhbmQgcG93cigpIGFyZSBzaW1pbGFyLiAgVGhlIGJvdGggdGFrZSBhIGZsb2F0IGV4cG9uZW50LiBwb3dyKCkgYWxzbyBhc3N1bWVzIHRoZQorICogYmFzZSB0byBiZSBub24tbmVnYXRpdmUuCisgKi8KK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBwb3duKGZsb2F0IGJhc2UsIGludCBleHBvbmVudCk7CisKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgcG93bihmbG9hdDIgYmFzZSwgaW50MiBleHBvbmVudCk7CisKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgcG93bihmbG9hdDMgYmFzZSwgaW50MyBleHBvbmVudCk7CisKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgcG93bihmbG9hdDQgYmFzZSwgaW50NCBleHBvbmVudCk7CisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBwb3duKGhhbGYgYmFzZSwgaW50IGV4cG9uZW50KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHBvd24oaGFsZjIgYmFzZSwgaW50MiBleHBvbmVudCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBwb3duKGhhbGYzIGJhc2UsIGludDMgZXhwb25lbnQpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgcG93bihoYWxmNCBiYXNlLCBpbnQ0IGV4cG9uZW50KTsKKyNlbmRpZgorCisvKgorICogcG93cjogUG9zaXRpdmUgYmFzZSByYWlzZWQgdG8gYW4gZXhwb25lbnQKKyAqCisgKiBSZXR1cm5zIGJhc2UgcmFpc2VkIHRvIHRoZSBwb3dlciBleHBvbmVudCwgaS5lLiBiYXNlIF4gZXhwb25lbnQuICBiYXNlIG11c3QgYmUgPj0gMC4KKyAqCisgKiBwb3coKSBhbmQgcG93bigpIGFyZSBzaW1pbGFyLiAgVGhleSBib3RoIG1ha2Ugbm8gYXNzdW1wdGlvbnMgYWJvdXQgdGhlIGJhc2UuCisgKiBwb3coKSB0YWtlcyBhIGZsb2F0IGV4cG9uZW50IHdoaWxlIHBvd24oKSB0YWtlIGFuIGludGVnZXIuCisgKgorICogU2VlIGFsc28gbmF0aXZlX3Bvd3IoKS4KKyAqLworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHBvd3IoZmxvYXQgYmFzZSwgZmxvYXQgZXhwb25lbnQpOworCitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHBvd3IoZmxvYXQyIGJhc2UsIGZsb2F0MiBleHBvbmVudCk7CisKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgcG93cihmbG9hdDMgYmFzZSwgZmxvYXQzIGV4cG9uZW50KTsKKworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBwb3dyKGZsb2F0NCBiYXNlLCBmbG9hdDQgZXhwb25lbnQpOworCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgcG93cihoYWxmIGJhc2UsIGhhbGYgZXhwb25lbnQpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgcG93cihoYWxmMiBiYXNlLCBoYWxmMiBleHBvbmVudCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBwb3dyKGhhbGYzIGJhc2UsIGhhbGYzIGV4cG9uZW50KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGY0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHBvd3IoaGFsZjQgYmFzZSwgaGFsZjQgZXhwb25lbnQpOworI2VuZGlmCisKKy8qCisgKiByYWRpYW5zOiBDb252ZXJ0cyBkZWdyZWVzIGludG8gcmFkaWFucworICoKKyAqIENvbnZlcnRzIGZyb20gZGVncmVlcyB0byByYWRpYW5zLgorICovCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgcmFkaWFucyhmbG9hdCB2KTsKKworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICByYWRpYW5zKGZsb2F0MiB2KTsKKworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICByYWRpYW5zKGZsb2F0MyB2KTsKKworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICByYWRpYW5zKGZsb2F0NCB2KTsKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHJhZGlhbnMoaGFsZiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHJhZGlhbnMoaGFsZjIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICByYWRpYW5zKGhhbGYzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgcmFkaWFucyhoYWxmNCB2KTsKKyNlbmRpZgorCisvKgorICogcmVtYWluZGVyOiBSZW1haW5kZXIgb2YgYSBkaXZpc2lvbgorICoKKyAqIFJldHVybnMgdGhlIHJlbWFpbmRlciBvZiAobnVtZXJhdG9yIC8gZGVub21pbmF0b3IpLCB3aGVyZSB0aGUgcXVvdGllbnQgaXMgcm91bmRlZCB0b3dhcmRzCisgKiB0aGUgbmVhcmVzdCBpbnRlZ2VyLgorICoKKyAqIFRoZSBmdW5jdGlvbiBmbW9kKCkgaXMgc2ltaWxhciBidXQgcm91bmRzIHRvd2FyZCB0aGUgY2xvc2VzdCBpbnRlcmdlci4KKyAqIEZvciBleGFtcGxlLCBmbW9kKC0zLjhmLCAyLmYpIHJldHVybnMgLTEuOGYgKC0zLjhmIC0gLTEuZiAqIDIuZikKKyAqIHdoaWxlIHJlbWFpbmRlcigtMy44ZiwgMi5mKSByZXR1cm5zIDAuMmYgKC0zLjhmIC0gLTIuZiAqIDIuZikuCisgKi8KK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICByZW1haW5kZXIoZmxvYXQgbnVtZXJhdG9yLCBmbG9hdCBkZW5vbWluYXRvcik7CisKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgcmVtYWluZGVyKGZsb2F0MiBudW1lcmF0b3IsIGZsb2F0MiBkZW5vbWluYXRvcik7CisKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgcmVtYWluZGVyKGZsb2F0MyBudW1lcmF0b3IsIGZsb2F0MyBkZW5vbWluYXRvcik7CisKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgcmVtYWluZGVyKGZsb2F0NCBudW1lcmF0b3IsIGZsb2F0NCBkZW5vbWluYXRvcik7CisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICByZW1haW5kZXIoaGFsZiBudW1lcmF0b3IsIGhhbGYgZGVub21pbmF0b3IpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgcmVtYWluZGVyKGhhbGYyIG51bWVyYXRvciwgaGFsZjIgZGVub21pbmF0b3IpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgcmVtYWluZGVyKGhhbGYzIG51bWVyYXRvciwgaGFsZjMgZGVub21pbmF0b3IpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgcmVtYWluZGVyKGhhbGY0IG51bWVyYXRvciwgaGFsZjQgZGVub21pbmF0b3IpOworI2VuZGlmCisKKy8qCisgKiByZW1xdW86IFJlbWFpbmRlciBhbmQgcXVvdGllbnQgb2YgYSBkaXZpc2lvbgorICoKKyAqIFJldHVybnMgdGhlIHF1b3RpZW50IGFuZCB0aGUgcmVtYWluZGVyIG9mIChudW1lcmF0b3IgLyBkZW5vbWluYXRvcikuCisgKgorICogT25seSB0aGUgc2lnbiBhbmQgbG93ZXN0IHRocmVlIGJpdHMgb2YgdGhlIHF1b3RpZW50IGFyZSBndWFyYW50ZWVkIHRvIGJlIGFjY3VyYXRlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIGZvciBpbXBsZW1lbnRpbmcgcGVyaW9kaWMgZnVuY3Rpb25zLiAgVGhlIGxvdyB0aHJlZSBiaXRzIG9mIHRoZQorICogcXVvdGllbnQgZ2l2ZXMgdGhlIHF1YWRyYW50IGFuZCB0aGUgcmVtYWluZGVyIHRoZSBkaXN0YW5jZSB3aXRoaW4gdGhlIHF1YWRyYW50LgorICogRm9yIGV4YW1wbGUsIGFuIGltcGxlbWVudGF0aW9uIG9mIHNpbih4KSBjb3VsZCBjYWxsIHJlbXF1byh4LCBQSSAvIDIuZiwgJnF1YWRyYW50KQorICogdG8gcmVkdWNlIHZlcnkgbGFyZ2UgdmFsdWUgb2YgeCB0byBzb21ldGhpbmcgd2l0aGluIGEgbGltaXRlZCByYW5nZS4KKyAqCisgKiBFeGFtcGxlOiByZW1xdW8oLTIzLjVmLCA4LmYsICZxdW90KSBzZXRzIHRoZSBsb3dlc3QgdGhyZWUgYml0cyBvZiBxdW90IHRvIDMKKyAqIGFuZCB0aGUgc2lnbiBuZWdhdGl2ZS4gIEl0IHJldHVybnMgMC41Zi4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICBudW1lcmF0b3I6IE51bWVyYXRvci4KKyAqICAgZGVub21pbmF0b3I6IERlbm9taW5hdG9yLgorICogICBxdW90aWVudDogKnF1b3RpZW50IHdpbGwgYmUgc2V0IHRvIHRoZSBpbnRlZ2VyIHF1b3RpZW50LgorICoKKyAqIFJldHVybnM6IFJlbWFpbmRlciwgcHJlY2lzZSBvbmx5IGZvciB0aGUgbG93IHRocmVlIGJpdHMuCisgKi8KK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJlbXF1byhmbG9hdCBudW1lcmF0b3IsIGZsb2F0IGRlbm9taW5hdG9yLCBpbnQqIHF1b3RpZW50KTsKKworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJlbXF1byhmbG9hdDIgbnVtZXJhdG9yLCBmbG9hdDIgZGVub21pbmF0b3IsIGludDIqIHF1b3RpZW50KTsKKworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJlbXF1byhmbG9hdDMgbnVtZXJhdG9yLCBmbG9hdDMgZGVub21pbmF0b3IsIGludDMqIHF1b3RpZW50KTsKKworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJlbXF1byhmbG9hdDQgbnVtZXJhdG9yLCBmbG9hdDQgZGVub21pbmF0b3IsIGludDQqIHF1b3RpZW50KTsKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcmVtcXVvKGhhbGYgbnVtZXJhdG9yLCBoYWxmIGRlbm9taW5hdG9yLCBpbnQqIHF1b3RpZW50KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcmVtcXVvKGhhbGYyIG51bWVyYXRvciwgaGFsZjIgZGVub21pbmF0b3IsIGludDIqIHF1b3RpZW50KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcmVtcXVvKGhhbGYzIG51bWVyYXRvciwgaGFsZjMgZGVub21pbmF0b3IsIGludDMqIHF1b3RpZW50KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGY0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcmVtcXVvKGhhbGY0IG51bWVyYXRvciwgaGFsZjQgZGVub21pbmF0b3IsIGludDQqIHF1b3RpZW50KTsKKyNlbmRpZgorCisvKgorICogcmludDogUm91bmQgdG8gZXZlbgorICoKKyAqIFJvdW5kcyB0byB0aGUgbmVhcmVzdCBpbnRlZ3JhbCB2YWx1ZS4KKyAqCisgKiByaW50KCkgcm91bmRzIGhhbGYgdmFsdWVzIHRvIGV2ZW4uICBGb3IgZXhhbXBsZSwgcmludCgwLjVmKSByZXR1cm5zIDAuZiBhbmQKKyAqIHJpbnQoMS41ZikgcmV0dXJucyAyLmYuICBTaW1pbGFybHksIHJpbnQoLTAuNWYpIHJldHVybnMgLTAuZiBhbmQKKyAqIHJpbnQoLTEuNWYpIHJldHVybnMgLTIuZi4KKyAqCisgKiByb3VuZCgpIGlzIHNpbWlsYXIgYnV0IHJvdW5kcyBhd2F5IGZyb20gemVyby4gIHRydW5jKCkgdHJ1bmNhdGVzIHRoZSBkZWNpbWFsIGZyYWN0aW9uLgorICovCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgcmludChmbG9hdCB2KTsKKworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICByaW50KGZsb2F0MiB2KTsKKworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICByaW50KGZsb2F0MyB2KTsKKworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICByaW50KGZsb2F0NCB2KTsKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHJpbnQoaGFsZiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHJpbnQoaGFsZjIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICByaW50KGhhbGYzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgcmludChoYWxmNCB2KTsKKyNlbmRpZgorCisvKgorICogcm9vdG46IE50aCByb290CisgKgorICogQ29tcHV0ZSB0aGUgTnRoIHJvb3Qgb2YgYSB2YWx1ZS4KKyAqCisgKiBTZWUgYWxzbyBuYXRpdmVfcm9vdG4oKS4KKyAqLworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHJvb3RuKGZsb2F0IHYsIGludCBuKTsKKworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICByb290bihmbG9hdDIgdiwgaW50MiBuKTsKKworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICByb290bihmbG9hdDMgdiwgaW50MyBuKTsKKworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICByb290bihmbG9hdDQgdiwgaW50NCBuKTsKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHJvb3RuKGhhbGYgdiwgaW50IG4pOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgcm9vdG4oaGFsZjIgdiwgaW50MiBuKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHJvb3RuKGhhbGYzIHYsIGludDMgbik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICByb290bihoYWxmNCB2LCBpbnQ0IG4pOworI2VuZGlmCisKKy8qCisgKiByb3VuZDogUm91bmQgYXdheSBmcm9tIHplcm8KKyAqCisgKiBSb3VuZCB0byB0aGUgbmVhcmVzdCBpbnRlZ3JhbCB2YWx1ZS4KKyAqCisgKiByb3VuZCgpIHJvdW5kcyBoYWxmIHZhbHVlcyBhd2F5IGZyb20gemVyby4gIEZvciBleGFtcGxlLCByb3VuZCgwLjVmKSByZXR1cm5zIDEuZgorICogYW5kIHJvdW5kKDEuNWYpIHJldHVybnMgMi5mLiAgU2ltaWxhcmx5LCByb3VuZCgtMC41ZikgcmV0dXJucyAtMS5mCisgKiBhbmQgcm91bmQoLTEuNWYpIHJldHVybnMgLTIuZi4KKyAqCisgKiByaW50KCkgaXMgc2ltaWxhciBidXQgcm91bmRzIGhhbGYgdmFsdWVzIHRvd2FyZCBldmVuLiAgdHJ1bmMoKSB0cnVuY2F0ZXMgdGhlIGRlY2ltYWwgZnJhY3Rpb24uCisgKi8KK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICByb3VuZChmbG9hdCB2KTsKKworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICByb3VuZChmbG9hdDIgdik7CisKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgcm91bmQoZmxvYXQzIHYpOworCitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHJvdW5kKGZsb2F0NCB2KTsKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHJvdW5kKGhhbGYgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICByb3VuZChoYWxmMiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHJvdW5kKGhhbGYzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgcm91bmQoaGFsZjQgdik7CisjZW5kaWYKKworLyoKKyAqIHJzcXJ0OiBSZWNpcHJvY2FsIG9mIGEgc3F1YXJlIHJvb3QKKyAqCisgKiBSZXR1cm5zICgxIC8gc3FydCh2KSkuCisgKgorICogU2VlIGFsc28gaGFsZl9yc3FydCgpLCBuYXRpdmVfcnNxcnQoKS4KKyAqLworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHJzcXJ0KGZsb2F0IHYpOworCitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHJzcXJ0KGZsb2F0MiB2KTsKKworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICByc3FydChmbG9hdDMgdik7CisKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgcnNxcnQoZmxvYXQ0IHYpOworCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgcnNxcnQoaGFsZiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHJzcXJ0KGhhbGYyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgcnNxcnQoaGFsZjMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICByc3FydChoYWxmNCB2KTsKKyNlbmRpZgorCisvKgorICogc2lnbjogU2lnbiBvZiBhIHZhbHVlCisgKgorICogUmV0dXJucyB0aGUgc2lnbiBvZiBhIHZhbHVlLgorICoKKyAqIGlmICh2IDwgMCkgcmV0dXJuIC0xLmY7CisgKiBlbHNlIGlmICh2ID4gMCkgcmV0dXJuIDEuZjsKKyAqIGVsc2UgcmV0dXJuIDAuZjsKKyAqLworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHNpZ24oZmxvYXQgdik7CisKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgc2lnbihmbG9hdDIgdik7CisKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgc2lnbihmbG9hdDMgdik7CisKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgc2lnbihmbG9hdDQgdik7CisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBzaWduKGhhbGYgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBzaWduKGhhbGYyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgc2lnbihoYWxmMyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGY0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHNpZ24oaGFsZjQgdik7CisjZW5kaWYKKworLyoKKyAqIHNpbjogU2luZQorICoKKyAqIFJldHVybnMgdGhlIHNpbmUgb2YgYW4gYW5nbGUgbWVhc3VyZWQgaW4gcmFkaWFucy4KKyAqCisgKiBTZWUgYWxzbyBuYXRpdmVfc2luKCkuCisgKi8KK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBzaW4oZmxvYXQgdik7CisKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgc2luKGZsb2F0MiB2KTsKKworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBzaW4oZmxvYXQzIHYpOworCitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHNpbihmbG9hdDQgdik7CisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBzaW4oaGFsZiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHNpbihoYWxmMiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHNpbihoYWxmMyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGY0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHNpbihoYWxmNCB2KTsKKyNlbmRpZgorCisvKgorICogc2luY29zOiBTaW5lIGFuZCBjb3NpbmUKKyAqCisgKiBSZXR1cm5zIHRoZSBzaW5lIGFuZCBjb3NpbmUgb2YgYSB2YWx1ZS4KKyAqCisgKiBTZWUgYWxzbyBuYXRpdmVfc2luY29zKCkuCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgdjogSW5jb21pbmcgdmFsdWUgaW4gcmFkaWFucy4KKyAqICAgY29zOiAqY29zIHdpbGwgYmUgc2V0IHRvIHRoZSBjb3NpbmUgdmFsdWUuCisgKgorICogUmV0dXJuczogU2luZSBvZiB2LgorICovCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICBzaW5jb3MoZmxvYXQgdiwgZmxvYXQqIGNvcyk7CisKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICBzaW5jb3MoZmxvYXQyIHYsIGZsb2F0MiogY29zKTsKKworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHNpbmNvcyhmbG9hdDMgdiwgZmxvYXQzKiBjb3MpOworCitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgc2luY29zKGZsb2F0NCB2LCBmbG9hdDQqIGNvcyk7CisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHNpbmNvcyhoYWxmIHYsIGhhbGYqIGNvcyk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHNpbmNvcyhoYWxmMiB2LCBoYWxmMiogY29zKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgc2luY29zKGhhbGYzIHYsIGhhbGYzKiBjb3MpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICBzaW5jb3MoaGFsZjQgdiwgaGFsZjQqIGNvcyk7CisjZW5kaWYKKworLyoKKyAqIHNpbmg6IEh5cGVyYm9saWMgc2luZQorICoKKyAqIFJldHVybnMgdGhlIGh5cGVyYm9saWMgc2luZSBvZiB2LCB3aGVyZSB2IGlzIG1lYXN1cmVkIGluIHJhZGlhbnMuCisgKgorICogU2VlIGFsc28gbmF0aXZlX3NpbmgoKS4KKyAqLworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHNpbmgoZmxvYXQgdik7CisKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgc2luaChmbG9hdDIgdik7CisKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgc2luaChmbG9hdDMgdik7CisKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgc2luaChmbG9hdDQgdik7CisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBzaW5oKGhhbGYgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBzaW5oKGhhbGYyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgc2luaChoYWxmMyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGY0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHNpbmgoaGFsZjQgdik7CisjZW5kaWYKKworLyoKKyAqIHNpbnBpOiBTaW5lIG9mIGEgbnVtYmVyIG11bHRpcGxpZWQgYnkgcGkKKyAqCisgKiBSZXR1cm5zIHRoZSBzaW5lIG9mICh2ICogcGkpLCB3aGVyZSAodiAqIHBpKSBpcyBtZWFzdXJlZCBpbiByYWRpYW5zLgorICoKKyAqIFRvIGdldCB0aGUgc2luZSBvZiBhIHZhbHVlIG1lYXN1cmVkIGluIGRlZ3JlZXMsIGNhbGwgc2lucGkodiAvIDE4MC5mKS4KKyAqCisgKiBTZWUgYWxzbyBuYXRpdmVfc2lucGkoKS4KKyAqLworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHNpbnBpKGZsb2F0IHYpOworCitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHNpbnBpKGZsb2F0MiB2KTsKKworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBzaW5waShmbG9hdDMgdik7CisKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgc2lucGkoZmxvYXQ0IHYpOworCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgc2lucGkoaGFsZiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHNpbnBpKGhhbGYyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgc2lucGkoaGFsZjMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBzaW5waShoYWxmNCB2KTsKKyNlbmRpZgorCisvKgorICogc3FydDogU3F1YXJlIHJvb3QKKyAqCisgKiBSZXR1cm5zIHRoZSBzcXVhcmUgcm9vdCBvZiBhIHZhbHVlLgorICoKKyAqIFNlZSBhbHNvIGhhbGZfc3FydCgpLCBuYXRpdmVfc3FydCgpLgorICovCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgc3FydChmbG9hdCB2KTsKKworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBzcXJ0KGZsb2F0MiB2KTsKKworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBzcXJ0KGZsb2F0MyB2KTsKKworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBzcXJ0KGZsb2F0NCB2KTsKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHNxcnQoaGFsZiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHNxcnQoaGFsZjIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBzcXJ0KGhhbGYzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgc3FydChoYWxmNCB2KTsKKyNlbmRpZgorCisvKgorICogc3RlcDogMCBpZiBsZXNzIHRoYW4gYSB2YWx1ZSwgMCBvdGhlcndpc2UKKyAqCisgKiBSZXR1cm5zIDAuZiBpZiB2IDwgZWRnZSwgMS5mIG90aGVyd2lzZS4KKyAqCisgKiBUaGlzIGNhbiBiZSB1c2VmdWwgdG8gY3JlYXRlIGNvbmRpdGlvbmFsIGNvbXB1dGF0aW9ucyB3aXRob3V0IHVzaW5nIGxvb3BzIGFuZCBicmFuY2hpbmcKKyAqIGluc3RydWN0aW9ucy4gIEZvciBleGFtcGxlLCBpbnN0ZWFkIG9mIGNvbXB1dGluZyAoYVtpXSA8IGJbaV0pID8gMC5mIDogYXRhbjIoYVtpXSwgYltpXSkKKyAqIGZvciB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBhIHZlY3RvciwgeW91IGNvdWxkIGluc3RlYWQgdXNlIHN0ZXAoYSwgYikgKiBhdGFuMihhLCBiKS4KKyAqLworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHN0ZXAoZmxvYXQgZWRnZSwgZmxvYXQgdik7CisKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgc3RlcChmbG9hdDIgZWRnZSwgZmxvYXQyIHYpOworCitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHN0ZXAoZmxvYXQzIGVkZ2UsIGZsb2F0MyB2KTsKKworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBzdGVwKGZsb2F0NCBlZGdlLCBmbG9hdDQgdik7CisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBzdGVwKGhhbGYgZWRnZSwgaGFsZiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHN0ZXAoaGFsZjIgZWRnZSwgaGFsZjIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBzdGVwKGhhbGYzIGVkZ2UsIGhhbGYzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgc3RlcChoYWxmNCBlZGdlLCBoYWxmNCB2KTsKKyNlbmRpZgorCitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHN0ZXAoZmxvYXQyIGVkZ2UsIGZsb2F0IHYpOworCitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHN0ZXAoZmxvYXQzIGVkZ2UsIGZsb2F0IHYpOworCitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHN0ZXAoZmxvYXQ0IGVkZ2UsIGZsb2F0IHYpOworCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHN0ZXAoaGFsZjIgZWRnZSwgaGFsZiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHN0ZXAoaGFsZjMgZWRnZSwgaGFsZiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGY0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHN0ZXAoaGFsZjQgZWRnZSwgaGFsZiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBzdGVwKGZsb2F0IGVkZ2UsIGZsb2F0MiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBzdGVwKGZsb2F0IGVkZ2UsIGZsb2F0MyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBzdGVwKGZsb2F0IGVkZ2UsIGZsb2F0NCB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHN0ZXAoaGFsZiBlZGdlLCBoYWxmMiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHN0ZXAoaGFsZiBlZGdlLCBoYWxmMyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGY0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHN0ZXAoaGFsZiBlZGdlLCBoYWxmNCB2KTsKKyNlbmRpZgorCisvKgorICogdGFuOiBUYW5nZW50CisgKgorICogUmV0dXJucyB0aGUgdGFuZ2VudCBvZiBhbiBhbmdsZSBtZWFzdXJlZCBpbiByYWRpYW5zLgorICoKKyAqIFNlZSBhbHNvIG5hdGl2ZV90YW4oKS4KKyAqLworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHRhbihmbG9hdCB2KTsKKworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICB0YW4oZmxvYXQyIHYpOworCitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHRhbihmbG9hdDMgdik7CisKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgdGFuKGZsb2F0NCB2KTsKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHRhbihoYWxmIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgdGFuKGhhbGYyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgdGFuKGhhbGYzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgdGFuKGhhbGY0IHYpOworI2VuZGlmCisKKy8qCisgKiB0YW5oOiBIeXBlcmJvbGljIHRhbmdlbnQKKyAqCisgKiBSZXR1cm5zIHRoZSBoeXBlcmJvbGljIHRhbmdlbnQgb2YgYSB2YWx1ZS4KKyAqCisgKiBTZWUgYWxzbyBuYXRpdmVfdGFuaCgpLgorICovCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgdGFuaChmbG9hdCB2KTsKKworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICB0YW5oKGZsb2F0MiB2KTsKKworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICB0YW5oKGZsb2F0MyB2KTsKKworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICB0YW5oKGZsb2F0NCB2KTsKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHRhbmgoaGFsZiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHRhbmgoaGFsZjIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICB0YW5oKGhhbGYzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgdGFuaChoYWxmNCB2KTsKKyNlbmRpZgorCisvKgorICogdGFucGk6IFRhbmdlbnQgb2YgYSBudW1iZXIgbXVsdGlwbGllZCBieSBwaQorICoKKyAqIFJldHVybnMgdGhlIHRhbmdlbnQgb2YgKHYgKiBwaSksIHdoZXJlICh2ICogcGkpIGlzIG1lYXN1cmVkIGluIHJhZGlhbnMuCisgKgorICogVG8gZ2V0IHRoZSB0YW5nZW50IG9mIGEgdmFsdWUgbWVhc3VyZWQgaW4gZGVncmVlcywgY2FsbCB0YW5waSh2IC8gMTgwLmYpLgorICoKKyAqIFNlZSBhbHNvIG5hdGl2ZV90YW5waSgpLgorICovCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgdGFucGkoZmxvYXQgdik7CisKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgdGFucGkoZmxvYXQyIHYpOworCitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHRhbnBpKGZsb2F0MyB2KTsKKworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICB0YW5waShmbG9hdDQgdik7CisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICB0YW5waShoYWxmIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgdGFucGkoaGFsZjIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICB0YW5waShoYWxmMyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGY0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHRhbnBpKGhhbGY0IHYpOworI2VuZGlmCisKKy8qCisgKiB0Z2FtbWE6IEdhbW1hIGZ1bmN0aW9uCisgKgorICogUmV0dXJucyB0aGUgZ2FtbWEgZnVuY3Rpb24gb2YgYSB2YWx1ZS4KKyAqCisgKiBTZWUgYWxzbyBsZ2FtbWEoKS4KKyAqLworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHRnYW1tYShmbG9hdCB2KTsKKworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICB0Z2FtbWEoZmxvYXQyIHYpOworCitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHRnYW1tYShmbG9hdDMgdik7CisKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgdGdhbW1hKGZsb2F0NCB2KTsKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHRnYW1tYShoYWxmIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgdGdhbW1hKGhhbGYyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgdGdhbW1hKGhhbGYzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgdGdhbW1hKGhhbGY0IHYpOworI2VuZGlmCisKKy8qCisgKiB0cnVuYzogVHJ1bmNhdGVzIGEgZmxvYXRpbmcgcG9pbnQKKyAqCisgKiBSb3VuZHMgdG8gaW50ZWdyYWwgdXNpbmcgdHJ1bmNhdGlvbi4KKyAqCisgKiBGb3IgZXhhbXBsZSwgdHJ1bmMoMS43ZikgcmV0dXJucyAxLmYgYW5kIHRydW5jKC0xLjdmKSByZXR1cm5zIC0xLmYuCisgKgorICogU2VlIHJpbnQoKSBhbmQgcm91bmQoKSBmb3Igb3RoZXIgcm91bmRpbmcgb3B0aW9ucy4KKyAqLworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHRydW5jKGZsb2F0IHYpOworCitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHRydW5jKGZsb2F0MiB2KTsKKworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICB0cnVuYyhmbG9hdDMgdik7CisKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgdHJ1bmMoZmxvYXQ0IHYpOworCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgdHJ1bmMoaGFsZiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYyIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIHRydW5jKGhhbGYyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgdHJ1bmMoaGFsZjMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICB0cnVuYyhoYWxmNCB2KTsKKyNlbmRpZgorCisvKgorICogcnNDbGFtcDogUmVzdHJhaW4gYSB2YWx1ZSB0byBhIHJhbmdlCisgKgorICogREVQUkVDQVRFRC4gIERvIG5vdCB1c2UuCisgKgorICogQ2xhbXAgYSB2YWx1ZSBiZXR3ZWVuIGxvdyBhbmQgaGlnaC4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICBhbW91bnQ6IFZhbHVlIHRvIGNsYW1wLgorICogICBsb3c6IExvd2VyIGJvdW5kLgorICogICBoaWdoOiBVcHBlciBib3VuZC4KKyAqLworZXh0ZXJuIGNoYXIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZQorI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKKywgZGVwcmVjYXRlZCgiVXNlIGNsYW1wKCkgaW5zdGVhZC4iKQorI2VuZGlmCispKQorICAgIHJzQ2xhbXAoY2hhciBhbW91bnQsIGNoYXIgbG93LCBjaGFyIGhpZ2gpOworCitleHRlcm4gdWNoYXIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZQorI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKKywgZGVwcmVjYXRlZCgiVXNlIGNsYW1wKCkgaW5zdGVhZC4iKQorI2VuZGlmCispKQorICAgIHJzQ2xhbXAodWNoYXIgYW1vdW50LCB1Y2hhciBsb3csIHVjaGFyIGhpZ2gpOworCitleHRlcm4gc2hvcnQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZQorI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKKywgZGVwcmVjYXRlZCgiVXNlIGNsYW1wKCkgaW5zdGVhZC4iKQorI2VuZGlmCispKQorICAgIHJzQ2xhbXAoc2hvcnQgYW1vdW50LCBzaG9ydCBsb3csIHNob3J0IGhpZ2gpOworCitleHRlcm4gdXNob3J0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCissIGRlcHJlY2F0ZWQoIlVzZSBjbGFtcCgpIGluc3RlYWQuIikKKyNlbmRpZgorKSkKKyAgICByc0NsYW1wKHVzaG9ydCBhbW91bnQsIHVzaG9ydCBsb3csIHVzaG9ydCBoaWdoKTsKKworZXh0ZXJuIGludCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjIpKQorLCBkZXByZWNhdGVkKCJVc2UgY2xhbXAoKSBpbnN0ZWFkLiIpCisjZW5kaWYKKykpCisgICAgcnNDbGFtcChpbnQgYW1vdW50LCBpbnQgbG93LCBpbnQgaGlnaCk7CisKK2V4dGVybiB1aW50IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMikpCissIGRlcHJlY2F0ZWQoIlVzZSBjbGFtcCgpIGluc3RlYWQuIikKKyNlbmRpZgorKSkKKyAgICByc0NsYW1wKHVpbnQgYW1vdW50LCB1aW50IGxvdywgdWludCBoaWdoKTsKKworLyoKKyAqIHJzRnJhYzogUmV0dXJucyB0aGUgZnJhY3Rpb25hbCBwYXJ0IG9mIGEgZmxvYXQKKyAqCisgKiBERVBSRUNBVEVELiAgRG8gbm90IHVzZS4KKyAqCisgKiBSZXR1cm5zIHRoZSBmcmFjdGlvbmFsIHBhcnQgb2YgYSBmbG9hdAorICovCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZQorI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKKywgZGVwcmVjYXRlZCgiVXNlIGZyYWN0KCkgaW5zdGVhZC4iKQorI2VuZGlmCispKQorICAgIHJzRnJhYyhmbG9hdCB2KTsKKworLyoKKyAqIHJzUmFuZDogUHNldWRvLXJhbmRvbSBudW1iZXIKKyAqCisgKiBSZXR1cm4gYSByYW5kb20gdmFsdWUgYmV0d2VlbiAwIChvciBtaW5fdmFsdWUpIGFuZCBtYXhfbWFsdWUuCisgKi8KK2V4dGVybiBpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1JhbmQoaW50IG1heF92YWx1ZSk7CisKK2V4dGVybiBpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1JhbmQoaW50IG1pbl92YWx1ZSwgaW50IG1heF92YWx1ZSk7CisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzUmFuZChmbG9hdCBtYXhfdmFsdWUpOworCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1JhbmQoZmxvYXQgbWluX3ZhbHVlLCBmbG9hdCBtYXhfdmFsdWUpOworCisjZW5kaWYgLy8gUkVOREVSU0NSSVBUX1JTX01BVEhfUlNICmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvaW5jbHVkZS9yc19tYXRyaXgucnNoIGIvcmVuZGVyc2NyaXB0L2luY2x1ZGUvcnNfbWF0cml4LnJzaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2RjMjdmCi0tLSAvZGV2L251bGwKKysrIGIvcmVuZGVyc2NyaXB0L2luY2x1ZGUvcnNfbWF0cml4LnJzaApAQCAtMCwwICsxLDYxMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIERvbid0IGVkaXQgdGhpcyBmaWxlISAgSXQgaXMgYXV0by1nZW5lcmF0ZWQgYnkgZnJhbWV3b3Jrcy9ycy9hcGkvZ2VuZXJhdGUuc2guCisKKy8qCisgKiByc19tYXRyaXgucnNoOiBNYXRyaXggRnVuY3Rpb25zCisgKgorICogVGhlc2UgZnVuY3Rpb25zIGxldCB5b3UgbWFuaXB1bGF0ZSBzcXVhcmUgbWF0cmljZXMgb2YgcmFuayAyeDIsIDN4MywgYW5kIDR4NC4KKyAqIFRoZXkgYXJlIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIGdyYXBoaWNhbCB0cmFuc2Zvcm1hdGlvbnMgYW5kIGFyZSBjb21wYXRpYmxlCisgKiB3aXRoIE9wZW5HTC4KKyAqCisgKiBXZSB1c2UgYSB6ZXJvLWJhc2VkIGluZGV4IGZvciByb3dzIGFuZCBjb2x1bW5zLiAgRS5nLiB0aGUgbGFzdCBlbGVtZW50IG9mIGEKKyAqIHJzX21hdHJpeDR4NCBpcyBmb3VuZCBhdCAoMywgMykuCisgKgorICogUmVuZGVyU2NyaXB0IHVzZXMgY29sdW1uLW1ham9yIG1hdHJpY2VzIGFuZCBjb2x1bW4tYmFzZWQgdmVjdG9ycy4gIFRyYW5zZm9ybWluZworICogYSB2ZWN0b3IgaXMgZG9uZSBieSBwb3N0bXVsdGlwbHlpbmcgdGhlIHZlY3RvciwgZS5nLiAobWF0cml4ICogdmVjdG9yKSwKKyAqIGFzIHByb3ZpZGVkIGJ5IHJzTWF0cml4TXVsdGlwbHkoKS4KKyAqCisgKiBUbyBjcmVhdGUgYSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggdGhhdCBwZXJmb3JtcyB0d28gdHJhbnNmb3JtYXRpb25zIGF0IG9uY2UsCisgKiBtdWx0aXBseSB0aGUgdHdvIHNvdXJjZSBtYXRyaWNlcywgd2l0aCB0aGUgZmlyc3QgdHJhbnNmb3JtYXRpb24gYXMgdGhlIHJpZ2h0CisgKiBhcmd1bWVudC4gIEUuZy4gdG8gY3JlYXRlIGEgdHJhbnNmb3JtYXRpb24gbWF0cml4IHRoYXQgYXBwbGllcyB0aGUKKyAqIHRyYW5zZm9ybWF0aW9uIHMxIGZvbGxvd2VkIGJ5IHMyLCBjYWxsIHJzTWF0cml4TG9hZE11bHRpcGx5KCZjb21iaW5lZCwgJnMyLCAmczEpLgorICogVGhpcyBkZXJpdmVzIGZyb20gczIgKiAoczEgKiB2KSwgd2hpY2ggaXMgKHMyICogczEpICogdi4KKyAqCisgKiBXZSBoYXZlIHR3byBzdHlsZSBvZiBmdW5jdGlvbnMgdG8gY3JlYXRlIHRyYW5zZm9ybWF0aW9uIG1hdHJpY2VzOgorICogcnNNYXRyaXhMb2FkVHJhbnNmb3JtYXRpb24gYW5kIHJzTWF0cml4VHJhbnNmb3JtYXRpb24uICBUaGUgZm9ybWVyCisgKiBzdHlsZSBzaW1wbHkgc3RvcmVzIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggaW4gdGhlIGZpcnN0IGFyZ3VtZW50LiAgVGhlIGxhdHRlcgorICogbW9kaWZpZXMgYSBwcmUtZXhpc3RpbmcgdHJhbnNmb3JtYXRpb24gbWF0cml4IHNvIHRoYXQgdGhlIG5ldyB0cmFuc2Zvcm1hdGlvbgorICogaGFwcGVucyBmaXJzdC4gIEUuZy4gaWYgeW91IGNhbGwgcnNNYXRyaXhUcmFuc2xhdGUoKSBvbiBhIG1hdHJpeCB0aGF0IGFscmVhZHkKKyAqIGRvZXMgYSBzY2FsaW5nLCB0aGUgcmVzdWx0aW5nIG1hdHJpeCB3aGVuIGFwcGxpZWQgdG8gYSB2ZWN0b3Igd2lsbCBmaXJzdCBkbyB0aGUKKyAqIHRyYW5zbGF0aW9uIHRoZW4gdGhlIHNjYWxpbmcuCisgKi8KKworI2lmbmRlZiBSRU5ERVJTQ1JJUFRfUlNfTUFUUklYX1JTSAorI2RlZmluZSBSRU5ERVJTQ1JJUFRfUlNfTUFUUklYX1JTSAorCisjaW5jbHVkZSAicnNfdmVjdG9yX21hdGgucnNoIgorCisvKgorICogcnNFeHRyYWN0RnJ1c3R1bVBsYW5lczogQ29tcHV0ZSBmcnVzdHVtIHBsYW5lcworICoKKyAqIENvbXB1dGVzIDYgZnJ1c3R1bSBwbGFuZXMgZnJvbSB0aGUgdmlldyBwcm9qZWN0aW9uIG1hdHJpeAorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgIHZpZXdQcm9qOiBNYXRyaXggdG8gZXh0cmFjdCBwbGFuZXMgZnJvbS4KKyAqICAgbGVmdDogTGVmdCBwbGFuZS4KKyAqICAgcmlnaHQ6IFJpZ2h0IHBsYW5lLgorICogICB0b3A6IFRvcCBwbGFuZS4KKyAqICAgYm90dG9tOiBCb3R0b20gcGxhbmUuCisgKiAgIG5lYXI6IE5lYXIgcGxhbmUuCisgKiAgIGZhcjogRmFyIHBsYW5lLgorICovCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMjMpCitzdGF0aWMgaW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0V4dHJhY3RGcnVzdHVtUGxhbmVzKGNvbnN0IHJzX21hdHJpeDR4NCogdmlld1Byb2osIGZsb2F0NCogbGVmdCwgZmxvYXQ0KiByaWdodCwgZmxvYXQ0KiB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdDQqIGJvdHRvbSwgZmxvYXQ0KiBuZWFyLCBmbG9hdDQqIGZhcikgeworICAgIC8vIHggeSB6IHcgPSBhIGIgYyBkIGluIHRoZSBwbGFuZSBlcXVhdGlvbgorICAgIGxlZnQtPnggPSB2aWV3UHJvai0+bVszXSArIHZpZXdQcm9qLT5tWzBdOworICAgIGxlZnQtPnkgPSB2aWV3UHJvai0+bVs3XSArIHZpZXdQcm9qLT5tWzRdOworICAgIGxlZnQtPnogPSB2aWV3UHJvai0+bVsxMV0gKyB2aWV3UHJvai0+bVs4XTsKKyAgICBsZWZ0LT53ID0gdmlld1Byb2otPm1bMTVdICsgdmlld1Byb2otPm1bMTJdOworCisgICAgcmlnaHQtPnggPSB2aWV3UHJvai0+bVszXSAtIHZpZXdQcm9qLT5tWzBdOworICAgIHJpZ2h0LT55ID0gdmlld1Byb2otPm1bN10gLSB2aWV3UHJvai0+bVs0XTsKKyAgICByaWdodC0+eiA9IHZpZXdQcm9qLT5tWzExXSAtIHZpZXdQcm9qLT5tWzhdOworICAgIHJpZ2h0LT53ID0gdmlld1Byb2otPm1bMTVdIC0gdmlld1Byb2otPm1bMTJdOworCisgICAgdG9wLT54ID0gdmlld1Byb2otPm1bM10gLSB2aWV3UHJvai0+bVsxXTsKKyAgICB0b3AtPnkgPSB2aWV3UHJvai0+bVs3XSAtIHZpZXdQcm9qLT5tWzVdOworICAgIHRvcC0+eiA9IHZpZXdQcm9qLT5tWzExXSAtIHZpZXdQcm9qLT5tWzldOworICAgIHRvcC0+dyA9IHZpZXdQcm9qLT5tWzE1XSAtIHZpZXdQcm9qLT5tWzEzXTsKKworICAgIGJvdHRvbS0+eCA9IHZpZXdQcm9qLT5tWzNdICsgdmlld1Byb2otPm1bMV07CisgICAgYm90dG9tLT55ID0gdmlld1Byb2otPm1bN10gKyB2aWV3UHJvai0+bVs1XTsKKyAgICBib3R0b20tPnogPSB2aWV3UHJvai0+bVsxMV0gKyB2aWV3UHJvai0+bVs5XTsKKyAgICBib3R0b20tPncgPSB2aWV3UHJvai0+bVsxNV0gKyB2aWV3UHJvai0+bVsxM107CisKKyAgICBuZWFyLT54ID0gdmlld1Byb2otPm1bM10gKyB2aWV3UHJvai0+bVsyXTsKKyAgICBuZWFyLT55ID0gdmlld1Byb2otPm1bN10gKyB2aWV3UHJvai0+bVs2XTsKKyAgICBuZWFyLT56ID0gdmlld1Byb2otPm1bMTFdICsgdmlld1Byb2otPm1bMTBdOworICAgIG5lYXItPncgPSB2aWV3UHJvai0+bVsxNV0gKyB2aWV3UHJvai0+bVsxNF07CisKKyAgICBmYXItPnggPSB2aWV3UHJvai0+bVszXSAtIHZpZXdQcm9qLT5tWzJdOworICAgIGZhci0+eSA9IHZpZXdQcm9qLT5tWzddIC0gdmlld1Byb2otPm1bNl07CisgICAgZmFyLT56ID0gdmlld1Byb2otPm1bMTFdIC0gdmlld1Byb2otPm1bMTBdOworICAgIGZhci0+dyA9IHZpZXdQcm9qLT5tWzE1XSAtIHZpZXdQcm9qLT5tWzE0XTsKKworICAgIGZsb2F0IGxlbiA9IGxlbmd0aChsZWZ0LT54eXopOworICAgICpsZWZ0IC89IGxlbjsKKyAgICBsZW4gPSBsZW5ndGgocmlnaHQtPnh5eik7CisgICAgKnJpZ2h0IC89IGxlbjsKKyAgICBsZW4gPSBsZW5ndGgodG9wLT54eXopOworICAgICp0b3AgLz0gbGVuOworICAgIGxlbiA9IGxlbmd0aChib3R0b20tPnh5eik7CisgICAgKmJvdHRvbSAvPSBsZW47CisgICAgbGVuID0gbGVuZ3RoKG5lYXItPnh5eik7CisgICAgKm5lYXIgLz0gbGVuOworICAgIGxlbiA9IGxlbmd0aChmYXItPnh5eik7CisgICAgKmZhciAvPSBsZW47Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNFeHRyYWN0RnJ1c3R1bVBsYW5lcyhjb25zdCByc19tYXRyaXg0eDQqIHZpZXdQcm9qLCBmbG9hdDQqIGxlZnQsIGZsb2F0NCogcmlnaCwgZmxvYXQ0KiB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdDQqIGJvdHRvbSwgZmxvYXQ0KiBuZWFyLCBmbG9hdDQqIGZhcik7CisjZW5kaWYKKworLyoKKyAqIHJzSXNTcGhlcmVJbkZydXN0dW06IENoZWNrcyBpZiBhIHNwaGVyZSBpcyB3aXRoaW4gdGhlIGZydXN0dW0gcGxhbmVzCisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGhlcmUgaXMgd2l0aGluIHRoZSA2IGZydXN0dW0gcGxhbmVzLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgIHNwaGVyZTogZmxvYXQ0IHJlcHJlc2VudGluZyB0aGUgc3BoZXJlLgorICogICBsZWZ0OiBMZWZ0IHBsYW5lLgorICogICByaWdodDogUmlnaHQgcGxhbmUuCisgKiAgIHRvcDogVG9wIHBsYW5lLgorICogICBib3R0b206IEJvdHRvbSBwbGFuZS4KKyAqICAgbmVhcjogTmVhciBwbGFuZS4KKyAqICAgZmFyOiBGYXIgcGxhbmUuCisgKi8KKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAyMykKK3N0YXRpYyBpbmxpbmUgYm9vbCBfX2F0dHJpYnV0ZV9fKChhbHdheXNfaW5saW5lLCBvdmVybG9hZGFibGUpKQorICAgIHJzSXNTcGhlcmVJbkZydXN0dW0oZmxvYXQ0KiBzcGhlcmUsIGZsb2F0NCogbGVmdCwgZmxvYXQ0KiByaWdodCwgZmxvYXQ0KiB0b3AsIGZsb2F0NCogYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQ0KiBuZWFyLCBmbG9hdDQqIGZhcikgeworICAgIGZsb2F0IGRpc3RUb0NlbnRlciA9IGRvdChsZWZ0LT54eXosIHNwaGVyZS0+eHl6KSArIGxlZnQtPnc7CisgICAgaWYgKGRpc3RUb0NlbnRlciA8IC1zcGhlcmUtPncpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBkaXN0VG9DZW50ZXIgPSBkb3QocmlnaHQtPnh5eiwgc3BoZXJlLT54eXopICsgcmlnaHQtPnc7CisgICAgaWYgKGRpc3RUb0NlbnRlciA8IC1zcGhlcmUtPncpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBkaXN0VG9DZW50ZXIgPSBkb3QodG9wLT54eXosIHNwaGVyZS0+eHl6KSArIHRvcC0+dzsKKyAgICBpZiAoZGlzdFRvQ2VudGVyIDwgLXNwaGVyZS0+dykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGRpc3RUb0NlbnRlciA9IGRvdChib3R0b20tPnh5eiwgc3BoZXJlLT54eXopICsgYm90dG9tLT53OworICAgIGlmIChkaXN0VG9DZW50ZXIgPCAtc3BoZXJlLT53KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZGlzdFRvQ2VudGVyID0gZG90KG5lYXItPnh5eiwgc3BoZXJlLT54eXopICsgbmVhci0+dzsKKyAgICBpZiAoZGlzdFRvQ2VudGVyIDwgLXNwaGVyZS0+dykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGRpc3RUb0NlbnRlciA9IGRvdChmYXItPnh5eiwgc3BoZXJlLT54eXopICsgZmFyLT53OworICAgIGlmIChkaXN0VG9DZW50ZXIgPCAtc3BoZXJlLT53KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBib29sIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNJc1NwaGVyZUluRnJ1c3R1bShmbG9hdDQqIHNwaGVyZSwgZmxvYXQ0KiBsZWZ0LCBmbG9hdDQqIHJpZ2h0LCBmbG9hdDQqIHRvcCwgZmxvYXQ0KiBib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdDQqIG5lYXIsIGZsb2F0NCogZmFyKTsKKyNlbmRpZgorCisvKgorICogcnNNYXRyaXhHZXQ6IEdldCBvbmUgZWxlbWVudAorICoKKyAqIFJldHVybnMgb25lIGVsZW1lbnQgb2YgYSBtYXRyaXguCisgKgorICogV2FybmluZzogVGhlIG9yZGVyIG9mIHRoZSBjb2x1bW4gYW5kIHJvdyBwYXJhbWV0ZXJzIG1heSBiZSB1bmV4cGVjdGVkLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgIG06IE1hdHJpeCB0byBleHRyYWN0IHRoZSBlbGVtZW50IGZyb20uCisgKiAgIGNvbDogWmVyby1iYXNlZCBjb2x1bW4gb2YgdGhlIGVsZW1lbnQgdG8gYmUgZXh0cmFjdGVkLgorICogICByb3c6IFplcm8tYmFzZWQgcm93IG9mIHRoZSBlbGVtZW50IHRvIGV4dHJhY3RlZC4KKyAqLworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNNYXRyaXhHZXQoY29uc3QgcnNfbWF0cml4NHg0KiBtLCB1aW50MzJfdCBjb2wsIHVpbnQzMl90IHJvdyk7CisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzTWF0cml4R2V0KGNvbnN0IHJzX21hdHJpeDN4MyogbSwgdWludDMyX3QgY29sLCB1aW50MzJfdCByb3cpOworCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc01hdHJpeEdldChjb25zdCByc19tYXRyaXgyeDIqIG0sIHVpbnQzMl90IGNvbCwgdWludDMyX3Qgcm93KTsKKworLyoKKyAqIHJzTWF0cml4SW52ZXJzZTogSW52ZXJ0cyBhIG1hdHJpeCBpbiBwbGFjZQorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWF0cml4IHdhcyBzdWNjZXNzZnVsbHkgaW52ZXJ0ZWQuCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgbTogTWF0cml4IHRvIGludmVydC4KKyAqLworZXh0ZXJuIGJvb2wgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc01hdHJpeEludmVyc2UocnNfbWF0cml4NHg0KiBtKTsKKworLyoKKyAqIHJzTWF0cml4SW52ZXJzZVRyYW5zcG9zZTogSW52ZXJ0cyBhbmQgdHJhbnNwb3NlIGEgbWF0cml4IGluIHBsYWNlCisgKgorICogVGhlIG1hdHJpeCBpcyBmaXJzdCBpbnZlcnRlZCB0aGVuIHRyYW5zcG9zZWQuIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWF0cml4IHdhcworICogc3VjY2Vzc2Z1bGx5IGludmVydGVkLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgIG06IE1hdHJpeCB0byBtb2RpZnkuCisgKi8KK2V4dGVybiBib29sIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNNYXRyaXhJbnZlcnNlVHJhbnNwb3NlKHJzX21hdHJpeDR4NCogbSk7CisKKy8qCisgKiByc01hdHJpeExvYWQ6IExvYWQgb3IgY29weSBhIG1hdHJpeAorICoKKyAqIFNldCB0aGUgZWxlbWVudHMgb2YgYSBtYXRyaXggZnJvbSBhbiBhcnJheSBvZiBmbG9hdHMgb3IgZnJvbSBhbm90aGVyIG1hdHJpeC4KKyAqCisgKiBJZiBsb2FkaW5nIGZyb20gYW4gYXJyYXksIHRoZSBmbG9hdHMgc2hvdWxkIGJlIGluIHJvdy1tYWpvciBvcmRlciwgaS5lLiB0aGUgZWxlbWVudCBhCisgKiByb3cgMCwgY29sdW1uIDAgc2hvdWxkIGJlIGZpcnN0LCBmb2xsb3dlZCBieSB0aGUgZWxlbWVudCBhdAorICogcm93IDAsIGNvbHVtbiAxLCBldGMuCisgKgorICogSWYgbG9hZGluZyBmcm9tIGEgbWF0cml4IGFuZCB0aGUgc291cmNlIGlzIHNtYWxsZXIgdGhhbiB0aGUgZGVzdGluYXRpb24sIHRoZSByZXN0CisgKiBvZiB0aGUgZGVzdGluYXRpb24gaXMgZmlsbGVkIHdpdGggZWxlbWVudHMgb2YgdGhlIGlkZW50aXR5IG1hdHJpeC4gIEUuZy4KKyAqIGxvYWRpbmcgYSByc19tYXRyaXgyeDIgaW50byBhIHJzX21hdHJpeDR4NCB3aWxsIGdpdmU6CisgKgorICogbTAwIG0wMSAwLjAgMC4wCisgKiBtMTAgbTExIDAuMCAwLjAKKyAqIDAuMCAwLjAgMS4wIDAuMAorICogMC4wIDAuMCAwLjAgMS4wCisgKgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgIGRlc3RpbmF0aW9uOiBNYXRyaXggdG8gc2V0LgorICogICBhcnJheTogQXJyYXkgb2YgdmFsdWVzIHRvIHNldCB0aGUgbWF0cml4IHRvLiBUaGVzZSBhcnJheXMgc2hvdWxkIGJlIDQsIDksIG9yIDE2IGZsb2F0cyBsb25nLCBkZXBlbmRpbmcgb24gdGhlIG1hdHJpeCBzaXplLgorICogICBzb3VyY2U6IFNvdXJjZSBtYXRyaXguCisgKi8KK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNNYXRyaXhMb2FkKHJzX21hdHJpeDR4NCogZGVzdGluYXRpb24sIGNvbnN0IGZsb2F0KiBhcnJheSk7CisKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNNYXRyaXhMb2FkKHJzX21hdHJpeDN4MyogZGVzdGluYXRpb24sIGNvbnN0IGZsb2F0KiBhcnJheSk7CisKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNNYXRyaXhMb2FkKHJzX21hdHJpeDJ4MiogZGVzdGluYXRpb24sIGNvbnN0IGZsb2F0KiBhcnJheSk7CisKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNNYXRyaXhMb2FkKHJzX21hdHJpeDR4NCogZGVzdGluYXRpb24sIGNvbnN0IHJzX21hdHJpeDR4NCogc291cmNlKTsKKworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc01hdHJpeExvYWQocnNfbWF0cml4M3gzKiBkZXN0aW5hdGlvbiwgY29uc3QgcnNfbWF0cml4M3gzKiBzb3VyY2UpOworCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzTWF0cml4TG9hZChyc19tYXRyaXgyeDIqIGRlc3RpbmF0aW9uLCBjb25zdCByc19tYXRyaXgyeDIqIHNvdXJjZSk7CisKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNNYXRyaXhMb2FkKHJzX21hdHJpeDR4NCogZGVzdGluYXRpb24sIGNvbnN0IHJzX21hdHJpeDN4Myogc291cmNlKTsKKworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc01hdHJpeExvYWQocnNfbWF0cml4NHg0KiBkZXN0aW5hdGlvbiwgY29uc3QgcnNfbWF0cml4MngyKiBzb3VyY2UpOworCisvKgorICogcnNNYXRyaXhMb2FkRnJ1c3R1bTogTG9hZCBhIGZydXN0dW0gcHJvamVjdGlvbiBtYXRyaXgKKyAqCisgKiBDb25zdHJ1Y3RzIGEgZnJ1c3R1bSBwcm9qZWN0aW9uIG1hdHJpeCwgdHJhbnNmb3JtaW5nIHRoZSBib3ggaWRlbnRpZmllZCBieQorICogdGhlIHNpeCBjbGlwcGluZyBwbGFuZXMgbGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCBuZWFyLCBmYXIuCisgKgorICogVG8gYXBwbHkgdGhpcyBwcm9qZWN0aW9uIHRvIGEgdmVjdG9yLCBtdWx0aXBseSB0aGUgdmVjdG9yIGJ5IHRoZSBjcmVhdGVkCisgKiBtYXRyaXggdXNpbmcgcnNNYXRyaXhNdWx0aXBseSgpLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgIG06IE1hdHJpeCB0byBzZXQuCisgKi8KK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNNYXRyaXhMb2FkRnJ1c3R1bShyc19tYXRyaXg0eDQqIG0sIGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGZsb2F0IHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG5lYXIsIGZsb2F0IGZhcik7CisKKy8qCisgKiByc01hdHJpeExvYWRJZGVudGl0eTogTG9hZCBpZGVudGl0eSBtYXRyaXgKKyAqCisgKiBTZXQgdGhlIGVsZW1lbnRzIG9mIGEgbWF0cml4IHRvIHRoZSBpZGVudGl0eSBtYXRyaXguCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgbTogTWF0cml4IHRvIHNldC4KKyAqLworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc01hdHJpeExvYWRJZGVudGl0eShyc19tYXRyaXg0eDQqIG0pOworCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzTWF0cml4TG9hZElkZW50aXR5KHJzX21hdHJpeDN4MyogbSk7CisKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNNYXRyaXhMb2FkSWRlbnRpdHkocnNfbWF0cml4MngyKiBtKTsKKworLyoKKyAqIHJzTWF0cml4TG9hZE11bHRpcGx5OiBNdWx0aXBseSB0d28gbWF0cmljZXMKKyAqCisgKiBTZXRzIG0gdG8gdGhlIG1hdHJpeCBwcm9kdWN0IG9mIGxocyAqIHJocy4KKyAqCisgKiBUbyBjb21iaW5lIHR3byA0eDQgdHJhbnNmb3JtYXRvbiBtYXRyaWNlcywgbXVsdGlwbHkgdGhlIHNlY29uZCB0cmFuc2Zvcm1hdGlvbiBtYXRyaXgKKyAqIGJ5IHRoZSBmaXJzdCB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguICBFLmcuIHRvIGNyZWF0ZSBhIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCB0aGF0IGFwcGxpZXMKKyAqIHRoZSB0cmFuc2Zvcm1hdGlvbiBzMSBmb2xsb3dlZCBieSBzMiwgY2FsbCByc01hdHJpeExvYWRNdWx0aXBseSgmY29tYmluZWQsICZzMiwgJnMxKS4KKyAqCisgKiBXYXJuaW5nOiBQcmlvciB0byB2ZXJzaW9uIDIxLCBzdG9yaW5nIHRoZSByZXN1bHQgYmFjayBpbnRvIHJpZ2h0IG1hdHJpeCBpcyBub3Qgc3VwcG9ydGVkIGFuZAorICogd2lsbCByZXN1bHQgaW4gdW5kZWZpbmVkIGJlaGF2aW9yLiAgVXNlIHJzTWF0cml4TXVsaXRwbHkgaW5zdGVhZC4gICBFLmcuIGluc3RlYWQgb2YgZG9pbmcKKyAqIHJzTWF0cml4TG9hZE11bHRpcGx5ICgmbTJyLCAmbTJyLCAmbTJsKSwgdXNlIHJzTWF0cml4TXVsdGlwbHkgKCZtMnIsICZtMmwpLgorICogcnNNYXRyaXhMb2FkTXVsdGlwbHkgKCZtMmwsICZtMnIsICZtMmwpIHdvcmtzIGFzIGV4cGVjdGVkLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgIG06IE1hdHJpeCB0byBzZXQuCisgKiAgIGxoczogTGVmdCBtYXRyaXggb2YgdGhlIHByb2R1Y3QuCisgKiAgIHJoczogUmlnaHQgbWF0cml4IG9mIHRoZSBwcm9kdWN0LgorICovCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzTWF0cml4TG9hZE11bHRpcGx5KHJzX21hdHJpeDR4NCogbSwgY29uc3QgcnNfbWF0cml4NHg0KiBsaHMsIGNvbnN0IHJzX21hdHJpeDR4NCogcmhzKTsKKworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc01hdHJpeExvYWRNdWx0aXBseShyc19tYXRyaXgzeDMqIG0sIGNvbnN0IHJzX21hdHJpeDN4MyogbGhzLCBjb25zdCByc19tYXRyaXgzeDMqIHJocyk7CisKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNNYXRyaXhMb2FkTXVsdGlwbHkocnNfbWF0cml4MngyKiBtLCBjb25zdCByc19tYXRyaXgyeDIqIGxocywgY29uc3QgcnNfbWF0cml4MngyKiByaHMpOworCisvKgorICogcnNNYXRyaXhMb2FkT3J0aG86IExvYWQgYW4gb3J0aG9ncmFwaGljIHByb2plY3Rpb24gbWF0cml4CisgKgorICogQ29uc3RydWN0cyBhbiBvcnRob2dyYXBoaWMgcHJvamVjdGlvbiBtYXRyaXgsIHRyYW5zZm9ybWluZyB0aGUgYm94IGlkZW50aWZpZWQgYnkgdGhlCisgKiBzaXggY2xpcHBpbmcgcGxhbmVzIGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgbmVhciwgZmFyIGludG8gYSB1bml0IGN1YmUKKyAqIHdpdGggYSBjb3JuZXIgYXQgKC0xLCAtMSwgLTEpIGFuZCB0aGUgb3Bwb3NpdGUgYXQgKDEsIDEsIDEpLgorICoKKyAqIFRvIGFwcGx5IHRoaXMgcHJvamVjdGlvbiB0byBhIHZlY3RvciwgbXVsdGlwbHkgdGhlIHZlY3RvciBieSB0aGUgY3JlYXRlZCBtYXRyaXgKKyAqIHVzaW5nIHJzTWF0cml4TXVsdGlwbHkoKS4KKyAqCisgKiBTZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvT3J0aG9ncmFwaGljX3Byb2plY3Rpb24gLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgIG06IE1hdHJpeCB0byBzZXQuCisgKi8KK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNNYXRyaXhMb2FkT3J0aG8ocnNfbWF0cml4NHg0KiBtLCBmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBmbG9hdCB0b3AsIGZsb2F0IG5lYXIsCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZmFyKTsKKworLyoKKyAqIHJzTWF0cml4TG9hZFBlcnNwZWN0aXZlOiBMb2FkIGEgcGVyc3BlY3RpdmUgcHJvamVjdGlvbiBtYXRyaXgKKyAqCisgKiBDb25zdHJ1Y3RzIGEgcGVyc3BlY3RpdmUgcHJvamVjdGlvbiBtYXRyaXgsIGFzc3VtaW5nIGEgc3ltbWV0cmljYWwgZmllbGQgb2Ygdmlldy4KKyAqCisgKiBUbyBhcHBseSB0aGlzIHByb2plY3Rpb24gdG8gYSB2ZWN0b3IsIG11bHRpcGx5IHRoZSB2ZWN0b3IgYnkgdGhlIGNyZWF0ZWQgbWF0cml4CisgKiB1c2luZyByc01hdHJpeE11bHRpcGx5KCkuCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgbTogTWF0cml4IHRvIHNldC4KKyAqICAgZm92eTogRmllbGQgb2YgdmlldywgaW4gZGVncmVlcyBhbG9uZyB0aGUgWSBheGlzLgorICogICBhc3BlY3Q6IFJhdGlvIG9mIHggLyB5LgorICogICBuZWFyOiBOZWFyIGNsaXBwaW5nIHBsYW5lLgorICogICBmYXI6IEZhciBjbGlwcGluZyBwbGFuZS4KKyAqLworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc01hdHJpeExvYWRQZXJzcGVjdGl2ZShyc19tYXRyaXg0eDQqIG0sIGZsb2F0IGZvdnksIGZsb2F0IGFzcGVjdCwgZmxvYXQgbmVhciwgZmxvYXQgZmFyKTsKKworLyoKKyAqIHJzTWF0cml4TG9hZFJvdGF0ZTogTG9hZCBhIHJvdGF0aW9uIG1hdHJpeAorICoKKyAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIHJvdGF0aW9uIG1hdHJpeC4gIFRoZSBheGlzIG9mIHJvdGF0aW9uIGlzIHRoZSAoeCwgeSwgeikgdmVjdG9yLgorICoKKyAqIFRvIHJvdGF0ZSBhIHZlY3RvciwgbXVsdGlwbHkgdGhlIHZlY3RvciBieSB0aGUgY3JlYXRlZCBtYXRyaXggdXNpbmcgcnNNYXRyaXhNdWx0aXBseSgpLgorICoKKyAqIFNlZSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1JvdGF0aW9uX21hdHJpeCAuCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgbTogTWF0cml4IHRvIHNldC4KKyAqICAgcm90OiBIb3cgbXVjaCByb3RhdGlvbiB0byBkbywgaW4gZGVncmVlcy4KKyAqICAgeDogWCBjb21wb25lbnQgb2YgdGhlIHZlY3RvciB0aGF0IGlzIHRoZSBheGlzIG9mIHJvdGF0aW9uLgorICogICB5OiBZIGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yIHRoYXQgaXMgdGhlIGF4aXMgb2Ygcm90YXRpb24uCisgKiAgIHo6IFogY29tcG9uZW50IG9mIHRoZSB2ZWN0b3IgdGhhdCBpcyB0aGUgYXhpcyBvZiByb3RhdGlvbi4KKyAqLworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc01hdHJpeExvYWRSb3RhdGUocnNfbWF0cml4NHg0KiBtLCBmbG9hdCByb3QsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopOworCisvKgorICogcnNNYXRyaXhMb2FkU2NhbGU6IExvYWQgYSBzY2FsaW5nIG1hdHJpeAorICoKKyAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIHNjYWxpbmcgbWF0cml4LCB3aGVyZSBlYWNoIGNvbXBvbmVudCBvZiBhIHZlY3RvciBpcyBtdWx0aXBsaWVkCisgKiBieSBhIG51bWJlci4gIFRoaXMgbnVtYmVyIGNhbiBiZSBuZWdhdGl2ZS4KKyAqCisgKiBUbyBzY2FsZSBhIHZlY3RvciwgbXVsdGlwbHkgdGhlIHZlY3RvciBieSB0aGUgY3JlYXRlZCBtYXRyaXggdXNpbmcgcnNNYXRyaXhNdWx0aXBseSgpLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgIG06IE1hdHJpeCB0byBzZXQuCisgKiAgIHg6IE11bHRpcGxlIHRvIHNjYWxlIHRoZSB4IGNvbXBvbmVudHMgYnkuCisgKiAgIHk6IE11bHRpcGxlIHRvIHNjYWxlIHRoZSB5IGNvbXBvbmVudHMgYnkuCisgKiAgIHo6IE11bHRpcGxlIHRvIHNjYWxlIHRoZSB6IGNvbXBvbmVudHMgYnkuCisgKi8KK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNNYXRyaXhMb2FkU2NhbGUocnNfbWF0cml4NHg0KiBtLCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KTsKKworLyoKKyAqIHJzTWF0cml4TG9hZFRyYW5zbGF0ZTogTG9hZCBhIHRyYW5zbGF0aW9uIG1hdHJpeAorICoKKyAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIHRyYW5zbGF0aW9uIG1hdHJpeCwgd2hlcmUgYSBudW1iZXIgaXMgYWRkZWQgdG8gZWFjaCBlbGVtZW50IG9mCisgKiBhIHZlY3Rvci4KKyAqCisgKiBUbyB0cmFuc2xhdGUgYSB2ZWN0b3IsIG11bHRpcGx5IHRoZSB2ZWN0b3IgYnkgdGhlIGNyZWF0ZWQgbWF0cml4IHVzaW5nCisgKiByc01hdHJpeE11bHRpcGx5KCkuCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgbTogTWF0cml4IHRvIHNldC4KKyAqICAgeDogTnVtYmVyIHRvIGFkZCB0byBlYWNoIHggY29tcG9uZW50LgorICogICB5OiBOdW1iZXIgdG8gYWRkIHRvIGVhY2ggeSBjb21wb25lbnQuCisgKiAgIHo6IE51bWJlciB0byBhZGQgdG8gZWFjaCB6IGNvbXBvbmVudC4KKyAqLworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc01hdHJpeExvYWRUcmFuc2xhdGUocnNfbWF0cml4NHg0KiBtLCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KTsKKworLyoKKyAqIHJzTWF0cml4TXVsdGlwbHk6IE11bHRpcGx5IGEgbWF0cml4IGJ5IGEgdmVjdG9yIG9yIGFub3RoZXIgbWF0cml4CisgKgorICogRm9yIHRoZSBtYXRyaXggYnkgbWF0cml4IHZhcmlhbnQsIHNldHMgbSB0byB0aGUgbWF0cml4IHByb2R1Y3QgbSAqIHJocy4KKyAqCisgKiBXaGVuIGNvbWJpbmluZyB0d28gNHg0IHRyYW5zZm9ybWF0aW9uIG1hdHJpY2VzIHVzaW5nIHRoaXMgZnVuY3Rpb24sIHRoZSByZXN1bHRpbmcKKyAqIG1hdHJpeCB3aWxsIGNvcnJlc3BvbmQgdG8gcGVyZm9ybWluZyB0aGUgcmhzIHRyYW5zZm9ybWF0aW9uIGZpcnN0IGZvbGxvd2VkIGJ5CisgKiB0aGUgb3JpZ2luYWwgbSB0cmFuc2Zvcm1hdGlvbi4KKyAqCisgKiBGb3IgdGhlIG1hdHJpeCBieSB2ZWN0b3IgdmFyaWFudCwgcmV0dXJucyB0aGUgcG9zdC1tdWx0aXBsaWNhdGlvbiBvZiB0aGUgdmVjdG9yCisgKiBieSB0aGUgbWF0cml4LCBpZS4gbSAqIGluLgorICoKKyAqIFdoZW4gbXVsdGlwbHlpbmcgYSBmbG9hdDMgdG8gYSByc19tYXRyaXg0eDQsIHRoZSB2ZWN0b3IgaXMgZXhwYW5kZWQgd2l0aCAoMSkuCisgKgorICogV2hlbiBtdWx0aXBseWluZyBhIGZsb2F0MiB0byBhIHJzX21hdHJpeDR4NCwgdGhlIHZlY3RvciBpcyBleHBhbmRlZCB3aXRoICgwLCAxKS4KKyAqCisgKiBXaGVuIG11bHRpcGx5aW5nIGEgZmxvYXQyIHRvIGEgcnNfbWF0cml4M3gzLCB0aGUgdmVjdG9yIGlzIGV4cGFuZGVkIHdpdGggKDApLgorICoKKyAqIFN0YXJ0aW5nIHdpdGggQVBJIDE0LCB0aGlzIGZ1bmN0aW9uIHRha2VzIGEgY29uc3QgbWF0cml4IGFzIHRoZSBmaXJzdCBhcmd1bWVudC4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICBtOiBMZWZ0IG1hdHJpeCBvZiB0aGUgcHJvZHVjdCBhbmQgdGhlIG1hdHJpeCB0byBiZSBzZXQuCisgKiAgIHJoczogUmlnaHQgbWF0cml4IG9mIHRoZSBwcm9kdWN0LgorICovCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzTWF0cml4TXVsdGlwbHkocnNfbWF0cml4NHg0KiBtLCBjb25zdCByc19tYXRyaXg0eDQqIHJocyk7CisKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNNYXRyaXhNdWx0aXBseShyc19tYXRyaXgzeDMqIG0sIGNvbnN0IHJzX21hdHJpeDN4MyogcmhzKTsKKworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc01hdHJpeE11bHRpcGx5KHJzX21hdHJpeDJ4MiogbSwgY29uc3QgcnNfbWF0cml4MngyKiByaHMpOworCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMTMpCitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNNYXRyaXhNdWx0aXBseShyc19tYXRyaXg0eDQqIG0sIGZsb2F0NCBpbik7CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDEzKQorZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzTWF0cml4TXVsdGlwbHkocnNfbWF0cml4NHg0KiBtLCBmbG9hdDMgaW4pOworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAxMykKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc01hdHJpeE11bHRpcGx5KHJzX21hdHJpeDR4NCogbSwgZmxvYXQyIGluKTsKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMTMpCitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNNYXRyaXhNdWx0aXBseShyc19tYXRyaXgzeDMqIG0sIGZsb2F0MyBpbik7CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDEzKQorZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzTWF0cml4TXVsdGlwbHkocnNfbWF0cml4M3gzKiBtLCBmbG9hdDIgaW4pOworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAxMykKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc01hdHJpeE11bHRpcGx5KHJzX21hdHJpeDJ4MiogbSwgZmxvYXQyIGluKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTQpKQorZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzTWF0cml4TXVsdGlwbHkoY29uc3QgcnNfbWF0cml4NHg0KiBtLCBmbG9hdDQgaW4pOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxNCkpCitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNNYXRyaXhNdWx0aXBseShjb25zdCByc19tYXRyaXg0eDQqIG0sIGZsb2F0MyBpbik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE0KSkKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc01hdHJpeE11bHRpcGx5KGNvbnN0IHJzX21hdHJpeDR4NCogbSwgZmxvYXQyIGluKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTQpKQorZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzTWF0cml4TXVsdGlwbHkoY29uc3QgcnNfbWF0cml4M3gzKiBtLCBmbG9hdDMgaW4pOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxNCkpCitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNNYXRyaXhNdWx0aXBseShjb25zdCByc19tYXRyaXgzeDMqIG0sIGZsb2F0MiBpbik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE0KSkKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc01hdHJpeE11bHRpcGx5KGNvbnN0IHJzX21hdHJpeDJ4MiogbSwgZmxvYXQyIGluKTsKKyNlbmRpZgorCisvKgorICogcnNNYXRyaXhSb3RhdGU6IEFwcGx5IGEgcm90YXRpb24gdG8gYSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXgKKyAqCisgKiBNdWx0aXBseSB0aGUgbWF0cml4IG0gd2l0aCBhIHJvdGF0aW9uIG1hdHJpeC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG1vZGlmaWVzIGEgdHJhbnNmb3JtYXRpb24gbWF0cml4IHRvIGZpcnN0IGRvIGEgcm90YXRpb24uICBUaGUgYXhpcyBvZgorICogcm90YXRpb24gaXMgdGhlICh4LCB5LCB6KSB2ZWN0b3IuCisgKgorICogVG8gYXBwbHkgdGhpcyBjb21iaW5lZCB0cmFuc2Zvcm1hdGlvbiB0byBhIHZlY3RvciwgbXVsdGlwbHkgdGhlIHZlY3RvciBieSB0aGUgY3JlYXRlZAorICogbWF0cml4IHVzaW5nIHJzTWF0cml4TXVsdGlwbHkoKS4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICBtOiBNYXRyaXggdG8gbW9kaWZ5LgorICogICByb3Q6IEhvdyBtdWNoIHJvdGF0aW9uIHRvIGRvLCBpbiBkZWdyZWVzLgorICogICB4OiBYIGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yIHRoYXQgaXMgdGhlIGF4aXMgb2Ygcm90YXRpb24uCisgKiAgIHk6IFkgY29tcG9uZW50IG9mIHRoZSB2ZWN0b3IgdGhhdCBpcyB0aGUgYXhpcyBvZiByb3RhdGlvbi4KKyAqICAgejogWiBjb21wb25lbnQgb2YgdGhlIHZlY3RvciB0aGF0IGlzIHRoZSBheGlzIG9mIHJvdGF0aW9uLgorICovCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzTWF0cml4Um90YXRlKHJzX21hdHJpeDR4NCogbSwgZmxvYXQgcm90LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KTsKKworLyoKKyAqIHJzTWF0cml4U2NhbGU6IEFwcGx5IGEgc2NhbGluZyB0byBhIHRyYW5zZm9ybWF0aW9uIG1hdHJpeAorICoKKyAqIE11bHRpcGx5IHRoZSBtYXRyaXggbSB3aXRoIGEgc2NhbGluZyBtYXRyaXguCisgKgorICogVGhpcyBmdW5jdGlvbiBtb2RpZmllcyBhIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCB0byBmaXJzdCBkbyBhIHNjYWxpbmcuICAgV2hlbiBzY2FsaW5nLAorICogZWFjaCBjb21wb25lbnQgb2YgYSB2ZWN0b3IgaXMgbXVsdGlwbGllZCBieSBhIG51bWJlci4gIFRoaXMgbnVtYmVyIGNhbiBiZSBuZWdhdGl2ZS4KKyAqCisgKiBUbyBhcHBseSB0aGlzIGNvbWJpbmVkIHRyYW5zZm9ybWF0aW9uIHRvIGEgdmVjdG9yLCBtdWx0aXBseSB0aGUgdmVjdG9yIGJ5IHRoZSBjcmVhdGVkCisgKiBtYXRyaXggdXNpbmcgcnNNYXRyaXhNdWx0aXBseSgpLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgIG06IE1hdHJpeCB0byBtb2RpZnkuCisgKiAgIHg6IE11bHRpcGxlIHRvIHNjYWxlIHRoZSB4IGNvbXBvbmVudHMgYnkuCisgKiAgIHk6IE11bHRpcGxlIHRvIHNjYWxlIHRoZSB5IGNvbXBvbmVudHMgYnkuCisgKiAgIHo6IE11bHRpcGxlIHRvIHNjYWxlIHRoZSB6IGNvbXBvbmVudHMgYnkuCisgKi8KK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNNYXRyaXhTY2FsZShyc19tYXRyaXg0eDQqIG0sIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopOworCisvKgorICogcnNNYXRyaXhTZXQ6IFNldCBvbmUgZWxlbWVudAorICoKKyAqIFNldCBhbiBlbGVtZW50IG9mIGEgbWF0cml4LgorICoKKyAqIFdhcm5pbmc6IFRoZSBvcmRlciBvZiB0aGUgY29sdW1uIGFuZCByb3cgcGFyYW1ldGVycyBtYXkgYmUgdW5leHBlY3RlZC4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICBtOiBNYXRyaXggdGhhdCB3aWxsIGJlIG1vZGlmaWVkLgorICogICBjb2w6IFplcm8tYmFzZWQgY29sdW1uIG9mIHRoZSBlbGVtZW50IHRvIGJlIHNldC4KKyAqICAgcm93OiBaZXJvLWJhc2VkIHJvdyBvZiB0aGUgZWxlbWVudCB0byBiZSBzZXQuCisgKiAgIHY6IFZhbHVlIHRvIHNldC4KKyAqLworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc01hdHJpeFNldChyc19tYXRyaXg0eDQqIG0sIHVpbnQzMl90IGNvbCwgdWludDMyX3Qgcm93LCBmbG9hdCB2KTsKKworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc01hdHJpeFNldChyc19tYXRyaXgzeDMqIG0sIHVpbnQzMl90IGNvbCwgdWludDMyX3Qgcm93LCBmbG9hdCB2KTsKKworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc01hdHJpeFNldChyc19tYXRyaXgyeDIqIG0sIHVpbnQzMl90IGNvbCwgdWludDMyX3Qgcm93LCBmbG9hdCB2KTsKKworLyoKKyAqIHJzTWF0cml4VHJhbnNsYXRlOiBBcHBseSBhIHRyYW5zbGF0aW9uIHRvIGEgdHJhbnNmb3JtYXRpb24gbWF0cml4CisgKgorICogTXVsdGlwbHkgdGhlIG1hdHJpeCBtIHdpdGggYSB0cmFuc2xhdGlvbiBtYXRyaXguCisgKgorICogVGhpcyBmdW5jdGlvbiBtb2RpZmllcyBhIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCB0byBmaXJzdCBkbyBhIHRyYW5zbGF0aW9uLiAgV2hlbgorICogdHJhbnNsYXRpbmcsIGEgbnVtYmVyIGlzIGFkZGVkIHRvIGVhY2ggY29tcG9uZW50IG9mIGEgdmVjdG9yLgorICoKKyAqIFRvIGFwcGx5IHRoaXMgY29tYmluZWQgdHJhbnNmb3JtYXRpb24gdG8gYSB2ZWN0b3IsIG11bHRpcGx5IHRoZSB2ZWN0b3IgYnkgdGhlCisgKiBjcmVhdGVkIG1hdHJpeCB1c2luZyByc01hdHJpeE11bHRpcGx5KCkuCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgbTogTWF0cml4IHRvIG1vZGlmeS4KKyAqICAgeDogTnVtYmVyIHRvIGFkZCB0byBlYWNoIHggY29tcG9uZW50LgorICogICB5OiBOdW1iZXIgdG8gYWRkIHRvIGVhY2ggeSBjb21wb25lbnQuCisgKiAgIHo6IE51bWJlciB0byBhZGQgdG8gZWFjaCB6IGNvbXBvbmVudC4KKyAqLworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc01hdHJpeFRyYW5zbGF0ZShyc19tYXRyaXg0eDQqIG0sIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopOworCisvKgorICogcnNNYXRyaXhUcmFuc3Bvc2U6IFRyYW5zcG9zZSBhIG1hdHJpeCBwbGFjZQorICoKKyAqIFRyYW5zcG9zZSB0aGUgbWF0cml4IG0gaW4gcGxhY2UuCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgbTogTWF0cml4IHRvIHRyYW5zcG9zZS4KKyAqLworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc01hdHJpeFRyYW5zcG9zZShyc19tYXRyaXg0eDQqIG0pOworCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzTWF0cml4VHJhbnNwb3NlKHJzX21hdHJpeDN4MyogbSk7CisKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNNYXRyaXhUcmFuc3Bvc2UocnNfbWF0cml4MngyKiBtKTsKKworI2VuZGlmIC8vIFJFTkRFUlNDUklQVF9SU19NQVRSSVhfUlNICmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvaW5jbHVkZS9yc19vYmplY3RfaW5mby5yc2ggYi9yZW5kZXJzY3JpcHQvaW5jbHVkZS9yc19vYmplY3RfaW5mby5yc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIxOGRlMwotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9pbmNsdWRlL3JzX29iamVjdF9pbmZvLnJzaApAQCAtMCwwICsxLDQ2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIERvbid0IGVkaXQgdGhpcyBmaWxlISAgSXQgaXMgYXV0by1nZW5lcmF0ZWQgYnkgZnJhbWV3b3Jrcy9ycy9hcGkvZ2VuZXJhdGUuc2guCisKKy8qCisgKiByc19vYmplY3RfaW5mby5yc2g6IE9iamVjdCBDaGFyYWN0ZXJpc3RpY3MgRnVuY3Rpb25zCisgKgorICogVGhlIGZ1bmN0aW9ucyBiZWxvdyBjYW4gYmUgdXNlZCB0byBxdWVyeSB0aGUgY2hhcmFjdGVyaXN0aWNzIG9mIGFuIEFsbG9jYXRpb24sIEVsZW1lbnQsCisgKiBvciBTYW1wbGVyIG9iamVjdC4gIFRoZXNlIG9iamVjdHMgYXJlIGNyZWF0ZWQgZnJvbSBKYXZhLiAgWW91IGNhbid0IGNyZWF0ZSB0aGVtIGZyb20gYQorICogc2NyaXB0LgorICoKKyAqIEFsbG9jYXRpb25zOgorICoKKyAqIEFsbG9jYXRpb25zIGFyZSB0aGUgcHJpbWFyeSBtZXRob2QgdXNlZCB0byBwYXNzIGRhdGEgdG8gYW5kIGZyb20gUmVuZGVyU2NyaXB0IGtlcm5lbHMuCisgKgorICogVGhleSBhcmUgYSBzdHJ1Y3R1cmVkIGNvbGxlY3Rpb24gb2YgY2VsbHMgdGhhdCBjYW4gYmUgdXNlZCB0byBzdG9yZSBiaXRtYXBzLCB0ZXh0dXJlcywKKyAqIGFyYml0cmFyeSBkYXRhIHBvaW50cywgZXRjLgorICoKKyAqIFRoaXMgY29sbGVjdGlvbiBvZiBjZWxscyBtYXkgaGF2ZSBtYW55IGRpbWVuc2lvbnMgKFgsIFksIFosIEFycmF5MCwgQXJyYXkxLCBBcnJheTIsIEFycmF5MyksCisgKiBmYWNlcyAoZm9yIGN1YmVtYXBzKSwgYW5kIGxldmVsIG9mIGRldGFpbHMgKGZvciBtaXBtYXBwaW5nKS4KKyAqCisgKiBTZWUgdGhlIGFuZHJvaWQucmVuZGVyc2NyaXB0LkFsbG9jYXRpb24gZm9yIGRldGFpbHMgb24gdG8gY3JlYXRlIEFsbG9jYXRpb25zLgorICoKKyAqIEVsZW1lbnRzOgorICoKKyAqIFRoZSB0ZXJtICJlbGVtZW50IiBpcyB1c2VkIGEgYml0IGFtYmlndW91c2x5IGluIFJlbmRlclNjcmlwdCwgYXMgYm90aCB0eXBlIGluZm9ybWF0aW9uCisgKiBmb3IgdGhlIGNlbGxzIG9mIGFuIEFsbG9jYXRpb24gYW5kIHRoZSBpbnN0YW50aWF0aW9uIG9mIHRoYXQgdHlwZS4gIEZvciBleGFtcGxlOgorICogLSByc19lbGVtZW50IGlzIGEgaGFuZGxlIHRvIGEgdHlwZSBzcGVjaWZpY2F0aW9uLCBhbmQKKyAqIC0gSW4gZnVuY3Rpb25zIGxpa2UgcnNHZXRFbGVtZW50QXQoKSwgImVsZW1lbnQiIG1lYW5zIHRoZSBpbnN0YW50aWF0aW9uIG9mIHRoZSB0eXBlLAorICogICAgIGkuZS4gYSBjZWxsIG9mIGFuIEFsbG9jYXRpb24uCisgKgorICogVGhlIGZ1bmN0aW9ucyBiZWxvdyBsZXQgeW91IHF1ZXJ5IHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIHR5cGUgc3BlY2lmaWNpYXRpb24uCisgKgorICogQW4gRWxlbWVudCBjYW4gc3BlY2lmeSBhIHNpbXBsZSBkYXRhIHR5cGVzIGFzIGZvdW5kIGluIEMsIGUuZy4gYW4gaW50ZWdlciwgZmxvYXQsIG9yCisgKiBib29sZWFuLiAgSXQgY2FuIGFsc28gc3BlY2lmeSBhIGhhbmRsZSB0byBhIFJlbmRlclNjcmlwdCBvYmplY3QuICBTZWUgcnNfZGF0YV90eXBlIGZvcgorICogYSBsaXN0IG9mIGJhc2ljIHR5cGVzLgorICoKKyAqIEVsZW1lbnRzIGNhbiBzcGVjaWZ5IGZpeGVkIHNpemUgdmVjdG9yIChvZiBzaXplIDIsIDMsIG9yIDQpIHZlcnNpb25zIG9mIHRoZSBiYXNpYyB0eXBlcy4KKyAqIEVsZW1lbnRzIGNhbiBiZSBncm91cGVkIHRvZ2V0aGVyIGludG8gY29tcGxleCBFbGVtZW50cywgY3JlYXRpbmcgdGhlIGVxdWl2YWxlbnQgb2YKKyAqIEMgc3RydWN0dXJlIGRlZmluaXRpb25zLgorICoKKyAqIEVsZW1lbnRzIGNhbiBhbHNvIGhhdmUgYSBraW5kLCB3aGljaCBpcyBzZW1hbnRpYyBpbmZvcm1hdGlvbiB1c2VkIHRvIGludGVycHJldCBwaXhlbAorICogZGF0YS4gIFNlZSByc19kYXRhX2tpbmQuCisgKgorICogV2hlbiBjcmVhdGluZyBBbGxvY2F0aW9ucyBvZiBjb21tb24gZWxlbWVudHMsIHlvdSBjYW4gc2ltcGx5IHVzZSBvbmUgb2YgdGhlIG1hbnkgcHJlZGVmaW5lZAorICogRWxlbWVudHMgbGlrZSBGMzJfMi4KKyAqCisgKiBUbyBjcmVhdGUgY29tcGxleCBFbGVtZW50cywgdXNlIHRoZSBFbGVtZW50LkJ1aWxkZXIgSmF2YSBjbGFzcy4KKyAqCisgKiBTYW1wbGVyczoKKyAqCisgKiBTYW1wbGVycyBvYmplY3RzIGRlZmluZSBob3cgQWxsb2NhdGlvbnMgY2FuIGJlIHJlYWQgYXMgc3RydWN0dXJlIHdpdGhpbiBhIGtlcm5lbC4KKyAqIFNlZSBhbmRyb2lkLnJlbmRlcnNjcmlwdC5TLgorICovCisKKyNpZm5kZWYgUkVOREVSU0NSSVBUX1JTX09CSkVDVF9JTkZPX1JTSAorI2RlZmluZSBSRU5ERVJTQ1JJUFRfUlNfT0JKRUNUX0lORk9fUlNICisKKy8qCisgKiByc0FsbG9jYXRpb25HZXREaW1GYWNlczogUHJlc2VuY2Ugb2YgbW9yZSB0aGFuIG9uZSBmYWNlCisgKgorICogSWYgdGhlIEFsbG9jYXRpb24gaXMgYSBjdWJlbWFwLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgMSBpZiB0aGVyZSdzIG1vcmUgdGhhbiBvbmUgZmFjZQorICogcHJlc2VudC4gIEluIGFsbCBvdGhlciBjYXNlcywgaXQgcmV0dXJucyAwLgorICoKKyAqIFVzZSByc0dldERpbUhhc0ZhY2VzKCkgdG8gZ2V0IHRoZSBkaW1lbnNpb24gb2YgYSBjdXJyZW50bHkgcnVubmluZyBrZXJuZWwuCisgKgorICogUmV0dXJuczogUmV0dXJucyAxIGlmIG1vcmUgdGhhbiBvbmUgZmFjZSBpcyBwcmVzZW50LCAwIG90aGVyd2lzZS4KKyAqLworZXh0ZXJuIHVpbnQzMl90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uR2V0RGltRmFjZXMocnNfYWxsb2NhdGlvbiBhKTsKKworLyoKKyAqIHJzQWxsb2NhdGlvbkdldERpbUxPRDogUHJlc2VuY2Ugb2YgbGV2ZWxzIG9mIGRldGFpbAorICoKKyAqIFF1ZXJ5IGFuIEFsbG9jYXRpb24gZm9yIHRoZSBwcmVzZW5jZSBvZiBtb3JlIHRoYW4gb25lIExldmVsIE9mIERldGFpbC4gIFRoaXMgaXMgdXNlZnVsCisgKiBmb3IgbWlwbWFwcy4KKyAqCisgKiBVc2UgcnNHZXREaW1Mb2QoKSB0byBnZXQgdGhlIGRpbWVuc2lvbiBvZiBhIGN1cnJlbnRseSBydW5uaW5nIGtlcm5lbC4KKyAqCisgKiBSZXR1cm5zOiBSZXR1cm5zIDEgaWYgbW9yZSB0aGFuIG9uZSBMT0QgaXMgcHJlc2VudCwgMCBvdGhlcndpc2UuCisgKi8KK2V4dGVybiB1aW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvbkdldERpbUxPRChyc19hbGxvY2F0aW9uIGEpOworCisvKgorICogcnNBbGxvY2F0aW9uR2V0RGltWDogU2l6ZSBvZiB0aGUgWCBkaW1lbnNpb24KKyAqCisgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBYIGRpbWVuc2lvbiBvZiB0aGUgQWxsb2NhdGlvbi4KKyAqCisgKiBVc2UgcnNHZXREaW1YKCkgdG8gZ2V0IHRoZSBkaW1lbnNpb24gb2YgYSBjdXJyZW50bHkgcnVubmluZyBrZXJuZWwuCisgKgorICogUmV0dXJuczogWCBkaW1lbnNpb24gb2YgdGhlIEFsbG9jYXRpb24uCisgKi8KK2V4dGVybiB1aW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvbkdldERpbVgocnNfYWxsb2NhdGlvbiBhKTsKKworLyoKKyAqIHJzQWxsb2NhdGlvbkdldERpbVk6IFNpemUgb2YgdGhlIFkgZGltZW5zaW9uCisgKgorICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgWSBkaW1lbnNpb24gb2YgdGhlIEFsbG9jYXRpb24uICBJZiB0aGUgQWxsb2NhdGlvbiBoYXMgbGVzcworICogdGhhbiB0d28gZGltZW5zaW9ucywgcmV0dXJucyAwLgorICoKKyAqIFVzZSByc0dldERpbVkoKSB0byBnZXQgdGhlIGRpbWVuc2lvbiBvZiBhIGN1cnJlbnRseSBydW5uaW5nIGtlcm5lbC4KKyAqCisgKiBSZXR1cm5zOiBZIGRpbWVuc2lvbiBvZiB0aGUgQWxsb2NhdGlvbi4KKyAqLworZXh0ZXJuIHVpbnQzMl90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uR2V0RGltWShyc19hbGxvY2F0aW9uIGEpOworCisvKgorICogcnNBbGxvY2F0aW9uR2V0RGltWjogU2l6ZSBvZiB0aGUgWiBkaW1lbnNpb24KKyAqCisgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBaIGRpbWVuc2lvbiBvZiB0aGUgQWxsb2NhdGlvbi4gIElmIHRoZSBBbGxvY2F0aW9uIGhhcyBsZXNzCisgKiB0aGFuIHRocmVlIGRpbWVuc2lvbnMsIHJldHVybnMgMC4KKyAqCisgKiBVc2UgcnNHZXREaW1aKCkgdG8gZ2V0IHRoZSBkaW1lbnNpb24gb2YgYSBjdXJyZW50bHkgcnVubmluZyBrZXJuZWwuCisgKgorICogUmV0dXJuczogWiBkaW1lbnNpb24gb2YgdGhlIEFsbG9jYXRpb24uCisgKi8KK2V4dGVybiB1aW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvbkdldERpbVoocnNfYWxsb2NhdGlvbiBhKTsKKworLyoKKyAqIHJzQWxsb2NhdGlvbkdldEVsZW1lbnQ6IEdldCB0aGUgb2JqZWN0IHRoYXQgZGVzY3JpYmVzIHRoZSBjZWxsIG9mIGFuIEFsbG9jYXRpb24KKyAqCisgKiBHZXQgdGhlIEVsZW1lbnQgb2JqZWN0IGRlc2NyaWJpbmcgdGhlIHR5cGUsIGtpbmQsIGFuZCBvdGhlciBjaGFyYWN0ZXJpc3RpY3Mgb2YgYSBjZWxsCisgKiBvZiBhbiBBbGxvY2F0aW9uLiAgU2VlIHRoZSByc0VsZW1lbnQqIGZ1bmN0aW9ucyBiZWxvdy4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICBhOiBBbGxvY2F0aW9uIHRvIGdldCBkYXRhIGZyb20uCisgKgorICogUmV0dXJuczogRWxlbWVudCBkZXNjcmliaW5nIEFsbG9jYXRpb24gbGF5b3V0LgorICovCitleHRlcm4gcnNfZWxlbWVudCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvbkdldEVsZW1lbnQocnNfYWxsb2NhdGlvbiBhKTsKKworLyoKKyAqIHJzQ2xlYXJPYmplY3Q6IFJlbGVhc2UgYW4gb2JqZWN0CisgKgorICogVGVsbHMgdGhlIHJ1biB0aW1lIHRoYXQgdGhpcyBoYW5kbGUgd2lsbCBubyBsb25nZXIgYmUgdXNlZCB0byBhY2Nlc3MgdGhlIHRoZSByZWxhdGVkCisgKiBvYmplY3QuICBJZiB0aGlzIHdhcyB0aGUgbGFzdCBoYW5kbGUgdG8gdGhhdCBvYmplY3QsIHJlc291cmNlIHJlY292ZXJ5IG1heSBoYXBwZW4uCisgKgorICogQWZ0ZXIgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLCAqZHN0IHdpbGwgYmUgc2V0IHRvIGFuIGVtcHR5IGhhbmRsZS4gIFNlZSByc0lzT2JqZWN0KCkuCisgKi8KK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDbGVhck9iamVjdChyc19lbGVtZW50KiBkc3QpOworCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ2xlYXJPYmplY3QocnNfdHlwZSogZHN0KTsKKworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NsZWFyT2JqZWN0KHJzX2FsbG9jYXRpb24qIGRzdCk7CisKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDbGVhck9iamVjdChyc19zYW1wbGVyKiBkc3QpOworCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ2xlYXJPYmplY3QocnNfc2NyaXB0KiBkc3QpOworCisvKgorICogcnNJc09iamVjdDogQ2hlY2sgZm9yIGFuIGVtcHR5IGhhbmRsZQorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgaGFuZGxlIGNvbnRhaW5zIGEgbm9uLW51bGwgcmVmZXJlbmNlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgdmFsaWRhdGUgdGhhdCB0aGUgaW50ZXJuYWwgcG9pbnRlciB1c2VkIGluIHRoZSBoYW5kbGUKKyAqIHBvaW50cyB0byBhbiBhY3R1YWwgdmFsaWQgb2JqZWN0OyBpdCBvbmx5IGNoZWNrcyBmb3IgbnVsbC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHRoZSBFbGVtZW50IHJldHVybmVkIGJ5IHJzRWxlbWVudEdldFN1YkVsZW1lbnQoKQorICogb3Igc2VlIGlmIHJzQ2xlYXJPYmplY3QoKSBoYXMgYmVlbiBjYWxsZWQgb24gYSBoYW5kbGUuCisgKi8KK2V4dGVybiBib29sIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNJc09iamVjdChyc19lbGVtZW50IHYpOworCitleHRlcm4gYm9vbCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzSXNPYmplY3QocnNfdHlwZSB2KTsKKworZXh0ZXJuIGJvb2wgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0lzT2JqZWN0KHJzX2FsbG9jYXRpb24gdik7CisKK2V4dGVybiBib29sIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNJc09iamVjdChyc19zYW1wbGVyIHYpOworCitleHRlcm4gYm9vbCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzSXNPYmplY3QocnNfc2NyaXB0IHYpOworCisvKgorICogcnNFbGVtZW50R2V0Qnl0ZXNTaXplOiBTaXplIG9mIGFuIEVsZW1lbnQKKyAqCisgKiBSZXR1cm5zIHRoZSBzaXplIGluIGJ5dGVzIHRoYXQgYW4gaW5zdGFudGlhdGlvbiBvZiB0aGlzIEVsZW1lbnQgd2lsbCBvY2N1cHkuCisgKi8KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxNikpCitleHRlcm4gdWludDMyX3QgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0VsZW1lbnRHZXRCeXRlc1NpemUocnNfZWxlbWVudCBlKTsKKyNlbmRpZgorCisvKgorICogcnNFbGVtZW50R2V0RGF0YUtpbmQ6IEtpbmQgb2YgYW4gRWxlbWVudAorICoKKyAqIFJldHVybnMgdGhlIEVsZW1lbnQncyBkYXRhIGtpbmQuICBUaGlzIGlzIHVzZWQgdG8gaW50ZXJwcmV0IHBpeGVsIGRhdGEuCisgKgorICogU2VlIHJzX2RhdGFfa2luZC4KKyAqLworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE2KSkKK2V4dGVybiByc19kYXRhX2tpbmQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0VsZW1lbnRHZXREYXRhS2luZChyc19lbGVtZW50IGUpOworI2VuZGlmCisKKy8qCisgKiByc0VsZW1lbnRHZXREYXRhVHlwZTogRGF0YSB0eXBlIG9mIGFuIEVsZW1lbnQKKyAqCisgKiBSZXR1cm5zIHRoZSBFbGVtZW50J3MgYmFzZSBkYXRhIHR5cGUuICBUaGlzIGNhbiBiZSBhIHR5cGUgc2ltaWxhciB0byBDL0MrKyAoZS5nLgorICogUlNfVFlQRV9VTlNJR05FRF84KSwgYSBoYW5kbGUgKGUuZy4gUlNfVFlQRV9BTExPQ0FUSU9OIGFuZCBSU19UWVBFX0VMRU1FTlQpLCBvciBhCisgKiBtb3JlIGNvbXBsZXggbnVtZXJpY2FsIHR5cGUgKGUuZy4gUlNfVFlQRV9VTlNJR05FRF81XzZfNSBhbmQgUlNfVFlQRV9NQVRSSVhfNFg0KS4KKyAqIFNlZSByc19kYXRhX3R5cGUuCisgKgorICogSWYgdGhlIEVsZW1lbnQgZGVzY3JpYmVzIGEgdmVjdG9yLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGRhdGEgdHlwZSBvZiBvbmUgb2YgaXRzIGl0ZW1zLgorICogVXNlIHJzRWxlbWVudEdldFZlY3RvclNpemUgdG8gZ2V0IHRoZSBzaXplIG9mIHRoZSB2ZWN0b3IuCisgKgorICogSWYgdGhlIEVsZW1lbnQgZGVzY3JpYmVzIGEgc3RydWN0dXJlLCBSU19UWVBFX05PTkUgaXMgcmV0dXJuZWQuICBVc2UgdGhlIHJzRWxlbWVudEdldFN1YioKKyAqIGZ1bmN0aW9ucyB0byBleHBsb3JlIHRoaXMgY29tcGxleCBFbGVtZW50LgorICovCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTYpKQorZXh0ZXJuIHJzX2RhdGFfdHlwZSBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRWxlbWVudEdldERhdGFUeXBlKHJzX2VsZW1lbnQgZSk7CisjZW5kaWYKKworLyoKKyAqIHJzRWxlbWVudEdldFN1YkVsZW1lbnQ6IFN1Yi1lbGVtZW50IG9mIGEgY29tcGxleCBFbGVtZW50CisgKgorICogRm9yIEVsZW1lbnRzIHRoYXQgcmVwcmVzZW50cyBhIHN0cnVjdHVyZSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBzdWItZWxlbWVudCBhdCB0aGUKKyAqIHNwZWNpZmllZCBpbmRleC4KKyAqCisgKiBJZiB0aGUgRWxlbWVudCBpcyBub3QgYSBzdHJ1Y3R1cmUgb3IgdGhlIGluZGV4IGlzIGdyZWF0ZXIgb3IgZXF1YWwgdG8gdGhlIG51bWJlciBvZgorICogc3ViLWVsZW1lbnRzLCBhbiBpbnZhbGlkIGhhbmRsZSBpcyByZXR1cm5lZC4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICBlOiBFbGVtZW50IHRvIHF1ZXJ5LgorICogICBpbmRleDogSW5kZXggb2YgdGhlIHN1Yi1lbGVtZW50IHRvIHJldHVybi4KKyAqCisgKiBSZXR1cm5zOiBTdWItZWxlbWVudCBhdCB0aGUgZ2l2ZW4gaW5kZXguCisgKi8KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxNikpCitleHRlcm4gcnNfZWxlbWVudCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRWxlbWVudEdldFN1YkVsZW1lbnQocnNfZWxlbWVudCBlLCB1aW50MzJfdCBpbmRleCk7CisjZW5kaWYKKworLyoKKyAqIHJzRWxlbWVudEdldFN1YkVsZW1lbnRBcnJheVNpemU6IEFycmF5IHNpemUgb2YgYSBzdWItZWxlbWVudCBvZiBhIGNvbXBsZXggRWxlbWVudAorICoKKyAqIEZvciBjb21wbGV4IEVsZW1lbnRzLCBzdWItZWxlbWVudHMgY2FuIGJlIHN0YXRpY2FsbHkgc2l6ZWQgYXJyYXlzLiAgVGhpcyBmdW5jdGlvbgorICogcmV0dXJucyB0aGUgYXJyYXkgc2l6ZSBvZiB0aGUgc3ViLWVsZW1lbnQgYXQgdGhlIGluZGV4LiAgVGhpcyBzdWItZWxlbWVudCByZXBldGl0aW9uCisgKiBpcyBkaWZmZXJlbnQgdGhhbiBmaXhlZCBzaXplIHZlY3RvcnMuCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgZTogRWxlbWVudCB0byBxdWVyeS4KKyAqICAgaW5kZXg6IEluZGV4IG9mIHRoZSBzdWItZWxlbWVudC4KKyAqCisgKiBSZXR1cm5zOiBBcnJheSBzaXplIG9mIHRoZSBzdWItZWxlbWVudC4KKyAqLworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE2KSkKK2V4dGVybiB1aW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRWxlbWVudEdldFN1YkVsZW1lbnRBcnJheVNpemUocnNfZWxlbWVudCBlLCB1aW50MzJfdCBpbmRleCk7CisjZW5kaWYKKworLyoKKyAqIHJzRWxlbWVudEdldFN1YkVsZW1lbnRDb3VudDogTnVtYmVyIG9mIHN1Yi1lbGVtZW50cworICoKKyAqIEVsZW1lbnRzIGNhbiBiZSBzaW1wbGUsIHN1Y2ggYXMgYW4gaW50IG9yIGEgZmxvYXQsIG9yIGEgc3RydWN0dXJlIHdpdGggbXVsdGlwbGUKKyAqIHN1Yi1lbGVtZW50cy4gIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB6ZXJvIGZvciBzaW1wbGUgRWxlbWVudHMgYW5kIHRoZSBudW1iZXIgb2YKKyAqIHN1Yi1lbGVtZW50cyBmb3IgY29tcGxleCBFbGVtZW50cy4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICBlOiBFbGVtZW50IHRvIGdldCBkYXRhIGZyb20uCisgKgorICogUmV0dXJuczogTnVtYmVyIG9mIHN1Yi1lbGVtZW50cy4KKyAqLworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE2KSkKK2V4dGVybiB1aW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRWxlbWVudEdldFN1YkVsZW1lbnRDb3VudChyc19lbGVtZW50IGUpOworI2VuZGlmCisKKy8qCisgKiByc0VsZW1lbnRHZXRTdWJFbGVtZW50TmFtZTogTmFtZSBvZiBhIHN1Yi1lbGVtZW50CisgKgorICogRm9yIGNvbXBsZXggRWxlbWVudHMsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgc3ViLWVsZW1lbnQgYXQgdGhlCisgKiBzcGVjaWZpZWQgaW5kZXguCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgZTogRWxlbWVudCB0byBnZXQgZGF0YSBmcm9tLgorICogICBpbmRleDogSW5kZXggb2YgdGhlIHN1Yi1lbGVtZW50LgorICogICBuYW1lOiBBZGRyZXNzIG9mIHRoZSBhcnJheSB0byBzdG9yZSB0aGUgbmFtZSBpbnRvLgorICogICBuYW1lTGVuZ3RoOiBMZW5ndGggb2YgdGhlIHByb3ZpZGVkIG5hbWUgYXJyYXkuCisgKgorICogUmV0dXJuczogTnVtYmVyIG9mIGNoYXJhY3RlcnMgY29waWVkLCBleGNsdWRpbmcgdGhlIG51bGwgdGVybWluYXRvci4KKyAqLworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE2KSkKK2V4dGVybiB1aW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRWxlbWVudEdldFN1YkVsZW1lbnROYW1lKHJzX2VsZW1lbnQgZSwgdWludDMyX3QgaW5kZXgsIGNoYXIqIG5hbWUsIHVpbnQzMl90IG5hbWVMZW5ndGgpOworI2VuZGlmCisKKy8qCisgKiByc0VsZW1lbnRHZXRTdWJFbGVtZW50TmFtZUxlbmd0aDogTGVuZ3RoIG9mIHRoZSBuYW1lIG9mIGEgc3ViLWVsZW1lbnQKKyAqCisgKiBGb3IgY29tcGxleCBFbGVtZW50cywgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG5hbWUgb2YgdGhlIHN1Yi1lbGVtZW50CisgKiBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgIGU6IEVsZW1lbnQgdG8gZ2V0IGRhdGEgZnJvbS4KKyAqICAgaW5kZXg6IEluZGV4IG9mIHRoZSBzdWItZWxlbWVudC4KKyAqCisgKiBSZXR1cm5zOiBMZW5ndGggb2YgdGhlIHN1Yi1lbGVtZW50IG5hbWUgaW5jbHVkaW5nIHRoZSBudWxsIHRlcm1pbmF0b3IuCisgKi8KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxNikpCitleHRlcm4gdWludDMyX3QgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0VsZW1lbnRHZXRTdWJFbGVtZW50TmFtZUxlbmd0aChyc19lbGVtZW50IGUsIHVpbnQzMl90IGluZGV4KTsKKyNlbmRpZgorCisvKgorICogcnNFbGVtZW50R2V0U3ViRWxlbWVudE9mZnNldEJ5dGVzOiBPZmZzZXQgb2YgdGhlIGluc3RhbnRpYXRlZCBzdWItZWxlbWVudAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIGluc3RhbnRpYXRpb24gb2YgdGhlIHNwZWNpZmllZAorICogc3ViLWVsZW1lbnQgd2l0aGluIHRoZSBpbnN0YW50aWF0aW9uIG9mIHRoZSBFbGVtZW50LgorICoKKyAqIEZvciBleGFtcGxlLCBpZiB0aGUgRWxlbWVudCBkZXNjcmliZXMgYSAzMiBiaXQgZmxvYXQgZm9sbG93ZWQgYnkgYSAzMiBiaXQgaW50ZWdlciwKKyAqIHRoZSBvZmZzZXQgcmV0dXJuIGZvciB0aGUgZmlyc3Qgd2lsbCBiZSAwIGFuZCB0aGUgc2Vjb25kIDQuCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgZTogRWxlbWVudCB0byBnZXQgZGF0YSBmcm9tLgorICogICBpbmRleDogSW5kZXggb2YgdGhlIHN1Yi1lbGVtZW50LgorICoKKyAqIFJldHVybnM6IE9mZnNldCBpbiBieXRlcy4KKyAqLworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE2KSkKK2V4dGVybiB1aW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRWxlbWVudEdldFN1YkVsZW1lbnRPZmZzZXRCeXRlcyhyc19lbGVtZW50IGUsIHVpbnQzMl90IGluZGV4KTsKKyNlbmRpZgorCisvKgorICogcnNFbGVtZW50R2V0VmVjdG9yU2l6ZTogVmVjdG9yIHNpemUgb2YgdGhlIEVsZW1lbnQKKyAqCisgKiBSZXR1cm5zIHRoZSBFbGVtZW50J3MgdmVjdG9yIHNpemUuICBJZiB0aGUgRWxlbWVudCBkb2VzIG5vdCByZXByZXNlbnQgYSB2ZWN0b3IsCisgKiAxIGlzIHJldHVybmVkLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgIGU6IEVsZW1lbnQgdG8gZ2V0IGRhdGEgZnJvbS4KKyAqCisgKiBSZXR1cm5zOiBMZW5ndGggb2YgdGhlIGVsZW1lbnQgdmVjdG9yLgorICovCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTYpKQorZXh0ZXJuIHVpbnQzMl90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNFbGVtZW50R2V0VmVjdG9yU2l6ZShyc19lbGVtZW50IGUpOworI2VuZGlmCisKKy8qCisgKiByc0dldEFsbG9jYXRpb246IFJldHVybiB0aGUgQWxsb2NhdGlvbiBmb3IgYSBnaXZlbiBwb2ludGVyCisgKgorICogREVQUkVDQVRFRC4gIERvIG5vdCB1c2UuCisgKgorICogUmV0dXJucyB0aGUgQWxsb2NhdGlvbiBmb3IgYSBnaXZlbiBwb2ludGVyLiAgVGhlIHBvaW50ZXIgc2hvdWxkIHBvaW50IHdpdGhpbiBhIHZhbGlkCisgKiBhbGxvY2F0aW9uLiAgVGhlIHJlc3VsdHMgYXJlIHVuZGVmaW5lZCBpZiB0aGUgcG9pbnRlciBpcyBub3QgZnJvbSBhIHZhbGlkIEFsbG9jYXRpb24uCisgKi8KK2V4dGVybiByc19hbGxvY2F0aW9uIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZQorI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIyKSkKKywgZGVwcmVjYXRlZCgiVGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgU0RLIGluIGEgZnV0dXJlIHJlbGVhc2UuIikKKyNlbmRpZgorKSkKKyAgICByc0dldEFsbG9jYXRpb24oY29uc3Qgdm9pZCogcCk7CisKKy8qCisgKiByc1NhbXBsZXJHZXRBbmlzb3Ryb3B5OiBBbmlzb3Ryb3B5IG9mIHRoZSBTYW1wbGVyCisgKgorICogR2V0IHRoZSBTYW1wbGVyJ3MgYW5pc290cm9weS4KKyAqCisgKiBTZWUgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUy4KKyAqLworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE2KSkKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2FtcGxlckdldEFuaXNvdHJvcHkocnNfc2FtcGxlciBzKTsKKyNlbmRpZgorCisvKgorICogcnNTYW1wbGVyR2V0TWFnbmlmaWNhdGlvbjogU2FtcGxlciBtYWduaWZpY2F0aW9uIHZhbHVlCisgKgorICogR2V0IHRoZSBTYW1wbGVyJ3MgbWFnbmlmaWNhdGlvbiB2YWx1ZS4KKyAqCisgKiBTZWUgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUy4KKyAqLworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE2KSkKK2V4dGVybiByc19zYW1wbGVyX3ZhbHVlIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTYW1wbGVyR2V0TWFnbmlmaWNhdGlvbihyc19zYW1wbGVyIHMpOworI2VuZGlmCisKKy8qCisgKiByc1NhbXBsZXJHZXRNaW5pZmljYXRpb246IFNhbXBsZXIgbWluaWZpY2F0aW9uIHZhbHVlCisgKgorICogR2V0IHRoZSBTYW1wbGVyJ3MgbWluaWZpY2F0aW9uIHZhbHVlLgorICoKKyAqIFNlZSBhbmRyb2lkLnJlbmRlcnNjcmlwdC5TLgorICovCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTYpKQorZXh0ZXJuIHJzX3NhbXBsZXJfdmFsdWUgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NhbXBsZXJHZXRNaW5pZmljYXRpb24ocnNfc2FtcGxlciBzKTsKKyNlbmRpZgorCisvKgorICogcnNTYW1wbGVyR2V0V3JhcFM6IFNhbXBsZXIgd3JhcCBTIHZhbHVlCisgKgorICogR2V0IHRoZSBTYW1wbGVyJ3Mgd3JhcCBTIHZhbHVlLgorICoKKyAqIFNlZSBhbmRyb2lkLnJlbmRlcnNjcmlwdC5TLgorICovCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTYpKQorZXh0ZXJuIHJzX3NhbXBsZXJfdmFsdWUgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NhbXBsZXJHZXRXcmFwUyhyc19zYW1wbGVyIHMpOworI2VuZGlmCisKKy8qCisgKiByc1NhbXBsZXJHZXRXcmFwVDogU2FtcGxlciB3cmFwIFQgdmFsdWUKKyAqCisgKiBHZXQgdGhlIHNhbXBsZXIncyB3cmFwIFQgdmFsdWUuCisgKgorICogU2VlIGFuZHJvaWQucmVuZGVyc2NyaXB0LlMuCisgKi8KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxNikpCitleHRlcm4gcnNfc2FtcGxlcl92YWx1ZSBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2FtcGxlckdldFdyYXBUKHJzX3NhbXBsZXIgcyk7CisjZW5kaWYKKworLyoKKyAqIHJzU2V0T2JqZWN0OiBGb3IgaW50ZXJuYWwgdXNlLgorICoKKyAqLworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldE9iamVjdChyc19lbGVtZW50KiBkc3QsIHJzX2VsZW1lbnQgc3JjKTsKKworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldE9iamVjdChyc190eXBlKiBkc3QsIHJzX3R5cGUgc3JjKTsKKworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldE9iamVjdChyc19hbGxvY2F0aW9uKiBkc3QsIHJzX2FsbG9jYXRpb24gc3JjKTsKKworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldE9iamVjdChyc19zYW1wbGVyKiBkc3QsIHJzX3NhbXBsZXIgc3JjKTsKKworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldE9iamVjdChyc19zY3JpcHQqIGRzdCwgcnNfc2NyaXB0IHNyYyk7CisKKyNlbmRpZiAvLyBSRU5ERVJTQ1JJUFRfUlNfT0JKRUNUX0lORk9fUlNICmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvaW5jbHVkZS9yc19vYmplY3RfdHlwZXMucnNoIGIvcmVuZGVyc2NyaXB0L2luY2x1ZGUvcnNfb2JqZWN0X3R5cGVzLnJzaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTk3NWU1Ci0tLSAvZGV2L251bGwKKysrIGIvcmVuZGVyc2NyaXB0L2luY2x1ZGUvcnNfb2JqZWN0X3R5cGVzLnJzaApAQCAtMCwwICsxLDIzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIERvbid0IGVkaXQgdGhpcyBmaWxlISAgSXQgaXMgYXV0by1nZW5lcmF0ZWQgYnkgZnJhbWV3b3Jrcy9ycy9hcGkvZ2VuZXJhdGUuc2guCisKKy8qCisgKiByc19vYmplY3RfdHlwZXMucnNoOiBPYmplY3QgVHlwZXMKKyAqCisgKiBUaGUgdHlwZXMgYmVsb3cgYXJlIHVzZWQgdG8gbWFuaXB1bGF0ZSBSZW5kZXJTY3JpcHQgb2JqZWN0cyBsaWtlIGFsbG9jYXRpb25zLCBzYW1wbGVycywKKyAqIGVsZW1lbnRzLCBhbmQgc2NyaXB0cy4gIE1vc3Qgb2YgdGhlc2Ugb2JqZWN0IGFyZSBjcmVhdGVkIHVzaW5nIHRoZSBKYXZhIFJlbmRlclNjcmlwdCBBUElzLgorICovCisKKyNpZm5kZWYgUkVOREVSU0NSSVBUX1JTX09CSkVDVF9UWVBFU19SU0gKKyNkZWZpbmUgUkVOREVSU0NSSVBUX1JTX09CSkVDVF9UWVBFU19SU0gKKworI2RlZmluZSBOVUxMICgodm9pZCAqKTApCisKKy8vIE9wYXF1ZSBoYW5kbGUgdG8gYSBSZW5kZXJTY3JpcHQgb2JqZWN0LiBEbyBub3QgdXNlIHRoaXMgZGlyZWN0bHkuCisjaWZuZGVmIF9fTFA2NF9fCisjZGVmaW5lIF9SU19PQkpFQ1RfREVDTCBcCit7XAorICBjb25zdCBpbnQqIGNvbnN0IHA7XAorfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKQorI2Vsc2UKKyNkZWZpbmUgX1JTX09CSkVDVF9ERUNMIFwKK3tcCisgIGNvbnN0IGxvbmcqIGNvbnN0IHA7XAorICBjb25zdCBsb25nKiBjb25zdCB1bnVzZWQxO1wKKyAgY29uc3QgbG9uZyogY29uc3QgdW51c2VkMjtcCisgIGNvbnN0IGxvbmcqIGNvbnN0IHVudXNlZDM7XAorfQorI2VuZGlmCisKKy8qCisgKiByc19lbGVtZW50OiBIYW5kbGUgdG8gYW4gZWxlbWVudAorICoKKyAqIEFuIG9wYXF1ZSBoYW5kbGUgdG8gYSBSZW5kZXJTY3JpcHQgZWxlbWVudC4KKyAqCisgKiBTZWUgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcnNfZWxlbWVudCBfUlNfT0JKRUNUX0RFQ0wgcnNfZWxlbWVudDsKKworLyoKKyAqIHJzX3R5cGU6IEhhbmRsZSB0byBhIFR5cGUKKyAqCisgKiBBbiBvcGFxdWUgaGFuZGxlIHRvIGEgUmVuZGVyU2NyaXB0IHR5cGUuCisgKgorICogU2VlIGFuZHJvaWQucmVuZGVyc2NyaXB0LlR5cGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHJzX3R5cGUgX1JTX09CSkVDVF9ERUNMIHJzX3R5cGU7CisKKy8qCisgKiByc19hbGxvY2F0aW9uOiBIYW5kbGUgdG8gYW4gYWxsb2NhdGlvbgorICoKKyAqIEFuIG9wYXF1ZSBoYW5kbGUgdG8gYSBSZW5kZXJTY3JpcHQgYWxsb2NhdGlvbi4KKyAqCisgKiBTZWUgYW5kcm9pZC5yZW5kZXJzY3JpcHQuQWxsb2NhdGlvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcnNfYWxsb2NhdGlvbiBfUlNfT0JKRUNUX0RFQ0wgcnNfYWxsb2NhdGlvbjsKKworLyoKKyAqIHJzX3NhbXBsZXI6IEhhbmRsZSB0byBhIFNhbXBsZXIKKyAqCisgKiBBbiBvcGFxdWUgaGFuZGxlIHRvIGEgUmVuZGVyU2NyaXB0IHNhbXBsZXIgb2JqZWN0LgorICoKKyAqIFNlZSBhbmRyb2lkLnJlbmRlcnNjcmlwdC5TYW1wbGVyLgorICovCit0eXBlZGVmIHN0cnVjdCByc19zYW1wbGVyIF9SU19PQkpFQ1RfREVDTCByc19zYW1wbGVyOworCisvKgorICogcnNfc2NyaXB0OiBIYW5kbGUgdG8gYSBTY3JpcHQKKyAqCisgKiBBbiBvcGFxdWUgaGFuZGxlIHRvIGEgUmVuZGVyU2NyaXB0IHNjcmlwdCBvYmplY3QuCisgKgorICogU2VlIGFuZHJvaWQucmVuZGVyc2NyaXB0LlNjcmlwdEMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHJzX3NjcmlwdCBfUlNfT0JKRUNUX0RFQ0wgcnNfc2NyaXB0OworCisvKgorICogcnNfYWxsb2NhdGlvbl9jdWJlbWFwX2ZhY2U6IEVudW0gZm9yIHNlbGVjdGluZyBjdWJlIG1hcCBmYWNlcworICoKKyAqIEFuIGVudW0gdXNlZCB0byBzcGVjaWZ5IG9uZSB0aGUgc2l4IGZhY2VzIG9mIGEgY3ViZW1hcC4KKyAqLworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE0KSkKK3R5cGVkZWYgZW51bSB7CisgICAgUlNfQUxMT0NBVElPTl9DVUJFTUFQX0ZBQ0VfUE9TSVRJVkVfWCA9IDAsCisgICAgUlNfQUxMT0NBVElPTl9DVUJFTUFQX0ZBQ0VfTkVHQVRJVkVfWCA9IDEsCisgICAgUlNfQUxMT0NBVElPTl9DVUJFTUFQX0ZBQ0VfUE9TSVRJVkVfWSA9IDIsCisgICAgUlNfQUxMT0NBVElPTl9DVUJFTUFQX0ZBQ0VfTkVHQVRJVkVfWSA9IDMsCisgICAgUlNfQUxMT0NBVElPTl9DVUJFTUFQX0ZBQ0VfUE9TSVRJVkVfWiA9IDQsCisgICAgUlNfQUxMT0NBVElPTl9DVUJFTUFQX0ZBQ0VfTkVHQVRJVkVfWiA9IDUKK30gcnNfYWxsb2NhdGlvbl9jdWJlbWFwX2ZhY2U7CisjZW5kaWYKKworLyoKKyAqIHJzX2FsbG9jYXRpb25fdXNhZ2VfdHlwZTogQml0ZmllbGQgdG8gc3BlY2lmeSBob3cgYW4gYWxsb2NhdGlvbiBpcyB1c2VkCisgKgorICogVGhlc2UgdmFsdWVzIGFyZSBPUmVkIHRvZ2V0aGVyIHRvIHNwZWNpZnkgd2hpY2ggdXNhZ2VzIG9yIG1lbW9yeSBzcGFjZXMgYXJlCisgKiByZWxldmFudCB0byBhbiBhbGxvY2F0aW9uIG9yIGFuIG9wZXJhdGlvbiBvbiBhbiBhbGxvY2F0aW9uLgorICovCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTQpKQordHlwZWRlZiBlbnVtIHsKKyAgICBSU19BTExPQ0FUSU9OX1VTQUdFX1NDUklQVCA9IDB4MDAwMSwgLy8gQWxsb2NhdGlvbiBpcyBib3VuZCB0byBhbmQgYWNjZXNzZWQgYnkgc2NyaXB0cy4KKyAgICBSU19BTExPQ0FUSU9OX1VTQUdFX0dSQVBISUNTX1RFWFRVUkUgPSAweDAwMDIsIC8vIEFsbG9jYXRpb24gaXMgdXNlZCBhcyBhIHRleHR1cmUgc291cmNlLgorICAgIFJTX0FMTE9DQVRJT05fVVNBR0VfR1JBUEhJQ1NfVkVSVEVYID0gMHgwMDA0LCAvLyBEZXByZWNhdGVkLgorICAgIFJTX0FMTE9DQVRJT05fVVNBR0VfR1JBUEhJQ1NfQ09OU1RBTlRTID0gMHgwMDA4LCAvLyBEZXByZWNhdGVkLgorICAgIFJTX0FMTE9DQVRJT05fVVNBR0VfR1JBUEhJQ1NfUkVOREVSX1RBUkdFVCA9IDB4MDAxMCwgLy8gRGVwcmVjYXRlZC4KKyAgICBSU19BTExPQ0FUSU9OX1VTQUdFX0lPX0lOUFVUID0gMHgwMDIwLCAvLyBBbGxvY2F0aW9uIGlzIHVzZWQgYXMgYSBTdXJmYWNlIGNvbnN1bWVyLgorICAgIFJTX0FMTE9DQVRJT05fVVNBR0VfSU9fT1VUUFVUID0gMHgwMDQwLCAvLyBBbGxvY2F0aW9uIGlzIHVzZWQgYXMgYSBTdXJmYWNlIHByb2R1Y2VyLgorICAgIFJTX0FMTE9DQVRJT05fVVNBR0VfU0hBUkVEID0gMHgwMDgwIC8vIEFsbG9jYXRpb24ncyBiYWNraW5nIHN0b3JlIGlzIHNoYXJlZCB3aXRoIGFub3RoZXIgb2JqZWN0ICh1c3VhbGx5IGEgQml0bWFwKS4gIENvcHlpbmcgdG8gb3IgZnJvbSB0aGUgb3JpZ2luYWwgc291cmNlIEJpdG1hcCB3aWxsIGNhdXNlIGEgc3luY2hyb25pemF0aW9uIHJhdGhlciB0aGFuIGEgZnVsbCBjb3B5LgorfSByc19hbGxvY2F0aW9uX3VzYWdlX3R5cGU7CisjZW5kaWYKKworLyoKKyAqIHJzX2RhdGFfdHlwZTogRWxlbWVudCBiYXNpYyBkYXRhIHR5cGUKKyAqCisgKiByc19kYXRhX3R5cGUgaXMgdXNlZCB0byBlbmNvZGUgdGhlIHR5cGUgaW5mb3JtYXRpb24gb2YgYSBiYXNpYyBlbGVtZW50LgorICoKKyAqIFJTX1RZUEVfVU5TSUdORURfNV82XzUsIFJTX1RZUEVfVU5TSUdORURfNV81XzVfMSwgUlNfVFlQRV9VTlNJR05FRF80XzRfNF80IGFyZSBmb3IgcGFja2VkCisgKiBncmFwaGljYWwgZGF0YSBmb3JtYXRzIGFuZCByZXByZXNlbnQgdmVjdG9ycyB3aXRoIHBlciB2ZWN0b3IgbWVtYmVyIHNpemVzIHdoaWNoIGFyZSB0cmVhdGVkCisgKiBhcyBhIHNpbmdsZSB1bml0IGZvciBwYWNraW5nIGFuZCBhbGlnbm1lbnQgcHVycG9zZXMuCisgKi8KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxNikpCit0eXBlZGVmIGVudW0geworICAgIFJTX1RZUEVfTk9ORSA9IDAsIC8vIEVsZW1lbnQgaXMgYSBjb21wbGV4IHR5cGUsIGkuZS4gYSBzdHJ1Y3QuCisgICAgUlNfVFlQRV9GTE9BVF8xNiA9IDEsIC8vIEEgMTYgYml0IGZsb2F0aW5nIHBvaW50IHZhbHVlLgorICAgIFJTX1RZUEVfRkxPQVRfMzIgPSAyLCAvLyBBIDMyIGJpdCBmbG9hdGluZyBwb2ludCB2YWx1ZS4KKyAgICBSU19UWVBFX0ZMT0FUXzY0ID0gMywgLy8gQSA2NCBiaXQgZmxvYXRpbmcgcG9pbnQgdmFsdWUuCisgICAgUlNfVFlQRV9TSUdORURfOCA9IDQsIC8vIEFuIDggYml0IHNpZ25lZCBpbnRlZ2VyLgorICAgIFJTX1RZUEVfU0lHTkVEXzE2ID0gNSwgLy8gQSAxNiBiaXQgc2lnbmVkIGludGVnZXIuCisgICAgUlNfVFlQRV9TSUdORURfMzIgPSA2LCAvLyBBIDMyIGJpdCBzaWduZWQgaW50ZWdlci4KKyAgICBSU19UWVBFX1NJR05FRF82NCA9IDcsIC8vIEEgNjQgYml0IHNpZ25lZCBpbnRlZ2VyLgorICAgIFJTX1RZUEVfVU5TSUdORURfOCA9IDgsIC8vIEFuIDggYml0IHVuc2lnbmVkIGludGVnZXIuCisgICAgUlNfVFlQRV9VTlNJR05FRF8xNiA9IDksIC8vIEEgMTYgYml0IHVuc2lnbmVkIGludGVnZXIuCisgICAgUlNfVFlQRV9VTlNJR05FRF8zMiA9IDEwLCAvLyBBIDMyIGJpdCB1bnNpZ25lZCBpbnRlZ2VyLgorICAgIFJTX1RZUEVfVU5TSUdORURfNjQgPSAxMSwgLy8gQSA2NCBiaXQgdW5zaWduZWQgaW50ZWdlci4KKyAgICBSU19UWVBFX0JPT0xFQU4gPSAxMiwgLy8gMCBvciAxIChmYWxzZSBvciB0cnVlKSBzdG9yZWQgaW4gYW4gOCBiaXQgY29udGFpbmVyLgorICAgIFJTX1RZUEVfVU5TSUdORURfNV82XzUgPSAxMywgLy8gQSAxNiBiaXQgdW5zaWduZWQgaW50ZWdlciBwYWNraW5nIGdyYXBoaWNhbCBkYXRhIGluIDUsIDYsIGFuZCA1IGJpdCBzZWN0aW9ucy4KKyAgICBSU19UWVBFX1VOU0lHTkVEXzVfNV81XzEgPSAxNCwgLy8gQSAxNiBiaXQgdW5zaWduZWQgaW50ZWdlciBwYWNraW5nIGdyYXBoaWNhbCBkYXRhIGluIDUsIDUsIDUsIGFuZCAxIGJpdCBzZWN0aW9ucy4KKyAgICBSU19UWVBFX1VOU0lHTkVEXzRfNF80XzQgPSAxNSwgLy8gQSAxNiBiaXQgdW5zaWduZWQgaW50ZWdlciBwYWNraW5nIGdyYXBoaWNhbCBkYXRhIGluIDQsIDQsIDQsIGFuZCA0IGJpdCBzZWN0aW9ucy4KKyAgICBSU19UWVBFX01BVFJJWF80WDQgPSAxNiwgLy8gQSA0eDQgbWF0cml4IG9mIDMyIGJpdCBmbG9hdHMsIGFsaWduZWQgb24gYSAzMiBiaXQgYm91bmRhcnkuCisgICAgUlNfVFlQRV9NQVRSSVhfM1gzID0gMTcsIC8vIEEgM3gzIG1hdHJpeCBvZiAzMiBiaXQgZmxvYXRzLCBhbGlnbmVkIG9uIGEgMzIgYml0IGJvdW5kYXJ5LgorICAgIFJTX1RZUEVfTUFUUklYXzJYMiA9IDE4LCAvLyBBIDJ4MiBtYXRyaXggb2YgMzIgYml0IGZsb2F0cywgYWxpZ25lZCBvbiBhIDMyIGJpdCBib3VuZGFyeS4KKyAgICBSU19UWVBFX0VMRU1FTlQgPSAxMDAwLCAvLyBBIGhhbmRsZSB0byBhbiBFbGVtZW50LgorICAgIFJTX1RZUEVfVFlQRSA9IDEwMDEsIC8vIEEgaGFuZGxlIHRvIGEgVHlwZS4KKyAgICBSU19UWVBFX0FMTE9DQVRJT04gPSAxMDAyLCAvLyBBIGhhbmRsZSB0byBhbiBBbGxvY2F0aW9uLgorICAgIFJTX1RZUEVfU0FNUExFUiA9IDEwMDMsIC8vIEEgaGFuZGxlIHRvIGEgU2FtcGxlci4KKyAgICBSU19UWVBFX1NDUklQVCA9IDEwMDQsIC8vIEEgaGFuZGxlIHRvIGEgU2NyaXB0LgorICAgIFJTX1RZUEVfTUVTSCA9IDEwMDUsIC8vIERlcHJlY2F0ZWQuCisgICAgUlNfVFlQRV9QUk9HUkFNX0ZSQUdNRU5UID0gMTAwNiwgLy8gRGVwcmVjYXRlZC4KKyAgICBSU19UWVBFX1BST0dSQU1fVkVSVEVYID0gMTAwNywgLy8gRGVwcmVjYXRlZC4KKyAgICBSU19UWVBFX1BST0dSQU1fUkFTVEVSID0gMTAwOCwgLy8gRGVwcmVjYXRlZC4KKyAgICBSU19UWVBFX1BST0dSQU1fU1RPUkUgPSAxMDA5LCAvLyBEZXByZWNhdGVkLgorICAgIFJTX1RZUEVfRk9OVCA9IDEwMTAsIC8vIERlcHJlY2F0ZWQuCisgICAgUlNfVFlQRV9JTlZBTElEID0gMTAwMDAKK30gcnNfZGF0YV90eXBlOworI2VuZGlmCisKKy8qCisgKiByc19kYXRhX2tpbmQ6IEVsZW1lbnQgZGF0YSBraW5kCisgKgorICogVGhpcyBlbnVtZXJhdGlvbiBpcyBwcmltYXJseSB1c2VmdWwgZm9yIGdyYXBoaWNhbCBkYXRhLiAgSXQgcHJvdmlkZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0bworICogaGVscCBpbnRlcnByZXQgdGhlIHJzX2RhdGFfdHlwZS4KKyAqCisgKiBSU19LSU5EX1VTRVIgaW5kaWNhdGVzIG5vIHNwZWNpYWwgaW50ZXJwcmV0YXRpb24gaXMgZXhwZWN0ZWQuCisgKgorICogVGhlIFJTX0tJTkRfUElYRUxfKiB2YWx1ZXMgYXJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgc3RhbmRhcmQgZGF0YSB0eXBlcyBmb3IgcmVwcmVzZW50aW5nCisgKiB0ZXh0dXJlIGZvcm1hdHMuCisgKgorICogU2VlIHRoZSBFbGVtZW50LmNyZWF0ZVBpeGVsKCkgbWV0aG9kLgorICovCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTYpKQordHlwZWRlZiBlbnVtIHsKKyAgICBSU19LSU5EX1VTRVIgICAgICAgICA9IDAsIC8vIE5vIHNwZWNpYWwgaW50ZXJwcmV0YXRpb24uCisgICAgUlNfS0lORF9QSVhFTF9MICAgICAgPSA3LCAvLyBMdW1pbmFuY2UuCisgICAgUlNfS0lORF9QSVhFTF9BICAgICAgPSA4LCAvLyBBbHBoYS4KKyAgICBSU19LSU5EX1BJWEVMX0xBICAgICA9IDksIC8vIEx1bWluYW5jZSBhbmQgQWxwaGEuCisgICAgUlNfS0lORF9QSVhFTF9SR0IgICAgPSAxMCwgLy8gUmVkLCBHcmVlbiwgQmx1ZS4KKyAgICBSU19LSU5EX1BJWEVMX1JHQkEgICA9IDExLCAvLyBSZWQsIEdyZWVuLCBCbHVlLCBhbmQgQWxwaGEuCisgICAgUlNfS0lORF9QSVhFTF9ERVBUSCAgPSAxMiwgLy8gRGVwdGggZm9yIGEgZGVwdGggdGV4dHVyZS4KKyAgICBSU19LSU5EX1BJWEVMX1lVViAgICA9IDEzLCAvLyBMdW1pbmFuY2UgYW5kIGNocm9taW5hbmNlLgorICAgIFJTX0tJTkRfSU5WQUxJRCAgICAgID0gMTAwCit9IHJzX2RhdGFfa2luZDsKKyNlbmRpZgorCisvKgorICogcnNfeXV2X2Zvcm1hdDogWVVWIGZvcm1hdAorICoKKyAqICBBbmRyb2lkIFlVViBmb3JtYXRzIHRoYXQgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBhIFJlbmRlclNjcmlwdCBUeXBlLgorICoKKyAqICBTZWUgYW5kcm9pZC5ncmFwaGljcy5JbWFnZUZvcm1hdCBmb3IgYSBkZXNjcmlwdGlvbiBvZiBlYWNoIGZvcm1hdC4KKyAqLworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK3R5cGVkZWYgZW51bSB7CisgICAgUlNfWVVWX05PTkUgPSAwLAorICAgIFJTX1lVVl9ZVjEyID0gMHgzMjMxNTY1OSwKKyAgICBSU19ZVVZfTlYyMSA9IDB4MTEsCisgICAgUlNfWVVWXzQyMF84ODggPSAweDIzCit9IHJzX3l1dl9mb3JtYXQ7CisjZW5kaWYKKworLyoKKyAqIHJzX3NhbXBsZXJfdmFsdWU6IFNhbXBsZXIgd3JhcCBUIHZhbHVlCisgKgorICovCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTYpKQordHlwZWRlZiBlbnVtIHsKKyAgICBSU19TQU1QTEVSX05FQVJFU1QgPSAwLAorICAgIFJTX1NBTVBMRVJfTElORUFSID0gMSwKKyAgICBSU19TQU1QTEVSX0xJTkVBUl9NSVBfTElORUFSID0gMiwKKyAgICBSU19TQU1QTEVSX1dSQVAgPSAzLAorICAgIFJTX1NBTVBMRVJfQ0xBTVAgPSA0LAorICAgIFJTX1NBTVBMRVJfTElORUFSX01JUF9ORUFSRVNUID0gNSwKKyAgICBSU19TQU1QTEVSX01JUlJPUkVEX1JFUEVBVCA9IDYsCisgICAgUlNfU0FNUExFUl9JTlZBTElEID0gMTAwCit9IHJzX3NhbXBsZXJfdmFsdWU7CisjZW5kaWYKKworI2VuZGlmIC8vIFJFTkRFUlNDUklQVF9SU19PQkpFQ1RfVFlQRVNfUlNICmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvaW5jbHVkZS9yc19xdWF0ZXJuaW9uLnJzaCBiL3JlbmRlcnNjcmlwdC9pbmNsdWRlL3JzX3F1YXRlcm5pb24ucnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZDMzY2YKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvaW5jbHVkZS9yc19xdWF0ZXJuaW9uLnJzaApAQCAtMCwwICsxLDM3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIERvbid0IGVkaXQgdGhpcyBmaWxlISAgSXQgaXMgYXV0by1nZW5lcmF0ZWQgYnkgZnJhbWV3b3Jrcy9ycy9hcGkvZ2VuZXJhdGUuc2guCisKKy8qCisgKiByc19xdWF0ZXJuaW9uLnJzaDogUXVhdGVybmlvbiBGdW5jdGlvbnMKKyAqCisgKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBtYW5pcHVsYXRlIHF1YXRlcm5pb25zLgorICovCisKKyNpZm5kZWYgUkVOREVSU0NSSVBUX1JTX1FVQVRFUk5JT05fUlNICisjZGVmaW5lIFJFTkRFUlNDUklQVF9SU19RVUFURVJOSU9OX1JTSAorCisvKgorICogcnNRdWF0ZXJuaW9uQWRkOiBBZGQgdHdvIHF1YXRlcm5pb25zCisgKgorICogQWRkcyB0d28gcXVhdGVybmlvbnMsIGkuZS4gKnEgKz0gKnJoczsKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICBxOiBEZXN0aW5hdGlvbiBxdWF0ZXJuaW9uIHRvIGFkZCB0by4KKyAqICAgcmhzOiBRdWF0ZXJuaW9uIHRvIGFkZC4KKyAqLworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDIzKQorc3RhdGljIGlubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNRdWF0ZXJuaW9uQWRkKHJzX3F1YXRlcm5pb24qIHEsIGNvbnN0IHJzX3F1YXRlcm5pb24qIHJocykgeworICAgIHEtPncgKz0gcmhzLT53OworICAgIHEtPnggKz0gcmhzLT54OworICAgIHEtPnkgKz0gcmhzLT55OworICAgIHEtPnogKz0gcmhzLT56OworfQorI2VuZGlmCisKKy8qCisgKiByc1F1YXRlcm5pb25Db25qdWdhdGU6IENvbmp1Z2F0ZSBhIHF1YXRlcm5pb24KKyAqCisgKiBDb25qdWdhdGVzIHRoZSBxdWF0ZXJuaW9uLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgIHE6IFF1YXRlcm5pb24gdG8gbW9kaWZ5LgorICovCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMjMpCitzdGF0aWMgaW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1F1YXRlcm5pb25Db25qdWdhdGUocnNfcXVhdGVybmlvbiogcSkgeworICAgIHEtPnggPSAtcS0+eDsKKyAgICBxLT55ID0gLXEtPnk7CisgICAgcS0+eiA9IC1xLT56OworfQorI2VuZGlmCisKKy8qCisgKiByc1F1YXRlcm5pb25Eb3Q6IERvdCBwcm9kdWN0IG9mIHR3byBxdWF0ZXJuaW9ucworICoKKyAqIFJldHVybnMgdGhlIGRvdCBwcm9kdWN0IG9mIHR3byBxdWF0ZXJuaW9ucy4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICBxMDogRmlyc3QgcXVhdGVybmlvbi4KKyAqICAgcTE6IFNlY29uZCBxdWF0ZXJuaW9uLgorICovCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMjMpCitzdGF0aWMgaW5saW5lIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNRdWF0ZXJuaW9uRG90KGNvbnN0IHJzX3F1YXRlcm5pb24qIHEwLCBjb25zdCByc19xdWF0ZXJuaW9uKiBxMSkgeworICAgIHJldHVybiBxMC0+dypxMS0+dyArIHEwLT54KnExLT54ICsgcTAtPnkqcTEtPnkgKyBxMC0+eipxMS0+ejsKK30KKyNlbmRpZgorCisvKgorICogcnNRdWF0ZXJuaW9uR2V0TWF0cml4VW5pdDogR2V0IGEgcm90YXRpb24gbWF0cml4IGZyb20gYSBxdWF0ZXJuaW9uCisgKgorICogQ29tcHV0ZXMgYSByb3RhdGlvbiBtYXRyaXggZnJvbSB0aGUgbm9ybWFsaXplZCBxdWF0ZXJuaW9uLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgIG06IFJlc3VsdGluZyBtYXRyaXguCisgKiAgIHE6IE5vcm1hbGl6ZWQgcXVhdGVybmlvbi4KKyAqLworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDIzKQorc3RhdGljIGlubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNRdWF0ZXJuaW9uR2V0TWF0cml4VW5pdChyc19tYXRyaXg0eDQqIG0sIGNvbnN0IHJzX3F1YXRlcm5pb24qIHEpIHsKKyAgICBmbG9hdCB4eCA9IHEtPnggKiBxLT54OworICAgIGZsb2F0IHh5ID0gcS0+eCAqIHEtPnk7CisgICAgZmxvYXQgeHogPSBxLT54ICogcS0+ejsKKyAgICBmbG9hdCB4dyA9IHEtPnggKiBxLT53OworICAgIGZsb2F0IHl5ID0gcS0+eSAqIHEtPnk7CisgICAgZmxvYXQgeXogPSBxLT55ICogcS0+ejsKKyAgICBmbG9hdCB5dyA9IHEtPnkgKiBxLT53OworICAgIGZsb2F0IHp6ID0gcS0+eiAqIHEtPno7CisgICAgZmxvYXQgencgPSBxLT56ICogcS0+dzsKKworICAgIG0tPm1bMF0gID0gMS4wZiAtIDIuMGYgKiAoIHl5ICsgenogKTsKKyAgICBtLT5tWzRdICA9ICAgICAgICAyLjBmICogKCB4eSAtIHp3ICk7CisgICAgbS0+bVs4XSAgPSAgICAgICAgMi4wZiAqICggeHogKyB5dyApOworICAgIG0tPm1bMV0gID0gICAgICAgIDIuMGYgKiAoIHh5ICsgencgKTsKKyAgICBtLT5tWzVdICA9IDEuMGYgLSAyLjBmICogKCB4eCArIHp6ICk7CisgICAgbS0+bVs5XSAgPSAgICAgICAgMi4wZiAqICggeXogLSB4dyApOworICAgIG0tPm1bMl0gID0gICAgICAgIDIuMGYgKiAoIHh6IC0geXcgKTsKKyAgICBtLT5tWzZdICA9ICAgICAgICAyLjBmICogKCB5eiArIHh3ICk7CisgICAgbS0+bVsxMF0gPSAxLjBmIC0gMi4wZiAqICggeHggKyB5eSApOworICAgIG0tPm1bM10gID0gbS0+bVs3XSA9IG0tPm1bMTFdID0gbS0+bVsxMl0gPSBtLT5tWzEzXSA9IG0tPm1bMTRdID0gMC4wZjsKKyAgICBtLT5tWzE1XSA9IDEuMGY7Cit9CisjZW5kaWYKKworLyoKKyAqIHJzUXVhdGVybmlvbkxvYWRSb3RhdGVVbml0OiBRdWF0ZXJuaW9uIHRoYXQgcmVwcmVzZW50cyBhIHJvdGF0aW9uIGFib3V0IGFuIGFyYml0cmFyeSB1bml0IHZlY3RvcgorICoKKyAqIExvYWRzIGEgcXVhdGVybmlvbiB0aGF0IHJlcHJlc2VudHMgYSByb3RhdGlvbiBhYm91dCBhbiBhcmJpdHJhcnkgdW5pdCB2ZWN0b3IuCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgcTogRGVzdGluYXRpb24gcXVhdGVybmlvbi4KKyAqICAgcm90OiBBbmdsZSB0byByb3RhdGUgYnksIGluIHJhZGlhbnMuCisgKiAgIHg6IFggY29tcG9uZW50IG9mIHRoZSB2ZWN0b3IuCisgKiAgIHk6IFkgY29tcG9uZW50IG9mIHRoZSB2ZWN0b3IuCisgKiAgIHo6IFogY29tcG9uZW50IG9mIHRoZSB2ZWN0b3IuCisgKi8KKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAyMykKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzUXVhdGVybmlvbkxvYWRSb3RhdGVVbml0KHJzX3F1YXRlcm5pb24qIHEsIGZsb2F0IHJvdCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgIHJvdCAqPSAoZmxvYXQpKE1fUEkgLyAxODAuMGYpICogMC41ZjsKKyAgICBmbG9hdCBjID0gY29zKHJvdCk7CisgICAgZmxvYXQgcyA9IHNpbihyb3QpOworCisgICAgcS0+dyA9IGM7CisgICAgcS0+eCA9IHggKiBzOworICAgIHEtPnkgPSB5ICogczsKKyAgICBxLT56ID0geiAqIHM7Cit9CisjZW5kaWYKKworLyoKKyAqIHJzUXVhdGVybmlvblNldDogQ3JlYXRlIGEgcXVhdGVybmlvbgorICoKKyAqIENyZWF0ZXMgYSBxdWF0ZXJuaW9uIGZyb20gaXRzIGZvdXIgY29tcG9uZW50cyBvciBmcm9tIGFub3RoZXIgcXVhdGVybmlvbi4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICBxOiBEZXN0aW5hdGlvbiBxdWF0ZXJuaW9uLgorICogICB3OiBXIGNvbXBvbmVudC4KKyAqICAgeDogWCBjb21wb25lbnQuCisgKiAgIHk6IFkgY29tcG9uZW50LgorICogICB6OiBaIGNvbXBvbmVudC4KKyAqICAgcmhzOiBTb3VyY2UgcXVhdGVybmlvbi4KKyAqLworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDIzKQorc3RhdGljIGlubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNRdWF0ZXJuaW9uU2V0KHJzX3F1YXRlcm5pb24qIHEsIGZsb2F0IHcsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICBxLT53ID0gdzsKKyAgICBxLT54ID0geDsKKyAgICBxLT55ID0geTsKKyAgICBxLT56ID0gejsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMjMpCitzdGF0aWMgaW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1F1YXRlcm5pb25TZXQocnNfcXVhdGVybmlvbiogcSwgY29uc3QgcnNfcXVhdGVybmlvbiogcmhzKSB7CisgICAgcS0+dyA9IHJocy0+dzsKKyAgICBxLT54ID0gcmhzLT54OworICAgIHEtPnkgPSByaHMtPnk7CisgICAgcS0+eiA9IHJocy0+ejsKK30KKyNlbmRpZgorCisvKgorICogcnNRdWF0ZXJuaW9uTG9hZFJvdGF0ZTogQ3JlYXRlIGEgcm90YXRpb24gcXVhdGVybmlvbgorICoKKyAqIExvYWRzIGEgcXVhdGVybmlvbiB0aGF0IHJlcHJlc2VudHMgYSByb3RhdGlvbiBhYm91dCBhbiBhcmJpdHJhcnkgdmVjdG9yCisgKiAoZG9lc24ndCBoYXZlIHRvIGJlIHVuaXQpCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgcTogRGVzdGluYXRpb24gcXVhdGVybmlvbi4KKyAqICAgcm90OiBBbmdsZSB0byByb3RhdGUgYnkuCisgKiAgIHg6IFggY29tcG9uZW50IG9mIGEgdmVjdG9yLgorICogICB5OiBZIGNvbXBvbmVudCBvZiBhIHZlY3Rvci4KKyAqICAgejogWiBjb21wb25lbnQgb2YgYSB2ZWN0b3IuCisgKi8KKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAyMykKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzUXVhdGVybmlvbkxvYWRSb3RhdGUocnNfcXVhdGVybmlvbiogcSwgZmxvYXQgcm90LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgY29uc3QgZmxvYXQgbGVuID0geCp4ICsgeSp5ICsgeip6OworICAgIGlmIChsZW4gIT0gMSkgeworICAgICAgICBjb25zdCBmbG9hdCByZWNpcExlbiA9IDEuZiAvIHNxcnQobGVuKTsKKyAgICAgICAgeCAqPSByZWNpcExlbjsKKyAgICAgICAgeSAqPSByZWNpcExlbjsKKyAgICAgICAgeiAqPSByZWNpcExlbjsKKyAgICB9CisgICAgcnNRdWF0ZXJuaW9uTG9hZFJvdGF0ZVVuaXQocSwgcm90LCB4LCB5LCB6KTsKK30KKyNlbmRpZgorCisvKgorICogcnNRdWF0ZXJuaW9uTm9ybWFsaXplOiBOb3JtYWxpemUgYSBxdWF0ZXJuaW9uCisgKgorICogTm9ybWFsaXplcyB0aGUgcXVhdGVybmlvbi4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICBxOiBRdWF0ZXJuaW9uIHRvIG5vcm1hbGl6ZS4KKyAqLworI2lmICFkZWZpbmVkKFJTX1ZFUlNJT04pIHx8IChSU19WRVJTSU9OIDw9IDIzKQorc3RhdGljIGlubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNRdWF0ZXJuaW9uTm9ybWFsaXplKHJzX3F1YXRlcm5pb24qIHEpIHsKKyAgICBjb25zdCBmbG9hdCBsZW4gPSByc1F1YXRlcm5pb25Eb3QocSwgcSk7CisgICAgaWYgKGxlbiAhPSAxKSB7CisgICAgICAgIGNvbnN0IGZsb2F0IHJlY2lwTGVuID0gMS5mIC8gc3FydChsZW4pOworICAgICAgICBxLT53ICo9IHJlY2lwTGVuOworICAgICAgICBxLT54ICo9IHJlY2lwTGVuOworICAgICAgICBxLT55ICo9IHJlY2lwTGVuOworICAgICAgICBxLT56ICo9IHJlY2lwTGVuOworICAgIH0KK30KKyNlbmRpZgorCisvKgorICogcnNRdWF0ZXJuaW9uTXVsdGlwbHk6IE11bHRpcGx5IGEgcXVhdGVybmlvbiBieSBhIHNjYWxhciBvciBhbm90aGVyIHF1YXRlcm5pb24KKyAqCisgKiBNdWx0aXBsaWVzIGEgcXVhdGVybmlvbiBieSBhIHNjYWxhciBvciBieSBhbm90aGVyIHF1YXRlcm5pb24sIGUuZworICogKnEgPSAqcSAqIHNjYWxhcjsgb3IgKnEgPSAqcSAqICpyaHM7LgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgIHE6IERlc3RpbmF0aW9uIHF1YXRlcm5pb24uCisgKiAgIHNjYWxhcjogU2NhbGFyIHRvIG11bHRpcGx5IHRoZSBxdWF0ZXJuaW9uIGJ5LgorICogICByaHM6IFF1YXRlcm5pb24gdG8gbXVsdGlwbHkgdGhlIGRlc3RpbmF0aW9uIHF1YXRlcm5pb24gYnkuCisgKi8KKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAyMykKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzUXVhdGVybmlvbk11bHRpcGx5KHJzX3F1YXRlcm5pb24qIHEsIGZsb2F0IHNjYWxhcikgeworICAgIHEtPncgKj0gc2NhbGFyOworICAgIHEtPnggKj0gc2NhbGFyOworICAgIHEtPnkgKj0gc2NhbGFyOworICAgIHEtPnogKj0gc2NhbGFyOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSU19WRVJTSU9OKSB8fCAoUlNfVkVSU0lPTiA8PSAyMykKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzUXVhdGVybmlvbk11bHRpcGx5KHJzX3F1YXRlcm5pb24qIHEsIGNvbnN0IHJzX3F1YXRlcm5pb24qIHJocykgeworICAgIHJzX3F1YXRlcm5pb24gcXRtcDsKKyAgICByc1F1YXRlcm5pb25TZXQoJnF0bXAsIHEpOworCisgICAgcS0+dyA9IHF0bXAudypyaHMtPncgLSBxdG1wLngqcmhzLT54IC0gcXRtcC55KnJocy0+eSAtIHF0bXAueipyaHMtPno7CisgICAgcS0+eCA9IHF0bXAudypyaHMtPnggKyBxdG1wLngqcmhzLT53ICsgcXRtcC55KnJocy0+eiAtIHF0bXAueipyaHMtPnk7CisgICAgcS0+eSA9IHF0bXAudypyaHMtPnkgKyBxdG1wLnkqcmhzLT53ICsgcXRtcC56KnJocy0+eCAtIHF0bXAueCpyaHMtPno7CisgICAgcS0+eiA9IHF0bXAudypyaHMtPnogKyBxdG1wLnoqcmhzLT53ICsgcXRtcC54KnJocy0+eSAtIHF0bXAueSpyaHMtPng7CisgICAgcnNRdWF0ZXJuaW9uTm9ybWFsaXplKHEpOworfQorI2VuZGlmCisKKy8qCisgKiByc1F1YXRlcm5pb25TbGVycDogU3BoZXJpY2FsIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdHdvIHF1YXRlcm5pb25zCisgKgorICogUGVyZm9ybXMgc3BoZXJpY2FsIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdHdvIHF1YXRlcm5pb25zLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgIHE6IFJlc3VsdCBxdWF0ZXJuaW9uIGZyb20gdGhlIGludGVycG9sYXRpb24uCisgKiAgIHEwOiBGaXJzdCBpbnB1dCBxdWF0ZXJuaW9uLgorICogICBxMTogU2Vjb25kIGlucHV0IHF1YXRlcm5pb24uCisgKiAgIHQ6IEhvdyBtdWNoIHRvIGludGVycG9sYXRlIGJ5LgorICovCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMjMpCitzdGF0aWMgaW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1F1YXRlcm5pb25TbGVycChyc19xdWF0ZXJuaW9uKiBxLCBjb25zdCByc19xdWF0ZXJuaW9uKiBxMCwgY29uc3QgcnNfcXVhdGVybmlvbiogcTEsIGZsb2F0IHQpIHsKKyAgICBpZiAodCA8PSAwLjBmKSB7CisgICAgICAgIHJzUXVhdGVybmlvblNldChxLCBxMCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHQgPj0gMS4wZikgeworICAgICAgICByc1F1YXRlcm5pb25TZXQocSwgcTEpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcnNfcXVhdGVybmlvbiB0ZW1wcTAsIHRlbXBxMTsKKyAgICByc1F1YXRlcm5pb25TZXQoJnRlbXBxMCwgcTApOworICAgIHJzUXVhdGVybmlvblNldCgmdGVtcHExLCBxMSk7CisKKyAgICBmbG9hdCBhbmdsZSA9IHJzUXVhdGVybmlvbkRvdChxMCwgcTEpOworICAgIGlmIChhbmdsZSA8IDApIHsKKyAgICAgICAgcnNRdWF0ZXJuaW9uTXVsdGlwbHkoJnRlbXBxMCwgLTEuMGYpOworICAgICAgICBhbmdsZSAqPSAtMS4wZjsKKyAgICB9CisKKyAgICBmbG9hdCBzY2FsZSwgaW52U2NhbGU7CisgICAgaWYgKGFuZ2xlICsgMS4wZiA+IDAuMDVmKSB7CisgICAgICAgIGlmICgxLjBmIC0gYW5nbGUgPj0gMC4wNWYpIHsKKyAgICAgICAgICAgIGZsb2F0IHRoZXRhID0gYWNvcyhhbmdsZSk7CisgICAgICAgICAgICBmbG9hdCBpbnZTaW5UaGV0YSA9IDEuMGYgLyBzaW4odGhldGEpOworICAgICAgICAgICAgc2NhbGUgPSBzaW4odGhldGEgKiAoMS4wZiAtIHQpKSAqIGludlNpblRoZXRhOworICAgICAgICAgICAgaW52U2NhbGUgPSBzaW4odGhldGEgKiB0KSAqIGludlNpblRoZXRhOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2NhbGUgPSAxLjBmIC0gdDsKKyAgICAgICAgICAgIGludlNjYWxlID0gdDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHJzUXVhdGVybmlvblNldCgmdGVtcHExLCB0ZW1wcTAueiwgLXRlbXBxMC55LCB0ZW1wcTAueCwgLXRlbXBxMC53KTsKKyAgICAgICAgc2NhbGUgPSBzaW4oTV9QSSAqICgwLjVmIC0gdCkpOworICAgICAgICBpbnZTY2FsZSA9IHNpbihNX1BJICogdCk7CisgICAgfQorCisgICAgcnNRdWF0ZXJuaW9uU2V0KHEsIHRlbXBxMC53KnNjYWxlICsgdGVtcHExLncqaW52U2NhbGUsIHRlbXBxMC54KnNjYWxlICsgdGVtcHExLngqaW52U2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wcTAueSpzY2FsZSArIHRlbXBxMS55KmludlNjYWxlLCB0ZW1wcTAueipzY2FsZSArIHRlbXBxMS56KmludlNjYWxlKTsKK30KKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1F1YXRlcm5pb25BZGQocnNfcXVhdGVybmlvbiogcSwgY29uc3QgcnNfcXVhdGVybmlvbiogcmhzKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1F1YXRlcm5pb25Db25qdWdhdGUocnNfcXVhdGVybmlvbiogcSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzUXVhdGVybmlvbkRvdChjb25zdCByc19xdWF0ZXJuaW9uKiBxMCwgY29uc3QgcnNfcXVhdGVybmlvbiogcTEpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzUXVhdGVybmlvbkdldE1hdHJpeFVuaXQocnNfbWF0cml4NHg0KiBtLCBjb25zdCByc19xdWF0ZXJuaW9uKiBxKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1F1YXRlcm5pb25Mb2FkUm90YXRlVW5pdChyc19xdWF0ZXJuaW9uKiBxLCBmbG9hdCByb3QsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzUXVhdGVybmlvblNldChyc19xdWF0ZXJuaW9uKiBxLCBmbG9hdCB3LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1F1YXRlcm5pb25TZXQocnNfcXVhdGVybmlvbiogcSwgY29uc3QgcnNfcXVhdGVybmlvbiogcmhzKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1F1YXRlcm5pb25Mb2FkUm90YXRlKHJzX3F1YXRlcm5pb24qIHEsIGZsb2F0IHJvdCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNRdWF0ZXJuaW9uTm9ybWFsaXplKHJzX3F1YXRlcm5pb24qIHEpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzUXVhdGVybmlvbk11bHRpcGx5KHJzX3F1YXRlcm5pb24qIHEsIGZsb2F0IHNjYWxhcik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNRdWF0ZXJuaW9uTXVsdGlwbHkocnNfcXVhdGVybmlvbiogcSwgY29uc3QgcnNfcXVhdGVybmlvbiogcmhzKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1F1YXRlcm5pb25TbGVycChyc19xdWF0ZXJuaW9uKiBxLCBjb25zdCByc19xdWF0ZXJuaW9uKiBxMCwgY29uc3QgcnNfcXVhdGVybmlvbiogcTEsIGZsb2F0IHQpOworI2VuZGlmCisKKyNlbmRpZiAvLyBSRU5ERVJTQ1JJUFRfUlNfUVVBVEVSTklPTl9SU0gKZGlmZiAtLWdpdCBhL3JlbmRlcnNjcmlwdC9pbmNsdWRlL3JzX3RpbWUucnNoIGIvcmVuZGVyc2NyaXB0L2luY2x1ZGUvcnNfdGltZS5yc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMwZWViMAotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9pbmNsdWRlL3JzX3RpbWUucnNoCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gRG9uJ3QgZWRpdCB0aGlzIGZpbGUhICBJdCBpcyBhdXRvLWdlbmVyYXRlZCBieSBmcmFtZXdvcmtzL3JzL2FwaS9nZW5lcmF0ZS5zaC4KKworLyoKKyAqIHJzX3RpbWUucnNoOiBUaW1lIEZ1bmN0aW9ucyBhbmQgVHlwZXMKKyAqCisgKiBUaGUgZnVuY3Rpb25zIGJlbG93IGNhbiBiZSB1c2VkIHRvIHRlbGwgdGhlIGN1cnJlbnQgY2xvY2sgdGltZSBhbmQgdGhlIGN1cnJlbnQKKyAqIHN5c3RlbSB1cCB0aW1lLiAgSXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIGNhbGwgdGhlc2UgZnVuY3Rpb25zIGluc2lkZSBvZiBhIGtlcm5lbC4KKyAqLworCisjaWZuZGVmIFJFTkRFUlNDUklQVF9SU19USU1FX1JTSAorI2RlZmluZSBSRU5ERVJTQ1JJUFRfUlNfVElNRV9SU0gKKworLyoKKyAqIHJzX3RpbWVfdDogU2Vjb25kcyBzaW5jZSBKYW51YXJ5IDEsIDE5NzAKKyAqCisgKiBDYWxlbmRhciB0aW1lIGludGVycHJldGVkIGFzIHNlY29uZHMgZWxhcHNlZCBzaW5jZSB0aGUgRXBvY2ggKDAwOjAwOjAwIG9uCisgKiBKYW51YXJ5IDEsIDE5NzAsIENvb3JkaW5hdGVkIFVuaXZlcnNhbCBUaW1lIChVVEMpKS4KKyAqLworI2lmbmRlZiBfX0xQNjRfXwordHlwZWRlZiBpbnQgcnNfdGltZV90OworI2VuZGlmCisKKyNpZmRlZiBfX0xQNjRfXwordHlwZWRlZiBsb25nIHJzX3RpbWVfdDsKKyNlbmRpZgorCisvKgorICogcnNfdG06IERhdGUgYW5kIHRpbWUgc3RydWN0dXJlCisgKgorICogRGF0YSBzdHJ1Y3R1cmUgZm9yIGJyb2tlbi1kb3duIHRpbWUgY29tcG9uZW50cy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCB0bV9zZWM7IC8vIFNlY29uZHMgYWZ0ZXIgdGhlIG1pbnV0ZS4gVGhpcyByYW5nZXMgZnJvbSAwIHRvIDU5LCBidXQgcG9zc2libHkgdXAgdG8gNjAgZm9yIGxlYXAgc2Vjb25kcy4KKyAgICBpbnQgdG1fbWluOyAvLyBNaW51dGVzIGFmdGVyIHRoZSBob3VyLiBUaGlzIHJhbmdlcyBmcm9tIDAgdG8gNTkuCisgICAgaW50IHRtX2hvdXI7IC8vIEhvdXJzIHBhc3QgbWlkbmlnaHQuIFRoaXMgcmFuZ2VzIGZyb20gMCB0byAyMy4KKyAgICBpbnQgdG1fbWRheTsgLy8gRGF5IG9mIHRoZSBtb250aC4gVGhpcyByYW5nZXMgZnJvbSAxIHRvIDMxLgorICAgIGludCB0bV9tb247IC8vIE1vbnRocyBzaW5jZSBKYW51YXJ5LiBUaGlzIHJhbmdlcyBmcm9tIDAgdG8gMTEuCisgICAgaW50IHRtX3llYXI7IC8vIFllYXJzIHNpbmNlIDE5MDAuCisgICAgaW50IHRtX3dkYXk7IC8vIERheXMgc2luY2UgU3VuZGF5LiBUaGlzIHJhbmdlcyBmcm9tIDAgdG8gNi4KKyAgICBpbnQgdG1feWRheTsgLy8gRGF5cyBzaW5jZSBKYW51YXJ5IDEuIFRoaXMgcmFuZ2VzIGZyb20gMCB0byAzNjUuCisgICAgaW50IHRtX2lzZHN0OyAvLyBGbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgZGF5bGlnaHQgc2F2aW5nIHRpbWUgaXMgaW4gZWZmZWN0LiBUaGUgdmFsdWUgaXMgcG9zaXRpdmUgaWYgaXQgaXMgaW4gZWZmZWN0LCB6ZXJvIGlmIGl0IGlzIG5vdCwgYW5kIG5lZ2F0aXZlIGlmIHRoZSBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlLgorfSByc190bTsKKworLyoKKyAqIHJzR2V0RHQ6IEVsYXBzZWQgdGltZSBzaW5jZSBsYXN0IGNhbGwKKyAqCisgKiBSZXR1cm5zIHRoZSB0aW1lIGluIHNlY29uZHMgc2luY2UgdGhpcyBmdW5jdGlvbiB3YXMgbGFzdCBjYWxsZWQgaW4gdGhpcyBzY3JpcHQuCisgKgorICogUmV0dXJuczogVGltZSBpbiBzZWNvbmRzLgorICovCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldER0KHZvaWQpOworCisvKgorICogcnNMb2NhbHRpbWU6IENvbnZlcnQgdG8gbG9jYWwgdGltZQorICoKKyAqIENvbnZlcnRzIHRoZSB0aW1lIHNwZWNpZmllZCBieSB0aW1lciBpbnRvIGEgcnNfdG0gc3RydWN0dXJlIHRoYXQgcHJvdmlkZXMgeWVhciwgbW9udGgsCisgKiBob3VyLCBldGMuICBUaGlzIHZhbHVlIGlzIHN0b3JlZCBhdCAqbG9jYWwuCisgKgorICogVGhpcyBmdW5jdGlvbnMgcmV0dXJucyB0aGUgc2FtZSBwb2ludGVyIHRoYXQgaXMgcGFzc2VkIGFzIGZpcnN0IGFyZ3VtZW50LiAgSWYgdGhlCisgKiBsb2NhbCBwYXJhbWV0ZXIgaXMgTlVMTCwgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdGhpbmcgYW5kIHJldHVybnMgTlVMTC4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICBsb2NhbDogUG9pbnRlciB0byB0aW1lIHN0cnVjdHVyZSB3aGVyZSB0aGUgbG9jYWwgdGltZSB3aWxsIGJlIHN0b3JlZC4KKyAqICAgdGltZXI6IElucHV0IHRpbWUgYXMgYSBudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSBKYW51YXJ5IDEsIDE5NzAuCisgKgorICogUmV0dXJuczogUG9pbnRlciB0byB0aGUgb3V0cHV0IGxvY2FsIHRpbWUsIGkuZS4gdGhlIHNhbWUgdmFsdWUgYXMgdGhlIHBhcmFtZXRlciBsb2NhbC4KKyAqLworZXh0ZXJuIHJzX3RtKiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzTG9jYWx0aW1lKHJzX3RtKiBsb2NhbCwgY29uc3QgcnNfdGltZV90KiB0aW1lcik7CisKKy8qCisgKiByc1RpbWU6IFNlY29uZHMgc2luY2UgSmFudWFyeSAxLCAxOTcwCisgKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHNlY29uZHMgc2luY2UgdGhlIEVwb2NoICgwMDowMDowMCBVVEMsIEphbnVhcnkgMSwgMTk3MCkuCisgKgorICogSWYgdGltZXIgaXMgbm9uLU5VTEwsIHRoZSByZXN1bHQgaXMgYWxzbyBzdG9yZWQgaW4gdGhlIG1lbW9yeSBwb2ludGVkIHRvIGJ5CisgKiB0aGlzIHZhcmlhYmxlLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgIHRpbWVyOiBMb2NhdGlvbiB0byBhbHNvIHN0b3JlIHRoZSByZXR1cm5lZCBjYWxlbmRhciB0aW1lLgorICoKKyAqIFJldHVybnM6IFNlY29uZHMgc2luY2UgdGhlIEVwb2NoLCAtMSBpZiB0aGVyZSdzIGFuIGVycm9yLgorICovCitleHRlcm4gcnNfdGltZV90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNUaW1lKHJzX3RpbWVfdCogdGltZXIpOworCisvKgorICogcnNVcHRpbWVNaWxsaXM6IFN5c3RlbSB1cHRpbWUgaW4gbWlsbGlzZWNvbmRzCisgKgorICogUmV0dXJucyB0aGUgY3VycmVudCBzeXN0ZW0gY2xvY2sgKHVwdGltZSkgaW4gbWlsbGlzZWNvbmRzLgorICoKKyAqIFJldHVybnM6IFVwdGltZSBpbiBtaWxsaXNlY29uZHMuCisgKi8KK2V4dGVybiBpbnQ2NF90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNVcHRpbWVNaWxsaXModm9pZCk7CisKKy8qCisgKiByc1VwdGltZU5hbm9zOiBTeXN0ZW0gdXB0aW1lIGluIG5hbm9zZWNvbmRzCisgKgorICogUmV0dXJucyB0aGUgY3VycmVudCBzeXN0ZW0gY2xvY2sgKHVwdGltZSkgaW4gbmFub3NlY29uZHMuCisgKgorICogVGhlIGdyYW51bGFyaXR5IG9mIHRoZSB2YWx1ZXMgcmV0dXJuIGJ5IHRoaXMgY2FsbCBtYXkgYmUgbXVjaCBsYXJnZXIgdGhhbiBhIG5hbm9zZWNvbmQuCisgKgorICogUmV0dXJuczogVXB0aW1lIGluIG5hbm9zZWNvbmRzLgorICovCitleHRlcm4gaW50NjRfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzVXB0aW1lTmFub3Modm9pZCk7CisKKyNlbmRpZiAvLyBSRU5ERVJTQ1JJUFRfUlNfVElNRV9SU0gKZGlmZiAtLWdpdCBhL3JlbmRlcnNjcmlwdC9pbmNsdWRlL3JzX3ZhbHVlX3R5cGVzLnJzaCBiL3JlbmRlcnNjcmlwdC9pbmNsdWRlL3JzX3ZhbHVlX3R5cGVzLnJzaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODBiMjk3Ci0tLSAvZGV2L251bGwKKysrIGIvcmVuZGVyc2NyaXB0L2luY2x1ZGUvcnNfdmFsdWVfdHlwZXMucnNoCkBAIC0wLDAgKzEsNTQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gRG9uJ3QgZWRpdCB0aGlzIGZpbGUhICBJdCBpcyBhdXRvLWdlbmVyYXRlZCBieSBmcmFtZXdvcmtzL3JzL2FwaS9nZW5lcmF0ZS5zaC4KKworLyoKKyAqIHJzX3ZhbHVlX3R5cGVzLnJzaDogTnVtZXJpY2FsIFR5cGVzCisgKgorICogU2NhbGFyczoKKyAqCisgKiBSZW5kZXJTY3JpcHQgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBzY2FsYXIgbnVtZXJpY2FsIHR5cGVzOgorICoKKyAqICAgICAgICAgICAgICAgICAgICA4IGJpdHMgICAgICAgICAgIDE2IGJpdHMgICAgICAgICAgICAzMiBiaXRzICAgICAgICAgIDY0IGJpdHMKKyAqIEludGVnZXI6ICAgICAgICAgICBjaGFyLCBpbnQ4X3QgICAgIHNob3J0LCBpbnQxNl90ICAgICBpbnQzMl90ICAgICAgICAgIGxvbmcsIGxvbmcgbG9uZywgaW50NjRfdAorICogVW5zaWduZWQgaW50ZWdlcjogIHVjaGFyLCB1aW50OF90ICAgdXNob3J0LCB1aW50MTZfdCAgIHVpbnQsIHVpbnQzMl90ICAgdWxvbmcsIHVpbnQ2NF90CisgKiBGbG9hdGluZyBwb2ludDogICAgICAgICAgICAgICAgICAgICBoYWxmICAgICAgICAgICAgICAgZmxvYXQgICAgICAgICAgICBkb3VibGUKKyAqCisgKgorICogVmVjdG9yczoKKyAqCisgKiBSZW5kZXJTY3JpcHQgc3VwcG9ydHMgZml4ZWQgc2l6ZSB2ZWN0b3JzIG9mIGxlbmd0aCAyLCAzLCBhbmQgNC4KKyAqIFZlY3RvcnMgYXJlIGRlY2xhcmVkIHVzaW5nIHRoZSBjb21tb24gdHlwZSBuYW1lIGZvbGxvd2VkIGJ5IGEgMiwgMywgb3IgNC4KKyAqIEUuZy4gZmxvYXQ0LCBpbnQzLCBkb3VibGUyLCB1bG9uZzQuCisgKgorICogVG8gY3JlYXRlIHZlY3RvciBsaXRlcmFscywgdXNlIHRoZSB2ZWN0b3IgdHlwZSBmb2xsb3dlZCBieSB0aGUgdmFsdWVzIGVuY2xvc2VkCisgKiBiZXR3ZWVuIGN1cmx5IGJyYWNlcywgZS5nLiAoZmxvYXQzKXsxLjBmLCAyLjBmLCAzLjBmfS4KKyAqCisgKiBFbnRyaWVzIG9mIGEgdmVjdG9yIGNhbiBiZSBhY2Nlc3NlZCB1c2luZyBkaWZmZXJlbnQgbmFtaW5nIHN0eWxlcy4KKyAqCisgKiBTaW5nbGUgZW50cmllcyBjYW4gYmUgYWNjZXNzZWQgYnkgZm9sbG93aW5nIHRoZSB2YXJpYWJsZSBuYW1lIHdpdGggYSBkb3QgYW5kOgorICogLSBUaGUgbGV0dGVycyB4LCB5LCB6LCBhbmQgdywKKyAqIC0gVGhlIGxldHRlcnMgciwgZywgYiwgYW5kIGEsCisgKiAtIFRoZSBsZXR0ZXIgcyBvciBTLCBmb2xsb3dlZCBieSBhIHplcm8gYmFzZWQgaW5kZXguCisgKgorICogRm9yIGV4YW1wbGUsIHdpdGggaW50NCBteVZhcjsgdGhlIGZvbGxvd2luZyBhcmUgZXF1aXZhbGVudDoKKyAqICAgbXlWYXIueCA9PSBteVZhci5yID09IG15VmFyLnMwID09IG15VmFyLlMwCisgKiAgIG15VmFyLnkgPT0gbXlWYXIuZyA9PSBteVZhci5zMSA9PSBteVZhci5TMQorICogICBteVZhci56ID09IG15VmFyLmIgPT0gbXlWYXIuczIgPT0gbXlWYXIuUzIKKyAqICAgbXlWYXIudyA9PSBteVZhci5hID09IG15VmFyLnMzID09IG15VmFyLlMzCisgKgorICogTXVsdGlwbGUgZW50cmllcyBvZiBhIHZlY3RvciBjYW4gYmUgYWNjZXNzZWQgYXQgb25jZSBieSB1c2luZyBhbiBpZGVudGlmaWVyIHRoYXQgaXMKKyAqIHRoZSBjb25jYXRlbmF0aW9uIG9mIG11bHRpcGxlIGxldHRlcnMgb3IgaW5kaWNlcy4gIFRoZSByZXN1bHRpbmcgdmVjdG9yIGhhcyBhIHNpemUKKyAqIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgZW50cmllcyBuYW1lZC4KKyAqCisgKiBXaXRoIHRoZSBleGFtcGxlIGFib3ZlLCB0aGUgbWlkZGxlIHR3byBlbnRyaWVzIGNhbiBiZSBhY2Nlc3NlZCB1c2luZworICogbXlWYXIueXosIG15VmFyLmdiLCBteVZhci5zMTIsIGFuZCBteVZhci5TMTIuCisgKgorICogVGhlIGVudHJpZXMgZG9uJ3QgaGF2ZSB0byBiZSBjb250aWd1b3VzIG9yIGluIGluY3JlYXNpbmcgb3JkZXIuICBFbnRyaWVzIGNhbiBldmVuIGJlCisgKiByZXBlYXRlZCwgYXMgbG9uZyBhcyB3ZSdyZSBub3QgdHJ5aW5nIHRvIGFzc2lnbiB0byBpdC4gIFlvdSBhbHNvIGNhbid0IG1peCB0aGUgbmFtaW5nCisgKiBzdHlsZXMuCisgKgorICogSGVyZSBhcmUgZXhhbXBsZXMgb2Ygd2hhdCBjYW4gb3IgY2FuJ3QgYmUgZG9uZToKKyAqIGZsb2F0NCB2NDsKKyAqIGZsb2F0MyB2MzsKKyAqIGZsb2F0MiB2MjsKKyAqIHYyID0gdjQueHg7IC8vIFZhbGlkCisgKiB2MyA9IHY0Lnp4dzsgLy8gVmFsaWQKKyAqIHYzID0gdjQuYmJhOyAvLyBWYWxpZAorICogdjMgPSB2NC5zMDMyOyAvLyBWYWxpZAorICogdjMuczEyMCA9IHY0LlMyMzM7IC8vIFZhbGlkCisgKiB2NC55eiA9IHYzLnJnOyAvLyBWYWxpZAorICogdjQueXp4ID0gdjMucmc7IC8vIEludmFsaWQ6IG1pc21hdGNoZWQgc2l6ZXMKKyAqIHY0Lnl6eiA9IHYzOyAvLyBJbnZhbGlkOiB6IGFwcGVhcnMgdHdpY2UgaW4gYW4gYXNzaWdubWVudAorICogdjMgPSB2My54YXMwOyAvLyBJbnZhbGlkOiBjYW4ndCBtaXggeHl6dyB3aXRoIHJnYmEgbm9yIHMwLi4uCisgKiB2MyA9IHY0LnMwMzQ7IC8vIEludmFsaWQ6IHRoZSBkaWdpdCBjYW4gb25seSBiZSAwLCAxLCAyLCBvciAzCisgKgorICoKKyAqIE1hdHJpY2VzIGFuZCBRdWF0ZXJuaW9uczoKKyAqCisgKiBSZW5kZXJTY3JpcHQgc3VwcG9ydHMgZml4ZWQgc2l6ZSBzcXVhcmUgbWF0cmljZXMgb2YgZmxvYXRzIG9mIHNpemUgMngyLCAzeDMsIGFuZCA0eDQuCisgKiBUaGUgdHlwZXMgYXJlIG5hbWVkIHJzX21hdHJpeDJ4MiwgcnNfbWF0cml4M3gzLCBhbmQgcnNfbWF0cml4NHg0LiAgU2VlCisgKiBNYXRyaXggRnVuY3Rpb25zIGZvciB0aGUgbGlzdCBvZiBvcGVyYXRpb25zLgorICoKKyAqIFF1YXRlcm5pb25zIGFyZSBhbHNvIHN1cHBvcnRlZCB2aWEgcnNfcXVhdGVybmlvbi4gIFNlZSBRdWF0ZXJpb24gRnVuY3Rpb25zIGZvciB0aGUgbGlzdAorICogb2Ygb3BlcmF0aW9ucy4KKyAqLworCisjaWZuZGVmIFJFTkRFUlNDUklQVF9SU19WQUxVRV9UWVBFU19SU0gKKyNkZWZpbmUgUkVOREVSU0NSSVBUX1JTX1ZBTFVFX1RZUEVTX1JTSAorCisvKgorICogaGFsZjogMTYgYml0IGZsb2F0aW5nIHBvaW50IHZhbHVlCisgKgorICogQSAxNiBiaXQgZmxvYXRpbmcgcG9pbnQgdmFsdWUuCisgKi8KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMykpCit0eXBlZGVmIF9fZnAxNiBoYWxmOworI2VuZGlmCisKKy8qCisgKiBoYWxmMjogVHdvIDE2IGJpdCBmbG9hdHMKKyAqCisgKiBWZWN0b3IgdmVyc2lvbiBvZiB0aGUgaGFsZiBmbG9hdCB0eXBlLiBQcm92aWRlcyB0d28gaGFsZiBmaWVsZHMgcGFja2VkCisgKiBpbnRvIGEgc2luZ2xlIDMyIGJpdCBmaWVsZCB3aXRoIDMyIGJpdCBhbGlnbm1lbnQuCisgKi8KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMykpCit0eXBlZGVmIGhhbGYgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDIpKSkgaGFsZjI7CisjZW5kaWYKKworLyoKKyAqIGhhbGYzOiBUaHJlZSAxNiBiaXQgZmxvYXRzCisgKgorICogVmVjdG9yIHZlcnNpb24gb2YgdGhlIGhhbGYgZmxvYXQgdHlwZS4gUHJvdmlkZXMgdGhyZWUgaGFsZiBmaWVsZHMgcGFja2VkCisgKiBpbnRvIGEgc2luZ2xlIDY0IGJpdCBmaWVsZCB3aXRoIDY0IGJpdCBhbGlnbm1lbnQuCisgKi8KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMykpCit0eXBlZGVmIGhhbGYgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDMpKSkgaGFsZjM7CisjZW5kaWYKKworLyoKKyAqIGhhbGY0OiBGb3VyIDE2IGJpdCBmbG9hdHMKKyAqCisgKiBWZWN0b3IgdmVyc2lvbiBvZiB0aGUgaGFsZiBmbG9hdCB0eXBlLiBQcm92aWRlcyBmb3VyIGhhbGYgZmllbGRzIHBhY2tlZAorICogaW50byBhIHNpbmdsZSA2NCBiaXQgZmllbGQgd2l0aCA2NCBiaXQgYWxpZ25tZW50LgorICovCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjMpKQordHlwZWRlZiBoYWxmIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpIGhhbGY0OworI2VuZGlmCisKKy8qCisgKiBpbnQ4X3Q6IDggYml0IHNpZ25lZCBpbnRlZ2VyCisgKgorICogOCBiaXQgc2lnbmVkIGludGVnZXIgdHlwZS4KKyAqLwordHlwZWRlZiBjaGFyIGludDhfdDsKKworLyoKKyAqIGludDE2X3Q6IDE2IGJpdCBzaWduZWQgaW50ZWdlcgorICoKKyAqIEEgMTYgYml0IHNpZ25lZCBpbnRlZ2VyIHR5cGUuCisgKi8KK3R5cGVkZWYgc2hvcnQgaW50MTZfdDsKKworLyoKKyAqIGludDMyX3Q6IDMyIGJpdCBzaWduZWQgaW50ZWdlcgorICoKKyAqIEEgMzIgYml0IHNpZ25lZCBpbnRlZ2VyIHR5cGUuCisgKi8KK3R5cGVkZWYgaW50IGludDMyX3Q7CisKKy8qCisgKiBpbnQ2NF90OiA2NCBiaXQgc2lnbmVkIGludGVnZXIKKyAqCisgKiBBIDY0IGJpdCBzaWduZWQgaW50ZWdlciB0eXBlLgorICovCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMjApCit0eXBlZGVmIGxvbmcgbG9uZyBpbnQ2NF90OworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCit0eXBlZGVmIGxvbmcgaW50NjRfdDsKKyNlbmRpZgorCisvKgorICogdWludDhfdDogOCBiaXQgdW5zaWduZWQgaW50ZWdlcgorICoKKyAqIDggYml0IHVuc2lnbmVkIGludGVnZXIgdHlwZS4KKyAqLwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHVpbnQ4X3Q7CisKKy8qCisgKiB1aW50MTZfdDogMTYgYml0IHVuc2lnbmVkIGludGVnZXIKKyAqCisgKiBBIDE2IGJpdCB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUuCisgKi8KK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgdWludDE2X3Q7CisKKy8qCisgKiB1aW50MzJfdDogMzIgYml0IHVuc2lnbmVkIGludGVnZXIKKyAqCisgKiBBIDMyIGJpdCB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUuCisgKi8KK3R5cGVkZWYgdW5zaWduZWQgaW50IHVpbnQzMl90OworCisvKgorICogdWludDY0X3Q6IDY0IGJpdCB1bnNpZ25lZCBpbnRlZ2VyCisgKgorICogQSA2NCBiaXQgdW5zaWduZWQgaW50ZWdlciB0eXBlLgorICovCisjaWYgIWRlZmluZWQoUlNfVkVSU0lPTikgfHwgKFJTX1ZFUlNJT04gPD0gMjApCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1aW50NjRfdDsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQordHlwZWRlZiB1bnNpZ25lZCBsb25nIHVpbnQ2NF90OworI2VuZGlmCisKKy8qCisgKiB1Y2hhcjogOCBiaXQgdW5zaWduZWQgaW50ZWdlcgorICoKKyAqIDggYml0IHVuc2lnbmVkIGludGVnZXIgdHlwZS4KKyAqLwordHlwZWRlZiB1aW50OF90IHVjaGFyOworCisvKgorICogdXNob3J0OiAxNiBiaXQgdW5zaWduZWQgaW50ZWdlcgorICoKKyAqIEEgMTYgYml0IHVuc2lnbmVkIGludGVnZXIgdHlwZS4KKyAqLwordHlwZWRlZiB1aW50MTZfdCB1c2hvcnQ7CisKKy8qCisgKiB1aW50OiAzMiBiaXQgdW5zaWduZWQgaW50ZWdlcgorICoKKyAqIEEgMzIgYml0IHVuc2lnbmVkIGludGVnZXIgdHlwZS4KKyAqLwordHlwZWRlZiB1aW50MzJfdCB1aW50OworCisvKgorICogdWxvbmc6IDY0IGJpdCB1bnNpZ25lZCBpbnRlZ2VyCisgKgorICogQSA2NCBiaXQgdW5zaWduZWQgaW50ZWdlciB0eXBlLgorICovCit0eXBlZGVmIHVpbnQ2NF90IHVsb25nOworCisvKgorICogc2l6ZV90OiBVbnNpZ25lZCBzaXplIHR5cGUKKyAqCisgKiBVbnNpZ25lZCBzaXplIHR5cGUuICBUaGUgbnVtYmVyIG9mIGJpdHMgZGVwZW5kIG9uIHRoZSBjb21waWxhdGlvbiBmbGFncy4KKyAqLworI2lmZGVmIF9fTFA2NF9fCit0eXBlZGVmIHVpbnQ2NF90IHNpemVfdDsKKyNlbmRpZgorCisjaWZuZGVmIF9fTFA2NF9fCit0eXBlZGVmIHVpbnQzMl90IHNpemVfdDsKKyNlbmRpZgorCisvKgorICogc3NpemVfdDogU2lnbmVkIHNpemUgdHlwZQorICoKKyAqIFNpZ25lZCBzaXplIHR5cGUuICBUaGUgbnVtYmVyIG9mIGJpdHMgZGVwZW5kIG9uIHRoZSBjb21waWxhdGlvbiBmbGFncy4KKyAqLworI2lmZGVmIF9fTFA2NF9fCit0eXBlZGVmIGludDY0X3Qgc3NpemVfdDsKKyNlbmRpZgorCisjaWZuZGVmIF9fTFA2NF9fCit0eXBlZGVmIGludDMyX3Qgc3NpemVfdDsKKyNlbmRpZgorCisvKgorICogZmxvYXQyOiBUd28gMzIgYml0IGZsb2F0cworICoKKyAqIEEgdmVjdG9yIG9mIHR3byBmbG9hdHMuICBUaGVzZSB0d28gZmxvYXRzIGFyZSBwYWNrZWQgaW50byBhIHNpbmdsZSA2NCBiaXQgZmllbGQKKyAqIHdpdGggYSA2NCBiaXQgYWxpZ25tZW50LgorICoKKyAqIEEgdmVjdG9yIG9mIHR3byBmbG9hdHMuICBUaGVzZSB0d28gZmxvYXRzIGFyZSBwYWNrZWQgaW50byBhIHNpbmdsZSA2NCBiaXQgZmllbGQKKyAqIHdpdGggYSA2NCBiaXQgYWxpZ25tZW50LgorICovCit0eXBlZGVmIGZsb2F0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgyKSkpIGZsb2F0MjsKKworLyoKKyAqIGZsb2F0MzogVGhyZWUgMzIgYml0IGZsb2F0cworICoKKyAqIEEgdmVjdG9yIG9mIHRocmVlIGZsb2F0cy4gIFRoZXNlIHRocmVlIGZsb2F0cyBhcmUgcGFja2VkIGludG8gYSBzaW5nbGUgMTI4IGJpdCBmaWVsZAorICogd2l0aCBhIDEyOCBiaXQgYWxpZ25tZW50LgorICovCit0eXBlZGVmIGZsb2F0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgzKSkpIGZsb2F0MzsKKworLyoKKyAqIGZsb2F0NDogRm91ciAzMiBiaXQgZmxvYXRzCisgKgorICogQSB2ZWN0b3Igb2YgZm91ciBmbG9hdHMgdHlwZS4gIFRoZXNlIGZvdXIgZmxvYXRzIGFyZSBwYWNrZWQgaW50byBhIHNpbmdsZSAxMjggYml0IGZpZWxkCisgKiB3aXRoIGEgMTI4IGJpdCBhbGlnbm1lbnQuCisgKi8KK3R5cGVkZWYgZmxvYXQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSkgZmxvYXQ0OworCisvKgorICogZG91YmxlMjogVHdvIDY0IGJpdCBmbG9hdHMKKyAqCisgKiBBIHZlY3RvciBvZiB0d28gZG91Ymxlcy4gIFRoZXNlIHR3byBkb3VibGUgZmllbGRzIHBhY2tlZCBpbnRvIGEgc2luZ2xlIDEyOCBiaXQgZmllbGQKKyAqIHdpdGggYSAxMjggYml0IGFsaWdubWVudC4KKyAqLwordHlwZWRlZiBkb3VibGUgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDIpKSkgZG91YmxlMjsKKworLyoKKyAqIGRvdWJsZTM6IFRocmVlIDY0IGJpdCBmbG9hdHMKKyAqCisgKiBBIHZlY3RvciBvZiB0aHJlZSBkb3VibGVzLiAgVGhlc2UgdGhyZWUgZG91YmxlIGZpZWxkcyBwYWNrZWQgaW50byBhIHNpbmdsZSAyNTYgYml0IGZpZWxkCisgKiB3aXRoIGEgMjU2IGJpdCBhbGlnbm1lbnQuCisgKi8KK3R5cGVkZWYgZG91YmxlIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgzKSkpIGRvdWJsZTM7CisKKy8qCisgKiBkb3VibGU0OiBGb3VyIDY0IGJpdCBmbG9hdHMKKyAqCisgKiBBIHZlY3RvciBvZiBmb3VyIGRvdWJsZXMuICBUaGVzZSBmb3VyIGRvdWJsZSBmaWVsZHMgcGFja2VkIGludG8gYSBzaW5nbGUgMjU2IGJpdCBmaWVsZAorICogd2l0aCBhIDI1NiBiaXQgYWxpZ25tZW50LgorICovCit0eXBlZGVmIGRvdWJsZSBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKSBkb3VibGU0OworCisvKgorICogdWNoYXIyOiBUd28gOCBiaXQgdW5zaWduZWQgaW50ZWdlcnMKKyAqCisgKiBBIHZlY3RvciBvZiB0d28gdWNoYXJzLiAgVGhlc2UgdHdvIHVjaGFyIGZpZWxkcyBwYWNrZWQgaW50byBhIHNpbmdsZSAxNiBiaXQgZmllbGQKKyAqIHdpdGggYSAxNiBiaXQgYWxpZ25tZW50LgorICovCit0eXBlZGVmIHVjaGFyIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgyKSkpIHVjaGFyMjsKKworLyoKKyAqIHVjaGFyMzogVGhyZWUgOCBiaXQgdW5zaWduZWQgaW50ZWdlcnMKKyAqCisgKiBBIHZlY3RvciBvZiB0aHJlZSB1Y2hhcnMuICBUaGVzZSB0aHJlZSB1Y2hhciBmaWVsZHMgcGFja2VkIGludG8gYSBzaW5nbGUgMzIgYml0IGZpZWxkCisgKiB3aXRoIGEgMzIgYml0IGFsaWdubWVudC4KKyAqLwordHlwZWRlZiB1Y2hhciBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMykpKSB1Y2hhcjM7CisKKy8qCisgKiB1Y2hhcjQ6IEZvdXIgOCBiaXQgdW5zaWduZWQgaW50ZWdlcnMKKyAqCisgKiBBIHZlY3RvciBvZiBmb3VyIHVjaGFycy4gIFRoZXNlIGZvdXIgdWNoYXIgZmllbGRzIHBhY2tlZCBpbnRvIGEgc2luZ2xlIDMyIGJpdCBmaWVsZAorICogd2l0aCBhIDMyIGJpdCBhbGlnbm1lbnQuCisgKi8KK3R5cGVkZWYgdWNoYXIgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSkgdWNoYXI0OworCisvKgorICogdXNob3J0MjogVHdvIDE2IGJpdCB1bnNpZ25lZCBpbnRlZ2VycworICoKKyAqIEEgdmVjdG9yIG9mIHR3byB1c2hvcnRzLiAgVGhlc2UgdHdvIHVzaG9ydCBmaWVsZHMgcGFja2VkIGludG8gYSBzaW5nbGUgMzIgYml0IGZpZWxkCisgKiB3aXRoIGEgMzIgYml0IGFsaWdubWVudC4KKyAqLwordHlwZWRlZiB1c2hvcnQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDIpKSkgdXNob3J0MjsKKworLyoKKyAqIHVzaG9ydDM6IFRocmVlIDE2IGJpdCB1bnNpZ25lZCBpbnRlZ2VycworICoKKyAqIEEgdmVjdG9yIG9mIHRocmVlIHVzaG9ydHMuICBUaGVzZSB0aHJlZSB1c2hvcnQgZmllbGRzIHBhY2tlZCBpbnRvIGEgc2luZ2xlIDY0IGJpdCBmaWVsZAorICogd2l0aCBhIDY0IGJpdCBhbGlnbm1lbnQuCisgKi8KK3R5cGVkZWYgdXNob3J0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgzKSkpIHVzaG9ydDM7CisKKy8qCisgKiB1c2hvcnQ0OiBGb3VyIDE2IGJpdCB1bnNpZ25lZCBpbnRlZ2VycworICoKKyAqIEEgdmVjdG9yIG9mIGZvdXIgdXNob3J0cy4gIFRoZXNlIGZvdXIgdXNob3J0IGZpZWxkcyBwYWNrZWQgaW50byBhIHNpbmdsZSA2NCBiaXQgZmllbGQKKyAqIHdpdGggYSA2NCBiaXQgYWxpZ25tZW50LgorICovCit0eXBlZGVmIHVzaG9ydCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKSB1c2hvcnQ0OworCisvKgorICogdWludDI6IFR3byAzMiBiaXQgdW5zaWduZWQgaW50ZWdlcnMKKyAqCisgKiBBIHZlY3RvciBvZiB0d28gdWludHMuICBUaGVzZSB0d28gdWludHMgYXJlIHBhY2tlZCBpbnRvIGEgc2luZ2xlIDY0IGJpdCBmaWVsZAorICogd2l0aCBhIDY0IGJpdCBhbGlnbm1lbnQuCisgKi8KK3R5cGVkZWYgdWludCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMikpKSB1aW50MjsKKworLyoKKyAqIHVpbnQzOiBUaHJlZSAzMiBiaXQgdW5zaWduZWQgaW50ZWdlcnMKKyAqCisgKiBBIHZlY3RvciBvZiB0aHJlZSB1aW50cy4gIFRoZXNlIHRocmVlIHVpbnRzIGFyZSBwYWNrZWQgaW50byBhIHNpbmdsZSAxMjggYml0IGZpZWxkCisgKiB3aXRoIGEgMTI4IGJpdCBhbGlnbm1lbnQuCisgKi8KK3R5cGVkZWYgdWludCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMykpKSB1aW50MzsKKworLyoKKyAqIHVpbnQ0OiBGb3VyIDMyIGJpdCB1bnNpZ25lZCBpbnRlZ2VycworICoKKyAqIEEgdmVjdG9yIG9mIGZvdXIgdWludHMuICBUaGVzZSBmb3VyIHVpbnRzIGFyZSBwYWNrZWQgaW50byBhIHNpbmdsZSAxMjggYml0IGZpZWxkCisgKiB3aXRoIGEgMTI4IGJpdCBhbGlnbm1lbnQuCisgKi8KK3R5cGVkZWYgdWludCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKSB1aW50NDsKKworLyoKKyAqIHVsb25nMjogVHdvIDY0IGJpdCB1bnNpZ25lZCBpbnRlZ2VycworICoKKyAqIEEgdmVjdG9yIG9mIHR3byB1bG9uZ3MuICBUaGVzZSB0d28gdWxvbmdzIGFyZSBwYWNrZWQgaW50byBhIHNpbmdsZSAxMjggYml0IGZpZWxkCisgKiB3aXRoIGEgMTI4IGJpdCBhbGlnbm1lbnQuCisgKi8KK3R5cGVkZWYgdWxvbmcgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDIpKSkgdWxvbmcyOworCisvKgorICogdWxvbmczOiBUaHJlZSA2NCBiaXQgdW5zaWduZWQgaW50ZWdlcnMKKyAqCisgKiBBIHZlY3RvciBvZiB0aHJlZSB1bG9uZ3MuICBUaGVzZSB0aHJlZSB1bG9uZyBmaWVsZHMgcGFja2VkIGludG8gYSBzaW5nbGUgMjU2IGJpdCBmaWVsZAorICogd2l0aCBhIDI1NiBiaXQgYWxpZ25tZW50LgorICovCit0eXBlZGVmIHVsb25nIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgzKSkpIHVsb25nMzsKKworLyoKKyAqIHVsb25nNDogRm91ciA2NCBiaXQgdW5zaWduZWQgaW50ZWdlcnMKKyAqCisgKiBBIHZlY3RvciBvZiBmb3VyIHVsb25ncy4gIFRoZXNlIGZvdXIgdWxvbmcgZmllbGRzIHBhY2tlZCBpbnRvIGEgc2luZ2xlIDI1NiBiaXQgZmllbGQKKyAqIHdpdGggYSAyNTYgYml0IGFsaWdubWVudC4KKyAqLwordHlwZWRlZiB1bG9uZyBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKSB1bG9uZzQ7CisKKy8qCisgKiBjaGFyMjogVHdvIDggYml0IHNpZ25lZCBpbnRlZ2VycworICoKKyAqIEEgdmVjdG9yIG9mIHR3byBjaGFycy4gIFRoZXNlIHR3byBjaGFycyBhcmUgcGFja2VkIGludG8gYSBzaW5nbGUgMTYgYml0IGZpZWxkCisgKiB3aXRoIGEgMTYgYml0IGFsaWdubWVudC4KKyAqLwordHlwZWRlZiBjaGFyIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgyKSkpIGNoYXIyOworCisvKgorICogY2hhcjM6IFRocmVlIDggYml0IHNpZ25lZCBpbnRlZ2VycworICoKKyAqIEEgdmVjdG9yIG9mIHRocmVlIGNoYXJzLiAgVGhlc2UgdGhyZWUgY2hhcnMgYXJlIHBhY2tlZCBpbnRvIGEgc2luZ2xlIDMyIGJpdCBmaWVsZAorICogd2l0aCBhIDMyIGJpdCBhbGlnbm1lbnQuCisgKi8KK3R5cGVkZWYgY2hhciBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMykpKSBjaGFyMzsKKworLyoKKyAqIGNoYXI0OiBGb3VyIDggYml0IHNpZ25lZCBpbnRlZ2VycworICoKKyAqIEEgdmVjdG9yIG9mIGZvdXIgY2hhcnMuICBUaGVzZSBmb3VyIGNoYXJzIGFyZSBwYWNrZWQgaW50byBhIHNpbmdsZSAzMiBiaXQgZmllbGQKKyAqIHdpdGggYSAzMiBiaXQgYWxpZ25tZW50LgorICovCit0eXBlZGVmIGNoYXIgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSkgY2hhcjQ7CisKKy8qCisgKiBzaG9ydDI6IFR3byAxNiBiaXQgc2lnbmVkIGludGVnZXJzCisgKgorICogQSB2ZWN0b3Igb2YgdHdvIHNob3J0cy4gIFRoZXNlIHR3byBzaG9ydHMgYXJlIHBhY2tlZCBpbnRvIGEgc2luZ2xlIDMyIGJpdCBmaWVsZAorICogd2l0aCBhIDMyIGJpdCBhbGlnbm1lbnQuCisgKi8KK3R5cGVkZWYgc2hvcnQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDIpKSkgc2hvcnQyOworCisvKgorICogc2hvcnQzOiBUaHJlZSAxNiBiaXQgc2lnbmVkIGludGVnZXJzCisgKgorICogQSB2ZWN0b3Igb2YgdGhyZWUgc2hvcnRzLiAgVGhlc2UgdGhyZWUgc2hvcnQgZmllbGRzIHBhY2tlZCBpbnRvIGEgc2luZ2xlIDY0IGJpdCBmaWVsZAorICogd2l0aCBhIDY0IGJpdCBhbGlnbm1lbnQuCisgKi8KK3R5cGVkZWYgc2hvcnQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDMpKSkgc2hvcnQzOworCisvKgorICogc2hvcnQ0OiBGb3VyIDE2IGJpdCBzaWduZWQgaW50ZWdlcnMKKyAqCisgKiBBIHZlY3RvciBvZiBmb3VyIHNob3J0cy4gIFRoZXNlIGZvdXIgc2hvcnQgZmllbGRzIHBhY2tlZCBpbnRvIGEgc2luZ2xlIDY0IGJpdCBmaWVsZAorICogd2l0aCBhIDY0IGJpdCBhbGlnbm1lbnQuCisgKi8KK3R5cGVkZWYgc2hvcnQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSkgc2hvcnQ0OworCisvKgorICogaW50MjogVHdvIDMyIGJpdCBzaWduZWQgaW50ZWdlcnMKKyAqCisgKiBBIHZlY3RvciBvZiB0d28gaW50cy4gIFRoZXNlIHR3byBpbnRzIGFyZSBwYWNrZWQgaW50byBhIHNpbmdsZSA2NCBiaXQgZmllbGQKKyAqIHdpdGggYSA2NCBiaXQgYWxpZ25tZW50LgorICovCit0eXBlZGVmIGludCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMikpKSBpbnQyOworCisvKgorICogaW50MzogVGhyZWUgMzIgYml0IHNpZ25lZCBpbnRlZ2VycworICoKKyAqIEEgdmVjdG9yIG9mIHRocmVlIGludHMuICBUaGVzZSB0aHJlZSBpbnRzIGFyZSBwYWNrZWQgaW50byBhIHNpbmdsZSAxMjggYml0IGZpZWxkCisgKiB3aXRoIGEgMTI4IGJpdCBhbGlnbm1lbnQuCisgKi8KK3R5cGVkZWYgaW50IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgzKSkpIGludDM7CisKKy8qCisgKiBpbnQ0OiBGb3VyIDMyIGJpdCBzaWduZWQgaW50ZWdlcnMKKyAqCisgKiBBIHZlY3RvciBvZiBmb3VyIGludHMuICBUaGVzZSB0d28gZm91cnMgYXJlIHBhY2tlZCBpbnRvIGEgc2luZ2xlIDEyOCBiaXQgZmllbGQKKyAqIHdpdGggYSAxMjggYml0IGFsaWdubWVudC4KKyAqLwordHlwZWRlZiBpbnQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSkgaW50NDsKKworLyoKKyAqIGxvbmcyOiBUd28gNjQgYml0IHNpZ25lZCBpbnRlZ2VycworICoKKyAqIEEgdmVjdG9yIG9mIHR3byBsb25ncy4gIFRoZXNlIHR3byBsb25ncyBhcmUgcGFja2VkIGludG8gYSBzaW5nbGUgMTI4IGJpdCBmaWVsZAorICogd2l0aCBhIDEyOCBiaXQgYWxpZ25tZW50LgorICovCit0eXBlZGVmIGxvbmcgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDIpKSkgbG9uZzI7CisKKy8qCisgKiBsb25nMzogVGhyZWUgNjQgYml0IHNpZ25lZCBpbnRlZ2VycworICoKKyAqIEEgdmVjdG9yIG9mIHRocmVlIGxvbmdzLiAgVGhlc2UgdGhyZWUgbG9uZ3MgYXJlIHBhY2tlZCBpbnRvIGEgc2luZ2xlIDI1NiBiaXQgZmllbGQKKyAqIHdpdGggYSAyNTYgYml0IGFsaWdubWVudC4KKyAqLwordHlwZWRlZiBsb25nIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgzKSkpIGxvbmczOworCisvKgorICogbG9uZzQ6IEZvdXIgNjQgYml0IHNpZ25lZCBpbnRlZ2VycworICoKKyAqIEEgdmVjdG9yIG9mIGZvdXIgbG9uZ3MuICBUaGVzZSBmb3VyIGxvbmdzIGFyZSBwYWNrZWQgaW50byBhIHNpbmdsZSAyNTYgYml0IGZpZWxkCisgKiB3aXRoIGEgMjU2IGJpdCBhbGlnbm1lbnQuCisgKi8KK3R5cGVkZWYgbG9uZyBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKSBsb25nNDsKKworLyoKKyAqIHJzX21hdHJpeDJ4MjogMngyIG1hdHJpeCBvZiAzMiBiaXQgZmxvYXRzCisgKgorICogQSBzcXVhcmUgMngyIG1hdHJpeCBvZiBmbG9hdHMuICBUaGUgZW50cmllcyBhcmUgc3RvcmVkIGluIHRoZSBhcnJheSBhdCB0aGUKKyAqIGxvY2F0aW9uIFtyb3cqMiArIGNvbF0uCisgKgorICogU2VlIE1hdHJpeCBGdW5jdGlvbnMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBmbG9hdCBtWzRdOworfSByc19tYXRyaXgyeDI7CisKKy8qCisgKiByc19tYXRyaXgzeDM6IDN4MyBtYXRyaXggb2YgMzIgYml0IGZsb2F0cworICoKKyAqIEEgc3F1YXJlIDN4MyBtYXRyaXggb2YgZmxvYXRzLiAgVGhlIGVudHJpZXMgYXJlIHN0b3JlZCBpbiB0aGUgYXJyYXkgYXQgdGhlCisgKiBsb2NhdGlvbiBbcm93KjMgKyBjb2xdLgorICoKKyAqIFNlZSBNYXRyaXggRnVuY3Rpb25zLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgZmxvYXQgbVs5XTsKK30gcnNfbWF0cml4M3gzOworCisvKgorICogcnNfbWF0cml4NHg0OiA0eDQgbWF0cml4IG9mIDMyIGJpdCBmbG9hdHMKKyAqCisgKiBBIHNxdWFyZSA0eDQgbWF0cml4IG9mIGZsb2F0cy4gIFRoZSBlbnRyaWVzIGFyZSBzdG9yZWQgaW4gdGhlIGFycmF5IGF0IHRoZQorICogbG9jYXRpb24gW3Jvdyo0ICsgY29sXS4KKyAqCisgKiBTZWUgTWF0cml4IEZ1bmN0aW9ucy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGZsb2F0IG1bMTZdOworfSByc19tYXRyaXg0eDQ7CisKKy8qCisgKiByc19xdWF0ZXJuaW9uOiBRdWF0ZXJuaW9uCisgKgorICogQSBzcXVhcmUgNHg0IG1hdHJpeCBvZiBmbG9hdHMgdGhhdCByZXByZXNlbnRzIGEgcXVhdGVybmlvbi4KKyAqCisgKiBTZWUgUXVhdGVybmlvbiBGdW5jdGlvbnMuCisgKi8KK3R5cGVkZWYgZmxvYXQ0IHJzX3F1YXRlcm5pb247CisKKyNlbmRpZiAvLyBSRU5ERVJTQ1JJUFRfUlNfVkFMVUVfVFlQRVNfUlNICmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvaW5jbHVkZS9yc192ZWN0b3JfbWF0aC5yc2ggYi9yZW5kZXJzY3JpcHQvaW5jbHVkZS9yc192ZWN0b3JfbWF0aC5yc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY1ZThlNwotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9pbmNsdWRlL3JzX3ZlY3Rvcl9tYXRoLnJzaApAQCAtMCwwICsxLDQ1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIERvbid0IGVkaXQgdGhpcyBmaWxlISAgSXQgaXMgYXV0by1nZW5lcmF0ZWQgYnkgZnJhbWV3b3Jrcy9ycy9hcGkvZ2VuZXJhdGUuc2guCisKKy8qCisgKiByc192ZWN0b3JfbWF0aC5yc2g6IFZlY3RvciBNYXRoIEZ1bmN0aW9ucworICoKKyAqIFRoZXNlIGZ1bmN0aW9ucyBpbnRlcnByZXQgdGhlIGlucHV0IGFyZ3VtZW50cyBhcyByZXByZXNlbnRhdGlvbiBvZiB2ZWN0b3JzIGluCisgKiBuLWRpbWVuc2lvbmFsIHNwYWNlLgorICoKKyAqIFRoZSBwcmVjaXNpb24gb2YgdGhlIG1hdGhlbWF0aWNhbCBvcGVyYXRpb25zIG9uIDMyIGJpdCBmbG9hdHMgaXMgYWZmZWN0ZWQgYnkgdGhlIHByYWdtYXMKKyAqIHJzX2ZwX3JlbGF4ZWQgYW5kIHJzX2ZwX2Z1bGwuICBTZWUgTWF0aGVtYXRpY2FsIENvbnN0YW50cyBhbmQgRnVuY3Rpb25zIGZvciBkZXRhaWxzLgorICoKKyAqIERpZmZlcmVudCBwcmVjaXNpb24vc3BlZWQgdHJhZGVvZmZzIGNhbiBiZSBhY2hpZXZlZCBieSB1c2luZyB2YXJpYW50cyBvZiB0aGUgY29tbW9uIG1hdGgKKyAqIGZ1bmN0aW9ucy4gIEZ1bmN0aW9ucyB3aXRoIGEgbmFtZSBzdGFydGluZyB3aXRoCisgKiAtIG5hdGl2ZV86IE1heSBoYXZlIGN1c3RvbSBoYXJkd2FyZSBpbXBsZW1lbnRhdGlvbnMgd2l0aCB3ZWFrZXIgcHJlY2lzaW9uLiAgQWRkaXRpb25hbGx5LAorICogICBzdWJub3JtYWwgdmFsdWVzIG1heSBiZSBmbHVzaGVkIHRvIHplcm8sIHJvdW5kaW5nIHRvd2FyZHMgemVybyBtYXkgYmUgdXNlZCwgYW5kIE5hTiBhbmQKKyAqICAgaW5maW5pdHkgaW5wdXQgbWF5IG5vdCBiZSBoYW5kbGVkIGNvcnJlY3RseS4KKyAqIC0gZmFzdF86IE1heSBwZXJmb3JtIGludGVybmFsIGNvbXB1dGF0aW9ucyB1c2luZyAxNiBiaXQgZmxvYXRzLiAgQWRkaXRpb25hbGx5LCBzdWJub3JtYWwKKyAqICAgdmFsdWVzIG1heSBiZSBmbHVzaGVkIHRvIHplcm8sIGFuZCByb3VuZGluZyB0b3dhcmRzIHplcm8gbWF5IGJlIHVzZWQuCisgKgorICovCisKKyNpZm5kZWYgUkVOREVSU0NSSVBUX1JTX1ZFQ1RPUl9NQVRIX1JTSAorI2RlZmluZSBSRU5ERVJTQ1JJUFRfUlNfVkVDVE9SX01BVEhfUlNICisKKy8qCisgKiBjcm9zczogQ3Jvc3MgcHJvZHVjdCBvZiB0d28gdmVjdG9ycworICoKKyAqIENvbXB1dGVzIHRoZSBjcm9zcyBwcm9kdWN0IG9mIHR3byB2ZWN0b3JzLgorICovCitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNyb3NzKGZsb2F0MyBsZWZ0X3ZlY3RvciwgZmxvYXQzIHJpZ2h0X3ZlY3Rvcik7CisKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgY3Jvc3MoZmxvYXQ0IGxlZnRfdmVjdG9yLCBmbG9hdDQgcmlnaHRfdmVjdG9yKTsKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmMyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBjcm9zcyhoYWxmMyBsZWZ0X3ZlY3RvciwgaGFsZjMgcmlnaHRfdmVjdG9yKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGY0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGNyb3NzKGhhbGY0IGxlZnRfdmVjdG9yLCBoYWxmNCByaWdodF92ZWN0b3IpOworI2VuZGlmCisKKy8qCisgKiBkaXN0YW5jZTogRGlzdGFuY2UgYmV0d2VlbiB0d28gcG9pbnRzCisgKgorICogQ29tcHV0ZSB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0d28gcG9pbnRzLgorICoKKyAqIFNlZSBhbHNvIGZhc3RfZGlzdGFuY2UoKSwgbmF0aXZlX2Rpc3RhbmNlKCkuCisgKi8KK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBkaXN0YW5jZShmbG9hdCBsZWZ0X3ZlY3RvciwgZmxvYXQgcmlnaHRfdmVjdG9yKTsKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGRpc3RhbmNlKGZsb2F0MiBsZWZ0X3ZlY3RvciwgZmxvYXQyIHJpZ2h0X3ZlY3Rvcik7CisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBkaXN0YW5jZShmbG9hdDMgbGVmdF92ZWN0b3IsIGZsb2F0MyByaWdodF92ZWN0b3IpOworCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZGlzdGFuY2UoZmxvYXQ0IGxlZnRfdmVjdG9yLCBmbG9hdDQgcmlnaHRfdmVjdG9yKTsKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGRpc3RhbmNlKGhhbGYgbGVmdF92ZWN0b3IsIGhhbGYgcmlnaHRfdmVjdG9yKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZGlzdGFuY2UoaGFsZjIgbGVmdF92ZWN0b3IsIGhhbGYyIHJpZ2h0X3ZlY3Rvcik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGRpc3RhbmNlKGhhbGYzIGxlZnRfdmVjdG9yLCBoYWxmMyByaWdodF92ZWN0b3IpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBkaXN0YW5jZShoYWxmNCBsZWZ0X3ZlY3RvciwgaGFsZjQgcmlnaHRfdmVjdG9yKTsKKyNlbmRpZgorCisvKgorICogZG90OiBEb3QgcHJvZHVjdCBvZiB0d28gdmVjdG9ycworICoKKyAqIENvbXB1dGVzIHRoZSBkb3QgcHJvZHVjdCBvZiB0d28gdmVjdG9ycy4KKyAqLworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGRvdChmbG9hdCBsZWZ0X3ZlY3RvciwgZmxvYXQgcmlnaHRfdmVjdG9yKTsKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGRvdChmbG9hdDIgbGVmdF92ZWN0b3IsIGZsb2F0MiByaWdodF92ZWN0b3IpOworCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZG90KGZsb2F0MyBsZWZ0X3ZlY3RvciwgZmxvYXQzIHJpZ2h0X3ZlY3Rvcik7CisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBkb3QoZmxvYXQ0IGxlZnRfdmVjdG9yLCBmbG9hdDQgcmlnaHRfdmVjdG9yKTsKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGRvdChoYWxmIGxlZnRfdmVjdG9yLCBoYWxmIHJpZ2h0X3ZlY3Rvcik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGRvdChoYWxmMiBsZWZ0X3ZlY3RvciwgaGFsZjIgcmlnaHRfdmVjdG9yKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZG90KGhhbGYzIGxlZnRfdmVjdG9yLCBoYWxmMyByaWdodF92ZWN0b3IpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBkb3QoaGFsZjQgbGVmdF92ZWN0b3IsIGhhbGY0IHJpZ2h0X3ZlY3Rvcik7CisjZW5kaWYKKworLyoKKyAqIGZhc3RfZGlzdGFuY2U6IEFwcHJveGltYXRlIGRpc3RhbmNlIGJldHdlZW4gdHdvIHBvaW50cworICoKKyAqIENvbXB1dGVzIHRoZSBhcHByb3hpbWF0ZSBkaXN0YW5jZSBiZXR3ZWVuIHR3byBwb2ludHMuCisgKgorICogVGhlIHByZWNpc2lvbiBpcyB3aGF0IHdvdWxkIGJlIGV4cGVjdGVkIGZyb20gZG9pbmcgdGhlIGNvbXB1dGF0aW9uIHVzaW5nIDE2IGJpdCBmbG9hdGluZworICogcG9pbnQgdmFsdWVzLgorICoKKyAqIFNlZSBhbHNvIGRpc3RhbmNlKCksIG5hdGl2ZV9kaXN0YW5jZSgpLgorICovCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTcpKQorZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGZhc3RfZGlzdGFuY2UoZmxvYXQgbGVmdF92ZWN0b3IsIGZsb2F0IHJpZ2h0X3ZlY3Rvcik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE3KSkKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBmYXN0X2Rpc3RhbmNlKGZsb2F0MiBsZWZ0X3ZlY3RvciwgZmxvYXQyIHJpZ2h0X3ZlY3Rvcik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE3KSkKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBmYXN0X2Rpc3RhbmNlKGZsb2F0MyBsZWZ0X3ZlY3RvciwgZmxvYXQzIHJpZ2h0X3ZlY3Rvcik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE3KSkKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBmYXN0X2Rpc3RhbmNlKGZsb2F0NCBsZWZ0X3ZlY3RvciwgZmxvYXQ0IHJpZ2h0X3ZlY3Rvcik7CisjZW5kaWYKKworLyoKKyAqIGZhc3RfbGVuZ3RoOiBBcHByb3hpbWF0ZSBsZW5ndGggb2YgYSB2ZWN0b3IKKyAqCisgKiBDb21wdXRlcyB0aGUgYXBwcm94aW1hdGUgbGVuZ3RoIG9mIGEgdmVjdG9yLgorICoKKyAqIFRoZSBwcmVjaXNpb24gaXMgd2hhdCB3b3VsZCBiZSBleHBlY3RlZCBmcm9tIGRvaW5nIHRoZSBjb21wdXRhdGlvbiB1c2luZyAxNiBiaXQgZmxvYXRpbmcKKyAqIHBvaW50IHZhbHVlcy4KKyAqCisgKiBTZWUgYWxzbyBsZW5ndGgoKSwgbmF0aXZlX2xlbmd0aCgpLgorICovCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTcpKQorZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGZhc3RfbGVuZ3RoKGZsb2F0IHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxNykpCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZmFzdF9sZW5ndGgoZmxvYXQyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxNykpCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZmFzdF9sZW5ndGgoZmxvYXQzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxNykpCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZmFzdF9sZW5ndGgoZmxvYXQ0IHYpOworI2VuZGlmCisKKy8qCisgKiBmYXN0X25vcm1hbGl6ZTogQXBwcm94aW1hdGUgbm9ybWFsaXplZCB2ZWN0b3IKKyAqCisgKiBBcHByb3hpbWF0ZWx5IG5vcm1hbGl6ZXMgYSB2ZWN0b3IuCisgKgorICogRm9yIHZlY3RvcnMgb2Ygc2l6ZSAxLCByZXR1cm5zIC0xLmYgZm9yIG5lZ2F0aXZlIHZhbHVlcywgMC5mIGZvciBudWxsIHZhbHVlcywgYW5kIDEuZiBmb3IKKyAqIHBvc2l0aXZlIHZhbHVlcy4KKyAqCisgKiBUaGUgcHJlY2lzaW9uIGlzIHdoYXQgd291bGQgYmUgZXhwZWN0ZWQgZnJvbSBkb2luZyB0aGUgY29tcHV0YXRpb24gdXNpbmcgMTYgYml0IGZsb2F0aW5nCisgKiBwb2ludCB2YWx1ZXMuCisgKgorICogU2VlIGFsc28gbm9ybWFsaXplKCksIG5hdGl2ZV9ub3JtYWxpemUoKS4KKyAqLworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE3KSkKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBmYXN0X25vcm1hbGl6ZShmbG9hdCB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMTcpKQorZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBmYXN0X25vcm1hbGl6ZShmbG9hdDIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDE3KSkKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgZmFzdF9ub3JtYWxpemUoZmxvYXQzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAxNykpCitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGZhc3Rfbm9ybWFsaXplKGZsb2F0NCB2KTsKKyNlbmRpZgorCisvKgorICogbGVuZ3RoOiBMZW5ndGggb2YgYSB2ZWN0b3IKKyAqCisgKiBDb21wdXRlcyB0aGUgbGVuZ3RoIG9mIGEgdmVjdG9yLgorICoKKyAqIFNlZSBhbHNvIGZhc3RfbGVuZ3RoKCksIG5hdGl2ZV9sZW5ndGgoKS4KKyAqLworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGxlbmd0aChmbG9hdCB2KTsKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGxlbmd0aChmbG9hdDIgdik7CisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBsZW5ndGgoZmxvYXQzIHYpOworCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbGVuZ3RoKGZsb2F0NCB2KTsKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGxlbmd0aChoYWxmIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBsZW5ndGgoaGFsZjIgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIGxlbmd0aChoYWxmMyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbGVuZ3RoKGhhbGY0IHYpOworI2VuZGlmCisKKy8qCisgKiBuYXRpdmVfZGlzdGFuY2U6IEFwcHJveGltYXRlIGRpc3RhbmNlIGJldHdlZW4gdHdvIHBvaW50cworICoKKyAqIENvbXB1dGVzIHRoZSBhcHByb3hpbWF0ZSBkaXN0YW5jZSBiZXR3ZWVuIHR3byBwb2ludHMuCisgKgorICogU2VlIGFsc28gZGlzdGFuY2UoKSwgZmFzdF9kaXN0YW5jZSgpLgorICovCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9kaXN0YW5jZShmbG9hdCBsZWZ0X3ZlY3RvciwgZmxvYXQgcmlnaHRfdmVjdG9yKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9kaXN0YW5jZShmbG9hdDIgbGVmdF92ZWN0b3IsIGZsb2F0MiByaWdodF92ZWN0b3IpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2Rpc3RhbmNlKGZsb2F0MyBsZWZ0X3ZlY3RvciwgZmxvYXQzIHJpZ2h0X3ZlY3Rvcik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfZGlzdGFuY2UoZmxvYXQ0IGxlZnRfdmVjdG9yLCBmbG9hdDQgcmlnaHRfdmVjdG9yKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2Rpc3RhbmNlKGhhbGYgbGVmdF92ZWN0b3IsIGhhbGYgcmlnaHRfdmVjdG9yKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2Rpc3RhbmNlKGhhbGYyIGxlZnRfdmVjdG9yLCBoYWxmMiByaWdodF92ZWN0b3IpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfZGlzdGFuY2UoaGFsZjMgbGVmdF92ZWN0b3IsIGhhbGYzIHJpZ2h0X3ZlY3Rvcik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9kaXN0YW5jZShoYWxmNCBsZWZ0X3ZlY3RvciwgaGFsZjQgcmlnaHRfdmVjdG9yKTsKKyNlbmRpZgorCisvKgorICogbmF0aXZlX2xlbmd0aDogQXBwcm94aW1hdGUgbGVuZ3RoIG9mIGEgdmVjdG9yCisgKgorICogQ29tcHV0ZSB0aGUgYXBwcm94aW1hdGUgbGVuZ3RoIG9mIGEgdmVjdG9yLgorICoKKyAqIFNlZSBhbHNvIGxlbmd0aCgpLCBmYXN0X2xlbmd0aCgpLgorICovCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9sZW5ndGgoZmxvYXQgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDIxKSkKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfbGVuZ3RoKGZsb2F0MiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9sZW5ndGgoZmxvYXQzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2xlbmd0aChmbG9hdDQgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9sZW5ndGgoaGFsZiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2xlbmd0aChoYWxmMiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2xlbmd0aChoYWxmMyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX2xlbmd0aChoYWxmNCB2KTsKKyNlbmRpZgorCisvKgorICogbmF0aXZlX25vcm1hbGl6ZTogQXBwcm94aW1hdGVseSBub3JtYWxpemUgYSB2ZWN0b3IKKyAqCisgKiBBcHByb3hpbWF0ZWx5IG5vcm1hbGl6ZXMgYSB2ZWN0b3IuCisgKgorICogU2VlIGFsc28gbm9ybWFsaXplKCksIGZhc3Rfbm9ybWFsaXplKCkuCisgKi8KKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyMSkpCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX25vcm1hbGl6ZShmbG9hdCB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfbm9ybWFsaXplKGZsb2F0MiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfbm9ybWFsaXplKGZsb2F0MyB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjEpKQorZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfbm9ybWFsaXplKGZsb2F0NCB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX25vcm1hbGl6ZShoYWxmIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbmF0aXZlX25vcm1hbGl6ZShoYWxmMiB2KTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoUlNfVkVSU0lPTikgJiYgKFJTX1ZFUlNJT04gPj0gMjQpKQorZXh0ZXJuIGhhbGYzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5hdGl2ZV9ub3JtYWxpemUoaGFsZjMgdik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmNCBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBuYXRpdmVfbm9ybWFsaXplKGhhbGY0IHYpOworI2VuZGlmCisKKy8qCisgKiBub3JtYWxpemU6IE5vcm1hbGl6ZSBhIHZlY3RvcgorICoKKyAqIE5vcm1hbGl6ZSBhIHZlY3Rvci4KKyAqCisgKiBGb3IgdmVjdG9ycyBvZiBzaXplIDEsIHJldHVybnMgLTEuZiBmb3IgbmVnYXRpdmUgdmFsdWVzLCAwLmYgZm9yIG51bGwgdmFsdWVzLCBhbmQgMS5mIGZvcgorICogcG9zaXRpdmUgdmFsdWVzLgorICoKKyAqIFNlZSBhbHNvIGZhc3Rfbm9ybWFsaXplKCksIG5hdGl2ZV9ub3JtYWxpemUoKS4KKyAqLworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5vcm1hbGl6ZShmbG9hdCB2KTsKKworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChjb25zdCwgb3ZlcmxvYWRhYmxlKSkKKyAgICBub3JtYWxpemUoZmxvYXQyIHYpOworCitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5vcm1hbGl6ZShmbG9hdDMgdik7CisKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbm9ybWFsaXplKGZsb2F0NCB2KTsKKworI2lmIChkZWZpbmVkKFJTX1ZFUlNJT04pICYmIChSU19WRVJTSU9OID49IDI0KSkKK2V4dGVybiBoYWxmIF9fYXR0cmlidXRlX18oKGNvbnN0LCBvdmVybG9hZGFibGUpKQorICAgIG5vcm1hbGl6ZShoYWxmIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjIgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbm9ybWFsaXplKGhhbGYyIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjMgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbm9ybWFsaXplKGhhbGYzIHYpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChSU19WRVJTSU9OKSAmJiAoUlNfVkVSU0lPTiA+PSAyNCkpCitleHRlcm4gaGFsZjQgX19hdHRyaWJ1dGVfXygoY29uc3QsIG92ZXJsb2FkYWJsZSkpCisgICAgbm9ybWFsaXplKGhhbGY0IHYpOworI2VuZGlmCisKKyNlbmRpZiAvLyBSRU5ERVJTQ1JJUFRfUlNfVkVDVE9SX01BVEhfUlNICmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvbGliL2FuZHJvaWR4LXJzLmphciBiL3JlbmRlcnNjcmlwdC9saWIvYW5kcm9pZHgtcnMuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZTBkMTYKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvbGliL2FuZHJvaWR4LXJzLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvbGliL2JjL2FybTY0LXY4YS9saWJjbGNvcmUuYmMgYi9yZW5kZXJzY3JpcHQvbGliL2JjL2FybTY0LXY4YS9saWJjbGNvcmUuYmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhmZGQ2NQotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9saWIvYmMvYXJtNjQtdjhhL2xpYmNsY29yZS5iYwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvbGliL2JjL2FybWVhYmktdjdhL2xpYmNsY29yZS5iYyBiL3JlbmRlcnNjcmlwdC9saWIvYmMvYXJtZWFiaS12N2EvbGliY2xjb3JlLmJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMDQyOWEKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvbGliL2JjL2FybWVhYmktdjdhL2xpYmNsY29yZS5iYwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvbGliL2JjL3g4Ni9saWJjbGNvcmUuYmMgYi9yZW5kZXJzY3JpcHQvbGliL2JjL3g4Ni9saWJjbGNvcmUuYmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMzYmRhNAotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9saWIvYmMveDg2L2xpYmNsY29yZS5iYwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvbGliL2JjL3g4Nl82NC9saWJjbGNvcmUuYmMgYi9yZW5kZXJzY3JpcHQvbGliL2JjL3g4Nl82NC9saWJjbGNvcmUuYmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNiNjZhYwotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9saWIvYmMveDg2XzY0L2xpYmNsY29yZS5iYwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvbGliL2JsYXMvYXJtNjQtdjhhL2xpYmJsYXNWOC5zbyBiL3JlbmRlcnNjcmlwdC9saWIvYmxhcy9hcm02NC12OGEvbGliYmxhc1Y4LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMDBmYzcKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvbGliL2JsYXMvYXJtNjQtdjhhL2xpYmJsYXNWOC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvbGliL2JsYXMvYXJtZWFiaS12N2EvbGliYmxhc1Y4LnNvIGIvcmVuZGVyc2NyaXB0L2xpYi9ibGFzL2FybWVhYmktdjdhL2xpYmJsYXNWOC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGM1NWVkCi0tLSAvZGV2L251bGwKKysrIGIvcmVuZGVyc2NyaXB0L2xpYi9ibGFzL2FybWVhYmktdjdhL2xpYmJsYXNWOC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvbGliL2JsYXMveDg2L2xpYmJsYXNWOC5zbyBiL3JlbmRlcnNjcmlwdC9saWIvYmxhcy94ODYvbGliYmxhc1Y4LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYjU2NzAKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvbGliL2JsYXMveDg2L2xpYmJsYXNWOC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvbGliL2JsYXMveDg2XzY0L2xpYmJsYXNWOC5zbyBiL3JlbmRlcnNjcmlwdC9saWIvYmxhcy94ODZfNjQvbGliYmxhc1Y4LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmN2ZkOWMKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvbGliL2JsYXMveDg2XzY0L2xpYmJsYXNWOC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvbGliL2ludGVybWVkaWF0ZXMvYXJtNjQtdjhhL2xpYmMuc28gYi9yZW5kZXJzY3JpcHQvbGliL2ludGVybWVkaWF0ZXMvYXJtNjQtdjhhL2xpYmMuc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWQ4YjJhNgotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9saWIvaW50ZXJtZWRpYXRlcy9hcm02NC12OGEvbGliYy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvbGliL2ludGVybWVkaWF0ZXMvYXJtNjQtdjhhL2xpYmNvbXBpbGVyX3J0LmEgYi9yZW5kZXJzY3JpcHQvbGliL2ludGVybWVkaWF0ZXMvYXJtNjQtdjhhL2xpYmNvbXBpbGVyX3J0LmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQyMzA2OAotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9saWIvaW50ZXJtZWRpYXRlcy9hcm02NC12OGEvbGliY29tcGlsZXJfcnQuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvbGliL2ludGVybWVkaWF0ZXMvYXJtNjQtdjhhL2xpYm0uc28gYi9yZW5kZXJzY3JpcHQvbGliL2ludGVybWVkaWF0ZXMvYXJtNjQtdjhhL2xpYm0uc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2U0NWJjMQotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9saWIvaW50ZXJtZWRpYXRlcy9hcm02NC12OGEvbGlibS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvbGliL2ludGVybWVkaWF0ZXMvYXJtZWFiaS12N2EvbGliYy5zbyBiL3JlbmRlcnNjcmlwdC9saWIvaW50ZXJtZWRpYXRlcy9hcm1lYWJpLXY3YS9saWJjLnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjkzMzUzNDUKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvbGliL2ludGVybWVkaWF0ZXMvYXJtZWFiaS12N2EvbGliYy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvbGliL2ludGVybWVkaWF0ZXMvYXJtZWFiaS12N2EvbGliY29tcGlsZXJfcnQuYSBiL3JlbmRlcnNjcmlwdC9saWIvaW50ZXJtZWRpYXRlcy9hcm1lYWJpLXY3YS9saWJjb21waWxlcl9ydC5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNDA1MWMKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvbGliL2ludGVybWVkaWF0ZXMvYXJtZWFiaS12N2EvbGliY29tcGlsZXJfcnQuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvbGliL2ludGVybWVkaWF0ZXMvYXJtZWFiaS12N2EvbGlibS5zbyBiL3JlbmRlcnNjcmlwdC9saWIvaW50ZXJtZWRpYXRlcy9hcm1lYWJpLXY3YS9saWJtLnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBkYzU4YzQKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvbGliL2ludGVybWVkaWF0ZXMvYXJtZWFiaS12N2EvbGlibS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvbGliL2ludGVybWVkaWF0ZXMveDg2L2xpYmMuc28gYi9yZW5kZXJzY3JpcHQvbGliL2ludGVybWVkaWF0ZXMveDg2L2xpYmMuc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODk5YjhiZgotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9saWIvaW50ZXJtZWRpYXRlcy94ODYvbGliYy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvbGliL2ludGVybWVkaWF0ZXMveDg2L2xpYmNvbXBpbGVyX3J0LmEgYi9yZW5kZXJzY3JpcHQvbGliL2ludGVybWVkaWF0ZXMveDg2L2xpYmNvbXBpbGVyX3J0LmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYwNzZjNAotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9saWIvaW50ZXJtZWRpYXRlcy94ODYvbGliY29tcGlsZXJfcnQuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvbGliL2ludGVybWVkaWF0ZXMveDg2L2xpYm0uc28gYi9yZW5kZXJzY3JpcHQvbGliL2ludGVybWVkaWF0ZXMveDg2L2xpYm0uc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzg4YjA4MQotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9saWIvaW50ZXJtZWRpYXRlcy94ODYvbGlibS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvbGliL2ludGVybWVkaWF0ZXMveDg2XzY0L2xpYmMuc28gYi9yZW5kZXJzY3JpcHQvbGliL2ludGVybWVkaWF0ZXMveDg2XzY0L2xpYmMuc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjQyN2RiOQotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9saWIvaW50ZXJtZWRpYXRlcy94ODZfNjQvbGliYy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvbGliL2ludGVybWVkaWF0ZXMveDg2XzY0L2xpYmNvbXBpbGVyX3J0LmEgYi9yZW5kZXJzY3JpcHQvbGliL2ludGVybWVkaWF0ZXMveDg2XzY0L2xpYmNvbXBpbGVyX3J0LmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTViZTlmYgotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9saWIvaW50ZXJtZWRpYXRlcy94ODZfNjQvbGliY29tcGlsZXJfcnQuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvbGliL2ludGVybWVkaWF0ZXMveDg2XzY0L2xpYm0uc28gYi9yZW5kZXJzY3JpcHQvbGliL2ludGVybWVkaWF0ZXMveDg2XzY0L2xpYm0uc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjFmZTgzNwotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9saWIvaW50ZXJtZWRpYXRlcy94ODZfNjQvbGlibS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvbGliL3BhY2thZ2VkL2FybTY0LXY4YS9saWJSU1N1cHBvcnQuc28gYi9yZW5kZXJzY3JpcHQvbGliL3BhY2thZ2VkL2FybTY0LXY4YS9saWJSU1N1cHBvcnQuc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTI5NTVlZQotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9saWIvcGFja2FnZWQvYXJtNjQtdjhhL2xpYlJTU3VwcG9ydC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvbGliL3BhY2thZ2VkL2FybTY0LXY4YS9saWJyc2puaS5zbyBiL3JlbmRlcnNjcmlwdC9saWIvcGFja2FnZWQvYXJtNjQtdjhhL2xpYnJzam5pLnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU2MWUxMWEKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvbGliL3BhY2thZ2VkL2FybTY0LXY4YS9saWJyc2puaS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvbGliL3BhY2thZ2VkL2FybTY0LXY4YS9saWJyc2puaV9hbmRyb2lkeC5zbyBiL3JlbmRlcnNjcmlwdC9saWIvcGFja2FnZWQvYXJtNjQtdjhhL2xpYnJzam5pX2FuZHJvaWR4LnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNkOGJlMWEKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvbGliL3BhY2thZ2VkL2FybTY0LXY4YS9saWJyc2puaV9hbmRyb2lkeC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvbGliL3BhY2thZ2VkL2FybWVhYmktdjdhL2xpYlJTU3VwcG9ydC5zbyBiL3JlbmRlcnNjcmlwdC9saWIvcGFja2FnZWQvYXJtZWFiaS12N2EvbGliUlNTdXBwb3J0LnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQxYzlkNDkKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvbGliL3BhY2thZ2VkL2FybWVhYmktdjdhL2xpYlJTU3VwcG9ydC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvbGliL3BhY2thZ2VkL2FybWVhYmktdjdhL2xpYnJzam5pLnNvIGIvcmVuZGVyc2NyaXB0L2xpYi9wYWNrYWdlZC9hcm1lYWJpLXY3YS9saWJyc2puaS5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kOGRmOTNjCi0tLSAvZGV2L251bGwKKysrIGIvcmVuZGVyc2NyaXB0L2xpYi9wYWNrYWdlZC9hcm1lYWJpLXY3YS9saWJyc2puaS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvbGliL3BhY2thZ2VkL2FybWVhYmktdjdhL2xpYnJzam5pX2FuZHJvaWR4LnNvIGIvcmVuZGVyc2NyaXB0L2xpYi9wYWNrYWdlZC9hcm1lYWJpLXY3YS9saWJyc2puaV9hbmRyb2lkeC5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNDJlMzM1Ci0tLSAvZGV2L251bGwKKysrIGIvcmVuZGVyc2NyaXB0L2xpYi9wYWNrYWdlZC9hcm1lYWJpLXY3YS9saWJyc2puaV9hbmRyb2lkeC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvbGliL3BhY2thZ2VkL3g4Ni9saWJSU1N1cHBvcnQuc28gYi9yZW5kZXJzY3JpcHQvbGliL3BhY2thZ2VkL3g4Ni9saWJSU1N1cHBvcnQuc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWFlY2JmOAotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9saWIvcGFja2FnZWQveDg2L2xpYlJTU3VwcG9ydC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvbGliL3BhY2thZ2VkL3g4Ni9saWJyc2puaS5zbyBiL3JlbmRlcnNjcmlwdC9saWIvcGFja2FnZWQveDg2L2xpYnJzam5pLnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZhMGU4ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvbGliL3BhY2thZ2VkL3g4Ni9saWJyc2puaS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvbGliL3BhY2thZ2VkL3g4Ni9saWJyc2puaV9hbmRyb2lkeC5zbyBiL3JlbmRlcnNjcmlwdC9saWIvcGFja2FnZWQveDg2L2xpYnJzam5pX2FuZHJvaWR4LnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdjMzJiZjYKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvbGliL3BhY2thZ2VkL3g4Ni9saWJyc2puaV9hbmRyb2lkeC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvbGliL3BhY2thZ2VkL3g4Nl82NC9saWJSU1N1cHBvcnQuc28gYi9yZW5kZXJzY3JpcHQvbGliL3BhY2thZ2VkL3g4Nl82NC9saWJSU1N1cHBvcnQuc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTk5MDdjNgotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9saWIvcGFja2FnZWQveDg2XzY0L2xpYlJTU3VwcG9ydC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvbGliL3BhY2thZ2VkL3g4Nl82NC9saWJyc2puaS5zbyBiL3JlbmRlcnNjcmlwdC9saWIvcGFja2FnZWQveDg2XzY0L2xpYnJzam5pLnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA0ZDFiZWIKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvbGliL3BhY2thZ2VkL3g4Nl82NC9saWJyc2puaS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvbGliL3BhY2thZ2VkL3g4Nl82NC9saWJyc2puaV9hbmRyb2lkeC5zbyBiL3JlbmRlcnNjcmlwdC9saWIvcGFja2FnZWQveDg2XzY0L2xpYnJzam5pX2FuZHJvaWR4LnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM2YjFiNjQKLS0tIC9kZXYvbnVsbAorKysgYi9yZW5kZXJzY3JpcHQvbGliL3BhY2thZ2VkL3g4Nl82NC9saWJyc2puaV9hbmRyb2lkeC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9yZW5kZXJzY3JpcHQvbGliL3JlbmRlcnNjcmlwdC12OC5qYXIgYi9yZW5kZXJzY3JpcHQvbGliL3JlbmRlcnNjcmlwdC12OC5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVjNTJlZQotLS0gL2Rldi9udWxsCisrKyBiL3JlbmRlcnNjcmlwdC9saWIvcmVuZGVyc2NyaXB0LXY4LmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ydW50aW1lLnByb3BlcnRpZXMgYi9ydW50aW1lLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJmYmI0MAotLS0gL2Rldi9udWxsCisrKyBiL3J1bnRpbWUucHJvcGVydGllcwpAQCAtMCwwICsxLDIgQEAKK1J1bnRpbWUuSnZtPTEuNgorCmRpZmYgLS1naXQgYS9zb3VyY2UucHJvcGVydGllcyBiL3NvdXJjZS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NTAwOGIKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VyY2UucHJvcGVydGllcwpAQCAtMCwwICsxLDMgQEAKK1BrZy5Vc2VyU3JjPWZhbHNlCitQa2cuUmV2aXNpb249MjkuMC4zCisjUGtnLlJldmlzaW9uPTI5LjAuMCByYzQKZGlmZiAtLWdpdCBhL3NwbGl0LXNlbGVjdCBiL3NwbGl0LXNlbGVjdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NWI2ZGM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3BsaXQtc2VsZWN0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1hbmRyb2lkLWxkIGIveDg2XzY0LWxpbnV4LWFuZHJvaWQtbGQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTA3ZGUxMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1hbmRyb2lkLWxkCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3ppcGFsaWduIGIvemlwYWxpZ24KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDhlM2NhMgotLS0gL2Rldi9udWxsCisrKyBiL3ppcGFsaWduCkJpbmFyeSBmaWxlcyBkaWZmZXIK